From 28a4ce9be185dd738273571afae95e0a0b1916fd Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 26 Jul 2022 19:44:49 -0400 Subject: [PATCH 001/854] Various tweaks --- assets/common/abilities/axe/doublestrike.ron | 8 +++---- assets/common/abilities/axe/leap.ron | 8 +++---- assets/common/abilities/axe/spin.ron | 2 +- assets/common/abilities/bow/charged.ron | 22 +++++++++---------- assets/common/abilities/bow/repeater.ron | 12 +++++----- assets/common/abilities/bow/shotgun.ron | 12 +++++----- .../abilities/custom/stonegolemfist/spin.ron | 2 +- assets/common/abilities/hammer/charged.ron | 2 +- assets/common/abilities/hammer/leap.ron | 4 ++-- .../common/abilities/hammer/singlestrike.ron | 4 ++-- .../common/abilities/sceptre/healingaura.ron | 10 ++++----- .../abilities/sceptre/lifestealbeam.ron | 10 ++++----- .../common/abilities/sceptre/wardingaura.ron | 12 +++++----- assets/common/abilities/staff/firebomb.ron | 8 +++---- .../common/abilities/staff/fireshockwave.ron | 12 +++++----- .../common/abilities/staff/flamethrower.ron | 8 +++---- assets/common/abilities/sword/dash.ron | 6 ++--- .../common/abilities/sword/triplestrike.ron | 2 +- common/src/combat.rs | 2 +- common/src/comp/ability.rs | 2 +- common/src/states/basic_aura.rs | 4 ++-- common/src/states/spin_melee.rs | 6 ++--- common/src/states/utils.rs | 2 +- 23 files changed, 80 insertions(+), 80 deletions(-) diff --git a/assets/common/abilities/axe/doublestrike.ron b/assets/common/abilities/axe/doublestrike.ron index 20b04e42f3..3e70c5c6c2 100644 --- a/assets/common/abilities/axe/doublestrike.ron +++ b/assets/common/abilities/axe/doublestrike.ron @@ -2,7 +2,7 @@ ComboMelee( stage_data: [ ( stage: 1, - base_damage: 11.0, + base_damage: 12.0, damage_increase: 1.0, base_poise_damage: 0, poise_damage_increase: 0, @@ -24,7 +24,7 @@ ComboMelee( ), ( stage: 2, - base_damage: 13.0, + base_damage: 15.0, damage_increase: 1.5, base_poise_damage: 0, poise_damage_increase: 0, @@ -46,8 +46,8 @@ ComboMelee( ), ], initial_energy_gain: 2.5, - max_energy_gain: 17.5, - energy_increase: 3.0, + max_energy_gain: 12.5, + energy_increase: 2.5, speed_increase: 0.1, max_speed_increase: 0.6, scales_from_combo: 2, diff --git a/assets/common/abilities/axe/leap.ron b/assets/common/abilities/axe/leap.ron index 1bd6fd8977..98685cb174 100644 --- a/assets/common/abilities/axe/leap.ron +++ b/assets/common/abilities/axe/leap.ron @@ -1,12 +1,12 @@ LeapMelee( - energy_cost: 45.0, - buildup_duration: 0.2, - movement_duration: 0.2, + energy_cost: 30.0, + buildup_duration: 0.3, + movement_duration: 0.25, swing_duration: 0.2, recover_duration: 0.2, melee_constructor: ( kind: Slash( - damage: 30.0, + damage: 25.0, poise: 0.0, knockback: 12.0, energy_regen: 0.0, diff --git a/assets/common/abilities/axe/spin.ron b/assets/common/abilities/axe/spin.ron index 6461f99b1b..a48020290f 100644 --- a/assets/common/abilities/axe/spin.ron +++ b/assets/common/abilities/axe/spin.ron @@ -1,6 +1,6 @@ SpinMelee( buildup_duration: 0.2, - swing_duration: 0.6, + swing_duration: 0.4, recover_duration: 0.2, melee_constructor: ( kind: Slash( diff --git a/assets/common/abilities/bow/charged.ron b/assets/common/abilities/bow/charged.ron index 43393bb32a..1dcd986eb9 100644 --- a/assets/common/abilities/bow/charged.ron +++ b/assets/common/abilities/bow/charged.ron @@ -1,18 +1,18 @@ ChargedRanged( energy_cost: 0, energy_drain: 0, - initial_regen: 0.5, - scaled_regen: 12.0, - initial_damage: 0.5, - scaled_damage: 12.0, - initial_knockback: 0.0, - scaled_knockback: 10.0, - buildup_duration: 0.2, - charge_duration: 1.0, - recover_duration: 0.3, + initial_regen: 4, + scaled_regen: 16, + initial_damage: 3, + scaled_damage: 15, + initial_knockback: 0, + scaled_knockback: 15, + buildup_duration: 0.3, + charge_duration: 0.9, + recover_duration: 0.4, projectile_body: Object(Arrow), projectile_light: None, - initial_projectile_speed: 100.0, - scaled_projectile_speed: 150.0, + initial_projectile_speed: 50.0, + scaled_projectile_speed: 200.0, move_speed: 0.6, ) diff --git a/assets/common/abilities/bow/repeater.ron b/assets/common/abilities/bow/repeater.ron index ca19187e91..7a39f420d5 100644 --- a/assets/common/abilities/bow/repeater.ron +++ b/assets/common/abilities/bow/repeater.ron @@ -1,13 +1,13 @@ RepeaterRanged( energy_cost: 5.0, buildup_duration: 0.2, - shoot_duration: 0.5, - recover_duration: 0.8, - max_speed: 2.0, - half_speed_at: 1, + shoot_duration: 0.3, + recover_duration: 0.5, + max_speed: 4.0, + half_speed_at: 3, projectile: Arrow( - damage: 3.0, - knockback: 2.0, + damage: 5.0, + knockback: 0, energy_regen: 0, ), projectile_body: Object(Arrow), diff --git a/assets/common/abilities/bow/shotgun.ron b/assets/common/abilities/bow/shotgun.ron index de5111aa40..a3ce87a906 100644 --- a/assets/common/abilities/bow/shotgun.ron +++ b/assets/common/abilities/bow/shotgun.ron @@ -1,15 +1,15 @@ BasicRanged( - energy_cost: 30.0, - buildup_duration: 0.4, + energy_cost: 25.0, + buildup_duration: 0.3, recover_duration: 0.3, projectile_spread: 0.05, projectile: Arrow( - damage: 4.0, - knockback: 5.0, + damage: 6, + knockback: 5, energy_regen: 0, ), projectile_body: Object(Arrow), projectile_light: None, - projectile_speed: 60.0, - num_projectiles: 4, + projectile_speed: 80.0, + num_projectiles: 5, ) diff --git a/assets/common/abilities/custom/stonegolemfist/spin.ron b/assets/common/abilities/custom/stonegolemfist/spin.ron index a06ddca64c..5880f210e1 100644 --- a/assets/common/abilities/custom/stonegolemfist/spin.ron +++ b/assets/common/abilities/custom/stonegolemfist/spin.ron @@ -14,7 +14,7 @@ SpinMelee( ), energy_cost: 0, is_infinite: false, - movement_behavior: GolemHover, + movement_behavior: Stationary, is_interruptible: false, forward_speed: 0.0, num_spins: 1, diff --git a/assets/common/abilities/hammer/charged.ron b/assets/common/abilities/hammer/charged.ron index 1b74473c3e..0388906a16 100644 --- a/assets/common/abilities/hammer/charged.ron +++ b/assets/common/abilities/hammer/charged.ron @@ -17,7 +17,7 @@ ChargedMelee( range: 3.5, angle: 30.0, ), - charge_duration: 1.2, + charge_duration: 1.0, swing_duration: 0.12, hit_timing: 0.2, recover_duration: 0.3, diff --git a/assets/common/abilities/hammer/leap.ron b/assets/common/abilities/hammer/leap.ron index f1e0c23ce0..e9df3820ca 100644 --- a/assets/common/abilities/hammer/leap.ron +++ b/assets/common/abilities/hammer/leap.ron @@ -1,7 +1,7 @@ LeapMelee( - energy_cost: 50.0, + energy_cost: 35.0, buildup_duration: 0.1, - movement_duration: 0.8, + movement_duration: 0.6, swing_duration: 0.15, recover_duration: 0.2, melee_constructor: ( diff --git a/assets/common/abilities/hammer/singlestrike.ron b/assets/common/abilities/hammer/singlestrike.ron index 625b220624..4d08b20ab4 100644 --- a/assets/common/abilities/hammer/singlestrike.ron +++ b/assets/common/abilities/hammer/singlestrike.ron @@ -16,8 +16,8 @@ ComboMelee( damage_kind: Crushing, )], initial_energy_gain: 5.0, - max_energy_gain: 15.0, - energy_increase: 5.0, + max_energy_gain: 12.5, + energy_increase: 2.5, speed_increase: 0.1, max_speed_increase: 0.4, scales_from_combo: 2, diff --git a/assets/common/abilities/sceptre/healingaura.ron b/assets/common/abilities/sceptre/healingaura.ron index a9b387c4d5..3c4707e5f0 100644 --- a/assets/common/abilities/sceptre/healingaura.ron +++ b/assets/common/abilities/sceptre/healingaura.ron @@ -1,13 +1,13 @@ BasicAura( - buildup_duration: 0.25, - cast_duration: 0.5, - recover_duration: 0.25, + buildup_duration: 0.2, + cast_duration: 0.4, + recover_duration: 0.2, targets: InGroup, auras: [ ( kind: Regeneration, - strength: 0.2, - duration: Some(10.0), + strength: 1, + duration: Some(5), category: Magical, ), ], diff --git a/assets/common/abilities/sceptre/lifestealbeam.ron b/assets/common/abilities/sceptre/lifestealbeam.ron index 4c739da0a6..5eff354cd0 100644 --- a/assets/common/abilities/sceptre/lifestealbeam.ron +++ b/assets/common/abilities/sceptre/lifestealbeam.ron @@ -2,13 +2,13 @@ BasicBeam( buildup_duration: 0.20, recover_duration: 0.20, beam_duration: 1.0, - damage: 3.0, - tick_rate: 2.0, + damage: 4, + tick_rate: 4, range: 25.0, max_angle: 1.0, - damage_effect: Some(Lifesteal(0.125)), - energy_regen: 5.0, + damage_effect: Some(Lifesteal(0.05)), + energy_regen: 7.5, energy_drain: 0, - ori_rate: 0.3, + ori_rate: 0.4, specifier: LifestealBeam ) diff --git a/assets/common/abilities/sceptre/wardingaura.ron b/assets/common/abilities/sceptre/wardingaura.ron index f05bbd0bc9..5c908408e8 100644 --- a/assets/common/abilities/sceptre/wardingaura.ron +++ b/assets/common/abilities/sceptre/wardingaura.ron @@ -1,19 +1,19 @@ BasicAura( - buildup_duration: 0.25, - cast_duration: 0.5, - recover_duration: 0.25, + buildup_duration: 0.4, + cast_duration: 0.6, + recover_duration: 0.2, targets: InGroup, auras: [ ( kind: ProtectingWard, - strength: 0.15, - duration: Some(10.0), + strength: 0.25, + duration: Some(8), category: Magical, ), ], aura_duration: 1.0, range: 25.0, - energy_cost: 40.0, + energy_cost: 35.0, scales_with_combo: false, specifier: Some(WardingAura), ) diff --git a/assets/common/abilities/staff/firebomb.ron b/assets/common/abilities/staff/firebomb.ron index b06b67dca5..94696d0a6e 100644 --- a/assets/common/abilities/staff/firebomb.ron +++ b/assets/common/abilities/staff/firebomb.ron @@ -1,11 +1,11 @@ BasicRanged( energy_cost: 0, - buildup_duration: 0.5, + buildup_duration: 0.35, recover_duration: 0.4, projectile: Fireball( - damage: 9.0, - radius: 4.0, - energy_regen: 10.0, + damage: 12.0, + radius: 3.0, + energy_regen: 12.0, min_falloff: 0.5, ), projectile_body: Object(BoltFire), diff --git a/assets/common/abilities/staff/fireshockwave.ron b/assets/common/abilities/staff/fireshockwave.ron index f52f693179..eac4f3f5d2 100644 --- a/assets/common/abilities/staff/fireshockwave.ron +++ b/assets/common/abilities/staff/fireshockwave.ron @@ -1,14 +1,14 @@ Shockwave( - energy_cost: 50.0, - buildup_duration: 0.5, + energy_cost: 40.0, + buildup_duration: 0.4, swing_duration: 0.1, - recover_duration: 0.2, - damage: 15.0, + recover_duration: 0.4, + damage: 18, poise_damage: 0, - knockback: ( strength: 25.0, direction: Away), + knockback: ( strength: 30, direction: Away), shockwave_angle: 360.0, shockwave_vertical_angle: 90.0, - shockwave_speed: 20.0, + shockwave_speed: 30.0, shockwave_duration: 0.5, requires_ground: false, move_efficiency: 0.1, diff --git a/assets/common/abilities/staff/flamethrower.ron b/assets/common/abilities/staff/flamethrower.ron index bc9b9b5e78..244273901c 100644 --- a/assets/common/abilities/staff/flamethrower.ron +++ b/assets/common/abilities/staff/flamethrower.ron @@ -2,18 +2,18 @@ BasicBeam( buildup_duration: 0.25, recover_duration: 0.25, beam_duration: 1.0, - damage: 3.5, + damage: 4, tick_rate: 3.0, - range: 20.0, + range: 15, max_angle: 15.0, damage_effect: Some(Buff(( kind: Burning, dur_secs: 10.0, - strength: DamageFraction(0.5), + strength: DamageFraction(1), chance: 0.25, ))), energy_regen: 0, - energy_drain: 35.0, + energy_drain: 40, ori_rate: 0.3, specifier: Flamethrower, ) diff --git a/assets/common/abilities/sword/dash.ron b/assets/common/abilities/sword/dash.ron index 422098a52f..32c0e0ef23 100644 --- a/assets/common/abilities/sword/dash.ron +++ b/assets/common/abilities/sword/dash.ron @@ -2,7 +2,7 @@ DashMelee( energy_cost: 10.0, melee_constructor: ( kind: Stab( - damage: 8.0, + damage: 4.0, poise: 0.0, knockback: 8.0, energy_regen: 0.0, @@ -17,8 +17,8 @@ DashMelee( angle: 60.0, ), energy_drain: 30.0, - forward_speed: 3.0, - buildup_duration: 0.25, + forward_speed: 2.5, + buildup_duration: 0.2, charge_duration: 1.2, swing_duration: 0.1, recover_duration: 0.5, diff --git a/assets/common/abilities/sword/triplestrike.ron b/assets/common/abilities/sword/triplestrike.ron index 52dcf61e72..ff27a3190b 100644 --- a/assets/common/abilities/sword/triplestrike.ron +++ b/assets/common/abilities/sword/triplestrike.ron @@ -68,7 +68,7 @@ ComboMelee( ), ], initial_energy_gain: 0, - max_energy_gain: 20.0, + max_energy_gain: 12.5, energy_increase: 2.5, speed_increase: 0.1, max_speed_increase: 0.8, diff --git a/common/src/combat.rs b/common/src/combat.rs index 7fd95ca688..b636e9cf07 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -774,7 +774,7 @@ pub enum DamageKind { Energy, } -const PIERCING_PENETRATION_FRACTION: f32 = 1.0; +const PIERCING_PENETRATION_FRACTION: f32 = 1.5; const SLASHING_ENERGY_FRACTION: f32 = 0.5; const CRUSHING_POISE_FRACTION: f32 = 1.0; diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 95be90faeb..4e74959cd5 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -1302,7 +1302,7 @@ impl CharacterAbility { *movement_behavior = if skillset.has_skill(Axe(SHelicopter)) { spin_melee::MovementBehavior::AxeHover } else { - spin_melee::MovementBehavior::ForwardGround + spin_melee::MovementBehavior::Walking }; if let MeleeConstructorKind::Slash { ref mut damage, .. } = melee_constructor.kind { if let Ok(level) = skillset.skill_level(Axe(SDamage)) { diff --git a/common/src/states/basic_aura.rs b/common/src/states/basic_aura.rs index bc0aeb82ae..133464e5a2 100644 --- a/common/src/states/basic_aura.rs +++ b/common/src/states/basic_aura.rs @@ -89,8 +89,8 @@ impl CharacterBehavior for Data { category: _, source: _, } => { - data.strength *= 1.0 - + (self.static_data.combo_at_cast.max(1) as f32).log(2.0); + data.strength *= + (self.static_data.combo_at_cast.max(1) as f32).sqrt(); }, } output_events.emit_server(ServerEvent::ComboChange { diff --git a/common/src/states/spin_melee.rs b/common/src/states/spin_melee.rs index 74e3e6d018..a3edd9b480 100644 --- a/common/src/states/spin_melee.rs +++ b/common/src/states/spin_melee.rs @@ -65,8 +65,8 @@ impl CharacterBehavior for Data { let new_vel_z = update.vel.0.z + GRAVITY * data.dt.0 * 0.5; update.vel.0 = Vec3::new(0.0, 0.0, new_vel_z) + data.inputs.move_dir * 5.0; }, - MovementBehavior::GolemHover => { - update.vel.0 = Vec3::new(0.0, 0.0, 20.0) + *data.inputs.look_dir * 25.0; + MovementBehavior::Walking => { + handle_move(data, &mut update, 0.2); }, } @@ -180,7 +180,7 @@ pub enum MovementBehavior { Stationary, ForwardGround, AxeHover, - GolemHover, + Walking, } #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 5d1cde28ba..5a95138f4d 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -409,7 +409,7 @@ pub fn handle_forced_movement( }) { update.vel.0 += Vec2::broadcast(data.dt.0) * accel - * (data.inputs.move_dir + Vec2::from(update.ori)) + * (data.inputs.move_dir * 0.5 + Vec2::from(update.ori) * 1.5) * strength; } }, From 2a7174a4e679f08ac518c16138c92f49f0d7ebd0 Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Wed, 27 Jul 2022 21:31:10 +0200 Subject: [PATCH 002/854] Minor fixups of the Polish translation --- assets/voxygen/i18n/pl_PL/buff.ron | 2 +- assets/voxygen/i18n/pl_PL/hud/crafting.ron | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/voxygen/i18n/pl_PL/buff.ron b/assets/voxygen/i18n/pl_PL/buff.ron index 1a28d6167e..c5ad2a1665 100644 --- a/assets/voxygen/i18n/pl_PL/buff.ron +++ b/assets/voxygen/i18n/pl_PL/buff.ron @@ -20,7 +20,7 @@ "buff.title.protectingward": "Totem ochronny", "buff.desc.protectingward": "Częściowa ochrona przed atakami.", "buff.title.frenzied": "Szał Walki", - "buff.desc.frenzied": "Wypełnia cię nienaturalny szał, ignorujesz pomniejsze obrażenia.", + "buff.desc.frenzied": "Wypełnia cię nienaturalny szał walki, ignorujesz pomniejsze obrażenia i poruszasz się szybciej.", "buff.title.hastened": "Pośpiech", "buff.desc.hastened": "Twoje ruchy i ataki są szybsze.", // Debuffs diff --git a/assets/voxygen/i18n/pl_PL/hud/crafting.ron b/assets/voxygen/i18n/pl_PL/hud/crafting.ron index 78d64172f7..3d09aa2921 100644 --- a/assets/voxygen/i18n/pl_PL/hud/crafting.ron +++ b/assets/voxygen/i18n/pl_PL/hud/crafting.ron @@ -23,7 +23,7 @@ // Tabs "hud.crafting.tabs.all": "Wszystko", "hud.crafting.tabs.armor": "Pancerz", - "hud.crafting.tabs.dismantle": "Zdemontuj", + "hud.crafting.tabs.dismantle": "Rozmontuj", "hud.crafting.tabs.food": "Żywność", "hud.crafting.tabs.glider": "Lotnie", "hud.crafting.tabs.potion": "Mikstury", @@ -32,7 +32,7 @@ "hud.crafting.tabs.weapon": "Bronie", "hud.crafting.tabs.bag": "Torby", "hud.crafting.tabs.processed_material": "Materiały", - "hud.crafting.dismantle_title": "Demontowanie", + "hud.crafting.dismantle_title": "Rozmontowywanie", "hud.crafting.dismantle_explanation" : "Najedź na przedmioty w pleacaku aby\nzobaczyć co możesz odzyskać.\n\nKliknij podwójnie aby rozmontować.", "hud.crafting.modular_desc": "Przeciągnij części przedmiotu aby stworzyć broń", "hud.crafting.mod_weap_prim_slot_title": "Główna część broni", From 29dd9eac9b5cd5b7b7f4666d24354fc62ee886ea Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Jul 2022 19:19:20 -0400 Subject: [PATCH 003/854] Remvoed CR from UI. Changed all stats in tools and armor to be same size. Cleaned up item stats UI code. --- common/src/combat.rs | 2 +- voxygen/src/hud/util.rs | 28 +- voxygen/src/ui/widgets/item_tooltip.rs | 589 +++++++++---------------- 3 files changed, 208 insertions(+), 411 deletions(-) diff --git a/common/src/combat.rs b/common/src/combat.rs index 7fd95ca688..fbd29de05d 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -1012,7 +1012,7 @@ pub fn get_weapon_kinds(inv: &Inventory) -> (Option, Option) #[cfg(not(target_arch = "wasm32"))] // TODO: Either remove msm or use it as argument in fn kind -pub fn weapon_rating(item: &T, _msm: &MaterialStatManifest) -> f32 { +fn weapon_rating(item: &T, _msm: &MaterialStatManifest) -> f32 { const POWER_WEIGHT: f32 = 2.0; const SPEED_WEIGHT: f32 = 3.0; const CRIT_CHANCE_WEIGHT: f32 = 1.5; diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 6721c004ce..f8ed26c872 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -110,32 +110,22 @@ pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> &' } pub fn stats_count(item: &dyn ItemDesc, msm: &MaterialStatManifest) -> usize { - let mut count = match &*item.kind() { + match &*item.kind() { ItemKind::Armor(armor) => { - if matches!(armor.kind, ArmorKind::Bag) { - 0 - } else { - armor.stats(msm).energy_reward.is_some() as usize - + armor.stats(msm).energy_max.is_some() as usize - + armor.stats(msm).stealth.is_some() as usize - + armor.stats(msm).crit_power.is_some() as usize - + armor.stats(msm).poise_resilience.is_some() as usize - } + let armor_stats = armor.stats(msm); + armor_stats.energy_reward.is_some() as usize + + armor_stats.energy_max.is_some() as usize + + armor_stats.stealth.is_some() as usize + + armor_stats.crit_power.is_some() as usize + + armor_stats.poise_resilience.is_some() as usize + + armor_stats.protection.is_some() as usize + + (item.num_slots() > 0) as usize }, ItemKind::Tool(_) => 7, ItemKind::Consumable { effects, .. } => effects.len(), ItemKind::ModularComponent { .. } => 7, _ => 0, - }; - - let is_bag = match &*item.kind() { - ItemKind::Armor(armor) => matches!(armor.kind, ArmorKind::Bag), - _ => false, - }; - if item.num_slots() != 0 && !is_bag { - count += 1 } - count as usize } /// Takes N `effects` and returns N effect descriptions diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 54a5cb7fea..4151a3ca96 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -7,13 +7,10 @@ use crate::hud::{ }; use client::Client; use common::{ - combat, comp::{ item::{ - armor::{ArmorKind, Protection}, - item_key::ItemKey, - modular::ModularComponent, - Item, ItemDesc, ItemKind, ItemTag, MaterialStatManifest, Quality, + armor::Protection, item_key::ItemKey, modular::ModularComponent, Item, ItemDesc, + ItemKind, ItemTag, MaterialStatManifest, Quality, }, Energy, }, @@ -317,10 +314,7 @@ widget_ids! { prices_buy, prices_sell, tooltip_hints, - main_stat, - main_stat_text, stats[], - diff_main_stat, diffs[], item_frame, item_render, @@ -586,27 +580,6 @@ impl<'a> Widget for ItemTooltip<'a> { match &*item.kind() { ItemKind::Tool(tool) => { let stats = tool.stats; - let combat_rating = combat::weapon_rating(&item, self.msm) * 10.0; - - // Combat Rating - widget::Text::new(&format!("{:.1}", combat_rating)) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .font_size(34) - .align_middle_y_of(state.ids.item_frame) - .right_from(state.ids.item_frame, H_PAD) - .set(state.ids.main_stat, ui); - - widget::Text::new(i18n.get("common.stats.combat_rating")) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .align_bottom_of(state.ids.main_stat) - .right_from(state.ids.main_stat, H_PAD) - .set(state.ids.main_stat_text, ui); // Power widget::Text::new(&format!( @@ -622,85 +595,77 @@ impl<'a> Widget for ItemTooltip<'a> { .down_from(state.ids.item_frame, V_PAD) .set(state.ids.stats[0], ui); + let mut stat_text = |text: String, i: usize| { + widget::Text::new(&text) + .graphics_for(id) + .parent(id) + .with_style(self.style.desc) + .color(text_color) + .down_from(state.ids.stats[i - 1], V_PAD_STATS) + .set(state.ids.stats[i], ui); + }; + // Speed - widget::Text::new(&format!( - "{} : {:+.0}%", - i18n.get("common.stats.speed"), - (stats.speed - 1.0) * 100.0 - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .down_from(state.ids.stats[0], V_PAD_STATS) - .set(state.ids.stats[1], ui); + stat_text( + format!( + "{} : {:+.0}%", + i18n.get("common.stats.speed"), + (stats.speed - 1.0) * 100.0 + ), + 1, + ); // Effect Power // TODO: Allow effect power to have different terminology based on what it is // affecting. - widget::Text::new(&format!( - "{} : {:+.0}%", - i18n.get("common.stats.poise"), - (stats.effect_power - 1.0) * 100.0 - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .down_from(state.ids.stats[1], V_PAD_STATS) - .set(state.ids.stats[2], ui); + stat_text( + format!( + "{} : {:+.0}%", + i18n.get("common.stats.poise"), + (stats.effect_power - 1.0) * 100.0 + ), + 2, + ); // Crit chance - widget::Text::new(&format!( - "{} : {:.1}%", - i18n.get("common.stats.crit_chance"), - stats.crit_chance * 100.0 - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .down_from(state.ids.stats[2], V_PAD_STATS) - .set(state.ids.stats[3], ui); + stat_text( + format!( + "{} : {:.1}%", + i18n.get("common.stats.crit_chance"), + stats.crit_chance * 100.0 + ), + 3, + ); // Range - widget::Text::new(&format!( - "{} : {:+.0}%", - i18n.get("common.stats.range"), - (stats.range - 1.0) * 100.0 - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .down_from(state.ids.stats[3], V_PAD_STATS) - .set(state.ids.stats[4], ui); + stat_text( + format!( + "{} : {:+.0}%", + i18n.get("common.stats.range"), + (stats.range - 1.0) * 100.0 + ), + 4, + ); // Energy Efficiency - widget::Text::new(&format!( - "{} : {:+.0}%", - i18n.get("common.stats.energy_efficiency"), - (stats.energy_efficiency - 1.0) * 100.0 - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .down_from(state.ids.stats[4], V_PAD_STATS) - .set(state.ids.stats[5], ui); + stat_text( + format!( + "{} : {:+.0}%", + i18n.get("common.stats.energy_efficiency"), + (stats.energy_efficiency - 1.0) * 100.0 + ), + 5, + ); // Buff Strength - widget::Text::new(&format!( - "{} : {:+.0}%", - i18n.get("common.stats.buff_strength"), - (stats.buff_strength - 1.0) * 100.0 - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .down_from(state.ids.stats[5], V_PAD_STATS) - .set(state.ids.stats[6], ui); + stat_text( + format!( + "{} : {:+.0}%", + i18n.get("common.stats.buff_strength"), + (stats.buff_strength - 1.0) * 100.0 + ), + 6, + ); if let Some(equipped_item) = equipped_item { if let ItemKind::Tool(equipped_tool) = &*equipped_item.kind() { @@ -729,20 +694,6 @@ impl<'a> Widget for ItemTooltip<'a> { tool_stats.buff_strength, equipped_tool_stats.buff_strength, ); - let equipped_combat_rating = - combat::weapon_rating(&equipped_item, self.msm) * 10.0; - let diff_main_stat = - util::comparison(combat_rating, equipped_combat_rating); - - if (equipped_combat_rating - combat_rating).abs() > f32::EPSILON { - widget::Text::new(diff_main_stat.0) - .right_from(state.ids.main_stat_text, H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(diff_main_stat.1) - .set(state.ids.diff_main_stat, ui); - } let mut diff_text = |text: String, color, id_index| { widget::Text::new(&*text) @@ -803,287 +754,147 @@ impl<'a> Widget for ItemTooltip<'a> { } }, ItemKind::Armor(armor) => { - match armor.kind { - ArmorKind::Bag => { - // Bags - widget::Text::new(&format!( - "{} {}", - item.num_slots(), - i18n.get("common.stats.slots") - )) + let armor_stats = armor.stats(self.msm); + + let mut stat_text = |text: String, i: usize| { + widget::Text::new(&text) .graphics_for(id) .parent(id) .with_style(self.style.desc) .color(text_color) - .font_size(34) - .align_middle_y_of(state.ids.item_frame) - .right_from(state.ids.item_frame, H_PAD) - .set(state.ids.main_stat, ui); - }, - _ => { - // Armour - let protection = armor - .stats(self.msm) - .protection - .unwrap_or(Protection::Normal(0.0)); - let poise_res = armor - .stats(self.msm) - .poise_resilience - .unwrap_or(Protection::Normal(0.0)); - let energy_max = armor.stats(self.msm).energy_max.unwrap_or(0.0); - let energy_reward = armor - .stats(self.msm) - .energy_reward - .map(|x| x * 100.0) - .unwrap_or(0.0); - let crit_power = armor.stats(self.msm).crit_power.unwrap_or(0.0); - let stealth = armor.stats(self.msm).stealth.unwrap_or(0.0); + .and(|t| { + if i == 0 { + t.x_align_to( + state.ids.item_frame, + conrod_core::position::Align::Start, + ) + .down_from(state.ids.item_frame, V_PAD) + } else { + t.down_from(state.ids.stats[i - 1], V_PAD_STATS) + } + }) + .set(state.ids.stats[i], ui); + }; - widget::Text::new(&util::protec2string(protection)) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .font_size(34) - .align_middle_y_of(state.ids.item_frame) - .right_from(state.ids.item_frame, H_PAD) - .set(state.ids.main_stat, ui); + let mut index = 0; - widget::Text::new(i18n.get("common.stats.armor")) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .align_bottom_of(state.ids.main_stat) - .right_from(state.ids.main_stat, H_PAD) - .set(state.ids.main_stat_text, ui); + if armor_stats.protection.is_some() { + stat_text( + format!( + "{} : {}", + i18n.get("common.stats.armor"), + util::protec2string( + armor_stats.protection.unwrap_or(Protection::Normal(0.0)) + ) + ), + index, + ); + index += 1; + } - // Poise res - if armor.stats(self.msm).poise_resilience.is_some() { - widget::Text::new(&format!( - "{} : {}", - i18n.get("common.stats.poise_res"), - util::protec2string(poise_res) - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .x_align_to(state.ids.item_frame, conrod_core::position::Align::Start) - .down_from(state.ids.item_frame, V_PAD) - .set(state.ids.stats[0], ui); - } + // Poise res + if armor_stats.poise_resilience.is_some() { + stat_text( + format!( + "{} : {}", + i18n.get("common.stats.poise_res"), + util::protec2string( + armor_stats + .poise_resilience + .unwrap_or(Protection::Normal(0.0)) + ) + ), + index, + ); + index += 1; + } - // Max Energy - if armor.stats(self.msm).energy_max.is_some() { - widget::Text::new(&format!( - "{} : {:.1}", - i18n.get("common.stats.energy_max"), - energy_max - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .and(|t| { - if armor.stats(self.msm).poise_resilience.is_some() { - t.down_from(state.ids.stats[0], V_PAD_STATS) - } else { - t.x_align_to( - state.ids.item_frame, - conrod_core::position::Align::Start, - ) - .down_from(state.ids.item_frame, V_PAD) - } - }) - .set( - state.ids.stats - [armor.stats(self.msm).poise_resilience.is_some() as usize], - ui, - ); - } + // Max Energy + if armor_stats.energy_max.is_some() { + stat_text( + format!( + "{} : {:.1}", + i18n.get("common.stats.energy_max"), + armor_stats.energy_max.unwrap_or(0.0) + ), + index, + ); + index += 1; + } - // Energy Recovery - if armor.stats(self.msm).energy_reward.is_some() { - widget::Text::new(&format!( - "{} : {:.1}%", - i18n.get("common.stats.energy_reward"), - energy_reward - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .and(|t| { - match armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize - { - 0 => t - .x_align_to( - state.ids.item_frame, - conrod_core::position::Align::Start, - ) - .down_from(state.ids.item_frame, V_PAD), - x => t.down_from(state.ids.stats[x - 1], V_PAD_STATS), - } - }) - .set( - state.ids.stats[armor.stats(self.msm).poise_resilience.is_some() - as usize - + armor.stats(self.msm).energy_max.is_some() as usize], - ui, - ); - } + // Energy Recovery + if armor_stats.energy_reward.is_some() { + stat_text( + format!( + "{} : {:.1}%", + i18n.get("common.stats.energy_reward"), + armor_stats.energy_reward.map_or(0.0, |x| x * 100.0) + ), + index, + ); + index += 1; + } - // Crit Power - if armor.stats(self.msm).crit_power.is_some() { - widget::Text::new(&format!( - "{} : {:.3}", - i18n.get("common.stats.crit_power"), - crit_power - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .and(|t| { - match armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize - { - 0 => t - .x_align_to( - state.ids.item_frame, - conrod_core::position::Align::Start, - ) - .down_from(state.ids.item_frame, V_PAD), - x => t.down_from(state.ids.stats[x - 1], V_PAD_STATS), - } - }) - .set( - state.ids.stats[armor.stats(self.msm).poise_resilience.is_some() - as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize], - ui, - ); - } + // Crit Power + if armor_stats.crit_power.is_some() { + stat_text( + format!( + "{} : {:.3}", + i18n.get("common.stats.crit_power"), + armor_stats.crit_power.unwrap_or(0.0) + ), + index, + ); + index += 1; + } - // Stealth - if armor.stats(self.msm).stealth.is_some() { - widget::Text::new(&format!( - "{} : {:.3}", - i18n.get("common.stats.stealth"), - stealth - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .and(|t| { - match armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize - + armor.stats(self.msm).crit_power.is_some() as usize - { - 0 => t - .x_align_to( - state.ids.item_frame, - conrod_core::position::Align::Start, - ) - .down_from(state.ids.item_frame, V_PAD), - x => t.down_from(state.ids.stats[x - 1], V_PAD_STATS), - } - }) - .set( - state.ids.stats[armor.stats(self.msm).poise_resilience.is_some() - as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize - + armor.stats(self.msm).crit_power.is_some() as usize], - ui, - ); - } + // Stealth + if armor_stats.stealth.is_some() { + stat_text( + format!( + "{} : {:.3}", + i18n.get("common.stats.stealth"), + armor_stats.stealth.unwrap_or(0.0) + ), + index, + ); + index += 1; + } - // Slots - if item.num_slots() > 0 { - widget::Text::new(&format!( - "{} : {}", - i18n.get("common.stats.slots"), - item.num_slots() - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .and(|t| { - match armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize - + armor.stats(self.msm).crit_power.is_some() as usize - + armor.stats(self.msm).stealth.is_some() as usize - { - 0 => t - .x_align_to( - state.ids.item_frame, - conrod_core::position::Align::Start, - ) - .down_from(state.ids.item_frame, V_PAD), - x => t.down_from(state.ids.stats[x - 1], V_PAD_STATS), - } - }) - .set( - state.ids.stats[armor.stats(self.msm).poise_resilience.is_some() - as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize - + armor.stats(self.msm).crit_power.is_some() as usize - + armor.stats(self.msm).stealth.is_some() as usize], - ui, - ); - } - }, + // Slots + if item.num_slots() > 0 { + stat_text( + format!("{} : {}", i18n.get("common.stats.slots"), item.num_slots()), + index, + ); } if let Some(equipped_item) = equipped_item { if let ItemKind::Armor(equipped_armor) = &*equipped_item.kind() { - let diff = armor.stats(self.msm) - equipped_armor.stats(self.msm); + let equipped_stats = equipped_armor.stats(self.msm); + let diff = armor_stats - equipped_stats; let protection_diff = util::option_comparison( - &armor.stats(self.msm).protection, - &equipped_armor.stats(self.msm).protection, + &armor_stats.protection, + &equipped_stats.protection, ); let poise_res_diff = util::option_comparison( - &armor.stats(self.msm).poise_resilience, - &equipped_armor.stats(self.msm).poise_resilience, + &armor_stats.poise_resilience, + &equipped_stats.poise_resilience, ); let energy_max_diff = util::option_comparison( - &armor.stats(self.msm).energy_max, - &equipped_armor.stats(self.msm).energy_max, + &armor_stats.energy_max, + &equipped_stats.energy_max, ); let energy_reward_diff = util::option_comparison( - &armor.stats(self.msm).energy_reward, - &equipped_armor.stats(self.msm).energy_reward, + &armor_stats.energy_reward, + &equipped_stats.energy_reward, ); let crit_power_diff = util::option_comparison( - &armor.stats(self.msm).crit_power, - &equipped_armor.stats(self.msm).crit_power, + &armor_stats.crit_power, + &equipped_stats.crit_power, ); - let stealth_diff = util::option_comparison( - &armor.stats(self.msm).stealth, - &equipped_armor.stats(self.msm).stealth, - ); - - if let Some(p_diff) = diff.protection { - if p_diff != Protection::Normal(0.0) { - widget::Text::new(protection_diff.0) - .right_from(state.ids.main_stat_text, H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(protection_diff.1) - .set(state.ids.diff_main_stat, ui); - } - } + let stealth_diff = + util::option_comparison(&armor_stats.stealth, &equipped_stats.stealth); let mut diff_text = |text: String, color, id_index| { widget::Text::new(&*text) @@ -1096,6 +907,20 @@ impl<'a> Widget for ItemTooltip<'a> { .set(state.ids.diffs[id_index], ui) }; + let mut index = 0; + + if let Some(p_diff) = diff.protection { + if p_diff != Protection::Normal(0.0) { + let text = format!( + "{} {}", + &protection_diff.0, + util::protec2string(p_diff) + ); + diff_text(text, protection_diff.1, index); + index += armor_stats.protection.is_some() as usize; + } + } + if let Some(p_r_diff) = diff.poise_resilience { if p_r_diff != Protection::Normal(0.0) { let text = format!( @@ -1103,18 +928,16 @@ impl<'a> Widget for ItemTooltip<'a> { &poise_res_diff.0, util::protec2string(p_r_diff) ); - diff_text(text, poise_res_diff.1, 0) + diff_text(text, poise_res_diff.1, index); + index += armor_stats.poise_resilience.is_some() as usize; } } if let Some(e_m_diff) = diff.energy_max { if e_m_diff.abs() > Energy::ENERGY_EPSILON { let text = format!("{} {:.1}", &energy_max_diff.0, e_m_diff); - diff_text( - text, - energy_max_diff.1, - armor.stats(self.msm).poise_resilience.is_some() as usize, - ) + diff_text(text, energy_max_diff.1, index); + index += armor_stats.energy_max.is_some() as usize; } } @@ -1122,39 +945,23 @@ impl<'a> Widget for ItemTooltip<'a> { if e_r_diff.abs() > Energy::ENERGY_EPSILON { let text = format!("{} {:.1}", &energy_reward_diff.0, e_r_diff * 100.0); - diff_text( - text, - energy_reward_diff.1, - armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize, - ) + diff_text(text, energy_reward_diff.1, index); + index += armor_stats.energy_reward.is_some() as usize; } } if let Some(c_p_diff) = diff.crit_power { if c_p_diff != 0.0_f32 { let text = format!("{} {:.3}", &crit_power_diff.0, c_p_diff); - diff_text( - text, - crit_power_diff.1, - armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize, - ) + diff_text(text, crit_power_diff.1, index); + index += armor_stats.crit_power.is_some() as usize; } } if let Some(s_diff) = diff.stealth { if s_diff != 0.0_f32 { let text = format!("{} {:.3}", &stealth_diff.0, s_diff); - diff_text( - text, - stealth_diff.1, - armor.stats(self.msm).poise_resilience.is_some() as usize - + armor.stats(self.msm).energy_max.is_some() as usize - + armor.stats(self.msm).energy_reward.is_some() as usize - + armor.stats(self.msm).crit_power.is_some() as usize, - ) + diff_text(text, stealth_diff.1, index); } } } From b572c32a4dc0c6164039cb8b632c4c93906855a6 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 30 Jul 2022 00:18:10 -0400 Subject: [PATCH 004/854] Tweaks --- assets/common/abilities/bow/charged.ron | 12 ++++++------ assets/common/abilities/sceptre/healingaura.ron | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/common/abilities/bow/charged.ron b/assets/common/abilities/bow/charged.ron index 1dcd986eb9..9b2e4830c5 100644 --- a/assets/common/abilities/bow/charged.ron +++ b/assets/common/abilities/bow/charged.ron @@ -1,14 +1,14 @@ ChargedRanged( energy_cost: 0, energy_drain: 0, - initial_regen: 4, - scaled_regen: 16, - initial_damage: 3, - scaled_damage: 15, + initial_regen: 2, + scaled_regen: 14, + initial_damage: 2, + scaled_damage: 14, initial_knockback: 0, scaled_knockback: 15, - buildup_duration: 0.3, - charge_duration: 0.9, + buildup_duration: 0.25, + charge_duration: 1.0, recover_duration: 0.4, projectile_body: Object(Arrow), projectile_light: None, diff --git a/assets/common/abilities/sceptre/healingaura.ron b/assets/common/abilities/sceptre/healingaura.ron index 3c4707e5f0..76c71d14d7 100644 --- a/assets/common/abilities/sceptre/healingaura.ron +++ b/assets/common/abilities/sceptre/healingaura.ron @@ -6,8 +6,8 @@ BasicAura( auras: [ ( kind: Regeneration, - strength: 1, - duration: Some(5), + strength: 0.5, + duration: Some(8), category: Magical, ), ], From ea0192b7e306ec0682e9576334536b7d589561b7 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 30 Jul 2022 11:38:28 -0400 Subject: [PATCH 005/854] Tweaked tooltips so that item name and kind are next to image, to reduce amount of empty space. --- voxygen/src/ui/widgets/item_tooltip.rs | 41 +++++++++++--------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 4151a3ca96..18bd46559a 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -534,24 +534,12 @@ impl<'a> Widget for ItemTooltip<'a> { .set(state.ids.image, ui); } - // Title - widget::Text::new(&title) - .w(text_w) - .graphics_for(id) - .parent(id) - .with_style(self.style.title) - .top_left_with_margins_on(state.ids.image_frame, V_PAD, H_PAD) - .center_justify() - .color(quality) - .set(state.ids.title, ui); - // Item frame widget::Image::new(quality_col_img) .wh(ICON_SIZE) .graphics_for(id) .parent(id) .top_left_with_margins_on(state.ids.image_frame, V_PAD, H_PAD) - .down_from(state.ids.title, V_PAD) .set(state.ids.item_frame, ui); // Item render @@ -566,14 +554,27 @@ impl<'a> Widget for ItemTooltip<'a> { .middle_of(state.ids.item_frame) .set(state.ids.item_render, ui); + let title_w = (text_w - H_PAD * 3.0 - ICON_SIZE[0]).max(0.0); + + // Title + widget::Text::new(&title) + .w(title_w) + .graphics_for(id) + .parent(id) + .with_style(self.style.title) + .top_left_with_margins_on(state.ids.image_frame, V_PAD, H_PAD) + .right_from(state.ids.item_frame, H_PAD) + .color(quality) + .set(state.ids.title, ui); + // Subtitle widget::Text::new(&subtitle) - .w(text_w) + .w(title_w) .graphics_for(id) .parent(id) .with_style(self.style.desc) .color(conrod_core::color::GREY) - .right_from(state.ids.item_frame, H_PAD) + .down_from(state.ids.title, V_PAD) .set(state.ids.subtitle, ui); // Stats @@ -1220,18 +1221,10 @@ impl<'a> Widget for ItemTooltip<'a> { fn default_y_dimension(&self, ui: &Ui) -> Dimension { let item = &self.item; - let (title, desc) = (item.name().to_string(), item.description().to_string()); + let desc = item.description().to_string(); let (text_w, _image_w) = self.text_image_width(260.0); - // Title - let title_h = widget::Text::new(&title) - .w(text_w) - .with_style(self.style.title) - .get_h(ui) - .unwrap_or(0.0) - + V_PAD; - // Item frame let frame_h = ICON_SIZE[1] + V_PAD; @@ -1282,7 +1275,7 @@ impl<'a> Widget for ItemTooltip<'a> { 0.0 }; - let height = title_h + frame_h + stat_h + desc_h + price_h + V_PAD + 5.0; // extra padding to fit frame top padding + let height = frame_h + stat_h + desc_h + price_h + V_PAD + 5.0; // extra padding to fit frame top padding Dimension::Absolute(height) } } From cfdc2a8ae6092f5687fcd3673dc6f680ab94ad5d Mon Sep 17 00:00:00 2001 From: Isse Date: Sun, 31 Jul 2022 21:53:25 +0000 Subject: [PATCH 006/854] Add setting to disable flashing lights --- CHANGELOG.md | 1 + assets/voxygen/i18n/en/hud/settings.ron | 2 + .../voxygen/shaders/include/point_glow.glsl | 13 +++-- assets/voxygen/shaders/include/sky.glsl | 8 ++- voxygen/src/hud/settings_window/video.rs | 56 ++++++++++++++++++- voxygen/src/render/mod.rs | 5 ++ .../src/render/renderer/pipeline_creation.rs | 4 ++ voxygen/src/scene/mod.rs | 1 + voxygen/src/scene/particle.rs | 28 ++++++---- voxygen/src/session/mod.rs | 6 ++ 10 files changed, 104 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0d7a52f0b..9d24d3799b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - More varied ambient birdcalls - Cave biomes - Updated the Polish translation +- Setting for disabling flashing lights ### Changed diff --git a/assets/voxygen/i18n/en/hud/settings.ron b/assets/voxygen/i18n/en/hud/settings.ron index 93d1656faa..f75e9fe391 100644 --- a/assets/voxygen/i18n/en/hud/settings.ron +++ b/assets/voxygen/i18n/en/hud/settings.ron @@ -94,6 +94,8 @@ "hud.settings.particles": "Particles", "hud.settings.lossy_terrain_compression": "Lossy terrain compression", "hud.settings.weapon_trails": "Weapon trails", + "hud.settings.flashing_lights": "Flashing lights", + "hud.settings.flashing_lights_info": "Disables all kinds of flashing, e.g. flickering or lightning strikes", "hud.settings.resolution": "Resolution", "hud.settings.bit_depth": "Bit Depth", "hud.settings.refresh_rate": "Refresh Rate", diff --git a/assets/voxygen/shaders/include/point_glow.glsl b/assets/voxygen/shaders/include/point_glow.glsl index 3ffcdce4ec..8331e2b7ad 100644 --- a/assets/voxygen/shaders/include/point_glow.glsl +++ b/assets/voxygen/shaders/include/point_glow.glsl @@ -56,11 +56,14 @@ vec3 apply_point_glow(vec3 wpos, vec3 dir, float max_dist, vec3 color) { apply_point_glow_light(L, wpos, dir, max_dist, color); } #endif - float time_since_lightning = tick.x - last_lightning.w; - if (time_since_lightning < MAX_LIGHTNING_PERIOD) { - // Apply lightning - apply_point_glow_light(Light(last_lightning.xyzw + vec4(0, 0, LIGHTNING_HEIGHT, 0), vec4(vec3(0.2, 0.4, 1) * lightning_intensity() * 0.003, 1)), wpos, dir, max_dist, color); - } + + #ifdef FLASHING_LIGHTS_ENABLED + float time_since_lightning = tick.x - last_lightning.w; + if (time_since_lightning < MAX_LIGHTNING_PERIOD) { + // Apply lightning + apply_point_glow_light(Light(last_lightning.xyzw + vec4(0, 0, LIGHTNING_HEIGHT, 0), vec4(vec3(0.2, 0.4, 1) * lightning_intensity() * 0.003, 1)), wpos, dir, max_dist, color); + } + #endif return color; } diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index c41cbb417b..15efe21f86 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -459,13 +459,19 @@ float get_sun_diffuse2(DirectionalLight sun_info, DirectionalLight moon_info, ve } #endif + #ifdef FLASHING_LIGHTS_ENABLED + vec3 lightning = lightning_at(wpos); + #else + vec3 lightning = vec3(0); + #endif + reflected_light = R_t_r * ( (1.0 - SUN_AMBIANCE) * sun_chroma * sun_shadow * (light_reflection_factor(norm, dir, sun_dir, k_d, k_s, alpha, voxel_norm, voxel_lighting) /*+ light_reflection_factor(norm, dir, normalize(sun_dir + vec3(0.0, 0.1, 0.0)), k_d, k_s, alpha) + light_reflection_factor(norm, dir, normalize(sun_dir - vec3(0.0, 0.1, 0.0)), k_d, k_s, alpha)*/) + (1.0 - MOON_AMBIANCE) * moon_chroma * moon_shadow * 1.0 * /*4.0 * */light_reflection_factor(norm, dir, moon_dir, k_d, k_s, alpha, voxel_norm, voxel_lighting) + emission - ) + lightning_at(wpos); + ) + lightning; /* light = sun_chroma + moon_chroma + PERSISTENT_AMBIANCE; diffuse_light = diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 6667abaa2e..39f03cd744 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -106,6 +106,9 @@ widget_ids! { lossy_terrain_compression_label, weapon_trails_button, weapon_trails_label, + flashing_lights_button, + flashing_lights_label, + flashing_lights_info_label, // fullscreen_button, fullscreen_label, @@ -1270,6 +1273,53 @@ impl<'a> Widget for Video<'a> { )); } + // Disable flashing lights + Text::new(self.localized_strings.get("hud.settings.flashing_lights")) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .down_from(state.ids.particles_label, 25.0) + .color(TEXT_COLOR) + .set(state.ids.flashing_lights_label, ui); + + let flashing_lights_enabled = ToggleButton::new( + self.global_state + .settings + .graphics + .render_mode + .flashing_lights_enabled, + self.imgs.checkbox, + self.imgs.checkbox_checked, + ) + .w_h(18.0, 18.0) + .right_from(state.ids.flashing_lights_label, 10.0) + .hover_images(self.imgs.checkbox_mo, self.imgs.checkbox_checked_mo) + .press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked) + .set(state.ids.flashing_lights_button, ui); + + Text::new( + self.localized_strings + .get("hud.settings.flashing_lights_info"), + ) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .right_from(state.ids.flashing_lights_label, 32.0) + .color(TEXT_COLOR) + .set(state.ids.flashing_lights_info_label, ui); + + if self + .global_state + .settings + .graphics + .render_mode + .flashing_lights_enabled + != flashing_lights_enabled + { + events.push(GraphicsChange::ChangeRenderMode(Box::new(RenderMode { + flashing_lights_enabled, + ..render_mode.clone() + }))); + } + // Resolution let resolutions: Vec<[u16; 2]> = state .video_modes @@ -1283,7 +1333,7 @@ impl<'a> Widget for Video<'a> { Text::new(self.localized_strings.get("hud.settings.resolution")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) - .down_from(state.ids.particles_label, 8.0) + .down_from(state.ids.flashing_lights_label, 25.0) .color(TEXT_COLOR) .set(state.ids.resolution_label, ui); @@ -1342,7 +1392,7 @@ impl<'a> Widget for Video<'a> { Text::new(self.localized_strings.get("hud.settings.bit_depth")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) - .down_from(state.ids.particles_label, 8.0) + .down_from(state.ids.flashing_lights_label, 25.0) .right_from(state.ids.resolution, 8.0) .color(TEXT_COLOR) .set(state.ids.bit_depth_label, ui); @@ -1396,7 +1446,7 @@ impl<'a> Widget for Video<'a> { Text::new(self.localized_strings.get("hud.settings.refresh_rate")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) - .down_from(state.ids.particles_label, 8.0) + .down_from(state.ids.flashing_lights_label, 25.0) .right_from(state.ids.bit_depth, 8.0) .color(TEXT_COLOR) .set(state.ids.refresh_rate_label, ui); diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index 47a31e6184..ebf5bd8d91 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -352,6 +352,8 @@ pub struct RenderMode { /// 0.0..1.0 pub point_glow: f32, + pub flashing_lights_enabled: bool, + pub experimental_shaders: HashSet, pub upscale_mode: UpscaleMode, @@ -370,6 +372,7 @@ impl Default for RenderMode { rain_occlusion: ShadowMapMode::default(), bloom: BloomMode::default(), point_glow: 0.35, + flashing_lights_enabled: true, experimental_shaders: HashSet::default(), upscale_mode: UpscaleMode::default(), present_mode: PresentMode::default(), @@ -390,6 +393,7 @@ impl RenderMode { rain_occlusion: self.rain_occlusion, bloom: self.bloom, point_glow: self.point_glow, + flashing_lights_enabled: self.flashing_lights_enabled, experimental_shaders: self.experimental_shaders, }, OtherModes { @@ -413,6 +417,7 @@ pub struct PipelineModes { pub rain_occlusion: ShadowMapMode, bloom: BloomMode, point_glow: f32, + flashing_lights_enabled: bool, experimental_shaders: HashSet, } diff --git a/voxygen/src/render/renderer/pipeline_creation.rs b/voxygen/src/render/renderer/pipeline_creation.rs index ac29f6e087..4ffbff967f 100644 --- a/voxygen/src/render/renderer/pipeline_creation.rs +++ b/voxygen/src/render/renderer/pipeline_creation.rs @@ -211,6 +211,10 @@ impl ShaderModules { ); } + if pipeline_modes.flashing_lights_enabled { + constants += "#define FLASHING_LIGHTS_ENABLED"; + } + for shader in pipeline_modes.experimental_shaders.iter() { constants += &format!( "#define EXPERIMENTAL_{}\n", diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index a194856953..bd0c9dd443 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -126,6 +126,7 @@ pub struct SceneData<'a> { pub sprite_render_distance: f32, pub particles_enabled: bool, pub weapon_trails_enabled: bool, + pub flashing_lights_enabled: bool, pub figure_lod_render_distance: f32, pub is_aiming: bool, } diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 551fed1c36..a0739d3e63 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -787,11 +787,13 @@ impl ParticleMgr { let (from, to) = (Vec3::::unit_z(), *ori.look_dir()); let m = Mat3::::rotation_from_to_3d(from, to); // Emit a light when using flames - lights.push(Light::new( - pos, - Rgb::new(1.0, 0.25, 0.05).map(|e| e * rng.gen_range(0.8..1.2)), - 2.0, - )); + if scene_data.flashing_lights_enabled { + lights.push(Light::new( + pos, + Rgb::new(1.0, 0.25, 0.05).map(|e| e * rng.gen_range(0.8..1.2)), + 2.0, + )); + } self.particles.resize_with( self.particles.len() + usize::from(beam_tick_count) / 2, || { @@ -818,11 +820,13 @@ impl ParticleMgr { let (from, to) = (Vec3::::unit_z(), *ori.look_dir()); let m = Mat3::::rotation_from_to_3d(from, to); // Emit a light when using flames - lights.push(Light::new( - pos, - Rgb::new(1.0, 0.0, 1.0).map(|e| e * rng.gen_range(0.5..1.0)), - 2.0, - )); + if scene_data.flashing_lights_enabled { + lights.push(Light::new( + pos, + Rgb::new(1.0, 0.0, 1.0).map(|e| e * rng.gen_range(0.5..1.0)), + 2.0, + )); + } self.particles.resize_with( self.particles.len() + usize::from(beam_tick_count) / 2, || { @@ -846,7 +850,9 @@ impl ParticleMgr { }, beam::FrontendSpecifier::LifestealBeam => { // Emit a light when using lifesteal beam - lights.push(Light::new(pos, Rgb::new(0.8, 1.0, 0.5), 1.0)); + if scene_data.flashing_lights_enabled { + lights.push(Light::new(pos, Rgb::new(0.8, 1.0, 0.5), 1.0)); + } self.particles.reserve(beam_tick_count as usize); for i in 0..beam_tick_count { self.particles.push(Particle::new_directed( diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 3183489b56..7f94784de7 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -1593,6 +1593,11 @@ impl PlayState for SessionState { as f32, particles_enabled: global_state.settings.graphics.particles_enabled, weapon_trails_enabled: global_state.settings.graphics.weapon_trails_enabled, + flashing_lights_enabled: global_state + .settings + .graphics + .render_mode + .flashing_lights_enabled, figure_lod_render_distance: global_state .settings .graphics @@ -1671,6 +1676,7 @@ impl PlayState for SessionState { figure_lod_render_distance: settings.graphics.figure_lod_render_distance as f32, particles_enabled: settings.graphics.particles_enabled, weapon_trails_enabled: settings.graphics.weapon_trails_enabled, + flashing_lights_enabled: settings.graphics.render_mode.flashing_lights_enabled, is_aiming: self.is_aiming, }; From bf4a582cf7543647af78296a12b87651e5b4c39e Mon Sep 17 00:00:00 2001 From: DaforLynx Date: Mon, 1 Aug 2022 17:41:44 +0000 Subject: [PATCH 007/854] WIP: New music, "now playing" line in debug overlay, and music frequency slider --- CHANGELOG.md | 2 + assets/voxygen/audio/soundtrack.ron | 42 +++++++++++++++---- .../soundtrack/overworld/moonlit_canopy.ogg | 3 ++ .../soundtrack/overworld/the_undergrowth.ogg | 3 ++ assets/voxygen/i18n/en/hud/settings.ron | 1 + voxygen/src/audio/mod.rs | 21 ++++++---- voxygen/src/audio/music.rs | 41 ++++++++++++++++-- voxygen/src/hud/mod.rs | 18 +++++++- voxygen/src/hud/settings_window/sound.rs | 40 +++++++++++++++++- voxygen/src/scene/mod.rs | 4 +- voxygen/src/session/mod.rs | 2 + voxygen/src/session/settings_change.rs | 6 +++ voxygen/src/settings/audio.rs | 2 + 13 files changed, 161 insertions(+), 24 deletions(-) create mode 100644 assets/voxygen/audio/soundtrack/overworld/moonlit_canopy.ogg create mode 100644 assets/voxygen/audio/soundtrack/overworld/the_undergrowth.ogg diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d24d3799b..41322ce7bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Currently playing music track and artist now shows in the debug menu. +- Added a setting to influence the gap between music track plays. ### Changed diff --git a/assets/voxygen/audio/soundtrack.ron b/assets/voxygen/audio/soundtrack.ron index 15b32fea8e..50da4ff7f4 100644 --- a/assets/voxygen/audio/soundtrack.ron +++ b/assets/voxygen/audio/soundtrack.ron @@ -12,6 +12,31 @@ [ // Overworld exploration tracks + Individual(( + title: "The Undergrowth", + path: "voxygen.audio.soundtrack.overworld.the_undergrowth", + length: 165.0, + timing: None, + biomes: [ + (Jungle, 1), + ], + site: Some(Void), + music_state: Activity(Explore), + artist: "Oolnokk", + )), + Individual(( + title: "Moonlit Canopy", + path: "voxygen.audio.soundtrack.overworld.moonlit_canopy", + length: 170.0, + timing: Some(Night), + biomes: [ + (Forest, 2), + (Taiga, 1), + ], + site: Some(Void), + music_state: Activity(Explore), + artist: "GeekyGami", + )), Individual(( title: "Adventurous Soul", path: "voxygen.audio.soundtrack.overworld.adventurous_soul", @@ -129,7 +154,7 @@ title: "Jungle Ambient", path: "voxygen.audio.soundtrack.overworld.jungle_ambient", length: 218.0, - timing: Some(Day), + timing: None, weather: None, biomes: [ (Jungle, 1), @@ -283,8 +308,6 @@ weather: None, biomes: [ (Forest, 2), - (Jungle, 1), - (Taiga, 1), ], site: Some(Void), music_state: Activity(Explore), @@ -649,28 +672,29 @@ Segmented( title: "Barred Paths", - author: "DaforLynx", timing: None, weather: None, biomes: [], site: Some(Dungeon), segments: [ - ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-start", 55.97, Transition(Explore, Combat(High)), Some(Combat(High))), - ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-loop", 53.97, Activity(Combat(High)), None), + ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-start", 56.0, Transition(Explore, Combat(High)), Some(Combat(High))), + ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-loop", 54.0, Activity(Combat(High)), None), ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-end", 6.0, Transition(Combat(High), Explore), None), ], + artist: "DaforLynx", ), Segmented( title: "Reversal", - author: "DaforLynx", timing: None, + weather: None, biomes: [], site: Some(Dungeon), segments: [ - ("voxygen.audio.soundtrack.combat.reversal.reversal-start", 59.97, Transition(Explore, Combat(High)), Some(Combat(High))), - ("voxygen.audio.soundtrack.combat.reversal.reversal-loop", 59.97, Activity(Combat(High)), None), + ("voxygen.audio.soundtrack.combat.reversal.reversal-start", 60.0, Transition(Explore, Combat(High)), Some(Combat(High))), + ("voxygen.audio.soundtrack.combat.reversal.reversal-loop", 60.0, Activity(Combat(High)), None), ("voxygen.audio.soundtrack.combat.reversal.reversal-end", 4.0, Transition(Combat(High), Explore), None), ], + artist: "DaforLynx", ), ] ) diff --git a/assets/voxygen/audio/soundtrack/overworld/moonlit_canopy.ogg b/assets/voxygen/audio/soundtrack/overworld/moonlit_canopy.ogg new file mode 100644 index 0000000000..4ee921b375 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/overworld/moonlit_canopy.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55ae7ddffa2e510f4cdbde990901032ae4f6c819005047df57986a9a98549ec3 +size 8620099 diff --git a/assets/voxygen/audio/soundtrack/overworld/the_undergrowth.ogg b/assets/voxygen/audio/soundtrack/overworld/the_undergrowth.ogg new file mode 100644 index 0000000000..729d02624a --- /dev/null +++ b/assets/voxygen/audio/soundtrack/overworld/the_undergrowth.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a637b24bf731d6c223b9019ce23869c811971696cd94b86db130798762389c7 +size 9567567 diff --git a/assets/voxygen/i18n/en/hud/settings.ron b/assets/voxygen/i18n/en/hud/settings.ron index f75e9fe391..d62bbfb0e1 100644 --- a/assets/voxygen/i18n/en/hud/settings.ron +++ b/assets/voxygen/i18n/en/hud/settings.ron @@ -120,6 +120,7 @@ "hud.settings.music_volume": "Music Volume", "hud.settings.sound_effect_volume": "Sound Effects Volume", "hud.settings.ambience_volume": "Ambience Volume", + "hud.settings.music_frequency": "Gap Between Songs", "hud.settings.audio_device": "Audio Device", "hud.settings.reset_sound": "Reset to Defaults", diff --git a/voxygen/src/audio/mod.rs b/voxygen/src/audio/mod.rs index 98c30d7681..86db868caa 100644 --- a/voxygen/src/audio/mod.rs +++ b/voxygen/src/audio/mod.rs @@ -55,6 +55,7 @@ pub struct AudioFrontend { ambience_volume: f32, music_volume: f32, master_volume: f32, + music_frequency: f32, listener: Listener, mtm: AssetHandle, @@ -107,6 +108,7 @@ impl AudioFrontend { ambience_volume: 1.0, music_volume: 1.0, master_volume: 1.0, + music_frequency: 1.0, listener: Listener::default(), mtm: AssetExt::load_expect("voxygen.audio.music_transition_manifest"), } @@ -138,6 +140,7 @@ impl AudioFrontend { ambience_volume: 1.0, music_volume: 1.0, master_volume: 1.0, + music_frequency: 1.0, listener: Listener::default(), mtm, } @@ -179,6 +182,14 @@ impl AudioFrontend { None } + fn play_music(&mut self, sound: &str, channel_tag: MusicChannelTag) { + if self.music_enabled() { + if let Some(channel) = self.get_music_channel(channel_tag) { + channel.play(load_ogg(sound), channel_tag); + } + } + } + /// Retrieve a music channel from the channel list. This inspects the /// MusicChannelTag to determine whether we are transitioning between /// music types and acts accordingly. For example transitioning between @@ -373,14 +384,6 @@ impl AudioFrontend { // } // } - fn play_music(&mut self, sound: &str, channel_tag: MusicChannelTag) { - if self.music_enabled() { - if let Some(channel) = self.get_music_channel(channel_tag) { - channel.play(load_ogg(sound), channel_tag); - } - } - } - /* These functions are saved for if we want music playback control at some * point. They are not used currently but may be useful for later work. * @@ -476,6 +479,8 @@ impl AudioFrontend { } } + pub fn set_music_frequency(&mut self, multiplier: f32) { self.music_frequency = multiplier } + /// Updates master volume in all channels pub fn set_master_volume(&mut self, master_volume: f32) { self.master_volume = master_volume; diff --git a/voxygen/src/audio/music.rs b/voxygen/src/audio/music.rs index a4e62550f6..33a4b61013 100644 --- a/voxygen/src/audio/music.rs +++ b/voxygen/src/audio/music.rs @@ -93,6 +93,8 @@ pub struct SoundtrackItem { /// transitions) #[serde(default)] activity_override: Option, + /// Song artist + artist: String, } #[derive(Clone, Debug, Deserialize)] @@ -105,6 +107,7 @@ enum RawSoundtrackItem { biomes: Vec<(BiomeKind, u8)>, site: Option, segments: Vec<(String, f32, MusicState, Option)>, + artist: String, }, } @@ -159,6 +162,10 @@ pub struct MusicMgr { last_interrupt: Instant, /// The previous track's activity kind, for transitions last_activity: MusicState, + // For debug menu + pub current_track: String, + pub current_artist: String, + track_length: f32, } #[derive(Deserialize)] @@ -206,6 +213,9 @@ impl Default for MusicMgr { last_track: String::from("None"), last_interrupt: Instant::now(), last_activity: MusicState::Activity(MusicActivity::Explore), + current_track: String::from("None"), + current_artist: String::from("None"), + track_length: 0.0, } } } @@ -294,6 +304,12 @@ impl MusicMgr { let interrupt = matches!(music_state, MusicState::Transition(_, _)) && self.last_interrupt.elapsed().as_secs_f32() > mtm.interrupt_delay; + // When the current track ends, clear the debug values + if self.began_playing.elapsed().as_secs_f32() > self.track_length { + self.current_track = String::from("None"); + self.current_artist = String::from("None"); + } + if audio.music_enabled() && !self.soundtrack.read().tracks.is_empty() && (self.began_playing.elapsed().as_secs_f32() > self.next_track_change || interrupt) @@ -325,20 +341,29 @@ impl MusicMgr { // a town, or exploring. // TODO: make this something that is decided when a song ends, instead of when // it begins + let frequency_multipler = audio.music_frequency; let silence_between_tracks_seconds: f32 = if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) && matches!(client.current_site(), SitesKind::Settlement) { - rng.gen_range(100.0..130.0) + rng.gen_range(120.0 * frequency_multipler..180.0 * frequency_multipler) + } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) + && matches!(client.current_site(), SitesKind::Dungeon) + { + rng.gen_range(10.0 * frequency_multipler..20.0 * frequency_multipler) + } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) + && matches!(client.current_site(), SitesKind::Cave) + { + rng.gen_range(20.0 * frequency_multipler..40.0 * frequency_multipler) } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) { - rng.gen_range(90.0..180.0) + rng.gen_range(120.0 * frequency_multipler..240.0 * frequency_multipler) } else if matches!( music_state, MusicState::Activity(MusicActivity::Combat(_)) | MusicState::Transition(_, _) ) { 0.0 } else { - rng.gen_range(30.0..60.0) + rng.gen_range(30.0 * frequency_multipler..60.0 * frequency_multipler) }; let is_dark = (state.get_day_period().is_dark()) as bool; @@ -427,7 +452,15 @@ impl MusicMgr { // println!("Now playing {:?}", track.title); self.last_track = String::from(&track.title); self.began_playing = Instant::now(); + self.track_length = track.length; self.next_track_change = track.length + silence_between_tracks_seconds; + if audio.music_enabled() { + self.current_track = String::from(&track.title); + self.current_artist = String::from(&track.artist); + } else { + self.current_track = String::from("None"); + self.current_artist = String::from("None"); + } let tag = if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) { MusicChannelTag::Exploration @@ -481,6 +514,7 @@ impl assets::Compound for SoundtrackCollection { biomes, site, segments, + artist, } => { for (path, length, music_state, activity_override) in segments.into_iter() { soundtracks.tracks.push(SoundtrackItem { @@ -493,6 +527,7 @@ impl assets::Compound for SoundtrackCollection { site, music_state, activity_override, + artist: artist.clone(), }); } }, diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 7f020361bb..3d51f3e6af 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -265,6 +265,7 @@ widget_ids! { graphics_backend, gpu_timings[], weather, + song_info, // Game Version version, @@ -493,6 +494,8 @@ pub struct DebugInfo { pub num_figures_visible: u32, pub num_particles: u32, pub num_particles_visible: u32, + pub current_track: String, + pub current_artist: String, } pub struct HudInfo { @@ -2443,10 +2446,21 @@ impl Hud { .font_size(self.fonts.cyri.scale(14)) .set(self.ids.current_site, ui_widgets); + // Current song info + Text::new(&format!( + "Currently playing: {} [{}]", + debug_info.current_track, debug_info.current_artist, + )) + .color(TEXT_COLOR) + .down_from(self.ids.current_site, V_PAD) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(14)) + .set(self.ids.song_info, ui_widgets); + // Number of lights Text::new(&format!("Lights: {}", debug_info.num_lights,)) .color(TEXT_COLOR) - .down_from(self.ids.current_site, V_PAD) + .down_from(self.ids.song_info, V_PAD) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) .set(self.ids.num_lights, ui_widgets); @@ -2525,7 +2539,7 @@ impl Hud { // Set debug box dimensions, only timings height is dynamic // TODO: Make the background box size fully dynamic - let debug_bg_size = [320.0, 385.0 + timings_height]; + let debug_bg_size = [375.0, 405.0 + timings_height]; Rectangle::fill(debug_bg_size) .rgba(0.0, 0.0, 0.0, global_state.settings.chat.chat_opacity) diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index 7d3e1a9503..b85b995c3f 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -34,6 +34,9 @@ widget_ids! { ambience_volume_text, ambience_volume_slider, ambience_volume_number, + music_frequency_text, + music_frequency_slider, + music_frequency_number, //audio_device_list, //audio_device_text, reset_sound_button, @@ -284,6 +287,41 @@ impl<'a> Widget for Sound<'a> { .color(TEXT_COLOR) .set(state.ids.ambience_volume_number, ui); + // Music frequency (actually gap between songs) + Text::new(self.localized_strings.get("hud.settings.music_frequency")) + .down_from(state.ids.ambience_volume_slider, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.music_frequency_text, ui); + // Music frequency Slider + if let Some(new_val) = ImageSlider::continuous( + self.global_state.settings.audio.music_frequency, + 0.0, + 2.0, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .down_from(state.ids.music_frequency_text, 10.0) + .track_breadth(12.0) + .slider_length(10.0) + .pad_track((5.0, 5.0)) + .set(state.ids.music_frequency_slider, ui) + { + events.push(AdjustMusicFrequency(new_val)); + } + // Music frequency Number + Text::new(&format!( + "{:1.2}x", + self.global_state.settings.audio.music_frequency + )) + .right_from(state.ids.music_frequency_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.music_frequency_number, ui); + // Audio Device Selector // -------------------------------------------- // let device = &self.global_state.audio.device; @@ -316,7 +354,7 @@ impl<'a> Widget for Sound<'a> { .w_h(RESET_BUTTONS_WIDTH, RESET_BUTTONS_HEIGHT) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .down_from(state.ids.ambience_volume_slider, 12.0) + .down_from(state.ids.music_frequency_slider, 12.0) .label(self.localized_strings.get("hud.settings.reset_sound")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index bd0c9dd443..15ca5e10db 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -104,7 +104,7 @@ pub struct Scene { trail_mgr: TrailMgr, figure_mgr: FigureMgr, pub sfx_mgr: SfxMgr, - music_mgr: MusicMgr, + pub music_mgr: MusicMgr, ambient_mgr: AmbientMgr, integrated_rain_vel: f32, @@ -352,6 +352,8 @@ impl Scene { /// Get a reference to the scene's figure manager. pub fn figure_mgr(&self) -> &FigureMgr { &self.figure_mgr } + pub fn music_mgr(&self) -> &MusicMgr { &self.music_mgr } + /// Get a mutable reference to the scene's camera. pub fn camera_mut(&mut self) -> &mut Camera { &mut self.camera } diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 7f94784de7..c6e1f5bd16 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -1132,6 +1132,8 @@ impl PlayState for SessionState { num_particles: self.scene.particle_mgr().particle_count() as u32, num_particles_visible: self.scene.particle_mgr().particle_count_visible() as u32, + current_track: self.scene.music_mgr().current_track.clone(), + current_artist: self.scene.music_mgr().current_artist.clone(), } }); diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 825933532a..475f474272 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -23,6 +23,7 @@ pub enum Audio { AdjustMusicVolume(f32), AdjustSfxVolume(f32), AdjustAmbienceVolume(f32), + AdjustMusicFrequency(f32), //ChangeAudioDevice(String), ResetAudioSettings, } @@ -208,6 +209,11 @@ impl SettingsChange { settings.audio.ambience_volume = ambience_volume; }, + Audio::AdjustMusicFrequency(multiplier) => { + global_state.audio.set_music_frequency(multiplier); + + settings.audio.music_frequency = multiplier; + }, //Audio::ChangeAudioDevice(name) => { // global_state.audio.set_device(name.clone()); diff --git a/voxygen/src/settings/audio.rs b/voxygen/src/settings/audio.rs index 215124d2c2..a46d55da53 100644 --- a/voxygen/src/settings/audio.rs +++ b/voxygen/src/settings/audio.rs @@ -28,6 +28,7 @@ pub struct AudioSettings { pub ambience_volume: f32, pub num_sfx_channels: usize, pub num_ui_channels: usize, + pub music_frequency: f32, /// Audio Device that Voxygen will use to play audio. pub output: AudioOutput, @@ -43,6 +44,7 @@ impl Default for AudioSettings { ambience_volume: 0.6, num_sfx_channels: 60, num_ui_channels: 10, + music_frequency: 1.0, output: AudioOutput::Automatic, } } From 8862258f614b7f8c488d6a09a19c75ced3bd2623 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Sat, 6 Aug 2022 18:31:42 +0000 Subject: [PATCH 008/854] Deny any interaction received during hostile_tree --- CHANGELOG.md | 1 + assets/voxygen/i18n/en/npc.ron | 8 ++ assets/voxygen/i18n/fr_FR/npc.ron | 8 ++ server/src/sys/agent.rs | 192 +++++++++++++++++++++--------- 4 files changed, 153 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41322ce7bf..caaf448cba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Combat music now loops and ends properly - Modular weapons now have a selling price - Closing a subwindow now only regrabs the cursor if no other subwindow requires it. +- Fixed npc not handling interactions while fighting (especially merchants in trade) ## [0.12.0] - 2022-02-19 diff --git a/assets/voxygen/i18n/en/npc.ron b/assets/voxygen/i18n/en/npc.ron index 19b25c2558..b53f7d19ae 100644 --- a/assets/voxygen/i18n/en/npc.ron +++ b/assets/voxygen/i18n/en/npc.ron @@ -94,6 +94,10 @@ "Trade? Like I got anything that may interest you.", "My house is mine, I won't trade it for anything.", ], + "npc.speech.villager_busy": [ + "Sorry, I can't speak with you right now.", + "We'll talk later, I'm busy." + ], "npc.speech.merchant_advertisement": [ "Can I interest you in a trade?", "Do you want to trade with me?", @@ -117,6 +121,10 @@ "Maybe another time, have a good day!", "Too bad, maybe next time, then!" ], + "npc.speech.merchant_trade_cancelled_hostile": [ + "Sorry to cut it short, we have a problem to solve here!", + "We'll trade later, I need to take care of this first!" + ], "npc.speech.villager_cultist_alarm": [ "Lookout! There is a cultist on the loose!", "To arms! The cultists are attacking!", diff --git a/assets/voxygen/i18n/fr_FR/npc.ron b/assets/voxygen/i18n/fr_FR/npc.ron index f7c9ac0219..5561d7fc6c 100644 --- a/assets/voxygen/i18n/fr_FR/npc.ron +++ b/assets/voxygen/i18n/fr_FR/npc.ron @@ -94,6 +94,10 @@ "Échanger? Comme-si j'avais quoi que ce soit qui pourrait t'intéresser.", "Ma maison est à moi, je ne l'échangerai pour rien au monde.", ], + "npc.speech.villager_busy": [ + "Désolé, je ne peux pas vous parler pour le moment.", + "On verra ça plus tard, je suis occupé." + ], "npc.speech.merchant_advertisement": [ "Puis-je t'intéresser par un échange ?", "Veux-tu échanger avec moi?", @@ -117,6 +121,10 @@ "Peut-être une autre fois, bonne journée!", "Mince, peut-être une autre fois alors!" ], + "npc.speech.merchant_trade_cancelled_hostile": [ + "On va devoir arrêter là pour l'instant, on a un problème à régler !", + "On finira cet échange une prochaine fois, il y a une urgence par ici !" + ], "npc.speech.villager_cultist_alarm": [ "Regarde! Il y a un cultiste errant!", "Aux armes! Les cultistes attaquent!", diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 99c3452f6c..a0725e46eb 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -353,13 +353,41 @@ impl<'a> System<'a> for Sys { &mut rng, ); } else { - data.idle_tree( + data.idle_tree(agent, controller, &read_data, &mut rng); + } + if agent.allowed_to_speak() + && data.recv_interaction( agent, controller, &read_data, &mut event_emitter, - &mut rng, - ); + ) + { + agent.timer.start(read_data.time.0, TimerAction::Interact); + } + // Interact if incoming messages + if !agent.inbox.is_empty() { + if matches!( + agent.inbox.front(), + Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt) + ) { + let sound = agent.inbox.pop_front(); + match sound { + Some(AgentEvent::ServerSound(sound)) => { + agent.sounds_heard.push(sound); + }, + Some(AgentEvent::Hurt) => { + // Hurt utterances at random upon receiving damage + if rng.gen::() < 0.4 { + controller.push_utterance(UtteranceKind::Hurt); + } + }, + //Note: this should be unreachable + Some(_) | None => return, + } + } else { + agent.action_state.timer = 0.1; + } } } @@ -404,6 +432,7 @@ impl<'a> AgentData<'a> { let Target { target, hostile, .. } = target_info; + if let Some(tgt_health) = read_data.healths.get(target) { // If target is dead, forget them if tgt_health.is_dead { @@ -413,17 +442,18 @@ impl<'a> AgentData<'a> { agent.target = None; // Else, if target is hostile, hostile tree } else if hostile { + self.cancel_interaction(agent, controller, event_emitter); self.hostile_tree(agent, controller, read_data, event_emitter, rng); // Else, if owned, act as pet to them } else if let Some(Alignment::Owned(uid)) = self.alignment { if read_data.uids.get(target) == Some(uid) { - self.react_as_pet(agent, controller, read_data, event_emitter, target, rng); + self.react_as_pet(agent, controller, read_data, target, rng); } else { agent.target = None; - self.idle_tree(agent, controller, read_data, event_emitter, rng); + self.idle_tree(agent, controller, read_data, rng); }; } else { - self.idle_tree(agent, controller, read_data, event_emitter, rng); + self.idle_tree(agent, controller, read_data, rng); } } else if matches!(read_data.bodies.get(target), Some(Body::ItemDrop(_))) { if let Some(tgt_pos) = read_data.positions.get(target) { @@ -452,7 +482,7 @@ impl<'a> AgentData<'a> { } } else { agent.target = None; - self.idle_tree(agent, controller, read_data, event_emitter, rng); + self.idle_tree(agent, controller, read_data, rng); } } @@ -461,7 +491,6 @@ impl<'a> AgentData<'a> { agent: &mut Agent, controller: &mut Controller, read_data: &ReadData, - event_emitter: &mut Emitter<'_, ServerEvent>, target: EcsEntity, rng: &mut impl Rng, ) { @@ -485,7 +514,7 @@ impl<'a> AgentData<'a> { self.attack_target_attacker(agent, read_data, controller, rng); // Otherwise, just idle } else { - self.idle_tree(agent, controller, read_data, event_emitter, rng); + self.idle_tree(agent, controller, read_data, rng); } } } @@ -495,7 +524,6 @@ impl<'a> AgentData<'a> { agent: &mut Agent, controller: &mut Controller, read_data: &ReadData, - event_emitter: &mut Emitter<'_, ServerEvent>, rng: &mut impl Rng, ) { // TODO: Awareness currently doesn't influence anything. @@ -510,37 +538,6 @@ impl<'a> AgentData<'a> { } } } - // Interact if incoming messages - if !agent.inbox.is_empty() { - if matches!( - agent.inbox.front(), - Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt) - ) { - let sound = agent.inbox.pop_front(); - match sound { - Some(AgentEvent::ServerSound(sound)) => { - agent.sounds_heard.push(sound); - }, - Some(AgentEvent::Hurt) => { - // Hurt utterances at random upon receiving damage - if rng.gen::() < 0.4 { - controller.push_utterance(UtteranceKind::Hurt); - } - }, - //Note: this should be unreachable - Some(_) | None => return, - } - } else { - agent.action_state.timer = 0.1; - } - } - - // If we receive a new interaction, start the interaction timer - if agent.allowed_to_speak() - && self.recv_interaction(agent, controller, read_data, event_emitter) - { - agent.timer.start(read_data.time.0, TimerAction::Interact); - } let timeout = if agent.behavior.is(BehaviorState::TRADING) { TRADE_INTERACTION_TIME @@ -587,11 +584,12 @@ impl<'a> AgentData<'a> { return; } - if let Some(AgentEvent::Hurt) = agent.inbox.pop_front() { + if matches!(agent.inbox.front(), Some(AgentEvent::Hurt)) { // Hurt utterances at random upon receiving damage if rng.gen::() < 0.4 { controller.push_utterance(UtteranceKind::Hurt); } + agent.inbox.pop_front(); } if let Some(Target { @@ -979,6 +977,81 @@ impl<'a> AgentData<'a> { } } + /// deny any interaction whenever possible + fn cancel_interaction( + &self, + agent: &mut Agent, + controller: &mut Controller, + event_emitter: &mut Emitter<'_, ServerEvent>, + ) -> bool { + if let Some(msg) = agent.inbox.front() { + let used = match msg { + AgentEvent::Talk(..) | AgentEvent::TradeAccepted(_) => { + self.chat_npc_if_allowed_to_speak( + "npc.speech.villager_busy", + agent, + event_emitter, + ); + true + }, + AgentEvent::TradeInvite(_) => { + controller.push_invite_response(InviteResponse::Decline); + if agent.behavior.can_trade() { + self.chat_npc_if_allowed_to_speak( + "npc.speech.merchant_busy", + agent, + event_emitter, + ); + } else { + self.chat_npc_if_allowed_to_speak( + "npc.speech.villager_busy", + agent, + event_emitter, + ); + } + true + }, + AgentEvent::FinishedTrade(result) => { + // copy pasted from recv_interaction + // because the trade is not cancellable in this state + if agent.behavior.is(BehaviorState::TRADING) { + match result { + TradeResult::Completed => { + self.chat_npc( + "npc.speech.merchant_trade_successful", + event_emitter, + ); + }, + _ => { + self.chat_npc("npc.speech.merchant_trade_declined", event_emitter); + }, + } + agent.behavior.unset(BehaviorState::TRADING); + } + true + }, + AgentEvent::UpdatePendingTrade(boxval) => { + // immediately cancel the trade + let (tradeid, _pending, _prices, _inventories) = &**boxval; + agent.behavior.unset(BehaviorState::TRADING); + event_emitter.emit(ServerEvent::ProcessTradeAction( + *self.entity, + *tradeid, + TradeAction::Decline, + )); + self.chat_npc("npc.speech.merchant_trade_cancelled_hostile", event_emitter); + true + }, + AgentEvent::ServerSound(_) | AgentEvent::Hurt => false, + }; + if used { + agent.inbox.pop_front(); + } + return used; + } + false + } + fn recv_interaction( &self, agent: &mut Agent, @@ -1000,8 +1073,8 @@ impl<'a> AgentData<'a> { // } agent.action_state.timer += read_data.dt.0; - let msg = agent.inbox.pop_front(); - match msg { + let msg = agent.inbox.front(); + let used = match msg { Some(AgentEvent::Talk(by, subject)) => { if agent.allowed_to_speak() { if let Some(target) = get_entity_by_id(by.id(), read_data) { @@ -1083,7 +1156,7 @@ impl<'a> AgentData<'a> { self.chat_npc(msg, event_emitter); } else if agent.behavior.can_trade() { if !agent.behavior.is(BehaviorState::TRADING) { - controller.push_initiate_invite(by, InviteKind::Trade); + controller.push_initiate_invite(*by, InviteKind::Trade); self.chat_npc( "npc.speech.merchant_advertisement", event_emitter, @@ -1169,7 +1242,7 @@ impl<'a> AgentData<'a> { Subject::Trade => { if agent.behavior.can_trade() { if !agent.behavior.is(BehaviorState::TRADING) { - controller.push_initiate_invite(by, InviteKind::Trade); + controller.push_initiate_invite(*by, InviteKind::Trade); self.chat_npc( "npc.speech.merchant_advertisement", event_emitter, @@ -1292,6 +1365,7 @@ impl<'a> AgentData<'a> { } } } + true }, Some(AgentEvent::TradeInvite(with)) => { if agent.behavior.can_trade() { @@ -1323,6 +1397,7 @@ impl<'a> AgentData<'a> { event_emitter, ); } + true }, Some(AgentEvent::TradeAccepted(with)) => { if !agent.behavior.is(BehaviorState::TRADING) { @@ -1332,6 +1407,7 @@ impl<'a> AgentData<'a> { agent.behavior.set(BehaviorState::TRADING); agent.behavior.set(BehaviorState::TRADING_ISSUER); } + true }, Some(AgentEvent::FinishedTrade(result)) => { if agent.behavior.is(BehaviorState::TRADING) { @@ -1345,18 +1421,18 @@ impl<'a> AgentData<'a> { } agent.behavior.unset(BehaviorState::TRADING); } + true }, Some(AgentEvent::UpdatePendingTrade(boxval)) => { - let (tradeid, pending, prices, inventories) = *boxval; + let (tradeid, pending, prices, inventories) = &**boxval; if agent.behavior.is(BehaviorState::TRADING) { let who: usize = if agent.behavior.is(BehaviorState::TRADING_ISSUER) { 0 } else { 1 }; - let balance0: f32 = - prices.balance(&pending.offers, &inventories, 1 - who, true); - let balance1: f32 = prices.balance(&pending.offers, &inventories, who, false); + let balance0: f32 = prices.balance(&pending.offers, inventories, 1 - who, true); + let balance1: f32 = prices.balance(&pending.offers, inventories, who, false); if balance0 >= balance1 { // If the trade is favourable to us, only send an accept message if we're // not already accepting (since otherwise, spam-clicking the accept button @@ -1366,7 +1442,7 @@ impl<'a> AgentData<'a> { if !pending.accept_flags[who] && !pending.is_empty_trade() { event_emitter.emit(ServerEvent::ProcessTradeAction( *self.entity, - tradeid, + *tradeid, TradeAction::Accept(pending.phase), )); tracing::trace!(?tradeid, ?balance0, ?balance1, "Accept Pending Trade"); @@ -1399,18 +1475,22 @@ impl<'a> AgentData<'a> { agent.behavior.unset(BehaviorState::TRADING); event_emitter.emit(ServerEvent::ProcessTradeAction( *self.entity, - tradeid, + *tradeid, TradeAction::Decline, )); } } } + true }, - Some(AgentEvent::ServerSound(_)) => {}, - Some(AgentEvent::Hurt) => {}, - None => return false, + Some(AgentEvent::ServerSound(_)) => false, + Some(AgentEvent::Hurt) => false, + None => false, + }; + if used { + agent.inbox.pop_front(); } - true + used } fn look_toward( From 48eeabcc937b84b1eb6d7879a6062a5e62feaa03 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 29 Jul 2022 00:14:51 +0300 Subject: [PATCH 009/854] Fix broken i18n files --- assets/voxygen/i18n/de_DE/hud/skills.ron | 3 +-- assets/voxygen/i18n/fr_FR/hud/skills.ron | 1 - assets/voxygen/i18n/hu_HU/hud/skills.ron | 1 - assets/voxygen/i18n/ja_JP/hud/skills.ron | 1 - assets/voxygen/i18n/th_TH/hud/chat.ron | 2 +- assets/voxygen/i18n/uk_UA/hud/skills.ron | 3 +-- assets/voxygen/i18n/zh_CN/hud/skills.ron | 1 - 7 files changed, 3 insertions(+), 9 deletions(-) diff --git a/assets/voxygen/i18n/de_DE/hud/skills.ron b/assets/voxygen/i18n/de_DE/hud/skills.ron index 2db5f077f8..6af14f6223 100644 --- a/assets/voxygen/i18n/de_DE/hud/skills.ron +++ b/assets/voxygen/i18n/de_DE/hud/skills.ron @@ -171,7 +171,6 @@ "hud.skill.hmr_single_strike_damage" : "Erhöht den Schaden mit jedem Treffer{SP}", "hud.skill.hmr_single_strike_knockback_title" : "Rückstoß: Einfacher Schlag", "hud.skill.hmr_single_strike_knockback" : "Erhöht die Rückstoßkraft um {boost}%{SP}", - "hud.skill." : "", // Sword "hud.skill.sw_trip_str_title": "Dreifachschlag", "hud.skill.sw_trip_str": "Eine Dreifach-Kombi Attacke", @@ -217,7 +216,7 @@ "hud.skill.axe_double_strike_damage_title": "Schaden: Doppelschlag", "hud.skill.axe_double_strike_damage": "Erhöht den Schaden, den jeder aufeinanderfolgende Treffer verursacht{SP}", "hud.skill.axe_double_strike_speed_title": "Double Strike Speed", - "hud.skill.axe_double_strike_speed": "Erhöht die Angriffsgeschw. mit jedem aufeinanderfolgenden Treffer{{SP}", + "hud.skill.axe_double_strike_speed": "Erhöht die Angriffsgeschw. mit jedem aufeinanderfolgenden Treffer{SP}", "hud.skill.axe_double_strike_regen_title": "Double Strike Regen", "hud.skill.axe_double_strike_regen": "Erhöht Ausdauerregeneration mit jedem aufeinanderfolgenden Treffer{SP}", "hud.skill.axe_spin_title": "Axtrundschlag", diff --git a/assets/voxygen/i18n/fr_FR/hud/skills.ron b/assets/voxygen/i18n/fr_FR/hud/skills.ron index 2c821995cf..4786968e53 100644 --- a/assets/voxygen/i18n/fr_FR/hud/skills.ron +++ b/assets/voxygen/i18n/fr_FR/hud/skills.ron @@ -169,7 +169,6 @@ "hud.skill.hmr_single_strike_damage" : "Augmente les dégâts à chaque frappe successive{SP}", "hud.skill.hmr_single_strike_knockback_title" : "Projection de la Frappe Simple", "hud.skill.hmr_single_strike_knockback" : "Augmente de {boost}% la force de projection{SP}", - "hud.skill." : "", // Sword "hud.skill.sw_trip_str_title": "Triple-Frappe", "hud.skill.sw_trip_str": "Frappez, jusqu'à trois fois", diff --git a/assets/voxygen/i18n/hu_HU/hud/skills.ron b/assets/voxygen/i18n/hu_HU/hud/skills.ron index 4cee0264a8..e7bc7f5007 100644 --- a/assets/voxygen/i18n/hu_HU/hud/skills.ron +++ b/assets/voxygen/i18n/hu_HU/hud/skills.ron @@ -167,7 +167,6 @@ "hud.skill.hmr_single_strike_damage" : "Megnöveli a sebzést minden egyes sikeres csapással{SP}", "hud.skill.hmr_single_strike_knockback_title" : "Egyszeri csapás visszalökése", "hud.skill.hmr_single_strike_knockback" : "Megnöveli a csapások ellökési sebességét {boost}%-kal{SP}", - "hud.skill." : "", // Sword "hud.skill.sw_trip_str_title": "Hármas csapás", "hud.skill.sw_trip_str": "Csapj oda, legfeljebb háromszor", diff --git a/assets/voxygen/i18n/ja_JP/hud/skills.ron b/assets/voxygen/i18n/ja_JP/hud/skills.ron index 1ce14d2843..2e3dc865af 100644 --- a/assets/voxygen/i18n/ja_JP/hud/skills.ron +++ b/assets/voxygen/i18n/ja_JP/hud/skills.ron @@ -169,7 +169,6 @@ "hud.skill.hmr_single_strike_damage" : "Increases the damage with each successive strike{SP}", "hud.skill.hmr_single_strike_knockback_title" : "シングルストライク ノックバック", "hud.skill.hmr_single_strike_knockback" : "スイングして投げる能力を{boost}%増加 {SP}", - "hud.skill." : "", // Sword "hud.skill.sw_trip_str_title": "トリプルストライク", "hud.skill.sw_trip_str": "最大{boost}回までの連続攻撃", diff --git a/assets/voxygen/i18n/th_TH/hud/chat.ron b/assets/voxygen/i18n/th_TH/hud/chat.ron index 10fce985c0..28951f7225 100644 --- a/assets/voxygen/i18n/th_TH/hud/chat.ron +++ b/assets/voxygen/i18n/th_TH/hud/chat.ron @@ -18,7 +18,7 @@ "hud.chat.offline_msg": "[{name}] ออกจากเกม", "hud.chat.default_death_msg": "[{name}] เสียชีวิต", - "hud.chat.environmental_kill_msg": "name}] เสียชีวิตในสภาพแวดล้อม {environment}", + "hud.chat.environmental_kill_msg": "[{name}] เสียชีวิตในสภาพแวดล้อม {environment}", "hud.chat.fall_kill_msg": "[{name}] เสียชีวิต เพราะตกพื้นแรงไปหน่อย", "hud.chat.suicide_msg": "[{name}] เสียชีวิต เพราะทำร้ายตัวเอง (???)", diff --git a/assets/voxygen/i18n/uk_UA/hud/skills.ron b/assets/voxygen/i18n/uk_UA/hud/skills.ron index 3c64c7c95a..8eb6ac97a2 100644 --- a/assets/voxygen/i18n/uk_UA/hud/skills.ron +++ b/assets/voxygen/i18n/uk_UA/hud/skills.ron @@ -26,7 +26,7 @@ "hud.skill.unlck_sceptre_title": "Цілющий скіпетр", "hud.skill.unlck_sceptre": "Відкриває дерево навичок володіння цілющим скіпетром{SP}", "hud.skill.dodge_title": "Ухил", - "hud.skill.dodge": "Станьте невразливим до ближніх атак під час перекиду{SP}", + "hud.skill.dodge": "Станьте невразливим до ближніх атак під час перекиду", "hud.skill.roll_energy_title": "Енергоспоживання перекиду", "hud.skill.roll_energy": "Перекид споживає на {boost}% менше енергії{SP}", "hud.skill.roll_speed_title": "Швидкість перекиду", @@ -205,7 +205,6 @@ "hud.skill.hmr_single_strike_damage" : "Збільшує приріст ушкодження від ударів підряд{SP}", "hud.skill.hmr_single_strike_knockback_title" : "Відкидання", "hud.skill.hmr_single_strike_knockback" : "Збільшує відстань відкидання ворогів на {boost}%{SP}", - "hud.skill." : "", // Sword "hud.skill.sw_trip_str": "Бог любить трійцю", "hud.skill.sw_trip_str_title": "Потрійний Удар", diff --git a/assets/voxygen/i18n/zh_CN/hud/skills.ron b/assets/voxygen/i18n/zh_CN/hud/skills.ron index 7a3e1840bd..4a0c868bed 100644 --- a/assets/voxygen/i18n/zh_CN/hud/skills.ron +++ b/assets/voxygen/i18n/zh_CN/hud/skills.ron @@ -170,7 +170,6 @@ "hud.skill.hmr_single_strike_damage" : "随着连击数增加,每次击中敌人造成的伤害提升{SP}", "hud.skill.hmr_single_strike_knockback_title" : "冲击强化", "hud.skill.hmr_single_strike_knockback" : "锤击击退的效果提高{boost}%{SP}", - "hud.skill." : "", // Sword "hud.skill.sw_trip_str_title": "三连击", "hud.skill.sw_trip_str": "三连击,劈,砍,刺", From 8ba50e62d5508da85f458ee69cef15e49d6ca0cf Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Wed, 27 Jul 2022 21:32:17 +0300 Subject: [PATCH 010/854] New i18n implementation based on Fluent --- Cargo.lock | 154 +++++++--- common/assets/src/lib.rs | 2 + common/assets/src/walk.rs | 39 +++ common/src/bin/asset_migrate.rs | 38 +-- voxygen/i18n/Cargo.toml | 38 +-- voxygen/i18n/README.md | 6 - voxygen/i18n/src/analysis.rs | 247 --------------- voxygen/i18n/src/bin/i18n-check.rs | 48 --- voxygen/i18n/src/bin/migrate.rs | 232 ++++++++++++++ voxygen/i18n/src/gitfragments.rs | 157 ---------- voxygen/i18n/src/lib.rs | 468 +++++++++++++++++++---------- voxygen/i18n/src/path.rs | 141 --------- voxygen/i18n/src/raw.rs | 115 ++----- voxygen/i18n/src/stats.rs | 199 ------------ voxygen/i18n/src/verification.rs | 34 --- 15 files changed, 736 insertions(+), 1182 deletions(-) create mode 100644 common/assets/src/walk.rs delete mode 100644 voxygen/i18n/README.md delete mode 100644 voxygen/i18n/src/analysis.rs delete mode 100644 voxygen/i18n/src/bin/i18n-check.rs create mode 100644 voxygen/i18n/src/bin/migrate.rs delete mode 100644 voxygen/i18n/src/gitfragments.rs delete mode 100644 voxygen/i18n/src/path.rs delete mode 100644 voxygen/i18n/src/stats.rs delete mode 100644 voxygen/i18n/src/verification.rs diff --git a/Cargo.lock b/Cargo.lock index 7a0288bc1f..8fd9ef793a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1902,6 +1902,47 @@ dependencies = [ "num-traits", ] +[[package]] +name = "fluent" +version = "0.16.0" +source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +dependencies = [ + "fluent-bundle", + "unic-langid", +] + +[[package]] +name = "fluent-bundle" +version = "0.15.2" +source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.0" +source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +dependencies = [ + "thiserror", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2315,19 +2356,6 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" -[[package]] -name = "git2" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3826a6e0e2215d7a41c2bfc7c9244123969273f3476b939a226aac0ab56e9e3c" -dependencies = [ - "bitflags", - "libc", - "libgit2-sys", - "log", - "url", -] - [[package]] name = "glam" version = "0.10.2" @@ -2812,6 +2840,25 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "intl-memoizer" +version = "0.5.1" +source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b18f988384267d7066cc2be425e6faf352900652c046b6971d2e228d3b1c5ecf" +dependencies = [ + "tinystr", + "unic-langid", +] + [[package]] name = "io-kit-sys" version = "0.1.0" @@ -3006,18 +3053,6 @@ version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" -[[package]] -name = "libgit2-sys" -version = "0.13.2+1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a42de9a51a5c12e00fc0e4ca6bc2ea43582fc6418488e8f615e905d886f258b" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - [[package]] name = "libloading" version = "0.6.7" @@ -3080,18 +3115,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libz-sys" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f35facd4a5673cb5a48822be2be1d4236c1c99cb4113cab7061ac720d5bf859" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "linked-hash-map" version = "0.5.4" @@ -5262,6 +5285,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af" + [[package]] name = "semver" version = "0.9.0" @@ -5292,6 +5321,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-tuple-vec-map" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a04d0ebe0de77d7d445bb729a895dcb0a288854b267ca85f030ce51cdc578c82" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.5" @@ -5977,6 +6015,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29738eedb4388d9ea620eeab9384884fc3f06f586a2eddb56bedc5885126c7c1" + [[package]] name = "tinytemplate" version = "1.2.1" @@ -6255,6 +6299,15 @@ dependencies = [ "nom 5.1.2", ] +[[package]] +name = "type-map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +dependencies = [ + "rustc-hash", +] + [[package]] name = "typenum" version = "1.15.0" @@ -6270,6 +6323,24 @@ dependencies = [ "version_check 0.9.4", ] +[[package]] +name = "unic-langid" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73328fcd730a030bdb19ddf23e192187a6b01cd98be6d3140622a89129459ce5" +dependencies = [ + "unic-langid-impl", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a4a8eeaf0494862c1404c95ec2f4c33a2acff5076f64314b465e3ddae1b934d" +dependencies = [ + "tinystr", +] + [[package]] name = "unicode-bidi" version = "0.3.7" @@ -6856,15 +6927,18 @@ dependencies = [ [[package]] name = "veloren-voxygen-i18n" -version = "0.10.0" +version = "0.13.0" dependencies = [ - "clap 3.1.10", "deunicode", - "git2", + "fluent", + "fluent-bundle", "hashbrown 0.12.0", + "intl-memoizer", "ron 0.7.0", "serde", + "serde-tuple-vec-map", "tracing", + "unic-langid", "veloren-common-assets", ] diff --git a/common/assets/src/lib.rs b/common/assets/src/lib.rs index 3c24f23e44..e1bf8b1c29 100644 --- a/common/assets/src/lib.rs +++ b/common/assets/src/lib.rs @@ -16,6 +16,8 @@ pub use assets_manager::{ }; mod fs; +mod walk; +pub use walk::*; lazy_static! { /// The HashMap where all loaded assets are stored in. diff --git a/common/assets/src/walk.rs b/common/assets/src/walk.rs new file mode 100644 index 0000000000..976e325f85 --- /dev/null +++ b/common/assets/src/walk.rs @@ -0,0 +1,39 @@ +use std::{ + io, + path::{Path, PathBuf}, +}; + +/// Read `walk_tree` +#[derive(Debug)] +pub enum Walk { + File(PathBuf), + Dir { path: PathBuf, content: Vec }, +} + +/// Utility function to build a tree of directory, recursively +/// +/// At first iteration, use path to your directory as dir and root +pub fn walk_tree(dir: &Path, root: &Path) -> io::Result> { + let mut buff = Vec::new(); + for entry in std::fs::read_dir(dir)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + buff.push(Walk::Dir { + path: path + .strip_prefix(root) + .expect("strip can't fail, this path is created from root") + .to_owned(), + content: walk_tree(&path, root)?, + }); + } else { + let filename = path + .strip_prefix(root) + .expect("strip can't fail, this file is created from root") + .to_owned(); + buff.push(Walk::File(filename)); + } + } + + Ok(buff) +} diff --git a/common/src/bin/asset_migrate.rs b/common/src/bin/asset_migrate.rs index a881f431c0..e05e4069ff 100644 --- a/common/src/bin/asset_migrate.rs +++ b/common/src/bin/asset_migrate.rs @@ -1,9 +1,6 @@ +use common_assets::{walk_tree, Walk}; use serde::{de::DeserializeOwned, Serialize}; -use std::{ - fs, io, - io::Write, - path::{Path, PathBuf}, -}; +use std::{fs, io, io::Write, path::Path}; // If you want to migrate assets. // 1) Copy-paste old asset type to own module @@ -19,37 +16,6 @@ mod new { pub type Config = (); } -#[derive(Debug)] -enum Walk { - File(PathBuf), - Dir { path: PathBuf, content: Vec }, -} - -fn walk_tree(dir: &Path, root: &Path) -> io::Result> { - let mut buff = Vec::new(); - for entry in fs::read_dir(dir)? { - let entry = entry?; - let path = entry.path(); - if path.is_dir() { - buff.push(Walk::Dir { - path: path - .strip_prefix(root) - .expect("strip can't fail, this path is created from root") - .to_owned(), - content: walk_tree(&path, root)?, - }); - } else { - let filename = path - .strip_prefix(root) - .expect("strip can't fail, this file is created from root") - .to_owned(); - buff.push(Walk::File(filename)); - } - } - - Ok(buff) -} - fn walk_with_migrate(tree: Walk, from: &Path, to: &Path) -> io::Result<()> where NewV: From, diff --git a/voxygen/i18n/Cargo.toml b/voxygen/i18n/Cargo.toml index 6734954e28..187b906e65 100644 --- a/voxygen/i18n/Cargo.toml +++ b/voxygen/i18n/Cargo.toml @@ -1,30 +1,32 @@ [package] -authors = ["juliancoffee ", "Rémy Phelipot"] +authors = ["juliancoffee "] edition = "2021" name = "veloren-voxygen-i18n" description = "Crate for internalization and diagnostic of existing localizations." -version = "0.10.0" - -[[bin]] -name = "i18n-check" -required-features = ["bin"] +version = "0.13.0" [dependencies] # Assets -hashbrown = { version = "0.12", features = ["serde", "nightly"] } common-assets = {package = "veloren-common-assets", path = "../../common/assets"} -deunicode = "1.0" -serde = { version = "1.0", features = ["derive"] } -tracing = "0.1" -# Diagnostic ron = "0.7" -git2 = { version = "0.14", default-features = false, optional = true } +serde = { version = "1.0", features = ["derive"] } +# Localization +unic-langid = { version = "0.9"} +intl-memoizer = { git = "https://github.com/juliancoffee/fluent-rs.git"} +fluent = { git = "https://github.com/juliancoffee/fluent-rs.git"} +fluent-bundle = { git = "https://github.com/juliancoffee/fluent-rs.git"} +# Utility +hashbrown = { version = "0.12", features = ["serde", "nightly"] } +deunicode = "1.0" +tracing = "0.1" +# Bin +serde-tuple-vec-map = "1.0" -# Binary -clap = { version = "3.1.8", features = ["suggestions", "std"], default-features = false, optional = true } - -[dev-dependencies] -git2 = { version = "0.14", default-features = false } +# FIXME: remove before merge +[[bin]] +name = "i18n-migrate" +required-features = ["i18n-migrate"] +path = "src/bin/migrate.rs" [features] -bin = ["git2", "clap"] +i18n-migrate = [] diff --git a/voxygen/i18n/README.md b/voxygen/i18n/README.md deleted file mode 100644 index 4353f88c95..0000000000 --- a/voxygen/i18n/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Usage -`$ cargo run --features=bin -- --help`
-(Or if somewhere else in the repo)
-`$ cargo run -p veloren-i18n --features=bin -- --help`
-For example, diagnostic for specific language
-`$ cargo run -p veloren-i18n --features=bin -- `
diff --git a/voxygen/i18n/src/analysis.rs b/voxygen/i18n/src/analysis.rs deleted file mode 100644 index 9356166d74..0000000000 --- a/voxygen/i18n/src/analysis.rs +++ /dev/null @@ -1,247 +0,0 @@ -use crate::{ - gitfragments::{ - read_file_from_path, transform_fragment, LocalizationEntryState, LocalizationState, - }, - path::{BasePath, LangPath}, - raw::{self, RawFragment, RawLanguage}, - stats::{ - print_csv_stats, print_overall_stats, print_translation_stats, LocalizationAnalysis, - LocalizationStats, - }, - REFERENCE_LANG, -}; -use hashbrown::{hash_map::Entry, HashMap}; -use ron::de::from_bytes; - -/// Fill the entry State base information (except `state`) for a complete -/// language -fn gather_entry_state<'a>( - repo: &'a git2::Repository, - head_ref: &git2::Reference, - path: &LangPath, -) -> RawLanguage { - println!("-> {:?}", path.language_identifier()); - // load standard manifest - let manifest = raw::load_manifest(path).expect("failed to load language manifest"); - // transform language into LocalizationEntryState - let mut fragments = HashMap::new(); - - // For each file in directory - let files = path - .fragments() - .expect("failed to get all files in language"); - for sub_path in files { - let fullpath = path.sub_path(&sub_path); - let gitpath = fullpath.strip_prefix(path.base().root_path()).unwrap(); - println!(" -> {:?}", &sub_path); - let i18n_blob = read_file_from_path(repo, head_ref, gitpath); - let fragment: RawFragment = from_bytes(i18n_blob.content()) - .unwrap_or_else(|e| panic!("Could not parse {:?} RON file, error: {}", sub_path, e)); - let frag = transform_fragment(repo, (gitpath, fragment), &i18n_blob); - fragments.insert(sub_path, frag); - } - - RawLanguage:: { - manifest, - fragments, - } -} - -/// fills in the `state` -fn compare_lang_with_reference( - current_i18n: &mut RawLanguage, - i18n_references: &RawLanguage, - repo: &git2::Repository, -) { - // git graph descendant of is slow, so we cache it - let mut graph_descendant_of_cache = HashMap::new(); - - let mut cached_graph_descendant_of = |commit, ancestor| -> bool { - let key = (commit, ancestor); - match graph_descendant_of_cache.entry(key) { - Entry::Occupied(entry) => { - return *entry.get(); - }, - Entry::Vacant(entry) => { - let value = repo.graph_descendant_of(commit, ancestor).unwrap_or(false); - *entry.insert(value) - }, - } - }; - - const MISSING: LocalizationEntryState = LocalizationEntryState { - key_line: None, - chuck_line_range: None, - commit_id: None, - state: Some(LocalizationState::NotFound), - }; - - // match files - for (ref_path, ref_fragment) in i18n_references.fragments.iter() { - let cur_fragment = match current_i18n.fragments.get_mut(ref_path) { - Some(c) => c, - None => { - eprintln!( - "language {} is missing file: {:?}", - current_i18n.manifest.metadata.language_identifier, ref_path - ); - // add all keys as missing - let mut string_map = HashMap::new(); - for (ref_key, _) in ref_fragment.string_map.iter() { - string_map.insert(ref_key.to_owned(), MISSING.clone()); - } - current_i18n - .fragments - .insert(ref_path.to_owned(), RawFragment { - string_map, - vector_map: HashMap::new(), - }); - continue; - }, - }; - - for (ref_key, ref_state) in ref_fragment.string_map.iter() { - match cur_fragment.string_map.get_mut(ref_key) { - Some(state) => { - let commit_id = match state.commit_id { - Some(c) => c, - None => { - eprintln!( - "Commit ID of key {} in i18n file {} is missing! Skipping key.", - ref_key, - ref_path.to_string_lossy() - ); - continue; - }, - }; - let ref_commit_id = match ref_state.commit_id { - Some(c) => c, - None => { - eprintln!( - "Commit ID of key {} in reference i18n file is missing! Skipping \ - key.", - ref_key - ); - continue; - }, - }; - if commit_id != ref_commit_id - && !cached_graph_descendant_of(commit_id, ref_commit_id) - { - state.state = Some(LocalizationState::Outdated); - } else { - state.state = Some(LocalizationState::UpToDate); - } - }, - None => { - cur_fragment - .string_map - .insert(ref_key.to_owned(), MISSING.clone()); - }, - } - } - - for (_, state) in cur_fragment - .string_map - .iter_mut() - .filter(|&(k, _)| ref_fragment.string_map.get(k).is_none()) - { - state.state = Some(LocalizationState::Unused); - } - } -} - -fn gather_results( - current_i18n: &RawLanguage, -) -> (LocalizationAnalysis, LocalizationStats) { - let mut state_map = - LocalizationAnalysis::new(¤t_i18n.manifest.metadata.language_identifier); - let mut stats = LocalizationStats::default(); - - for (file, fragments) in ¤t_i18n.fragments { - for (key, entry) in &fragments.string_map { - match entry.state { - Some(LocalizationState::Outdated) => stats.outdated_entries += 1, - Some(LocalizationState::NotFound) => stats.notfound_entries += 1, - None => stats.errors += 1, - Some(LocalizationState::Unused) => stats.unused_entries += 1, - Some(LocalizationState::UpToDate) => stats.uptodate_entries += 1, - }; - let state_keys = state_map.data.get_mut(&entry.state).expect("prefiled"); - state_keys.push((file.clone(), key.to_owned(), entry.commit_id)); - } - } - - for (_, entries) in state_map.data.iter_mut() { - entries.sort(); - } - - (state_map, stats) -} - -/// Test one language -/// - `code`: name of the directory in assets (de_DE for example) -/// - `path`: path to repo -/// - `be_verbose`: print extra info -/// - `csv_enabled`: generate csv files in target folder -pub fn test_specific_localizations( - path: &BasePath, - language_identifiers: &[&str], - be_verbose: bool, - csv_enabled: bool, -) { - //complete analysis - let mut analysis = HashMap::new(); - // Initialize Git objects - let repo = git2::Repository::discover(path.root_path()) - .unwrap_or_else(|_| panic!("Failed to open the Git repository {:?}", path.root_path())); - let head_ref = repo.head().expect("Impossible to get the HEAD reference"); - - // Read Reference Language - let ref_language = gather_entry_state(&repo, &head_ref, &path.i18n_path(REFERENCE_LANG)); - for &language_identifier in language_identifiers { - let mut cur_language = - gather_entry_state(&repo, &head_ref, &path.i18n_path(language_identifier)); - compare_lang_with_reference(&mut cur_language, &ref_language, &repo); - let (state_map, stats) = gather_results(&cur_language); - analysis.insert(language_identifier.to_owned(), (state_map, stats)); - } - - let output = path.root_path().join("translation_analysis.csv"); - let mut f = std::fs::File::create(output).expect("couldn't write csv file"); - - use std::io::Write; - writeln!( - f, - "country_code,file_name,translation_key,status,git_commit" - ) - .unwrap(); - //printing - for (language_identifier, (state_map, stats)) in &analysis { - if csv_enabled { - print_csv_stats(state_map, &mut f); - } else { - print_translation_stats( - language_identifier, - &ref_language, - stats, - state_map, - be_verbose, - ); - } - } - if analysis.len() > 1 { - print_overall_stats(analysis); - } -} - -/// Test all localizations -pub fn test_all_localizations(path: &BasePath, be_verbose: bool, csv_enabled: bool) { - // Compare to other reference files - let languages = path.i18n_directories(); - let language_identifiers = languages - .iter() - .map(|s| s.language_identifier()) - .collect::>(); - test_specific_localizations(path, &language_identifiers, be_verbose, csv_enabled); -} diff --git a/voxygen/i18n/src/bin/i18n-check.rs b/voxygen/i18n/src/bin/i18n-check.rs deleted file mode 100644 index 4154c94011..0000000000 --- a/voxygen/i18n/src/bin/i18n-check.rs +++ /dev/null @@ -1,48 +0,0 @@ -use clap::{Arg, Command}; -use veloren_voxygen_i18n::{analysis, verification, BasePath}; - -fn main() { - let matches = Command::new("i18n-check") - .version("0.1.0") - .author("juliancoffee ") - .about("Test veloren localizations") - .arg( - Arg::new("CODE") - .required(false) - .help("Run diagnostic for specific language code (de_DE as example)"), - ) - .arg( - Arg::new("verify") - .long("verify") - .help("verify all localizations"), - ) - .arg(Arg::new("test").long("test").help("test all localizations")) - .arg( - Arg::new("verbose") - .short('v') - .long("verbose") - .help("print additional information"), - ) - .arg( - Arg::new("csv") - .long("csv") - .help("generate csv files per language in target folder"), - ) - .get_matches(); - - // Generate paths - let root_path = common_assets::find_root().expect("Failed to find root of repository"); - let path = BasePath::new(&root_path); - let be_verbose = matches.is_present("verbose"); - let csv_enabled = matches.is_present("csv"); - - if let Some(code) = matches.value_of("CODE") { - analysis::test_specific_localizations(&path, &[code], be_verbose, csv_enabled); - } - if matches.is_present("test") { - analysis::test_all_localizations(&path, be_verbose, csv_enabled); - } - if matches.is_present("verify") { - verification::verify_all_localizations(&path); - } -} diff --git a/voxygen/i18n/src/bin/migrate.rs b/voxygen/i18n/src/bin/migrate.rs new file mode 100644 index 0000000000..a68b46a498 --- /dev/null +++ b/voxygen/i18n/src/bin/migrate.rs @@ -0,0 +1,232 @@ +use std::{ffi::OsStr, fs, io::Write, path::Path}; + +use serde::Deserialize; + +use common_assets::{walk_tree, Walk}; + +/// Structure representing file for old .ron format +#[derive(Deserialize)] +struct RawFragment { + #[serde(with = "tuple_vec_map")] + string_map: Vec<(String, String)>, + #[serde(with = "tuple_vec_map")] + vector_map: Vec<(String, Vec)>, +} + +impl RawFragment { + fn read(path: &Path) -> Self { + let source = fs::File::open(path).unwrap(); + ron::de::from_reader(source).unwrap() + } +} + +/// Message value, may contain interpolated variables +struct Pattern { + view: String, +} + +impl Pattern { + fn expand(self) -> String { + let mut buff = String::new(); + if self.view.contains('\n') { + let mut first = true; + for line in self.view.lines() { + if line.is_empty() && first { + // fluent ignores space characters at the beginning + // so we need to encode \n explicitly + buff.push_str(r#"{"\u000A"}"#); + } else { + buff.push_str("\n "); + } + if first { + first = false; + } + buff.push_str(line); + } + } else { + buff.push_str(" "); + buff.push_str(&self.view); + } + + buff + } +} + +/// Fluent entry +struct Message { + value: Option, + attributes: Vec<(String, Pattern)>, +} + +impl Message { + fn stringify(self) -> String { + let mut buff = String::new(); + // append equal sign + buff.push_str(" ="); + // display value if any + if let Some(value) = self.value { + buff.push_str(&value.expand()); + } + // add attributes + for (attr_name, attr) in self.attributes { + // new line and append tab + buff.push_str("\n "); + // print attrname + buff.push('.'); + buff.push_str(&attr_name); + // equal sign + buff.push_str(" ="); + // display attr + buff.push_str(&attr.expand()); + } + + buff + } +} + +/// Structure representing file for new .ftl format +struct Source { + entries: Vec<(String, Message)>, +} + +impl Source { + fn write(self, path: &Path) { + let mut source = fs::File::create(path).unwrap(); + let mut first = true; + for (key, msg) in self.entries { + if !first { + source.write_all(b"\n").unwrap(); + } else { + first = false; + } + source.write_all(key.as_bytes()).unwrap(); + source.write_all(msg.stringify().as_bytes()).unwrap(); + } + } +} + +// Convert old i18n string to new fluent format +fn to_pattern(old: String) -> Pattern { + let mut buff = String::new(); + + let mut in_capture = false; + let mut need_sign = false; + + for ch in old.chars() { + if ch == '{' { + if !in_capture { + in_capture = true; + } else { + panic!("double {{"); + } + need_sign = true; + + buff.push(ch); + buff.push(' '); + } else if ch == '}' { + if in_capture { + in_capture = false; + } else { + panic!("}} without opening {{"); + } + + buff.push(' '); + buff.push(ch); + } else { + if need_sign { + buff.push('$'); + need_sign = false; + } + if ch == '.' && in_capture { + buff.push('-') + } else { + buff.push(ch) + } + } + } + + Pattern { view: buff } +} + +fn to_attributes(old: Vec) -> Message { + let mut attributes = Vec::new(); + for (i, string) in old.iter().enumerate() { + let attr_name = format!("a{i}"); + let attr = to_pattern(string.to_owned()); + attributes.push((attr_name, attr)) + } + + Message { + value: None, + attributes, + } +} + +fn convert(old: RawFragment) -> Source { + let mut entries = Vec::new(); + let mut cache = Vec::new(); + for (key, string) in old.string_map.into_iter() { + if cache.contains(&key) { + continue; + } else { + cache.push(key.clone()); + } + // common.weapon.tool -> common-weapon-tool + let key = key.replace('.', "-").to_owned(); + let msg = Message { + value: Some(to_pattern(string.to_owned())), + attributes: Vec::new(), + }; + entries.push((key, msg)) + } + + for (key, variation) in old.vector_map.into_iter() { + if cache.contains(&key) { + continue; + } else { + cache.push(key.clone()); + } + // common.weapon.tool -> common-weapon-tool + let key = key.replace('.', "-").to_owned(); + let msg = to_attributes(variation); + entries.push((key, msg)) + } + + Source { entries } +} + +fn migrate(tree: Walk, from: &Path, to: &Path) { + match tree { + Walk::Dir { path, content } => { + println!("{:?}", path); + let target_dir = to.join(path); + fs::create_dir(target_dir).unwrap(); + for entry in content { + migrate(entry, from, to); + } + }, + Walk::File(path) => { + if path.file_name() == Some(OsStr::new("_manifest.ron")) + || path.file_name() == Some(OsStr::new("README.md")) + { + fs::copy(from.join(&path), to.join(path)).unwrap(); + } else { + let old = RawFragment::read(&from.join(&path)); + let new = convert(old); + new.write(&to.join(path).with_extension("ftl")); + } + }, + } +} + +fn main() { + // it assumes that you have old i18n files in i18n-ron directory + let old_path = Path::new("assets/voxygen/i18n-ron"); + let new_path = Path::new("assets/voxygen/i18n"); + let tree = walk_tree(&old_path, &old_path).unwrap(); + let tree = Walk::Dir { + path: Path::new("").to_owned(), + content: tree, + }; + migrate(tree, &old_path, &new_path); +} diff --git a/voxygen/i18n/src/gitfragments.rs b/voxygen/i18n/src/gitfragments.rs deleted file mode 100644 index 6ca48dce81..0000000000 --- a/voxygen/i18n/src/gitfragments.rs +++ /dev/null @@ -1,157 +0,0 @@ -//! fragment attached with git versioning information -use crate::raw::RawFragment; -use hashbrown::HashMap; -use std::path::Path; - -#[derive(Copy, Clone, Eq, Hash, Debug, PartialEq)] -pub(crate) enum LocalizationState { - UpToDate, - NotFound, - Outdated, - Unused, -} - -pub(crate) const ALL_LOCALIZATION_STATES: [Option; 5] = [ - Some(LocalizationState::UpToDate), - Some(LocalizationState::NotFound), - Some(LocalizationState::Outdated), - Some(LocalizationState::Unused), - None, -]; - -#[derive(Clone, Debug)] -pub(crate) struct LocalizationEntryState { - pub(crate) key_line: Option, - pub(crate) chuck_line_range: Option<(usize, usize)>, - pub(crate) commit_id: Option, - pub(crate) state: Option, -} - -impl LocalizationState { - pub(crate) fn print(this: &Option) -> String { - match this { - Some(LocalizationState::UpToDate) => "UpToDate", - Some(LocalizationState::NotFound) => "NotFound", - Some(LocalizationState::Outdated) => "Outdated", - Some(LocalizationState::Unused) => "Unused", - None => "Unknown", - } - .to_owned() - } -} - -impl LocalizationEntryState { - fn new(key_line: Option) -> LocalizationEntryState { - LocalizationEntryState { - key_line, - chuck_line_range: None, - commit_id: None, - state: None, - } - } -} - -/// Returns the Git blob associated with the given reference and path -pub(crate) fn read_file_from_path<'a>( - repo: &'a git2::Repository, - reference: &git2::Reference, - path: &Path, -) -> git2::Blob<'a> { - let tree = reference - .peel_to_tree() - .expect("Impossible to peel HEAD to a tree object"); - tree.get_path(path) - .unwrap_or_else(|_| { - panic!( - "Impossible to find the file {:?} in reference {:?}", - path, - reference.name() - ) - }) - .to_object(repo) - .unwrap() - .peel_to_blob() - .expect("Impossible to fetch the Git object") -} - -/// Extend a Fragment with historical git data -/// The actual translation gets dropped -/// TODO: transform vector_map too -pub(crate) fn transform_fragment<'a>( - repo: &'a git2::Repository, - fragment: (&Path, RawFragment), - file_blob: &git2::Blob, -) -> RawFragment { - let (path, fragment) = fragment; - // Find key start lines by searching all lines which have `:` in them (as they - // are probably keys) and getting the first part of such line trimming - // whitespace and quotes. Quite buggy heuristic - let file_content = std::str::from_utf8(file_blob.content()).expect("Got non UTF-8 file"); - // we only need the key part of the file to process - let file_content_keys = file_content.lines().enumerate().filter_map(|(no, line)| { - line.split_once(':').map(|(key, _)| { - let mut key = key.trim().chars(); - key.next(); - key.next_back(); - (no, key.as_str()) - }) - }); - //speed up the search by sorting all keys! - let mut file_content_keys_sorted = file_content_keys.into_iter().collect::>(); - file_content_keys_sorted.sort_by_key(|(_, key)| *key); - - let mut result = RawFragment:: { - string_map: HashMap::new(), - vector_map: HashMap::new(), - }; - - for (original_key, _) in fragment.string_map { - let line_nb = file_content_keys_sorted - .binary_search_by_key(&original_key.as_str(), |(_, key)| *key) - .map_or_else( - |_| { - eprintln!( - "Key {} does not have a git line in it's state!", - original_key - ); - None - }, - |id| Some(file_content_keys_sorted[id].0), - ); - - result - .string_map - .insert(original_key, LocalizationEntryState::new(line_nb)); - } - - // Find commit for each keys, THIS PART IS SLOW (2s/4s) - for e in repo - .blame_file(path, None) - .expect("Impossible to generate the Git blame") - .iter() - { - for (_, state) in result.string_map.iter_mut() { - if let Some(line) = state.key_line { - let range = ( - e.final_start_line(), - e.final_start_line() + e.lines_in_hunk(), - ); - if line + 1 >= range.0 && line + 1 < range.1 { - state.chuck_line_range = Some(range); - state.commit_id = state.commit_id.map_or_else( - || Some(e.final_commit_id()), - |existing_commit| match repo - .graph_descendant_of(e.final_commit_id(), existing_commit) - { - Ok(true) => Some(e.final_commit_id()), - Ok(false) => Some(existing_commit), - Err(err) => panic!("{}", err), - }, - ); - } - } - } - } - - result -} diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index acf72606ed..2714103ffd 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -1,22 +1,21 @@ -#[cfg(any(feature = "bin", test))] -pub mod analysis; -#[cfg(any(feature = "bin", test))] -mod gitfragments; -mod path; mod raw; -#[cfg(any(feature = "bin", test))] pub mod stats; -pub mod verification; -//reexport -pub use path::BasePath; +use fluent_bundle::{bundle::FluentBundle, FluentResource}; +use intl_memoizer::concurrent::IntlLangMemoizer; +use unic_langid::LanguageIdentifier; -use crate::path::{LANG_EXTENSION, LANG_MANIFEST_FILE}; -use common_assets::{self, source::DirEntry, AssetExt, AssetGuard, AssetHandle, ReloadWatcher}; -use hashbrown::{HashMap, HashSet}; -use raw::{RawFragment, RawLanguage, RawManifest}; +use hashbrown::HashMap; use serde::{Deserialize, Serialize}; -use std::{io, path::PathBuf}; +use std::{borrow::Cow, io}; + +use assets::{source::DirEntry, AssetExt, AssetGuard, AssetHandle, ReloadWatcher}; use tracing::warn; +// Re-export because I don't like prefix +use common_assets as assets; + +// Re-export for argument creation +pub use fluent::fluent_args; +pub use fluent_bundle::FluentArgs; /// The reference language, aka the more up-to-date localization data. /// Also the default language at first startup. @@ -49,6 +48,7 @@ pub struct Font { impl Font { /// Scale input size to final UI size + #[must_use] pub fn scale(&self, value: u32) -> u32 { (value as f32 * self.scale_ratio).round() as u32 } } @@ -56,21 +56,14 @@ impl Font { pub type Fonts = HashMap; /// Store internationalization data -#[derive(Debug, PartialEq, Serialize, Deserialize)] struct Language { - /// A map storing the localized texts - /// - /// Localized content can be accessed using a String key. - pub(crate) string_map: HashMap, - - /// A map for storing variations of localized texts, for example multiple - /// ways of saying "Help, I'm under attack". Used primarily for npc - /// dialogue. - pub(crate) vector_map: HashMap>, - + /// The bundle storing all localized texts + pub(crate) bundle: FluentBundle, /// Whether to convert the input text encoded in UTF-8 /// into a ASCII version by using the `deunicode` crate. - pub(crate) convert_utf8_to_ascii: bool, + // FIXME (i18n convert_utf8_to_ascii): + #[allow(dead_code)] + convert_utf8_to_ascii: bool, /// Font configuration is stored here pub(crate) fonts: Fonts, @@ -79,68 +72,172 @@ struct Language { } impl Language { - /// Get a localized text from the given key - pub fn get(&self, key: &str) -> Option<&str> { self.string_map.get(key).map(String::as_str) } + fn try_msg<'a>(&'a self, key: &str, args: Option<&'a FluentArgs>) -> Option> { + let bundle = &self.bundle; + let msg = bundle.get_message(key)?; + let mut errs = Vec::new(); + let msg = bundle.format_pattern(msg.value()?, args, &mut errs); + for err in errs { + eprintln!("err: {err} for {key}"); + } - /// Get a variation of localized text from the given key - /// - /// `index` should be a random number from `0` to `u16::max()` - pub fn get_variation(&self, key: &str, index: u16) -> Option<&str> { - self.vector_map.get(key).and_then(|v| { - if v.is_empty() { - None - } else { - Some(v[index as usize % v.len()].as_str()) - } - }) + Some(msg) + } + + fn try_collect_attrs<'a>( + &'a self, + key: &str, + args: Option<&'a FluentArgs>, + ) -> Option>> { + let bundle = &self.bundle; + let msg = bundle.get_message(key)?; + + let mut errs = Vec::new(); + let mut attrs = Vec::new(); + + for attr in msg.attributes() { + let msg = bundle.format_pattern(attr.value(), args, &mut errs); + attrs.push(msg); + } + for err in errs { + eprintln!("err: {err} for {key}"); + } + + Some(attrs) + } + + fn try_variation<'a>( + &'a self, + key: &str, + seed: u16, + args: Option<&'a FluentArgs>, + ) -> Option> { + let mut attrs = self.try_collect_attrs(key, args)?; + + if attrs.is_empty() { + None + } else { + let variation = attrs.swap_remove(usize::from(seed) % attrs.len()); + Some(variation) + } } } -impl common_assets::Compound for Language { - fn load( - cache: common_assets::AnyCache, - asset_key: &str, - ) -> Result { +impl assets::Compound for Language { + fn load(cache: assets::AnyCache, path: &str) -> Result { let manifest = cache - .load::(&[asset_key, ".", LANG_MANIFEST_FILE].concat())? + .load::(&[path, ".", "_manifest"].concat())? .cloned(); + let raw::Manifest { + convert_utf8_to_ascii, + fonts, + metadata, + } = manifest; - // Walk through files in the folder, collecting localization fragment to merge - // inside the asked_localization - let mut fragments = HashMap::new(); - for id in cache - .load_dir::>(asset_key, true)? - .ids() - { - // Don't try to load manifests - if let Some(id) = id.strip_suffix(LANG_MANIFEST_FILE) { - if id.ends_with('.') { - continue; - } + let lang_id: LanguageIdentifier = metadata.language_identifier.parse()?; + let mut bundle = FluentBundle::new_concurrent(vec![lang_id]); + + // Here go dragons + for id in cache.load_dir::(path, true)?.ids() { + if id.ends_with("_manifest") { + continue; } match cache.load(id) { Ok(handle) => { - let fragment: &RawFragment = &*handle.read(); + use std::{error::Error, fmt, ops::Range}; - fragments.insert(PathBuf::from(id), fragment.clone()); + #[derive(Debug)] + struct Pos { + #[allow(dead_code)] // false-positive + line: usize, + #[allow(dead_code)] // false-positive + character: usize, + } + + fn unspan(src: &str, span: Range) -> Range { + let count = |idx| { + let mut line = 1; + let mut character = 1; + for ch in src.bytes().take(idx) { + // Count characters + character += 1; + + // Count newlines + if ch == b'\n' { + line += 1; + // If found new line, reset character count + character = 1; + } + } + Pos { line, character } + }; + let Range { start, end } = span; + count(start)..count(end) + } + + // TODO: + // better error handling? + #[derive(Debug)] + enum ResourceErr { + ParsingError { + #[allow(dead_code)] // false-positive + file: String, + #[allow(dead_code)] // false-positive + err: String, + }, + BundleError(String), + } + + impl fmt::Display for ResourceErr { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{self:?}") + } + } + + impl Error for ResourceErr {} + + let source: &raw::Resource = &*handle.read(); + let resource = + FluentResource::try_new(source.src.clone()).map_err(|(_ast, errs)| { + let file = id.to_owned(); + let errs = errs + .into_iter() + .map(|e| { + let pos = unspan(&source.src, e.pos); + format!("{pos:?}, kind {:?}", e.kind) + }) + .collect::>(); + + ResourceErr::ParsingError { + file, + err: format!("{errs:?}"), + } + })?; + + bundle + .add_resource(resource) + .map_err(|e| ResourceErr::BundleError(format!("{e:?}")))?; }, - Err(e) => { - warn!("Unable to load asset {}, error={:?}", id, e); + Err(err) => { + // TODO: shouldn't we just panic here? + warn!("Unable to load asset {id}, error={err:?}"); }, } } - Ok(Language::from(RawLanguage { - manifest, - fragments, - })) + Ok(Self { + bundle, + convert_utf8_to_ascii, + fonts, + metadata, + }) } } -/// the central data structure to handle localization in veloren -// inherit Copy+Clone from AssetHandle -#[derive(Debug, Copy, Clone)] +/// The central data structure to handle localization in Veloren +// inherit Copy + Clone from AssetHandle (what?) +#[derive(Copy, Clone)] pub struct LocalizationHandle { active: AssetHandle, watcher: ReloadWatcher, @@ -148,24 +245,46 @@ pub struct LocalizationHandle { pub use_english_fallback: bool, } -// RAII guard returned from Localization::read(), resembles AssetGuard +/// Read `LocalizationGuard` +// arbitrary choice to minimize changing all of veloren +pub type Localization = LocalizationGuard; + +/// RAII guard returned from `Localization::read`(), resembles `AssetGuard` pub struct LocalizationGuard { active: AssetGuard, fallback: Option>, } -// arbitrary choice to minimize changing all of veloren -pub type Localization = LocalizationGuard; - impl LocalizationGuard { + /// DEPRECATED + /// /// Get a localized text from the given key /// /// First lookup is done in the active language, second in /// the fallback (if present). - pub fn get_opt(&self, key: &str) -> Option<&str> { + /// If the key is not present in the localization object + /// then the key itself is returned. + /// + /// NOTE: this function shouldn't be used in new code. + /// It is kept for compatibility with old code that uses + /// old style dot-separated keys and this function internally + /// replaces them with dashes. + // FIXME (i18n old style keys): + // this is deprecated, fix all usages of this asap + pub fn get(&self, key: &str) -> Cow { + // Fluent uses `-` as informal separator, while in the past with our + // RON based system we used `.` for that purpose. + self.get_msg(&key.replace('.', "-")) + } + + /// Get a localized text from the given key + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + pub fn try_msg(&self, key: &str) -> Option> { self.active - .get(key) - .or_else(|| self.fallback.as_ref().and_then(|f| f.get(key))) + .try_msg(key, None) + .or_else(|| self.fallback.as_ref().and_then(|fb| fb.try_msg(key, None))) } /// Get a localized text from the given key @@ -173,76 +292,95 @@ impl LocalizationGuard { /// First lookup is done in the active language, second in /// the fallback (if present). /// If the key is not present in the localization object - /// then the key is returned. - pub fn get<'a>(&'a self, key: &'a str) -> &str { self.get_opt(key).unwrap_or(key) } + /// then the key itself is returned. + pub fn get_msg(&self, key: &str) -> Cow { + // NOTE: we clone the key if translation was missing + // We could use borrowed version, but it would mean that + // `key`, `self`, and result should have the same lifetime. + // Which would make it impossible to use with runtime generated keys. + self.try_msg(key) + .unwrap_or_else(|| Cow::Owned(key.to_owned())) + } - /// Get a localized text from the given key + /// Get a localized text from the given key using given arguments /// /// First lookup is done in the active language, second in /// the fallback (if present). - pub fn get_or(&self, key: &str, fallback_key: &str) -> Option<&str> { - self.get_opt(key).or_else(|| self.get_opt(fallback_key)) + pub fn try_msg_ctx<'a>(&'a self, key: &str, args: &'a FluentArgs) -> Option> { + // NOTE: as after using args we get our result owned (because you need + // to clone pattern during forming value from args), this conversion + // to Cow;:Owned is no-op. + // We could use String here, but using Cow everywhere in i18n API is + // prefered for consistency. + self.active + .try_msg(key, Some(args)) + .or_else(|| { + self.fallback + .as_ref() + .and_then(|fb| fb.try_msg(key, Some(args))) + }) + .map(|x| { + // NOTE: + // Hack. Remove Unicode Directionality Marks, conrod doesn't support them. + let res = x.replace('\u{2068}', "").replace('\u{2069}', ""); + Cow::Owned(res) + }) } - /// Get a variation of localized text from the given key - /// - /// `index` should be a random number from `0` to `u16::max()` + /// Get a localized text from the given key using given arguments /// + /// First lookup is done in the active language, second in + /// the fallback (if present). /// If the key is not present in the localization object - /// then the key is returned. - pub fn get_variation<'a>(&'a self, key: &'a str, index: u16) -> &str { - self.active.get_variation(key, index).unwrap_or_else(|| { + /// then the key itself is returned. + pub fn get_msg_ctx<'a>(&'a self, key: &str, args: &'a FluentArgs) -> Cow<'static, str> { + self.try_msg_ctx(key, args) + .unwrap_or_else(|| Cow::Owned(key.to_owned())) + } + + pub fn try_variation(&self, key: &str, seed: u16) -> Option> { + self.active.try_variation(key, seed, None).or_else(|| { self.fallback .as_ref() - .and_then(|f| f.get_variation(key, index)) - .unwrap_or(key) + .and_then(|fb| fb.try_variation(key, seed, None)) }) } - /// Return the missing keys compared to the reference language - fn list_missing_entries(&self) -> (HashSet, HashSet) { - if let Some(ref_lang) = &self.fallback { - let reference_string_keys: HashSet<_> = ref_lang.string_map.keys().cloned().collect(); - let string_keys: HashSet<_> = self.active.string_map.keys().cloned().collect(); - let strings = reference_string_keys - .difference(&string_keys) - .cloned() - .collect(); - - let reference_vector_keys: HashSet<_> = ref_lang.vector_map.keys().cloned().collect(); - let vector_keys: HashSet<_> = self.active.vector_map.keys().cloned().collect(); - let vectors = reference_vector_keys - .difference(&vector_keys) - .cloned() - .collect(); - - (strings, vectors) - } else { - (HashSet::default(), HashSet::default()) - } + pub fn get_variation(&self, key: &str, seed: u16) -> Cow { + self.try_variation(key, seed) + .unwrap_or_else(|| Cow::Owned(key.to_owned())) } - /// Log missing entries (compared to the reference language) as warnings - pub fn log_missing_entries(&self) { - let (missing_strings, missing_vectors) = self.list_missing_entries(); - for missing_key in missing_strings { - warn!( - "[{:?}] Missing string key {:?}", - self.metadata().language_identifier, - missing_key - ); - } - for missing_key in missing_vectors { - warn!( - "[{:?}] Missing vector key {:?}", - self.metadata().language_identifier, - missing_key - ); - } + pub fn try_variation_ctx<'a>( + &'a self, + key: &str, + seed: u16, + args: &'a FluentArgs, + ) -> Option> { + self.active + .try_variation(key, seed, Some(args)) + .or_else(|| { + self.fallback + .as_ref() + .and_then(|fb| fb.try_variation(key, seed, Some(args))) + }) + .map(|x| { + // NOTE: + // Hack. Remove Unicode Directionality Marks, conrod doesn't support them. + let res = x.replace('\u{2068}', "").replace('\u{2069}', ""); + Cow::Owned(res) + }) } + pub fn get_variation_ctx<'a>(&'a self, key: &str, seed: u16, args: &'a FluentArgs) -> Cow { + self.try_variation_ctx(key, seed, args) + .unwrap_or_else(|| Cow::Owned(key.to_owned())) + } + + #[must_use] pub fn fonts(&self) -> &Fonts { &self.active.fonts } + #[must_use] pub fn metadata(&self) -> &LanguageMetadata { &self.active.metadata } } @@ -251,6 +389,7 @@ impl LocalizationHandle { self.use_english_fallback = use_english_fallback; } + #[must_use] pub fn read(&self) -> LocalizationGuard { LocalizationGuard { active: self.active.read(), @@ -262,7 +401,9 @@ impl LocalizationHandle { } } - pub fn load(specifier: &str) -> Result { + /// # Errors + /// Returns error if active language can't be loaded + pub fn load(specifier: &str) -> Result { let default_key = ["voxygen.i18n.", REFERENCE_LANG].concat(); let language_key = ["voxygen.i18n.", specifier].concat(); let is_default = language_key == default_key; @@ -273,12 +414,14 @@ impl LocalizationHandle { fallback: if is_default { None } else { + // TODO: shouldn't this panic? Language::load(&default_key).ok() }, use_english_fallback: false, }) } + #[must_use] pub fn load_expect(specifier: &str) -> Self { Self::load(specifier).expect("Can't load language files") } @@ -288,17 +431,18 @@ impl LocalizationHandle { struct FindManifests; -impl common_assets::DirLoadable for FindManifests { - fn select_ids( +impl assets::DirLoadable for FindManifests { + fn select_ids( source: &S, specifier: &str, - ) -> io::Result> { + ) -> io::Result> { let mut specifiers = Vec::new(); source.read_dir(specifier, &mut |entry| { if let DirEntry::Directory(spec) = entry { - let manifest_spec = [spec, ".", LANG_MANIFEST_FILE].concat(); - if source.exists(DirEntry::File(&manifest_spec, LANG_EXTENSION)) { + let manifest_spec = [spec, ".", "_manifest"].concat(); + + if source.exists(DirEntry::File(&manifest_spec, "ron")) { specifiers.push(manifest_spec.into()); } } @@ -311,16 +455,13 @@ impl common_assets::DirLoadable for FindManifests { #[derive(Clone, Debug)] struct LocalizationList(Vec); -impl common_assets::Compound for LocalizationList { - fn load( - cache: common_assets::AnyCache, - specifier: &str, - ) -> Result { +impl assets::Compound for LocalizationList { + fn load(cache: assets::AnyCache, specifier: &str) -> Result { // List language directories - let languages = common_assets::load_dir::(specifier, false) + let languages = assets::load_dir::(specifier, false) .unwrap_or_else(|e| panic!("Failed to get manifests from {}: {:?}", specifier, e)) .ids() - .filter_map(|spec| cache.load::(spec).ok()) + .filter_map(|spec| cache.load::(spec).ok()) .map(|localization| localization.read().metadata.clone()) .collect(); @@ -329,42 +470,49 @@ impl common_assets::Compound for LocalizationList { } /// Load all the available languages located in the voxygen asset directory +#[must_use] pub fn list_localizations() -> Vec { - LocalizationList::load_expect_cloned("voxygen.i18n").0 + let LocalizationList(list) = LocalizationList::load_expect_cloned("voxygen.i18n"); + list } #[cfg(test)] mod tests { - use crate::path::BasePath; + use super::*; - // Test that localization list is loaded (not empty) #[test] - fn test_localization_list() { - let list = super::list_localizations(); + fn check_localization_list() { + let list = list_localizations(); assert!(!list.is_empty()); } - // Test that reference language can be loaded #[test] - fn test_localization_handle() { - let _ = super::LocalizationHandle::load_expect(super::REFERENCE_LANG); + fn validate_reference_language() { let _ = LocalizationHandle::load_expect(REFERENCE_LANG); } + + #[test] + fn validate_all_localizations() { + let list = list_localizations(); + for meta in list { + let _ = LocalizationHandle::load_expect(&meta.language_identifier); + } } - // Test to verify all languages that they are VALID and loadable, without - // need of git just on the local assets folder - #[test] - fn verify_all_localizations() { - // Generate paths - let root_dir = common_assets::find_root().expect("Failed to discover repository root"); - crate::verification::verify_all_localizations(&BasePath::new(&root_dir)); - } - - // Test to verify all languages and print missing and faulty localisation #[test] #[ignore] + // Generate translation stats fn test_all_localizations() { - // Generate paths - let root_dir = common_assets::find_root().expect("Failed to discover repository root"); - crate::analysis::test_all_localizations(&BasePath::new(&root_dir), true, true); + // FIXME (i18n translation stats): + use std::{fs, io::Write}; + + let output = assets::find_root() + .unwrap() + .join("translation_analysis.csv"); + let mut f = fs::File::create(output).expect("couldn't write csv file"); + + writeln!( + f, + "country_code,file_name,translation_key,status,git_commit" + ) + .unwrap(); } } diff --git a/voxygen/i18n/src/path.rs b/voxygen/i18n/src/path.rs deleted file mode 100644 index 3f25e55adf..0000000000 --- a/voxygen/i18n/src/path.rs +++ /dev/null @@ -1,141 +0,0 @@ -use std::path::{Path, PathBuf}; - -pub(crate) const LANG_MANIFEST_FILE: &str = "_manifest"; -pub(crate) const LANG_EXTENSION: &str = "ron"; - -#[derive(Clone)] -pub struct BasePath { - ///repo part, git main folder - root_path: PathBuf, - ///relative path to i18n path which contains, currently - /// 'assets/voxygen/i18n' - relative_i18n_root_path: PathBuf, - ///i18n_root_folder - cache: PathBuf, -} - -impl BasePath { - pub fn new(root_path: &Path) -> Self { - let relative_i18n_root_path = Path::new("assets/voxygen/i18n").to_path_buf(); - let cache = root_path.join(&relative_i18n_root_path); - assert!( - cache.is_dir(), - "i18n_root_path folder doesn't exist, something is wrong!" - ); - Self { - root_path: root_path.to_path_buf(), - relative_i18n_root_path, - cache, - } - } - - pub fn root_path(&self) -> &Path { &self.root_path } - - pub fn relative_i18n_root_path(&self) -> &Path { &self.relative_i18n_root_path } - - /// absolute path to `relative_i18n_root_path` - pub fn i18n_root_path(&self) -> &Path { &self.cache } - - pub fn i18n_path(&self, language_identifier: &str) -> LangPath { - LangPath::new(self, language_identifier) - } - - /// List localization directories - pub fn i18n_directories(&self) -> Vec { - std::fs::read_dir(&self.cache) - .unwrap() - .map(|res| res.unwrap()) - .filter(|e| e.file_type().unwrap().is_dir()) - .map(|e| LangPath::new(self, e.file_name().to_str().unwrap())) - .collect() - } -} - -impl core::fmt::Debug for BasePath { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{:?}", &self.cache) - } -} - -#[derive(Clone)] -pub struct LangPath { - base: BasePath, - /// `en`, `de_DE`, `fr_FR`, etc.. - language_identifier: String, - /// i18n_path - cache: PathBuf, -} - -impl LangPath { - fn new(base: &BasePath, language_identifier: &str) -> Self { - let cache = base.i18n_root_path().join(language_identifier); - if !cache.is_dir() { - panic!("language folder '{}' doesn't exist", language_identifier); - } - Self { - base: base.clone(), - language_identifier: language_identifier.to_owned(), - cache, - } - } - - pub fn base(&self) -> &BasePath { &self.base } - - pub fn language_identifier(&self) -> &str { &self.language_identifier } - - ///absolute path to `i18n_root_path` + `language_identifier` - pub fn i18n_path(&self) -> &Path { &self.cache } - - /// fragment or manifest file, based on a path - pub fn sub_path(&self, sub_path: &Path) -> PathBuf { self.cache.join(sub_path) } - - /// fragment or manifest file, based on a string without extension - pub fn file(&self, name_without_extension: &str) -> PathBuf { - self.cache - .join(format!("{}.{}", name_without_extension, LANG_EXTENSION)) - } - - /// return all fragments sub_pathes - pub(crate) fn fragments(&self) -> Result, std::io::Error> { - let mut result = vec![]; - recursive_fragments_paths_in_language(self, Path::new(""), &mut result)?; - Ok(result) - } -} - -//unwraps cant fail as they are in same Path -fn recursive_fragments_paths_in_language( - lpath: &LangPath, - subfolder: &Path, - result: &mut Vec, -) -> Result<(), std::io::Error> { - let manifest_path = PathBuf::from(&format!("{}.{}", LANG_MANIFEST_FILE, LANG_EXTENSION)); - let template_path = PathBuf::from(&format!("{}.{}", "template", LANG_EXTENSION)); - let search_dir = lpath.sub_path(subfolder); - for fragment_file in search_dir.read_dir()?.flatten() { - let file_type = fragment_file.file_type()?; - let full_path = fragment_file.path(); - let relative_path = full_path.strip_prefix(lpath.i18n_path()).unwrap(); - if file_type.is_dir() { - recursive_fragments_paths_in_language(lpath, relative_path, result)?; - } else if file_type.is_file() - && relative_path != manifest_path - && relative_path != template_path - { - result.push(relative_path.to_path_buf()); - } - } - Ok(()) -} - -impl core::fmt::Debug for LangPath { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!( - f, - "{:?}", - self.base - .relative_i18n_root_path - .join(&self.language_identifier) - ) - } -} diff --git a/voxygen/i18n/src/raw.rs b/voxygen/i18n/src/raw.rs index da814bfc1f..d869203582 100644 --- a/voxygen/i18n/src/raw.rs +++ b/voxygen/i18n/src/raw.rs @@ -1,113 +1,36 @@ -//! handle the loading of a `Language` -use crate::{ - path::{LangPath, LANG_EXTENSION, LANG_MANIFEST_FILE}, - Fonts, Language, LanguageMetadata, -}; -use deunicode::deunicode; -use hashbrown::hash_map::HashMap; -use ron::de::from_reader; +use crate::{Fonts, LanguageMetadata}; use serde::{Deserialize, Serialize}; -use std::{fs, path::PathBuf}; -/// Raw localization metadata from LANG_MANIFEST_FILE file +use std::str::FromStr; + +/// Localization metadata from manifest file /// See `Language` for more info on each attributes #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -pub(crate) struct RawManifest { +pub(crate) struct Manifest { pub(crate) convert_utf8_to_ascii: bool, pub(crate) fonts: Fonts, pub(crate) metadata: LanguageMetadata, } -/// Raw localization data from one specific file -/// These structs are meant to be merged into a Language -#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -pub(crate) struct RawFragment { - pub(crate) string_map: HashMap, - pub(crate) vector_map: HashMap>, +impl crate::assets::Asset for Manifest { + type Loader = crate::assets::RonLoader; + + const EXTENSION: &'static str = "ron"; } -pub(crate) struct RawLanguage { - pub(crate) manifest: RawManifest, - pub(crate) fragments: HashMap>, +#[derive(Clone)] +pub(crate) struct Resource { + pub(crate) src: String, } -pub(crate) fn load_manifest(path: &LangPath) -> Result { - let manifest_file = path.file(LANG_MANIFEST_FILE); - tracing::debug!(?manifest_file, "manifest loading"); - let f = fs::File::open(&manifest_file)?; - let manifest: RawManifest = from_reader(f)?; - // verify that the folder name `de_DE` matches the value inside the metadata! - assert_eq!( - manifest.metadata.language_identifier, - path.language_identifier() - ); - Ok(manifest) +impl FromStr for Resource { + type Err = std::convert::Infallible; + + fn from_str(s: &str) -> Result { Ok(Self { src: s.to_owned() }) } } -pub(crate) fn load_raw_language( - path: &LangPath, - manifest: RawManifest, -) -> Result, common_assets::BoxedError> { - //get List of files - let files = path.fragments()?; +impl crate::assets::Asset for Resource { + type Loader = crate::assets::loader::ParseLoader; - // Walk through each file in the directory - let mut fragments = HashMap::new(); - for sub_path in files { - let f = fs::File::open(path.sub_path(&sub_path))?; - let fragment = from_reader(f)?; - fragments.insert(sub_path, fragment); - } - - Ok(RawLanguage { - manifest, - fragments, - }) -} - -impl From> for Language { - fn from(raw: RawLanguage) -> Self { - let mut string_map = HashMap::new(); - let mut vector_map = HashMap::new(); - - for (_, fragment) in raw.fragments { - string_map.extend(fragment.string_map); - vector_map.extend(fragment.vector_map); - } - - let convert_utf8_to_ascii = raw.manifest.convert_utf8_to_ascii; - - // Update the text if UTF-8 to ASCII conversion is enabled - if convert_utf8_to_ascii { - for value in string_map.values_mut() { - *value = deunicode(value); - } - - for value in vector_map.values_mut() { - *value = value.iter().map(|s| deunicode(s)).collect(); - } - } - let mut metadata = raw.manifest.metadata; - metadata.language_name = deunicode(&metadata.language_name); - - Self { - string_map, - vector_map, - convert_utf8_to_ascii, - fonts: raw.manifest.fonts, - metadata, - } - } -} - -impl common_assets::Asset for RawManifest { - type Loader = common_assets::RonLoader; - - const EXTENSION: &'static str = LANG_EXTENSION; -} - -impl common_assets::Asset for RawFragment { - type Loader = common_assets::RonLoader; - - const EXTENSION: &'static str = LANG_EXTENSION; + const EXTENSION: &'static str = "ftl"; } diff --git a/voxygen/i18n/src/stats.rs b/voxygen/i18n/src/stats.rs deleted file mode 100644 index 65b6e5cc1b..0000000000 --- a/voxygen/i18n/src/stats.rs +++ /dev/null @@ -1,199 +0,0 @@ -use crate::{ - gitfragments::{LocalizationEntryState, LocalizationState, ALL_LOCALIZATION_STATES}, - raw::RawLanguage, -}; -use hashbrown::HashMap; -use std::path::PathBuf; - -#[derive(Default, Debug, PartialEq)] -pub(crate) struct LocalizationStats { - pub(crate) uptodate_entries: usize, - pub(crate) notfound_entries: usize, - pub(crate) unused_entries: usize, - pub(crate) outdated_entries: usize, - pub(crate) errors: usize, -} - -pub(crate) struct LocalizationAnalysis { - language_identifier: String, - pub(crate) data: HashMap, Vec<(PathBuf, String, Option)>>, -} - -impl LocalizationStats { - /// Calculate key count that actually matter for the status of the - /// translation Unused entries don't break the game - pub(crate) fn get_real_entry_count(&self) -> usize { - self.outdated_entries + self.notfound_entries + self.errors + self.uptodate_entries - } -} - -impl LocalizationAnalysis { - pub(crate) fn new(language_identifier: &str) -> Self { - let mut data = HashMap::new(); - for key in ALL_LOCALIZATION_STATES.iter() { - data.insert(*key, vec![]); - } - Self { - language_identifier: language_identifier.to_owned(), - data, - } - } - - fn show( - &self, - state: Option, - ref_language: &RawLanguage, - be_verbose: bool, - output: &mut W, - ) { - let entries = self.data.get(&state).unwrap_or_else(|| { - panic!( - "called on invalid state: {}", - LocalizationState::print(&state) - ) - }); - if entries.is_empty() { - return; - } - writeln!(output, "\n\t[{}]", LocalizationState::print(&state)).unwrap(); - for (path, key, commit_id) in entries { - if be_verbose { - let our_commit = LocalizationAnalysis::print_commit(commit_id); - let ref_commit = ref_language - .fragments - .get(path) - .and_then(|entry| entry.string_map.get(key)) - .and_then(|s| s.commit_id) - .map(|s| format!("{}", s)) - .unwrap_or_else(|| "None".to_owned()); - writeln!(output, "{:60}| {:40} | {:40}", key, our_commit, ref_commit).unwrap(); - } else { - writeln!(output, "{}", key).unwrap(); - } - } - } - - fn csv(&self, state: Option, output: &mut W) { - let entries = self - .data - .get(&state) - .unwrap_or_else(|| panic!("called on invalid state: {:?}", state)); - for (path, key, commit_id) in entries { - let our_commit = LocalizationAnalysis::print_commit(commit_id); - writeln!( - output, - "{},{:?},{},{},{}", - self.language_identifier, - path, - key, - LocalizationState::print(&state), - our_commit - ) - .unwrap(); - } - } - - fn print_commit(commit_id: &Option) -> String { - commit_id - .map(|s| format!("{}", s)) - .unwrap_or_else(|| "None".to_owned()) - } -} - -pub(crate) fn print_translation_stats( - language_identifier: &str, - ref_language: &RawLanguage, - stats: &LocalizationStats, - state_map: &LocalizationAnalysis, - be_verbose: bool, -) { - let real_entry_count = stats.get_real_entry_count() as f32; - let uptodate_percent = (stats.uptodate_entries as f32 / real_entry_count) * 100_f32; - let outdated_percent = (stats.outdated_entries as f32 / real_entry_count) * 100_f32; - let untranslated_percent = - ((stats.notfound_entries + stats.errors) as f32 / real_entry_count) * 100_f32; - - // Display - if be_verbose { - println!( - "\n{:60}| {:40} | {:40}", - "Key name", language_identifier, ref_language.manifest.metadata.language_identifier, - ); - } else { - println!("\nKey name"); - } - - for state in &ALL_LOCALIZATION_STATES { - if state == &Some(LocalizationState::UpToDate) { - continue; - } - state_map.show(*state, ref_language, be_verbose, &mut std::io::stdout()); - } - - println!( - "\n{} up-to-date, {} outdated, {} unused, {} not found, {} unknown entries", - stats.uptodate_entries, - stats.outdated_entries, - stats.unused_entries, - stats.notfound_entries, - stats.errors, - ); - - println!( - "{:.2}% up-to-date, {:.2}% outdated, {:.2}% untranslated\n", - uptodate_percent, outdated_percent, untranslated_percent, - ); -} - -pub(crate) fn print_csv_stats(state_map: &LocalizationAnalysis, output: &mut W) { - for state in &ALL_LOCALIZATION_STATES { - state_map.csv(*state, output); - } -} - -pub(crate) fn print_overall_stats( - analysis: HashMap, -) { - let mut overall_uptodate_entry_count = 0; - let mut overall_outdated_entry_count = 0; - let mut overall_untranslated_entry_count = 0; - let mut overall_real_entry_count = 0; - - println!("-----------------------------------------------------------------------------"); - println!("Overall Translation Status"); - println!("-----------------------------------------------------------------------------"); - println!( - "{:12}| {:8} | {:8} | {:8} | {:8} | {:8}", - "", "up-to-date", "outdated", "untranslated", "unused", "errors", - ); - - let mut i18n_stats: Vec<(&String, &(_, LocalizationStats))> = analysis.iter().collect(); - i18n_stats.sort_by_key(|(_, (_, v))| v.notfound_entries); - - for (path, (_, test_result)) in i18n_stats { - let LocalizationStats { - uptodate_entries: uptodate, - outdated_entries: outdated, - unused_entries: unused, - notfound_entries: untranslated, - errors, - } = test_result; - overall_uptodate_entry_count += uptodate; - overall_outdated_entry_count += outdated; - overall_untranslated_entry_count += untranslated; - overall_real_entry_count += test_result.get_real_entry_count(); - - println!( - "{:12}|{:8} |{:6} |{:8} |{:6} |{:8}", - path, uptodate, outdated, untranslated, unused, errors, - ); - } - - println!( - "\n{:.2}% up-to-date, {:.2}% outdated, {:.2}% untranslated", - (overall_uptodate_entry_count as f32 / overall_real_entry_count as f32) * 100_f32, - (overall_outdated_entry_count as f32 / overall_real_entry_count as f32) * 100_f32, - (overall_untranslated_entry_count as f32 / overall_real_entry_count as f32) * 100_f32, - ); - println!("-----------------------------------------------------------------------------\n"); -} diff --git a/voxygen/i18n/src/verification.rs b/voxygen/i18n/src/verification.rs deleted file mode 100644 index fa784b9db5..0000000000 --- a/voxygen/i18n/src/verification.rs +++ /dev/null @@ -1,34 +0,0 @@ -use crate::path::{BasePath, LangPath, LANG_MANIFEST_FILE}; - -use crate::{raw, REFERENCE_LANG}; - -/// Test to verify all languages that they are VALID and loadable, without -/// need of git just on the local assets folder -pub fn verify_all_localizations(path: &BasePath) { - let ref_i18n_path = path.i18n_path(REFERENCE_LANG); - let ref_i18n_manifest_path = ref_i18n_path.file(LANG_MANIFEST_FILE); - assert!( - ref_i18n_manifest_path.is_file(), - "Reference language manifest file doesn't exist, something is wrong!" - ); - let i18n_directories = path.i18n_directories(); - // This simple check ONLY guarantees that an arbitrary minimum of translation - // files exists. It's just to notice unintentional deletion of all - // files, or modifying the paths. In case you want to delete all - // language you have to adjust this number: - assert!( - i18n_directories.len() > 5, - "have less than 5 translation folders, arbitrary minimum check failed. Maybe the i18n \ - folder is empty?" - ); - for i18n_directory in i18n_directories { - println!("verifying {:?}", i18n_directory); - // Walk through each files and try to load them - verify_localization_directory(&i18n_directory); - } -} - -fn verify_localization_directory(path: &LangPath) { - let manifest = raw::load_manifest(path).expect("error accessing manifest file"); - raw::load_raw_language(path, manifest).expect("error accessing fragment file"); -} From d000cc90a1c6f9211f043e065f2d6150161a55df Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 6 Aug 2022 20:47:45 +0300 Subject: [PATCH 011/854] Migrate code to new i18n API --- Cargo.lock | 8 +- server/src/sys/agent.rs | 78 +-- voxygen/src/hud/bag.rs | 42 +- voxygen/src/hud/buffs.rs | 6 +- voxygen/src/hud/buttons.rs | 20 +- voxygen/src/hud/chat.rs | 77 ++- voxygen/src/hud/crafting.rs | 42 +- voxygen/src/hud/diary.rs | 611 +++++++++---------- voxygen/src/hud/esc_menu.rs | 12 +- voxygen/src/hud/group.rs | 36 +- voxygen/src/hud/map.rs | 89 +-- voxygen/src/hud/mod.rs | 130 ++-- voxygen/src/hud/overitem.rs | 23 +- voxygen/src/hud/settings_window/chat.rs | 74 +-- voxygen/src/hud/settings_window/controls.rs | 8 +- voxygen/src/hud/settings_window/gameplay.rs | 40 +- voxygen/src/hud/settings_window/interface.rs | 77 +-- voxygen/src/hud/settings_window/language.rs | 2 +- voxygen/src/hud/settings_window/mod.rs | 6 +- voxygen/src/hud/settings_window/sound.rs | 18 +- voxygen/src/hud/settings_window/video.rs | 80 +-- voxygen/src/hud/skillbar.rs | 49 +- voxygen/src/hud/social.rs | 7 +- voxygen/src/hud/trade.rs | 21 +- voxygen/src/hud/util.rs | 86 +-- voxygen/src/main.rs | 1 - voxygen/src/menu/char_selection/mod.rs | 4 +- voxygen/src/menu/char_selection/ui/mod.rs | 67 +- voxygen/src/menu/main/mod.rs | 81 ++- voxygen/src/menu/main/ui/connecting.rs | 53 +- voxygen/src/menu/main/ui/login.rs | 6 +- voxygen/src/session/mod.rs | 17 +- voxygen/src/session/settings_change.rs | 1 - voxygen/src/ui/ice/component/tooltip.rs | 2 +- voxygen/src/ui/widgets/item_tooltip.rs | 4 +- 35 files changed, 964 insertions(+), 914 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8fd9ef793a..c1281921b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1905,7 +1905,7 @@ dependencies = [ [[package]] name = "fluent" version = "0.16.0" -source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" dependencies = [ "fluent-bundle", "unic-langid", @@ -1914,7 +1914,7 @@ dependencies = [ [[package]] name = "fluent-bundle" version = "0.15.2" -source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" dependencies = [ "fluent-langneg", "fluent-syntax", @@ -1938,7 +1938,7 @@ dependencies = [ [[package]] name = "fluent-syntax" version = "0.11.0" -source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" dependencies = [ "thiserror", ] @@ -2843,7 +2843,7 @@ dependencies = [ [[package]] name = "intl-memoizer" version = "0.5.1" -source = "git+https://github.com/juliancoffee/fluent-rs.git#efd8159736c0c5d5f00a1c1f91fe35492e9ab473" +source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" dependencies = [ "type-map", "unic-langid", diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index a0725e46eb..652ee01d3a 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -988,7 +988,7 @@ impl<'a> AgentData<'a> { let used = match msg { AgentEvent::Talk(..) | AgentEvent::TradeAccepted(_) => { self.chat_npc_if_allowed_to_speak( - "npc.speech.villager_busy", + "npc-speech-villager_busy", agent, event_emitter, ); @@ -998,13 +998,13 @@ impl<'a> AgentData<'a> { controller.push_invite_response(InviteResponse::Decline); if agent.behavior.can_trade() { self.chat_npc_if_allowed_to_speak( - "npc.speech.merchant_busy", + "npc-speech-merchant_busy", agent, event_emitter, ); } else { self.chat_npc_if_allowed_to_speak( - "npc.speech.villager_busy", + "npc-speech-villager_busy", agent, event_emitter, ); @@ -1018,12 +1018,12 @@ impl<'a> AgentData<'a> { match result { TradeResult::Completed => { self.chat_npc( - "npc.speech.merchant_trade_successful", + "npc-speech-merchant_trade_successful", event_emitter, ); }, _ => { - self.chat_npc("npc.speech.merchant_trade_declined", event_emitter); + self.chat_npc("npc-speech-merchant_trade_declined", event_emitter); }, } agent.behavior.unset(BehaviorState::TRADING); @@ -1039,7 +1039,7 @@ impl<'a> AgentData<'a> { *tradeid, TradeAction::Decline, )); - self.chat_npc("npc.speech.merchant_trade_cancelled_hostile", event_emitter); + self.chat_npc("npc-speech-merchant_trade_cancelled_hostile", event_emitter); true }, AgentEvent::ServerSound(_) | AgentEvent::Hurt => false, @@ -1158,18 +1158,18 @@ impl<'a> AgentData<'a> { if !agent.behavior.is(BehaviorState::TRADING) { controller.push_initiate_invite(*by, InviteKind::Trade); self.chat_npc( - "npc.speech.merchant_advertisement", + "npc-speech-merchant_advertisement", event_emitter, ); } else { - let default_msg = "npc.speech.merchant_busy"; + let default_msg = "npc-speech-merchant_busy"; let msg = self.rtsim_entity.map_or(default_msg, |e| { if e.brain .personality .personality_traits .contains(PersonalityTrait::Disagreeable) { - "npc.speech.merchant_busy_rude" + "npc-speech-merchant_busy_rude" } else { default_msg } @@ -1185,57 +1185,57 @@ impl<'a> AgentData<'a> { { let msg = match extreme_trait { PersonalityTrait::Open => { - "npc.speech.villager_open" + "npc-speech-villager_open" }, PersonalityTrait::Adventurous => { - "npc.speech.villager_adventurous" + "npc-speech-villager_adventurous" }, PersonalityTrait::Closed => { - "npc.speech.villager_closed" + "npc-speech-villager_closed" }, PersonalityTrait::Conscientious => { - "npc.speech.villager_conscientious" + "npc-speech-villager_conscientious" }, PersonalityTrait::Busybody => { - "npc.speech.villager_busybody" + "npc-speech-villager_busybody" }, PersonalityTrait::Unconscientious => { - "npc.speech.villager_unconscientious" + "npc-speech-villager_unconscientious" }, PersonalityTrait::Extroverted => { - "npc.speech.villager_extroverted" + "npc-speech-villager_extroverted" }, PersonalityTrait::Introverted => { - "npc.speech.villager_introverted" + "npc-speech-villager_introverted" }, PersonalityTrait::Agreeable => { - "npc.speech.villager_agreeable" + "npc-speech-villager_agreeable" }, PersonalityTrait::Sociable => { - "npc.speech.villager_sociable" + "npc-speech-villager_sociable" }, PersonalityTrait::Disagreeable => { - "npc.speech.villager_disagreeable" + "npc-speech-villager_disagreeable" }, PersonalityTrait::Neurotic => { - "npc.speech.villager_neurotic" + "npc-speech-villager_neurotic" }, PersonalityTrait::Seeker => { - "npc.speech.villager_seeker" + "npc-speech-villager_seeker" }, PersonalityTrait::SadLoner => { - "npc.speech.villager_sad_loner" + "npc-speech-villager_sad_loner" }, PersonalityTrait::Worried => { - "npc.speech.villager_worried" + "npc-speech-villager_worried" }, PersonalityTrait::Stable => { - "npc.speech.villager_stable" + "npc-speech-villager_stable" }, }; self.chat_npc(msg, event_emitter); } else { - self.chat_npc("npc.speech.villager", event_emitter); + self.chat_npc("npc-speech-villager", event_emitter); } } }, @@ -1244,12 +1244,12 @@ impl<'a> AgentData<'a> { if !agent.behavior.is(BehaviorState::TRADING) { controller.push_initiate_invite(*by, InviteKind::Trade); self.chat_npc( - "npc.speech.merchant_advertisement", + "npc-speech-merchant_advertisement", event_emitter, ); } else { self.chat_npc( - "npc.speech.merchant_busy", + "npc-speech-merchant_busy", event_emitter, ); } @@ -1257,7 +1257,7 @@ impl<'a> AgentData<'a> { // TODO: maybe make some travellers willing to trade with // simpler goods like potions self.chat_npc( - "npc.speech.villager_decline_trade", + "npc-speech-villager_decline_trade", event_emitter, ); } @@ -1383,7 +1383,7 @@ impl<'a> AgentData<'a> { } else { controller.push_invite_response(InviteResponse::Decline); self.chat_npc_if_allowed_to_speak( - "npc.speech.merchant_busy", + "npc-speech-merchant_busy", agent, event_emitter, ); @@ -1392,7 +1392,7 @@ impl<'a> AgentData<'a> { // TODO: Provide a hint where to find the closest merchant? controller.push_invite_response(InviteResponse::Decline); self.chat_npc_if_allowed_to_speak( - "npc.speech.villager_decline_trade", + "npc-speech-villager_decline_trade", agent, event_emitter, ); @@ -1413,10 +1413,10 @@ impl<'a> AgentData<'a> { if agent.behavior.is(BehaviorState::TRADING) { match result { TradeResult::Completed => { - self.chat_npc("npc.speech.merchant_trade_successful", event_emitter); + self.chat_npc("npc-speech-merchant_trade_successful", event_emitter); }, _ => { - self.chat_npc("npc.speech.merchant_trade_declined", event_emitter); + self.chat_npc("npc-speech-merchant_trade_declined", event_emitter); }, } agent.behavior.unset(BehaviorState::TRADING); @@ -1553,12 +1553,12 @@ impl<'a> AgentData<'a> { if self.remembers_fight_with(target, read_data) { chat_villager_remembers_fighting(); } else if is_dressed_as_cultist(target, read_data) { - chat("npc.speech.villager_cultist_alarm"); + chat("npc-speech-villager_cultist_alarm"); } else { - chat("npc.speech.menacing"); + chat("npc-speech-menacing"); } } else { - chat("npc.speech.menacing"); + chat("npc-speech-menacing"); } } @@ -2468,13 +2468,13 @@ impl<'a> AgentData<'a> { // FIXME: If going to use "cultist + low health + fleeing" string, make sure // they are each true. self.chat_npc_if_allowed_to_speak( - "npc.speech.cultist_low_health_fleeing", + "npc-speech-cultist_low_health_fleeing", agent, event_emitter, ); } else if is_villager(self.alignment) { self.chat_npc_if_allowed_to_speak( - "npc.speech.villager_under_attack", + "npc-speech-villager_under_attack", agent, event_emitter, ); @@ -2489,7 +2489,7 @@ impl<'a> AgentData<'a> { ) { if is_villager(self.alignment) { self.chat_npc_if_allowed_to_speak( - "npc.speech.villager_enemy_killed", + "npc-speech-villager_enemy_killed", agent, event_emitter, ); diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index 54bf55cedd..1eef107e70 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -31,6 +31,7 @@ use conrod_core::{ widget_ids, Color, Colorable, Positionable, Scalar, Sizeable, UiCell, Widget, WidgetCommon, }; use i18n::Localization; +use std::borrow::Cow; use crate::hud::slots::SlotKind; use specs::Entity as EcsEntity; @@ -194,8 +195,9 @@ impl<'a> InventoryScroller<'a> { Text::new( &self .localized_strings - .get("hud.bag.inventory") - .replace("{playername}", &*self.playername), + .get_msg_ctx("hud-bag-inventory", &i18n::fluent_args! { + "playername" => &*self.playername, + }), ) .mid_top_with_margin_on(self.bg_ids.bg_frame, 9.0) .font_id(self.fonts.cyri.conrod_id) @@ -205,8 +207,9 @@ impl<'a> InventoryScroller<'a> { Text::new( &self .localized_strings - .get("hud.bag.inventory") - .replace("{playername}", &*self.playername), + .get_msg_ctx("hud-bag-inventory", &i18n::fluent_args! { + "playername" => &*self.playername, + }), ) .top_left_with_margins_on(state.ids.inventory_title_bg, 2.0, 2.0) .font_id(self.fonts.cyri.conrod_id) @@ -814,11 +817,11 @@ impl<'a> Widget for Bag<'a> { .top_left_with_margins_on(state.bg_ids.bg_frame, inv_sort_btn_top, 47.0) .with_tooltip( self.tooltip_manager, - match inventory.next_sort_order() { + &(match inventory.next_sort_order() { InventorySortOrder::Name => i18n.get("hud.bag.sort_by_name"), InventorySortOrder::Quality => i18n.get("hud.bag.sort_by_quality"), InventorySortOrder::Tag => i18n.get("hud.bag.sort_by_category"), - }, + }), "", &tooltip, color::WHITE, @@ -887,7 +890,7 @@ impl<'a> Widget for Bag<'a> { } else { let manager = &mut *self.tooltip_manager; $slot_maker - .with_tooltip(manager, i18n.get($desc), "", &tooltip, color::WHITE) + .with_tooltip(manager, &i18n.get($desc), "", &tooltip, color::WHITE) .set($slot_id, ui) } }; @@ -973,18 +976,18 @@ impl<'a> Widget for Bag<'a> { "Protection" => i18n.get("hud.bag.protection"), "Stun Resilience" => i18n.get("hud.bag.stun_res"), "Stealth" => i18n.get("hud.bag.stealth"), - _ => "", + _ => Cow::Borrowed(""), }; let tooltip_txt = match i.1 { "Combat Rating" => i18n.get("hud.bag.combat_rating_desc"), "Protection" => i18n.get("hud.bag.protection_desc"), "Stun Resilience" => i18n.get("hud.bag.stun_res_desc"), - _ => "", + _ => Cow::Borrowed(""), }; btn.with_tooltip( self.tooltip_manager, - tooltip_head, - tooltip_txt, + &tooltip_head, + &tooltip_txt, &bag_tooltip, TEXT_COLOR, ) @@ -1213,19 +1216,22 @@ impl<'a> Widget for Bag<'a> { .align_middle_y_of(state.ids.active_mainhand_slot) .with_tooltip( self.tooltip_manager, - i18n.get("hud.bag.swap_equipped_weapons_title"), - if let Some(key) = self + &i18n.get("hud.bag.swap_equipped_weapons_title"), + &(if let Some(key) = self .global_state .settings .controls .get_binding(GameInput::SwapLoadout) { - i18n.get("hud.bag.swap_equipped_weapons_desc") - .replace("{key}", key.display_string(key_layout).as_str()) + i18n.get_msg_ctx( + "hud-bag-swap_equipped_weapons_desc", + &i18n::fluent_args! { + "key" => key.display_string(key_layout) + }, + ) } else { - "".to_string() - } - .as_str(), + Cow::Borrowed("") + }), &tooltip, color::WHITE, ) diff --git a/voxygen/src/hud/buffs.rs b/voxygen/src/hud/buffs.rs index 4ae312a593..4752d57fd3 100644 --- a/voxygen/src/hud/buffs.rs +++ b/voxygen/src/hud/buffs.rs @@ -238,7 +238,7 @@ impl<'a> Widget for BuffsBar<'a> { .middle_of(*id) .with_tooltip( self.tooltip_manager, - title, + &title, &desc, &buffs_tooltip, BUFF_COLOR, @@ -308,7 +308,7 @@ impl<'a> Widget for BuffsBar<'a> { .middle_of(*id) .with_tooltip( self.tooltip_manager, - title, + &title, &desc, &buffs_tooltip, DEBUFF_COLOR, @@ -400,7 +400,7 @@ impl<'a> Widget for BuffsBar<'a> { .middle_of(*id) .with_tooltip( self.tooltip_manager, - title, + &title, &desc, &buffs_tooltip, if buff.is_buff { diff --git a/voxygen/src/hud/buttons.rs b/voxygen/src/hud/buttons.rs index 542071a148..a92d5cc406 100644 --- a/voxygen/src/hud/buttons.rs +++ b/voxygen/src/hud/buttons.rs @@ -165,9 +165,9 @@ impl<'a> Widget for Buttons<'a> { .w_h(420.0 / 10.0, 480.0 / 10.0) .with_tooltip( self.tooltip_manager, - &localized_strings - .get("hud.bag.inventory") - .replace("{playername}", &self.stats.name), + &localized_strings.get_msg_ctx("hud-bag-inventory", &i18n::fluent_args! { + "playername" => &self.stats.name + }), "", &button_tooltip, TEXT_COLOR, @@ -228,7 +228,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.settings_press) .with_tooltip( self.tooltip_manager, - localized_strings.get("common.settings"), + &localized_strings.get("common.settings"), "", &button_tooltip, TEXT_COLOR, @@ -261,7 +261,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.social_press) .with_tooltip( self.tooltip_manager, - localized_strings.get("hud.social"), + &localized_strings.get("hud.social"), "", &button_tooltip, TEXT_COLOR, @@ -293,7 +293,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.map_press) .with_tooltip( self.tooltip_manager, - localized_strings.get("hud.map.map_title"), + &localized_strings.get("hud.map.map_title"), "", &button_tooltip, TEXT_COLOR, @@ -330,7 +330,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.spellbook_press) .with_tooltip( self.tooltip_manager, - localized_strings.get("hud.diary"), + &localized_strings.get("hud.diary"), "", &button_tooltip, TEXT_COLOR, @@ -363,14 +363,14 @@ impl<'a> Widget for Buttons<'a> { .mid_top_with_margin_on(state.ids.spellbook_button, -12.0 + arrow_ani as f64) .color(Some(QUALITY_LEGENDARY)) .set(state.ids.sp_arrow, ui); - Text::new(localized_strings.get("hud.sp_arrow_txt")) + Text::new(&localized_strings.get("hud.sp_arrow_txt")) .mid_top_with_margin_on(state.ids.sp_arrow, -18.0) .graphics_for(state.ids.spellbook_button) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) .color(BLACK) .set(state.ids.sp_arrow_txt_bg, ui); - Text::new(localized_strings.get("hud.sp_arrow_txt")) + Text::new(&localized_strings.get("hud.sp_arrow_txt")) .graphics_for(state.ids.spellbook_button) .bottom_right_with_margins_on(state.ids.sp_arrow_txt_bg, 1.0, 1.0) .font_id(self.fonts.cyri.conrod_id) @@ -386,7 +386,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.crafting_icon_press) .with_tooltip( self.tooltip_manager, - localized_strings.get("hud.crafting"), + &localized_strings.get("hud.crafting"), "", &button_tooltip, TEXT_COLOR, diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index 6cc6724541..d07638a976 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -429,7 +429,20 @@ impl<'a> Widget for Chat<'a> { .map(|m| { let mut message = m.clone(); if let Some(template_key) = get_chat_template_key(&message.chat_type) { - message.message = self.localized_strings.get(template_key).to_string(); + // FIXME (i18n death messages): + // Death message is half localized in voxygen, half in client. + // Make this not. + message.message = self + .localized_strings + .get_msg_ctx(template_key, &i18n::fluent_args! { + "attacker" => "{attacker}", + "name" => "{name}", + "died_from_buff" => "{died_from_buff}", + "victim" => "{victim}", + "environment" => "{environment}", + }) + .into_owned(); + if let ChatType::Kill(kill_source, _) = &message.chat_type { match kill_source { KillSource::Player(_, KillType::Buff(buffkind)) @@ -544,7 +557,7 @@ impl<'a> Widget for Chat<'a> { .hover_image(self.imgs.selection_hover) .hover_image(self.imgs.selection_press) .image_color(shading) - .label(self.localized_strings.get("hud.chat.all")) + .label(&self.localized_strings.get("hud.chat.all")) .label_font_size(self.fonts.cyri.scale(14)) .label_font_id(self.fonts.cyri.conrod_id) .label_color(TEXT_COLOR.alpha(alpha)) @@ -603,7 +616,8 @@ impl<'a> Widget for Chat<'a> { .set(state.ids.chat_tab_tooltip_bg, ui); Text::new( - self.localized_strings + &self + .localized_strings .get("hud.chat.chat_tab_hover_tooltip"), ) .mid_top_with_margin_on(state.ids.chat_tab_tooltip_bg, 3.0) @@ -770,12 +784,11 @@ fn render_chat_line(chat_type: &ChatType, imgs: &Imgs) -> (Color, conrod fn insert_killing_buff(buff: BuffKind, localized_strings: &Localization, template: &str) -> String { let buff_outcome = match buff { - BuffKind::Burning => localized_strings.get("hud.outcome.burning"), - BuffKind::Bleeding => localized_strings.get("hud.outcome.bleeding"), - BuffKind::Cursed => localized_strings.get("hud.outcome.curse"), - BuffKind::Crippled => localized_strings.get("hud.outcome.crippled"), - BuffKind::Frozen => localized_strings.get("hud.outcome.frozen"), - BuffKind::Poisoned => localized_strings.get("hud.outcome.poisoned"), + BuffKind::Burning => "hud-outcome-burning", + BuffKind::Bleeding => "hud-outcome-bleeding", + BuffKind::Cursed => "hud-outcome-curse", + BuffKind::Crippled => "hud-outcome-crippled", + BuffKind::Frozen => "hud-outcome-frozen", BuffKind::Regeneration | BuffKind::Saturation | BuffKind::Potion @@ -787,39 +800,39 @@ fn insert_killing_buff(buff: BuffKind, localized_strings: &Localization, templat | BuffKind::Frenzied | BuffKind::Hastened => { tracing::error!("Player was killed by a positive buff!"); - localized_strings.get("hud.outcome.mysterious") + "hud-outcome-mysterious" }, - BuffKind::Wet | BuffKind::Ensnared => { + BuffKind::Wet | BuffKind::Ensnared | BuffKind::Poisoned => { tracing::error!("Player was killed by a debuff that doesn't do damage!"); - localized_strings.get("hud.outcome.mysterious") + "hud-outcome-mysterious" }, }; - template.replace("{died_of_buff}", buff_outcome) + template.replace("{died_from_buff}", &localized_strings.get_msg(buff_outcome)) } fn get_chat_template_key(chat_type: &ChatType) -> Option<&str> { Some(match chat_type { - ChatType::Online(_) => "hud.chat.online_msg", - ChatType::Offline(_) => "hud.chat.offline_msg", + ChatType::Online(_) => "hud-chat-online_msg", + ChatType::Offline(_) => "hud-chat-offline_msg", ChatType::Kill(kill_source, _) => match kill_source { - KillSource::Player(_, KillType::Buff(_)) => "hud.chat.died_of_pvp_buff_msg", - KillSource::Player(_, KillType::Melee) => "hud.chat.pvp_melee_kill_msg", - KillSource::Player(_, KillType::Projectile) => "hud.chat.pvp_ranged_kill_msg", - KillSource::Player(_, KillType::Explosion) => "hud.chat.pvp_explosion_kill_msg", - KillSource::Player(_, KillType::Energy) => "hud.chat.pvp_energy_kill_msg", - KillSource::Player(_, KillType::Other) => "hud.chat.pvp_other_kill_msg", - KillSource::NonExistent(KillType::Buff(_)) => "hud.chat.died_of_buff_nonexistent_msg", - KillSource::NonPlayer(_, KillType::Buff(_)) => "hud.chat.died_of_npc_buff_msg", - KillSource::NonPlayer(_, KillType::Melee) => "hud.chat.npc_melee_kill_msg", - KillSource::NonPlayer(_, KillType::Projectile) => "hud.chat.npc_ranged_kill_msg", - KillSource::NonPlayer(_, KillType::Explosion) => "hud.chat.npc_explosion_kill_msg", - KillSource::NonPlayer(_, KillType::Energy) => "hud.chat.npc_energy_kill_msg", - KillSource::NonPlayer(_, KillType::Other) => "hud.chat.npc_other_kill_msg", - KillSource::Environment(_) => "hud.chat.environmental_kill_msg", - KillSource::FallDamage => "hud.chat.fall_kill_msg", - KillSource::Suicide => "hud.chat.suicide_msg", - KillSource::NonExistent(_) | KillSource::Other => "hud.chat.default_death_msg", + KillSource::Player(_, KillType::Buff(_)) => "hud-chat-died_of_pvp_buff_msg", + KillSource::Player(_, KillType::Melee) => "hud-chat-pvp_melee_kill_msg", + KillSource::Player(_, KillType::Projectile) => "hud-chat-pvp_ranged_kill_msg", + KillSource::Player(_, KillType::Explosion) => "hud-chat-pvp_explosion_kill_msg", + KillSource::Player(_, KillType::Energy) => "hud-chat-pvp_energy_kill_msg", + KillSource::Player(_, KillType::Other) => "hud-chat-pvp_other_kill_msg", + KillSource::NonExistent(KillType::Buff(_)) => "hud-chat-died_of_buff_nonexistent_msg", + KillSource::NonPlayer(_, KillType::Buff(_)) => "hud-chat-died_of_npc_buff_msg", + KillSource::NonPlayer(_, KillType::Melee) => "hud-chat-npc_melee_kill_msg", + KillSource::NonPlayer(_, KillType::Projectile) => "hud-chat-npc_ranged_kill_msg", + KillSource::NonPlayer(_, KillType::Explosion) => "hud-chat-npc_explosion_kill_msg", + KillSource::NonPlayer(_, KillType::Energy) => "hud-chat-npc_energy_kill_msg", + KillSource::NonPlayer(_, KillType::Other) => "hud-chat-npc_other_kill_msg", + KillSource::Environment(_) => "hud-chat-environmental_kill_msg", + KillSource::FallDamage => "hud-chat-fall_kill_msg", + KillSource::Suicide => "hud-chat-suicide_msg", + KillSource::NonExistent(_) | KillSource::Other => "hud-chat-default_death_msg", }, _ => return None, }) diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 42d7442d88..3fc5fb9fab 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -36,7 +36,7 @@ use conrod_core::{ }; use hashbrown::HashMap; use i18n::Localization; -use std::{collections::BTreeMap, sync::Arc}; +use std::{borrow::Cow, collections::BTreeMap, sync::Arc}; use strum::{EnumIter, IntoEnumIterator}; use tracing::warn; use vek::*; @@ -383,7 +383,7 @@ impl<'a> Widget for Crafting<'a> { } // Title - Text::new(self.localized_strings.get("hud.crafting")) + Text::new(&self.localized_strings.get("hud.crafting")) .mid_top_with_margin_on(state.ids.window_frame, 9.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -459,7 +459,7 @@ impl<'a> Widget for Crafting<'a> { }) .with_tooltip( self.tooltip_manager, - self.localized_strings.get(crafting_tab.name_key()), + &self.localized_strings.get(crafting_tab.name_key()), "", &tabs_tooltip, TEXT_COLOR, @@ -973,13 +973,15 @@ impl<'a> Widget for Crafting<'a> { self.localized_strings .get("hud.crafting.mod_comp_wood_prim_slot_desc"), ), - RecipeKind::Component(_) | RecipeKind::Simple => ("", ""), + RecipeKind::Component(_) | RecipeKind::Simple => { + (Cow::Borrowed(""), Cow::Borrowed("")) + }, }; primary_slot_widget .with_tooltip( self.tooltip_manager, - tooltip_title, - tooltip_desc, + &tooltip_title, + &tooltip_desc, &tabs_tooltip, TEXT_COLOR, ) @@ -1050,13 +1052,13 @@ impl<'a> Widget for Crafting<'a> { self.localized_strings .get("hud.crafting.mod_comp_sec_slot_desc"), ), - RecipeKind::Simple => ("", ""), + RecipeKind::Simple => (Cow::Borrowed(""), Cow::Borrowed("")), }; secondary_slot_widget .with_tooltip( self.tooltip_manager, - tooltip_title, - tooltip_desc, + &tooltip_title, + &tooltip_desc, &tabs_tooltip, TEXT_COLOR, ) @@ -1211,7 +1213,7 @@ impl<'a> Widget for Crafting<'a> { == recipe.craft_sprite, ) } else { - Text::new(self.localized_strings.get("hud.crafting.modular_desc")) + Text::new(&self.localized_strings.get("hud.crafting.modular_desc")) .mid_top_with_margin_on(state.ids.modular_art, -18.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(13)) @@ -1306,7 +1308,7 @@ impl<'a> Widget for Crafting<'a> { }; icon.with_tooltip( self.tooltip_manager, - self.localized_strings.get(crafting_tab.name_key()), + &self.localized_strings.get(crafting_tab.name_key()), "", &tabs_tooltip, TEXT_COLOR, @@ -1343,7 +1345,7 @@ impl<'a> Widget for Crafting<'a> { .then_some(self.imgs.button_press) .unwrap_or(self.imgs.button), ) - .label(self.localized_strings.get("hud.crafting.craft")) + .label(&self.localized_strings.get("hud.crafting.craft")) .label_y(conrod_core::position::Relative::Scalar(1.0)) .label_color(can_perform.then_some(TEXT_COLOR).unwrap_or(TEXT_GRAY_COLOR)) .label_font_size(self.fonts.cyri.scale(12)) @@ -1382,7 +1384,8 @@ impl<'a> Widget for Crafting<'a> { // Crafting Station Info if recipe.craft_sprite.is_some() { Text::new( - self.localized_strings + &self + .localized_strings .get("hud.crafting.req_crafting_station"), ) .font_id(self.fonts.cyri.conrod_id) @@ -1433,7 +1436,7 @@ impl<'a> Widget for Crafting<'a> { Some(SpriteKind::DismantlingBench) => "hud.crafting.salvaging_station", _ => "", }; - Text::new(self.localized_strings.get(station_name)) + Text::new(&self.localized_strings.get(station_name)) .right_from(state.ids.req_station_img, 10.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) @@ -1495,7 +1498,7 @@ impl<'a> Widget for Crafting<'a> { let num_ingredients = ingredients.len(); if num_ingredients > 0 { - Text::new(self.localized_strings.get("hud.crafting.ingredients")) + Text::new(&self.localized_strings.get("hud.crafting.ingredients")) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(18)) .color(TEXT_COLOR) @@ -1691,7 +1694,7 @@ impl<'a> Widget for Crafting<'a> { } else { state.ids.ingredient_frame[i - 1] }; - Text::new(self.localized_strings.get("hud.crafting.tool_cata")) + Text::new(&self.localized_strings.get("hud.crafting.tool_cata")) .down_from(ref_widget, 20.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) @@ -1741,7 +1744,7 @@ impl<'a> Widget for Crafting<'a> { } } else if *sel_crafting_tab == CraftingTab::Dismantle { // Title - Text::new(self.localized_strings.get("hud.crafting.dismantle_title")) + Text::new(&self.localized_strings.get("hud.crafting.dismantle_title")) .mid_top_with_margin_on(state.ids.align_ing, 0.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(24)) @@ -1765,7 +1768,8 @@ impl<'a> Widget for Crafting<'a> { // Explanation Text::new( - self.localized_strings + &self + .localized_strings .get("hud.crafting.dismantle_explanation"), ) .mid_bottom_with_margin_on(state.ids.dismantle_img, -60.0) @@ -1807,7 +1811,7 @@ impl<'a> Widget for Crafting<'a> { events.push(Event::SearchRecipe(Some(string))); } } else { - Text::new(self.localized_strings.get("hud.crafting.recipes")) + Text::new(&self.localized_strings.get("hud.crafting.recipes")) .mid_top_with_margin_on(state.ids.align_rec, -22.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index d651756928..077c82c32a 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -436,7 +436,7 @@ impl<'a> Widget for Diary<'a> { } // Title - Text::new(self.localized_strings.get("hud.diary")) + Text::new(&self.localized_strings.get("hud.diary")) .mid_top_with_margin_on(state.ids.frame, 3.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(29)) @@ -634,7 +634,7 @@ impl<'a> Widget for Diary<'a> { let tooltip_txt = if locked { self.localized_strings.get("hud.skill.not_unlocked") } else { - "" + Cow::Borrowed("") }; let wpn_button = Button::image(border_image) @@ -646,7 +646,7 @@ impl<'a> Widget for Diary<'a> { .with_tooltip( self.tooltip_manager, skilltree_name, - tooltip_txt, + &tooltip_txt, &diary_tooltip, TEXT_COLOR, ) @@ -664,7 +664,6 @@ impl<'a> Widget for Diary<'a> { let rank_txt = format!("{}", rank); let exp_txt = format!("{}/{}", current_exp, max_exp); let available_pts = self.skill_set.available_sp(*sel_tab); - let available_pts_txt = format!("{}", available_pts); Image::new(self.imgs.diary_exp_bg) .w_h(480.0, 76.0) .mid_bottom_with_margin_on(state.ids.content_align, 10.0) @@ -711,12 +710,12 @@ impl<'a> Widget for Diary<'a> { .color(TEXT_COLOR) .set(state.ids.exp_bar_rank, ui); - Text::new( - &self - .localized_strings - .get("hud.skill.sp_available") - .replace("{number}", &available_pts_txt), - ) + Text::new(&self.localized_strings.get_msg_ctx( + "hud-skill-sp_available", + &i18n::fluent_args! { + "number" => available_pts, + }, + )) .mid_top_with_margin_on(state.ids.content_align, 700.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(28)) @@ -837,7 +836,10 @@ impl<'a> Widget for Diary<'a> { let (ability_title, ability_desc) = if let Some(ability_id) = ability_id { util::ability_description(ability_id, self.localized_strings) } else { - (Cow::Borrowed("Drag an ability here to use it."), "") + ( + Cow::Borrowed("Drag an ability here to use it."), + Cow::Borrowed(""), + ) }; let image_size = 80.0; @@ -860,7 +862,7 @@ impl<'a> Widget for Diary<'a> { .with_tooltip( self.tooltip_manager, &ability_title, - ability_desc, + &ability_desc, &diary_tooltip, TEXT_COLOR, ) @@ -1087,7 +1089,7 @@ impl<'a> Widget for Diary<'a> { .w(text_width) .graphics_for(state.ids.abilities[id_index]) .set(state.ids.ability_titles[id_index], ui); - Text::new(ability_desc) + Text::new(&ability_desc) .top_left_with_margins_on(state.ids.abilities[id_index], 40.0, 110.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(18)) @@ -1332,7 +1334,7 @@ impl<'a> Diary<'a> { ui: &mut UiCell, mut events: Vec, ) -> Vec { - let tree_title = self.localized_strings.get("common.weapons.general"); + let tree_title = &self.localized_strings.get("common.weapons.general"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) .font_id(self.fonts.cyri.conrod_id) @@ -1509,7 +1511,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.weapons.sword"); + let tree_title = &self.localized_strings.get("common.weapons.sword"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -1680,7 +1682,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.weapons.hammer"); + let tree_title = &self.localized_strings.get("common.weapons.hammer"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -1838,7 +1840,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.weapons.axe"); + let tree_title = &self.localized_strings.get("common.weapons.axe"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -1996,7 +1998,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.weapons.sceptre"); + let tree_title = &self.localized_strings.get("common.weapons.sceptre"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2148,7 +2150,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.weapons.bow"); + let tree_title = &self.localized_strings.get("common.weapons.bow"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2306,7 +2308,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.weapons.staff"); + let tree_title = &self.localized_strings.get("common.weapons.staff"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2453,7 +2455,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = self.localized_strings.get("common.tool.mining"); + let tree_title = &self.localized_strings.get("common.tool.mining"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2551,8 +2553,8 @@ impl<'a> Diary<'a> { .position(*position) .with_tooltip( self.tooltip_manager, - self.localized_strings.get(title), - self.localized_strings.get(desc), + &self.localized_strings.get(title), + &self.localized_strings.get(desc), diary_tooltip, TEXT_COLOR, ) @@ -2735,12 +2737,9 @@ impl<'a> Diary<'a> { Color::Rgba(0.41, 0.41, 0.41, 0.7) }; - let (title, description) = skill_strings(skill, self.localized_strings); - let description = if description.contains("{SP}") { - Cow::Owned(self.splice_skill_reqs(skill, &description)) - } else { - description - }; + let skill_strings = skill_strings(skill); + let (title, description) = + skill_strings.localize(self.localized_strings, self.skill_set, skill); let button = Button::image(skill_image) .w_h(74.0, 74.0) @@ -2754,7 +2753,7 @@ impl<'a> Diary<'a> { .image_color(image_color) .with_tooltip( self.tooltip_manager, - title, + &title, &description, diary_tooltip, TEXT_COLOR, @@ -2765,54 +2764,40 @@ impl<'a> Diary<'a> { events.push(Event::UnlockSkill(skill)); }; } - - fn splice_skill_reqs(&self, skill: Skill, desc: &str) -> String { - let current_level = self.skill_set.skill_level(skill); - if matches!(current_level, Ok(level) if level == skill.max_level()) { - desc.replace("{SP}", "") - } else { - let req_sp_text = self.localized_strings.get("hud.skill.req_sp"); - let skill_cost_text = self.skill_set.skill_cost(skill).to_string(); - desc.replace("{SP}", &req_sp_text.replace("{number}", &skill_cost_text)) - } - } } /// Returns skill info as a tuple of title and description. /// -/// Title is ready to use, description may include `"{SP}"` placeholder you -/// will want to handle yourself. -pub fn skill_strings(skill: Skill, i18n: &Localization) -> (&str, Cow) { +/// If you want to get localized version, use `SkillStrings::localize` method +fn skill_strings(skill: Skill) -> SkillStrings<'static> { match skill { // general tree - Skill::General(s) => general_skill_strings(s, i18n), - Skill::UnlockGroup(s) => unlock_skill_strings(s, i18n), + Skill::General(s) => general_skill_strings(s), + Skill::UnlockGroup(s) => unlock_skill_strings(s), // weapon trees - Skill::Sword(s) => sword_skill_strings(s, i18n), - Skill::Axe(s) => axe_skill_strings(s, i18n), - Skill::Hammer(s) => hammer_skill_strings(s, i18n), - Skill::Bow(s) => bow_skill_strings(s, i18n), - Skill::Staff(s) => staff_skill_strings(s, i18n), - Skill::Sceptre(s) => sceptre_skill_strings(s, i18n), + Skill::Sword(s) => sword_skill_strings(s), + Skill::Axe(s) => axe_skill_strings(s), + Skill::Hammer(s) => hammer_skill_strings(s), + Skill::Bow(s) => bow_skill_strings(s), + Skill::Staff(s) => staff_skill_strings(s), + Skill::Sceptre(s) => sceptre_skill_strings(s), // movement trees - Skill::Roll(s) => roll_skill_strings(s, i18n), - Skill::Climb(s) => climb_skill_strings(s, i18n), - Skill::Swim(s) => swim_skill_strings(s, i18n), + Skill::Roll(s) => roll_skill_strings(s), + Skill::Climb(s) => climb_skill_strings(s), + Skill::Swim(s) => swim_skill_strings(s), // mining - Skill::Pick(s) => mining_skill_strings(s, i18n), + Skill::Pick(s) => mining_skill_strings(s), } } -fn general_skill_strings(skill: GeneralSkill, i18n: &Localization) -> (&str, Cow) { +fn general_skill_strings(skill: GeneralSkill) -> SkillStrings<'static> { match skill { - GeneralSkill::HealthIncrease => splice_constant( - i18n, + GeneralSkill::HealthIncrease => SkillStrings::with_const( "hud.skill.inc_health_title", "hud.skill.inc_health", u32::from(HP_PER_LEVEL), ), - GeneralSkill::EnergyIncrease => splice_constant( - i18n, + GeneralSkill::EnergyIncrease => SkillStrings::with_const( "hud.skill.inc_energy_title", "hud.skill.inc_energy", u32::from(ENERGY_PER_LEVEL), @@ -2820,30 +2805,26 @@ fn general_skill_strings(skill: GeneralSkill, i18n: &Localization) -> (&str, Cow } } -fn unlock_skill_strings(group: SkillGroupKind, i18n: &Localization) -> (&str, Cow) { +fn unlock_skill_strings(group: SkillGroupKind) -> SkillStrings<'static> { match group { SkillGroupKind::Weapon(ToolKind::Sword) => { - localize(i18n, "hud.skill.unlck_sword_title", "hud.skill.unlck_sword") + SkillStrings::plain("hud.skill.unlck_sword_title", "hud.skill.unlck_sword") }, SkillGroupKind::Weapon(ToolKind::Axe) => { - localize(i18n, "hud.skill.unlck_axe_title", "hud.skill.unlck_axe") + SkillStrings::plain("hud.skill.unlck_axe_title", "hud.skill.unlck_axe") + }, + SkillGroupKind::Weapon(ToolKind::Hammer) => { + SkillStrings::plain("hud.skill.unlck_hammer_title", "hud.skill.unlck_hammer") }, - SkillGroupKind::Weapon(ToolKind::Hammer) => localize( - i18n, - "hud.skill.unlck_hammer_title", - "hud.skill.unlck_hammer", - ), SkillGroupKind::Weapon(ToolKind::Bow) => { - localize(i18n, "hud.skill.unlck_bow_title", "hud.skill.unlck_bow") + SkillStrings::plain("hud.skill.unlck_bow_title", "hud.skill.unlck_bow") }, SkillGroupKind::Weapon(ToolKind::Staff) => { - localize(i18n, "hud.skill.unlck_staff_title", "hud.skill.unlck_staff") + SkillStrings::plain("hud.skill.unlck_staff_title", "hud.skill.unlck_staff") + }, + SkillGroupKind::Weapon(ToolKind::Sceptre) => { + SkillStrings::plain("hud.skill.unlck_sceptre_title", "hud.skill.unlck_sceptre") }, - SkillGroupKind::Weapon(ToolKind::Sceptre) => localize( - i18n, - "hud.skill.unlck_sceptre_title", - "hud.skill.unlck_sceptre", - ), SkillGroupKind::General | SkillGroupKind::Weapon( ToolKind::Dagger @@ -2857,185 +2838,156 @@ fn unlock_skill_strings(group: SkillGroupKind, i18n: &Localization) -> (&str, Co | ToolKind::Empty, ) => { tracing::warn!("Requesting title for unlocking unexpected skill group"); - ("", Cow::Owned(String::new())) + SkillStrings::Empty }, } } -fn sword_skill_strings(skill: SwordSkill, i18n: &Localization) -> (&str, Cow) { +fn sword_skill_strings(skill: SwordSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.sword_tree; match skill { // triple strike - SwordSkill::TsCombo => localize( - i18n, + SwordSkill::TsCombo => SkillStrings::plain( "hud.skill.sw_trip_str_combo_title", "hud.skill.sw_trip_str_combo", ), - SwordSkill::TsDamage => localize( - i18n, + SwordSkill::TsDamage => SkillStrings::plain( "hud.skill.sw_trip_str_dmg_title", "hud.skill.sw_trip_str_dmg", ), - SwordSkill::TsSpeed => localize( - i18n, - "hud.skill.sw_trip_str_sp_title", - "hud.skill.sw_trip_str_sp", - ), - SwordSkill::TsRegen => localize( - i18n, + SwordSkill::TsSpeed => { + SkillStrings::plain("hud.skill.sw_trip_str_sp_title", "hud.skill.sw_trip_str_sp") + }, + SwordSkill::TsRegen => SkillStrings::plain( "hud.skill.sw_trip_str_reg_title", "hud.skill.sw_trip_str_reg", ), // dash - SwordSkill::DDamage => splice_multiplier( - i18n, + SwordSkill::DDamage => SkillStrings::with_mult( "hud.skill.sw_dash_dmg_title", "hud.skill.sw_dash_dmg", modifiers.dash.base_damage, ), - SwordSkill::DDrain => splice_multiplier( - i18n, + SwordSkill::DDrain => SkillStrings::with_mult( "hud.skill.sw_dash_drain_title", "hud.skill.sw_dash_drain", modifiers.dash.energy_drain, ), - SwordSkill::DCost => splice_multiplier( - i18n, + SwordSkill::DCost => SkillStrings::with_mult( "hud.skill.sw_dash_cost_title", "hud.skill.sw_dash_cost", modifiers.dash.energy_cost, ), - SwordSkill::DSpeed => splice_multiplier( - i18n, + SwordSkill::DSpeed => SkillStrings::with_mult( "hud.skill.sw_dash_speed_title", "hud.skill.sw_dash_speed", modifiers.dash.forward_speed, ), - SwordSkill::DChargeThrough => localize( - i18n, + SwordSkill::DChargeThrough => SkillStrings::plain( "hud.skill.sw_dash_charge_through_title", "hud.skill.sw_dash_charge_through", ), - SwordSkill::DScaling => splice_multiplier( - i18n, + SwordSkill::DScaling => SkillStrings::with_mult( "hud.skill.sw_dash_scale_title", "hud.skill.sw_dash_scale", modifiers.dash.scaled_damage, ), // spin - SwordSkill::UnlockSpin => localize(i18n, "hud.skill.sw_spin_title", "hud.skill.sw_spin"), - SwordSkill::SDamage => splice_multiplier( - i18n, + SwordSkill::UnlockSpin => { + SkillStrings::plain("hud.skill.sw_spin_title", "hud.skill.sw_spin") + }, + SwordSkill::SDamage => SkillStrings::with_mult( "hud.skill.sw_spin_dmg_title", "hud.skill.sw_spin_dmg", modifiers.spin.base_damage, ), - SwordSkill::SSpeed => splice_multiplier( - i18n, + SwordSkill::SSpeed => SkillStrings::with_mult( "hud.skill.sw_spin_spd_title", "hud.skill.sw_spin_spd", modifiers.spin.swing_duration, ), - SwordSkill::SCost => splice_multiplier( - i18n, + SwordSkill::SCost => SkillStrings::with_mult( "hud.skill.sw_spin_cost_title", "hud.skill.sw_spin_cost", modifiers.spin.energy_cost, ), - SwordSkill::SSpins => splice_constant( - i18n, + SwordSkill::SSpins => SkillStrings::with_const( "hud.skill.sw_spin_spins_title", "hud.skill.sw_spin_spins", modifiers.spin.num, ), // independent skills - SwordSkill::InterruptingAttacks => localize( - i18n, - "hud.skill.sw_interrupt_title", - "hud.skill.sw_interrupt", - ), + SwordSkill::InterruptingAttacks => { + SkillStrings::plain("hud.skill.sw_interrupt_title", "hud.skill.sw_interrupt") + }, } } -fn axe_skill_strings(skill: AxeSkill, i18n: &Localization) -> (&str, Cow) { +fn axe_skill_strings(skill: AxeSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.axe_tree; match skill { // Double strike upgrades - AxeSkill::DsCombo => localize( - i18n, + AxeSkill::DsCombo => SkillStrings::plain( "hud.skill.axe_double_strike_combo_title", "hud.skill.axe_double_strike_combo", ), - AxeSkill::DsDamage => localize( - i18n, + AxeSkill::DsDamage => SkillStrings::plain( "hud.skill.axe_double_strike_damage_title", "hud.skill.axe_double_strike_damage", ), - AxeSkill::DsSpeed => localize( - i18n, + AxeSkill::DsSpeed => SkillStrings::plain( "hud.skill.axe_double_strike_speed_title", "hud.skill.axe_double_strike_speed", ), - AxeSkill::DsRegen => localize( - i18n, + AxeSkill::DsRegen => SkillStrings::plain( "hud.skill.axe_double_strike_regen_title", "hud.skill.axe_double_strike_regen", ), // Spin upgrades - AxeSkill::SInfinite => localize( - i18n, + AxeSkill::SInfinite => SkillStrings::plain( "hud.skill.axe_infinite_axe_spin_title", "hud.skill.axe_infinite_axe_spin", ), - AxeSkill::SHelicopter => localize( - i18n, + AxeSkill::SHelicopter => SkillStrings::plain( "hud.skill.axe_spin_helicopter_title", "hud.skill.axe_spin_helicopter", ), - AxeSkill::SDamage => splice_multiplier( - i18n, + AxeSkill::SDamage => SkillStrings::with_mult( "hud.skill.axe_spin_damage_title", "hud.skill.axe_spin_damage", modifiers.spin.base_damage, ), - AxeSkill::SSpeed => splice_multiplier( - i18n, + AxeSkill::SSpeed => SkillStrings::with_mult( "hud.skill.axe_spin_speed_title", "hud.skill.axe_spin_speed", modifiers.spin.swing_duration, ), - AxeSkill::SCost => splice_multiplier( - i18n, + AxeSkill::SCost => SkillStrings::with_mult( "hud.skill.axe_spin_cost_title", "hud.skill.axe_spin_cost", modifiers.spin.energy_cost, ), // Leap upgrades - AxeSkill::UnlockLeap => localize( - i18n, + AxeSkill::UnlockLeap => SkillStrings::plain( "hud.skill.axe_unlock_leap_title", "hud.skill.axe_unlock_leap", ), - AxeSkill::LDamage => splice_multiplier( - i18n, + AxeSkill::LDamage => SkillStrings::with_mult( "hud.skill.axe_leap_damage_title", "hud.skill.axe_leap_damage", modifiers.leap.base_damage, ), - AxeSkill::LKnockback => splice_multiplier( - i18n, + AxeSkill::LKnockback => SkillStrings::with_mult( "hud.skill.axe_leap_knockback_title", "hud.skill.axe_leap_knockback", modifiers.leap.knockback, ), - AxeSkill::LCost => splice_multiplier( - i18n, + AxeSkill::LCost => SkillStrings::with_mult( "hud.skill.axe_leap_cost_title", "hud.skill.axe_leap_cost", modifiers.leap.energy_cost, ), - AxeSkill::LDistance => splice_multiplier( - i18n, + AxeSkill::LDistance => SkillStrings::with_mult( "hud.skill.axe_leap_distance_title", "hud.skill.axe_leap_distance", modifiers.leap.leap_strength, @@ -3043,182 +2995,153 @@ fn axe_skill_strings(skill: AxeSkill, i18n: &Localization) -> (&str, Cow) { } } -fn hammer_skill_strings(skill: HammerSkill, i18n: &Localization) -> (&str, Cow) { +fn hammer_skill_strings(skill: HammerSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.hammer_tree; // Single strike upgrades match skill { - HammerSkill::SsKnockback => splice_multiplier( - i18n, + HammerSkill::SsKnockback => SkillStrings::with_mult( "hud.skill.hmr_single_strike_knockback_title", "hud.skill.hmr_single_strike_knockback", modifiers.single_strike.knockback, ), - HammerSkill::SsDamage => localize( - i18n, + HammerSkill::SsDamage => SkillStrings::plain( "hud.skill.hmr_single_strike_damage_title", "hud.skill.hmr_single_strike_damage", ), - HammerSkill::SsSpeed => localize( - i18n, + HammerSkill::SsSpeed => SkillStrings::plain( "hud.skill.hmr_single_strike_speed_title", "hud.skill.hmr_single_strike_speed", ), - HammerSkill::SsRegen => localize( - i18n, + HammerSkill::SsRegen => SkillStrings::plain( "hud.skill.hmr_single_strike_regen_title", "hud.skill.hmr_single_strike_regen", ), // Charged melee upgrades - HammerSkill::CDamage => splice_multiplier( - i18n, + HammerSkill::CDamage => SkillStrings::with_mult( "hud.skill.hmr_charged_melee_damage_title", "hud.skill.hmr_charged_melee_damage", modifiers.charged.scaled_damage, ), - HammerSkill::CKnockback => splice_multiplier( - i18n, + HammerSkill::CKnockback => SkillStrings::with_mult( "hud.skill.hmr_charged_melee_knockback_title", "hud.skill.hmr_charged_melee_knockback", modifiers.charged.scaled_knockback, ), - HammerSkill::CDrain => splice_multiplier( - i18n, + HammerSkill::CDrain => SkillStrings::with_mult( "hud.skill.hmr_charged_melee_nrg_drain_title", "hud.skill.hmr_charged_melee_nrg_drain", modifiers.charged.energy_drain, ), - HammerSkill::CSpeed => splice_multiplier( - i18n, + HammerSkill::CSpeed => SkillStrings::with_mult( "hud.skill.hmr_charged_rate_title", "hud.skill.hmr_charged_rate", modifiers.charged.charge_rate, ), // Leap upgrades - HammerSkill::UnlockLeap => localize( - i18n, + HammerSkill::UnlockLeap => SkillStrings::plain( "hud.skill.hmr_unlock_leap_title", "hud.skill.hmr_unlock_leap", ), - HammerSkill::LDamage => splice_multiplier( - i18n, + HammerSkill::LDamage => SkillStrings::with_mult( "hud.skill.hmr_leap_damage_title", "hud.skill.hmr_leap_damage", modifiers.leap.base_damage, ), - HammerSkill::LCost => splice_multiplier( - i18n, + HammerSkill::LCost => SkillStrings::with_mult( "hud.skill.hmr_leap_cost_title", "hud.skill.hmr_leap_cost", modifiers.leap.energy_cost, ), - HammerSkill::LDistance => splice_multiplier( - i18n, + HammerSkill::LDistance => SkillStrings::with_mult( "hud.skill.hmr_leap_distance_title", "hud.skill.hmr_leap_distance", modifiers.leap.leap_strength, ), - HammerSkill::LKnockback => splice_multiplier( - i18n, + HammerSkill::LKnockback => SkillStrings::with_mult( "hud.skill.hmr_leap_knockback_title", "hud.skill.hmr_leap_knockback", modifiers.leap.knockback, ), - HammerSkill::LRange => { - let title = i18n.get("hud.skill.hmr_leap_radius_title"); - let desc = i18n.get("hud.skill.hmr_leap_radius"); - let desc = desc.replace("{boost}", &format!("{}", modifiers.leap.range)); - - (title, Cow::Owned(desc)) - }, + HammerSkill::LRange => SkillStrings::with_const_float( + "hud.skill.hmr_leap_radius_title", + "hud.skill.hmr_leap_radius", + modifiers.leap.range, + ), } } -fn bow_skill_strings(skill: BowSkill, i18n: &Localization) -> (&str, Cow) { +fn bow_skill_strings(skill: BowSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.bow_tree; match skill { // Passives - BowSkill::ProjSpeed => splice_multiplier( - i18n, + BowSkill::ProjSpeed => SkillStrings::with_mult( "hud.skill.bow_projectile_speed_title", "hud.skill.bow_projectile_speed", modifiers.universal.projectile_speed, ), // Charged upgrades - BowSkill::CDamage => splice_multiplier( - i18n, + BowSkill::CDamage => SkillStrings::with_mult( "hud.skill.bow_charged_damage_title", "hud.skill.bow_charged_damage", modifiers.charged.damage_scaling, ), - BowSkill::CRegen => splice_multiplier( - i18n, + BowSkill::CRegen => SkillStrings::with_mult( "hud.skill.bow_charged_energy_regen_title", "hud.skill.bow_charged_energy_regen", modifiers.charged.regen_scaling, ), - BowSkill::CKnockback => splice_multiplier( - i18n, + BowSkill::CKnockback => SkillStrings::with_mult( "hud.skill.bow_charged_knockback_title", "hud.skill.bow_charged_knockback", modifiers.charged.knockback_scaling, ), - BowSkill::CSpeed => splice_multiplier( - i18n, + BowSkill::CSpeed => SkillStrings::with_mult( "hud.skill.bow_charged_speed_title", "hud.skill.bow_charged_speed", modifiers.charged.charge_rate, ), - BowSkill::CMove => splice_multiplier( - i18n, + BowSkill::CMove => SkillStrings::with_mult( "hud.skill.bow_charged_move_title", "hud.skill.bow_charged_move", modifiers.charged.move_speed, ), // Repeater upgrades - BowSkill::RDamage => splice_multiplier( - i18n, + BowSkill::RDamage => SkillStrings::with_mult( "hud.skill.bow_repeater_damage_title", "hud.skill.bow_repeater_damage", modifiers.repeater.power, ), - BowSkill::RCost => splice_multiplier( - i18n, + BowSkill::RCost => SkillStrings::with_mult( "hud.skill.bow_repeater_cost_title", "hud.skill.bow_repeater_cost", modifiers.repeater.energy_cost, ), - BowSkill::RSpeed => splice_multiplier( - i18n, + BowSkill::RSpeed => SkillStrings::with_mult( "hud.skill.bow_repeater_speed_title", "hud.skill.bow_repeater_speed", modifiers.repeater.max_speed, ), // Shotgun upgrades - BowSkill::UnlockShotgun => localize( - i18n, + BowSkill::UnlockShotgun => SkillStrings::plain( "hud.skill.bow_shotgun_unlock_title", "hud.skill.bow_shotgun_unlock", ), - BowSkill::SDamage => splice_multiplier( - i18n, + BowSkill::SDamage => SkillStrings::with_mult( "hud.skill.bow_shotgun_damage_title", "hud.skill.bow_shotgun_damage", modifiers.shotgun.power, ), - BowSkill::SCost => splice_multiplier( - i18n, + BowSkill::SCost => SkillStrings::with_mult( "hud.skill.bow_shotgun_cost_title", "hud.skill.bow_shotgun_cost", modifiers.shotgun.energy_cost, ), - BowSkill::SArrows => splice_constant( - i18n, + BowSkill::SArrows => SkillStrings::with_const( "hud.skill.bow_shotgun_arrow_count_title", "hud.skill.bow_shotgun_arrow_count", modifiers.shotgun.num_projectiles, ), - BowSkill::SSpread => splice_multiplier( - i18n, + BowSkill::SSpread => SkillStrings::with_mult( "hud.skill.bow_shotgun_spread_title", "hud.skill.bow_shotgun_spread", modifiers.shotgun.spread, @@ -3226,79 +3149,67 @@ fn bow_skill_strings(skill: BowSkill, i18n: &Localization) -> (&str, Cow) { } } -fn staff_skill_strings(skill: StaffSkill, i18n: &Localization) -> (&str, Cow) { +fn staff_skill_strings(skill: StaffSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.staff_tree; match skill { // Basic ranged upgrades - StaffSkill::BDamage => splice_multiplier( - i18n, + StaffSkill::BDamage => SkillStrings::with_mult( "hud.skill.st_damage_title", "hud.skill.st_damage", modifiers.fireball.power, ), - StaffSkill::BRegen => splice_multiplier( - i18n, + StaffSkill::BRegen => SkillStrings::with_mult( "hud.skill.st_energy_regen_title", "hud.skill.st_energy_regen", modifiers.fireball.regen, ), - StaffSkill::BRadius => splice_multiplier( - i18n, + StaffSkill::BRadius => SkillStrings::with_mult( "hud.skill.st_explosion_radius_title", "hud.skill.st_explosion_radius", modifiers.fireball.range, ), // Flamethrower upgrades - StaffSkill::FDamage => splice_multiplier( - i18n, + StaffSkill::FDamage => SkillStrings::with_mult( "hud.skill.st_flamethrower_damage_title", "hud.skill.st_flamethrower_damage", modifiers.flamethrower.damage, ), - StaffSkill::FRange => splice_multiplier( - i18n, + StaffSkill::FRange => SkillStrings::with_mult( "hud.skill.st_flamethrower_range_title", "hud.skill.st_flamethrower_range", modifiers.flamethrower.range, ), - StaffSkill::FDrain => splice_multiplier( - i18n, + StaffSkill::FDrain => SkillStrings::with_mult( "hud.skill.st_energy_drain_title", "hud.skill.st_energy_drain", modifiers.flamethrower.energy_drain, ), - StaffSkill::FVelocity => splice_multiplier( - i18n, + StaffSkill::FVelocity => SkillStrings::with_mult( "hud.skill.st_flame_velocity_title", "hud.skill.st_flame_velocity", modifiers.flamethrower.velocity, ), // Shockwave upgrades - StaffSkill::UnlockShockwave => localize( - i18n, + StaffSkill::UnlockShockwave => SkillStrings::plain( "hud.skill.st_shockwave_unlock_title", "hud.skill.st_shockwave_unlock", ), - StaffSkill::SDamage => splice_multiplier( - i18n, + StaffSkill::SDamage => SkillStrings::with_mult( "hud.skill.st_shockwave_damage_title", "hud.skill.st_shockwave_damage", modifiers.shockwave.damage, ), - StaffSkill::SKnockback => splice_multiplier( - i18n, + StaffSkill::SKnockback => SkillStrings::with_mult( "hud.skill.st_shockwave_knockback_title", "hud.skill.st_shockwave_knockback", modifiers.shockwave.knockback, ), - StaffSkill::SRange => splice_multiplier( - i18n, + StaffSkill::SRange => SkillStrings::with_mult( "hud.skill.st_shockwave_range_title", "hud.skill.st_shockwave_range", modifiers.shockwave.duration, ), - StaffSkill::SCost => splice_multiplier( - i18n, + StaffSkill::SCost => SkillStrings::with_mult( "hud.skill.st_shockwave_cost_title", "hud.skill.st_shockwave_cost", modifiers.shockwave.energy_cost, @@ -3306,85 +3217,72 @@ fn staff_skill_strings(skill: StaffSkill, i18n: &Localization) -> (&str, Cow (&str, Cow) { +fn sceptre_skill_strings(skill: SceptreSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.sceptre_tree; match skill { // Lifesteal beam upgrades - SceptreSkill::LDamage => splice_multiplier( - i18n, + SceptreSkill::LDamage => SkillStrings::with_mult( "hud.skill.sc_lifesteal_damage_title", "hud.skill.sc_lifesteal_damage", modifiers.beam.damage, ), - SceptreSkill::LRange => splice_multiplier( - i18n, + SceptreSkill::LRange => SkillStrings::with_mult( "hud.skill.sc_lifesteal_range_title", "hud.skill.sc_lifesteal_range", modifiers.beam.range, ), - SceptreSkill::LLifesteal => splice_multiplier( - i18n, + SceptreSkill::LLifesteal => SkillStrings::with_mult( "hud.skill.sc_lifesteal_lifesteal_title", "hud.skill.sc_lifesteal_lifesteal", modifiers.beam.lifesteal, ), - SceptreSkill::LRegen => splice_multiplier( - i18n, + SceptreSkill::LRegen => SkillStrings::with_mult( "hud.skill.sc_lifesteal_regen_title", "hud.skill.sc_lifesteal_regen", modifiers.beam.energy_regen, ), // Healing aura upgrades - SceptreSkill::HHeal => splice_multiplier( - i18n, + SceptreSkill::HHeal => SkillStrings::with_mult( "hud.skill.sc_heal_heal_title", "hud.skill.sc_heal_heal", modifiers.healing_aura.strength, ), - SceptreSkill::HRange => splice_multiplier( - i18n, + SceptreSkill::HRange => SkillStrings::with_mult( "hud.skill.sc_heal_range_title", "hud.skill.sc_heal_range", modifiers.healing_aura.range, ), - SceptreSkill::HDuration => splice_multiplier( - i18n, + SceptreSkill::HDuration => SkillStrings::with_mult( "hud.skill.sc_heal_duration_title", "hud.skill.sc_heal_duration", modifiers.healing_aura.duration, ), - SceptreSkill::HCost => splice_multiplier( - i18n, + SceptreSkill::HCost => SkillStrings::with_mult( "hud.skill.sc_heal_cost_title", "hud.skill.sc_heal_cost", modifiers.healing_aura.energy_cost, ), // Warding aura upgrades - SceptreSkill::UnlockAura => localize( - i18n, + SceptreSkill::UnlockAura => SkillStrings::plain( "hud.skill.sc_wardaura_unlock_title", "hud.skill.sc_wardaura_unlock", ), - SceptreSkill::AStrength => splice_multiplier( - i18n, + SceptreSkill::AStrength => SkillStrings::with_mult( "hud.skill.sc_wardaura_strength_title", "hud.skill.sc_wardaura_strength", modifiers.warding_aura.strength, ), - SceptreSkill::ADuration => splice_multiplier( - i18n, + SceptreSkill::ADuration => SkillStrings::with_mult( "hud.skill.sc_wardaura_duration_title", "hud.skill.sc_wardaura_duration", modifiers.warding_aura.duration, ), - SceptreSkill::ARange => splice_multiplier( - i18n, + SceptreSkill::ARange => SkillStrings::with_mult( "hud.skill.sc_wardaura_range_title", "hud.skill.sc_wardaura_range", modifiers.warding_aura.range, ), - SceptreSkill::ACost => splice_multiplier( - i18n, + SceptreSkill::ACost => SkillStrings::with_mult( "hud.skill.sc_wardaura_cost_title", "hud.skill.sc_wardaura_cost", modifiers.warding_aura.energy_cost, @@ -3392,23 +3290,20 @@ fn sceptre_skill_strings(skill: SceptreSkill, i18n: &Localization) -> (&str, Cow } } -fn roll_skill_strings(skill: RollSkill, i18n: &Localization) -> (&str, Cow) { +fn roll_skill_strings(skill: RollSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.general_tree.roll; match skill { - RollSkill::Cost => splice_multiplier( - i18n, + RollSkill::Cost => SkillStrings::with_mult( "hud.skill.roll_energy_title", "hud.skill.roll_energy", modifiers.energy_cost, ), - RollSkill::Strength => splice_multiplier( - i18n, + RollSkill::Strength => SkillStrings::with_mult( "hud.skill.roll_speed_title", "hud.skill.roll_speed", modifiers.strength, ), - RollSkill::Duration => splice_multiplier( - i18n, + RollSkill::Duration => SkillStrings::with_mult( "hud.skill.roll_dur_title", "hud.skill.roll_dur", modifiers.duration, @@ -3416,17 +3311,15 @@ fn roll_skill_strings(skill: RollSkill, i18n: &Localization) -> (&str, Cow) } } -fn climb_skill_strings(skill: ClimbSkill, i18n: &Localization) -> (&str, Cow) { +fn climb_skill_strings(skill: ClimbSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.general_tree.climb; match skill { - ClimbSkill::Cost => splice_multiplier( - i18n, + ClimbSkill::Cost => SkillStrings::with_mult( "hud.skill.climbing_cost_title", "hud.skill.climbing_cost", modifiers.energy_cost, ), - ClimbSkill::Speed => splice_multiplier( - i18n, + ClimbSkill::Speed => SkillStrings::with_mult( "hud.skill.climbing_speed_title", "hud.skill.climbing_speed", modifiers.speed, @@ -3434,11 +3327,10 @@ fn climb_skill_strings(skill: ClimbSkill, i18n: &Localization) -> (&str, Cow (&str, Cow) { +fn swim_skill_strings(skill: SwimSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.general_tree.swim; match skill { - SwimSkill::Speed => splice_multiplier( - i18n, + SwimSkill::Speed => SkillStrings::with_mult( "hud.skill.swim_speed_title", "hud.skill.swim_speed", modifiers.speed, @@ -3446,23 +3338,20 @@ fn swim_skill_strings(skill: SwimSkill, i18n: &Localization) -> (&str, Cow) } } -fn mining_skill_strings(skill: MiningSkill, i18n: &Localization) -> (&str, Cow) { +fn mining_skill_strings(skill: MiningSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.mining_tree; match skill { - MiningSkill::Speed => splice_multiplier( - i18n, + MiningSkill::Speed => SkillStrings::with_mult( "hud.skill.pick_strike_speed_title", "hud.skill.pick_strike_speed", modifiers.speed, ), - MiningSkill::OreGain => splice_constant( - i18n, + MiningSkill::OreGain => SkillStrings::with_const( "hud.skill.pick_strike_oregain_title", "hud.skill.pick_strike_oregain", (modifiers.ore_gain * 100.0).round() as u32, ), - MiningSkill::GemGain => splice_constant( - i18n, + MiningSkill::GemGain => SkillStrings::with_const( "hud.skill.pick_strike_gemgain_title", "hud.skill.pick_strike_gemgain", (modifiers.gem_gain * 100.0).round() as u32, @@ -3470,50 +3359,130 @@ fn mining_skill_strings(skill: MiningSkill, i18n: &Localization) -> (&str, Cow( - i18n: &'loc Localization, - title: &'loc str, - desc: &str, - constant: u32, -) -> (&'loc str, Cow<'loc, str>) { - let title = i18n.get(title); - let desc = i18n.get(desc); - let desc = desc.replace("{boost}", &constant.to_string()); - - (title, Cow::Owned(desc)) +enum SkillStrings<'a> { + Plain { + title: &'a str, + desc: &'a str, + }, + WithConst { + title: &'a str, + desc: &'a str, + constant: u32, + }, + WithConstFloat { + title: &'a str, + desc: &'a str, + constant: f32, + }, + WithMult { + title: &'a str, + desc: &'a str, + multiplier: f32, + }, + Empty, } -/// Helper function which takes title i18n key and description i18n key -/// and returns localized title and localized description replacing "{boost}" -/// placeholder with absolute value of percentage effect of multiplier. -// TODO: do something better when we get to multimodifier skills -fn splice_multiplier<'loc>( - i18n: &'loc Localization, - title: &'loc str, - desc: &str, - multipler: f32, -) -> (&'loc str, Cow<'loc, str>) { - let percentage = hud::multiplier_to_percentage(multipler).abs(); +impl<'a> SkillStrings<'a> { + fn plain(title: &'a str, desc: &'a str) -> Self { Self::Plain { title, desc } } - let title = i18n.get(title); - let desc = i18n.get(desc); - let desc = desc.replace("{boost}", &format!("{:.0}", percentage)); + fn with_const(title: &'a str, desc: &'a str, constant: u32) -> Self { + Self::WithConst { + title, + desc, + constant, + } + } - (title, Cow::Owned(desc)) + fn with_const_float(title: &'a str, desc: &'a str, constant: f32) -> Self { + Self::WithConstFloat { + title, + desc, + constant, + } + } + + fn with_mult(title: &'a str, desc: &'a str, multiplier: f32) -> Self { + Self::WithMult { + title, + desc, + multiplier, + } + } + + fn localize<'loc>( + &self, + i18n: &'loc Localization, + skill_set: &SkillSet, + skill: Skill, + ) -> (Cow<'loc, str>, Cow<'loc, str>) { + match self { + Self::Plain { title, desc } => { + let title = i18n.get(title); + + let args = i18n::fluent_args! { + "SP" => sp(i18n, skill_set, skill), + }; + let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + + (title, desc) + }, + Self::WithConst { + title, + desc, + constant, + } => { + let title = i18n.get(title); + let args = i18n::fluent_args! { + "boost" => constant, + "SP" => sp(i18n, skill_set, skill), + }; + let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + + (title, desc) + }, + Self::WithConstFloat { + title, + desc, + constant, + } => { + let title = i18n.get(title); + let args = i18n::fluent_args! { + "boost" => constant, + "SP" => sp(i18n, skill_set, skill), + }; + let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + + (title, desc) + }, + Self::WithMult { + title, + desc, + multiplier, + } => { + let percentage = hud::multiplier_to_percentage(*multiplier).abs(); + + let title = i18n.get(title); + + let args = i18n::fluent_args! { + "boost" => percentage, + "SP" => sp(i18n, skill_set, skill), + }; + let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + + (title, desc) + }, + Self::Empty => (Cow::Borrowed(""), Cow::Borrowed("")), + } + } } -// Small helper function to get localized skill text. -fn localize<'loc>( - i18n: &'loc Localization, - title: &'loc str, - desc: &'loc str, -) -> (&'loc str, Cow<'loc, str>) { - let title = i18n.get(title); - let desc = i18n.get(desc); - - (title, Cow::Borrowed(desc)) +fn sp<'loc>(i18n: &'loc Localization, skill_set: &SkillSet, skill: Skill) -> Cow<'loc, str> { + let current_level = skill_set.skill_level(skill); + if matches!(current_level, Ok(level) if level == skill.max_level()) { + Cow::Borrowed("") + } else { + i18n.get_msg_ctx("hud-skill-req_sp", &i18n::fluent_args! { + "number" => skill_set.skill_cost(skill), + }) + } } diff --git a/voxygen/src/hud/esc_menu.rs b/voxygen/src/hud/esc_menu.rs index 92f989ad68..a72b432c83 100644 --- a/voxygen/src/hud/esc_menu.rs +++ b/voxygen/src/hud/esc_menu.rs @@ -87,7 +87,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("common.resume")) + .label(&self.localized_strings.get("common.resume")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -104,7 +104,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("common.settings")) + .label(&self.localized_strings.get("common.settings")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -120,7 +120,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("common.controls")) + .label(&self.localized_strings.get("common.controls")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -136,7 +136,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("common.characters")) + .label(&self.localized_strings.get("common.characters")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -152,7 +152,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("esc_menu.logout")) + .label(&self.localized_strings.get("esc_menu.logout")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -168,7 +168,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("esc_menu.quit_game")) + .label(&self.localized_strings.get("esc_menu.quit_game")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) diff --git a/voxygen/src/hud/group.rs b/voxygen/src/hud/group.rs index ca9b4f99f7..51371d6327 100644 --- a/voxygen/src/hud/group.rs +++ b/voxygen/src/hud/group.rs @@ -428,7 +428,7 @@ impl<'a> Widget for Group<'a> { } if health.is_dead { // Death Text - Text::new(self.localized_strings.get("hud.group.dead")) + Text::new(&self.localized_strings.get("hud.group.dead")) .mid_top_with_margin_on(state.ids.member_panels_bg[i], 1.0) .font_size(20) .font_id(self.fonts.cyri.conrod_id) @@ -575,7 +575,7 @@ impl<'a> Widget for Group<'a> { .middle_of(id) .with_tooltip( self.tooltip_manager, - title, + &title, &desc, &buffs_tooltip, if buff.is_buff { @@ -611,7 +611,7 @@ impl<'a> Widget for Group<'a> { .color(Some(UI_HIGHLIGHT_0)) .set(state.ids.member_panels_frame[i], ui); // Panel Text - Text::new(self.localized_strings.get("hud.group.out_of_range")) + Text::new(&self.localized_strings.get("hud.group.out_of_range")) .mid_top_with_margin_on(state.ids.member_panels_bg[i], 3.0) .font_size(16) .font_id(self.fonts.cyri.conrod_id) @@ -630,7 +630,7 @@ impl<'a> Widget for Group<'a> { .press_image(self.imgs.button) .label_color(TEXT_COLOR_GREY) .image_color(TEXT_COLOR_GREY) - .label(self.localized_strings.get("hud.group.add_friend")) + .label(&self.localized_strings.get("hud.group.add_friend")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(10)) .set(state.ids.btn_friend, ui) @@ -641,7 +641,7 @@ impl<'a> Widget for Group<'a> { .bottom_right_with_margins_on(state.ids.bg, 5.0, 5.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("hud.group.leave")) + .label(&self.localized_strings.get("hud.group.leave")) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(10)) @@ -659,7 +659,7 @@ impl<'a> Widget for Group<'a> { .mid_bottom_with_margin_on(state.ids.btn_friend, -27.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("hud.group.assign_leader")) + .label(&self.localized_strings.get("hud.group.assign_leader")) .label_color(if state.selected_member.is_some() { TEXT_COLOR } else { @@ -682,7 +682,7 @@ impl<'a> Widget for Group<'a> { .mid_bottom_with_margin_on(state.ids.btn_leader, -27.0) .hover_image(self.imgs.button) .press_image(self.imgs.button) - .label(self.localized_strings.get("hud.group.link_group")) + .label(&self.localized_strings.get("hud.group.link_group")) .hover_image(self.imgs.button) .press_image(self.imgs.button) .label_color(TEXT_COLOR_GREY) @@ -698,7 +698,7 @@ impl<'a> Widget for Group<'a> { .down_from(state.ids.btn_link, 5.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(self.localized_strings.get("hud.group.kick")) + .label(&self.localized_strings.get("hud.group.kick")) .label_color(if state.selected_member.is_some() { TEXT_COLOR } else { @@ -792,14 +792,18 @@ impl<'a> Widget for Group<'a> { let name = uid_to_name_text(invite_uid, self.client); let invite_text = match kind { - InviteKind::Group => self - .localized_strings - .get("hud.group.invite_to_join") - .replace("{name}", &name), - InviteKind::Trade => self - .localized_strings - .get("hud.group.invite_to_trade") - .replace("{name}", &name), + InviteKind::Group => self.localized_strings.get_msg_ctx( + "hud-group-invite_to_join", + &i18n::fluent_args! { + "name" => name, + }, + ), + InviteKind::Trade => self.localized_strings.get_msg_ctx( + "hud-group-invite_to_trade", + &i18n::fluent_args! { + "name" => &name, + }, + ), }; Text::new(&invite_text) .mid_top_with_margin_on(state.ids.bg, 5.0) diff --git a/voxygen/src/hud/map.rs b/voxygen/src/hud/map.rs index 3618dfd864..6a292718dc 100644 --- a/voxygen/src/hud/map.rs +++ b/voxygen/src/hud/map.rs @@ -22,6 +22,7 @@ use conrod_core::{ }; use i18n::Localization; use specs::{saveload::MarkerAllocator, WorldExt}; +use std::borrow::Cow; use vek::*; use winit::event::MouseButton; @@ -277,7 +278,7 @@ impl<'a> Widget for Map<'a> { .set(state.ids.icon, ui); // Map Title - Text::new(i18n.get("hud.map.map_title")) + Text::new(&i18n.get("hud.map.map_title")) .mid_top_with_margin_on(state.ids.frame, 3.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(29)) @@ -285,7 +286,7 @@ impl<'a> Widget for Map<'a> { .set(state.ids.map_title, ui); // Questlog Title - Text::new(i18n.get("hud.map.qlog_title")) + Text::new(&i18n.get("hud.map.qlog_title")) .mid_top_with_margin_on(state.ids.qlog_align, 6.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(21)) @@ -505,7 +506,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowDifficulty(!show_difficulty))); } - Text::new(i18n.get("hud.map.difficulty")) + Text::new(&i18n.get("hud.map.difficulty")) .right_from(state.ids.show_difficulty_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -539,7 +540,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowTowns(!show_towns))); } - Text::new(i18n.get("hud.map.towns")) + Text::new(&i18n.get("hud.map.towns")) .right_from(state.ids.show_towns_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -573,7 +574,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowCastles(!show_castles))); } - Text::new(i18n.get("hud.map.castles")) + Text::new(&i18n.get("hud.map.castles")) .right_from(state.ids.show_castles_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -607,7 +608,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowDungeons(!show_dungeons))); } - Text::new(i18n.get("hud.map.dungeons")) + Text::new(&i18n.get("hud.map.dungeons")) .right_from(state.ids.show_dungeons_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -641,7 +642,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowCaves(!show_caves))); } - Text::new(i18n.get("hud.map.caves")) + Text::new(&i18n.get("hud.map.caves")) .right_from(state.ids.show_caves_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -675,7 +676,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowTrees(!show_trees))); } - Text::new(i18n.get("hud.map.trees")) + Text::new(&i18n.get("hud.map.trees")) .right_from(state.ids.show_trees_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -709,7 +710,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowBiomes(!show_biomes))); } - Text::new(i18n.get("hud.map.biomes")) + Text::new(&i18n.get("hud.map.biomes")) .right_from(state.ids.show_biomes_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -743,7 +744,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowPeaks(!show_peaks))); } - Text::new(i18n.get("hud.map.peaks")) + Text::new(&i18n.get("hud.map.peaks")) .right_from(state.ids.show_peaks_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -780,7 +781,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowVoxelMap(!show_voxel_map))); } - Text::new(i18n.get("hud.map.voxel_map")) + Text::new(&i18n.get("hud.map.voxel_map")) .right_from(state.ids.show_voxel_map_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -866,37 +867,43 @@ impl<'a> Widget for Map<'a> { None => continue, }; - let title = site.name.as_deref().unwrap_or_else(|| match &site.kind { - SiteKind::Town => i18n.get("hud.map.town"), - SiteKind::Dungeon { .. } => i18n.get("hud.map.dungeon"), - SiteKind::Castle => i18n.get("hud.map.castle"), - SiteKind::Cave => i18n.get("hud.map.cave"), - SiteKind::Tree => i18n.get("hud.map.tree"), - SiteKind::Gnarling => i18n.get("hud.map.gnarling"), - }); + let title = + site.name + .as_deref() + .map(Cow::Borrowed) + .unwrap_or_else(|| match &site.kind { + SiteKind::Town => i18n.get("hud.map.town"), + SiteKind::Dungeon { .. } => i18n.get("hud.map.dungeon"), + SiteKind::Castle => i18n.get("hud.map.castle"), + SiteKind::Cave => i18n.get("hud.map.cave"), + SiteKind::Tree => i18n.get("hud.map.tree"), + SiteKind::Gnarling => i18n.get("hud.map.gnarling"), + }); let (difficulty, desc) = match &site.kind { - SiteKind::Town => (None, i18n.get("hud.map.town").to_string()), + SiteKind::Town => (None, i18n.get("hud.map.town")), SiteKind::Dungeon { difficulty } => { if *difficulty < 5 { ( Some(*difficulty), - i18n.get("hud.map.difficulty_dungeon") - .replace("{difficulty}", (difficulty + 1).to_string().as_str()), + i18n.get_msg_ctx("hud-map-difficulty_dungeon", &i18n::fluent_args! { + "difficulty" => difficulty + 1 + }), ) } else { ( Some(*difficulty), - i18n.get("hud.map.difficulty_dungeon") - .replace("{difficulty}", (difficulty).to_string().as_str()), + i18n.get_msg_ctx("hud-map-difficulty_dungeon", &i18n::fluent_args! { + "difficulty" => difficulty + }), ) } }, - SiteKind::Castle => (None, i18n.get("hud.map.castle").to_string()), - SiteKind::Cave => (None, i18n.get("hud.map.cave").to_string()), - SiteKind::Tree => (None, i18n.get("hud.map.tree").to_string()), - SiteKind::Gnarling => (Some(0), i18n.get("hud.map.gnarling").to_string()), + SiteKind::Castle => (None, i18n.get("hud.map.castle")), + SiteKind::Cave => (None, i18n.get("hud.map.cave")), + SiteKind::Tree => (None, i18n.get("hud.map.tree")), + SiteKind::Gnarling => (Some(0), i18n.get("hud.map.gnarling")), }; - let desc = desc + &get_site_economy(site_rich); + let desc = desc.into_owned() + &get_site_economy(site_rich); let site_btn = Button::image(match &site.kind { SiteKind::Town => self.imgs.mmap_site_town, SiteKind::Castle => self.imgs.mmap_site_castle, @@ -930,7 +937,7 @@ impl<'a> Widget for Map<'a> { .image_color(UI_HIGHLIGHT_0.alpha(fade)) .with_tooltip( self.tooltip_manager, - title, + &title, &desc, &site_tooltip, match &site.kind { @@ -1267,12 +1274,14 @@ impl<'a> Widget for Map<'a> { .floating(true) .with_tooltip( self.tooltip_manager, - i18n.get("hud.map.marked_location"), + &i18n.get("hud.map.marked_location"), &format!( "X: {}, Y: {}\n\n{}", lm.x as i32, lm.y as i32, - i18n.get("hud.map.placed_by").replace("{name}", name), + i18n.get_msg_ctx("hud-map-placed_by", &i18n::fluent_args! { + "name" => name + }), ), &site_tooltip, TEXT_VELORITE, @@ -1307,7 +1316,7 @@ impl<'a> Widget for Map<'a> { .floating(true) .with_tooltip( self.tooltip_manager, - i18n.get("hud.map.marked_location"), + &i18n.get("hud.map.marked_location"), &format!( "X: {}, Y: {}\n\n{}", lm.x as i32, @@ -1380,7 +1389,7 @@ impl<'a> Widget for Map<'a> { } else { self.imgs.button }) - .label(i18n.get("hud.map.recenter")) + .label(&i18n.get("hud.map.recenter")) .label_y(position::Relative::Scalar(1.0)) .label_color(if recenter { TEXT_COLOR @@ -1405,7 +1414,7 @@ impl<'a> Widget for Map<'a> { .w_h(icon_size.x, icon_size.y) .color(Some(UI_HIGHLIGHT_0)) .set(state.ids.drag_ico, ui); - Text::new(i18n.get("hud.map.drag")) + Text::new(&i18n.get("hud.map.drag")) .right_from(state.ids.drag_ico, 5.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1417,7 +1426,7 @@ impl<'a> Widget for Map<'a> { .w_h(icon_size.x, icon_size.y) .color(Some(UI_HIGHLIGHT_0)) .set(state.ids.zoom_ico, ui); - Text::new(i18n.get("hud.map.zoom")) + Text::new(&i18n.get("hud.map.zoom")) .right_from(state.ids.zoom_ico, 5.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1433,7 +1442,7 @@ impl<'a> Widget for Map<'a> { .color(TEXT_COLOR) .set(state.ids.waypoint_binding_txt, ui); - Text::new(i18n.get("hud.map.mid_click")) + Text::new(&i18n.get("hud.map.mid_click")) .right_from(state.ids.waypoint_binding_txt, 5.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1449,7 +1458,7 @@ impl<'a> Widget for Map<'a> { .bottom_right_with_margins_on(state.ids.map_layers[0], -36.0, 0.0) .with_tooltip( self.tooltip_manager, - i18n.get("hud.map.change_map_mode"), + &i18n.get("hud.map.change_map_mode"), "", &site_tooltip, TEXT_COLOR, @@ -1473,8 +1482,8 @@ impl<'a> Widget for Map<'a> { .left_from(state.ids.map_mode_btn, 5.0) .with_tooltip( self.tooltip_manager, - i18n.get("hud.map.toggle_minimap_voxel"), - i18n.get("hud.map.zoom_minimap_explanation"), + &i18n.get("hud.map.toggle_minimap_voxel"), + &i18n.get("hud.map.zoom_minimap_explanation"), &site_tooltip, TEXT_COLOR, ) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 3d51f3e6af..6bd6fda823 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1555,10 +1555,11 @@ impl Hud { if floater.exp_change > 0 { let xp_pool = &floater.xp_pools; - // Don't show 0 Exp - let exp_string = &i18n - .get("hud.sct.experience") - .replace("{amount}", &floater.exp_change.max(1).to_string()); + let exp_string = + &i18n.get_msg_ctx("hud-sct-experience", &i18n::fluent_args! { + // Don't show 0 Exp + "amount" => &floater.exp_change.max(1), + }); Text::new(exp_string) .font_size(font_size_xp) .font_id(self.fonts.cyri.conrod_id) @@ -1636,13 +1637,13 @@ impl Hud { .mid_top_with_margin_on(self.ids.player_rank_up, fontsize.1) .set(self.ids.player_rank_up_txt_number, ui_widgets); // Static "New Rank!" text - Text::new(i18n.get("hud.rank_up")) + Text::new(&i18n.get("hud.rank_up")) .font_size(40) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, fade)) .mid_bottom_with_margin_on(self.ids.player_rank_up, 20.0) .set(self.ids.player_rank_up_txt_0_bg, ui_widgets); - Text::new(i18n.get("hud.rank_up")) + Text::new(&i18n.get("hud.rank_up")) .font_size(40) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(1.0, 1.0, 1.0, fade)) @@ -1658,15 +1659,15 @@ impl Hud { Weapon(ToolKind::Bow) => i18n.get("common.weapons.bow"), Weapon(ToolKind::Staff) => i18n.get("common.weapons.staff"), Weapon(ToolKind::Pick) => i18n.get("common.tool.mining"), - _ => "Unknown", + _ => Cow::Borrowed("Unknown"), }; - Text::new(skill) + Text::new(&skill) .font_size(20) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, fade)) .mid_top_with_margin_on(self.ids.player_rank_up, 45.0) .set(self.ids.player_rank_up_txt_1_bg, ui_widgets); - Text::new(skill) + Text::new(&skill) .font_size(20) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(1.0, 1.0, 1.0, fade)) @@ -1716,7 +1717,7 @@ impl Hud { 1.0 }; - Text::new(i18n.get("hud.sct.block")) + Text::new(&i18n.get("hud.sct.block")) .font_size(font_size) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, fade)) @@ -1725,7 +1726,7 @@ impl Hud { ui_widgets.win_h * (-0.3) + y - 3.0, ) .set(player_sct_bg_id, ui_widgets); - Text::new(i18n.get("hud.sct.block")) + Text::new(&i18n.get("hud.sct.block")) .font_size(font_size) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.69, 0.82, 0.88, fade)) @@ -1924,7 +1925,7 @@ impl Hud { let over_pos = pos + Vec3::unit_z() * 1.5; overitem::Overitem::new( - i18n.get("hud.crafting.campfire").into(), + i18n.get("hud.crafting.campfire"), overitem::TEXT_COLOR, pos.distance_squared(player_pos), &self.fonts, @@ -2550,11 +2551,12 @@ impl Hud { if global_state.settings.interface.toggle_hotkey_hints { // Help Window if let Some(help_key) = global_state.settings.controls.get_binding(GameInput::Help) { - Text::new( - &i18n - .get("hud.press_key_to_show_keybindings_fmt") - .replace("{key}", help_key.display_string(key_layout).as_str()), - ) + Text::new(&i18n.get_msg_ctx( + "hud-press_key_to_show_keybindings_fmt", + &i18n::fluent_args! { + "key" => help_key.display_string(key_layout), + }, + )) .color(TEXT_COLOR) .bottom_left_with_margins_on(ui_widgets.window, 210.0, 10.0) .font_id(self.fonts.cyri.conrod_id) @@ -2567,9 +2569,11 @@ impl Hud { .controls .get_binding(GameInput::ToggleLantern) { - Text::new(&i18n.get("hud.press_key_to_toggle_lantern_fmt").replace( - "{key}", - toggle_lantern_key.display_string(key_layout).as_str(), + Text::new(&i18n.get_msg_ctx( + "hud-press_key_to_toggle_lantern_fmt", + &i18n::fluent_args! { + "key" => toggle_lantern_key.display_string(key_layout), + }, )) .color(TEXT_COLOR) .up_from(self.ids.help_info, 2.0) @@ -3289,9 +3293,9 @@ impl Hud { .get_binding(GameInput::FreeLook) { if self.show.free_look { - let msg = i18n - .get("hud.free_look_indicator") - .replace("{key}", freelook_key.display_string(key_layout).as_str()); + let msg = i18n.get_msg_ctx("hud-free_look_indicator", &i18n::fluent_args! { + "key" => freelook_key.display_string(key_layout), + }); Text::new(&msg) .color(TEXT_BG) .mid_top_with_margin_on(ui_widgets.window, indicator_offset) @@ -3310,14 +3314,14 @@ impl Hud { // Auto walk indicator if self.show.auto_walk { - Text::new(i18n.get("hud.auto_walk_indicator")) + Text::new(&i18n.get("hud.auto_walk_indicator")) .color(TEXT_BG) .mid_top_with_margin_on(ui_widgets.window, indicator_offset) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) .set(self.ids.auto_walk_bg, ui_widgets); indicator_offset += 30.0; - Text::new(i18n.get("hud.auto_walk_indicator")) + Text::new(&i18n.get("hud.auto_walk_indicator")) .color(KILL_COLOR) .top_left_with_margins_on(self.ids.auto_walk_bg, -1.0, -1.0) .font_id(self.fonts.cyri.conrod_id) @@ -3332,9 +3336,9 @@ impl Hud { .get_binding(GameInput::CameraClamp) { if self.show.camera_clamp { - let msg = i18n - .get("hud.camera_clamp_indicator") - .replace("{key}", cameraclamp_key.display_string(key_layout).as_str()); + let msg = i18n.get_msg_ctx("hud-camera_clamp_indicator", &i18n::fluent_args! { + "key" => cameraclamp_key.display_string(key_layout), + }); Text::new(&msg) .color(TEXT_BG) .mid_top_with_margin_on(ui_widgets.window, indicator_offset) @@ -3767,7 +3771,7 @@ impl Hud { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .bottom_left_with_margins_on(ui_widgets.window, 350.0, 150.0) - .label(i18n.get("hud.tutorial_btn")) + .label(&i18n.get("hud.tutorial_btn")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(18)) .label_color(TEXT_COLOR) @@ -3824,27 +3828,27 @@ impl Hud { .middle_of(ui_widgets.window) .set(self.ids.quest_bg, ui_widgets); - Text::new(quest_headline) + Text::new(&quest_headline) .mid_top_with_margin_on(self.ids.quest_bg, 310.0) .font_size(self.fonts.cyri.scale(30)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_BG) .set(self.ids.q_headline_bg, ui_widgets); - Text::new(quest_headline) + Text::new(&quest_headline) .bottom_left_with_margins_on(self.ids.q_headline_bg, 1.0, 1.0) .font_size(self.fonts.cyri.scale(30)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(self.ids.q_headline, ui_widgets); - Text::new(quest_text) + Text::new(&quest_text) .mid_top_with_margin_on(self.ids.quest_bg, 360.0) .w(350.0) .font_size(self.fonts.cyri.scale(17)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_BG) .set(self.ids.q_text_bg, ui_widgets); - Text::new(quest_text) + Text::new(&quest_text) .bottom_left_with_margins_on(self.ids.q_text_bg, 1.0, 1.0) .w(350.0) .font_size(self.fonts.cyri.scale(17)) @@ -3857,7 +3861,7 @@ impl Hud { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .mid_bottom_with_margin_on(self.ids.q_text_bg, -80.0) - .label(i18n.get("common.close")) + .label(&i18n.get("common.close")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(22)) .label_color(TEXT_COLOR) @@ -3881,14 +3885,14 @@ impl Hud { ) .color(Some(QUALITY_LEGENDARY)) .set(self.ids.tut_arrow, ui_widgets); - Text::new(i18n.get("hud.tutorial_elements")) + Text::new(&i18n.get("hud.tutorial_elements")) .mid_top_with_margin_on(self.ids.tut_arrow, -50.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(40)) .color(BLACK) .floating(true) .set(self.ids.tut_arrow_txt_bg, ui_widgets); - Text::new(i18n.get("hud.tutorial_elements")) + Text::new(&i18n.get("hud.tutorial_elements")) .bottom_right_with_margins_on(self.ids.tut_arrow_txt_bg, 1.0, 1.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(40)) @@ -4587,7 +4591,7 @@ pub fn get_buff_image(buff: BuffKind, imgs: &Imgs) -> conrod_core::image::Id { } } -pub fn get_buff_title(buff: BuffKind, localized_strings: &Localization) -> &str { +pub fn get_buff_title(buff: BuffKind, localized_strings: &Localization) -> Cow { match buff { // Buffs BuffKind::Regeneration { .. } => localized_strings.get("buff.title.heal"), @@ -4615,37 +4619,29 @@ pub fn get_buff_title(buff: BuffKind, localized_strings: &Localization) -> &str pub fn get_buff_desc(buff: BuffKind, data: BuffData, localized_strings: &Localization) -> Cow { match buff { // Buffs - BuffKind::Regeneration { .. } => Cow::Borrowed(localized_strings.get("buff.desc.heal")), - BuffKind::Saturation { .. } => Cow::Borrowed(localized_strings.get("buff.desc.saturation")), - BuffKind::Potion { .. } => Cow::Borrowed(localized_strings.get("buff.desc.potion")), - BuffKind::CampfireHeal { .. } => Cow::Owned( - localized_strings - .get("buff.desc.campfire_heal") - .replace("{rate}", &format!("{:.0}", data.strength * 100.0)), - ), - BuffKind::IncreaseMaxHealth { .. } => { - Cow::Borrowed(localized_strings.get("buff.desc.IncreaseMaxHealth")) + BuffKind::Regeneration { .. } => localized_strings.get("buff.desc.heal"), + BuffKind::Saturation { .. } => localized_strings.get("buff.desc.saturation"), + BuffKind::Potion { .. } => localized_strings.get("buff.desc.potion"), + BuffKind::CampfireHeal { .. } => { + localized_strings.get_msg_ctx("buff-desc-campfire_heal", &i18n::fluent_args! { + "rate" => data.strength * 100.0 + }) }, - BuffKind::IncreaseMaxEnergy { .. } => { - Cow::Borrowed(localized_strings.get("buff.desc.IncreaseMaxEnergy")) - }, - BuffKind::Invulnerability => { - Cow::Borrowed(localized_strings.get("buff.desc.invulnerability")) - }, - BuffKind::ProtectingWard => { - Cow::Borrowed(localized_strings.get("buff.desc.protectingward")) - }, - BuffKind::Frenzied => Cow::Borrowed(localized_strings.get("buff.desc.frenzied")), - BuffKind::Hastened => Cow::Borrowed(localized_strings.get("buff.desc.hastened")), + BuffKind::IncreaseMaxHealth { .. } => localized_strings.get("buff.desc.IncreaseMaxHealth"), + BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get("buff.desc.IncreaseMaxEnergy"), + BuffKind::Invulnerability => localized_strings.get("buff.desc.invulnerability"), + BuffKind::ProtectingWard => localized_strings.get("buff.desc.protectingward"), + BuffKind::Frenzied => localized_strings.get("buff.desc.frenzied"), + BuffKind::Hastened => localized_strings.get("buff.desc.hastened"), // Debuffs - BuffKind::Bleeding { .. } => Cow::Borrowed(localized_strings.get("buff.desc.bleed")), - BuffKind::Cursed { .. } => Cow::Borrowed(localized_strings.get("buff.desc.cursed")), - BuffKind::Burning { .. } => Cow::Borrowed(localized_strings.get("buff.desc.burn")), - BuffKind::Crippled { .. } => Cow::Borrowed(localized_strings.get("buff.desc.crippled")), - BuffKind::Frozen { .. } => Cow::Borrowed(localized_strings.get("buff.desc.frozen")), - BuffKind::Wet { .. } => Cow::Borrowed(localized_strings.get("buff.desc.wet")), - BuffKind::Ensnared { .. } => Cow::Borrowed(localized_strings.get("buff.desc.ensnared")), - BuffKind::Poisoned { .. } => Cow::Borrowed(localized_strings.get("buff.desc.poisoned")), + BuffKind::Bleeding { .. } => localized_strings.get("buff.desc.bleed"), + BuffKind::Cursed { .. } => localized_strings.get("buff.desc.cursed"), + BuffKind::Burning { .. } => localized_strings.get("buff.desc.burn"), + BuffKind::Crippled { .. } => localized_strings.get("buff.desc.crippled"), + BuffKind::Frozen { .. } => localized_strings.get("buff.desc.frozen"), + BuffKind::Wet { .. } => localized_strings.get("buff.desc.wet"), + BuffKind::Ensnared { .. } => localized_strings.get("buff.desc.ensnared"), + BuffKind::Poisoned { .. } => localized_strings.get("buff.desc.poisoned"), } } @@ -4671,7 +4667,7 @@ pub fn get_sprite_desc(sprite: SpriteKind, localized_strings: &Localization) -> | SpriteKind::DungeonChest5 => "common.sprite.chest", sprite => return Some(Cow::Owned(format!("{:?}", sprite))), }; - Some(Cow::Borrowed(localized_strings.get(i18n_key))) + Some(localized_strings.get(i18n_key)) } pub fn get_buff_time(buff: BuffInfo) -> String { diff --git a/voxygen/src/hud/overitem.rs b/voxygen/src/hud/overitem.rs index 107ad72c31..25f0463a1d 100644 --- a/voxygen/src/hud/overitem.rs +++ b/voxygen/src/hud/overitem.rs @@ -230,22 +230,21 @@ impl<'a> Widget for Overitem<'a> { let text = match collect_failed_data.reason { HudCollectFailedReason::InventoryFull => { - self.localized_strings.get("hud.inventory_full").to_string() + self.localized_strings.get("hud.inventory_full") }, HudCollectFailedReason::LootOwned { owner, expiry_secs } => { let owner_name = match owner { - HudLootOwner::Name(name) => name, - HudLootOwner::Group => { - self.localized_strings.get("hud.another_group").to_string() - }, - HudLootOwner::Unknown => { - self.localized_strings.get("hud.someone_else").to_string() - }, + HudLootOwner::Name(name) => Cow::Owned(name), + HudLootOwner::Group => self.localized_strings.get("hud.another_group"), + HudLootOwner::Unknown => self.localized_strings.get("hud.someone_else"), }; - self.localized_strings - .get("hud.owned_by_for_secs") - .replace("{name}", &owner_name) - .replace("{secs}", format!("{}", expiry_secs).as_str()) + self.localized_strings.get_msg_ctx( + "hud-owned_by_for_secs", + &i18n::fluent_args! { + "name" => owner_name, + "secs" => expiry_secs, + }, + ) }, }; diff --git a/voxygen/src/hud/settings_window/chat.rs b/voxygen/src/hud/settings_window/chat.rs index a03c777163..f03d8c3b69 100644 --- a/voxygen/src/hud/settings_window/chat.rs +++ b/voxygen/src/hud/settings_window/chat.rs @@ -141,7 +141,7 @@ impl<'a> Widget for Chat<'a> { .set(state.ids.window_r, ui); // General Title - Text::new(self.localized_strings.get("hud.settings.general")) + Text::new(&self.localized_strings.get("hud.settings.general")) .top_left_with_margins_on(state.ids.window, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -150,7 +150,8 @@ impl<'a> Widget for Chat<'a> { // Chat Transp Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.background_opacity"), ) .down_from(state.ids.general_txt, 20.0) @@ -185,7 +186,8 @@ impl<'a> Widget for Chat<'a> { // "Show character names in chat" toggle button Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.chat_character_name"), ) .down_from(state.ids.transp_slider, 10.0) @@ -217,7 +219,7 @@ impl<'a> Widget for Chat<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.char_name_text, 20.0) - .label(self.localized_strings.get("hud.settings.reset_chat")) + .label(&self.localized_strings.get("hud.settings.reset_chat")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -229,7 +231,7 @@ impl<'a> Widget for Chat<'a> { } // Tabs Title - Text::new(self.localized_strings.get("hud.settings.chat_tabs")) + Text::new(&self.localized_strings.get("hud.settings.chat_tabs")) .top_left_with_margins_on(state.ids.window_r, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -333,7 +335,7 @@ impl<'a> Widget for Chat<'a> { { let mut updated_chat_tab = chat_tab.clone(); - Text::new(self.localized_strings.get("hud.settings.label")) + Text::new(&self.localized_strings.get("hud.settings.label")) .top_left_with_margins_on(state.ids.tab_content_align, 5.0, 25.0) .font_size(self.fonts.cyri.scale(16)) .font_id(self.fonts.cyri.conrod_id) @@ -361,7 +363,7 @@ impl<'a> Widget for Chat<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .w_h(100.0, 30.0) - .label(self.localized_strings.get("hud.settings.delete")) + .label(&self.localized_strings.get("hud.settings.delete")) .label_font_size(self.fonts.cyri.scale(14)) .label_font_id(self.fonts.cyri.conrod_id) .label_color(TEXT_COLOR) @@ -416,7 +418,7 @@ impl<'a> Widget for Chat<'a> { }; //Messages - Text::new(self.localized_strings.get("hud.settings.messages")) + Text::new(&self.localized_strings.get("hud.settings.messages")) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(16)) .color(TEXT_COLOR) @@ -439,7 +441,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_all = !chat_tab.filter.message_all; }; - Text::new(self.localized_strings.get("hud.settings.show_all")) + Text::new(&self.localized_strings.get("hud.settings.show_all")) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(16)) .color(TEXT_COLOR) @@ -456,12 +458,10 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_group = !chat_tab.filter.message_group; } - create_toggle_text( - self.localized_strings.get("hud.settings.group"), - !chat_tab.filter.message_all, - ) - .right_from(state.ids.btn_messages_group, 5.0) - .set(state.ids.text_messages_group, ui); + let group_text = self.localized_strings.get("hud.settings.group"); + create_toggle_text(&group_text, !chat_tab.filter.message_all) + .right_from(state.ids.btn_messages_group, 5.0) + .set(state.ids.text_messages_group, ui); create_toggle_icon(self.imgs.chat_group_small, !chat_tab.filter.message_all) .right_from(state.ids.text_messages_group, 5.0) @@ -480,12 +480,10 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_faction = !chat_tab.filter.message_faction; } - create_toggle_text( - self.localized_strings.get("hud.settings.faction"), - !chat_tab.filter.message_all, - ) - .right_from(state.ids.btn_messages_faction, 5.0) - .set(state.ids.text_messages_faction, ui); + let faction_text = self.localized_strings.get("hud.settings.faction"); + create_toggle_text(&faction_text, !chat_tab.filter.message_all) + .right_from(state.ids.btn_messages_faction, 5.0) + .set(state.ids.text_messages_faction, ui); create_toggle_icon(self.imgs.chat_faction_small, !chat_tab.filter.message_all) .right_from(state.ids.text_messages_faction, 5.0) @@ -501,12 +499,10 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_world = !chat_tab.filter.message_world; } - create_toggle_text( - self.localized_strings.get("hud.settings.world"), - !chat_tab.filter.message_all, - ) - .right_from(state.ids.btn_messages_world, 5.0) - .set(state.ids.text_messages_world, ui); + let world_text = self.localized_strings.get("hud.settings.world"); + create_toggle_text(&world_text, !chat_tab.filter.message_all) + .right_from(state.ids.btn_messages_world, 5.0) + .set(state.ids.text_messages_world, ui); create_toggle_icon(self.imgs.chat_world_small, !chat_tab.filter.message_all) .right_from(state.ids.text_messages_world, 5.0) @@ -522,12 +518,10 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_region = !chat_tab.filter.message_region; } - create_toggle_text( - self.localized_strings.get("hud.settings.region"), - !chat_tab.filter.message_all, - ) - .right_from(state.ids.btn_messages_region, 5.0) - .set(state.ids.text_messages_region, ui); + let region_text = self.localized_strings.get("hud.settings.region"); + create_toggle_text(®ion_text, !chat_tab.filter.message_all) + .right_from(state.ids.btn_messages_region, 5.0) + .set(state.ids.text_messages_region, ui); create_toggle_icon(self.imgs.chat_region_small, !chat_tab.filter.message_all) .right_from(state.ids.text_messages_region, 5.0) @@ -543,19 +537,17 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_say = !chat_tab.filter.message_say; } - create_toggle_text( - self.localized_strings.get("hud.settings.say"), - !chat_tab.filter.message_all, - ) - .right_from(state.ids.btn_messages_say, 5.0) - .set(state.ids.text_messages_say, ui); + let say_text = self.localized_strings.get("hud.settings.say"); + create_toggle_text(&say_text, !chat_tab.filter.message_all) + .right_from(state.ids.btn_messages_say, 5.0) + .set(state.ids.text_messages_say, ui); create_toggle_icon(self.imgs.chat_say_small, !chat_tab.filter.message_all) .right_from(state.ids.text_messages_say, 5.0) .set(state.ids.icon_messages_say, ui); //Activity - Text::new(self.localized_strings.get("hud.settings.activity")) + Text::new(&self.localized_strings.get("hud.settings.activity")) .top_left_with_margins_on(state.ids.tab_content_align_r, 0.0, 5.0) .align_middle_y_of(state.ids.text_messages) .font_size(self.fonts.cyri.scale(16)) @@ -606,7 +598,7 @@ impl<'a> Widget for Chat<'a> { } //Death - Text::new(self.localized_strings.get("hud.settings.death")) + Text::new(&self.localized_strings.get("hud.settings.death")) .down_from(state.ids.list_activity, 20.0) .font_size(self.fonts.cyri.scale(16)) .font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/controls.rs b/voxygen/src/hud/settings_window/controls.rs index 11c11309a7..a9113c59c5 100644 --- a/voxygen/src/hud/settings_window/controls.rs +++ b/voxygen/src/hud/settings_window/controls.rs @@ -126,7 +126,7 @@ impl<'a> Widget for Controls<'a> { ( self.localized_strings .get("hud.settings.awaitingkey") - .to_owned(), + .into_owned(), TEXT_COLOR, ) } else if let Some(key) = controls.get_binding(game_input) { @@ -147,14 +147,14 @@ impl<'a> Widget for Controls<'a> { ( self.localized_strings .get("hud.settings.unbound") - .to_owned(), + .into_owned(), ERROR_COLOR, ) }; let loc_key = self .localized_strings .get(game_input.get_localization_key()); - let text_widget = Text::new(loc_key) + let text_widget = Text::new(&loc_key) .color(TEXT_COLOR) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(18)); @@ -196,7 +196,7 @@ impl<'a> Widget for Controls<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(prev_id, 20.0) - .label(self.localized_strings.get("hud.settings.reset_keybinds")) + .label(&self.localized_strings.get("hud.settings.reset_keybinds")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/gameplay.rs b/voxygen/src/hud/settings_window/gameplay.rs index 68383732f7..ed79f54f9c 100644 --- a/voxygen/src/hud/settings_window/gameplay.rs +++ b/voxygen/src/hud/settings_window/gameplay.rs @@ -124,7 +124,7 @@ impl<'a> Widget for Gameplay<'a> { let display_clamp = self.global_state.settings.gameplay.camera_clamp_angle; // Mouse Pan Sensitivity - Text::new(self.localized_strings.get("hud.settings.pan_sensitivity")) + Text::new(&self.localized_strings.get("hud.settings.pan_sensitivity")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -156,7 +156,7 @@ impl<'a> Widget for Gameplay<'a> { .set(state.ids.mouse_pan_value, ui); // Mouse Zoom Sensitivity - Text::new(self.localized_strings.get("hud.settings.zoom_sensitivity")) + Text::new(&self.localized_strings.get("hud.settings.zoom_sensitivity")) .down_from(state.ids.mouse_pan_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -189,7 +189,8 @@ impl<'a> Widget for Gameplay<'a> { // Camera clamp angle Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.camera_clamp_angle"), ) .down_from(state.ids.mouse_zoom_slider, 10.0) @@ -241,7 +242,8 @@ impl<'a> Widget for Gameplay<'a> { } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.invert_scroll_zoom"), ) .right_from(state.ids.mouse_zoom_invert_button, 10.0) @@ -270,7 +272,8 @@ impl<'a> Widget for Gameplay<'a> { } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.invert_mouse_y_axis"), ) .right_from(state.ids.mouse_y_invert_button, 10.0) @@ -299,7 +302,8 @@ impl<'a> Widget for Gameplay<'a> { } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.invert_controller_y_axis"), ) .right_from(state.ids.controller_y_invert_button, 10.0) @@ -328,7 +332,8 @@ impl<'a> Widget for Gameplay<'a> { } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.enable_mouse_smoothing"), ) .right_from(state.ids.smooth_pan_toggle_button, 10.0) @@ -340,7 +345,8 @@ impl<'a> Widget for Gameplay<'a> { // Free look behaviour Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.free_look_behavior"), ) .down_from(state.ids.mouse_zoom_invert_button, 10.0) @@ -376,7 +382,8 @@ impl<'a> Widget for Gameplay<'a> { // Auto walk behavior Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.auto_walk_behavior"), ) .down_from(state.ids.mouse_zoom_invert_button, 10.0) @@ -405,7 +412,8 @@ impl<'a> Widget for Gameplay<'a> { // Camera clamp behavior Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.camera_clamp_behavior"), ) .down_from(state.ids.free_look_behavior_list, 10.0) @@ -434,7 +442,8 @@ impl<'a> Widget for Gameplay<'a> { // Player physics behavior Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.player_physics_behavior"), ) .down_from(state.ids.auto_walk_behavior_list, 10.0) @@ -489,7 +498,8 @@ impl<'a> Widget for Gameplay<'a> { } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.stop_auto_walk_on_input"), ) .right_from(state.ids.stop_auto_walk_on_input_button, 10.0) @@ -517,7 +527,7 @@ impl<'a> Widget for Gameplay<'a> { )); } - Text::new(self.localized_strings.get("hud.settings.auto_camera")) + Text::new(&self.localized_strings.get("hud.settings.auto_camera")) .right_from(state.ids.auto_camera_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -541,7 +551,7 @@ impl<'a> Widget for Gameplay<'a> { events.push(ChangeBowZoom(!self.global_state.settings.gameplay.bow_zoom)); } - Text::new(self.localized_strings.get("hud.settings.bow_zoom")) + Text::new(&self.localized_strings.get("hud.settings.bow_zoom")) .right_from(state.ids.bow_zoom_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -555,7 +565,7 @@ impl<'a> Widget for Gameplay<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.camera_clamp_behavior_list, 12.0) - .label(self.localized_strings.get("hud.settings.reset_gameplay")) + .label(&self.localized_strings.get("hud.settings.reset_gameplay")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/interface.rs b/voxygen/src/hud/settings_window/interface.rs index 5b2559c417..2b74a5d42c 100644 --- a/voxygen/src/hud/settings_window/interface.rs +++ b/voxygen/src/hud/settings_window/interface.rs @@ -174,7 +174,7 @@ impl<'a> Widget for Interface<'a> { let crosshair_type = self.global_state.settings.interface.crosshair_type; let ui_scale = self.global_state.settings.interface.ui_scale; - Text::new(self.localized_strings.get("hud.settings.general")) + Text::new(&self.localized_strings.get("hud.settings.general")) .top_left_with_margins_on(state.ids.window, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -197,7 +197,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHelp(show_help)); } - Text::new(self.localized_strings.get("hud.settings.help_window")) + Text::new(&self.localized_strings.get("hud.settings.help_window")) .right_from(state.ids.button_help, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -223,7 +223,7 @@ impl<'a> Widget for Interface<'a> { )); } - Text::new(self.localized_strings.get("hud.settings.loading_tips")) + Text::new(&self.localized_strings.get("hud.settings.loading_tips")) .right_from(state.ids.load_tips_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -247,7 +247,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleDebug(show_debug)); } - Text::new(self.localized_strings.get("hud.settings.debug_info")) + Text::new(&self.localized_strings.get("hud.settings.debug_info")) .right_from(state.ids.debug_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -271,7 +271,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHitboxes(show_hitboxes)); } - Text::new(self.localized_strings.get("hud.settings.show_hitboxes")) + Text::new(&self.localized_strings.get("hud.settings.show_hitboxes")) .right_from(state.ids.hitboxes_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -295,7 +295,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleChat(show_chat)); } - Text::new(self.localized_strings.get("hud.settings.show_chat")) + Text::new(&self.localized_strings.get("hud.settings.show_chat")) .right_from(state.ids.chat_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -319,7 +319,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHotkeyHints(show_hotkey_hints)); } - Text::new(self.localized_strings.get("hud.settings.show_hotkey_hints")) + Text::new(&self.localized_strings.get("hud.settings.show_hotkey_hints")) .right_from(state.ids.hotkey_hints_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -328,7 +328,7 @@ impl<'a> Widget for Interface<'a> { .set(state.ids.hotkey_hints_button_label, ui); // Ui Scale - Text::new(self.localized_strings.get("hud.settings.ui_scale")) + Text::new(&self.localized_strings.get("hud.settings.ui_scale")) .down_from(state.ids.hotkey_hints_button, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -362,7 +362,7 @@ impl<'a> Widget for Interface<'a> { events.push(UiScale(ScaleChange::ToRelative)); } - Text::new(self.localized_strings.get("hud.settings.relative_scaling")) + Text::new(&self.localized_strings.get("hud.settings.relative_scaling")) .right_from(state.ids.relative_to_win_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -397,7 +397,7 @@ impl<'a> Widget for Interface<'a> { events.push(UiScale(ScaleChange::ToAbsolute)); } - Text::new(self.localized_strings.get("hud.settings.custom_scaling")) + Text::new(&self.localized_strings.get("hud.settings.custom_scaling")) .right_from(state.ids.absolute_scale_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -574,13 +574,13 @@ impl<'a> Widget for Interface<'a> { .graphics_for(state.ids.ch_3_bg) .set(state.ids.crosshair_inner_3, ui); // Crosshair Transparency Text and Slider - Text::new(self.localized_strings.get("hud.settings.crosshair")) + Text::new(&self.localized_strings.get("hud.settings.crosshair")) .down_from(state.ids.absolute_scale_button, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.ch_title, ui); - Text::new(self.localized_strings.get("hud.settings.opacity")) + Text::new(&self.localized_strings.get("hud.settings.opacity")) .right_from(state.ids.ch_3_bg, 20.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -613,7 +613,7 @@ impl<'a> Widget for Interface<'a> { .set(state.ids.ch_transp_value, ui); // Hotbar text - Text::new(self.localized_strings.get("hud.settings.hotbar")) + Text::new(&self.localized_strings.get("hud.settings.hotbar")) .down_from(state.ids.ch_1_bg, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -648,7 +648,7 @@ impl<'a> Widget for Interface<'a> { ShortcutNumbers::Off => events.push(ToggleShortcutNumbers(ShortcutNumbers::On)), } } - Text::new(self.localized_strings.get("hud.settings.toggle_shortcuts")) + Text::new(&self.localized_strings.get("hud.settings.toggle_shortcuts")) .right_from(state.ids.show_shortcuts_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -676,7 +676,7 @@ impl<'a> Widget for Interface<'a> { { events.push(BuffPosition(BuffPosition::Bar)) } - Text::new(self.localized_strings.get("hud.settings.buffs_skillbar")) + Text::new(&self.localized_strings.get("hud.settings.buffs_skillbar")) .right_from(state.ids.buff_pos_bar_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -703,7 +703,7 @@ impl<'a> Widget for Interface<'a> { { events.push(BuffPosition(BuffPosition::Map)) } - Text::new(self.localized_strings.get("hud.settings.buffs_mmap")) + Text::new(&self.localized_strings.get("hud.settings.buffs_mmap")) .right_from(state.ids.buff_pos_map_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -725,7 +725,8 @@ impl<'a> Widget for Interface<'a> { */ // SCT/ Scrolling Combat Text Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.scrolling_combat_text"), ) .top_left_with_margins_on(state.ids.window_r, 5.0, 5.0) @@ -749,7 +750,8 @@ impl<'a> Widget for Interface<'a> { events.push(Sct(!self.global_state.settings.interface.sct)) } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.scrolling_combat_text"), ) .right_from(state.ids.sct_show_radio, 10.0) @@ -768,7 +770,8 @@ impl<'a> Widget for Interface<'a> { .sct_inc_dmg_accum_duration; Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.damage_accumulation_duration"), ) .down_from(state.ids.sct_show_radio, 8.0) @@ -820,7 +823,7 @@ impl<'a> Widget for Interface<'a> { !self.global_state.settings.interface.sct_inc_dmg, )) } - Text::new(self.localized_strings.get("hud.settings.incoming_damage")) + Text::new(&self.localized_strings.get("hud.settings.incoming_damage")) .right_from(state.ids.sct_show_inc_dmg_radio, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -829,7 +832,8 @@ impl<'a> Widget for Interface<'a> { .set(state.ids.sct_show_inc_dmg_text, ui); if self.global_state.settings.interface.sct_inc_dmg { Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.incoming_damage_accumulation_duration"), ) .down_from(state.ids.sct_show_inc_dmg_radio, 8.0) @@ -891,7 +895,7 @@ impl<'a> Widget for Interface<'a> { !self.global_state.settings.interface.sct_damage_rounding, )) } - Text::new(self.localized_strings.get("hud.settings.round_damage")) + Text::new(&self.localized_strings.get("hud.settings.round_damage")) .right_from(state.ids.sct_round_dmg_radio, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -901,7 +905,7 @@ impl<'a> Widget for Interface<'a> { } // Speech bubbles - Text::new(self.localized_strings.get("hud.settings.speech_bubble")) + Text::new(&self.localized_strings.get("hud.settings.speech_bubble")) .down_from( if self.global_state.settings.interface.sct { state.ids.sct_round_dmg_radio @@ -932,7 +936,8 @@ impl<'a> Widget for Interface<'a> { events.push(SpeechBubbleSelf(speech_bubble_self)); } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.speech_bubble_self"), ) .right_from(state.ids.speech_bubble_self_button, 10.0) @@ -956,7 +961,8 @@ impl<'a> Widget for Interface<'a> { events.push(SpeechBubbleDarkMode(speech_bubble_dark_mode)); } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.speech_bubble_dark_mode"), ) .right_from(state.ids.speech_bubble_dark_mode_button, 10.0) @@ -979,7 +985,8 @@ impl<'a> Widget for Interface<'a> { events.push(SpeechBubbleIcon(speech_bubble_icon)); } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.speech_bubble_icon"), ) .right_from(state.ids.speech_bubble_icon_button, 10.0) @@ -990,7 +997,7 @@ impl<'a> Widget for Interface<'a> { // Energybars Numbers // Hotbar text - Text::new(self.localized_strings.get("hud.settings.energybar_numbers")) + Text::new(&self.localized_strings.get("hud.settings.energybar_numbers")) .down_from(state.ids.speech_bubble_icon_button, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -1020,7 +1027,7 @@ impl<'a> Widget for Interface<'a> { { events.push(ToggleBarNumbers(BarNumbers::Off)) } - Text::new(self.localized_strings.get("hud.settings.none")) + Text::new(&self.localized_strings.get("hud.settings.none")) .right_from(state.ids.show_bar_numbers_none_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1051,7 +1058,7 @@ impl<'a> Widget for Interface<'a> { { events.push(ToggleBarNumbers(BarNumbers::Values)) } - Text::new(self.localized_strings.get("hud.settings.values")) + Text::new(&self.localized_strings.get("hud.settings.values")) .right_from(state.ids.show_bar_numbers_values_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1082,7 +1089,7 @@ impl<'a> Widget for Interface<'a> { { events.push(ToggleBarNumbers(BarNumbers::Percent)) } - Text::new(self.localized_strings.get("hud.settings.percentages")) + Text::new(&self.localized_strings.get("hud.settings.percentages")) .right_from(state.ids.show_bar_numbers_percentage_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1106,7 +1113,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleAlwaysShowBars(always_show_bars)); } - Text::new(self.localized_strings.get("hud.settings.always_show_bars")) + Text::new(&self.localized_strings.get("hud.settings.always_show_bars")) .right_from(state.ids.always_show_bars_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1116,7 +1123,8 @@ impl<'a> Widget for Interface<'a> { // Experience Numbers Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.experience_numbers"), ) .down_from(state.ids.always_show_bars_button, 20.0) @@ -1144,7 +1152,8 @@ impl<'a> Widget for Interface<'a> { } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.accumulate_experience"), ) .right_from(state.ids.accum_experience_button, 10.0) @@ -1160,7 +1169,7 @@ impl<'a> Widget for Interface<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.buff_pos_map_button, 12.0) - .label(self.localized_strings.get("hud.settings.reset_interface")) + .label(&self.localized_strings.get("hud.settings.reset_interface")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/language.rs b/voxygen/src/hud/settings_window/language.rs index 5745b81bca..0bfb16989d 100644 --- a/voxygen/src/hud/settings_window/language.rs +++ b/voxygen/src/hud/settings_window/language.rs @@ -149,7 +149,7 @@ impl<'a> Widget for Language<'a> { events.push(ToggleEnglishFallback(show_english_fallback)); } - Text::new(self.localized_strings.get("hud.settings.english_fallback")) + Text::new(&self.localized_strings.get("hud.settings.english_fallback")) .right_from(state.ids.english_fallback_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/mod.rs b/voxygen/src/hud/settings_window/mod.rs index 9a85c4c008..e5b96980a4 100644 --- a/voxygen/src/hud/settings_window/mod.rs +++ b/voxygen/src/hud/settings_window/mod.rs @@ -184,7 +184,8 @@ impl<'a> Widget for SettingsWindow<'a> { .set(state.ids.icon, ui); // Title Text::new( - self.localized_strings + &self + .localized_strings .get(self.show.settings_tab.title_key()), ) .mid_top_with_margin_on(state.ids.frame, 3.0) @@ -214,6 +215,7 @@ impl<'a> Widget for SettingsWindow<'a> { }); } for (i, settings_tab) in SettingsTab::iter().enumerate() { + let tab_name = self.localized_strings.get(settings_tab.name_key()); let mut button = Button::image(if self.show.settings_tab == settings_tab { self.imgs.selection } else { @@ -223,7 +225,7 @@ impl<'a> Widget for SettingsWindow<'a> { .hover_image(self.imgs.selection_hover) .press_image(self.imgs.selection_press) .image_color(color::rgba(1.0, 0.82, 0.27, 1.0)) - .label(self.localized_strings.get(settings_tab.name_key())) + .label(&tab_name) .label_font_size(self.fonts.cyri.scale(tab_font_scale)) .label_font_id(self.fonts.cyri.conrod_id) .label_color(TEXT_COLOR); diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index b85b995c3f..c7dea10b21 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -108,7 +108,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.window_scrollbar, ui); // Master Volume - Text::new(self.localized_strings.get("hud.settings.master_volume")) + Text::new(&self.localized_strings.get("hud.settings.master_volume")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -144,7 +144,8 @@ impl<'a> Widget for Sound<'a> { // Master Volume (inactive window) Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.inactive_master_volume_perc"), ) .down_from(state.ids.master_volume_slider, 10.0) @@ -181,7 +182,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.inactive_master_volume_number, ui); // Music Volume - Text::new(self.localized_strings.get("hud.settings.music_volume")) + Text::new(&self.localized_strings.get("hud.settings.music_volume")) .down_from(state.ids.inactive_master_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -217,7 +218,8 @@ impl<'a> Widget for Sound<'a> { // SFX Volume Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.sound_effect_volume"), ) .down_from(state.ids.music_volume_slider, 10.0) @@ -253,7 +255,7 @@ impl<'a> Widget for Sound<'a> { .color(TEXT_COLOR) .set(state.ids.sfx_volume_number, ui); // Ambience Volume - Text::new(self.localized_strings.get("hud.settings.ambience_volume")) + Text::new(&self.localized_strings.get("hud.settings.ambience_volume")) .down_from(state.ids.sfx_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -288,7 +290,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.ambience_volume_number, ui); // Music frequency (actually gap between songs) - Text::new(self.localized_strings.get("hud.settings.music_frequency")) + Text::new(&self.localized_strings.get("hud.settings.music_frequency")) .down_from(state.ids.ambience_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -354,8 +356,8 @@ impl<'a> Widget for Sound<'a> { .w_h(RESET_BUTTONS_WIDTH, RESET_BUTTONS_HEIGHT) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .down_from(state.ids.music_frequency_slider, 12.0) - .label(self.localized_strings.get("hud.settings.reset_sound")) + .down_from(state.ids.ambience_volume_slider, 12.0) + .label(&self.localized_strings.get("hud.settings.reset_sound")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 39f03cd744..dd155743f4 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -279,7 +279,7 @@ impl<'a> Widget for Video<'a> { } // View Distance - Text::new(self.localized_strings.get("hud.settings.view_distance")) + Text::new(&self.localized_strings.get("hud.settings.view_distance")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -314,7 +314,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.vd_value, ui); // LoD Distance - Text::new(self.localized_strings.get("hud.settings.lod_distance")) + Text::new(&self.localized_strings.get("hud.settings.lod_distance")) .down_from(state.ids.vd_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -349,7 +349,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.ld_value, ui); // Max FPS - Text::new(self.localized_strings.get("hud.settings.maximum_fps")) + Text::new(&self.localized_strings.get("hud.settings.maximum_fps")) .down_from(state.ids.ld_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -384,7 +384,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.max_fps_value, ui); // Max Background FPS - Text::new(self.localized_strings.get("hud.settings.background_fps")) + Text::new(&self.localized_strings.get("hud.settings.background_fps")) .down_from(state.ids.ld_slider, 10.0) .right_from(state.ids.max_fps_value, 30.0) .font_size(self.fonts.cyri.scale(14)) @@ -432,7 +432,7 @@ impl<'a> Widget for Video<'a> { let render_mode = &self.global_state.settings.graphics.render_mode; // Present Mode - Text::new(self.localized_strings.get("hud.settings.present_mode")) + Text::new(&self.localized_strings.get("hud.settings.present_mode")) .down_from(state.ids.ld_slider, 10.0) .right_from(state.ids.max_background_fps_value, 30.0) .font_size(self.fonts.cyri.scale(14)) @@ -476,7 +476,7 @@ impl<'a> Widget for Video<'a> { } // FOV - Text::new(self.localized_strings.get("hud.settings.fov")) + Text::new(&self.localized_strings.get("hud.settings.fov")) .down_from(state.ids.max_fps_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -508,7 +508,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.fov_value, ui); // LoD detail - Text::new(self.localized_strings.get("hud.settings.lod_detail")) + Text::new(&self.localized_strings.get("hud.settings.lod_detail")) .down_from(state.ids.fov_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -546,7 +546,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.lod_detail_value, ui); // Gamma - Text::new(self.localized_strings.get("hud.settings.gamma")) + Text::new(&self.localized_strings.get("hud.settings.gamma")) .down_from(state.ids.lod_detail_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -597,7 +597,7 @@ impl<'a> Widget for Video<'a> { events.push(GraphicsChange::ChangeExposure(new_val as f32 / 16.0)); } - Text::new(self.localized_strings.get("hud.settings.exposure")) + Text::new(&self.localized_strings.get("hud.settings.exposure")) .up_from(state.ids.exposure_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -631,7 +631,7 @@ impl<'a> Widget for Video<'a> { { events.push(GraphicsChange::ChangeAmbiance(new_val as f32 / 100.0)); } - Text::new(self.localized_strings.get("hud.settings.ambiance")) + Text::new(&self.localized_strings.get("hud.settings.ambiance")) .up_from(state.ids.ambiance_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -665,7 +665,8 @@ impl<'a> Widget for Video<'a> { events.push(GraphicsChange::AdjustSpriteRenderDistance(new_val)); } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.sprites_view_distance"), ) .up_from(state.ids.sprite_dist_slider, 8.0) @@ -704,7 +705,8 @@ impl<'a> Widget for Video<'a> { events.push(GraphicsChange::AdjustFigureLoDRenderDistance(new_val)); } Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.figures_view_distance"), ) .up_from(state.ids.figure_dist_slider, 8.0) @@ -727,7 +729,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.figure_dist_value, ui); // AaMode - Text::new(self.localized_strings.get("hud.settings.antialiasing_mode")) + Text::new(&self.localized_strings.get("hud.settings.antialiasing_mode")) .down_from(state.ids.gamma_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -775,7 +777,7 @@ impl<'a> Widget for Video<'a> { }; let max_bloom = 0.3; - Text::new(self.localized_strings.get("hud.settings.bloom")) + Text::new(&self.localized_strings.get("hud.settings.bloom")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.aa_mode_list, 10.0) @@ -827,7 +829,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.bloom_intensity_value, ui); // Point Glow - Text::new(self.localized_strings.get("hud.settings.point_glow")) + Text::new(&self.localized_strings.get("hud.settings.point_glow")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.aa_mode_list, 10.0) @@ -866,7 +868,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.point_glow_value, ui); // Upscaling factor - Text::new(self.localized_strings.get("hud.settings.upscale_factor")) + Text::new(&self.localized_strings.get("hud.settings.upscale_factor")) .down_from(state.ids.bloom_intensity_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -909,7 +911,8 @@ impl<'a> Widget for Video<'a> { // CloudMode Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.cloud_rendering_mode"), ) .down_from(state.ids.upscale_factor_list, 8.0) @@ -959,7 +962,8 @@ impl<'a> Widget for Video<'a> { // FluidMode Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.fluid_rendering_mode"), ) .down_from(state.ids.cloud_mode_list, 8.0) @@ -995,7 +999,8 @@ impl<'a> Widget for Video<'a> { // LightingMode Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.lighting_rendering_mode"), ) .down_from(state.ids.fluid_mode_list, 8.0) @@ -1037,7 +1042,8 @@ impl<'a> Widget for Video<'a> { // ShadowMode Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.shadow_rendering_mode"), ) .down_from(state.ids.lighting_mode_list, 8.0) @@ -1081,7 +1087,8 @@ impl<'a> Widget for Video<'a> { if let Some(shadow_map_mode) = shadow_map_mode { // Display the shadow map mode if selected. Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.shadow_rendering_mode.map.resolution"), ) .right_from(state.ids.shadow_mode_list, 10.0) @@ -1125,7 +1132,8 @@ impl<'a> Widget for Video<'a> { // Rain occlusion texture size // Display the shadow map mode if selected. Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.rain_occlusion.resolution"), ) .down_from(state.ids.shadow_mode_list, 10.0) @@ -1163,7 +1171,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.rain_map_resolution_value, ui); // GPU Profiler - Text::new(self.localized_strings.get("hud.settings.gpu_profiler")) + Text::new(&self.localized_strings.get("hud.settings.gpu_profiler")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.rain_map_resolution_text, 8.0) @@ -1189,7 +1197,7 @@ impl<'a> Widget for Video<'a> { } // Particles - Text::new(self.localized_strings.get("hud.settings.particles")) + Text::new(&self.localized_strings.get("hud.settings.particles")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.gpu_profiler_label, 8.0) @@ -1213,7 +1221,8 @@ impl<'a> Widget for Video<'a> { // Lossy terrain compression Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.lossy_terrain_compression"), ) .font_size(self.fonts.cyri.scale(14)) @@ -1249,7 +1258,7 @@ impl<'a> Widget for Video<'a> { } // Weapon trails - Text::new(self.localized_strings.get("hud.settings.weapon_trails")) + Text::new(&self.localized_strings.get("hud.settings.weapon_trails")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .right_from(state.ids.lossy_terrain_compression_label, 64.0) @@ -1274,7 +1283,7 @@ impl<'a> Widget for Video<'a> { } // Disable flashing lights - Text::new(self.localized_strings.get("hud.settings.flashing_lights")) + Text::new(&self.localized_strings.get("hud.settings.flashing_lights")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.particles_label, 25.0) @@ -1297,7 +1306,8 @@ impl<'a> Widget for Video<'a> { .set(state.ids.flashing_lights_button, ui); Text::new( - self.localized_strings + &self + .localized_strings .get("hud.settings.flashing_lights_info"), ) .font_size(self.fonts.cyri.scale(14)) @@ -1330,7 +1340,7 @@ impl<'a> Widget for Video<'a> { .dedup() .collect(); - Text::new(self.localized_strings.get("hud.settings.resolution")) + Text::new(&self.localized_strings.get("hud.settings.resolution")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.flashing_lights_label, 25.0) @@ -1389,7 +1399,7 @@ impl<'a> Widget for Video<'a> { .dedup() .collect(); - Text::new(self.localized_strings.get("hud.settings.bit_depth")) + Text::new(&self.localized_strings.get("hud.settings.bit_depth")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.flashing_lights_label, 25.0) @@ -1443,7 +1453,7 @@ impl<'a> Widget for Video<'a> { .dedup() .collect(); - Text::new(self.localized_strings.get("hud.settings.refresh_rate")) + Text::new(&self.localized_strings.get("hud.settings.refresh_rate")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.flashing_lights_label, 25.0) @@ -1483,7 +1493,7 @@ impl<'a> Widget for Video<'a> { } // Fullscreen - Text::new(self.localized_strings.get("hud.settings.fullscreen")) + Text::new(&self.localized_strings.get("hud.settings.fullscreen")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.resolution, 8.0) @@ -1509,7 +1519,7 @@ impl<'a> Widget for Video<'a> { } // Fullscreen Mode - Text::new(self.localized_strings.get("hud.settings.fullscreen_mode")) + Text::new(&self.localized_strings.get("hud.settings.fullscreen_mode")) .down_from(state.ids.fullscreen_label, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1551,7 +1561,7 @@ impl<'a> Widget for Video<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.fullscreen_mode_list, 12.0) - .label(self.localized_strings.get("hud.settings.save_window_size")) + .label(&self.localized_strings.get("hud.settings.save_window_size")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -1575,7 +1585,7 @@ impl<'a> Widget for Video<'a> { .press_image(self.imgs.button_press) .down_from(state.ids.fullscreen_mode_list, 12.0) .right_from(state.ids.save_window_size_button, 12.0) - .label(self.localized_strings.get("hud.settings.reset_graphics")) + .label(&self.localized_strings.get("hud.settings.reset_graphics")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index cc929a8f59..53b9a6f43d 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -17,6 +17,7 @@ use crate::{ GlobalState, }; use i18n::Localization; +use std::borrow::Cow; use client::{self, Client}; use common::comp::{ @@ -329,38 +330,34 @@ impl<'a> Skillbar<'a> { .controls .get_binding(GameInput::Respawn) { - Text::new(localized_strings.get("hud.you_died")) + Text::new(&localized_strings.get("hud.you_died")) .middle_of(ui.window) .font_size(self.fonts.cyri.scale(50)) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, 1.0)) .set(state.ids.death_message_1_bg, ui); - Text::new( - &localized_strings - .get("hud.press_key_to_respawn") - .replace("{key}", key.display_string(key_layout).as_str()), - ) - .mid_bottom_with_margin_on(state.ids.death_message_1_bg, -120.0) - .font_size(self.fonts.cyri.scale(30)) - .font_id(self.fonts.cyri.conrod_id) - .color(Color::Rgba(0.0, 0.0, 0.0, 1.0)) - .set(state.ids.death_message_2_bg, ui); - Text::new(localized_strings.get("hud.you_died")) + let respawn_msg = + localized_strings.get_msg_ctx("hud-press_key_to_respawn", &i18n::fluent_args! { + "key" => key.display_string(key_layout) + }); + Text::new(&respawn_msg) + .mid_bottom_with_margin_on(state.ids.death_message_1_bg, -120.0) + .font_size(self.fonts.cyri.scale(30)) + .font_id(self.fonts.cyri.conrod_id) + .color(Color::Rgba(0.0, 0.0, 0.0, 1.0)) + .set(state.ids.death_message_2_bg, ui); + Text::new(&localized_strings.get("hud.you_died")) .bottom_left_with_margins_on(state.ids.death_message_1_bg, 2.0, 2.0) .font_size(self.fonts.cyri.scale(50)) .font_id(self.fonts.cyri.conrod_id) .color(CRITICAL_HP_COLOR) .set(state.ids.death_message_1, ui); - Text::new( - &localized_strings - .get("hud.press_key_to_respawn") - .replace("{key}", key.display_string(key_layout).as_str()), - ) - .bottom_left_with_margins_on(state.ids.death_message_2_bg, 2.0, 2.0) - .font_size(self.fonts.cyri.scale(30)) - .font_id(self.fonts.cyri.conrod_id) - .color(CRITICAL_HP_COLOR) - .set(state.ids.death_message_2, ui); + Text::new(&respawn_msg) + .bottom_left_with_margins_on(state.ids.death_message_2_bg, 2.0, 2.0) + .font_size(self.fonts.cyri.scale(30)) + .font_id(self.fonts.cyri.conrod_id) + .color(CRITICAL_HP_COLOR) + .set(state.ids.death_message_2, ui); } } @@ -455,8 +452,8 @@ impl<'a> Skillbar<'a> { // Bar Text let bar_text = if self.health.is_dead { Some(( - self.localized_strings.get("hud.group.dead").to_owned(), - self.localized_strings.get("hud.group.dead").to_owned(), + self.localized_strings.get("hud.group.dead").into_owned(), + self.localized_strings.get("hud.group.dead").into_owned(), )) } else if let BarNumbers::Values = bar_values { Some(( @@ -605,7 +602,7 @@ impl<'a> Skillbar<'a> { hotbar.get(slot).and_then(|content| match content { hotbar::SlotContents::Inventory(i, _) => inventory .get_by_hash(i) - .map(|item| (item.name(), item.description())), + .map(|item| (item.name(), Cow::Borrowed(item.description()))), hotbar::SlotContents::Ability(i) => active_abilities .and_then(|a| { a.auxiliary_set(Some(inventory), Some(skill_set)) @@ -636,7 +633,7 @@ impl<'a> Skillbar<'a> { .set(entry.widget_id, ui); // if we can gather some text to display, show it } else if let Some((title, desc)) = tooltip_text(entry.slot) { - slot.with_tooltip(self.tooltip_manager, &title, desc, &tooltip, TEXT_COLOR) + slot.with_tooltip(self.tooltip_manager, &title, &desc, &tooltip, TEXT_COLOR) .set(entry.widget_id, ui); // if not, just set slot } else { diff --git a/voxygen/src/hud/social.rs b/voxygen/src/hud/social.rs index b46ceac8ac..3e55c4905a 100644 --- a/voxygen/src/hud/social.rs +++ b/voxygen/src/hud/social.rs @@ -159,7 +159,7 @@ impl<'a> Widget for Social<'a> { Rectangle::fill_with([212.0, 42.0], color::TRANSPARENT) .top_left_with_margins_on(state.ids.frame, 2.0, 44.0) .set(state.ids.title_align, ui); - Text::new(self.localized_strings.get("hud.social")) + Text::new(&self.localized_strings.get("hud.social")) .middle_of(state.ids.title_align) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -184,7 +184,7 @@ impl<'a> Widget for Social<'a> { .set(state.ids.scrollbar, ui); // Online Text - Text::new(self.localized_strings.get("hud.social.online")) + Text::new(&self.localized_strings.get("hud.social.online")) .bottom_left_with_margins_on(state.ids.frame, 18.0, 10.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) @@ -347,6 +347,7 @@ impl<'a> Widget for Social<'a> { }) .flatten(); + let invite_text = self.localized_strings.get("hud.group.invite"); let invite_button = Button::image(self.imgs.button) .w_h(106.0, 26.0) .bottom_right_with_margins_on(state.ids.frame, 9.0, 7.0) @@ -360,7 +361,7 @@ impl<'a> Widget for Social<'a> { } else { self.imgs.button }) - .label(self.localized_strings.get("hud.group.invite")) + .label(&invite_text) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(if selected_to_invite.is_some() { TEXT_COLOR diff --git a/voxygen/src/hud/trade.rs b/voxygen/src/hud/trade.rs index 1f7f0bc423..39ed389338 100644 --- a/voxygen/src/hud/trade.rs +++ b/voxygen/src/hud/trade.rs @@ -137,13 +137,13 @@ impl<'a> Trade<'a> { } fn title(&mut self, state: &mut ConrodState<'_, State>, ui: &mut UiCell<'_>) { - Text::new(self.localized_strings.get("hud.trade.trade_window")) + Text::new(&self.localized_strings.get("hud.trade.trade_window")) .mid_top_with_margin_on(state.ids.bg_frame, 9.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) .color(Color::Rgba(0.0, 0.0, 0.0, 1.0)) .set(state.ids.trade_title_bg, ui); - Text::new(self.localized_strings.get("hud.trade.trade_window")) + Text::new(&self.localized_strings.get("hud.trade.trade_window")) .top_left_with_margins_on(state.ids.trade_title_bg, 2.0, 2.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -163,7 +163,7 @@ impl<'a> Trade<'a> { TradePhase::Complete => self.localized_strings.get("hud.trade.phase3_description"), }; - Text::new(phase_text) + Text::new(&phase_text) .mid_top_with_margin_on(state.ids.bg, 70.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -236,10 +236,11 @@ impl<'a> Trade<'a> { .set(state.ids.offer_headers[who], ui); let has_accepted = trade.accept_flags[who]; - let accept_indicator = self - .localized_strings - .get("hud.trade.has_accepted") - .replace("{playername}", &name); + let accept_indicator = + self.localized_strings + .get_msg_ctx("hud-trade-has_accepted", &i18n::fluent_args! { + "playername" => &name, + }); Text::new(&accept_indicator) .down_from(state.ids.inv_alignment[who], 50.0) .font_id(self.fonts.cyri.conrod_id) @@ -510,7 +511,7 @@ impl<'a> Trade<'a> { .press_image(press_img) .image_color(accept_button_luminance) .bottom_left_with_margins_on(state.ids.bg, 90.0, 47.0) - .label(self.localized_strings.get("hud.trade.accept")) + .label(&self.localized_strings.get("hud.trade.accept")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -526,7 +527,7 @@ impl<'a> Trade<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .right_from(state.ids.accept_button, 20.0) - .label(self.localized_strings.get("hud.trade.decline")) + .label(&self.localized_strings.get("hud.trade.decline")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -657,7 +658,7 @@ impl<'a> Trade<'a> { } } else { // placeholder text when no trade slot is selected - Text::new(self.localized_strings.get("hud.trade.amount_input")) + Text::new(&self.localized_strings.get("hud.trade.amount_input")) .middle_of(state.ids.amount_bg) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index f8ed26c872..7fc8e5518a 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -72,7 +72,7 @@ pub fn price_desc( pub fn kind_text<'a>(kind: &ItemKind, i18n: &'a Localization) -> Cow<'a, str> { match kind { - ItemKind::Armor(armor) => Cow::Borrowed(armor_kind(armor, i18n)), + ItemKind::Armor(armor) => armor_kind(armor, i18n), ItemKind::Tool(tool) => Cow::Owned(format!( "{} ({})", tool_kind(tool, i18n), @@ -86,20 +86,20 @@ pub fn kind_text<'a>(kind: &ItemKind, i18n: &'a Localization) -> Cow<'a, str> { i18n.get("common.kind.modular_component_partial") )) } else { - Cow::Borrowed(i18n.get("common.kind.modular_component")) + i18n.get("common.kind.modular_component") } }, - ItemKind::Glider => Cow::Borrowed(i18n.get("common.kind.glider")), - ItemKind::Consumable { .. } => Cow::Borrowed(i18n.get("common.kind.consumable")), - ItemKind::Throwable { .. } => Cow::Borrowed(i18n.get("common.kind.throwable")), - ItemKind::Utility { .. } => Cow::Borrowed(i18n.get("common.kind.utility")), - ItemKind::Ingredient { .. } => Cow::Borrowed(i18n.get("common.kind.ingredient")), - ItemKind::Lantern { .. } => Cow::Borrowed(i18n.get("common.kind.lantern")), + ItemKind::Glider => i18n.get("common.kind.glider"), + ItemKind::Consumable { .. } => i18n.get("common.kind.consumable"), + ItemKind::Throwable { .. } => i18n.get("common.kind.throwable"), + ItemKind::Utility { .. } => i18n.get("common.kind.utility"), + ItemKind::Ingredient { .. } => i18n.get("common.kind.ingredient"), + ItemKind::Lantern { .. } => i18n.get("common.kind.lantern"), ItemKind::TagExamples { .. } => Cow::Borrowed(""), } } -pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> &'a str { +pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> Cow<'a, str> { match kind { MaterialKind::Metal { .. } => i18n.get("common.material.metal"), MaterialKind::Wood { .. } => i18n.get("common.material.wood"), @@ -148,15 +148,20 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { let buff_desc = match buff.kind { BuffKind::Saturation | BuffKind::Regeneration | BuffKind::Potion => i18n - .get("buff.stat.health") - .replace("{str_total}", &format_float(str_total)), - BuffKind::IncreaseMaxEnergy => i18n - .get("buff.stat.increase_max_energy") - .replace("{strength}", &format_float(strength)), - BuffKind::IncreaseMaxHealth => i18n - .get("buff.stat.increase_max_health") - .replace("{strength}", &format_float(strength)), - BuffKind::Invulnerability => i18n.get("buff.stat.invulnerability").to_string(), + .get_msg_ctx("buff-stat-health", &i18n::fluent_args! { + "str_total" => format_float(str_total), + }), + BuffKind::IncreaseMaxEnergy => { + i18n.get_msg_ctx("buff-stat-increase_max_energy", &i18n::fluent_args! { + "strength" => format_float(strength), + }) + }, + BuffKind::IncreaseMaxHealth => { + i18n.get_msg_ctx("buff-stat-increase_max_health", &i18n::fluent_args! { + "strength" => format_float(strength), + }) + }, + BuffKind::Invulnerability => i18n.get("buff.stat.invulnerability"), BuffKind::Bleeding | BuffKind::Burning | BuffKind::CampfireHeal @@ -168,21 +173,25 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { | BuffKind::Wet | BuffKind::Ensnared | BuffKind::Poisoned - | BuffKind::Hastened => "".to_owned(), + | BuffKind::Hastened => Cow::Borrowed(""), }; write!(&mut description, "{}", buff_desc).unwrap(); let dur_desc = if let Some(dur_secs) = dur_secs { match buff.kind { - BuffKind::Saturation | BuffKind::Regeneration => i18n - .get("buff.text.over_seconds") - .replace("{dur_secs}", &format_float(dur_secs)), + BuffKind::Saturation | BuffKind::Regeneration => { + i18n.get_msg_ctx("buff-text-over_seconds", &i18n::fluent_args! { + "dur_secs" => dur_secs + }) + }, BuffKind::IncreaseMaxEnergy | BuffKind::IncreaseMaxHealth - | BuffKind::Invulnerability => i18n - .get("buff.text.for_seconds") - .replace("{dur_secs}", &format_float(dur_secs)), + | BuffKind::Invulnerability => { + i18n.get_msg_ctx("buff-text-for_seconds", &i18n::fluent_args! { + "dur_secs" => dur_secs + }) + }, BuffKind::Bleeding | BuffKind::Burning | BuffKind::Potion @@ -195,12 +204,12 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { | BuffKind::Wet | BuffKind::Ensnared | BuffKind::Poisoned - | BuffKind::Hastened => "".to_owned(), + | BuffKind::Hastened => Cow::Borrowed(""), } } else if let BuffKind::Saturation | BuffKind::Regeneration = buff.kind { - i18n.get("buff.text.every_second").to_string() + i18n.get("buff.text.every_second") } else { - "".to_owned() + Cow::Borrowed("") }; write!(&mut description, " {}", dur_desc).unwrap(); @@ -212,7 +221,7 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { } // Armor -fn armor_kind<'a>(armor: &Armor, i18n: &'a Localization) -> &'a str { +fn armor_kind<'a>(armor: &Armor, i18n: &'a Localization) -> Cow<'a, str> { let kind = match armor.kind { ArmorKind::Shoulder => i18n.get("hud.bag.shoulders"), ArmorKind::Chest => i18n.get("hud.bag.chest"), @@ -231,7 +240,7 @@ fn armor_kind<'a>(armor: &Armor, i18n: &'a Localization) -> &'a str { } // Tool -fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> &'a str { +fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { let kind = match tool.kind { ToolKind::Sword => i18n.get("common.weapons.sword"), ToolKind::Axe => i18n.get("common.weapons.axe"), @@ -253,7 +262,7 @@ fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> &'a str { } /// Output the number of hands needed to hold a tool -pub fn tool_hands<'a>(tool: &Tool, i18n: &'a Localization) -> &'a str { +pub fn tool_hands<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { let hands = match tool.hands { Hands::One => i18n.get("common.hands.one"), Hands::Two => i18n.get("common.hands.two"), @@ -347,19 +356,14 @@ pub fn ability_image(imgs: &img_ids::Imgs, ability_id: &str) -> image::Id { } pub fn ability_description<'a>( - ability_id: &'a str, + ability_id: &str, loc: &'a Localization, -) -> (Cow<'a, str>, &'a str) { +) -> (Cow<'a, str>, Cow<'a, str>) { + // TODO: Use attribute mechanic let (name, desc) = ( format!("{}.name", ability_id), format!("{}.desc", ability_id), ); - ( - Cow::Borrowed( - loc.get_or(&name, "common.abilities.unknown.name") - .unwrap_or(ability_id), - ), - loc.get_or(&desc, "common.abilities.unknown.desc") - .unwrap_or(ability_id), - ) + + (loc.get(&name), loc.get(&desc)) } diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 86c43540aa..7d5567889b 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -249,7 +249,6 @@ fn main() { settings.language.selected_language = i18n::REFERENCE_LANG.to_owned(); LocalizationHandle::load_expect(&settings.language.selected_language) }); - i18n.read().log_missing_entries(); i18n.set_english_fallback(settings.language.use_english_fallback); // Create window diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index cc70cc635d..73fa288619 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -210,7 +210,7 @@ impl PlayState for CharSelectionState { global_state.info_message = Some( localized_strings .get("main.login.server_shut_down") - .to_owned(), + .into_owned(), ); return PlayStateResult::Pop; }, @@ -226,7 +226,7 @@ impl PlayState for CharSelectionState { }, Err(err) => { global_state.info_message = - Some(localized_strings.get("common.connection_lost").to_owned()); + Some(localized_strings.get("common.connection_lost").into_owned()); error!(?err, "[char_selection] Failed to tick the client"); return PlayStateResult::Pop; }, diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index ac8584cd23..f2f0bfa3ec 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -553,7 +553,9 @@ impl Controls { .size(fonts.cyri.scale(26)) .into(), Text::new( - i18n.get("char_selection.uncanny_valley"), // TODO: Add actual location here + // TODO: Add actual location here + i18n.get("char_selection.uncanny_valley") + .into_owned(), ) .into(), ]), @@ -599,7 +601,7 @@ impl Controls { let button = Button::new( new_character_button, Container::new(Text::new( - i18n.get("char_selection.create_new_character"), + i18n.get("char_selection.create_new_character").to_owned(), )) .width(Length::Fill) .height(Length::Fill) @@ -678,7 +680,7 @@ impl Controls { let logout = neat_button( logout_button, - i18n.get("char_selection.logout"), + i18n.get("char_selection.logout").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::Logout), @@ -686,7 +688,7 @@ impl Controls { let enter_world = neat_button( enter_world_button, - i18n.get("char_selection.enter_world"), + i18n.get("char_selection.enter_world").into_owned(), FILL_FRAC_TWO, button_style, selected.map(|_| Message::EnterWorld), @@ -715,20 +717,20 @@ impl Controls { if let Some(info_content) = info_content { let over_content: Element<_> = match &info_content { InfoContent::Deletion(_) => Column::with_children(vec![ - Text::new(i18n.get("char_selection.delete_permanently")) + Text::new(i18n.get("char_selection.delete_permanently").into_owned()) .size(fonts.cyri.scale(24)) .into(), Row::with_children(vec![ neat_button( no_button, - i18n.get("common.no"), + i18n.get("common.no").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::CancelDeletion), ), neat_button( yes_button, - i18n.get("common.yes"), + i18n.get("common.yes").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::ConfirmDeletion), @@ -742,22 +744,22 @@ impl Controls { .spacing(10) .into(), InfoContent::LoadingCharacters => { - Text::new(i18n.get("char_selection.loading_characters")) + Text::new(i18n.get("char_selection.loading_characters").into_owned()) .size(fonts.cyri.scale(24)) .into() }, InfoContent::CreatingCharacter => { - Text::new(i18n.get("char_selection.creating_character")) + Text::new(i18n.get("char_selection.creating_character").into_owned()) .size(fonts.cyri.scale(24)) .into() }, InfoContent::EditingCharacter => { - Text::new(i18n.get("char_selection.editing_character")) + Text::new(i18n.get("char_selection.editing_character").into_owned()) .size(fonts.cyri.scale(24)) .into() }, InfoContent::DeletingCharacter => { - Text::new(i18n.get("char_selection.deleting_character")) + Text::new(i18n.get("char_selection.deleting_character").into_owned()) .size(fonts.cyri.scale(24)) .into() }, @@ -765,7 +767,7 @@ impl Controls { Text::new(error).size(fonts.cyri.scale(24)).into(), Row::with_children(vec![neat_button( no_button, - i18n.get("common.close"), + i18n.get("common.close").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::ClearCharacterListError), @@ -846,10 +848,13 @@ impl Controls { .style(style::container::Style::image(img)) }; let icon_button_tooltip = |button, selected, msg, img, tooltip_i18n_key| { - icon_button(button, selected, msg, img) - .with_tooltip(tooltip_manager, move || { - tooltip::text(i18n.get(tooltip_i18n_key), tooltip_style) - }) + icon_button(button, selected, msg, img).with_tooltip( + tooltip_manager, + move || { + let tooltip_text = i18n.get(tooltip_i18n_key); + tooltip::text(&tooltip_text, tooltip_style) + }, + ) }; // TODO: tooltips @@ -1112,7 +1117,7 @@ impl Controls { let slider_options = Column::with_children(vec![ char_slider( - i18n.get("char_selection.hair_style"), + &i18n.get("char_selection.hair_style"), &mut sliders.hair_style, body.species.num_hair_styles(body.body_type) - 1, body.hair_style, @@ -1120,7 +1125,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.hair_color"), + &i18n.get("char_selection.hair_color"), &mut sliders.hair_color, body.species.num_hair_colors() - 1, body.hair_color, @@ -1128,7 +1133,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.skin"), + &i18n.get("char_selection.skin"), &mut sliders.skin, body.species.num_skin_colors() - 1, body.skin, @@ -1136,7 +1141,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.eyeshape"), + &i18n.get("char_selection.eyeshape"), &mut sliders.eyes, body.species.num_eyes(body.body_type) - 1, body.eyes, @@ -1144,7 +1149,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.eye_color"), + &i18n.get("char_selection.eye_color"), &mut sliders.eye_color, body.species.num_eye_colors() - 1, body.eye_color, @@ -1153,7 +1158,7 @@ impl Controls { ), char_slider_greyable( body.species.num_accessories(body.body_type) > 1, - i18n.get("char_selection.accessories"), + &i18n.get("char_selection.accessories"), &mut sliders.accessory, body.species.num_accessories(body.body_type) - 1, body.accessory, @@ -1162,7 +1167,7 @@ impl Controls { ), char_slider_greyable( body.species.num_beards(body.body_type) > 1, - i18n.get("char_selection.beard"), + &i18n.get("char_selection.beard"), &mut sliders.beard, body.species.num_beards(body.body_type) - 1, body.beard, @@ -1185,7 +1190,8 @@ impl Controls { ) .on_press(Message::RandomizeCharacter) .with_tooltip(tooltip_manager, move || { - tooltip::text(i18n.get("common.rand_appearance"), tooltip_style) + let tooltip_text = i18n.get("common.rand_appearance"); + tooltip::text(&tooltip_text, tooltip_style) }); let column_content = vec![ @@ -1244,7 +1250,7 @@ impl Controls { let back = neat_button( back_button, - i18n.get("common.back"), + i18n.get("common.back").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::Back), @@ -1262,7 +1268,8 @@ impl Controls { ) .on_press(Message::RandomizeName) .with_tooltip(tooltip_manager, move || { - tooltip::text(i18n.get("common.rand_name"), tooltip_style) + let tooltip_text = i18n.get("common.rand_name"); + tooltip::text(&tooltip_text, tooltip_style) }); let confirm_msg = if let Some(character_id) = character_id { @@ -1277,7 +1284,7 @@ impl Controls { .fix_aspect_ratio(), TextInput::new( name_input, - i18n.get("character_window.character_name"), + &i18n.get("character_window.character_name"), name, Message::Name, ) @@ -1314,10 +1321,8 @@ impl Controls { let create: Element = if name.is_empty() { create .with_tooltip(tooltip_manager, move || { - tooltip::text( - i18n.get("char_selection.create_info_name"), - tooltip_style, - ) + let tooltip_text = i18n.get("char_selection.create_info_name"); + tooltip::text(&tooltip_text, tooltip_style) }) .into() } else { diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index bd6a14f170..1353fdbdb4 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -115,35 +115,51 @@ impl PlayState for MainMenuState { self.main_menu_ui.cancel_connection(); let server_err = match e { server::Error::NetworkErr(e) => localized_strings - .get("main.servers.network_error") - .to_owned() - .replace("{raw_error}", e.to_string().as_str()), + .get_msg_ctx("main-servers-network_error", &i18n::fluent_args! { + "raw_error" => e.to_string() + }) + .into_owned(), server::Error::ParticipantErr(e) => localized_strings - .get("main.servers.participant_error") - .to_owned() - .replace("{raw_error}", e.to_string().as_str()), + .get_msg_ctx( + "main-servers-participant_error", + &i18n::fluent_args! { + "raw_error" => e.to_string() + }, + ) + .into_owned(), server::Error::StreamErr(e) => localized_strings - .get("main.servers.stream_error") - .to_owned() - .replace("{raw_error}", e.to_string().as_str()), + .get_msg_ctx("main-servers-stream_error", &i18n::fluent_args! { + "raw_error" => e.to_string() + }) + .into_owned(), server::Error::DatabaseErr(e) => localized_strings - .get("main.servers.database_error") - .to_owned() - .replace("{raw_error}", e.to_string().as_str()), + .get_msg_ctx("main-servers-database_error", &i18n::fluent_args! { + "raw_error" => e.to_string() + }) + .into_owned(), server::Error::PersistenceErr(e) => localized_strings - .get("main.servers.persistence_error") - .to_owned() - .replace("{raw_error}", e.to_string().as_str()), + .get_msg_ctx( + "main-servers-persistence_error", + &i18n::fluent_args! { + "raw_error" => e.to_string() + }, + ) + .into_owned(), server::Error::Other(e) => localized_strings - .get("main.servers.other_error") - .to_owned() - .replace("{raw_error}", e.as_str()), + .get_msg_ctx("main-servers-other_error", &i18n::fluent_args! { + "raw_error" => e, + }) + .into_owned(), }; global_state.info_message = Some( localized_strings - .get("main.servers.singleplayer_error") - .to_owned() - .replace("{sp_error}", server_err.as_str()), + .get_msg_ctx( + "main-servers-singleplayer_error", + &i18n::fluent_args! { + "sp_error" => server_err + }, + ) + .into_owned(), ); }, Err(_) => (), @@ -179,9 +195,10 @@ impl PlayState for MainMenuState { error!(?e, "Client Init failed"); global_state.info_message = Some( localized_strings - .get("main.login.client_init_failed") - .to_owned() - .replace("{init_fail_reason}", e.as_str()), + .get_msg_ctx("main-login-client_init_failed", &i18n::fluent_args! { + "init_fail_reason" => e + }) + .into_owned(), ); }, Some(InitMsg::IsAuthTrusted(auth_server)) => { @@ -221,7 +238,7 @@ impl PlayState for MainMenuState { global_state.info_message = Some( localized_strings .get("main.login.server_shut_down") - .to_owned(), + .into_owned(), ); self.init = InitState::None; }, @@ -231,7 +248,7 @@ impl PlayState for MainMenuState { }, Err(err) => { global_state.info_message = - Some(localized_strings.get("common.connection_lost").to_owned()); + Some(localized_strings.get("common.connection_lost").into_owned()); error!(?err, "[main menu] Failed to tick the client"); self.init = InitState::None; }, @@ -320,7 +337,6 @@ impl PlayState for MainMenuState { global_state.i18n = LocalizationHandle::load_expect( &global_state.settings.language.selected_language, ); - global_state.i18n.read().log_missing_entries(); global_state .i18n .set_english_fallback(global_state.settings.language.use_english_fallback); @@ -449,7 +465,7 @@ fn get_client_msg_error( ))) => net_error( localization .get("main.login.network_wrong_version") - .to_owned(), + .into_owned(), mismatched_server_info, ), Error::NetworkErr(e) => net_error(e.to_string(), mismatched_server_info), @@ -507,15 +523,16 @@ fn attempt_login( *info_message = Some( localization .get("main.login.username_bad_characters") - .to_owned(), + .into_owned(), ); }, comp::AliasError::TooLong => { *info_message = Some( localization - .get("main.login.username_too_long") - .to_owned() - .replace("{max_len}", comp::MAX_ALIAS_LEN.to_string().as_str()), + .get_msg_ctx("main-login-username_too_long", &i18n::fluent_args! { + "max_len" => comp::MAX_ALIAS_LEN + }) + .into_owned(), ); }, } diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index e99d64b973..6990fef10e 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -102,38 +102,33 @@ impl Screen { let children = match connection_state { ConnectionState::InProgress => { let tip = if show_tip { - let tip = &i18n.get_variation("loading.tips", self.tip_number); - let mut new_tip = String::with_capacity(tip.len()); - let mut last_index = 0; - - // This could be done with regex instead, but adding new dependencies is - // scary... - tip.match_indices("{gameinput.").for_each(|(start, s)| { - if let Some(end) = tip[start + s.len()..].find('}') { - let end = start + s.len() + end; - if let Ok(game_input) = GameInput::from_str(&tip[start + 1..end]) { - new_tip.push_str(&tip[last_index..start]); - new_tip.push_str( - match controls.keybindings.get(&game_input) { - Some(Some(key_mouse)) => { - key_mouse.display_string(key_layout) - }, - Some(None) => i18n.get("main.unbound_key_tip").to_string(), - None => ControlSettings::default_binding(game_input) - .display_string(key_layout), - } - .as_str(), - ); - last_index = end + 1; + let key = |code| { + if let Ok(game_input) = GameInput::from_str(code) { + match controls.keybindings.get(&game_input) { + Some(Some(key_mouse)) => key_mouse.display_string(key_layout), + Some(None) => i18n.get("main.unbound_key_tip").into_owned(), + None => ControlSettings::default_binding(game_input) + .display_string(key_layout), } + } else { + "code".to_owned() } - }); - // If there is any text left over append it - if last_index < tip.len() { - new_tip.push_str(&tip[last_index..]); - } + }; + let keys = i18n::fluent_args! { + "gameinput-togglelantern" => key("gameinput.togglelantern"), + "gameinput-help" => key("gameinput.help"), + "gameinput-settings" => key("gameinput.settings"), + "gameinput-social" => key("gameinput.social"), + "gameinput-dance" => key("gameinput.dance"), + "gameinput-glide" => key("gameinput.glide"), + "gameinput-sit" => key("gameinput.sit"), + "gameinput-crafting" => key("gameinput.crafting"), + "gameinput-roll" => key("gameinput.roll"), + "gameinput-screenshot" => key("gameinput.screenshot"), + }; + let tip = &i18n.get_variation_ctx("loading-tips", self.tip_number, &keys); + let tip = format!("{} {}", i18n.get("main.tip"), tip); - let tip = format!("{} {}", i18n.get("main.tip"), new_tip.as_str()); Container::new(Text::new(tip).size(fonts.cyri.scale(25))) .width(Length::Fill) .height(Length::Fill) diff --git a/voxygen/src/menu/main/ui/login.rs b/voxygen/src/menu/main/ui/login.rs index 9aeb1e729d..02d14be554 100644 --- a/voxygen/src/menu/main/ui/login.rs +++ b/voxygen/src/menu/main/ui/login.rs @@ -363,7 +363,7 @@ impl LoginBanner { .fix_aspect_ratio(), TextInput::new( &mut self.username, - i18n.get("main.username"), + &i18n.get("main.username"), &login_info.username, Message::Username, ) @@ -378,7 +378,7 @@ impl LoginBanner { .fix_aspect_ratio(), TextInput::new( &mut self.password, - i18n.get("main.password"), + &i18n.get("main.password"), &login_info.password, Message::Password, ) @@ -394,7 +394,7 @@ impl LoginBanner { .fix_aspect_ratio(), TextInput::new( &mut self.server, - i18n.get("main.server"), + &i18n.get("main.server"), &login_info.server, Message::Server, ) diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index c6e1f5bd16..2ada0a5b28 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -321,8 +321,10 @@ impl SessionState { let message = match time { 0 => String::from(i18n.get("hud.chat.goodbye")), _ => i18n - .get("hud.chat.connection_lost") - .replace("{time}", time.to_string().as_str()), + .get_msg_ctx("hud-chat-connection_lost", &i18n::fluent_args! { + "time" => time + }) + .into_owned(), }; self.hud.new_message(ChatMsg { @@ -835,8 +837,13 @@ impl PlayState for SessionState { let msg = global_state .i18n .read() - .get("hud.trade.invite_sent") - .replace("{playername}", &name); + .get_msg_ctx( + "hud-trade-invite_sent", + &i18n::fluent_args! { + "playername" => &name + }, + ) + .into_owned(); self.hud .new_message(ChatType::Meta.chat_msg(msg)); client.send_invite(uid, InviteKind::Trade) @@ -1079,7 +1086,7 @@ impl PlayState for SessionState { .i18n .read() .get("common.connection_lost") - .to_owned(), + .into_owned(), ); error!("[session] Failed to tick the scene: {:?}", err); diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 475f474272..2a3d8275b7 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -600,7 +600,6 @@ impl SettingsChange { settings.language.selected_language = new_language.language_identifier; global_state.i18n = LocalizationHandle::load_expect(&settings.language.selected_language); - global_state.i18n.read().log_missing_entries(); global_state .i18n .set_english_fallback(settings.language.use_english_fallback); diff --git a/voxygen/src/ui/ice/component/tooltip.rs b/voxygen/src/ui/ice/component/tooltip.rs index c53c693095..d20e89b971 100644 --- a/voxygen/src/ui/ice/component/tooltip.rs +++ b/voxygen/src/ui/ice/component/tooltip.rs @@ -15,7 +15,7 @@ pub struct Style { } /// Tooltip that is just text -pub fn text<'a, M: 'a>(text: &'a str, style: Style) -> Element<'a, M, ui::IcedRenderer> { +pub fn text<'a, M: 'a>(text: &str, style: Style) -> Element<'a, M, ui::IcedRenderer> { Container::new( Text::new(text) .color(style.text_color) diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 18bd46559a..37a5ca9062 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -1260,8 +1260,8 @@ impl<'a> Widget for ItemTooltip<'a> { item.item_definition_id(), self.localized_strings, ) { - //Get localized tooltip strings (gotten here because these should only show if - // in a trade- aka if buy/sell prices are present) + // Get localized tooltip strings (gotten here because these should + // only show if in a trade- aka if buy/sell prices are present) let tt_hint_1 = self.localized_strings.get("hud.trade.tooltip_hint_1"); let tt_hint_2 = self.localized_strings.get("hud.trade.tooltip_hint_2"); From 8bdf63b3f7cb6f6772a18c41d7b7dc59d9ca24cb Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 6 Aug 2022 17:00:46 +0300 Subject: [PATCH 012/854] Update fluent fork --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1281921b7..0858e84264 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1905,7 +1905,7 @@ dependencies = [ [[package]] name = "fluent" version = "0.16.0" -source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" +source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" dependencies = [ "fluent-bundle", "unic-langid", @@ -1914,7 +1914,7 @@ dependencies = [ [[package]] name = "fluent-bundle" version = "0.15.2" -source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" +source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" dependencies = [ "fluent-langneg", "fluent-syntax", @@ -1938,7 +1938,7 @@ dependencies = [ [[package]] name = "fluent-syntax" version = "0.11.0" -source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" +source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" dependencies = [ "thiserror", ] @@ -2843,7 +2843,7 @@ dependencies = [ [[package]] name = "intl-memoizer" version = "0.5.1" -source = "git+https://github.com/juliancoffee/fluent-rs.git#cfaf910cd5dd915619d7def671140fd5311383b6" +source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" dependencies = [ "type-map", "unic-langid", From a994984b091599772a85cdc538b7f968726e981d Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 6 Aug 2022 21:52:41 +0300 Subject: [PATCH 013/854] Migrate i18n files to new format --- assets/voxygen/i18n/ar_SA/buff.ftl | 0 assets/voxygen/i18n/ar_SA/buff.ron | 10 - assets/voxygen/i18n/ar_SA/char_selection.ftl | 6 + assets/voxygen/i18n/ar_SA/char_selection.ron | 16 - assets/voxygen/i18n/ar_SA/common.ftl | 0 assets/voxygen/i18n/ar_SA/common.ron | 10 - assets/voxygen/i18n/ar_SA/esc_menu.ftl | 2 + assets/voxygen/i18n/ar_SA/esc_menu.ron | 12 - assets/voxygen/i18n/ar_SA/gameinput.ftl | 0 assets/voxygen/i18n/ar_SA/gameinput.ron | 10 - assets/voxygen/i18n/ar_SA/hud/bag.ftl | 0 assets/voxygen/i18n/ar_SA/hud/bag.ron | 10 - assets/voxygen/i18n/ar_SA/hud/char_window.ftl | 9 + assets/voxygen/i18n/ar_SA/hud/char_window.ron | 20 -- assets/voxygen/i18n/ar_SA/hud/chat.ftl | 2 + assets/voxygen/i18n/ar_SA/hud/chat.ron | 12 - assets/voxygen/i18n/ar_SA/hud/crafting.ftl | 0 assets/voxygen/i18n/ar_SA/hud/crafting.ron | 10 - assets/voxygen/i18n/ar_SA/hud/group.ftl | 9 + assets/voxygen/i18n/ar_SA/hud/group.ron | 19 -- assets/voxygen/i18n/ar_SA/hud/map.ftl | 17 + assets/voxygen/i18n/ar_SA/hud/map.ron | 25 -- assets/voxygen/i18n/ar_SA/hud/misc.ftl | 2 + assets/voxygen/i18n/ar_SA/hud/misc.ron | 12 - assets/voxygen/i18n/ar_SA/hud/sct.ftl | 1 + assets/voxygen/i18n/ar_SA/hud/sct.ron | 12 - assets/voxygen/i18n/ar_SA/hud/settings.ftl | 0 assets/voxygen/i18n/ar_SA/hud/settings.ron | 10 - assets/voxygen/i18n/ar_SA/hud/skills.ftl | 0 assets/voxygen/i18n/ar_SA/hud/skills.ron | 10 - assets/voxygen/i18n/ar_SA/hud/social.ftl | 5 + assets/voxygen/i18n/ar_SA/hud/social.ron | 16 - assets/voxygen/i18n/ar_SA/hud/trade.ftl | 5 + assets/voxygen/i18n/ar_SA/hud/trade.ron | 16 - assets/voxygen/i18n/ar_SA/main.ftl | 0 assets/voxygen/i18n/ar_SA/main.ron | 10 - assets/voxygen/i18n/ar_SA/npc.ftl | 0 assets/voxygen/i18n/ar_SA/npc.ron | 10 - assets/voxygen/i18n/ar_SA/template.ftl | 0 assets/voxygen/i18n/ar_SA/template.ron | 10 - assets/voxygen/i18n/be_BY/buff.ftl | 39 +++ assets/voxygen/i18n/be_BY/buff.ron | 54 --- assets/voxygen/i18n/be_BY/char_selection.ftl | 22 ++ assets/voxygen/i18n/be_BY/char_selection.ron | 33 -- assets/voxygen/i18n/be_BY/common.ftl | 104 ++++++ assets/voxygen/i18n/be_BY/common.ron | 126 ------- assets/voxygen/i18n/be_BY/esc_menu.ftl | 2 + assets/voxygen/i18n/be_BY/esc_menu.ron | 13 - assets/voxygen/i18n/be_BY/gameinput.ftl | 66 ++++ assets/voxygen/i18n/be_BY/gameinput.ron | 77 ----- assets/voxygen/i18n/be_BY/hud/bag.ftl | 40 +++ assets/voxygen/i18n/be_BY/hud/bag.ron | 48 --- assets/voxygen/i18n/be_BY/hud/char_window.ftl | 9 + assets/voxygen/i18n/be_BY/hud/char_window.ron | 21 -- assets/voxygen/i18n/be_BY/hud/chat.ftl | 29 ++ assets/voxygen/i18n/be_BY/hud/chat.ron | 49 --- assets/voxygen/i18n/be_BY/hud/crafting.ftl | 34 ++ assets/voxygen/i18n/be_BY/hud/crafting.ron | 42 --- assets/voxygen/i18n/be_BY/hud/group.ftl | 13 + assets/voxygen/i18n/be_BY/hud/group.ron | 24 -- assets/voxygen/i18n/be_BY/hud/map.ftl | 33 ++ assets/voxygen/i18n/be_BY/hud/map.ron | 41 --- assets/voxygen/i18n/be_BY/hud/misc.ftl | 43 +++ assets/voxygen/i18n/be_BY/hud/misc.ron | 63 ---- assets/voxygen/i18n/be_BY/hud/sct.ftl | 2 + assets/voxygen/i18n/be_BY/hud/sct.ron | 14 - assets/voxygen/i18n/be_BY/hud/settings.ftl | 127 +++++++ assets/voxygen/i18n/be_BY/hud/settings.ron | 141 -------- assets/voxygen/i18n/be_BY/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/be_BY/hud/skills.ron | 257 --------------- assets/voxygen/i18n/be_BY/hud/social.ftl | 10 + assets/voxygen/i18n/be_BY/hud/social.ron | 22 -- assets/voxygen/i18n/be_BY/hud/trade.ftl | 26 ++ assets/voxygen/i18n/be_BY/hud/trade.ron | 32 -- assets/voxygen/i18n/be_BY/main.ftl | 95 ++++++ assets/voxygen/i18n/be_BY/main.ron | 115 ------- assets/voxygen/i18n/be_BY/npc.ftl | 210 ++++++++++++ assets/voxygen/i18n/be_BY/npc.ron | 248 -------------- assets/voxygen/i18n/be_BY/template.ftl | 0 assets/voxygen/i18n/be_BY/template.ron | 12 - assets/voxygen/i18n/ca_CA/buff.ftl | 39 +++ assets/voxygen/i18n/ca_CA/buff.ron | 54 --- assets/voxygen/i18n/ca_CA/char_selection.ftl | 22 ++ assets/voxygen/i18n/ca_CA/char_selection.ron | 32 -- assets/voxygen/i18n/ca_CA/common.ftl | 104 ++++++ assets/voxygen/i18n/ca_CA/common.ron | 126 ------- assets/voxygen/i18n/ca_CA/esc_menu.ftl | 2 + assets/voxygen/i18n/ca_CA/esc_menu.ron | 13 - assets/voxygen/i18n/ca_CA/gameinput.ftl | 66 ++++ assets/voxygen/i18n/ca_CA/gameinput.ron | 77 ----- assets/voxygen/i18n/ca_CA/hud/bag.ftl | 40 +++ assets/voxygen/i18n/ca_CA/hud/bag.ron | 48 --- assets/voxygen/i18n/ca_CA/hud/char_window.ftl | 9 + assets/voxygen/i18n/ca_CA/hud/char_window.ron | 21 -- assets/voxygen/i18n/ca_CA/hud/chat.ftl | 29 ++ assets/voxygen/i18n/ca_CA/hud/chat.ron | 49 --- assets/voxygen/i18n/ca_CA/hud/crafting.ftl | 33 ++ assets/voxygen/i18n/ca_CA/hud/crafting.ron | 42 --- assets/voxygen/i18n/ca_CA/hud/group.ftl | 13 + assets/voxygen/i18n/ca_CA/hud/group.ron | 24 -- assets/voxygen/i18n/ca_CA/hud/map.ftl | 34 ++ assets/voxygen/i18n/ca_CA/hud/map.ron | 41 --- assets/voxygen/i18n/ca_CA/hud/misc.ftl | 43 +++ assets/voxygen/i18n/ca_CA/hud/misc.ron | 63 ---- assets/voxygen/i18n/ca_CA/hud/sct.ftl | 2 + assets/voxygen/i18n/ca_CA/hud/sct.ron | 14 - assets/voxygen/i18n/ca_CA/hud/settings.ftl | 123 +++++++ assets/voxygen/i18n/ca_CA/hud/settings.ron | 141 -------- assets/voxygen/i18n/ca_CA/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/ca_CA/hud/skills.ron | 257 --------------- assets/voxygen/i18n/ca_CA/hud/social.ftl | 10 + assets/voxygen/i18n/ca_CA/hud/social.ron | 22 -- assets/voxygen/i18n/ca_CA/hud/trade.ftl | 26 ++ assets/voxygen/i18n/ca_CA/hud/trade.ron | 32 -- assets/voxygen/i18n/ca_CA/main.ftl | 95 ++++++ assets/voxygen/i18n/ca_CA/main.ron | 115 ------- assets/voxygen/i18n/ca_CA/npc.ftl | 210 ++++++++++++ assets/voxygen/i18n/ca_CA/npc.ron | 248 -------------- assets/voxygen/i18n/ca_CA/template.ftl | 0 assets/voxygen/i18n/ca_CA/template.ron | 12 - assets/voxygen/i18n/cz_CZ/buff.ftl | 37 +++ assets/voxygen/i18n/cz_CZ/buff.ron | 52 --- assets/voxygen/i18n/cz_CZ/char_selection.ftl | 22 ++ assets/voxygen/i18n/cz_CZ/char_selection.ron | 32 -- assets/voxygen/i18n/cz_CZ/common.ftl | 100 ++++++ assets/voxygen/i18n/cz_CZ/common.ron | 121 ------- assets/voxygen/i18n/cz_CZ/esc_menu.ftl | 2 + assets/voxygen/i18n/cz_CZ/esc_menu.ron | 13 - assets/voxygen/i18n/cz_CZ/gameinput.ftl | 62 ++++ assets/voxygen/i18n/cz_CZ/gameinput.ron | 73 ---- assets/voxygen/i18n/cz_CZ/hud/bag.ftl | 38 +++ assets/voxygen/i18n/cz_CZ/hud/bag.ron | 76 ----- assets/voxygen/i18n/cz_CZ/hud/char_window.ftl | 9 + assets/voxygen/i18n/cz_CZ/hud/char_window.ron | 22 -- assets/voxygen/i18n/cz_CZ/hud/chat.ftl | 29 ++ assets/voxygen/i18n/cz_CZ/hud/chat.ron | 49 --- assets/voxygen/i18n/cz_CZ/hud/crafting.ftl | 25 ++ assets/voxygen/i18n/cz_CZ/hud/crafting.ron | 38 --- assets/voxygen/i18n/cz_CZ/hud/group.ftl | 13 + assets/voxygen/i18n/cz_CZ/hud/group.ron | 24 -- assets/voxygen/i18n/cz_CZ/hud/map.ftl | 31 ++ assets/voxygen/i18n/cz_CZ/hud/map.ron | 38 --- assets/voxygen/i18n/cz_CZ/hud/misc.ftl | 34 ++ assets/voxygen/i18n/cz_CZ/hud/misc.ron | 54 --- assets/voxygen/i18n/cz_CZ/hud/sct.ftl | 2 + assets/voxygen/i18n/cz_CZ/hud/sct.ron | 14 - assets/voxygen/i18n/cz_CZ/hud/settings.ftl | 119 +++++++ assets/voxygen/i18n/cz_CZ/hud/settings.ron | 137 -------- assets/voxygen/i18n/cz_CZ/hud/skills.ftl | 230 +++++++++++++ assets/voxygen/i18n/cz_CZ/hud/skills.ron | 247 -------------- assets/voxygen/i18n/cz_CZ/hud/social.ftl | 10 + assets/voxygen/i18n/cz_CZ/hud/social.ron | 24 -- assets/voxygen/i18n/cz_CZ/hud/trade.ftl | 17 + assets/voxygen/i18n/cz_CZ/hud/trade.ron | 30 -- assets/voxygen/i18n/cz_CZ/main.ftl | 74 +++++ assets/voxygen/i18n/cz_CZ/main.ron | 90 ----- assets/voxygen/i18n/cz_CZ/npc.ftl | 138 ++++++++ assets/voxygen/i18n/cz_CZ/npc.ron | 152 --------- assets/voxygen/i18n/de_DE/buff.ftl | 35 ++ assets/voxygen/i18n/de_DE/buff.ron | 50 --- assets/voxygen/i18n/de_DE/char_selection.ftl | 22 ++ assets/voxygen/i18n/de_DE/char_selection.ron | 32 -- assets/voxygen/i18n/de_DE/common.ftl | 100 ++++++ assets/voxygen/i18n/de_DE/common.ron | 121 ------- assets/voxygen/i18n/de_DE/esc_menu.ftl | 2 + assets/voxygen/i18n/de_DE/esc_menu.ron | 13 - assets/voxygen/i18n/de_DE/gameinput.ftl | 64 ++++ assets/voxygen/i18n/de_DE/gameinput.ron | 75 ----- assets/voxygen/i18n/de_DE/hud/bag.ftl | 40 +++ assets/voxygen/i18n/de_DE/hud/bag.ron | 48 --- assets/voxygen/i18n/de_DE/hud/char_window.ftl | 9 + assets/voxygen/i18n/de_DE/hud/char_window.ron | 21 -- assets/voxygen/i18n/de_DE/hud/chat.ftl | 29 ++ assets/voxygen/i18n/de_DE/hud/chat.ron | 49 --- assets/voxygen/i18n/de_DE/hud/crafting.ftl | 35 ++ assets/voxygen/i18n/de_DE/hud/crafting.ron | 41 --- assets/voxygen/i18n/de_DE/hud/group.ftl | 13 + assets/voxygen/i18n/de_DE/hud/group.ron | 24 -- assets/voxygen/i18n/de_DE/hud/map.ftl | 31 ++ assets/voxygen/i18n/de_DE/hud/map.ron | 38 --- assets/voxygen/i18n/de_DE/hud/misc.ftl | 36 ++ assets/voxygen/i18n/de_DE/hud/misc.ron | 55 ---- assets/voxygen/i18n/de_DE/hud/sct.ftl | 2 + assets/voxygen/i18n/de_DE/hud/sct.ron | 14 - assets/voxygen/i18n/de_DE/hud/settings.ftl | 120 +++++++ assets/voxygen/i18n/de_DE/hud/settings.ron | 138 -------- assets/voxygen/i18n/de_DE/hud/skills.ftl | 241 ++++++++++++++ assets/voxygen/i18n/de_DE/hud/skills.ron | 259 --------------- assets/voxygen/i18n/de_DE/hud/social.ftl | 10 + assets/voxygen/i18n/de_DE/hud/social.ron | 22 -- assets/voxygen/i18n/de_DE/hud/trade.ftl | 25 ++ assets/voxygen/i18n/de_DE/hud/trade.ron | 32 -- assets/voxygen/i18n/de_DE/main.ftl | 89 +++++ assets/voxygen/i18n/de_DE/main.ron | 106 ------ assets/voxygen/i18n/de_DE/npc.ftl | 177 ++++++++++ assets/voxygen/i18n/de_DE/npc.ron | 198 ----------- assets/voxygen/i18n/de_DE/template.ftl | 0 assets/voxygen/i18n/de_DE/template.ron | 12 - assets/voxygen/i18n/en/buff.ftl | 39 +++ assets/voxygen/i18n/en/buff.ron | 54 --- assets/voxygen/i18n/en/char_selection.ftl | 22 ++ assets/voxygen/i18n/en/char_selection.ron | 32 -- assets/voxygen/i18n/en/common.ftl | 108 ++++++ assets/voxygen/i18n/en/common.ron | 130 -------- assets/voxygen/i18n/en/esc_menu.ftl | 2 + assets/voxygen/i18n/en/esc_menu.ron | 13 - assets/voxygen/i18n/en/gameinput.ftl | 66 ++++ assets/voxygen/i18n/en/gameinput.ron | 77 ----- assets/voxygen/i18n/en/hud/ability.ftl | 16 + assets/voxygen/i18n/en/hud/ability.ron | 35 -- assets/voxygen/i18n/en/hud/bag.ftl | 41 +++ assets/voxygen/i18n/en/hud/bag.ron | 49 --- assets/voxygen/i18n/en/hud/char_window.ftl | 9 + assets/voxygen/i18n/en/hud/char_window.ron | 21 -- assets/voxygen/i18n/en/hud/chat.ftl | 29 ++ assets/voxygen/i18n/en/hud/chat.ron | 49 --- assets/voxygen/i18n/en/hud/crafting.ftl | 44 +++ assets/voxygen/i18n/en/hud/crafting.ron | 53 --- assets/voxygen/i18n/en/hud/group.ftl | 13 + assets/voxygen/i18n/en/hud/group.ron | 24 -- assets/voxygen/i18n/en/hud/map.ftl | 34 ++ assets/voxygen/i18n/en/hud/map.ron | 41 --- assets/voxygen/i18n/en/hud/misc.ftl | 46 +++ assets/voxygen/i18n/en/hud/misc.ron | 66 ---- assets/voxygen/i18n/en/hud/sct.ftl | 2 + assets/voxygen/i18n/en/hud/sct.ron | 14 - assets/voxygen/i18n/en/hud/settings.ftl | 135 ++++++++ assets/voxygen/i18n/en/hud/settings.ron | 153 --------- assets/voxygen/i18n/en/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/en/hud/skills.ron | 257 --------------- assets/voxygen/i18n/en/hud/social.ftl | 10 + assets/voxygen/i18n/en/hud/social.ron | 22 -- assets/voxygen/i18n/en/hud/trade.ftl | 26 ++ assets/voxygen/i18n/en/hud/trade.ron | 32 -- assets/voxygen/i18n/en/main.ftl | 95 ++++++ assets/voxygen/i18n/en/main.ron | 115 ------- assets/voxygen/i18n/en/npc.ftl | 216 ++++++++++++ assets/voxygen/i18n/en/npc.ron | 256 -------------- assets/voxygen/i18n/en/template.ftl | 0 assets/voxygen/i18n/en/template.ron | 12 - assets/voxygen/i18n/es_ES/buff.ftl | 37 +++ assets/voxygen/i18n/es_ES/buff.ron | 52 --- assets/voxygen/i18n/es_ES/char_selection.ftl | 22 ++ assets/voxygen/i18n/es_ES/char_selection.ron | 32 -- assets/voxygen/i18n/es_ES/common.ftl | 105 ++++++ assets/voxygen/i18n/es_ES/common.ron | 153 --------- assets/voxygen/i18n/es_ES/esc_menu.ftl | 2 + assets/voxygen/i18n/es_ES/esc_menu.ron | 13 - assets/voxygen/i18n/es_ES/gameinput.ftl | 66 ++++ assets/voxygen/i18n/es_ES/gameinput.ron | 77 ----- assets/voxygen/i18n/es_ES/hud/bag.ftl | 40 +++ assets/voxygen/i18n/es_ES/hud/bag.ron | 48 --- assets/voxygen/i18n/es_ES/hud/char_window.ftl | 9 + assets/voxygen/i18n/es_ES/hud/char_window.ron | 21 -- assets/voxygen/i18n/es_ES/hud/chat.ftl | 29 ++ assets/voxygen/i18n/es_ES/hud/chat.ron | 49 --- assets/voxygen/i18n/es_ES/hud/crafting.ftl | 34 ++ assets/voxygen/i18n/es_ES/hud/crafting.ron | 42 --- assets/voxygen/i18n/es_ES/hud/group.ftl | 13 + assets/voxygen/i18n/es_ES/hud/group.ron | 24 -- assets/voxygen/i18n/es_ES/hud/map.ftl | 31 ++ assets/voxygen/i18n/es_ES/hud/map.ron | 38 --- assets/voxygen/i18n/es_ES/hud/misc.ftl | 43 +++ assets/voxygen/i18n/es_ES/hud/misc.ron | 63 ---- assets/voxygen/i18n/es_ES/hud/sct.ftl | 2 + assets/voxygen/i18n/es_ES/hud/sct.ron | 14 - assets/voxygen/i18n/es_ES/hud/settings.ftl | 121 +++++++ assets/voxygen/i18n/es_ES/hud/settings.ron | 138 -------- assets/voxygen/i18n/es_ES/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/es_ES/hud/skills.ron | 257 --------------- assets/voxygen/i18n/es_ES/hud/social.ftl | 10 + assets/voxygen/i18n/es_ES/hud/social.ron | 21 -- assets/voxygen/i18n/es_ES/hud/trade.ftl | 25 ++ assets/voxygen/i18n/es_ES/hud/trade.ron | 32 -- assets/voxygen/i18n/es_ES/main.ftl | 94 ++++++ assets/voxygen/i18n/es_ES/main.ron | 114 ------- assets/voxygen/i18n/es_ES/npc.ftl | 177 ++++++++++ assets/voxygen/i18n/es_ES/npc.ron | 199 ----------- assets/voxygen/i18n/es_LA/buff.ftl | 37 +++ assets/voxygen/i18n/es_LA/buff.ron | 52 --- assets/voxygen/i18n/es_LA/char_selection.ftl | 22 ++ assets/voxygen/i18n/es_LA/char_selection.ron | 32 -- assets/voxygen/i18n/es_LA/common.ftl | 104 ++++++ assets/voxygen/i18n/es_LA/common.ron | 126 ------- assets/voxygen/i18n/es_LA/esc_menu.ftl | 2 + assets/voxygen/i18n/es_LA/esc_menu.ron | 13 - assets/voxygen/i18n/es_LA/gameinput.ftl | 66 ++++ assets/voxygen/i18n/es_LA/gameinput.ron | 77 ----- assets/voxygen/i18n/es_LA/hud/bag.ftl | 40 +++ assets/voxygen/i18n/es_LA/hud/bag.ron | 48 --- assets/voxygen/i18n/es_LA/hud/char_window.ftl | 9 + assets/voxygen/i18n/es_LA/hud/char_window.ron | 22 -- assets/voxygen/i18n/es_LA/hud/chat.ftl | 29 ++ assets/voxygen/i18n/es_LA/hud/chat.ron | 49 --- assets/voxygen/i18n/es_LA/hud/crafting.ftl | 33 ++ assets/voxygen/i18n/es_LA/hud/crafting.ron | 42 --- assets/voxygen/i18n/es_LA/hud/group.ftl | 13 + assets/voxygen/i18n/es_LA/hud/group.ron | 24 -- assets/voxygen/i18n/es_LA/hud/map.ftl | 35 ++ assets/voxygen/i18n/es_LA/hud/map.ron | 39 --- assets/voxygen/i18n/es_LA/hud/misc.ftl | 45 +++ assets/voxygen/i18n/es_LA/hud/misc.ron | 64 ---- assets/voxygen/i18n/es_LA/hud/sct.ftl | 2 + assets/voxygen/i18n/es_LA/hud/sct.ron | 14 - assets/voxygen/i18n/es_LA/hud/settings.ftl | 122 +++++++ assets/voxygen/i18n/es_LA/hud/settings.ron | 140 -------- assets/voxygen/i18n/es_LA/hud/skills.ftl | 238 ++++++++++++++ assets/voxygen/i18n/es_LA/hud/skills.ron | 259 --------------- assets/voxygen/i18n/es_LA/hud/social.ftl | 10 + assets/voxygen/i18n/es_LA/hud/social.ron | 22 -- assets/voxygen/i18n/es_LA/hud/trade.ftl | 25 ++ assets/voxygen/i18n/es_LA/hud/trade.ron | 32 -- assets/voxygen/i18n/es_LA/main.ftl | 99 ++++++ assets/voxygen/i18n/es_LA/main.ron | 120 ------- assets/voxygen/i18n/es_LA/npc.ftl | 177 ++++++++++ assets/voxygen/i18n/es_LA/npc.ron | 198 ----------- assets/voxygen/i18n/eu/buff.ftl | 32 ++ assets/voxygen/i18n/eu/buff.ron | 47 --- assets/voxygen/i18n/eu/char_selection.ftl | 21 ++ assets/voxygen/i18n/eu/char_selection.ron | 31 -- assets/voxygen/i18n/eu/common.ftl | 87 +++++ assets/voxygen/i18n/eu/common.ron | 108 ------ assets/voxygen/i18n/eu/esc_menu.ftl | 2 + assets/voxygen/i18n/eu/esc_menu.ron | 13 - assets/voxygen/i18n/eu/gameinput.ftl | 43 +++ assets/voxygen/i18n/eu/gameinput.ron | 54 --- assets/voxygen/i18n/eu/hud/bag.ftl | 33 ++ assets/voxygen/i18n/eu/hud/bag.ron | 45 --- assets/voxygen/i18n/eu/hud/char_window.ftl | 1 + assets/voxygen/i18n/eu/hud/char_window.ron | 12 - assets/voxygen/i18n/eu/hud/chat.ftl | 29 ++ assets/voxygen/i18n/eu/hud/chat.ron | 49 --- assets/voxygen/i18n/eu/hud/crafting.ftl | 25 ++ assets/voxygen/i18n/eu/hud/crafting.ron | 38 --- assets/voxygen/i18n/eu/hud/group.ftl | 13 + assets/voxygen/i18n/eu/hud/group.ron | 24 -- assets/voxygen/i18n/eu/hud/map.ftl | 31 ++ assets/voxygen/i18n/eu/hud/map.ron | 38 --- assets/voxygen/i18n/eu/hud/misc.ftl | 17 + assets/voxygen/i18n/eu/hud/misc.ron | 34 -- assets/voxygen/i18n/eu/hud/sct.ftl | 2 + assets/voxygen/i18n/eu/hud/sct.ron | 14 - assets/voxygen/i18n/eu/hud/settings.ftl | 98 ++++++ assets/voxygen/i18n/eu/hud/settings.ron | 116 ------- assets/voxygen/i18n/eu/hud/skills.ftl | 0 assets/voxygen/i18n/eu/hud/skills.ron | 12 - assets/voxygen/i18n/eu/hud/social.ftl | 10 + assets/voxygen/i18n/eu/hud/social.ron | 22 -- assets/voxygen/i18n/eu/hud/trade.ftl | 23 ++ assets/voxygen/i18n/eu/hud/trade.ron | 32 -- assets/voxygen/i18n/eu/main.ftl | 75 +++++ assets/voxygen/i18n/eu/main.ron | 91 ----- assets/voxygen/i18n/eu/npc.ftl | 117 +++++++ assets/voxygen/i18n/eu/npc.ron | 136 -------- assets/voxygen/i18n/eu/template.ftl | 0 assets/voxygen/i18n/eu/template.ron | 12 - assets/voxygen/i18n/fr_FR/buff.ftl | 40 +++ assets/voxygen/i18n/fr_FR/buff.ron | 55 ---- assets/voxygen/i18n/fr_FR/char_selection.ftl | 22 ++ assets/voxygen/i18n/fr_FR/char_selection.ron | 34 -- assets/voxygen/i18n/fr_FR/char_window.ftl | 9 + assets/voxygen/i18n/fr_FR/char_window.ron | 21 -- assets/voxygen/i18n/fr_FR/common.ftl | 104 ++++++ assets/voxygen/i18n/fr_FR/common.ron | 125 ------- assets/voxygen/i18n/fr_FR/esc_menu.ftl | 2 + assets/voxygen/i18n/fr_FR/esc_menu.ron | 13 - assets/voxygen/i18n/fr_FR/gameinput.ftl | 66 ++++ assets/voxygen/i18n/fr_FR/gameinput.ron | 77 ----- assets/voxygen/i18n/fr_FR/hud/bag.ftl | 40 +++ assets/voxygen/i18n/fr_FR/hud/bag.ron | 48 --- assets/voxygen/i18n/fr_FR/hud/chat.ftl | 29 ++ assets/voxygen/i18n/fr_FR/hud/chat.ron | 50 --- assets/voxygen/i18n/fr_FR/hud/crafting.ftl | 33 ++ assets/voxygen/i18n/fr_FR/hud/crafting.ron | 42 --- assets/voxygen/i18n/fr_FR/hud/group.ftl | 13 + assets/voxygen/i18n/fr_FR/hud/group.ron | 24 -- assets/voxygen/i18n/fr_FR/hud/map.ftl | 34 ++ assets/voxygen/i18n/fr_FR/hud/map.ron | 41 --- assets/voxygen/i18n/fr_FR/hud/misc.ftl | 43 +++ assets/voxygen/i18n/fr_FR/hud/misc.ron | 63 ---- assets/voxygen/i18n/fr_FR/hud/sct.ftl | 2 + assets/voxygen/i18n/fr_FR/hud/sct.ron | 14 - assets/voxygen/i18n/fr_FR/hud/settings.ftl | 123 +++++++ assets/voxygen/i18n/fr_FR/hud/settings.ron | 141 -------- assets/voxygen/i18n/fr_FR/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/fr_FR/hud/skills.ron | 258 --------------- assets/voxygen/i18n/fr_FR/hud/social.ftl | 10 + assets/voxygen/i18n/fr_FR/hud/social.ron | 21 -- assets/voxygen/i18n/fr_FR/hud/trade.ftl | 26 ++ assets/voxygen/i18n/fr_FR/hud/trade.ron | 33 -- assets/voxygen/i18n/fr_FR/main.ftl | 94 ++++++ assets/voxygen/i18n/fr_FR/main.ron | 112 ------- assets/voxygen/i18n/fr_FR/npc.ftl | 216 ++++++++++++ assets/voxygen/i18n/fr_FR/npc.ron | 256 -------------- assets/voxygen/i18n/hu_HU/buff.ftl | 37 +++ assets/voxygen/i18n/hu_HU/buff.ron | 52 --- assets/voxygen/i18n/hu_HU/char_selection.ftl | 22 ++ assets/voxygen/i18n/hu_HU/char_selection.ron | 32 -- assets/voxygen/i18n/hu_HU/common.ftl | 98 ++++++ assets/voxygen/i18n/hu_HU/common.ron | 119 ------- assets/voxygen/i18n/hu_HU/esc_menu.ftl | 2 + assets/voxygen/i18n/hu_HU/esc_menu.ron | 13 - assets/voxygen/i18n/hu_HU/gameinput.ftl | 62 ++++ assets/voxygen/i18n/hu_HU/gameinput.ron | 73 ---- assets/voxygen/i18n/hu_HU/hud/bag.ftl | 40 +++ assets/voxygen/i18n/hu_HU/hud/bag.ron | 48 --- assets/voxygen/i18n/hu_HU/hud/char_window.ftl | 9 + assets/voxygen/i18n/hu_HU/hud/char_window.ron | 21 -- assets/voxygen/i18n/hu_HU/hud/chat.ftl | 29 ++ assets/voxygen/i18n/hu_HU/hud/chat.ron | 49 --- assets/voxygen/i18n/hu_HU/hud/crafting.ftl | 25 ++ assets/voxygen/i18n/hu_HU/hud/crafting.ron | 38 --- assets/voxygen/i18n/hu_HU/hud/group.ftl | 13 + assets/voxygen/i18n/hu_HU/hud/group.ron | 24 -- assets/voxygen/i18n/hu_HU/hud/map.ftl | 33 ++ assets/voxygen/i18n/hu_HU/hud/map.ron | 38 --- assets/voxygen/i18n/hu_HU/hud/misc.ftl | 34 ++ assets/voxygen/i18n/hu_HU/hud/misc.ron | 54 --- assets/voxygen/i18n/hu_HU/hud/sct.ftl | 2 + assets/voxygen/i18n/hu_HU/hud/sct.ron | 14 - assets/voxygen/i18n/hu_HU/hud/settings.ftl | 116 +++++++ assets/voxygen/i18n/hu_HU/hud/settings.ron | 136 -------- assets/voxygen/i18n/hu_HU/hud/skills.ftl | 237 +++++++++++++ assets/voxygen/i18n/hu_HU/hud/skills.ron | 256 -------------- assets/voxygen/i18n/hu_HU/hud/social.ftl | 10 + assets/voxygen/i18n/hu_HU/hud/social.ron | 22 -- assets/voxygen/i18n/hu_HU/hud/trade.ftl | 23 ++ assets/voxygen/i18n/hu_HU/hud/trade.ron | 30 -- assets/voxygen/i18n/hu_HU/main.ftl | 77 +++++ assets/voxygen/i18n/hu_HU/main.ron | 93 ------ assets/voxygen/i18n/hu_HU/npc.ftl | 163 +++++++++ assets/voxygen/i18n/hu_HU/npc.ron | 183 ----------- assets/voxygen/i18n/it_IT/buff.ftl | 39 +++ assets/voxygen/i18n/it_IT/buff.ron | 54 --- assets/voxygen/i18n/it_IT/char_selection.ftl | 22 ++ assets/voxygen/i18n/it_IT/char_selection.ron | 32 -- assets/voxygen/i18n/it_IT/common.ftl | 104 ++++++ assets/voxygen/i18n/it_IT/common.ron | 126 ------- assets/voxygen/i18n/it_IT/esc_menu.ftl | 2 + assets/voxygen/i18n/it_IT/esc_menu.ron | 13 - assets/voxygen/i18n/it_IT/gameinput.ftl | 66 ++++ assets/voxygen/i18n/it_IT/gameinput.ron | 77 ----- assets/voxygen/i18n/it_IT/hud/bag.ftl | 40 +++ assets/voxygen/i18n/it_IT/hud/bag.ron | 48 --- assets/voxygen/i18n/it_IT/hud/char_window.ftl | 9 + assets/voxygen/i18n/it_IT/hud/char_window.ron | 21 -- assets/voxygen/i18n/it_IT/hud/chat.ftl | 29 ++ assets/voxygen/i18n/it_IT/hud/chat.ron | 49 --- assets/voxygen/i18n/it_IT/hud/crafting.ftl | 33 ++ assets/voxygen/i18n/it_IT/hud/crafting.ron | 42 --- assets/voxygen/i18n/it_IT/hud/group.ftl | 13 + assets/voxygen/i18n/it_IT/hud/group.ron | 24 -- assets/voxygen/i18n/it_IT/hud/map.ftl | 34 ++ assets/voxygen/i18n/it_IT/hud/map.ron | 41 --- assets/voxygen/i18n/it_IT/hud/misc.ftl | 43 +++ assets/voxygen/i18n/it_IT/hud/misc.ron | 63 ---- assets/voxygen/i18n/it_IT/hud/sct.ftl | 2 + assets/voxygen/i18n/it_IT/hud/sct.ron | 14 - assets/voxygen/i18n/it_IT/hud/settings.ftl | 123 +++++++ assets/voxygen/i18n/it_IT/hud/settings.ron | 141 -------- assets/voxygen/i18n/it_IT/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/it_IT/hud/skills.ron | 257 --------------- assets/voxygen/i18n/it_IT/hud/social.ftl | 10 + assets/voxygen/i18n/it_IT/hud/social.ron | 22 -- assets/voxygen/i18n/it_IT/hud/trade.ftl | 26 ++ assets/voxygen/i18n/it_IT/hud/trade.ron | 33 -- assets/voxygen/i18n/it_IT/main.ftl | 95 ++++++ assets/voxygen/i18n/it_IT/main.ron | 114 ------- assets/voxygen/i18n/it_IT/npc.ftl | 170 ++++++++++ assets/voxygen/i18n/it_IT/npc.ron | 190 ----------- assets/voxygen/i18n/ja_JP/buff.ftl | 25 ++ assets/voxygen/i18n/ja_JP/buff.ron | 40 --- assets/voxygen/i18n/ja_JP/char_selection.ftl | 21 ++ assets/voxygen/i18n/ja_JP/char_selection.ron | 31 -- assets/voxygen/i18n/ja_JP/common.ftl | 86 +++++ assets/voxygen/i18n/ja_JP/common.ron | 106 ------ assets/voxygen/i18n/ja_JP/esc_menu.ftl | 2 + assets/voxygen/i18n/ja_JP/esc_menu.ron | 13 - assets/voxygen/i18n/ja_JP/gameinput.ftl | 59 ++++ assets/voxygen/i18n/ja_JP/gameinput.ron | 70 ---- assets/voxygen/i18n/ja_JP/hud/bag.ftl | 28 ++ assets/voxygen/i18n/ja_JP/hud/bag.ron | 39 --- assets/voxygen/i18n/ja_JP/hud/char_window.ftl | 9 + assets/voxygen/i18n/ja_JP/hud/char_window.ron | 21 -- assets/voxygen/i18n/ja_JP/hud/chat.ftl | 22 ++ assets/voxygen/i18n/ja_JP/hud/chat.ron | 39 --- assets/voxygen/i18n/ja_JP/hud/crafting.ftl | 5 + assets/voxygen/i18n/ja_JP/hud/crafting.ron | 16 - assets/voxygen/i18n/ja_JP/hud/group.ftl | 13 + assets/voxygen/i18n/ja_JP/hud/group.ron | 24 -- assets/voxygen/i18n/ja_JP/hud/map.ftl | 20 ++ assets/voxygen/i18n/ja_JP/hud/map.ron | 29 -- assets/voxygen/i18n/ja_JP/hud/misc.ftl | 33 ++ assets/voxygen/i18n/ja_JP/hud/misc.ron | 53 --- assets/voxygen/i18n/ja_JP/hud/sct.ftl | 2 + assets/voxygen/i18n/ja_JP/hud/sct.ron | 14 - assets/voxygen/i18n/ja_JP/hud/settings.ftl | 88 +++++ assets/voxygen/i18n/ja_JP/hud/settings.ron | 105 ------ assets/voxygen/i18n/ja_JP/hud/skills.ftl | 230 +++++++++++++ assets/voxygen/i18n/ja_JP/hud/skills.ron | 247 -------------- assets/voxygen/i18n/ja_JP/hud/social.ftl | 10 + assets/voxygen/i18n/ja_JP/hud/social.ron | 22 -- assets/voxygen/i18n/ja_JP/hud/trade.ftl | 21 ++ assets/voxygen/i18n/ja_JP/hud/trade.ron | 28 -- assets/voxygen/i18n/ja_JP/main.ftl | 72 ++++ assets/voxygen/i18n/ja_JP/main.ron | 89 ----- assets/voxygen/i18n/ja_JP/npc.ftl | 159 +++++++++ assets/voxygen/i18n/ja_JP/npc.ron | 178 ---------- assets/voxygen/i18n/nl_NL/buff.ftl | 0 assets/voxygen/i18n/nl_NL/buff.ron | 11 - assets/voxygen/i18n/nl_NL/char_selection.ftl | 21 ++ assets/voxygen/i18n/nl_NL/char_selection.ron | 32 -- assets/voxygen/i18n/nl_NL/common.ftl | 53 +++ assets/voxygen/i18n/nl_NL/common.ron | 71 ---- assets/voxygen/i18n/nl_NL/esc_menu.ftl | 2 + assets/voxygen/i18n/nl_NL/esc_menu.ron | 13 - assets/voxygen/i18n/nl_NL/gameinput.ftl | 55 ++++ assets/voxygen/i18n/nl_NL/gameinput.ron | 66 ---- assets/voxygen/i18n/nl_NL/hud/bag.ftl | 20 ++ assets/voxygen/i18n/nl_NL/hud/bag.ron | 32 -- assets/voxygen/i18n/nl_NL/hud/char_window.ftl | 9 + assets/voxygen/i18n/nl_NL/hud/char_window.ron | 21 -- assets/voxygen/i18n/nl_NL/hud/chat.ftl | 17 + assets/voxygen/i18n/nl_NL/hud/chat.ron | 32 -- assets/voxygen/i18n/nl_NL/hud/crafting.ftl | 5 + assets/voxygen/i18n/nl_NL/hud/crafting.ron | 16 - assets/voxygen/i18n/nl_NL/hud/group.ftl | 12 + assets/voxygen/i18n/nl_NL/hud/group.ron | 23 -- assets/voxygen/i18n/nl_NL/hud/map.ftl | 2 + assets/voxygen/i18n/nl_NL/hud/map.ron | 14 - assets/voxygen/i18n/nl_NL/hud/misc.ftl | 58 ++++ assets/voxygen/i18n/nl_NL/hud/misc.ron | 78 ----- assets/voxygen/i18n/nl_NL/hud/sct.ftl | 2 + assets/voxygen/i18n/nl_NL/hud/sct.ron | 14 - assets/voxygen/i18n/nl_NL/hud/settings.ftl | 77 +++++ assets/voxygen/i18n/nl_NL/hud/settings.ron | 93 ------ assets/voxygen/i18n/nl_NL/hud/skills.ftl | 0 assets/voxygen/i18n/nl_NL/hud/skills.ron | 11 - assets/voxygen/i18n/nl_NL/hud/social.ftl | 10 + assets/voxygen/i18n/nl_NL/hud/social.ron | 22 -- assets/voxygen/i18n/nl_NL/hud/trade.ftl | 0 assets/voxygen/i18n/nl_NL/hud/trade.ron | 12 - assets/voxygen/i18n/nl_NL/main.ftl | 66 ++++ assets/voxygen/i18n/nl_NL/main.ron | 80 ----- assets/voxygen/i18n/nl_NL/npc.ftl | 81 +++++ assets/voxygen/i18n/nl_NL/npc.ron | 93 ------ assets/voxygen/i18n/no_NB/buff.ftl | 11 + assets/voxygen/i18n/no_NB/buff.ron | 25 -- assets/voxygen/i18n/no_NB/char_selection.ftl | 21 ++ assets/voxygen/i18n/no_NB/char_selection.ron | 32 -- assets/voxygen/i18n/no_NB/common.ftl | 54 +++ assets/voxygen/i18n/no_NB/common.ron | 71 ---- assets/voxygen/i18n/no_NB/esc_menu.ftl | 2 + assets/voxygen/i18n/no_NB/esc_menu.ron | 13 - assets/voxygen/i18n/no_NB/gameinput.ftl | 56 ++++ assets/voxygen/i18n/no_NB/gameinput.ron | 67 ---- assets/voxygen/i18n/no_NB/hud/bag.ftl | 20 ++ assets/voxygen/i18n/no_NB/hud/bag.ron | 32 -- assets/voxygen/i18n/no_NB/hud/char_window.ftl | 9 + assets/voxygen/i18n/no_NB/hud/char_window.ron | 22 -- assets/voxygen/i18n/no_NB/hud/chat.ftl | 20 ++ assets/voxygen/i18n/no_NB/hud/chat.ron | 37 --- assets/voxygen/i18n/no_NB/hud/crafting.ftl | 5 + assets/voxygen/i18n/no_NB/hud/crafting.ron | 16 - assets/voxygen/i18n/no_NB/hud/group.ftl | 12 + assets/voxygen/i18n/no_NB/hud/group.ron | 23 -- assets/voxygen/i18n/no_NB/hud/map.ftl | 2 + assets/voxygen/i18n/no_NB/hud/map.ron | 14 - assets/voxygen/i18n/no_NB/hud/misc.ftl | 58 ++++ assets/voxygen/i18n/no_NB/hud/misc.ron | 76 ----- assets/voxygen/i18n/no_NB/hud/sct.ftl | 2 + assets/voxygen/i18n/no_NB/hud/sct.ron | 14 - assets/voxygen/i18n/no_NB/hud/settings.ftl | 78 +++++ assets/voxygen/i18n/no_NB/hud/settings.ron | 95 ------ assets/voxygen/i18n/no_NB/hud/skills.ftl | 0 assets/voxygen/i18n/no_NB/hud/skills.ron | 12 - assets/voxygen/i18n/no_NB/hud/social.ftl | 10 + assets/voxygen/i18n/no_NB/hud/social.ron | 22 -- assets/voxygen/i18n/no_NB/hud/trade.ftl | 0 assets/voxygen/i18n/no_NB/hud/trade.ron | 12 - assets/voxygen/i18n/no_NB/main.ftl | 69 ++++ assets/voxygen/i18n/no_NB/main.ron | 84 ----- assets/voxygen/i18n/no_NB/npc.ftl | 80 +++++ assets/voxygen/i18n/no_NB/npc.ron | 92 ------ assets/voxygen/i18n/pl_PL/buff.ftl | 39 +++ assets/voxygen/i18n/pl_PL/buff.ron | 54 --- assets/voxygen/i18n/pl_PL/char_selection.ftl | 22 ++ assets/voxygen/i18n/pl_PL/char_selection.ron | 32 -- assets/voxygen/i18n/pl_PL/common.ftl | 108 ++++++ assets/voxygen/i18n/pl_PL/common.ron | 130 -------- assets/voxygen/i18n/pl_PL/esc_menu.ftl | 2 + assets/voxygen/i18n/pl_PL/esc_menu.ron | 13 - assets/voxygen/i18n/pl_PL/gameinput.ftl | 66 ++++ assets/voxygen/i18n/pl_PL/gameinput.ron | 77 ----- assets/voxygen/i18n/pl_PL/hud/ability.ftl | 16 + assets/voxygen/i18n/pl_PL/hud/ability.ron | 35 -- assets/voxygen/i18n/pl_PL/hud/bag.ftl | 41 +++ assets/voxygen/i18n/pl_PL/hud/bag.ron | 49 --- assets/voxygen/i18n/pl_PL/hud/char_window.ftl | 9 + assets/voxygen/i18n/pl_PL/hud/char_window.ron | 21 -- assets/voxygen/i18n/pl_PL/hud/chat.ftl | 29 ++ assets/voxygen/i18n/pl_PL/hud/chat.ron | 49 --- assets/voxygen/i18n/pl_PL/hud/crafting.ftl | 44 +++ assets/voxygen/i18n/pl_PL/hud/crafting.ron | 53 --- assets/voxygen/i18n/pl_PL/hud/group.ftl | 13 + assets/voxygen/i18n/pl_PL/hud/group.ron | 24 -- assets/voxygen/i18n/pl_PL/hud/map.ftl | 34 ++ assets/voxygen/i18n/pl_PL/hud/map.ron | 41 --- assets/voxygen/i18n/pl_PL/hud/misc.ftl | 46 +++ assets/voxygen/i18n/pl_PL/hud/misc.ron | 66 ---- assets/voxygen/i18n/pl_PL/hud/sct.ftl | 2 + assets/voxygen/i18n/pl_PL/hud/sct.ron | 13 - assets/voxygen/i18n/pl_PL/hud/settings.ftl | 132 ++++++++ assets/voxygen/i18n/pl_PL/hud/settings.ron | 151 --------- assets/voxygen/i18n/pl_PL/hud/skills.ftl | 241 ++++++++++++++ assets/voxygen/i18n/pl_PL/hud/skills.ron | 257 --------------- assets/voxygen/i18n/pl_PL/hud/social.ftl | 10 + assets/voxygen/i18n/pl_PL/hud/social.ron | 21 -- assets/voxygen/i18n/pl_PL/hud/trade.ftl | 26 ++ assets/voxygen/i18n/pl_PL/hud/trade.ron | 32 -- assets/voxygen/i18n/pl_PL/main.ftl | 95 ++++++ assets/voxygen/i18n/pl_PL/main.ron | 116 ------- assets/voxygen/i18n/pl_PL/npc.ftl | 154 +++++++++ assets/voxygen/i18n/pl_PL/npc.ron | 199 ----------- assets/voxygen/i18n/pt_BR/buff.ftl | 39 +++ assets/voxygen/i18n/pt_BR/buff.ron | 54 --- assets/voxygen/i18n/pt_BR/char_selection.ftl | 22 ++ assets/voxygen/i18n/pt_BR/char_selection.ron | 32 -- assets/voxygen/i18n/pt_BR/common.ftl | 108 ++++++ assets/voxygen/i18n/pt_BR/common.ron | 130 -------- assets/voxygen/i18n/pt_BR/esc_menu.ftl | 2 + assets/voxygen/i18n/pt_BR/esc_menu.ron | 13 - assets/voxygen/i18n/pt_BR/gameinput.ftl | 66 ++++ assets/voxygen/i18n/pt_BR/gameinput.ron | 77 ----- assets/voxygen/i18n/pt_BR/hud/ability.ftl | 16 + assets/voxygen/i18n/pt_BR/hud/ability.ron | 35 -- assets/voxygen/i18n/pt_BR/hud/bag.ftl | 41 +++ assets/voxygen/i18n/pt_BR/hud/bag.ron | 49 --- assets/voxygen/i18n/pt_BR/hud/char_window.ftl | 9 + assets/voxygen/i18n/pt_BR/hud/char_window.ron | 21 -- assets/voxygen/i18n/pt_BR/hud/chat.ftl | 29 ++ assets/voxygen/i18n/pt_BR/hud/chat.ron | 49 --- assets/voxygen/i18n/pt_BR/hud/crafting.ftl | 44 +++ assets/voxygen/i18n/pt_BR/hud/crafting.ron | 53 --- assets/voxygen/i18n/pt_BR/hud/group.ftl | 13 + assets/voxygen/i18n/pt_BR/hud/group.ron | 24 -- assets/voxygen/i18n/pt_BR/hud/map.ftl | 34 ++ assets/voxygen/i18n/pt_BR/hud/map.ron | 41 --- assets/voxygen/i18n/pt_BR/hud/misc.ftl | 46 +++ assets/voxygen/i18n/pt_BR/hud/misc.ron | 66 ---- assets/voxygen/i18n/pt_BR/hud/sct.ftl | 2 + assets/voxygen/i18n/pt_BR/hud/sct.ron | 14 - assets/voxygen/i18n/pt_BR/hud/settings.ftl | 132 ++++++++ assets/voxygen/i18n/pt_BR/hud/settings.ron | 150 --------- assets/voxygen/i18n/pt_BR/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/pt_BR/hud/skills.ron | 257 --------------- assets/voxygen/i18n/pt_BR/hud/social.ftl | 10 + assets/voxygen/i18n/pt_BR/hud/social.ron | 21 -- assets/voxygen/i18n/pt_BR/hud/trade.ftl | 26 ++ assets/voxygen/i18n/pt_BR/hud/trade.ron | 33 -- assets/voxygen/i18n/pt_BR/main.ftl | 93 ++++++ assets/voxygen/i18n/pt_BR/main.ron | 112 ------- assets/voxygen/i18n/pt_BR/npc.ftl | 169 ++++++++++ assets/voxygen/i18n/pt_BR/npc.ron | 190 ----------- assets/voxygen/i18n/pt_PT/buff.ftl | 0 assets/voxygen/i18n/pt_PT/buff.ron | 11 - assets/voxygen/i18n/pt_PT/char_selection.ftl | 18 + assets/voxygen/i18n/pt_PT/char_selection.ron | 29 -- assets/voxygen/i18n/pt_PT/common.ftl | 41 +++ assets/voxygen/i18n/pt_PT/common.ron | 57 ---- assets/voxygen/i18n/pt_PT/esc_menu.ftl | 2 + assets/voxygen/i18n/pt_PT/esc_menu.ron | 13 - assets/voxygen/i18n/pt_PT/gameinput.ftl | 0 assets/voxygen/i18n/pt_PT/gameinput.ron | 11 - assets/voxygen/i18n/pt_PT/hud/bag.ftl | 0 assets/voxygen/i18n/pt_PT/hud/bag.ron | 11 - assets/voxygen/i18n/pt_PT/hud/char_window.ftl | 7 + assets/voxygen/i18n/pt_PT/hud/char_window.ron | 19 -- assets/voxygen/i18n/pt_PT/hud/chat.ftl | 0 assets/voxygen/i18n/pt_PT/hud/chat.ron | 11 - assets/voxygen/i18n/pt_PT/hud/crafting.ftl | 0 assets/voxygen/i18n/pt_PT/hud/crafting.ron | 11 - assets/voxygen/i18n/pt_PT/hud/group.ftl | 0 assets/voxygen/i18n/pt_PT/hud/group.ron | 11 - assets/voxygen/i18n/pt_PT/hud/map.ftl | 0 assets/voxygen/i18n/pt_PT/hud/map.ron | 11 - assets/voxygen/i18n/pt_PT/hud/misc.ftl | 60 ++++ assets/voxygen/i18n/pt_PT/hud/misc.ron | 76 ----- assets/voxygen/i18n/pt_PT/hud/sct.ftl | 0 assets/voxygen/i18n/pt_PT/hud/sct.ron | 11 - assets/voxygen/i18n/pt_PT/hud/settings.ftl | 123 +++++++ assets/voxygen/i18n/pt_PT/hud/settings.ron | 138 -------- assets/voxygen/i18n/pt_PT/hud/skills.ftl | 0 assets/voxygen/i18n/pt_PT/hud/skills.ron | 11 - assets/voxygen/i18n/pt_PT/hud/social.ftl | 6 + assets/voxygen/i18n/pt_PT/hud/social.ron | 18 - assets/voxygen/i18n/pt_PT/hud/trade.ftl | 0 assets/voxygen/i18n/pt_PT/hud/trade.ron | 12 - assets/voxygen/i18n/pt_PT/main.ftl | 45 +++ assets/voxygen/i18n/pt_PT/main.ron | 58 ---- assets/voxygen/i18n/pt_PT/npc.ftl | 0 assets/voxygen/i18n/pt_PT/npc.ron | 12 - assets/voxygen/i18n/ru_RU/buff.ftl | 39 +++ assets/voxygen/i18n/ru_RU/buff.ron | 54 --- assets/voxygen/i18n/ru_RU/char_selection.ftl | 22 ++ assets/voxygen/i18n/ru_RU/char_selection.ron | 32 -- assets/voxygen/i18n/ru_RU/common.ftl | 108 ++++++ assets/voxygen/i18n/ru_RU/common.ron | 130 -------- assets/voxygen/i18n/ru_RU/esc_menu.ftl | 2 + assets/voxygen/i18n/ru_RU/esc_menu.ron | 13 - assets/voxygen/i18n/ru_RU/gameinput.ftl | 66 ++++ assets/voxygen/i18n/ru_RU/gameinput.ron | 77 ----- assets/voxygen/i18n/ru_RU/hud/bag.ftl | 41 +++ assets/voxygen/i18n/ru_RU/hud/bag.ron | 49 --- assets/voxygen/i18n/ru_RU/hud/char_window.ftl | 9 + assets/voxygen/i18n/ru_RU/hud/char_window.ron | 21 -- assets/voxygen/i18n/ru_RU/hud/chat.ftl | 29 ++ assets/voxygen/i18n/ru_RU/hud/chat.ron | 49 --- assets/voxygen/i18n/ru_RU/hud/crafting.ftl | 44 +++ assets/voxygen/i18n/ru_RU/hud/crafting.ron | 53 --- assets/voxygen/i18n/ru_RU/hud/group.ftl | 13 + assets/voxygen/i18n/ru_RU/hud/group.ron | 24 -- assets/voxygen/i18n/ru_RU/hud/map.ftl | 38 +++ assets/voxygen/i18n/ru_RU/hud/map.ron | 41 --- assets/voxygen/i18n/ru_RU/hud/misc.ftl | 45 +++ assets/voxygen/i18n/ru_RU/hud/misc.ron | 65 ---- assets/voxygen/i18n/ru_RU/hud/sct.ftl | 2 + assets/voxygen/i18n/ru_RU/hud/sct.ron | 14 - assets/voxygen/i18n/ru_RU/hud/settings.ftl | 131 ++++++++ assets/voxygen/i18n/ru_RU/hud/settings.ron | 143 -------- assets/voxygen/i18n/ru_RU/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/ru_RU/hud/skills.ron | 257 --------------- assets/voxygen/i18n/ru_RU/hud/social.ftl | 10 + assets/voxygen/i18n/ru_RU/hud/social.ron | 22 -- assets/voxygen/i18n/ru_RU/hud/trade.ftl | 26 ++ assets/voxygen/i18n/ru_RU/hud/trade.ron | 32 -- assets/voxygen/i18n/ru_RU/main.ftl | 91 +++++ assets/voxygen/i18n/ru_RU/main.ron | 109 ------ assets/voxygen/i18n/ru_RU/npc.ftl | 211 ++++++++++++ assets/voxygen/i18n/ru_RU/npc.ron | 249 -------------- assets/voxygen/i18n/sr_SR/buff.ftl | 37 +++ assets/voxygen/i18n/sr_SR/buff.ron | 52 --- assets/voxygen/i18n/sr_SR/char_selection.ftl | 22 ++ assets/voxygen/i18n/sr_SR/char_selection.ron | 32 -- assets/voxygen/i18n/sr_SR/common.ftl | 100 ++++++ assets/voxygen/i18n/sr_SR/common.ron | 121 ------- assets/voxygen/i18n/sr_SR/esc_menu.ftl | 2 + assets/voxygen/i18n/sr_SR/esc_menu.ron | 13 - assets/voxygen/i18n/sr_SR/gameinput.ftl | 65 ++++ assets/voxygen/i18n/sr_SR/gameinput.ron | 76 ----- assets/voxygen/i18n/sr_SR/hud/bag.ftl | 40 +++ assets/voxygen/i18n/sr_SR/hud/bag.ron | 48 --- assets/voxygen/i18n/sr_SR/hud/char_window.ftl | 9 + assets/voxygen/i18n/sr_SR/hud/char_window.ron | 21 -- assets/voxygen/i18n/sr_SR/hud/chat.ftl | 29 ++ assets/voxygen/i18n/sr_SR/hud/chat.ron | 49 --- assets/voxygen/i18n/sr_SR/hud/crafting.ftl | 25 ++ assets/voxygen/i18n/sr_SR/hud/crafting.ron | 38 --- assets/voxygen/i18n/sr_SR/hud/group.ftl | 13 + assets/voxygen/i18n/sr_SR/hud/group.ron | 24 -- assets/voxygen/i18n/sr_SR/hud/map.ftl | 31 ++ assets/voxygen/i18n/sr_SR/hud/map.ron | 38 --- assets/voxygen/i18n/sr_SR/hud/misc.ftl | 34 ++ assets/voxygen/i18n/sr_SR/hud/misc.ron | 54 --- assets/voxygen/i18n/sr_SR/hud/sct.ftl | 2 + assets/voxygen/i18n/sr_SR/hud/sct.ron | 14 - assets/voxygen/i18n/sr_SR/hud/settings.ftl | 116 +++++++ assets/voxygen/i18n/sr_SR/hud/settings.ron | 134 -------- assets/voxygen/i18n/sr_SR/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/sr_SR/hud/skills.ron | 257 --------------- assets/voxygen/i18n/sr_SR/hud/social.ftl | 10 + assets/voxygen/i18n/sr_SR/hud/social.ron | 21 -- assets/voxygen/i18n/sr_SR/hud/trade.ftl | 23 ++ assets/voxygen/i18n/sr_SR/hud/trade.ron | 31 -- assets/voxygen/i18n/sr_SR/main.ftl | 75 +++++ assets/voxygen/i18n/sr_SR/main.ron | 91 ----- assets/voxygen/i18n/sr_SR/npc.ftl | 170 ++++++++++ assets/voxygen/i18n/sr_SR/npc.ron | 190 ----------- assets/voxygen/i18n/sr_SR/template.ftl | 0 assets/voxygen/i18n/sr_SR/template.ron | 12 - assets/voxygen/i18n/sv_SE/buff.ftl | 37 +++ assets/voxygen/i18n/sv_SE/buff.ron | 52 --- assets/voxygen/i18n/sv_SE/char_selection.ftl | 22 ++ assets/voxygen/i18n/sv_SE/char_selection.ron | 32 -- assets/voxygen/i18n/sv_SE/common.ftl | 104 ++++++ assets/voxygen/i18n/sv_SE/common.ron | 126 ------- assets/voxygen/i18n/sv_SE/esc_menu.ftl | 2 + assets/voxygen/i18n/sv_SE/esc_menu.ron | 13 - assets/voxygen/i18n/sv_SE/gameinput.ftl | 66 ++++ assets/voxygen/i18n/sv_SE/gameinput.ron | 77 ----- assets/voxygen/i18n/sv_SE/hud/bag.ftl | 40 +++ assets/voxygen/i18n/sv_SE/hud/bag.ron | 48 --- assets/voxygen/i18n/sv_SE/hud/char_window.ftl | 9 + assets/voxygen/i18n/sv_SE/hud/char_window.ron | 21 -- assets/voxygen/i18n/sv_SE/hud/chat.ftl | 29 ++ assets/voxygen/i18n/sv_SE/hud/chat.ron | 49 --- assets/voxygen/i18n/sv_SE/hud/crafting.ftl | 33 ++ assets/voxygen/i18n/sv_SE/hud/crafting.ron | 42 --- assets/voxygen/i18n/sv_SE/hud/group.ftl | 13 + assets/voxygen/i18n/sv_SE/hud/group.ron | 24 -- assets/voxygen/i18n/sv_SE/hud/map.ftl | 32 ++ assets/voxygen/i18n/sv_SE/hud/map.ron | 39 --- assets/voxygen/i18n/sv_SE/hud/misc.ftl | 43 +++ assets/voxygen/i18n/sv_SE/hud/misc.ron | 63 ---- assets/voxygen/i18n/sv_SE/hud/sct.ftl | 2 + assets/voxygen/i18n/sv_SE/hud/sct.ron | 14 - assets/voxygen/i18n/sv_SE/hud/settings.ftl | 122 +++++++ assets/voxygen/i18n/sv_SE/hud/settings.ron | 140 -------- assets/voxygen/i18n/sv_SE/hud/skills.ftl | 237 +++++++++++++ assets/voxygen/i18n/sv_SE/hud/skills.ron | 255 -------------- assets/voxygen/i18n/sv_SE/hud/social.ftl | 10 + assets/voxygen/i18n/sv_SE/hud/social.ron | 22 -- assets/voxygen/i18n/sv_SE/hud/trade.ftl | 25 ++ assets/voxygen/i18n/sv_SE/hud/trade.ron | 32 -- assets/voxygen/i18n/sv_SE/main.ftl | 95 ++++++ assets/voxygen/i18n/sv_SE/main.ron | 114 ------- assets/voxygen/i18n/sv_SE/npc.ftl | 163 +++++++++ assets/voxygen/i18n/sv_SE/npc.ron | 183 ----------- assets/voxygen/i18n/th_TH/buff.ftl | 39 +++ assets/voxygen/i18n/th_TH/buff.ron | 54 --- assets/voxygen/i18n/th_TH/char_selection.ftl | 22 ++ assets/voxygen/i18n/th_TH/char_selection.ron | 32 -- assets/voxygen/i18n/th_TH/common.ftl | 108 ++++++ assets/voxygen/i18n/th_TH/common.ron | 130 -------- assets/voxygen/i18n/th_TH/esc_menu.ftl | 2 + assets/voxygen/i18n/th_TH/esc_menu.ron | 13 - assets/voxygen/i18n/th_TH/gameinput.ftl | 66 ++++ assets/voxygen/i18n/th_TH/gameinput.ron | 77 ----- assets/voxygen/i18n/th_TH/hud/bag.ftl | 37 +++ assets/voxygen/i18n/th_TH/hud/bag.ron | 49 --- assets/voxygen/i18n/th_TH/hud/char_window.ftl | 9 + assets/voxygen/i18n/th_TH/hud/char_window.ron | 21 -- assets/voxygen/i18n/th_TH/hud/chat.ftl | 29 ++ assets/voxygen/i18n/th_TH/hud/chat.ron | 49 --- assets/voxygen/i18n/th_TH/hud/crafting.ftl | 42 +++ assets/voxygen/i18n/th_TH/hud/crafting.ron | 53 --- assets/voxygen/i18n/th_TH/hud/group.ftl | 13 + assets/voxygen/i18n/th_TH/hud/group.ron | 24 -- assets/voxygen/i18n/th_TH/hud/map.ftl | 32 ++ assets/voxygen/i18n/th_TH/hud/map.ron | 41 --- assets/voxygen/i18n/th_TH/hud/misc.ftl | 43 +++ assets/voxygen/i18n/th_TH/hud/misc.ron | 63 ---- assets/voxygen/i18n/th_TH/hud/sct.ftl | 2 + assets/voxygen/i18n/th_TH/hud/sct.ron | 14 - assets/voxygen/i18n/th_TH/hud/settings.ftl | 124 +++++++ assets/voxygen/i18n/th_TH/hud/settings.ron | 142 -------- assets/voxygen/i18n/th_TH/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/th_TH/hud/skills.ron | 258 --------------- assets/voxygen/i18n/th_TH/hud/social.ftl | 10 + assets/voxygen/i18n/th_TH/hud/social.ron | 22 -- assets/voxygen/i18n/th_TH/hud/trade.ftl | 20 ++ assets/voxygen/i18n/th_TH/hud/trade.ron | 32 -- assets/voxygen/i18n/th_TH/main.ftl | 157 +++++++++ assets/voxygen/i18n/th_TH/main.ron | 154 --------- assets/voxygen/i18n/th_TH/npc.ftl | 212 ++++++++++++ assets/voxygen/i18n/th_TH/npc.ron | 250 -------------- assets/voxygen/i18n/th_TH/template.ftl | 0 assets/voxygen/i18n/th_TH/template.ron | 12 - assets/voxygen/i18n/tr_TR/buff.ftl | 37 +++ assets/voxygen/i18n/tr_TR/buff.ron | 52 --- assets/voxygen/i18n/tr_TR/char_selection.ftl | 23 ++ assets/voxygen/i18n/tr_TR/char_selection.ron | 32 -- assets/voxygen/i18n/tr_TR/common.ftl | 98 ++++++ assets/voxygen/i18n/tr_TR/common.ron | 121 ------- assets/voxygen/i18n/tr_TR/esc_menu.ftl | 2 + assets/voxygen/i18n/tr_TR/esc_menu.ron | 13 - assets/voxygen/i18n/tr_TR/gameinput.ftl | 56 ++++ assets/voxygen/i18n/tr_TR/gameinput.ron | 67 ---- assets/voxygen/i18n/tr_TR/hud/bag.ftl | 20 ++ assets/voxygen/i18n/tr_TR/hud/bag.ron | 32 -- assets/voxygen/i18n/tr_TR/hud/char_window.ftl | 9 + assets/voxygen/i18n/tr_TR/hud/char_window.ron | 21 -- assets/voxygen/i18n/tr_TR/hud/chat.ftl | 20 ++ assets/voxygen/i18n/tr_TR/hud/chat.ron | 37 --- assets/voxygen/i18n/tr_TR/hud/crafting.ftl | 5 + assets/voxygen/i18n/tr_TR/hud/crafting.ron | 16 - assets/voxygen/i18n/tr_TR/hud/group.ftl | 12 + assets/voxygen/i18n/tr_TR/hud/group.ron | 23 -- assets/voxygen/i18n/tr_TR/hud/map.ftl | 18 + assets/voxygen/i18n/tr_TR/hud/map.ron | 27 -- assets/voxygen/i18n/tr_TR/hud/misc.ftl | 61 ++++ assets/voxygen/i18n/tr_TR/hud/misc.ron | 78 ----- assets/voxygen/i18n/tr_TR/hud/sct.ftl | 2 + assets/voxygen/i18n/tr_TR/hud/sct.ron | 14 - assets/voxygen/i18n/tr_TR/hud/settings.ftl | 83 +++++ assets/voxygen/i18n/tr_TR/hud/settings.ron | 98 ------ assets/voxygen/i18n/tr_TR/hud/social.ftl | 10 + assets/voxygen/i18n/tr_TR/hud/social.ron | 22 -- assets/voxygen/i18n/tr_TR/main.ftl | 76 +++++ assets/voxygen/i18n/tr_TR/main.ron | 92 ------ assets/voxygen/i18n/tr_TR/npc.ftl | 80 +++++ assets/voxygen/i18n/tr_TR/npc.ron | 92 ------ assets/voxygen/i18n/uk_UA/buff.ftl | 37 +++ assets/voxygen/i18n/uk_UA/buff.ron | 65 ---- assets/voxygen/i18n/uk_UA/char_selection.ftl | 22 ++ assets/voxygen/i18n/uk_UA/char_selection.ron | 32 -- assets/voxygen/i18n/uk_UA/common.ftl | 98 ++++++ assets/voxygen/i18n/uk_UA/common.ron | 128 ------- assets/voxygen/i18n/uk_UA/esc_menu.ftl | 2 + assets/voxygen/i18n/uk_UA/esc_menu.ron | 13 - assets/voxygen/i18n/uk_UA/gameinput.ftl | 63 ++++ assets/voxygen/i18n/uk_UA/gameinput.ron | 74 ----- assets/voxygen/i18n/uk_UA/hud/ability.ftl | 16 + assets/voxygen/i18n/uk_UA/hud/ability.ron | 35 -- assets/voxygen/i18n/uk_UA/hud/bag.ftl | 40 +++ assets/voxygen/i18n/uk_UA/hud/bag.ron | 54 --- assets/voxygen/i18n/uk_UA/hud/char_window.ftl | 9 + assets/voxygen/i18n/uk_UA/hud/char_window.ron | 21 -- assets/voxygen/i18n/uk_UA/hud/chat.ftl | 29 ++ assets/voxygen/i18n/uk_UA/hud/chat.ron | 48 --- assets/voxygen/i18n/uk_UA/hud/crafting.ftl | 25 ++ assets/voxygen/i18n/uk_UA/hud/crafting.ron | 40 --- assets/voxygen/i18n/uk_UA/hud/group.ftl | 13 + assets/voxygen/i18n/uk_UA/hud/group.ron | 24 -- assets/voxygen/i18n/uk_UA/hud/map.ftl | 37 +++ assets/voxygen/i18n/uk_UA/hud/map.ron | 38 --- assets/voxygen/i18n/uk_UA/hud/misc.ftl | 33 ++ assets/voxygen/i18n/uk_UA/hud/misc.ron | 53 --- assets/voxygen/i18n/uk_UA/hud/sct.ftl | 2 + assets/voxygen/i18n/uk_UA/hud/sct.ron | 14 - assets/voxygen/i18n/uk_UA/hud/settings.ftl | 132 ++++++++ assets/voxygen/i18n/uk_UA/hud/settings.ron | 136 -------- assets/voxygen/i18n/uk_UA/hud/skills.ftl | 239 ++++++++++++++ assets/voxygen/i18n/uk_UA/hud/skills.ron | 311 ------------------ assets/voxygen/i18n/uk_UA/hud/social.ftl | 10 + assets/voxygen/i18n/uk_UA/hud/social.ron | 22 -- assets/voxygen/i18n/uk_UA/hud/trade.ftl | 25 ++ assets/voxygen/i18n/uk_UA/hud/trade.ron | 30 -- assets/voxygen/i18n/uk_UA/main.ftl | 75 +++++ assets/voxygen/i18n/uk_UA/main.ron | 90 ----- assets/voxygen/i18n/uk_UA/npc.ftl | 138 ++++++++ assets/voxygen/i18n/uk_UA/npc.ron | 158 --------- assets/voxygen/i18n/vi_VI/buff.ftl | 35 ++ assets/voxygen/i18n/vi_VI/buff.ron | 52 --- assets/voxygen/i18n/vi_VI/char_selection.ftl | 20 ++ assets/voxygen/i18n/vi_VI/char_selection.ron | 32 -- assets/voxygen/i18n/vi_VI/common.ftl | 95 ++++++ assets/voxygen/i18n/vi_VI/common.ron | 121 ------- assets/voxygen/i18n/vi_VI/esc_menu.ftl | 2 + assets/voxygen/i18n/vi_VI/esc_menu.ron | 14 - assets/voxygen/i18n/vi_VI/gameinput.ftl | 65 ++++ assets/voxygen/i18n/vi_VI/gameinput.ron | 76 ----- assets/voxygen/i18n/vi_VI/hud/bag.ftl | 40 +++ assets/voxygen/i18n/vi_VI/hud/bag.ron | 48 --- assets/voxygen/i18n/vi_VI/hud/char_window.ftl | 9 + assets/voxygen/i18n/vi_VI/hud/char_window.ron | 21 -- assets/voxygen/i18n/vi_VI/hud/chat.ftl | 29 ++ assets/voxygen/i18n/vi_VI/hud/chat.ron | 49 --- assets/voxygen/i18n/vi_VI/hud/crafting.ftl | 25 ++ assets/voxygen/i18n/vi_VI/hud/crafting.ron | 38 --- assets/voxygen/i18n/vi_VI/hud/group.ftl | 13 + assets/voxygen/i18n/vi_VI/hud/group.ron | 25 -- assets/voxygen/i18n/vi_VI/hud/map.ftl | 31 ++ assets/voxygen/i18n/vi_VI/hud/map.ron | 38 --- assets/voxygen/i18n/vi_VI/hud/misc.ftl | 33 ++ assets/voxygen/i18n/vi_VI/hud/misc.ron | 54 --- assets/voxygen/i18n/vi_VI/hud/sct.ftl | 2 + assets/voxygen/i18n/vi_VI/hud/sct.ron | 14 - assets/voxygen/i18n/vi_VI/hud/settings.ftl | 109 ++++++ assets/voxygen/i18n/vi_VI/hud/settings.ron | 136 -------- assets/voxygen/i18n/vi_VI/hud/skills.ftl | 0 assets/voxygen/i18n/vi_VI/hud/skills.ron | 11 - assets/voxygen/i18n/vi_VI/hud/social.ftl | 8 + assets/voxygen/i18n/vi_VI/hud/social.ron | 21 -- assets/voxygen/i18n/vi_VI/hud/trade.ftl | 25 ++ assets/voxygen/i18n/vi_VI/hud/trade.ron | 32 -- assets/voxygen/i18n/vi_VI/main.ftl | 77 +++++ assets/voxygen/i18n/vi_VI/main.ron | 92 ------ assets/voxygen/i18n/vi_VI/npc.ftl | 153 +++++++++ assets/voxygen/i18n/vi_VI/npc.ron | 189 ----------- assets/voxygen/i18n/zh_CN/buff.ftl | 25 ++ assets/voxygen/i18n/zh_CN/buff.ron | 40 --- assets/voxygen/i18n/zh_CN/char_selection.ftl | 21 ++ assets/voxygen/i18n/zh_CN/char_selection.ron | 31 -- assets/voxygen/i18n/zh_CN/common.ftl | 86 +++++ assets/voxygen/i18n/zh_CN/common.ron | 106 ------ assets/voxygen/i18n/zh_CN/esc_menu.ftl | 2 + assets/voxygen/i18n/zh_CN/esc_menu.ron | 13 - assets/voxygen/i18n/zh_CN/gameinput.ftl | 60 ++++ assets/voxygen/i18n/zh_CN/gameinput.ron | 71 ---- assets/voxygen/i18n/zh_CN/hud/bag.ftl | 33 ++ assets/voxygen/i18n/zh_CN/hud/bag.ron | 41 --- assets/voxygen/i18n/zh_CN/hud/char_window.ftl | 9 + assets/voxygen/i18n/zh_CN/hud/char_window.ron | 21 -- assets/voxygen/i18n/zh_CN/hud/chat.ftl | 22 ++ assets/voxygen/i18n/zh_CN/hud/chat.ron | 39 --- assets/voxygen/i18n/zh_CN/hud/crafting.ftl | 15 + assets/voxygen/i18n/zh_CN/hud/crafting.ron | 28 -- assets/voxygen/i18n/zh_CN/hud/group.ftl | 13 + assets/voxygen/i18n/zh_CN/hud/group.ron | 24 -- assets/voxygen/i18n/zh_CN/hud/map.ftl | 21 ++ assets/voxygen/i18n/zh_CN/hud/map.ron | 30 -- assets/voxygen/i18n/zh_CN/hud/misc.ftl | 33 ++ assets/voxygen/i18n/zh_CN/hud/misc.ron | 53 --- assets/voxygen/i18n/zh_CN/hud/sct.ftl | 2 + assets/voxygen/i18n/zh_CN/hud/sct.ron | 14 - assets/voxygen/i18n/zh_CN/hud/settings.ftl | 89 +++++ assets/voxygen/i18n/zh_CN/hud/settings.ron | 106 ------ assets/voxygen/i18n/zh_CN/hud/skills.ftl | 230 +++++++++++++ assets/voxygen/i18n/zh_CN/hud/skills.ron | 248 -------------- assets/voxygen/i18n/zh_CN/hud/social.ftl | 10 + assets/voxygen/i18n/zh_CN/hud/social.ron | 22 -- assets/voxygen/i18n/zh_CN/hud/trade.ftl | 17 + assets/voxygen/i18n/zh_CN/hud/trade.ron | 28 -- assets/voxygen/i18n/zh_CN/main.ftl | 72 ++++ assets/voxygen/i18n/zh_CN/main.ron | 89 ----- assets/voxygen/i18n/zh_CN/npc.ftl | 163 +++++++++ assets/voxygen/i18n/zh_CN/npc.ron | 183 ----------- assets/voxygen/i18n/zh_TW/buff.ftl | 0 assets/voxygen/i18n/zh_TW/buff.ron | 11 - assets/voxygen/i18n/zh_TW/char_selection.ftl | 18 + assets/voxygen/i18n/zh_TW/char_selection.ron | 29 -- assets/voxygen/i18n/zh_TW/common.ftl | 41 +++ assets/voxygen/i18n/zh_TW/common.ron | 57 ---- assets/voxygen/i18n/zh_TW/esc_menu.ftl | 2 + assets/voxygen/i18n/zh_TW/esc_menu.ron | 13 - assets/voxygen/i18n/zh_TW/gameinput.ftl | 1 + assets/voxygen/i18n/zh_TW/gameinput.ron | 12 - assets/voxygen/i18n/zh_TW/hud/bag.ftl | 5 + assets/voxygen/i18n/zh_TW/hud/bag.ron | 17 - assets/voxygen/i18n/zh_TW/hud/char_window.ftl | 7 + assets/voxygen/i18n/zh_TW/hud/char_window.ron | 20 -- assets/voxygen/i18n/zh_TW/hud/chat.ftl | 0 assets/voxygen/i18n/zh_TW/hud/chat.ron | 11 - assets/voxygen/i18n/zh_TW/hud/crafting.ftl | 0 assets/voxygen/i18n/zh_TW/hud/crafting.ron | 11 - assets/voxygen/i18n/zh_TW/hud/group.ftl | 0 assets/voxygen/i18n/zh_TW/hud/group.ron | 11 - assets/voxygen/i18n/zh_TW/hud/map.ftl | 2 + assets/voxygen/i18n/zh_TW/hud/map.ron | 14 - assets/voxygen/i18n/zh_TW/hud/misc.ftl | 48 +++ assets/voxygen/i18n/zh_TW/hud/misc.ron | 65 ---- assets/voxygen/i18n/zh_TW/hud/sct.ftl | 0 assets/voxygen/i18n/zh_TW/hud/sct.ron | 11 - assets/voxygen/i18n/zh_TW/hud/settings.ftl | 125 +++++++ assets/voxygen/i18n/zh_TW/hud/settings.ron | 142 -------- assets/voxygen/i18n/zh_TW/hud/skills.ftl | 0 assets/voxygen/i18n/zh_TW/hud/skills.ron | 11 - assets/voxygen/i18n/zh_TW/hud/social.ftl | 6 + assets/voxygen/i18n/zh_TW/hud/social.ron | 18 - assets/voxygen/i18n/zh_TW/hud/trade.ftl | 0 assets/voxygen/i18n/zh_TW/hud/trade.ron | 12 - assets/voxygen/i18n/zh_TW/main.ftl | 40 +++ assets/voxygen/i18n/zh_TW/main.ron | 53 --- assets/voxygen/i18n/zh_TW/npc.ftl | 0 assets/voxygen/i18n/zh_TW/npc.ron | 10 - 1046 files changed, 24365 insertions(+), 31663 deletions(-) create mode 100644 assets/voxygen/i18n/ar_SA/buff.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/buff.ron create mode 100644 assets/voxygen/i18n/ar_SA/char_selection.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/char_selection.ron create mode 100644 assets/voxygen/i18n/ar_SA/common.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/common.ron create mode 100644 assets/voxygen/i18n/ar_SA/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/esc_menu.ron create mode 100644 assets/voxygen/i18n/ar_SA/gameinput.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/gameinput.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/bag.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/char_window.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/chat.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/crafting.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/group.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/group.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/map.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/map.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/misc.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/sct.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/settings.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/skills.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/social.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/social.ron create mode 100644 assets/voxygen/i18n/ar_SA/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/hud/trade.ron create mode 100644 assets/voxygen/i18n/ar_SA/main.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/main.ron create mode 100644 assets/voxygen/i18n/ar_SA/npc.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/npc.ron create mode 100644 assets/voxygen/i18n/ar_SA/template.ftl delete mode 100644 assets/voxygen/i18n/ar_SA/template.ron create mode 100644 assets/voxygen/i18n/be_BY/buff.ftl delete mode 100644 assets/voxygen/i18n/be_BY/buff.ron create mode 100644 assets/voxygen/i18n/be_BY/char_selection.ftl delete mode 100644 assets/voxygen/i18n/be_BY/char_selection.ron create mode 100644 assets/voxygen/i18n/be_BY/common.ftl delete mode 100644 assets/voxygen/i18n/be_BY/common.ron create mode 100644 assets/voxygen/i18n/be_BY/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/be_BY/esc_menu.ron create mode 100644 assets/voxygen/i18n/be_BY/gameinput.ftl delete mode 100644 assets/voxygen/i18n/be_BY/gameinput.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/bag.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/char_window.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/chat.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/crafting.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/group.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/group.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/map.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/map.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/misc.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/sct.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/settings.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/skills.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/social.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/social.ron create mode 100644 assets/voxygen/i18n/be_BY/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/be_BY/hud/trade.ron create mode 100644 assets/voxygen/i18n/be_BY/main.ftl delete mode 100644 assets/voxygen/i18n/be_BY/main.ron create mode 100644 assets/voxygen/i18n/be_BY/npc.ftl delete mode 100644 assets/voxygen/i18n/be_BY/npc.ron create mode 100644 assets/voxygen/i18n/be_BY/template.ftl delete mode 100644 assets/voxygen/i18n/be_BY/template.ron create mode 100644 assets/voxygen/i18n/ca_CA/buff.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/buff.ron create mode 100644 assets/voxygen/i18n/ca_CA/char_selection.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/char_selection.ron create mode 100644 assets/voxygen/i18n/ca_CA/common.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/common.ron create mode 100644 assets/voxygen/i18n/ca_CA/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/esc_menu.ron create mode 100644 assets/voxygen/i18n/ca_CA/gameinput.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/gameinput.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/bag.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/char_window.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/chat.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/crafting.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/group.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/group.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/map.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/map.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/misc.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/sct.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/settings.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/skills.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/social.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/social.ron create mode 100644 assets/voxygen/i18n/ca_CA/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/hud/trade.ron create mode 100644 assets/voxygen/i18n/ca_CA/main.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/main.ron create mode 100644 assets/voxygen/i18n/ca_CA/npc.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/npc.ron create mode 100644 assets/voxygen/i18n/ca_CA/template.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/template.ron create mode 100644 assets/voxygen/i18n/cz_CZ/buff.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/buff.ron create mode 100644 assets/voxygen/i18n/cz_CZ/char_selection.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/char_selection.ron create mode 100644 assets/voxygen/i18n/cz_CZ/common.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/common.ron create mode 100644 assets/voxygen/i18n/cz_CZ/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/esc_menu.ron create mode 100644 assets/voxygen/i18n/cz_CZ/gameinput.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/gameinput.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/bag.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/char_window.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/chat.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/crafting.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/group.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/group.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/map.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/map.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/misc.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/sct.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/settings.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/skills.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/social.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/social.ron create mode 100644 assets/voxygen/i18n/cz_CZ/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/hud/trade.ron create mode 100644 assets/voxygen/i18n/cz_CZ/main.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/main.ron create mode 100644 assets/voxygen/i18n/cz_CZ/npc.ftl delete mode 100644 assets/voxygen/i18n/cz_CZ/npc.ron create mode 100644 assets/voxygen/i18n/de_DE/buff.ftl delete mode 100644 assets/voxygen/i18n/de_DE/buff.ron create mode 100644 assets/voxygen/i18n/de_DE/char_selection.ftl delete mode 100644 assets/voxygen/i18n/de_DE/char_selection.ron create mode 100644 assets/voxygen/i18n/de_DE/common.ftl delete mode 100644 assets/voxygen/i18n/de_DE/common.ron create mode 100644 assets/voxygen/i18n/de_DE/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/de_DE/esc_menu.ron create mode 100644 assets/voxygen/i18n/de_DE/gameinput.ftl delete mode 100644 assets/voxygen/i18n/de_DE/gameinput.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/bag.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/char_window.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/chat.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/crafting.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/group.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/group.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/map.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/map.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/misc.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/sct.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/settings.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/skills.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/social.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/social.ron create mode 100644 assets/voxygen/i18n/de_DE/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/de_DE/hud/trade.ron create mode 100644 assets/voxygen/i18n/de_DE/main.ftl delete mode 100644 assets/voxygen/i18n/de_DE/main.ron create mode 100644 assets/voxygen/i18n/de_DE/npc.ftl delete mode 100644 assets/voxygen/i18n/de_DE/npc.ron create mode 100644 assets/voxygen/i18n/de_DE/template.ftl delete mode 100644 assets/voxygen/i18n/de_DE/template.ron create mode 100644 assets/voxygen/i18n/en/buff.ftl delete mode 100644 assets/voxygen/i18n/en/buff.ron create mode 100644 assets/voxygen/i18n/en/char_selection.ftl delete mode 100644 assets/voxygen/i18n/en/char_selection.ron create mode 100644 assets/voxygen/i18n/en/common.ftl delete mode 100644 assets/voxygen/i18n/en/common.ron create mode 100644 assets/voxygen/i18n/en/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/en/esc_menu.ron create mode 100644 assets/voxygen/i18n/en/gameinput.ftl delete mode 100644 assets/voxygen/i18n/en/gameinput.ron create mode 100644 assets/voxygen/i18n/en/hud/ability.ftl delete mode 100644 assets/voxygen/i18n/en/hud/ability.ron create mode 100644 assets/voxygen/i18n/en/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/en/hud/bag.ron create mode 100644 assets/voxygen/i18n/en/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/en/hud/char_window.ron create mode 100644 assets/voxygen/i18n/en/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/en/hud/chat.ron create mode 100644 assets/voxygen/i18n/en/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/en/hud/crafting.ron create mode 100644 assets/voxygen/i18n/en/hud/group.ftl delete mode 100644 assets/voxygen/i18n/en/hud/group.ron create mode 100644 assets/voxygen/i18n/en/hud/map.ftl delete mode 100644 assets/voxygen/i18n/en/hud/map.ron create mode 100644 assets/voxygen/i18n/en/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/en/hud/misc.ron create mode 100644 assets/voxygen/i18n/en/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/en/hud/sct.ron create mode 100644 assets/voxygen/i18n/en/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/en/hud/settings.ron create mode 100644 assets/voxygen/i18n/en/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/en/hud/skills.ron create mode 100644 assets/voxygen/i18n/en/hud/social.ftl delete mode 100644 assets/voxygen/i18n/en/hud/social.ron create mode 100644 assets/voxygen/i18n/en/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/en/hud/trade.ron create mode 100644 assets/voxygen/i18n/en/main.ftl delete mode 100644 assets/voxygen/i18n/en/main.ron create mode 100644 assets/voxygen/i18n/en/npc.ftl delete mode 100644 assets/voxygen/i18n/en/npc.ron create mode 100644 assets/voxygen/i18n/en/template.ftl delete mode 100644 assets/voxygen/i18n/en/template.ron create mode 100644 assets/voxygen/i18n/es_ES/buff.ftl delete mode 100644 assets/voxygen/i18n/es_ES/buff.ron create mode 100644 assets/voxygen/i18n/es_ES/char_selection.ftl delete mode 100644 assets/voxygen/i18n/es_ES/char_selection.ron create mode 100644 assets/voxygen/i18n/es_ES/common.ftl delete mode 100644 assets/voxygen/i18n/es_ES/common.ron create mode 100644 assets/voxygen/i18n/es_ES/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/es_ES/esc_menu.ron create mode 100644 assets/voxygen/i18n/es_ES/gameinput.ftl delete mode 100644 assets/voxygen/i18n/es_ES/gameinput.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/bag.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/char_window.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/chat.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/crafting.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/group.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/group.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/map.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/map.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/misc.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/sct.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/settings.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/skills.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/social.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/social.ron create mode 100644 assets/voxygen/i18n/es_ES/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/es_ES/hud/trade.ron create mode 100644 assets/voxygen/i18n/es_ES/main.ftl delete mode 100644 assets/voxygen/i18n/es_ES/main.ron create mode 100644 assets/voxygen/i18n/es_ES/npc.ftl delete mode 100644 assets/voxygen/i18n/es_ES/npc.ron create mode 100644 assets/voxygen/i18n/es_LA/buff.ftl delete mode 100644 assets/voxygen/i18n/es_LA/buff.ron create mode 100644 assets/voxygen/i18n/es_LA/char_selection.ftl delete mode 100644 assets/voxygen/i18n/es_LA/char_selection.ron create mode 100644 assets/voxygen/i18n/es_LA/common.ftl delete mode 100644 assets/voxygen/i18n/es_LA/common.ron create mode 100644 assets/voxygen/i18n/es_LA/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/es_LA/esc_menu.ron create mode 100644 assets/voxygen/i18n/es_LA/gameinput.ftl delete mode 100644 assets/voxygen/i18n/es_LA/gameinput.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/bag.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/char_window.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/chat.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/crafting.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/group.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/group.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/map.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/map.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/misc.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/sct.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/settings.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/skills.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/social.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/social.ron create mode 100644 assets/voxygen/i18n/es_LA/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/es_LA/hud/trade.ron create mode 100644 assets/voxygen/i18n/es_LA/main.ftl delete mode 100644 assets/voxygen/i18n/es_LA/main.ron create mode 100644 assets/voxygen/i18n/es_LA/npc.ftl delete mode 100644 assets/voxygen/i18n/es_LA/npc.ron create mode 100644 assets/voxygen/i18n/eu/buff.ftl delete mode 100644 assets/voxygen/i18n/eu/buff.ron create mode 100644 assets/voxygen/i18n/eu/char_selection.ftl delete mode 100644 assets/voxygen/i18n/eu/char_selection.ron create mode 100644 assets/voxygen/i18n/eu/common.ftl delete mode 100644 assets/voxygen/i18n/eu/common.ron create mode 100644 assets/voxygen/i18n/eu/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/eu/esc_menu.ron create mode 100644 assets/voxygen/i18n/eu/gameinput.ftl delete mode 100644 assets/voxygen/i18n/eu/gameinput.ron create mode 100644 assets/voxygen/i18n/eu/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/bag.ron create mode 100644 assets/voxygen/i18n/eu/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/char_window.ron create mode 100644 assets/voxygen/i18n/eu/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/chat.ron create mode 100644 assets/voxygen/i18n/eu/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/crafting.ron create mode 100644 assets/voxygen/i18n/eu/hud/group.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/group.ron create mode 100644 assets/voxygen/i18n/eu/hud/map.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/map.ron create mode 100644 assets/voxygen/i18n/eu/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/misc.ron create mode 100644 assets/voxygen/i18n/eu/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/sct.ron create mode 100644 assets/voxygen/i18n/eu/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/settings.ron create mode 100644 assets/voxygen/i18n/eu/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/skills.ron create mode 100644 assets/voxygen/i18n/eu/hud/social.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/social.ron create mode 100644 assets/voxygen/i18n/eu/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/eu/hud/trade.ron create mode 100644 assets/voxygen/i18n/eu/main.ftl delete mode 100644 assets/voxygen/i18n/eu/main.ron create mode 100644 assets/voxygen/i18n/eu/npc.ftl delete mode 100644 assets/voxygen/i18n/eu/npc.ron create mode 100644 assets/voxygen/i18n/eu/template.ftl delete mode 100644 assets/voxygen/i18n/eu/template.ron create mode 100644 assets/voxygen/i18n/fr_FR/buff.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/buff.ron create mode 100644 assets/voxygen/i18n/fr_FR/char_selection.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/char_selection.ron create mode 100644 assets/voxygen/i18n/fr_FR/char_window.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/char_window.ron create mode 100644 assets/voxygen/i18n/fr_FR/common.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/common.ron create mode 100644 assets/voxygen/i18n/fr_FR/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/esc_menu.ron create mode 100644 assets/voxygen/i18n/fr_FR/gameinput.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/gameinput.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/bag.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/chat.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/crafting.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/group.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/group.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/map.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/map.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/misc.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/sct.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/settings.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/skills.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/social.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/social.ron create mode 100644 assets/voxygen/i18n/fr_FR/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/hud/trade.ron create mode 100644 assets/voxygen/i18n/fr_FR/main.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/main.ron create mode 100644 assets/voxygen/i18n/fr_FR/npc.ftl delete mode 100644 assets/voxygen/i18n/fr_FR/npc.ron create mode 100644 assets/voxygen/i18n/hu_HU/buff.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/buff.ron create mode 100644 assets/voxygen/i18n/hu_HU/char_selection.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/char_selection.ron create mode 100644 assets/voxygen/i18n/hu_HU/common.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/common.ron create mode 100644 assets/voxygen/i18n/hu_HU/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/esc_menu.ron create mode 100644 assets/voxygen/i18n/hu_HU/gameinput.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/gameinput.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/bag.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/char_window.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/chat.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/crafting.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/group.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/group.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/map.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/map.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/misc.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/sct.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/settings.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/skills.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/social.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/social.ron create mode 100644 assets/voxygen/i18n/hu_HU/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/hud/trade.ron create mode 100644 assets/voxygen/i18n/hu_HU/main.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/main.ron create mode 100644 assets/voxygen/i18n/hu_HU/npc.ftl delete mode 100644 assets/voxygen/i18n/hu_HU/npc.ron create mode 100644 assets/voxygen/i18n/it_IT/buff.ftl delete mode 100644 assets/voxygen/i18n/it_IT/buff.ron create mode 100644 assets/voxygen/i18n/it_IT/char_selection.ftl delete mode 100644 assets/voxygen/i18n/it_IT/char_selection.ron create mode 100644 assets/voxygen/i18n/it_IT/common.ftl delete mode 100644 assets/voxygen/i18n/it_IT/common.ron create mode 100644 assets/voxygen/i18n/it_IT/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/it_IT/esc_menu.ron create mode 100644 assets/voxygen/i18n/it_IT/gameinput.ftl delete mode 100644 assets/voxygen/i18n/it_IT/gameinput.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/bag.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/char_window.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/chat.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/crafting.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/group.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/group.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/map.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/map.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/misc.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/sct.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/settings.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/skills.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/social.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/social.ron create mode 100644 assets/voxygen/i18n/it_IT/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/it_IT/hud/trade.ron create mode 100644 assets/voxygen/i18n/it_IT/main.ftl delete mode 100644 assets/voxygen/i18n/it_IT/main.ron create mode 100644 assets/voxygen/i18n/it_IT/npc.ftl delete mode 100644 assets/voxygen/i18n/it_IT/npc.ron create mode 100644 assets/voxygen/i18n/ja_JP/buff.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/buff.ron create mode 100644 assets/voxygen/i18n/ja_JP/char_selection.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/char_selection.ron create mode 100644 assets/voxygen/i18n/ja_JP/common.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/common.ron create mode 100644 assets/voxygen/i18n/ja_JP/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/esc_menu.ron create mode 100644 assets/voxygen/i18n/ja_JP/gameinput.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/gameinput.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/bag.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/char_window.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/chat.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/crafting.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/group.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/group.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/map.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/map.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/misc.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/sct.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/settings.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/skills.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/social.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/social.ron create mode 100644 assets/voxygen/i18n/ja_JP/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/hud/trade.ron create mode 100644 assets/voxygen/i18n/ja_JP/main.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/main.ron create mode 100644 assets/voxygen/i18n/ja_JP/npc.ftl delete mode 100644 assets/voxygen/i18n/ja_JP/npc.ron create mode 100644 assets/voxygen/i18n/nl_NL/buff.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/buff.ron create mode 100644 assets/voxygen/i18n/nl_NL/char_selection.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/char_selection.ron create mode 100644 assets/voxygen/i18n/nl_NL/common.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/common.ron create mode 100644 assets/voxygen/i18n/nl_NL/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/esc_menu.ron create mode 100644 assets/voxygen/i18n/nl_NL/gameinput.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/gameinput.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/bag.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/char_window.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/chat.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/crafting.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/group.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/group.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/map.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/map.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/misc.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/sct.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/settings.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/skills.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/social.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/social.ron create mode 100644 assets/voxygen/i18n/nl_NL/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/hud/trade.ron create mode 100644 assets/voxygen/i18n/nl_NL/main.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/main.ron create mode 100644 assets/voxygen/i18n/nl_NL/npc.ftl delete mode 100644 assets/voxygen/i18n/nl_NL/npc.ron create mode 100644 assets/voxygen/i18n/no_NB/buff.ftl delete mode 100644 assets/voxygen/i18n/no_NB/buff.ron create mode 100644 assets/voxygen/i18n/no_NB/char_selection.ftl delete mode 100644 assets/voxygen/i18n/no_NB/char_selection.ron create mode 100644 assets/voxygen/i18n/no_NB/common.ftl delete mode 100644 assets/voxygen/i18n/no_NB/common.ron create mode 100644 assets/voxygen/i18n/no_NB/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/no_NB/esc_menu.ron create mode 100644 assets/voxygen/i18n/no_NB/gameinput.ftl delete mode 100644 assets/voxygen/i18n/no_NB/gameinput.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/bag.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/char_window.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/chat.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/crafting.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/group.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/group.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/map.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/map.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/misc.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/sct.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/settings.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/skills.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/social.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/social.ron create mode 100644 assets/voxygen/i18n/no_NB/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/no_NB/hud/trade.ron create mode 100644 assets/voxygen/i18n/no_NB/main.ftl delete mode 100644 assets/voxygen/i18n/no_NB/main.ron create mode 100644 assets/voxygen/i18n/no_NB/npc.ftl delete mode 100644 assets/voxygen/i18n/no_NB/npc.ron create mode 100644 assets/voxygen/i18n/pl_PL/buff.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/buff.ron create mode 100644 assets/voxygen/i18n/pl_PL/char_selection.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/char_selection.ron create mode 100644 assets/voxygen/i18n/pl_PL/common.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/common.ron create mode 100644 assets/voxygen/i18n/pl_PL/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/esc_menu.ron create mode 100644 assets/voxygen/i18n/pl_PL/gameinput.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/gameinput.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/ability.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/ability.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/bag.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/char_window.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/chat.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/crafting.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/group.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/group.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/map.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/map.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/misc.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/sct.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/settings.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/skills.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/social.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/social.ron create mode 100644 assets/voxygen/i18n/pl_PL/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/hud/trade.ron create mode 100644 assets/voxygen/i18n/pl_PL/main.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/main.ron create mode 100644 assets/voxygen/i18n/pl_PL/npc.ftl delete mode 100644 assets/voxygen/i18n/pl_PL/npc.ron create mode 100644 assets/voxygen/i18n/pt_BR/buff.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/buff.ron create mode 100644 assets/voxygen/i18n/pt_BR/char_selection.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/char_selection.ron create mode 100644 assets/voxygen/i18n/pt_BR/common.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/common.ron create mode 100644 assets/voxygen/i18n/pt_BR/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/esc_menu.ron create mode 100644 assets/voxygen/i18n/pt_BR/gameinput.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/gameinput.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/ability.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/ability.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/bag.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/char_window.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/chat.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/crafting.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/group.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/group.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/map.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/map.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/misc.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/sct.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/settings.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/skills.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/social.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/social.ron create mode 100644 assets/voxygen/i18n/pt_BR/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/hud/trade.ron create mode 100644 assets/voxygen/i18n/pt_BR/main.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/main.ron create mode 100644 assets/voxygen/i18n/pt_BR/npc.ftl delete mode 100644 assets/voxygen/i18n/pt_BR/npc.ron create mode 100644 assets/voxygen/i18n/pt_PT/buff.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/buff.ron create mode 100644 assets/voxygen/i18n/pt_PT/char_selection.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/char_selection.ron create mode 100644 assets/voxygen/i18n/pt_PT/common.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/common.ron create mode 100644 assets/voxygen/i18n/pt_PT/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/esc_menu.ron create mode 100644 assets/voxygen/i18n/pt_PT/gameinput.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/gameinput.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/bag.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/char_window.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/chat.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/crafting.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/group.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/group.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/map.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/map.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/misc.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/sct.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/settings.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/skills.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/social.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/social.ron create mode 100644 assets/voxygen/i18n/pt_PT/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/hud/trade.ron create mode 100644 assets/voxygen/i18n/pt_PT/main.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/main.ron create mode 100644 assets/voxygen/i18n/pt_PT/npc.ftl delete mode 100644 assets/voxygen/i18n/pt_PT/npc.ron create mode 100644 assets/voxygen/i18n/ru_RU/buff.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/buff.ron create mode 100644 assets/voxygen/i18n/ru_RU/char_selection.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/char_selection.ron create mode 100644 assets/voxygen/i18n/ru_RU/common.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/common.ron create mode 100644 assets/voxygen/i18n/ru_RU/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/esc_menu.ron create mode 100644 assets/voxygen/i18n/ru_RU/gameinput.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/gameinput.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/bag.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/char_window.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/chat.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/crafting.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/group.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/group.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/map.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/map.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/misc.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/sct.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/settings.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/skills.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/social.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/social.ron create mode 100644 assets/voxygen/i18n/ru_RU/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/hud/trade.ron create mode 100644 assets/voxygen/i18n/ru_RU/main.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/main.ron create mode 100644 assets/voxygen/i18n/ru_RU/npc.ftl delete mode 100644 assets/voxygen/i18n/ru_RU/npc.ron create mode 100644 assets/voxygen/i18n/sr_SR/buff.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/buff.ron create mode 100644 assets/voxygen/i18n/sr_SR/char_selection.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/char_selection.ron create mode 100644 assets/voxygen/i18n/sr_SR/common.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/common.ron create mode 100644 assets/voxygen/i18n/sr_SR/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/esc_menu.ron create mode 100644 assets/voxygen/i18n/sr_SR/gameinput.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/gameinput.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/bag.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/char_window.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/chat.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/crafting.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/group.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/group.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/map.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/map.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/misc.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/sct.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/settings.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/skills.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/social.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/social.ron create mode 100644 assets/voxygen/i18n/sr_SR/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/hud/trade.ron create mode 100644 assets/voxygen/i18n/sr_SR/main.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/main.ron create mode 100644 assets/voxygen/i18n/sr_SR/npc.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/npc.ron create mode 100644 assets/voxygen/i18n/sr_SR/template.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/template.ron create mode 100644 assets/voxygen/i18n/sv_SE/buff.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/buff.ron create mode 100644 assets/voxygen/i18n/sv_SE/char_selection.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/char_selection.ron create mode 100644 assets/voxygen/i18n/sv_SE/common.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/common.ron create mode 100644 assets/voxygen/i18n/sv_SE/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/esc_menu.ron create mode 100644 assets/voxygen/i18n/sv_SE/gameinput.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/gameinput.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/bag.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/char_window.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/chat.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/crafting.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/group.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/group.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/map.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/map.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/misc.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/sct.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/settings.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/skills.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/social.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/social.ron create mode 100644 assets/voxygen/i18n/sv_SE/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/hud/trade.ron create mode 100644 assets/voxygen/i18n/sv_SE/main.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/main.ron create mode 100644 assets/voxygen/i18n/sv_SE/npc.ftl delete mode 100644 assets/voxygen/i18n/sv_SE/npc.ron create mode 100644 assets/voxygen/i18n/th_TH/buff.ftl delete mode 100644 assets/voxygen/i18n/th_TH/buff.ron create mode 100644 assets/voxygen/i18n/th_TH/char_selection.ftl delete mode 100644 assets/voxygen/i18n/th_TH/char_selection.ron create mode 100644 assets/voxygen/i18n/th_TH/common.ftl delete mode 100644 assets/voxygen/i18n/th_TH/common.ron create mode 100644 assets/voxygen/i18n/th_TH/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/th_TH/esc_menu.ron create mode 100644 assets/voxygen/i18n/th_TH/gameinput.ftl delete mode 100644 assets/voxygen/i18n/th_TH/gameinput.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/bag.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/char_window.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/chat.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/crafting.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/group.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/group.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/map.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/map.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/misc.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/sct.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/settings.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/skills.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/social.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/social.ron create mode 100644 assets/voxygen/i18n/th_TH/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/th_TH/hud/trade.ron create mode 100644 assets/voxygen/i18n/th_TH/main.ftl delete mode 100644 assets/voxygen/i18n/th_TH/main.ron create mode 100644 assets/voxygen/i18n/th_TH/npc.ftl delete mode 100644 assets/voxygen/i18n/th_TH/npc.ron create mode 100644 assets/voxygen/i18n/th_TH/template.ftl delete mode 100644 assets/voxygen/i18n/th_TH/template.ron create mode 100644 assets/voxygen/i18n/tr_TR/buff.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/buff.ron create mode 100644 assets/voxygen/i18n/tr_TR/char_selection.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/char_selection.ron create mode 100644 assets/voxygen/i18n/tr_TR/common.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/common.ron create mode 100644 assets/voxygen/i18n/tr_TR/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/esc_menu.ron create mode 100644 assets/voxygen/i18n/tr_TR/gameinput.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/gameinput.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/bag.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/char_window.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/chat.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/crafting.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/group.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/group.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/map.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/map.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/misc.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/sct.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/settings.ron create mode 100644 assets/voxygen/i18n/tr_TR/hud/social.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/hud/social.ron create mode 100644 assets/voxygen/i18n/tr_TR/main.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/main.ron create mode 100644 assets/voxygen/i18n/tr_TR/npc.ftl delete mode 100644 assets/voxygen/i18n/tr_TR/npc.ron create mode 100644 assets/voxygen/i18n/uk_UA/buff.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/buff.ron create mode 100644 assets/voxygen/i18n/uk_UA/char_selection.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/char_selection.ron create mode 100644 assets/voxygen/i18n/uk_UA/common.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/common.ron create mode 100644 assets/voxygen/i18n/uk_UA/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/esc_menu.ron create mode 100644 assets/voxygen/i18n/uk_UA/gameinput.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/gameinput.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/ability.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/ability.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/bag.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/char_window.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/chat.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/crafting.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/group.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/group.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/map.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/map.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/misc.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/sct.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/settings.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/skills.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/social.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/social.ron create mode 100644 assets/voxygen/i18n/uk_UA/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/hud/trade.ron create mode 100644 assets/voxygen/i18n/uk_UA/main.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/main.ron create mode 100644 assets/voxygen/i18n/uk_UA/npc.ftl delete mode 100644 assets/voxygen/i18n/uk_UA/npc.ron create mode 100644 assets/voxygen/i18n/vi_VI/buff.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/buff.ron create mode 100644 assets/voxygen/i18n/vi_VI/char_selection.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/char_selection.ron create mode 100644 assets/voxygen/i18n/vi_VI/common.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/common.ron create mode 100644 assets/voxygen/i18n/vi_VI/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/esc_menu.ron create mode 100644 assets/voxygen/i18n/vi_VI/gameinput.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/gameinput.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/bag.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/char_window.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/chat.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/crafting.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/group.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/group.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/map.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/map.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/misc.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/sct.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/settings.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/skills.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/social.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/social.ron create mode 100644 assets/voxygen/i18n/vi_VI/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/hud/trade.ron create mode 100644 assets/voxygen/i18n/vi_VI/main.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/main.ron create mode 100644 assets/voxygen/i18n/vi_VI/npc.ftl delete mode 100644 assets/voxygen/i18n/vi_VI/npc.ron create mode 100644 assets/voxygen/i18n/zh_CN/buff.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/buff.ron create mode 100644 assets/voxygen/i18n/zh_CN/char_selection.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/char_selection.ron create mode 100644 assets/voxygen/i18n/zh_CN/common.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/common.ron create mode 100644 assets/voxygen/i18n/zh_CN/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/esc_menu.ron create mode 100644 assets/voxygen/i18n/zh_CN/gameinput.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/gameinput.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/bag.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/char_window.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/chat.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/crafting.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/group.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/group.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/map.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/map.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/misc.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/sct.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/settings.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/skills.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/social.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/social.ron create mode 100644 assets/voxygen/i18n/zh_CN/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/hud/trade.ron create mode 100644 assets/voxygen/i18n/zh_CN/main.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/main.ron create mode 100644 assets/voxygen/i18n/zh_CN/npc.ftl delete mode 100644 assets/voxygen/i18n/zh_CN/npc.ron create mode 100644 assets/voxygen/i18n/zh_TW/buff.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/buff.ron create mode 100644 assets/voxygen/i18n/zh_TW/char_selection.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/char_selection.ron create mode 100644 assets/voxygen/i18n/zh_TW/common.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/common.ron create mode 100644 assets/voxygen/i18n/zh_TW/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/esc_menu.ron create mode 100644 assets/voxygen/i18n/zh_TW/gameinput.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/gameinput.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/bag.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/char_window.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/chat.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/crafting.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/group.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/group.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/map.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/map.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/misc.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/sct.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/settings.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/skills.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/social.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/social.ron create mode 100644 assets/voxygen/i18n/zh_TW/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/hud/trade.ron create mode 100644 assets/voxygen/i18n/zh_TW/main.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/main.ron create mode 100644 assets/voxygen/i18n/zh_TW/npc.ftl delete mode 100644 assets/voxygen/i18n/zh_TW/npc.ron diff --git a/assets/voxygen/i18n/ar_SA/buff.ftl b/assets/voxygen/i18n/ar_SA/buff.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/buff.ron b/assets/voxygen/i18n/ar_SA/buff.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/buff.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/char_selection.ftl b/assets/voxygen/i18n/ar_SA/char_selection.ftl new file mode 100644 index 0000000000..62e3662f0b --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/char_selection.ftl @@ -0,0 +1,6 @@ +char_selection-enter_world = أدخل العالم +char_selection-logout = تسجيل خروج +char_selection-create_new_character = إنشاء شخصية جديدة +char_selection-creating_character = جاري إنشاء شخصية... +char_selection-character_creation = إنشاء شخصية +char_selection-create_info_name = شخصيتك تحتاج إلى اسم! \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/char_selection.ron b/assets/voxygen/i18n/ar_SA/char_selection.ron deleted file mode 100644 index e8908fb33c..0000000000 --- a/assets/voxygen/i18n/ar_SA/char_selection.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "char_selection.enter_world": "أدخل العالم", - "char_selection.logout": "تسجيل خروج", - "char_selection.create_new_character": "إنشاء شخصية جديدة", - "char_selection.creating_character": "جاري إنشاء شخصية...", - "char_selection.character_creation": "إنشاء شخصية", - "char_selection.create_info_name": "شخصيتك تحتاج إلى اسم!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/common.ftl b/assets/voxygen/i18n/ar_SA/common.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/common.ron b/assets/voxygen/i18n/ar_SA/common.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/common.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/esc_menu.ftl b/assets/voxygen/i18n/ar_SA/esc_menu.ftl new file mode 100644 index 0000000000..7df3b141a9 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = تسجيل خروج +esc_menu-quit_game = قم بإنهاء اللعبة \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/esc_menu.ron b/assets/voxygen/i18n/ar_SA/esc_menu.ron deleted file mode 100644 index a30e590353..0000000000 --- a/assets/voxygen/i18n/ar_SA/esc_menu.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "esc_menu.logout": "تسجيل خروج", - "esc_menu.quit_game": "قم بإنهاء اللعبة", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/gameinput.ftl b/assets/voxygen/i18n/ar_SA/gameinput.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/gameinput.ron b/assets/voxygen/i18n/ar_SA/gameinput.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/gameinput.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/bag.ftl b/assets/voxygen/i18n/ar_SA/hud/bag.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/hud/bag.ron b/assets/voxygen/i18n/ar_SA/hud/bag.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/bag.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/char_window.ftl b/assets/voxygen/i18n/ar_SA/hud/char_window.ftl new file mode 100644 index 0000000000..2fa3c10df8 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = اسم الشخصية +character_window-character_stats = + قدرة التحمل + + اللياقه البدنيه + + قوة الإرادة + + الحماية \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/char_window.ron b/assets/voxygen/i18n/ar_SA/hud/char_window.ron deleted file mode 100644 index f1654c8b2a..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/char_window.ron +++ /dev/null @@ -1,20 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "character_window.character_name": "اسم الشخصية", - // Character stats - "character_window.character_stats": r#"قدرة التحمل - -اللياقه البدنيه - -قوة الإرادة - -الحماية -"#, - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/chat.ftl b/assets/voxygen/i18n/ar_SA/hud/chat.ftl new file mode 100644 index 0000000000..9a835ad33e --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/chat.ftl @@ -0,0 +1,2 @@ +hud-chat-loot_fail = المخزون الخاص بك كامل! +hud-chat-goodbye = مع السلامة! \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/chat.ron b/assets/voxygen/i18n/ar_SA/hud/chat.ron deleted file mode 100644 index b9be13a56d..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/chat.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "hud.chat.loot_fail": "المخزون الخاص بك كامل!", - "hud.chat.goodbye": "مع السلامة!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/crafting.ftl b/assets/voxygen/i18n/ar_SA/hud/crafting.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/hud/crafting.ron b/assets/voxygen/i18n/ar_SA/hud/crafting.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/crafting.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/group.ftl b/assets/voxygen/i18n/ar_SA/hud/group.ftl new file mode 100644 index 0000000000..f5a07ad0c7 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/group.ftl @@ -0,0 +1,9 @@ +hud-group = مجموعة +hud-group-invite_to_join = دعاك [{ $name }] إلى مجموعته! +hud-group-invite_to_trade = يرغب [{ $name }] في التجارة معك. +hud-group-invite = دعوة +hud-group-kick = اطرد +hud-group-assign_leader = تعيين القائد +hud-group-leave = غادر المجموعة +hud-group-dead = ميت +hud-group-members = أعضاء المجموعة \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/group.ron b/assets/voxygen/i18n/ar_SA/hud/group.ron deleted file mode 100644 index 92cbe6f80a..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/group.ron +++ /dev/null @@ -1,19 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "hud.group": "مجموعة", - "hud.group.invite_to_join": "دعاك [{name}] إلى مجموعته!", - "hud.group.invite_to_trade": "يرغب [{name}] في التجارة معك.", - "hud.group.invite": "دعوة", - "hud.group.kick": "اطرد", - "hud.group.assign_leader": "تعيين القائد", - "hud.group.leave": "غادر المجموعة", - "hud.group.dead" : "ميت", - "hud.group.members": "أعضاء المجموعة", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/map.ftl b/assets/voxygen/i18n/ar_SA/hud/map.ftl new file mode 100644 index 0000000000..d6072907cc --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/map.ftl @@ -0,0 +1,17 @@ +hud-map-map_title = الخريطة +hud-map-qlog_title = المهام +hud-map-difficulty = الصعوبة +hud-map-towns = المدن +hud-map-castles = القلاع +hud-map-dungeons = الزنازين +hud-map-caves = الكهوف +hud-map-cave = كهف +hud-map-peaks = قمم الجبال +hud-map-dungeon = زنزانة +hud-map-difficulty_dungeon = + زنزانة + + الصعوبة: { $difficulty } +hud-map-mid_click = تعيين إحداثية +hud-map-marked_location = الموقع المحدد +hud-map-marked_location_remove = انقر للإزالة \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/map.ron b/assets/voxygen/i18n/ar_SA/hud/map.ron deleted file mode 100644 index 82949eb4f8..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/map.ron +++ /dev/null @@ -1,25 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "الخريطة", - "hud.map.qlog_title": "المهام", - "hud.map.difficulty": "الصعوبة", - "hud.map.towns": "المدن", - "hud.map.castles": "القلاع", - "hud.map.dungeons": "الزنازين", - "hud.map.caves": "الكهوف", - "hud.map.cave": "كهف", - "hud.map.peaks": "قمم الجبال", - "hud.map.dungeon": "زنزانة", - "hud.map.difficulty_dungeon": "زنزانة\n\nالصعوبة: {difficulty}", - "hud.map.mid_click": "تعيين إحداثية", - "hud.map.marked_location": "الموقع المحدد", - "hud.map.marked_location_remove": "انقر للإزالة", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/misc.ftl b/assets/voxygen/i18n/ar_SA/hud/misc.ftl new file mode 100644 index 0000000000..8f97123231 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/misc.ftl @@ -0,0 +1,2 @@ +hud-quests = المهام +hud-you_died = أنت ميت \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/misc.ron b/assets/voxygen/i18n/ar_SA/hud/misc.ron deleted file mode 100644 index f0006675a6..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/misc.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "hud.quests": "المهام", - "hud.you_died": "أنت ميت", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/sct.ftl b/assets/voxygen/i18n/ar_SA/hud/sct.ftl new file mode 100644 index 0000000000..54eb2324d6 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/sct.ftl @@ -0,0 +1 @@ +hud-sct-experience = { $amount } خبرة \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/sct.ron b/assets/voxygen/i18n/ar_SA/hud/sct.ron deleted file mode 100644 index 4eb4b915e2..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/sct.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} خبرة", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/settings.ftl b/assets/voxygen/i18n/ar_SA/hud/settings.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/hud/settings.ron b/assets/voxygen/i18n/ar_SA/hud/settings.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/settings.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/skills.ftl b/assets/voxygen/i18n/ar_SA/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/hud/skills.ron b/assets/voxygen/i18n/ar_SA/hud/skills.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/skills.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/hud/social.ftl b/assets/voxygen/i18n/ar_SA/hud/social.ftl new file mode 100644 index 0000000000..3294c11020 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/social.ftl @@ -0,0 +1,5 @@ +hud-social = لاعبين آخرين +hud-social-online = متصل: +hud-social-friends = اصدقاء +hud-social-name = اسم +hud-social-level = مستوى \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/social.ron b/assets/voxygen/i18n/ar_SA/hud/social.ron deleted file mode 100644 index c17a6a4343..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/social.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "hud.social": "لاعبين آخرين", - "hud.social.online": "متصل:", - "hud.social.friends": "اصدقاء", - "hud.social.name": "اسم", - "hud.social.level": "مستوى", - }, - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ar_SA/hud/trade.ftl b/assets/voxygen/i18n/ar_SA/hud/trade.ftl new file mode 100644 index 0000000000..809977c001 --- /dev/null +++ b/assets/voxygen/i18n/ar_SA/hud/trade.ftl @@ -0,0 +1,5 @@ +hud-trade-trade_window = تجارة +hud-trade-accept = قبول +hud-trade-decline = رفض +hud-trade-buy_price = سعر الشراء +hud-trade-sell_price = سعر البيع \ No newline at end of file diff --git a/assets/voxygen/i18n/ar_SA/hud/trade.ron b/assets/voxygen/i18n/ar_SA/hud/trade.ron deleted file mode 100644 index 1f59df6768..0000000000 --- a/assets/voxygen/i18n/ar_SA/hud/trade.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - "hud.trade.trade_window": "تجارة", - "hud.trade.accept": "قبول", - "hud.trade.decline": "رفض", - "hud.trade.buy_price": "سعر الشراء", - "hud.trade.sell_price": "سعر البيع", - }, - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ar_SA/main.ftl b/assets/voxygen/i18n/ar_SA/main.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/main.ron b/assets/voxygen/i18n/ar_SA/main.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/main.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/npc.ftl b/assets/voxygen/i18n/ar_SA/npc.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/npc.ron b/assets/voxygen/i18n/ar_SA/npc.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/npc.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ar_SA/template.ftl b/assets/voxygen/i18n/ar_SA/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ar_SA/template.ron b/assets/voxygen/i18n/ar_SA/template.ron deleted file mode 100644 index 6c5c23137d..0000000000 --- a/assets/voxygen/i18n/ar_SA/template.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Arabic (Saudi locale) -( - string_map: { - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/buff.ftl b/assets/voxygen/i18n/be_BY/buff.ftl new file mode 100644 index 0000000000..16c160943f --- /dev/null +++ b/assets/voxygen/i18n/be_BY/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Націсніце, каб выдаліць +buff-title-missing = Назва адсутнічае +buff-desc-missing = Апісанне адсутнічае +buff-title-heal = Вылечванне +buff-desc-heal = Паступова аднаўляе здароўе. +buff-title-potion = Зелле +buff-desc-potion = Піццё... +buff-title-saturation = Насычэнне +buff-desc-saturation = Паступова аднаўляе здароўе ад ежы. +buff-title-campfire_heal = Утульнасць вогнішча +buff-desc-campfire_heal = Адпачынак каля вогнішча аднаўляе { $rate }% здароўя ў секунду. +buff-title-invulnerability = Няўразлівасць +buff-desc-invulnerability = Вам нічога не можа пашкодзіць. +buff-title-protectingward = Ахоўная аўра +buff-desc-protectingward = Атакі ворагаў не такія балючыя. +buff-title-frenzied = Раз’юшанасць +buff-desc-frenzied = Кроў цячэ хутчэй, паскараючы ваш рух ды трохі гаячы вашыя раны. +buff-title-hastened = Паспех +buff-desc-hastened = Вы рухаецеся і атакоўваеце хутчэй. +buff-title-bleed = Крывацёк +buff-desc-bleed = Наносіць рэгулярную шкоду. +buff-title-cursed = Праклён +buff-desc-cursed = Вас праклялі. +buff-title-burn = У агні +buff-desc-burn = Вы гарыце жыўцом! +buff-title-crippled = Пакалечаны +buff-desc-crippled = Вы амаль не можаце рухацца, бо вашыя ногі пакалечаныя. +buff-title-frozen = Абмарожанне +buff-desc-frozen = Вы рухаецеся і атакоўваеце павольней. +buff-title-wet = Вільготнасць +buff-desc-wet = Глеба распаўзаецца пад вашымі нагамі, вам цяжка спыніцца. +buff-title-ensnared = Аблытаны +buff-desc-ensnared = Лазы аблытваюць вашыя ногі, затрымліваючы вас. +buff-stat-health = Аднаўляе { $str_total } адз. здароўя +buff-stat-increase_max_energy = Павышае максімальнае здароўе на { $strength } +buff-stat-increase_max_health = Павышае максімальную энергію на { $strength } +buff-stat-invulnerability = Даруе няўразлівасць +buff-text-over_seconds = на працягу { $dur_secs } сек. +buff-text-for_seconds = на працягу { $dur_secs } сек. \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/buff.ron b/assets/voxygen/i18n/be_BY/buff.ron deleted file mode 100644 index 0b28456f49..0000000000 --- a/assets/voxygen/i18n/be_BY/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - // Buffs - "buff.remove": "Націсніце, каб выдаліць", - "buff.title.missing": "Назва адсутнічае", - "buff.desc.missing": "Апісанне адсутнічае", - "buff.title.heal": "Вылечванне", - "buff.desc.heal": "Паступова аднаўляе здароўе.", - "buff.title.potion": "Зелле", - "buff.desc.potion": "Піццё...", - "buff.title.saturation": "Насычэнне", - "buff.desc.saturation": "Паступова аднаўляе здароўе ад ежы.", //???? - "buff.title.campfire_heal": "Утульнасць вогнішча", - "buff.desc.campfire_heal": "Адпачынак каля вогнішча аднаўляе {rate}% здароўя ў секунду.", - "buff.title.invulnerability": "Няўразлівасць", - "buff.desc.invulnerability": "Вам нічога не можа пашкодзіць.", - "buff.title.protectingward": "Ахоўная аўра", - "buff.desc.protectingward": "Атакі ворагаў не такія балючыя.", - "buff.title.frenzied": "Раз’юшанасць", - "buff.desc.frenzied": "Кроў цячэ хутчэй, паскараючы ваш рух ды трохі гаячы вашыя раны.", - "buff.title.hastened": "Паспех", - "buff.desc.hastened": "Вы рухаецеся і атакоўваеце хутчэй.", - // Debuffs - "buff.title.bleed": "Крывацёк", - "buff.desc.bleed": "Наносіць рэгулярную шкоду.", - "buff.title.cursed": "Праклён", - "buff.desc.cursed": "Вас праклялі.", - "buff.title.burn": "У агні", - "buff.desc.burn": "Вы гарыце жыўцом!", - "buff.title.crippled": "Пакалечаны", - "buff.desc.crippled": "Вы амаль не можаце рухацца, бо вашыя ногі пакалечаныя.", - "buff.title.frozen": "Абмарожанне", - "buff.desc.frozen": "Вы рухаецеся і атакоўваеце павольней.", - "buff.title.wet": "Вільготнасць", - "buff.desc.wet": "Глеба распаўзаецца пад вашымі нагамі, вам цяжка спыніцца.", - "buff.title.ensnared": "Аблытаны", - "buff.desc.ensnared": "Лазы аблытваюць вашыя ногі, затрымліваючы вас.", - // Buffs stats - "buff.stat.health": "Аднаўляе {str_total} адз. здароўя", - "buff.stat.increase_max_energy": "Павышае максімальнае здароўе на {strength}", - "buff.stat.increase_max_health": "Павышае максімальную энергію на {strength}", - "buff.stat.invulnerability": "Даруе няўразлівасць", - // Text - "buff.text.over_seconds": "на працягу {dur_secs} сек.", - "buff.text.for_seconds": "на працягу {dur_secs} сек.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/char_selection.ftl b/assets/voxygen/i18n/be_BY/char_selection.ftl new file mode 100644 index 0000000000..8a03276425 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Загрузка персанажаў... +char_selection-delete_permanently = Назаўжды выдаліць гэтага персанажа? +char_selection-deleting_character = Выдаленне персанажа... +char_selection-change_server = Змяніць сервер +char_selection-enter_world = Увайсці ў свет +char_selection-logout = Выхад +char_selection-create_new_character = Стварыць новага персанажа +char_selection-creating_character = Стварэнне персанажа... +char_selection-character_creation = Стварэнне персанажа +char_selection-human_default = Тыповы чалавек +char_selection-level_fmt = Узровень { $level_nb } +char_selection-uncanny_valley = Дзікія землі +char_selection-plains_of_uncertainty = Раўніны нявызначанасці +char_selection-beard = Барада +char_selection-hair_style = Прычоска +char_selection-hair_color = Колер валосся +char_selection-eye_color = Колер вачэй +char_selection-skin = Колер скуры +char_selection-eyeshape = Форма вачэй +char_selection-accessories = Аксесуары +char_selection-create_info_name = Вашаму персанажу патрэбна імя! +char_selection-version_mismatch = УВАГА! Гэты сервер выкарыстоўвае іншую, магчыма, несумяшчальную версію гульні. Калі ласка, абнавіце сваю гульню. \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/char_selection.ron b/assets/voxygen/i18n/be_BY/char_selection.ron deleted file mode 100644 index 3cbd2e0024..0000000000 --- a/assets/voxygen/i18n/be_BY/char_selection.ron +++ /dev/null @@ -1,33 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "char_selection.loading_characters": "Загрузка персанажаў...", - "char_selection.delete_permanently": "Назаўжды выдаліць гэтага персанажа?", - "char_selection.deleting_character": "Выдаленне персанажа...", - "char_selection.change_server": "Змяніць сервер", - "char_selection.enter_world": "Увайсці ў свет", - "char_selection.logout": "Выхад", - "char_selection.create_new_character": "Стварыць новага персанажа", - "char_selection.creating_character": "Стварэнне персанажа...", - "char_selection.character_creation": "Стварэнне персанажа", - "char_selection.human_default": "Тыповы чалавек", - "char_selection.level_fmt": "Узровень {level_nb}", - "char_selection.uncanny_valley": "Дзікія землі", - "char_selection.plains_of_uncertainty": "Раўніны нявызначанасці", - "char_selection.beard": "Барада", - "char_selection.hair_style": "Прычоска", - "char_selection.hair_color": "Колер валосся", - "char_selection.eye_color": "Колер вачэй", - "char_selection.skin": "Колер скуры", - "char_selection.eyeshape": "Форма вачэй", - "char_selection.accessories": "Аксесуары", - "char_selection.create_info_name": "Вашаму персанажу патрэбна імя!", - "char_selection.version_mismatch": "УВАГА! Гэты сервер выкарыстоўвае іншую, магчыма, несумяшчальную версію гульні. Калі ласка, абнавіце сваю гульню.", - - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/common.ftl b/assets/voxygen/i18n/be_BY/common.ftl new file mode 100644 index 0000000000..43cfc0d20c --- /dev/null +++ b/assets/voxygen/i18n/be_BY/common.ftl @@ -0,0 +1,104 @@ +common-username = Імя карыстальніка +common-singleplayer = Адзіночная гульня +common-multiplayer = Сеткавая гульня +common-servers = Серверы +common-quit = Выхад +common-settings = Налады +common-languages = Мова +common-interface = Інтэрфейс +common-gameplay = Гульня +common-controls = Кіраванне +common-video = Графіка +common-sound = Гук +common-chat = Чат +common-resume = Працягнуць +common-characters = Персанажы +common-close = Зачыніць +common-yes = Так +common-no = Не +common-back = Назад +common-create = Стварыць +common-okay = Добра +common-add = Дадаць +common-accept = Прыняць +common-decline = Адхіліць +common-disclaimer = Паведамленне +common-cancel = Скасаваць +common-none = Няма +common-error = Памылка +common-fatal_error = Крытычная памылка +common-you = Вы +common-automatic = Аўтаматычна +common-random = Выпадкова +common-empty = Пусты +common-confirm = Пацвердзіць +common-delete_server = Выдаліць сервер +common-interface_settings = Налады інтэрфейса +common-gameplay_settings = Налады гульні +common-controls_settings = Налады кіравання +common-video_settings = Налады графікі +common-sound_settings = Налады гуку +common-language_settings = Налады мовы +common-chat_settings = Налады чата +common-connection_lost = + Падключэнне згублена! + Мабыць, сервер перазапусціўся? + Ці абноўлены ваш кліент да апошняй версіі? +common-species-orc = Орк +common-species-human = Чалавек +common-species-dwarf = Дварф +common-species-elf = Эльф +common-species-draugr = Нежыць +common-species-danari = Данары +common-weapons-axe = Сякера +common-weapons-dagger = Кінжал +common-weapons-greatsword = Двухручны меч +common-weapons-shortswords = Кароткія мячы +common-weapons-sword = Меч +common-weapons-staff = Посах агню +common-weapons-bow = Лук +common-weapons-hammer = Молат +common-weapons-general = Агульны бой +common-weapons-sceptre = Скіпетр вылечвання +common-weapons-shield = Шчыт +common-weapons-spear = Дзіда +common-weapons-hammer_simple = Просты молат +common-weapons-sword_simple = Просты меч +common-weapons-staff_simple = Просты посах +common-weapons-axe_simple = Простая сякера +common-weapons-bow_simple = Просты лук +common-weapons-unique = Унікальны +common-tool-debug = Дэбаг +common-tool-farming = Сельскагаспадарчая прылада +common-tool-pick = Кірка +common-tool-mining = Горная справа +common-kind-modular_component = Модульны кампанент +common-kind-glider = Дэльтаплан +common-kind-consumable = Выдатковы прадмет +common-kind-throwable = Кідальны прадмет +common-kind-utility = Карыснасць +common-kind-ingredient = Інгрэдыент +common-kind-lantern = Ліхтар +common-hands-one = Аднаручнае +common-hands-two = Двухручнае +common-rand_appearance = Выпадковая знешнасць +common-rand_name = Выпадковае імя +common-stats-combat_rating = БР +common-stats-power = Моц +common-stats-speed = Хуткасць +common-stats-poise = Ураўнаважанасць +common-stats-crit_chance = Крыт. шанец +common-stats-crit_mult = Крыт. множнік +common-stats-armor = Браня +common-stats-poise_res = Супраціўленне аглушэнню +common-stats-energy_max = Максімальная энергія +common-stats-energy_reward = Бонус энергіі +common-stats-crit_power = Крыт. моц +common-stats-stealth = Скрытнасць +common-stats-slots = Яч. +common-material-metal = Метал +common-material-wood = Драўніна +common-material-stone = Камень +common-material-cloth = Тканіна +common-material-hide = Шкура +common-sprite-chest = Куфар \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/common.ron b/assets/voxygen/i18n/be_BY/common.ron deleted file mode 100644 index c0f4a6846b..0000000000 --- a/assets/voxygen/i18n/be_BY/common.ron +++ /dev/null @@ -1,126 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Імя карыстальніка", - "common.singleplayer": "Адзіночная гульня", - "common.multiplayer": "Сеткавая гульня", - "common.servers": "Серверы", - "common.quit": "Выхад", - "common.settings": "Налады", - "common.languages": "Мова", - "common.interface": "Інтэрфейс", - "common.gameplay": "Гульня", - "common.controls": "Кіраванне", - "common.video": "Графіка", - "common.sound": "Гук", - "common.chat": "Чат", - "common.resume": "Працягнуць", - "common.characters": "Персанажы", - "common.close": "Зачыніць", - "common.yes": "Так", - "common.no": "Не", - "common.back": "Назад", - "common.create": "Стварыць", - "common.okay": "Добра", - "common.add": "Дадаць", - "common.accept": "Прыняць", - "common.decline": "Адхіліць", - "common.disclaimer": "Паведамленне", - "common.cancel": "Скасаваць", - "common.none": "Няма", - "common.error": "Памылка", - "common.fatal_error": "Крытычная памылка", - "common.you": "Вы", - "common.automatic": "Аўтаматычна", - "common.random": "Выпадкова", - "common.empty": "Пусты", - "common.confirm": "Пацвердзіць", - "common.delete_server": "Выдаліць сервер", - - // Settings Window title - "common.interface_settings": "Налады інтэрфейса", - "common.gameplay_settings": "Налады гульні", - "common.controls_settings": "Налады кіравання", - "common.video_settings": "Налады графікі", - "common.sound_settings": "Налады гуку", - "common.language_settings": "Налады мовы", - "common.chat_settings": "Налады чата", - - // Message when connection to the server is lost - "common.connection_lost": r#"Падключэнне згублена! -Мабыць, сервер перазапусціўся? -Ці абноўлены ваш кліент да апошняй версіі?"#, - - - "common.species.orc": "Орк", - "common.species.human": "Чалавек", - "common.species.dwarf": "Дварф", - "common.species.elf": "Эльф", - "common.species.draugr": "Нежыць", - "common.species.danari": "Данары", - - "common.weapons.axe": "Сякера", - "common.weapons.dagger": "Кінжал", - "common.weapons.greatsword": "Двухручны меч", - "common.weapons.shortswords": "Кароткія мячы", - "common.weapons.sword": "Меч", - "common.weapons.staff": "Посах агню", - "common.weapons.bow": "Лук", - "common.weapons.hammer": "Молат", - "common.weapons.general": "Агульны бой", - "common.weapons.sceptre": "Скіпетр вылечвання", - "common.weapons.shield": "Шчыт", - "common.weapons.spear": "Дзіда", - "common.weapons.hammer_simple": "Просты молат", - "common.weapons.sword_simple": "Просты меч", - "common.weapons.staff_simple": "Просты посах", - "common.weapons.axe_simple": "Простая сякера", - "common.weapons.bow_simple": "Просты лук", - "common.weapons.unique": "Унікальны", - "common.tool.debug": "Дэбаг", - "common.tool.farming": "Сельскагаспадарчая прылада", //? - "common.tool.pick": "Кірка", - "common.tool.mining": "Горная справа", - "common.kind.modular_component": "Модульны кампанент", - "common.kind.glider": "Дэльтаплан", - "common.kind.consumable": "Выдатковы прадмет", ///??? - "common.kind.throwable": "Кідальны прадмет", - "common.kind.utility": "Карыснасць", - "common.kind.ingredient": "Інгрэдыент", - "common.kind.lantern": "Ліхтар", - "common.hands.one": "Аднаручнае", - "common.hands.two": "Двухручнае", - - "common.rand_appearance": "Выпадковая знешнасць", - "common.rand_name": "Выпадковае імя", - - "common.stats.combat_rating": "БР", - "common.stats.power": "Моц", - "common.stats.speed": "Хуткасць", - "common.stats.poise": "Ураўнаважанасць", - "common.stats.crit_chance": "Крыт. шанец", - "common.stats.crit_mult": "Крыт. множнік", - "common.stats.armor": "Браня", - "common.stats.poise_res":"Супраціўленне аглушэнню", - "common.stats.energy_max": "Максімальная энергія", - "common.stats.energy_reward": "Бонус энергіі", - "common.stats.crit_power": "Крыт. моц", - "common.stats.stealth": "Скрытнасць", - "common.stats.slots": "Яч.", //ячэйкі, have to abridge due to variable endings - - "common.material.metal": "Метал", - "common.material.wood": "Драўніна", - "common.material.stone": "Камень", - "common.material.cloth": "Тканіна", - "common.material.hide": "Шкура", - - "common.sprite.chest": "Куфар", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/esc_menu.ftl b/assets/voxygen/i18n/be_BY/esc_menu.ftl new file mode 100644 index 0000000000..07d2730187 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Выйсці ў меню +esc_menu-quit_game = Выйсці з гульні \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/esc_menu.ron b/assets/voxygen/i18n/be_BY/esc_menu.ron deleted file mode 100644 index 90a2d1885d..0000000000 --- a/assets/voxygen/i18n/be_BY/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "esc_menu.logout": "Выйсці ў меню", - "esc_menu.quit_game": "Выйсці з гульні", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/gameinput.ftl b/assets/voxygen/i18n/be_BY/gameinput.ftl new file mode 100644 index 0000000000..f9ef1cffcc --- /dev/null +++ b/assets/voxygen/i18n/be_BY/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Асноўная атака +gameinput-secondary = Дадатковая атака +gameinput-block = Блакіраваць +gameinput-slot1 = Ячэйка хуткага доступу 1 +gameinput-slot2 = Ячэйка хуткага доступу 2 +gameinput-slot3 = Ячэйка хуткага доступу 3 +gameinput-slot4 = Ячэйка хуткага доступу 4 +gameinput-slot5 = Ячэйка хуткага доступу 5 +gameinput-slot6 = Ячэйка хуткага доступу 6 +gameinput-slot7 = Ячэйка хуткага доступу 7 +gameinput-slot8 = Ячэйка хуткага доступу 8 +gameinput-slot9 = Ячэйка хуткага доступу 9 +gameinput-slot10 = Ячэйка хуткага доступу 10 +gameinput-swaploadout = Змяніць рыштунак +gameinput-togglecursor = Укл/Выкл курсор +gameinput-help = Адлюстроўваць акно дапамогі +gameinput-toggleinterface = Адлюстроўваць інтэрфейс +gameinput-toggledebug = Адлюстроўваць FPS ды тэх. звесткі +gameinput-toggle_egui_debug = Адлюстроўваць EGUI звесткі +gameinput-togglechat = Адлюстроўваць чат +gameinput-screenshot = Зрабіць здымак экрана +gameinput-toggleingameui = Адлюстроўваць імёны +gameinput-fullscreen = Уключыць поўнаэкранны рэжым +gameinput-moveforward = Рухацца наперад +gameinput-moveleft = Рухацца налева +gameinput-moveright = Рухацца направа +gameinput-moveback = Рухацца назад +gameinput-jump = Скачок +gameinput-glide = Дэльтаплан +gameinput-roll = Перакат +gameinput-climb = Карабкацца ўгору +gameinput-climbdown = Карабкацца ўніз +gameinput-wallleap = Скачок ад сцяны +gameinput-togglelantern = Ліхтар +gameinput-mount = Асядлаць +gameinput-chat = Чат +gameinput-command = Каманда +gameinput-escape = Выхад +gameinput-map = Мапа +gameinput-bag = Торба +gameinput-trade = Гандляваць +gameinput-social = Іншыя гульцы +gameinput-sit = Сесці +gameinput-spellbook = Здольнасці +gameinput-settings = Налады +gameinput-respawn = Адрадзіцца +gameinput-charge = Зарадзіць +gameinput-togglewield = Дастаць/схаваць зброю +gameinput-interact = Узаемадзейнічаць +gameinput-freelook = Вольная камера +gameinput-autowalk = Аўтаматычны рух +gameinput-cameraclamp = Замацаваць камеру +gameinput-dance = Танчыць +gameinput-select = Выбраць +gameinput-acceptgroupinvite = Прыняць запрашэнне ў групу +gameinput-declinegroupinvite = Адхіліць запрашэнне ў групу +gameinput-cyclecamera = Пераключыць камеру +gameinput-crafting = Рамяство +gameinput-fly = Лятаць +gameinput-sneak = Красціся +gameinput-swimdown = Плысці ўніз +gameinput-swimup = Плысці ўгору +gameinput-mapzoomin = Наблізіць мапу +gameinput-mapzoomout = Аддаліць мапу +gameinput-greet = Прывітанне +gameinput-map-locationmarkerbutton = Паставіць паказальнік \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/gameinput.ron b/assets/voxygen/i18n/be_BY/gameinput.ron deleted file mode 100644 index 491c2b8a57..0000000000 --- a/assets/voxygen/i18n/be_BY/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "gameinput.primary": "Асноўная атака", - "gameinput.secondary": "Дадатковая атака", - "gameinput.block": "Блакіраваць", - "gameinput.slot1": "Ячэйка хуткага доступу 1", - "gameinput.slot2": "Ячэйка хуткага доступу 2", - "gameinput.slot3": "Ячэйка хуткага доступу 3", - "gameinput.slot4": "Ячэйка хуткага доступу 4", - "gameinput.slot5": "Ячэйка хуткага доступу 5", - "gameinput.slot6": "Ячэйка хуткага доступу 6", - "gameinput.slot7": "Ячэйка хуткага доступу 7", - "gameinput.slot8": "Ячэйка хуткага доступу 8", - "gameinput.slot9": "Ячэйка хуткага доступу 9", - "gameinput.slot10": "Ячэйка хуткага доступу 10", - "gameinput.swaploadout": "Змяніць рыштунак", - "gameinput.togglecursor": "Укл/Выкл курсор", - "gameinput.help": "Адлюстроўваць акно дапамогі", - "gameinput.toggleinterface": "Адлюстроўваць інтэрфейс", - "gameinput.toggledebug": "Адлюстроўваць FPS ды тэх. звесткі", - "gameinput.toggle_egui_debug": "Адлюстроўваць EGUI звесткі", - "gameinput.togglechat": "Адлюстроўваць чат", - "gameinput.screenshot": "Зрабіць здымак экрана", - "gameinput.toggleingameui": "Адлюстроўваць імёны", - "gameinput.fullscreen": "Уключыць поўнаэкранны рэжым", - "gameinput.moveforward": "Рухацца наперад", - "gameinput.moveleft": "Рухацца налева", - "gameinput.moveright": "Рухацца направа", - "gameinput.moveback": "Рухацца назад", - "gameinput.jump": "Скачок", - "gameinput.glide": "Дэльтаплан", - "gameinput.roll": "Перакат", - "gameinput.climb": "Карабкацца ўгору", - "gameinput.climbdown": "Карабкацца ўніз", - "gameinput.wallleap": "Скачок ад сцяны", - "gameinput.togglelantern": "Ліхтар", - "gameinput.mount": "Асядлаць", - "gameinput.chat": "Чат", - "gameinput.command": "Каманда", - "gameinput.escape": "Выхад", - "gameinput.map": "Мапа", - "gameinput.bag": "Торба", - "gameinput.trade": "Гандляваць", - "gameinput.social": "Іншыя гульцы", - "gameinput.sit": "Сесці", - "gameinput.spellbook": "Здольнасці", - "gameinput.settings": "Налады", - "gameinput.respawn": "Адрадзіцца", - "gameinput.charge": "Зарадзіць", // what does charge mean? - "gameinput.togglewield": "Дастаць/схаваць зброю", - "gameinput.interact": "Узаемадзейнічаць", - "gameinput.freelook": "Вольная камера", - "gameinput.autowalk": "Аўтаматычны рух", - "gameinput.cameraclamp": "Замацаваць камеру", - "gameinput.dance": "Танчыць", - "gameinput.select": "Выбраць", - "gameinput.acceptgroupinvite": "Прыняць запрашэнне ў групу", - "gameinput.declinegroupinvite": "Адхіліць запрашэнне ў групу", - "gameinput.cyclecamera": "Пераключыць камеру", - "gameinput.crafting": "Рамяство", - "gameinput.fly": "Лятаць", - "gameinput.sneak": "Красціся", - "gameinput.swimdown": "Плысці ўніз", - "gameinput.swimup": "Плысці ўгору", - "gameinput.mapzoomin": "Наблізіць мапу", - "gameinput.mapzoomout": "Аддаліць мапу", - "gameinput.greet": "Прывітанне", - "gameinput.map.locationmarkerbutton": "Паставіць паказальнік", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/bag.ftl b/assets/voxygen/i18n/be_BY/hud/bag.ftl new file mode 100644 index 0000000000..de2033d2ec --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Інвентар { $playername } +hud-bag-stats_title = Характарыстыкі { $playername } +hud-bag-exp = Досвед +hud-bag-armor = Браня +hud-bag-stats = Характарыстыкі +hud-bag-head = Галава +hud-bag-neck = Шыя +hud-bag-tabard = Табард +hud-bag-shoulders = Плечы +hud-bag-chest = Грудзі +hud-bag-hands = Рукі +hud-bag-lantern = Ліхтар +hud-bag-glider = Дэльтаплан +hud-bag-belt = Пояс +hud-bag-ring = Пярсцёнак +hud-bag-back = Спіна +hud-bag-legs = Ногі +hud-bag-feet = Ступні +hud-bag-mainhand = Асноўная рука +hud-bag-offhand = Другарадная рука +hud-bag-inactive_mainhand = Асноўная рука (запас) +hud-bag-inactive_offhand = Другарадная рука (запас) +hud-bag-swap_equipped_weapons_title = Змяніць зброю +hud-bag-swap_equipped_weapons_desc = Націсніце { $key } +hud-bag-bag = Торба +hud-bag-health = Здароўе +hud-bag-energy = Энергія +hud-bag-combat_rating = Баявы рэйтынг +hud-bag-protection = Абарона +hud-bag-stun_res = Ураўнаважанасць +hud-bag-combat_rating_desc = + Разлічваецца з якасці вашага + рыштунку і здароўя. +hud-bag-protection_desc = Паглынанне шкоды вашай бранёй. +hud-bag-stun_res_desc = + Супраціўленне аглушэнню паслядоўнымі ўдарамі. + Аднаўляецца, як энергія. +hud-bag-sort_by_name = Сартаваць па назве +hud-bag-sort_by_quality = Сартаваць па якасці +hud-bag-sort_by_category = Сартаваць па катэгорыі \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/bag.ron b/assets/voxygen/i18n/be_BY/hud/bag.ron deleted file mode 100644 index 6b2abc1fdc..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - // Inventory - "hud.bag.inventory": "Інвентар {playername}", - "hud.bag.stats_title": "Характарыстыкі {playername}", - "hud.bag.exp": "Досвед", - "hud.bag.armor": "Браня", - "hud.bag.stats": "Характарыстыкі", - "hud.bag.head": "Галава", - "hud.bag.neck": "Шыя", - "hud.bag.tabard": "Табард", - "hud.bag.shoulders": "Плечы", - "hud.bag.chest": "Грудзі", - "hud.bag.hands": "Рукі", - "hud.bag.lantern": "Ліхтар", - "hud.bag.glider": "Дэльтаплан", - "hud.bag.belt": "Пояс", - "hud.bag.ring": "Пярсцёнак", - "hud.bag.back": "Спіна", - "hud.bag.legs": "Ногі", - "hud.bag.feet": "Ступні", - "hud.bag.mainhand": "Асноўная рука", - "hud.bag.offhand": "Другарадная рука", - "hud.bag.inactive_mainhand": "Асноўная рука (запас)", - "hud.bag.inactive_offhand": "Другарадная рука (запас)", - "hud.bag.swap_equipped_weapons_title": "Змяніць зброю", - "hud.bag.swap_equipped_weapons_desc": "Націсніце {key}", - "hud.bag.bag": "Торба", - "hud.bag.health": "Здароўе", - "hud.bag.energy": "Энергія", - "hud.bag.combat_rating": "Баявы рэйтынг", - "hud.bag.protection": "Абарона", - "hud.bag.stun_res": "Ураўнаважанасць", - "hud.bag.combat_rating_desc": "Разлічваецца з якасці вашага\nрыштунку і здароўя.", - "hud.bag.protection_desc": "Паглынанне шкоды вашай бранёй.", - "hud.bag.stun_res_desc": "Супраціўленне аглушэнню паслядоўнымі ўдарамі.\nАднаўляецца, як энергія.", - "hud.bag.sort_by_name": "Сартаваць па назве", - "hud.bag.sort_by_quality": "Сартаваць па якасці", - "hud.bag.sort_by_category": "Сартаваць па катэгорыі", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/char_window.ftl b/assets/voxygen/i18n/be_BY/hud/char_window.ftl new file mode 100644 index 0000000000..787247f82a --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Імя персанажа +character_window-character_stats = + Трываласць + + Спрытнасць + + Сіла волі + + Абарона \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/char_window.ron b/assets/voxygen/i18n/be_BY/hud/char_window.ron deleted file mode 100644 index 321f5c0227..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "character_window.character_name": "Імя персанажа", - // Character stats - "character_window.character_stats": r#"Трываласць - -Спрытнасць - -Сіла волі - -Абарона -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/chat.ftl b/assets/voxygen/i18n/be_BY/hud/chat.ftl new file mode 100644 index 0000000000..a6a3b7fa22 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Усе +hud-chat-chat_tab_hover_tooltip = ПКМ для наладаў +hud-outcome-burning = згарэў(-ла) жыўцом +hud-outcome-curse = памёр(-ла) ад праклёну +hud-outcome-bleeding = памёр(-ла) ад крывацёку +hud-outcome-crippled = памёр(-ла) ад траўмаў +hud-outcome-frozen = памёр(-ла) ад холаду +hud-chat-online_msg = [{ $name }] зараз у сетцы +hud-chat-offline_msg = [{ $name }] больш не ў сетцы +hud-chat-default_death_msg = [{ $name }] памёр(-ла) +hud-chat-environmental_kill_msg = [{ $name }] памёр(-ла) у { $environment } +hud-chat-fall_kill_msg = [{ $name }] разбіўся(-лася) насмерць +hud-chat-suicide_msg = [{ $name }] здзейсніў(-ла) самагубства +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff }, выкліканага [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] перамог(-ла) [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] застрэліў(-ла) [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] падарваў(-ла) [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] забіў(-ла) [{ $victim }] чарамі +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff }, выкліканага { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } забіў(-ла) [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } застрэліў(-ла) [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } падарваў(-ла) [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } забіў(-ла) [{ $victim }] чарамі +hud-chat-npc_other_kill_msg = { $attacker } забіў(-ла) [{ $victim }] +hud-chat-loot_msg = Вы падабралі [{ $item }] +hud-chat-loot_fail = У вашых торбах не хапае месца! +hud-chat-goodbye = Да пабачэння! +hud-chat-connection_lost = Злучэнне згублена. Вас выштурхнуць праз { $time } сек. \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/chat.ron b/assets/voxygen/i18n/be_BY/hud/chat.ron deleted file mode 100644 index 8dd835d1a9..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.chat.all": "Усе", - "hud.chat.chat_tab_hover_tooltip": "ПКМ для наладаў", - - // Debuff outcomes - "hud.outcome.burning": "згарэў(-ла) жыўцом", - "hud.outcome.curse": "памёр(-ла) ад праклёну", - "hud.outcome.bleeding": "памёр(-ла) ад крывацёку", - "hud.outcome.crippled": "памёр(-ла) ад траўмаў", - "hud.outcome.frozen": "памёр(-ла) ад холаду", - - // Chat outputs - "hud.chat.online_msg": "[{name}] зараз у сетцы", - "hud.chat.offline_msg": "[{name}] больш не ў сетцы", - - "hud.chat.default_death_msg": "[{name}] памёр(-ла)", - "hud.chat.environmental_kill_msg": "[{name}] памёр(-ла) у {environment}", - "hud.chat.fall_kill_msg": "[{name}] разбіўся(-лася) насмерць", - "hud.chat.suicide_msg": "[{name}] здзейсніў(-ла) самагубства", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff}, выкліканага [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] перамог(-ла) [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] застрэліў(-ла) [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] падарваў(-ла) [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] забіў(-ла) [{victim}] чарамі", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff}, выкліканага {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} забіў(-ла) [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} застрэліў(-ла) [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} падарваў(-ла) [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} забіў(-ла) [{victim}] чарамі", - "hud.chat.npc_other_kill_msg": "{attacker} забіў(-ла) [{victim}]", - - "hud.chat.loot_msg": "Вы падабралі [{item}]", - "hud.chat.loot_fail": "У вашых торбах не хапае месца!", - "hud.chat.goodbye": "Да пабачэння!", - "hud.chat.connection_lost": "Злучэнне згублена. Вас выштурхнуць праз {time} сек.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/crafting.ftl b/assets/voxygen/i18n/be_BY/hud/crafting.ftl new file mode 100644 index 0000000000..abbfc7206c --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/crafting.ftl @@ -0,0 +1,34 @@ +hud-crafting = Рамяство +hud-crafting-recipes = Рэцэпты +hud-crafting-ingredients = Інгрэдыенты: +hud-crafting-craft = Стварыць +hud-crafting-tool_cata = Патрэбна: +hud-crafting-req_crafting_station = Патрэбна: +hud-crafting-anvil = Кавадла +hud-crafting-cauldron = Кацёл +hud-crafting-cooking_pot = Казан +hud-crafting-crafting_bench = Варштат +hud-crafting-forge = Горан +hud-crafting-loom = Ткацкі станок +hud-crafting-spinning_wheel = Калаўрот +hud-crafting-tanning_rack = Дубільная рама +hud-crafting-salvaging_station = Варштат для разборкі +hud-crafting-campfire = Вогнішча +hud-crafting-tabs-all = Усё +hud-crafting-tabs-armor = Браня +hud-crafting-tabs-dismantle = Разабраць на часткі +hud-crafting-tabs-food = Ежа +hud-crafting-tabs-glider = Дэльтапланы +hud-crafting-tabs-potion = Зеллі +hud-crafting-tabs-tool = Прылады +hud-crafting-tabs-utility = Карыснасці +hud-crafting-tabs-weapon = Зброя +hud-crafting-tabs-bag = Торбы +hud-crafting-tabs-processed_material = Матэрыялы +hud-crafting-dismantle_title = Разабраць на часткі +hud-crafting-dismantle_explanation = + Змясціце курсор на іконцы прадмета, + каб даведацца, што можна атрымаць. + + Націсніце двойчы, каб пачаць + разбіранне. \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/crafting.ron b/assets/voxygen/i18n/be_BY/hud/crafting.ron deleted file mode 100644 index de6f76b756..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.crafting": "Рамяство", - "hud.crafting.recipes": "Рэцэпты", - "hud.crafting.ingredients": "Інгрэдыенты:", - "hud.crafting.craft": "Стварыць", - "hud.crafting.tool_cata": "Патрэбна:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Патрэбна:", - "hud.crafting.anvil": "Кавадла", - "hud.crafting.cauldron": "Кацёл", - "hud.crafting.cooking_pot": "Казан", - "hud.crafting.crafting_bench": "Варштат", - "hud.crafting.forge": "Горан", - "hud.crafting.loom": "Ткацкі станок", - "hud.crafting.spinning_wheel": "Калаўрот", - "hud.crafting.tanning_rack": "Дубільная рама", - "hud.crafting.salvaging_station": "Варштат для разборкі", - "hud.crafting.campfire": "Вогнішча", - // Tabs - "hud.crafting.tabs.all": "Усё", - "hud.crafting.tabs.armor": "Браня", - "hud.crafting.tabs.dismantle": "Разабраць на часткі", - "hud.crafting.tabs.food": "Ежа", - "hud.crafting.tabs.glider": "Дэльтапланы", - "hud.crafting.tabs.potion": "Зеллі", - "hud.crafting.tabs.tool": "Прылады", - "hud.crafting.tabs.utility": "Карыснасці", - "hud.crafting.tabs.weapon": "Зброя", - "hud.crafting.tabs.bag": "Торбы", - "hud.crafting.tabs.processed_material": "Матэрыялы", - "hud.crafting.dismantle_title": "Разабраць на часткі", - "hud.crafting.dismantle_explanation" : "Змясціце курсор на іконцы прадмета,\nкаб даведацца, што можна атрымаць.\n\nНацісніце двойчы, каб пачаць\nразбіранне.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/group.ftl b/assets/voxygen/i18n/be_BY/hud/group.ftl new file mode 100644 index 0000000000..eb97b475cf --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Група +hud-group-invite_to_join = [{ $name }] запрасіў вас у сваю групу! +hud-group-invite_to_trade = [{ $name }] жадае пагандляваць з вамі. +hud-group-invite = Запрасіць +hud-group-kick = Выштурхнуць +hud-group-assign_leader = Прызначыць лідара +hud-group-leave = Пакінуць групу +hud-group-dead = Памерлы +hud-group-out_of_range = Недасягальны +hud-group-add_friend = Дадаць да сяброў +hud-group-link_group = Звязаць групы +hud-group-in_menu = У меню +hud-group-members = Чальцы групы \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/group.ron b/assets/voxygen/i18n/be_BY/hud/group.ron deleted file mode 100644 index 1f6ddfeef9..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.group": "Група", - "hud.group.invite_to_join": "[{name}] запрасіў вас у сваю групу!", - "hud.group.invite_to_trade": "[{name}] жадае пагандляваць з вамі.", - "hud.group.invite": "Запрасіць", - "hud.group.kick": "Выштурхнуць", - "hud.group.assign_leader": "Прызначыць лідара", - "hud.group.leave": "Пакінуць групу", - "hud.group.dead" : "Памерлы", - "hud.group.out_of_range": "Недасягальны", - "hud.group.add_friend": "Дадаць да сяброў", - "hud.group.link_group": "Звязаць групы", - "hud.group.in_menu": "У меню", - "hud.group.members": "Чальцы групы", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/map.ftl b/assets/voxygen/i18n/be_BY/hud/map.ftl new file mode 100644 index 0000000000..b058d02441 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/map.ftl @@ -0,0 +1,33 @@ +hud-map-map_title = Мапа +hud-map-qlog_title = Заданні +hud-map-topo_map = Тапаграфічная +hud-map-difficulty = Цяжкасць +hud-map-towns = Гарады +hud-map-castles = Замкі +hud-map-dungeons = Падзямеллі +hud-map-caves = Пячоры +hud-map-cave = Пячора +hud-map-peaks = Горы +hud-map-biomes = Біёмы +hud-map-voxel_map = Воксельная мапа +hud-map-trees = Гіганцкія дрэвы +hud-map-tree = Гіганцкае дрэва +hud-map-town = Горад +hud-map-castle = Замак +hud-map-dungeon = Падзямелле +hud-map-difficulty_dungeon = + Цяжкасць + падзямелля: { $difficulty } +hud-map-drag = Цягнуть +hud-map-zoom = Маштаб +hud-map-mid_click = Дадаць паказальнік +hud-map-recenter = Адцэнтраваць +hud-map-marked_location = Паказальнік +hud-map-marked_location_remove = Націсніце, каб выдаліць +hud-map-change_map_mode = Змяніць рэжым мапы +hud-map-toggle_minimap_voxel = Пераключыцца да воксельнай мінімапы +hud-map-zoom_minimap_explanation = + Маштабуйце мінімапу, каб + лепей бачыць вобласть вакол сябе +hud-map-gnarling = Форт Гнарлінгаў +hud-map-placed_by = Змешчана { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/map.ron b/assets/voxygen/i18n/be_BY/hud/map.ron deleted file mode 100644 index d8f1bd1705..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Мапа", - "hud.map.qlog_title": "Заданні", - "hud.map.topo_map": "Тапаграфічная", - "hud.map.difficulty": "Цяжкасць", - "hud.map.towns": "Гарады", - "hud.map.castles": "Замкі", - "hud.map.dungeons": "Падзямеллі", - "hud.map.caves": "Пячоры", - "hud.map.cave": "Пячора", - "hud.map.peaks": "Горы", - "hud.map.biomes": "Біёмы", - "hud.map.voxel_map": "Воксельная мапа", - "hud.map.trees": "Гіганцкія дрэвы", - "hud.map.tree": "Гіганцкае дрэва", - "hud.map.town": "Горад", - "hud.map.castle": "Замак", - "hud.map.dungeon": "Падзямелле", - "hud.map.difficulty_dungeon": "Цяжкасць\nпадзямелля: {difficulty}", - "hud.map.drag": "Цягнуть", - "hud.map.zoom": "Маштаб", - "hud.map.mid_click": "Дадаць паказальнік", - "hud.map.recenter": "Адцэнтраваць", - "hud.map.marked_location": "Паказальнік", - "hud.map.marked_location_remove": "Націсніце, каб выдаліць", - "hud.map.change_map_mode": "Змяніць рэжым мапы", - "hud.map.toggle_minimap_voxel": "Пераключыцца да воксельнай мінімапы", - "hud.map.zoom_minimap_explanation": "Маштабуйце мінімапу, каб\n лепей бачыць вобласть вакол сябе", - "hud.map.gnarling": "Форт Гнарлінгаў", //? - "hud.map.placed_by": "Змешчана {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/misc.ftl b/assets/voxygen/i18n/be_BY/hud/misc.ftl new file mode 100644 index 0000000000..af510796b6 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = Не паказваць гэта пры запуску +hud-show_tips = Паказваць падказкі +hud-quests = Заданні +hud-you_died = Вы памерлі +hud-waypoint_saved = Месца адраджэння ўсталявана +hud-sp_arrow_txt = АУ +hud-inventory_full = Поўны інвентар +hud-press_key_to_show_keybindings_fmt = [{ $key }] Прызначэнні клавіш +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Ліхтар +hud-press_key_to_show_debug_info_fmt = Націсніце { $key }, каб адлюстроўваць тэх. звесткі +hud-press_key_to_toggle_keybindings_fmt = Націсніце { $key }, каб адлюстроўваць прызначэнні клавіш +hud-press_key_to_toggle_debug_info_fmt = Націсніце { $key }, каб адлюстроўваць тэх. звесткі +hud-press_key_to_respawn = Націсніце { $key }, каб адрадзіцца каля апошняга пабачанага вогнішча. +hud-tutorial_btn = Навучанне +hud-tutorial_click_here = Націсніце [ { $key } ], каб мець магчымасць націснуць гэту кнопку! +hud-tutorial_elements = Рамяство +hud-temp_quest_headline = Вітанне, вандроўнік! +hud-temp_quest_text = + Каб пачаць сваё падарожжа, можаце пагуляць па гэтай вёсцы ды пазбіраць прыпасаў. + + Не саромейцеся, бярыце ўсё, што вам можа спатрэбіцца на шляху. + + Паглядзіце ў ніжні правы кут экрана, каб знайсці розныя карысныя рэчы, як - торба, меню рамяства і мапу. + + Працоўныя месцы, як, напрыклад, варштат і казан дазваляюць вам ствараць браню, зброю, ежу і шмат чаго іншага! + + Дзікія зверы вакол вёскі - гэта выдатная крыніца Жывёльных шкур, з якіх можна зрабіць якуюсьці ахову ад пагроз гэтага вялікага свету. + + Як адчуваеце, што гатовыя, зірніце на мапу, каб знайсці сабе выпрабаванні і лепшы рыштунак! +hud-spell = Здольнасці +hud-diary = Журнал +hud-free_look_indicator = Вольны агляд актываваны. Націсніце { $key }, каб скасаваць. +hud-camera_clamp_indicator = Камера замацавана вертыкальна. Націсніце { $key }, каб скасаваць. +hud-auto_walk_indicator = Аўта рух/плаванне актываваныя +hud-collect = Сабраць +hud-pick_up = Падабраць +hud-open = Адчыніць +hud-use = Ужыць +hud-mine = Здабываць +hud-talk = Пагутарыць +hud-trade = Гандляваць +hud-mount = Асядлаць +hud-sit = Сесці \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/misc.ron b/assets/voxygen/i18n/be_BY/hud/misc.ron deleted file mode 100644 index b3527124b8..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.do_not_show_on_startup": "Не паказваць гэта пры запуску", - "hud.show_tips": "Паказваць падказкі", - "hud.quests": "Заданні", - "hud.you_died": "Вы памерлі", - "hud.waypoint_saved": "Месца адраджэння ўсталявана", - "hud.sp_arrow_txt": "АУ", - "hud.inventory_full": "Поўны інвентар", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Прызначэнні клавіш", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Ліхтар", - "hud.press_key_to_show_debug_info_fmt": "Націсніце {key}, каб адлюстроўваць тэх. звесткі", - "hud.press_key_to_toggle_keybindings_fmt": "Націсніце {key}, каб адлюстроўваць прызначэнні клавіш", - "hud.press_key_to_toggle_debug_info_fmt": "Націсніце {key}, каб адлюстроўваць тэх. звесткі", - - // Respawn message - "hud.press_key_to_respawn": r#"Націсніце {key}, каб адрадзіцца каля апошняга пабачанага вогнішча."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Навучанне"#, - "hud.tutorial_click_here": r#"Націсніце [ {key} ], каб мець магчымасць націснуць гэту кнопку!"#, - "hud.tutorial_elements": r#"Рамяство"#, - -"hud.temp_quest_headline": r#"Вітанне, вандроўнік!"#, -"hud.temp_quest_text": r#"Каб пачаць сваё падарожжа, можаце пагуляць па гэтай вёсцы ды пазбіраць прыпасаў. - -Не саромейцеся, бярыце ўсё, што вам можа спатрэбіцца на шляху. - -Паглядзіце ў ніжні правы кут экрана, каб знайсці розныя карысныя рэчы, як - торба, меню рамяства і мапу. - -Працоўныя месцы, як, напрыклад, варштат і казан дазваляюць вам ствараць браню, зброю, ежу і шмат чаго іншага! - -Дзікія зверы вакол вёскі - гэта выдатная крыніца Жывёльных шкур, з якіх можна зрабіць якуюсьці ахову ад пагроз гэтага вялікага свету. - -Як адчуваеце, што гатовыя, зірніце на мапу, каб знайсці сабе выпрабаванні і лепшы рыштунак! -"#, - - "hud.spell": "Здольнасці", - // Diary - "hud.diary": "Журнал", - - "hud.free_look_indicator": "Вольны агляд актываваны. Націсніце {key}, каб скасаваць.", - "hud.camera_clamp_indicator": "Камера замацавана вертыкальна. Націсніце {key}, каб скасаваць.", - "hud.auto_walk_indicator": "Аўта рух/плаванне актываваныя", - "hud.collect": "Сабраць", - "hud.pick_up": "Падабраць", - "hud.open": "Адчыніць", - "hud.use": "Ужыць", - "hud.mine": "Здабываць", - "hud.talk": "Пагутарыць", - "hud.trade": "Гандляваць", - "hud.mount": "Асядлаць", - "hud.sit": "Сесці", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/sct.ftl b/assets/voxygen/i18n/be_BY/hud/sct.ftl new file mode 100644 index 0000000000..8b26924a59 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } адз. досведу +hud-sct-block = БЛОК \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/sct.ron b/assets/voxygen/i18n/be_BY/hud/sct.ron deleted file mode 100644 index 2b50983cc9..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} адз. досведу", - "hud.sct.block": "БЛОК", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/settings.ftl b/assets/voxygen/i18n/be_BY/hud/settings.ftl new file mode 100644 index 0000000000..09f7c6c421 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/settings.ftl @@ -0,0 +1,127 @@ +hud-settings-general = Асноўныя +hud-settings-none = Няма +hud-settings-press_behavior-toggle = Пераключыць +hud-settings-press_behavior-hold = Трымаць +hud-settings-help_window = Акно дапамогі +hud-settings-debug_info = Тэхнічныя звесткі +hud-settings-show_hitboxes = Адлюстроўваць хітбоксы +hud-settings-show_chat = Паказваць чат +hud-settings-show_hotkey_hints = Падказваць гарачыя клавішы +hud-settings-tips_on_startup = Падказкі пры запуску +hud-settings-ui_scale = Маштаб інтэрфейса +hud-settings-relative_scaling = Адносны +hud-settings-custom_scaling = Ручны +hud-settings-crosshair = Прыцэл +hud-settings-opacity = Празрыстасць +hud-settings-hotbar = Панэль хуткага доступу +hud-settings-toggle_shortcuts = Гарачыя клавішы +hud-settings-buffs_skillbar = Статусныя эфекты каля панэлі здольнасцяў +hud-settings-buffs_mmap = Статусныя эфекты каля мінімапы +hud-settings-toggle_bar_experience = Адлюстроўваць панэль досведу +hud-settings-scrolling_combat_text = Адлюстроўваць шкоду/злечванне +hud-settings-incoming_damage = Шкода ад кожнага ўдара па гульцу +hud-settings-speech_bubble = Індыкатар гаворкі +hud-settings-speech_bubble_self = Паказваць свае індыкатары гаворкі +hud-settings-speech_bubble_dark_mode = Цёмны рэжым індыкатара гаворкі +hud-settings-speech_bubble_icon = Малюнак індыкатара гаворкі +hud-settings-energybar_numbers = Лічбы на панэлі энергіі +hud-settings-always_show_bars = Заўсёды паказваць панэль энергіі/здароўя +hud-settings-values = Значэнні +hud-settings-percentages = Адсоткі +hud-settings-chat = Чат +hud-settings-background_opacity = Празрыстасць фону +hud-settings-chat_character_name = Імёны персанажаў у чаце +hud-settings-loading_tips = Падказкі на экране загрузкі +hud-settings-reset_interface = Па змаўчанню +hud-settings-pan_sensitivity = Чуллівасць мышы +hud-settings-zoom_sensitivity = Чуллівасць пракруткі +hud-settings-camera_clamp_angle = Вугал вертыкальнага замацавання камеры +hud-settings-invert_scroll_zoom = Інвертаваць пракрутку +hud-settings-invert_mouse_y_axis = Інвертаваць вось Y мышы +hud-settings-invert_controller_y_axis = Інвертаваць вось Y геймпада +hud-settings-enable_mouse_smoothing = + Згладжванне руху + камеры +hud-settings-free_look_behavior = Паводзіны вольнага агляду +hud-settings-auto_walk_behavior = Паводзіны аўтаруху +hud-settings-camera_clamp_behavior = Паводзіны замацаванай камеры +hud-settings-player_physics_behavior = Фізіка гульца (эксперыментальнае) +hud-settings-stop_auto_walk_on_input = + Скасаваць аўтарух + пры ўводзе +hud-settings-auto_camera = Аўтакамера +hud-settings-reset_gameplay = Па змаўчанню +hud-settings-view_distance = ДБ (далёкасць бачн.) +hud-settings-sprites_view_distance = ДБ спрайтаў +hud-settings-figures_view_distance = ДБ аб’ектаў +hud-settings-maximum_fps = Максімальны FPS +hud-settings-background_fps = Фонавы FPS +hud-settings-present_mode = Рэжым прэзэнтацыі (Vulkan Swap Chain) +hud-settings-present_mode-fifo = FIFO +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Імгненны +hud-settings-fov = Вугал агляду (град.) +hud-settings-gamma = Гама +hud-settings-exposure = Экспазіцыя +hud-settings-ambiance = Яркасць наваколля +hud-settings-antialiasing_mode = Рэжым антыаліясінгу +hud-settings-upscale_factor = Унутраная разрознасць +hud-settings-cloud_rendering_mode = Якасць аблокаў +hud-settings-fluid_rendering_mode = Якасць вадкасцяў +hud-settings-fluid_rendering_mode-cheap = Нізкая +hud-settings-fluid_rendering_mode-shiny = Бліскучая +hud-settings-cloud_rendering_mode-minimal = Мінімальная +hud-settings-cloud_rendering_mode-low = Нізкая +hud-settings-cloud_rendering_mode-medium = Сярэдняя +hud-settings-cloud_rendering_mode-high = Высокая +hud-settings-cloud_rendering_mode-ultra = Ультра +hud-settings-fullscreen = На ўвесь экран +hud-settings-fullscreen_mode = Поўнаэкранны рэжым +hud-settings-fullscreen_mode-exclusive = Эксклюзіўны +hud-settings-fullscreen_mode-borderless = Акно без рамак +hud-settings-gpu_profiler = GPU замеры (можа быць недаступнае) +hud-settings-particles = Часцінкі +hud-settings-lossy_terrain_compression = Сцісканне рэльефу са стратамі даных +hud-settings-weapon_trails = Сляды ад зброі +hud-settings-resolution = Разрознасць +hud-settings-bit_depth = Глыбіня колеру +hud-settings-refresh_rate = Частата абнаўлення экрана +hud-settings-lighting_rendering_mode = Якасць асвятлення +hud-settings-lighting_rendering_mode-ashikhmin = Тып A - Высокая +hud-settings-lighting_rendering_mode-blinnphong = Тып B - Сярэдняя +hud-settings-lighting_rendering_mode-lambertian = Тып L - Нізкая +hud-settings-shadow_rendering_mode = Якасць ценяў +hud-settings-shadow_rendering_mode-none = Без ценяў +hud-settings-shadow_rendering_mode-cheap = Нізкая +hud-settings-shadow_rendering_mode-map = Мапа +hud-settings-shadow_rendering_mode-map-resolution = Разрознасць +hud-settings-lod_detail = Узровень дэталізацыі +hud-settings-save_window_size = Захаваць памер акна +hud-settings-reset_graphics = Па змаўчанню +hud-settings-bloom = Прасочванне святла +hud-settings-point_glow = Крыніцы святла +hud-settings-master_volume = Агульная гучнасць +hud-settings-inactive_master_volume_perc = Гучнасць (калі акно неактыўнае) +hud-settings-music_volume = Гучнасць музыкі +hud-settings-sound_effect_volume = Гучнасць гукавых эфектаў +hud-settings-audio_device = Аўдыяпрылада +hud-settings-reset_sound = Па змаўчанню +hud-settings-english_fallback = Выкарыстоўваць ангельскую, калі няма перакладу +hud-settings-awaitingkey = Націсніце клавішу... +hud-settings-unbound = Не прызначана +hud-settings-reset_keybinds = Па змаўчанню +hud-settings-chat_tabs = Укладкі чата +hud-settings-label = Ярлык: +hud-settings-delete = Выдаліць +hud-settings-show_all = Адлюстроўваць усё +hud-settings-messages = Паведамленні +hud-settings-activity = Фільтр актыўнасці +hud-settings-death = Смерць +hud-settings-group = Група +hud-settings-faction = Фракцыя +hud-settings-world = Свет +hud-settings-region = Рэгіён +hud-settings-say = Гаворка побач +hud-settings-all = Усе +hud-settings-group_only = Толькі група +hud-settings-reset_chat = Па змаўчанню \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/settings.ron b/assets/voxygen/i18n/be_BY/hud/settings.ron deleted file mode 100644 index 857131b930..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/settings.ron +++ /dev/null @@ -1,141 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - // Settings - "hud.settings.general": "Асноўныя", - "hud.settings.none": "Няма", - "hud.settings.press_behavior.toggle": "Пераключыць", - "hud.settings.press_behavior.hold": "Трымаць", - "hud.settings.help_window": "Акно дапамогі", - "hud.settings.debug_info": "Тэхнічныя звесткі", - "hud.settings.show_hitboxes": "Адлюстроўваць хітбоксы", - "hud.settings.show_chat": "Паказваць чат", - "hud.settings.show_hotkey_hints": "Падказваць гарачыя клавішы", - "hud.settings.tips_on_startup": "Падказкі пры запуску", - "hud.settings.ui_scale": "Маштаб інтэрфейса", - "hud.settings.relative_scaling": "Адносны", - "hud.settings.custom_scaling": "Ручны", - "hud.settings.crosshair": "Прыцэл", - "hud.settings.opacity": "Празрыстасць", - "hud.settings.hotbar": "Панэль хуткага доступу", - "hud.settings.toggle_shortcuts": "Гарачыя клавішы", - "hud.settings.buffs_skillbar": "Статусныя эфекты каля панэлі здольнасцяў", - "hud.settings.buffs_mmap": "Статусныя эфекты каля мінімапы", - "hud.settings.toggle_bar_experience": "Адлюстроўваць панэль досведу", - "hud.settings.scrolling_combat_text": "Адлюстроўваць шкоду/злечванне", - "hud.settings.incoming_damage": "Шкода ад кожнага ўдара па гульцу", - "hud.settings.speech_bubble": "Індыкатар гаворкі", - "hud.settings.speech_bubble_self": "Паказваць свае індыкатары гаворкі", - "hud.settings.speech_bubble_dark_mode": "Цёмны рэжым індыкатара гаворкі", - "hud.settings.speech_bubble_icon": "Малюнак індыкатара гаворкі", - "hud.settings.energybar_numbers": "Лічбы на панэлі энергіі", - "hud.settings.always_show_bars": "Заўсёды паказваць панэль энергіі/здароўя", - "hud.settings.values": "Значэнні", - "hud.settings.percentages": "Адсоткі", - "hud.settings.chat": "Чат", - "hud.settings.background_opacity": "Празрыстасць фону", - "hud.settings.chat_character_name": "Імёны персанажаў у чаце", - "hud.settings.loading_tips": "Падказкі на экране загрузкі", - "hud.settings.reset_interface": "Па змаўчанню", - - "hud.settings.pan_sensitivity": "Чуллівасць мышы", - "hud.settings.zoom_sensitivity": "Чуллівасць пракруткі", - "hud.settings.camera_clamp_angle": "Вугал вертыкальнага замацавання камеры", - "hud.settings.invert_scroll_zoom": "Інвертаваць пракрутку", - "hud.settings.invert_mouse_y_axis": "Інвертаваць вось Y мышы", - "hud.settings.invert_controller_y_axis": "Інвертаваць вось Y геймпада", - "hud.settings.enable_mouse_smoothing": "Згладжванне руху\nкамеры", - "hud.settings.free_look_behavior": "Паводзіны вольнага агляду", - "hud.settings.auto_walk_behavior": "Паводзіны аўтаруху", - "hud.settings.camera_clamp_behavior": "Паводзіны замацаванай камеры", - "hud.settings.player_physics_behavior": "Фізіка гульца (эксперыментальнае)", - "hud.settings.stop_auto_walk_on_input": "Скасаваць аўтарух\nпры ўводзе", - "hud.settings.auto_camera": "Аўтакамера", - "hud.settings.reset_gameplay": "Па змаўчанню", - - "hud.settings.view_distance": "ДБ (далёкасць бачн.)", - "hud.settings.sprites_view_distance": "ДБ спрайтаў", - "hud.settings.figures_view_distance": "ДБ аб’ектаў", - "hud.settings.maximum_fps": "Максімальны FPS", - "hud.settings.background_fps": "Фонавы FPS", - "hud.settings.present_mode": "Рэжым прэзэнтацыі (Vulkan Swap Chain)", - "hud.settings.present_mode.fifo": "FIFO", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Імгненны", - "hud.settings.fov": "Вугал агляду (град.)", - "hud.settings.gamma": "Гама", - "hud.settings.exposure": "Экспазіцыя", - "hud.settings.ambiance": "Яркасць наваколля", - "hud.settings.antialiasing_mode": "Рэжым антыаліясінгу", - "hud.settings.upscale_factor": "Унутраная разрознасць", - "hud.settings.cloud_rendering_mode": "Якасць аблокаў", - "hud.settings.fluid_rendering_mode": "Якасць вадкасцяў", - "hud.settings.fluid_rendering_mode.cheap": "Нізкая", - "hud.settings.fluid_rendering_mode.shiny": "Бліскучая", - "hud.settings.cloud_rendering_mode.minimal": "Мінімальная", - "hud.settings.cloud_rendering_mode.low": "Нізкая", - "hud.settings.cloud_rendering_mode.medium": "Сярэдняя", - "hud.settings.cloud_rendering_mode.high": "Высокая", - "hud.settings.cloud_rendering_mode.ultra": "Ультра", - "hud.settings.fullscreen": "На ўвесь экран", - "hud.settings.fullscreen_mode": "Поўнаэкранны рэжым", - "hud.settings.fullscreen_mode.exclusive": "Эксклюзіўны", - "hud.settings.fullscreen_mode.borderless": "Акно без рамак", - "hud.settings.gpu_profiler": "GPU замеры (можа быць недаступнае)", - "hud.settings.particles": "Часцінкі", - "hud.settings.lossy_terrain_compression": "Сцісканне рэльефу са стратамі даных", - "hud.settings.weapon_trails": "Сляды ад зброі", - "hud.settings.resolution": "Разрознасць", - "hud.settings.bit_depth": "Глыбіня колеру", - "hud.settings.refresh_rate": "Частата абнаўлення экрана", - "hud.settings.lighting_rendering_mode": "Якасць асвятлення", - "hud.settings.lighting_rendering_mode.ashikhmin": "Тып A - Высокая ", - "hud.settings.lighting_rendering_mode.blinnphong": "Тып B - Сярэдняя", - "hud.settings.lighting_rendering_mode.lambertian": "Тып L - Нізкая", - "hud.settings.shadow_rendering_mode": "Якасць ценяў", - "hud.settings.shadow_rendering_mode.none": "Без ценяў", - "hud.settings.shadow_rendering_mode.cheap": "Нізкая", - "hud.settings.shadow_rendering_mode.map": "Мапа", - "hud.settings.shadow_rendering_mode.map.resolution": "Разрознасць", - "hud.settings.lod_detail": "Узровень дэталізацыі", - "hud.settings.save_window_size": "Захаваць памер акна", - "hud.settings.reset_graphics": "Па змаўчанню", - "hud.settings.bloom": "Прасочванне святла", - "hud.settings.point_glow": "Крыніцы святла", - - "hud.settings.master_volume": "Агульная гучнасць", - "hud.settings.inactive_master_volume_perc": "Гучнасць (калі акно неактыўнае)", - "hud.settings.music_volume": "Гучнасць музыкі", - "hud.settings.sound_effect_volume": "Гучнасць гукавых эфектаў", - "hud.settings.audio_device": "Аўдыяпрылада", - "hud.settings.reset_sound": "Па змаўчанню", - - "hud.settings.english_fallback": "Выкарыстоўваць ангельскую, калі няма перакладу", - - "hud.settings.awaitingkey": "Націсніце клавішу...", - "hud.settings.unbound": "Не прызначана", - "hud.settings.reset_keybinds": "Па змаўчанню", - - "hud.settings.chat_tabs": "Укладкі чата", - "hud.settings.label": "Ярлык:", - "hud.settings.delete": "Выдаліць", - "hud.settings.show_all": "Адлюстроўваць усё", - "hud.settings.messages": "Паведамленні", - "hud.settings.activity": "Фільтр актыўнасці", - "hud.settings.death": "Смерць", - "hud.settings.group": "Група", - "hud.settings.faction": "Фракцыя", - "hud.settings.world": "Свет", - "hud.settings.region": "Рэгіён", - "hud.settings.say": "Гаворка побач", - "hud.settings.all": "Усе", - "hud.settings.group_only": "Толькі група", - "hud.settings.reset_chat" : "Па змаўчанню", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/skills.ftl b/assets/voxygen/i18n/be_BY/hud/skills.ftl new file mode 100644 index 0000000000..93e6584a81 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Новая адзінка ўмельства +hud-skill-sp_available = { $number } АУ даступна +hud-skill-not_unlocked = Пакуль не адчынена +hud-skill-req_sp ={"\u000A"} + + Патрабуе { $number } АУ +hud-skill-inc_health_title = Павелічэнне здароўя +hud-skill-inc_health = Павялічвае макс. здароўе на { $boost }{ $SP } +hud-skill-inc_energy_title = Павелічэнне энергіі +hud-skill-inc_energy = Павялічвае макс. энергію на { $boost }{ $SP } +hud-skill-unlck_sword_title = Валоданне мячом +hud-skill-unlck_sword = Адчыняе дрэва навыкаў валодання мячом{ $SP } +hud-skill-unlck_axe_title = Валоданне сякерай +hud-skill-unlck_axe = Адчыняе дрэва навыкаў валодання сякерай{ $SP } +hud-skill-unlck_hammer_title = Валоданне молатам +hud-skill-unlck_hammer = Адчыняе дрэва навыкаў валодання молатам{ $SP } +hud-skill-unlck_bow_title = Валоданне лукам +hud-skill-unlck_bow = Адчыняе дрэва навыкаў валодання лукам{ $SP } +hud-skill-unlck_staff_title = Валоданне посахам +hud-skill-unlck_staff = Адчыняе дрэва навыкаў валодання посахам{ $SP } +hud-skill-unlck_sceptre_title = Валоданне скіпетрам +hud-skill-unlck_sceptre = Адчыняе дрэва навыкаў валодання скіпетрам{ $SP } +hud-skill-dodge_title = Перакат +hud-skill-dodge = Вы робіцеся няўразлівымі на некаторы перыяд падчас перакату. +hud-skill-roll_energy_title = Кошт перакату +hud-skill-roll_energy = Перакат патрабуе на { $boost }% менш энергіі{ $SP } +hud-skill-roll_speed_title = Хуткасць перакату +hud-skill-roll_speed = Перакочвайцеся на { $boost }% хутчэй{ $SP } +hud-skill-roll_dur_title = Працягласць перакату +hud-skill-roll_dur = Перакочвайцеся на { $boost }% даўжэй{ $SP } +hud-skill-climbing_title = Скалалажанне +hud-skill-climbing = Імкніся вышэй +hud-skill-climbing_cost_title = Кошт скалалажання +hud-skill-climbing_cost = Скалалажанне ўжывае на { $boost }% менш энергіі{ $SP } +hud-skill-climbing_speed_title = Хуткасць скалалажання +hud-skill-climbing_speed = Караскайцеся на { $boost }% хутчэй{ $SP } +hud-skill-swim_title = Плаванне +hud-skill-swim = Перамяшчэнне ў вадкасцях +hud-skill-swim_speed_title = Хуткасць плавання +hud-skill-swim_speed = Плавайце на { $boost }% хутчэй{ $SP } +hud-skill-sc_lifesteal_title = Прамень крадзяжу жыцця +hud-skill-sc_lifesteal = Паглынайце жыццё сваіх ворагаў +hud-skill-sc_lifesteal_damage_title = Шкода +hud-skill-sc_lifesteal_damage = Прычыняйце на { $boost }% больш шкоды{ $SP } +hud-skill-sc_lifesteal_range_title = Далёкасць +hud-skill-sc_lifesteal_range = Ваш прамень на { $boost }% даўжэйшы{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Крадзёж жыцця +hud-skill-sc_lifesteal_lifesteal = Ператварае дадатковыя { $boost }% шкоды ў здароўе{ $SP } +hud-skill-sc_lifesteal_regen_title = Аднаўленне энергіі +hud-skill-sc_lifesteal_regen = Папоўніце сваю энергію на дадатковыя { $boost }%{ $SP } +hud-skill-sc_heal_title = Аўра вылечвання +hud-skill-sc_heal = Вылечвайце сваіх паплечнікаў кроўю ворагаў. Каб ужыць, патрэбна перш здзейсніць комба +hud-skill-sc_heal_heal_title = Вылечванне +hud-skill-sc_heal_heal = Пабольшвае моц вылечвання на { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Выдатак энергіі +hud-skill-sc_heal_cost = Вылечванне патрабуе на { $boost }% менш энергіі{ $SP } +hud-skill-sc_heal_duration_title = Працягласць +hud-skill-sc_heal_duration = Эфект аўры вылечвання цягнецца на { $boost }% даўжэй{ $SP } +hud-skill-sc_heal_range_title = Радыус +hud-skill-sc_heal_range = Аўра вылечвання распасціраецца на { $boost }% далей{ $SP } +hud-skill-sc_wardaura_unlock_title = Ахоўная аўра +hud-skill-sc_wardaura_unlock = Дазваляе абараняць сваіх паплечнікаў ад варожых атак{ $SP } +hud-skill-sc_wardaura_strength_title = Моц +hud-skill-sc_wardaura_strength = Моц вашай абароны расце на { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Працягласць +hud-skill-sc_wardaura_duration = Эфект вашай аўры трымаецца на { $boost }% даўжэй{ $SP } +hud-skill-sc_wardaura_range_title = Радыус +hud-skill-sc_wardaura_range = Аўра распасціраецца на { $boost }% далей{ $SP } +hud-skill-sc_wardaura_cost_title = Выдатак энергіі +hud-skill-sc_wardaura_cost = Стварэнне аўры патрабуе на { $boost }% менш энергіі{ $SP } +hud-skill-st_shockwave_range_title = Радыус ударнай хвалі +hud-skill-st_shockwave_range = Пабольшвае радыус ударнай хвалі на { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Выдатак энергіі +hud-skill-st_shockwave_cost = Ударная хваля патрабуе на { $boost }% менш энергіі{ $SP } +hud-skill-st_shockwave_knockback_title = Адкідванне хваляй +hud-skill-st_shockwave_knockback = Пабольшвае далёкасць адкідвання на { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Шкода хвалі +hud-skill-st_shockwave_damage = Пабольшвае шкоду ад хвалі на { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Ударная хваля +hud-skill-st_shockwave_unlock = Адчыняе магчымасць адківаць ворагаў хваляй агню{ $SP } +hud-skill-st_flamethrower_title = Струмень агню +hud-skill-st_flamethrower = Качка падгарае! +hud-skill-st_flame_velocity_title = Хуткасць струменя агню +hud-skill-st_flame_velocity = Струмень з’яўляецца на { $boost }% хутчэй{ $SP } +hud-skill-st_flamethrower_range_title = Далёкасць струменя +hud-skill-st_flamethrower_range = Пабольшвае далёкасць дзеяння чар на { $boost }%{ $SP } +hud-skill-st_energy_drain_title = Выдатак энергіі +hud-skill-st_energy_drain = Змяншае хуткасць паглынання энергіі на { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Шкода струменя +hud-skill-st_flamethrower_damage = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Радыус выбуху +hud-skill-st_explosion_radius = Чым болей, тым лепей! Пабольшвае радыус выбуху на { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Аднаўленне энергіі +hud-skill-st_energy_regen = Пабольшвае аднаўленне энергіі на { $boost }%{ $SP } +hud-skill-st_fireball_title = Агнявы шар +hud-skill-st_fireball = Запускае агнявы шар, які выбухае пры сутыкненні +hud-skill-st_damage_title = Шкода +hud-skill-st_damage = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Хуткасць стрэл +hud-skill-bow_projectile_speed = Пабольшвае хуткасць і далёкасць выстралаў на { $boost }%{ $SP } +hud-skill-bow_charged_title = Прыцэльны выстрал +hud-skill-bow_charged = Цярпі, казак - атаманам будзеш +hud-skill-bow_charged_damage_title = Шкода +hud-skill-bow_charged_damage = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Аднаўленне энергіі +hud-skill-bow_charged_energy_regen = Пабольшвае аднаўленне энергіі на { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Адкідванне +hud-skill-bow_charged_knockback = Адкідвайце ворагаў на { $boost }% далей{ $SP } +hud-skill-bow_charged_speed_title = Хуткасць +hud-skill-bow_charged_speed = Паскарае працэс прыцэльвання на { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Хуткасць руху +hud-skill-bow_charged_move = Пабольшвае хуткасць вашага руху ў час прыцэльвання на { $boost }%{ $SP } +hud-skill-bow_repeater_title = Страламёт +hud-skill-bow_repeater = Выпускайце стралу за стралой, набіраючы хуткасць +hud-skill-bow_repeater_damage_title = Шкода страламёта +hud-skill-bow_repeater_damage = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Выдатак энергіі +hud-skill-bow_repeater_cost = Запуск чаргі стрэл спажывае на { $boost }% менш энергіі{ $SP } +hud-skill-bow_repeater_speed_title = Хуткасць страламёта +hud-skill-bow_repeater_speed = Пабольшвае тэмп страламёту на { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Стралавік +hud-skill-bow_shotgun_unlock = Адчыняе магчымасць запуску некалькіх стрэл адначасова{ $SP } +hud-skill-bow_shotgun_damage_title = Шкода стралавіка +hud-skill-bow_shotgun_damage = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Выдатак энергіі +hud-skill-bow_shotgun_cost = Выстрал спажывае на { $boost }% менш энергіі{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Колькасць стрэл +hud-skill-bow_shotgun_arrow_count = Пабольшвае колькасць стрэл у выстрале на { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Кучнасць стрэл +hud-skill-bow_shotgun_spread = Змяншае роскід стрэл на { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Радыус ударнай хвалі +hud-skill-hmr_leap_radius = Пабольшвае радыус ударнай хвалі ад атакі ў скачку на { $boost } метры{ $SP } +hud-skill-hmr_leap_distance_title = Даўжыня скачка +hud-skill-hmr_leap_distance = Пабольшвае даўжыню скачка на { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Выдатак энергіі +hud-skill-hmr_leap_cost = Змяншае выдатак энергіі на { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Адкідванне атакай у скачку +hud-skill-hmr_leap_knockback = Адкідвайце ворагаў на { $boost }% далей{ $SP } +hud-skill-hmr_leap_damage_title = Шкода +hud-skill-hmr_leap_damage = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Атака ў скачку +hud-skill-hmr_unlock_leap = Адчыняе магчымасць атакі ў скачку{ $SP } +hud-skill-hmr_charged_melee_title = Зараджаны ўдар +hud-skill-hmr_charged_melee = Прыпыніцеся на хвілінку ды вытніце злосніка з усяе сілы +hud-skill-hmr_charged_rate_title = Хуткасць зарадкі +hud-skill-hmr_charged_rate = Удар зараджаецца на { $boost }% хутчэй{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Выдатак энергіі +hud-skill-hmr_charged_melee_nrg_drain = Змяншае паглынанне энергіі ў час зарадкі на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Шкода +hud-skill-hmr_charged_melee_damage = Пабольшвае шкоду ад заражанага ўдару на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Адкідванне зараджаным ударам +hud-skill-hmr_charged_melee_knockback = Значна пабольшвае моц адкідвання на { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Удар +hud-skill-hmr_single_strike = Бі альбо не бі, вось у чым пытанне! +hud-skill-hmr_single_strike_regen_title = Аднаўленне энергіі +hud-skill-hmr_single_strike_regen = Пабольшвае аднаўленне энергіі з кожным паслядоўным ударам{ $SP } +hud-skill-hmr_single_strike_speed_title = Хуткасць удару +hud-skill-hmr_single_strike_speed = Пабольшвае хуткасць атакі з кожным паслядоўным ударам{ $SP } +hud-skill-hmr_single_strike_damage_title = Шкода +hud-skill-hmr_single_strike_damage = Пабольшвае шкоду з кожным паслядоўным ударам{ $SP } +hud-skill-hmr_single_strike_knockback_title = Адкідванне +hud-skill-hmr_single_strike_knockback = Пабольшвае адкідванне на { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Трайны ўдар +hud-skill-sw_trip_str = Бог любіць тройцу +hud-skill-sw_trip_str_combo_title = Комба трох удараў +hud-skill-sw_trip_str_combo = Адчыняе прырост характарыстык ад удараў запар{ $SP } +hud-skill-sw_trip_str_dmg_title = Шкода +hud-skill-sw_trip_str_dmg = Пабольшвае шкоду, якую наносіць кожны паслядоўны ўдар{ $SP } +hud-skill-sw_trip_str_sp_title = Хуткасць трайнога ўдару +hud-skill-sw_trip_str_sp = Пабольшвае хуткасць атакі з кожным паслядоўным ударам{ $SP } +hud-skill-sw_trip_str_reg_title = Аднаўленне энергіі +hud-skill-sw_trip_str_reg = Пабольшвае прырост аднаўлення энергіі з кожным паслядоўным ударам{ $SP } +hud-skill-sw_dash_title = Рывок +hud-skill-sw_dash = Праляці маланкай між сваіх ворагаў +hud-skill-sw_dash_dmg_title = Шкода рыўка +hud-skill-sw_dash_dmg = Пабольшвае пачатковую шкоду ад рыўка на { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Спажыванне энергіі +hud-skill-sw_dash_drain = Змяншае хуткасць паглынання энергіі ў час рыўка на { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Выдатак энергіі +hud-skill-sw_dash_cost = Змяншае пачатковы кошт рыўка на { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Хуткасць рыўка +hud-skill-sw_dash_speed = Пабольшвае хуткасць вашага руху ў час рыўка на { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Рывок наскрозь +hud-skill-sw_dash_charge_through = Дазваляе прарвацца скрозь першых ворагаў{ $SP } +hud-skill-sw_dash_scale_title = Прырост шкоды рыўком +hud-skill-sw_dash_scale = Пабольшвае прырост шкоды рыўком на { $boost }%{ $SP } +hud-skill-sw_spin_title = Віхор +hud-skill-sw_spin = Адчыняе магчымасць смяротна кружыцца з мячом{ $SP } +hud-skill-sw_spin_dmg_title = Шкода віхру +hud-skill-sw_spin_dmg = Пабольшвае шкоду на { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Хуткасць віхру +hud-skill-sw_spin_spd = Пабольшвае хуткасць кручэння на { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Выдатак энергіі +hud-skill-sw_spin_cost = Змяншае кошт кожнага абарота на { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Колькасць абаротаў +hud-skill-sw_spin_spins = Пабольшвае максімальную колькасць абаротаў{ $SP } +hud-skill-sw_interrupt_title = Перарыванне атакі +hud-skill-sw_interrupt = Дазваляе імгненна перарваць варожую атаку ўласнай{ $SP } +hud-skill-axe_double_strike_title = Двайны ўдар +hud-skill-axe_double_strike = Крышы гэтых ліхадзеяў +hud-skill-axe_double_strike_combo_title = Комба двух удараў +hud-skill-axe_double_strike_combo = Адчыняе другі паслядоўны ўдар{ $SP } +hud-skill-axe_double_strike_damage_title = Шкода двайнога ўдару +hud-skill-axe_double_strike_damage = Пабольшвае прырост шкоды ад удараў запар{ $SP } +hud-skill-axe_double_strike_speed_title = Хуткасць двайнога ўдару +hud-skill-axe_double_strike_speed = Пабольшвае прырост хуткасць ад удараў запар{ $SP } +hud-skill-axe_double_strike_regen_title = Аднаўленне энергі +hud-skill-axe_double_strike_regen = Пабольшвае прырост аднаўлення энергіі ад удараў запар{ $SP } +hud-skill-axe_spin_title = Вальс з сякерай +hud-skill-axe_spin = Марамі, сівымі хмарамі дзіка круцілі... +hud-skill-axe_infinite_axe_spin_title = Бясконцае кручэнне +hud-skill-axe_infinite_axe_spin = Дазваляе кружыцца, пакуль ёсць энергія{ $SP } +hud-skill-axe_spin_damage_title = Шкода +hud-skill-axe_spin_damage = Пабольшвае шкоду ад кожнага абарота на { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Верталёт +hud-skill-axe_spin_helicopter = Запавольвае падзенне падчас кручэння{ $SP } +hud-skill-axe_spin_speed_title = Хуткасць кручэння +hud-skill-axe_spin_speed = Пабольшвае хуткасць кручэння на { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Выдатак энергіі +hud-skill-axe_spin_cost = Змяншае кошт кручэння на { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Атака ў скачку +hud-skill-axe_unlock_leap = Адчыняе атаку ў скачку{ $SP } +hud-skill-axe_leap_damage_title = Шкода ад атакі ў скачку +hud-skill-axe_leap_damage = Пабольшвае шкоду атакі ў скачку на { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Адкіданне атакой у скачку +hud-skill-axe_leap_knockback = Пабольшвае адкіданне атакой у скачку на { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Выдатак энергіі +hud-skill-axe_leap_cost = Змяншае кошт атакі ў скачку на { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Даўжыня скачка +hud-skill-axe_leap_distance = Пабольшвае даўжыню скачка на { $boost }%{ $SP } +hud-skill-mining_title = Горная справа +hud-skill-pick_strike_title = Удар кіркою +hud-skill-pick_strike = Біце жылы і друзы, каб здабыць руды і каштоўныя камяні +hud-skill-pick_strike_speed_title = Хуткасць здабычы +hud-skill-pick_strike_speed = Здабывайце сыравіну хутчэй{ $SP } +hud-skill-pick_strike_oregain_title = Шчаслівы ўдар (руда) +hud-skill-pick_strike_oregain = Шанец здабыць дадатковую руду (+{ $boost }% за ўзровень){ $SP } +hud-skill-pick_strike_gemgain_title = Шчаслівы ўдар (камяні) +hud-skill-pick_strike_gemgain = Шанец здабыць дадатковыя каштоўныя камяні (+{ $boost }% за ўзровень){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/skills.ron b/assets/voxygen/i18n/be_BY/hud/skills.ron deleted file mode 100644 index 3b9b15218e..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.rank_up": "Новая адзінка ўмельства", - "hud.skill.sp_available": "{number} АУ даступна", - "hud.skill.not_unlocked": "Пакуль не адчынена", - "hud.skill.req_sp": "\n\nПатрабуе {number} АУ", - // Skills - // General - "hud.skill.inc_health_title": "Павелічэнне здароўя", - "hud.skill.inc_health": "Павялічвае макс. здароўе на {boost}{SP}", - "hud.skill.inc_energy_title": "Павелічэнне энергіі", - "hud.skill.inc_energy": "Павялічвае макс. энергію на {boost}{SP}", - "hud.skill.unlck_sword_title": "Валоданне мячом", - "hud.skill.unlck_sword": "Адчыняе дрэва навыкаў валодання мячом{SP}", - "hud.skill.unlck_axe_title": "Валоданне сякерай", - "hud.skill.unlck_axe": "Адчыняе дрэва навыкаў валодання сякерай{SP}", - "hud.skill.unlck_hammer_title": "Валоданне молатам", - "hud.skill.unlck_hammer": "Адчыняе дрэва навыкаў валодання молатам{SP}", - "hud.skill.unlck_bow_title": "Валоданне лукам", - "hud.skill.unlck_bow": "Адчыняе дрэва навыкаў валодання лукам{SP}", - "hud.skill.unlck_staff_title": "Валоданне посахам", - "hud.skill.unlck_staff": "Адчыняе дрэва навыкаў валодання посахам{SP}", - "hud.skill.unlck_sceptre_title": "Валоданне скіпетрам", - "hud.skill.unlck_sceptre": "Адчыняе дрэва навыкаў валодання скіпетрам{SP}", - "hud.skill.dodge_title": "Перакат", - "hud.skill.dodge": "Вы робіцеся няўразлівымі на некаторы перыяд падчас перакату.", - "hud.skill.roll_energy_title": "Кошт перакату", - "hud.skill.roll_energy": "Перакат патрабуе на {boost}% менш энергіі{SP}", - "hud.skill.roll_speed_title": "Хуткасць перакату", - "hud.skill.roll_speed": "Перакочвайцеся на {boost}% хутчэй{SP}", - "hud.skill.roll_dur_title": "Працягласць перакату", - "hud.skill.roll_dur": "Перакочвайцеся на {boost}% даўжэй{SP}", - "hud.skill.climbing_title": "Скалалажанне", - "hud.skill.climbing": "Імкніся вышэй", - "hud.skill.climbing_cost_title": "Кошт скалалажання", - "hud.skill.climbing_cost": "Скалалажанне ўжывае на {boost}% менш энергіі{SP}", - "hud.skill.climbing_speed_title": "Хуткасць скалалажання", - "hud.skill.climbing_speed": "Караскайцеся на {boost}% хутчэй{SP}", - "hud.skill.swim_title": "Плаванне", - "hud.skill.swim": "Перамяшчэнне ў вадкасцях", - "hud.skill.swim_speed_title": "Хуткасць плавання", - "hud.skill.swim_speed": "Плавайце на {boost}% хутчэй{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Прамень крадзяжу жыцця", - "hud.skill.sc_lifesteal": "Паглынайце жыццё сваіх ворагаў", - "hud.skill.sc_lifesteal_damage_title": "Шкода", - "hud.skill.sc_lifesteal_damage": "Прычыняйце на {boost}% больш шкоды{SP}", - "hud.skill.sc_lifesteal_range_title": "Далёкасць", - "hud.skill.sc_lifesteal_range": "Ваш прамень на {boost}% даўжэйшы{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Крадзёж жыцця", - "hud.skill.sc_lifesteal_lifesteal": "Ператварае дадатковыя {boost}% шкоды ў здароўе{SP}", - "hud.skill.sc_lifesteal_regen_title": "Аднаўленне энергіі", - "hud.skill.sc_lifesteal_regen": "Папоўніце сваю энергію на дадатковыя {boost}%{SP}", - "hud.skill.sc_heal_title": "Аўра вылечвання", - "hud.skill.sc_heal": "Вылечвайце сваіх паплечнікаў кроўю ворагаў. Каб ужыць, патрэбна перш здзейсніць комба", - "hud.skill.sc_heal_heal_title": "Вылечванне", - "hud.skill.sc_heal_heal": "Пабольшвае моц вылечвання на {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Выдатак энергіі", - "hud.skill.sc_heal_cost": "Вылечванне патрабуе на {boost}% менш энергіі{SP}", - "hud.skill.sc_heal_duration_title": "Працягласць", - "hud.skill.sc_heal_duration": "Эфект аўры вылечвання цягнецца на {boost}% даўжэй{SP}", - "hud.skill.sc_heal_range_title": "Радыус", - "hud.skill.sc_heal_range": "Аўра вылечвання распасціраецца на {boost}% далей{SP}", - "hud.skill.sc_wardaura_unlock_title": "Ахоўная аўра", - "hud.skill.sc_wardaura_unlock": "Дазваляе абараняць сваіх паплечнікаў ад варожых атак{SP}", - "hud.skill.sc_wardaura_strength_title": "Моц", - "hud.skill.sc_wardaura_strength": "Моц вашай абароны расце на {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Працягласць", - "hud.skill.sc_wardaura_duration": "Эфект вашай аўры трымаецца на {boost}% даўжэй{SP}", - "hud.skill.sc_wardaura_range_title": "Радыус", - "hud.skill.sc_wardaura_range": "Аўра распасціраецца на {boost}% далей{SP}", - "hud.skill.sc_wardaura_cost_title": "Выдатак энергіі", - "hud.skill.sc_wardaura_cost": "Стварэнне аўры патрабуе на {boost}% менш энергіі{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Радыус ударнай хвалі", - "hud.skill.st_shockwave_range" : "Пабольшвае радыус ударнай хвалі на {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Выдатак энергіі", - "hud.skill.st_shockwave_cost" : "Ударная хваля патрабуе на {boost}% менш энергіі{SP}", - "hud.skill.st_shockwave_knockback_title" : "Адкідванне хваляй", - "hud.skill.st_shockwave_knockback" : "Пабольшвае далёкасць адкідвання на {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Шкода хвалі", - "hud.skill.st_shockwave_damage" : "Пабольшвае шкоду ад хвалі на {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Ударная хваля", - "hud.skill.st_shockwave_unlock" : "Адчыняе магчымасць адківаць ворагаў хваляй агню{SP}", - "hud.skill.st_flamethrower_title" : "Струмень агню", - "hud.skill.st_flamethrower" : "Качка падгарае!", - "hud.skill.st_flame_velocity_title" : "Хуткасць струменя агню", - "hud.skill.st_flame_velocity" : "Струмень з’яўляецца на {boost}% хутчэй{SP}", - "hud.skill.st_flamethrower_range_title" : "Далёкасць струменя", - "hud.skill.st_flamethrower_range" : "Пабольшвае далёкасць дзеяння чар на {boost}%{SP}", - "hud.skill.st_energy_drain_title" : "Выдатак энергіі", - "hud.skill.st_energy_drain" : "Змяншае хуткасць паглынання энергіі на {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Шкода струменя", - "hud.skill.st_flamethrower_damage" : "Пабольшвае шкоду на {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Радыус выбуху", - "hud.skill.st_explosion_radius" : "Чым болей, тым лепей! Пабольшвае радыус выбуху на {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Аднаўленне энергіі", - "hud.skill.st_energy_regen" : "Пабольшвае аднаўленне энергіі на {boost}%{SP}", - "hud.skill.st_fireball_title" : "Агнявы шар", - "hud.skill.st_fireball" : "Запускае агнявы шар, які выбухае пры сутыкненні", - "hud.skill.st_damage_title" : "Шкода", - "hud.skill.st_damage" : "Пабольшвае шкоду на {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Хуткасць стрэл", - "hud.skill.bow_projectile_speed" : "Пабольшвае хуткасць і далёкасць выстралаў на {boost}%{SP}", - "hud.skill.bow_charged_title" : "Прыцэльны выстрал", - "hud.skill.bow_charged" : "Цярпі, казак - атаманам будзеш", - "hud.skill.bow_charged_damage_title" : "Шкода", - "hud.skill.bow_charged_damage" : "Пабольшвае шкоду на {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Аднаўленне энергіі", - "hud.skill.bow_charged_energy_regen" : "Пабольшвае аднаўленне энергіі на {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Адкідванне", - "hud.skill.bow_charged_knockback" : "Адкідвайце ворагаў на {boost}% далей{SP}", - "hud.skill.bow_charged_speed_title" : "Хуткасць", - "hud.skill.bow_charged_speed" : "Паскарае працэс прыцэльвання на {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Хуткасць руху", - "hud.skill.bow_charged_move" : "Пабольшвае хуткасць вашага руху ў час прыцэльвання на {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Страламёт", - "hud.skill.bow_repeater" : "Выпускайце стралу за стралой, набіраючы хуткасць", - "hud.skill.bow_repeater_damage_title" : "Шкода страламёта", - "hud.skill.bow_repeater_damage" : "Пабольшвае шкоду на {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Выдатак энергіі", - "hud.skill.bow_repeater_cost" : "Запуск чаргі стрэл спажывае на {boost}% менш энергіі{SP}", - "hud.skill.bow_repeater_speed_title" : "Хуткасць страламёта", - "hud.skill.bow_repeater_speed" : "Пабольшвае тэмп страламёту на {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Стралавік", //kudos to awesome Ukrainian adaptation - "hud.skill.bow_shotgun_unlock" : "Адчыняе магчымасць запуску некалькіх стрэл адначасова{SP}", - "hud.skill.bow_shotgun_damage_title" : "Шкода стралавіка", - "hud.skill.bow_shotgun_damage" : "Пабольшвае шкоду на {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Выдатак энергіі", - "hud.skill.bow_shotgun_cost" : "Выстрал спажывае на {boost}% менш энергіі{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Колькасць стрэл", - "hud.skill.bow_shotgun_arrow_count" : "Пабольшвае колькасць стрэл у выстрале на {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Кучнасць стрэл", - "hud.skill.bow_shotgun_spread" : "Змяншае роскід стрэл на {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Радыус ударнай хвалі", - "hud.skill.hmr_leap_radius" : "Пабольшвае радыус ударнай хвалі ад атакі ў скачку на {boost} метры{SP}", - "hud.skill.hmr_leap_distance_title" : "Даўжыня скачка", - "hud.skill.hmr_leap_distance" : "Пабольшвае даўжыню скачка на {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Выдатак энергіі", - "hud.skill.hmr_leap_cost" : "Змяншае выдатак энергіі на {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Адкідванне атакай у скачку", - "hud.skill.hmr_leap_knockback" : "Адкідвайце ворагаў на {boost}% далей{SP}", - "hud.skill.hmr_leap_damage_title" : "Шкода", - "hud.skill.hmr_leap_damage" : "Пабольшвае шкоду на {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Атака ў скачку", - "hud.skill.hmr_unlock_leap" : "Адчыняе магчымасць атакі ў скачку{SP}", - "hud.skill.hmr_charged_melee_title" : "Зараджаны ўдар", - "hud.skill.hmr_charged_melee" : "Прыпыніцеся на хвілінку ды вытніце злосніка з усяе сілы", - "hud.skill.hmr_charged_rate_title" : "Хуткасць зарадкі", - "hud.skill.hmr_charged_rate" : "Удар зараджаецца на {boost}% хутчэй{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Выдатак энергіі", - "hud.skill.hmr_charged_melee_nrg_drain" : "Змяншае паглынанне энергіі ў час зарадкі на {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Шкода", - "hud.skill.hmr_charged_melee_damage" : "Пабольшвае шкоду ад заражанага ўдару на {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Адкідванне зараджаным ударам", - "hud.skill.hmr_charged_melee_knockback" : "Значна пабольшвае моц адкідвання на {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Удар", - "hud.skill.hmr_single_strike" : "Бі альбо не бі, вось у чым пытанне!", // pun adaptation - "hud.skill.hmr_single_strike_regen_title" : "Аднаўленне энергіі", - "hud.skill.hmr_single_strike_regen" : "Пабольшвае аднаўленне энергіі з кожным паслядоўным ударам{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Хуткасць удару", - "hud.skill.hmr_single_strike_speed" : "Пабольшвае хуткасць атакі з кожным паслядоўным ударам{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Шкода", - "hud.skill.hmr_single_strike_damage" : "Пабольшвае шкоду з кожным паслядоўным ударам{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Адкідванне", - "hud.skill.hmr_single_strike_knockback" : "Пабольшвае адкідванне на {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Трайны ўдар", - "hud.skill.sw_trip_str": "Бог любіць тройцу", - "hud.skill.sw_trip_str_combo_title": "Комба трох удараў", - "hud.skill.sw_trip_str_combo": "Адчыняе прырост характарыстык ад удараў запар{SP}", - "hud.skill.sw_trip_str_dmg_title": "Шкода", - "hud.skill.sw_trip_str_dmg": "Пабольшвае шкоду, якую наносіць кожны паслядоўны ўдар{SP}", - "hud.skill.sw_trip_str_sp_title": "Хуткасць трайнога ўдару", - "hud.skill.sw_trip_str_sp": "Пабольшвае хуткасць атакі з кожным паслядоўным ударам{SP}", - "hud.skill.sw_trip_str_reg_title": "Аднаўленне энергіі", - "hud.skill.sw_trip_str_reg": "Пабольшвае прырост аднаўлення энергіі з кожным паслядоўным ударам{SP}", - "hud.skill.sw_dash_title": "Рывок", - "hud.skill.sw_dash": "Праляці маланкай між сваіх ворагаў", - "hud.skill.sw_dash_dmg_title": "Шкода рыўка", - "hud.skill.sw_dash_dmg": "Пабольшвае пачатковую шкоду ад рыўка на {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Спажыванне энергіі", - "hud.skill.sw_dash_drain": "Змяншае хуткасць паглынання энергіі ў час рыўка на {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Выдатак энергіі", - "hud.skill.sw_dash_cost": "Змяншае пачатковы кошт рыўка на {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Хуткасць рыўка", - "hud.skill.sw_dash_speed": "Пабольшвае хуткасць вашага руху ў час рыўка на {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Рывок наскрозь", - "hud.skill.sw_dash_charge_through": "Дазваляе прарвацца скрозь першых ворагаў{SP}", - "hud.skill.sw_dash_scale_title": "Прырост шкоды рыўком", - "hud.skill.sw_dash_scale": "Пабольшвае прырост шкоды рыўком на {boost}%{SP}", - "hud.skill.sw_spin_title": "Віхор", - "hud.skill.sw_spin": "Адчыняе магчымасць смяротна кружыцца з мячом{SP}", - "hud.skill.sw_spin_dmg_title": "Шкода віхру", - "hud.skill.sw_spin_dmg": "Пабольшвае шкоду на {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Хуткасць віхру", - "hud.skill.sw_spin_spd": "Пабольшвае хуткасць кручэння на {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Выдатак энергіі", - "hud.skill.sw_spin_cost": "Змяншае кошт кожнага абарота на {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Колькасць абаротаў", - "hud.skill.sw_spin_spins": "Пабольшвае максімальную колькасць абаротаў{SP}", - "hud.skill.sw_interrupt_title": "Перарыванне атакі", - "hud.skill.sw_interrupt": "Дазваляе імгненна перарваць варожую атаку ўласнай{SP}", // is this true - // Axe - "hud.skill.axe_double_strike_title": "Двайны ўдар", - "hud.skill.axe_double_strike": "Крышы гэтых ліхадзеяў", - "hud.skill.axe_double_strike_combo_title": "Комба двух удараў", - "hud.skill.axe_double_strike_combo": "Адчыняе другі паслядоўны ўдар{SP}", - "hud.skill.axe_double_strike_damage_title": "Шкода двайнога ўдару", - "hud.skill.axe_double_strike_damage": "Пабольшвае прырост шкоды ад удараў запар{SP}", - "hud.skill.axe_double_strike_speed_title": "Хуткасць двайнога ўдару", - "hud.skill.axe_double_strike_speed": "Пабольшвае прырост хуткасць ад удараў запар{SP}", - "hud.skill.axe_double_strike_regen_title": "Аднаўленне энергі", - "hud.skill.axe_double_strike_regen": "Пабольшвае прырост аднаўлення энергіі ад удараў запар{SP}", - "hud.skill.axe_spin_title": "Вальс з сякерай", - "hud.skill.axe_spin": "Марамі, сівымі хмарамі дзіка круцілі...", - "hud.skill.axe_infinite_axe_spin_title": "Бясконцае кручэнне", - "hud.skill.axe_infinite_axe_spin": "Дазваляе кружыцца, пакуль ёсць энергія{SP}", - "hud.skill.axe_spin_damage_title": "Шкода", - "hud.skill.axe_spin_damage": "Пабольшвае шкоду ад кожнага абарота на {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Верталёт", - "hud.skill.axe_spin_helicopter": "Запавольвае падзенне падчас кручэння{SP}", - "hud.skill.axe_spin_speed_title": "Хуткасць кручэння", - "hud.skill.axe_spin_speed": "Пабольшвае хуткасць кручэння на {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Выдатак энергіі", - "hud.skill.axe_spin_cost": "Змяншае кошт кручэння на {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Атака ў скачку", - "hud.skill.axe_unlock_leap": "Адчыняе атаку ў скачку{SP}", - "hud.skill.axe_leap_damage_title": "Шкода ад атакі ў скачку", - "hud.skill.axe_leap_damage": "Пабольшвае шкоду атакі ў скачку на {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Адкіданне атакой у скачку", - "hud.skill.axe_leap_knockback": "Пабольшвае адкіданне атакой у скачку на {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Выдатак энергіі", - "hud.skill.axe_leap_cost": "Змяншае кошт атакі ў скачку на {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Даўжыня скачка", - "hud.skill.axe_leap_distance": "Пабольшвае даўжыню скачка на {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Горная справа", - "hud.skill.pick_strike_title": "Удар кіркою", - "hud.skill.pick_strike": "Біце жылы і друзы, каб здабыць руды і каштоўныя камяні", - "hud.skill.pick_strike_speed_title": "Хуткасць здабычы", - "hud.skill.pick_strike_speed": "Здабывайце сыравіну хутчэй{SP}", - "hud.skill.pick_strike_oregain_title": "Шчаслівы ўдар (руда)", - "hud.skill.pick_strike_oregain": "Шанец здабыць дадатковую руду (+{boost}% за ўзровень){SP}", - "hud.skill.pick_strike_gemgain_title": "Шчаслівы ўдар (камяні)", - "hud.skill.pick_strike_gemgain": "Шанец здабыць дадатковыя каштоўныя камяні (+{boost}% за ўзровень){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/hud/social.ftl b/assets/voxygen/i18n/be_BY/hud/social.ftl new file mode 100644 index 0000000000..22fd6cf621 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Іншыя гульцы +hud-social-online = У сетцы: +hud-social-friends = Сябры +hud-social-not_yet_available = Пакуль не даступны +hud-social-faction = Фракцыя +hud-social-play_online_fmt = Гульцоў у сетцы: { $nb_player } +hud-social-name = Імя +hud-social-level = Узровень +hud-social-zone = Зона +hud-social-account = Уліковы запіс \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/social.ron b/assets/voxygen/i18n/be_BY/hud/social.ron deleted file mode 100644 index 8c4edfa6ec..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.social": "Іншыя гульцы", - "hud.social.online": "У сетцы:", - "hud.social.friends": "Сябры", - "hud.social.not_yet_available": "Пакуль не даступны", - "hud.social.faction": "Фракцыя", - "hud.social.play_online_fmt": "Гульцоў у сетцы: {nb_player}", - "hud.social.name": "Імя", - "hud.social.level": "Узровень", - "hud.social.zone": "Зона", - "hud.social.account": "Уліковы запіс", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/be_BY/hud/trade.ftl b/assets/voxygen/i18n/be_BY/hud/trade.ftl new file mode 100644 index 0000000000..f1375f0d64 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Акно гандлю +hud-trade-phase1_description = + Перацягніце рэчы для продажы + ў адпаведныя вобласці. +hud-trade-phase2_description = + Прапановы зафіксаваныя, каб + даць час іх абмеркаваць. +hud-trade-phase3_description = Угода апрацоўваецца. +hud-trade-persons_offer = Прапанова ад { $playername } +hud-trade-has_accepted = + { $playername } + даў згоду +hud-trade-accept = Згадзіцца +hud-trade-decline = Адмовіцца +hud-trade-invite_sent = Прапанова гандляваць даслана { $playername }. +hud-trade-result-completed = Гандаль скончыўся паспяхоўна. +hud-trade-result-declined = Прапанова была адхіленая. +hud-trade-result-nospace = Не хапае месца ў торбах, каб скончыць ўгоду. +hud-trade-buy_price = Кошт куплі +hud-trade-sell_price = Кошт продажу +hud-trade-coin = манет +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Ваша прапанова +hud-trade-their_offer = Іх прапанова +hud-trade-amount_input = Абярыце рэч \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/hud/trade.ron b/assets/voxygen/i18n/be_BY/hud/trade.ron deleted file mode 100644 index 3cb89a8446..0000000000 --- a/assets/voxygen/i18n/be_BY/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - "hud.trade.trade_window": "Акно гандлю", - "hud.trade.phase1_description": "Перацягніце рэчы для продажы\nў адпаведныя вобласці.", - "hud.trade.phase2_description": "Прапановы зафіксаваныя, каб\nдаць час іх абмеркаваць.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Угода апрацоўваецца.", - "hud.trade.persons_offer": "Прапанова ад {playername}", - "hud.trade.has_accepted": "{playername}\nдаў згоду", - "hud.trade.accept": "Згадзіцца", - "hud.trade.decline": "Адмовіцца", - "hud.trade.invite_sent": "Прапанова гандляваць даслана {playername}.", - "hud.trade.result.completed": "Гандаль скончыўся паспяхоўна.", - "hud.trade.result.declined": "Прапанова была адхіленая.", - "hud.trade.result.nospace": "Не хапае месца ў торбах, каб скончыць ўгоду.", - "hud.trade.buy_price": "Кошт куплі", - "hud.trade.sell_price": "Кошт продажу", - "hud.trade.coin": "манет", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Ваша прапанова", - "hud.trade.their_offer": "Іх прапанова", - "hud.trade.amount_input": "Абярыце рэч", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/be_BY/main.ftl b/assets/voxygen/i18n/be_BY/main.ftl new file mode 100644 index 0000000000..009bbea039 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/main.ftl @@ -0,0 +1,95 @@ +main-username = Імя карыстальніка +main-server = Сервер +main-password = Пароль +main-connecting = Злучэнне +main-creating_world = Стварэнне свету +main-tip = Падказка: +main-unbound_key_tip = Не прызначана +main-notice = + Сардэчна запрашаем у альфа-версію Veloren! + + Звярніце ўвагу на некалькі рэчаў, перш як акунуцца ў прыгоды: + + - Гэта вельмі ранняя альфа. Чакайце багаў, няскончанага геймплею, непаліраваных механік ды беднату функцый. + + - Калі вы жадаеце пакінуць водгук ці баг-рэпорт, звяжыцеся з намі праз Reddit, GitLab ці Discord сервер нашай суполкі. + + - Veloren распаўсюджваецца пад ліцэнзіяй GPL 3. Гэта значыць, што вы вольныя гуляць, мадыфікаваць ды распаўсюджваць + гульню, як пажадаеце (пры ўмове, што вашыя мадыфікацыі таксама будуць распаўсюджвацца пад ліцэнзіяй GPL 3). + + - Veloren - гэта некамерцыйны грамадскі праект, і ўсе, хто над ім працуюць, - добраахвотнікі. + Калі вам спадабаецца гульня, мы сардэчна запрашаем вас далучыцца да каманд распрацоўшчыкаў ці мастакоў! + + Дзякуй, што прачыталі. Шчыра спадзяемся, што вам спадабаецца гульня! + + ~ Каманда Veloren +main-login_process = + Інфармацыя пра працэс ўваходу: + + Для гульні на серверах з аўтарызацыяй + неабходна мець уліковы запіс. + + Стварыць уліковы запіс можна па спасылцы: + + https://veloren.net/account/. +main-login-server_not_found = Сервер не знойдзены +main-login-authentication_error = Памылка аўтэнтыфікацыі на серверы +main-login-internal_error = Унутраная памылка кліента (хутчэй за ўсё, персанаж быў выдалены) +main-login-failed_auth_server_url_invalid = Не ўдалося злучыцца з серверам аўтэнтыфікацыі +main-login-insecure_auth_scheme = Схема аўтэнтыфікацыі HTTP не падтрымліваецца. Гэта небяспечна! Для распрацоўкі гэта дазволена для 'localhost' альбо debug-зборак. +main-login-server_full = Сервер поўны +main-login-untrusted_auth_server = Ненадзейны сервер аўтэнтыфікацыі +main-login-outdated_client_or_server = Сервер з’ехаў з глузду: магчыма, версіі кліента ды сервера несумяшчальныя. Праверце, ці ёсць абновы. +main-login-timeout = Тайм-аўт - сервер не адказаў своечасова (перагружаны, або праблемы з сеткай) +main-login-server_shut_down = Сервер быў выключаны +main-login-network_error = Памылка сеткі +main-login-network_wrong_version = Памылка: версіі кліента ды сервера несумяшчальныя. Праверце, ці ёсць абновы. +main-login-failed_sending_request = Запыт да сервера аўтэнтыфікацыі няўдалы +main-login-invalid_character = Выбраны персанаж недапушчальны +main-login-client_crashed = Кліент нечакана спыніў працу +main-login-not_on_whitelist = Для ўваходу патрэбны дазвол ад адміністрацыі. +main-login-banned = Вас заблакіравалі з наступнай прычыны: +main-login-kicked = Вас выштурхнулі з наступнай прычыны: +main-login-select_language = Выберыце мову +main-login-client_version = Версія кліента +main-login-server_version = Версія сервера +main-login-client_init_failed = Кліент не здолеў пачаць працу: { $init_fail_reason } +main-login-username_bad_characters = Імя карыстальніка змяшчае недазволеныя сімвалы! (Толькі літары, лічбы, '_' і '-' дазволеныя) +main-login-username_too_long = Імя карыстальніка занадта доўгае: сімвалаў патрэбна не больш за { $max_len } +main-servers-select_server = Выберыце сервер +main-servers-singleplayer_error = Не атрымалася злучыцца з унутраным серверам: { $sp_error } +main-servers-network_error = Памылка ў сетцы сервера ці на ўзроўні sockets: { $raw_error } +main-servers-participant_error = Удзельнік адключыўся/памылка пратакола: { $raw_error } +main-servers-stream_error = Памылка злучэння кліента/сціскання/(дэ)серыялізацыі: { $raw_error } +main-servers-database_error = Памылка базы даных сервера: { $raw_error } +main-servers-persistence_error = Памылка пастаянства сервера (нешта звязанае з данымі аб персанажы ці кантэнце): { $raw_error } +main-servers-other_error = Агульная памылка сервера: { $raw_error } +main-credits = Падзякі +main-credits-created_by = створана +main-credits-music = Музыка +main-credits-fonts = Шрыфты +main-credits-other_art = Іншыя мастацкія аспекты +main-credits-contributors = Удзельнікі +loading-tips = + .a0 = Націсніце '{ $gameinput-togglelantern }', каб запаліць свой ліхтар. + .a1 = Націсніце '{ $gameinput-help }', каб убачыць, як прызначаны клавішы па змаўчанню. + .a2 = Надрукуйце /say ці /s, каб размаўляць з гульцамі непасрэдна каля вас. + .a3 = Надрукуйце /region ці /r, каб размаўляць з гульцамі ў радыусе некалькі сотняў блокаў навокал. + .a4 = Адміністратары могуць выкарыставаць каманду /build, каб перайсці ў рэжым будаўніцтва. + .a5 = Надрукуйце /group ці /g, каб размаўляць толькі з гульцамі з вашай групы. + .a6 = Надрукуйце /tell, а потым імя гульца ды тэкст паведамлення, каб даслаць асабістае паведамленне. + .a7 = Будзьце ўважлівымі, каб знайсці ежу, куфары і іншыя рэчы, раскіданыя па ўсім свеце! + .a8 = Торба, поўная ежы? Вы можаце згатаваць лепшую ежу з таго, што ў вас ёсць! + .a9 = Не ведаеце, чым заняцца? Паспрабуйце адно з падзямелляў, адзначаных на мапе! + .a10 = Не забудзьце падстроіць налады графікі пад сваю сістэму. Націсніце '{ $gameinput-settings }', каб адчыніць акно налад. + .a11 = Гуляць з іншымі весела! Націсніце '{ $gameinput-social }', каб убачыць, хто ў сетцы. + .a12 = Націсніце '{ $gameinput-dance }', каб патанчыць. Гэй! + .a13 = Націсніце '{ $gameinput-glide }', каб разгарнуць дэльтаплан ды пакарыць нябёсы! + .a14 = Veloren пакуль у стадыі прэ-альфа. Мы імкнемся паляпшаць гульню кожны дзень! + .a15 = Калі вы жадаеце далучыцца да распрацоўкі ці проста пагутарыць з намі, зайдзіце на наш Discord сервер. + .a16 = Вы можаце змяніць тып адлюстроўвання колькасці здароўя ў наладах. + .a17 = Сядзьце каля вогнішча (націсніце клавішу '{ $gameinput-sit }'), каб павольна загаіць свае раны. + .a18 = Трэба больш торб ці лепшую браню, каб працягуць падарожжа? Націсніце '{ $gameinput-crafting }', каб адчыніць акно рамяства! + .a19 = Націсніце '{ $gameinput-roll }', каб зрабіць перакат. Перакаты дазваляюць ухіляцца ад атак ды рухацца хутчэй. + .a20 = Не ведаеце, для чаго карысны прадмет? Напішыце 'input:' у акне рамяства, каб даведацца, у якіх рэцэптах ён ужываецца. + .a21 = Знайшлі нешта выдатнае? Зрабіце здымак экрана, націснуўшы клавішу '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/main.ron b/assets/voxygen/i18n/be_BY/main.ron deleted file mode 100644 index 2abe2e48d6..0000000000 --- a/assets/voxygen/i18n/be_BY/main.ron +++ /dev/null @@ -1,115 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - /// Start Main screen section - "main.username": "Імя карыстальніка", - "main.server": "Сервер", - "main.password": "Пароль", - "main.connecting": "Злучэнне", - "main.creating_world": "Стварэнне свету", - "main.tip": "Падказка:", - "main.unbound_key_tip": "Не прызначана", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Сардэчна запрашаем у альфа-версію Veloren! - -Звярніце ўвагу на некалькі рэчаў, перш як акунуцца ў прыгоды: - -- Гэта вельмі ранняя альфа. Чакайце багаў, няскончанага геймплею, непаліраваных механік ды беднату функцый. - -- Калі вы жадаеце пакінуць водгук ці баг-рэпорт, звяжыцеся з намі праз Reddit, GitLab ці Discord сервер нашай суполкі. - -- Veloren распаўсюджваецца пад ліцэнзіяй GPL 3. Гэта значыць, што вы вольныя гуляць, мадыфікаваць ды распаўсюджваць -гульню, як пажадаеце (пры ўмове, што вашыя мадыфікацыі таксама будуць распаўсюджвацца пад ліцэнзіяй GPL 3). - -- Veloren - гэта некамерцыйны грамадскі праект, і ўсе, хто над ім працуюць, - добраахвотнікі. -Калі вам спадабаецца гульня, мы сардэчна запрашаем вас далучыцца да каманд распрацоўшчыкаў ці мастакоў! - -Дзякуй, што прачыталі. Шчыра спадзяемся, што вам спадабаецца гульня! - -~ Каманда Veloren"#, - - // Login process description - "main.login_process": r#"Інфармацыя пра працэс ўваходу: - -Для гульні на серверах з аўтарызацыяй -неабходна мець уліковы запіс. - -Стварыць уліковы запіс можна па спасылцы: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Сервер не знойдзены", - "main.login.authentication_error": "Памылка аўтэнтыфікацыі на серверы", - "main.login.internal_error": "Унутраная памылка кліента (хутчэй за ўсё, персанаж быў выдалены)", - "main.login.failed_auth_server_url_invalid": "Не ўдалося злучыцца з серверам аўтэнтыфікацыі", - "main.login.insecure_auth_scheme": "Схема аўтэнтыфікацыі HTTP не падтрымліваецца. Гэта небяспечна! Для распрацоўкі гэта дазволена для 'localhost' альбо debug-зборак.", - "main.login.server_full": "Сервер поўны", - "main.login.untrusted_auth_server": "Ненадзейны сервер аўтэнтыфікацыі", - "main.login.outdated_client_or_server": "Сервер з’ехаў з глузду: магчыма, версіі кліента ды сервера несумяшчальныя. Праверце, ці ёсць абновы.", - "main.login.timeout": "Тайм-аўт - сервер не адказаў своечасова (перагружаны, або праблемы з сеткай)", - "main.login.server_shut_down": "Сервер быў выключаны", - "main.login.network_error": "Памылка сеткі", - "main.login.network_wrong_version": "Памылка: версіі кліента ды сервера несумяшчальныя. Праверце, ці ёсць абновы.", - "main.login.failed_sending_request": "Запыт да сервера аўтэнтыфікацыі няўдалы", - "main.login.invalid_character": "Выбраны персанаж недапушчальны", - "main.login.client_crashed": "Кліент нечакана спыніў працу", - "main.login.not_on_whitelist": "Для ўваходу патрэбны дазвол ад адміністрацыі.", - "main.login.banned": "Вас заблакіравалі з наступнай прычыны:", - "main.login.kicked": "Вас выштурхнулі з наступнай прычыны: ", - "main.login.select_language": "Выберыце мову", - "main.login.client_version": "Версія кліента", - "main.login.server_version": "Версія сервера", - "main.login.client_init_failed": "Кліент не здолеў пачаць працу: {init_fail_reason}", - "main.login.username_bad_characters": "Імя карыстальніка змяшчае недазволеныя сімвалы! (Толькі літары, лічбы, '_' і '-' дазволеныя)", - "main.login.username_too_long": "Імя карыстальніка занадта доўгае: сімвалаў патрэбна не больш за {max_len}", - "main.servers.select_server": "Выберыце сервер", - "main.servers.singleplayer_error": "Не атрымалася злучыцца з унутраным серверам: {sp_error}", - "main.servers.network_error": "Памылка ў сетцы сервера ці на ўзроўні sockets: {raw_error}", - "main.servers.participant_error": "Удзельнік адключыўся/памылка пратакола: {raw_error}", - "main.servers.stream_error": "Памылка злучэння кліента/сціскання/(дэ)серыялізацыі: {raw_error}", - "main.servers.database_error": "Памылка базы даных сервера: {raw_error}", - "main.servers.persistence_error": "Памылка пастаянства сервера (нешта звязанае з данымі аб персанажы ці кантэнце): {raw_error}", - "main.servers.other_error": "Агульная памылка сервера: {raw_error}", - - // Credits screen - "main.credits": "Падзякі", - "main.credits.created_by": "створана", - "main.credits.music": "Музыка", - "main.credits.fonts": "Шрыфты", - "main.credits.other_art": "Іншыя мастацкія аспекты", - "main.credits.contributors": "Удзельнікі", - - /// End Main screen section - }, - - - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "Націсніце '{gameinput.togglelantern}', каб запаліць свой ліхтар.", - "Націсніце '{gameinput.help}', каб убачыць, як прызначаны клавішы па змаўчанню.", - "Надрукуйце /say ці /s, каб размаўляць з гульцамі непасрэдна каля вас.", - "Надрукуйце /region ці /r, каб размаўляць з гульцамі ў радыусе некалькі сотняў блокаў навокал.", - "Адміністратары могуць выкарыставаць каманду /build, каб перайсці ў рэжым будаўніцтва.", - "Надрукуйце /group ці /g, каб размаўляць толькі з гульцамі з вашай групы.", - "Надрукуйце /tell, а потым імя гульца ды тэкст паведамлення, каб даслаць асабістае паведамленне.", - "Будзьце ўважлівымі, каб знайсці ежу, куфары і іншыя рэчы, раскіданыя па ўсім свеце!", - "Торба, поўная ежы? Вы можаце згатаваць лепшую ежу з таго, што ў вас ёсць!", - "Не ведаеце, чым заняцца? Паспрабуйце адно з падзямелляў, адзначаных на мапе!", - "Не забудзьце падстроіць налады графікі пад сваю сістэму. Націсніце '{gameinput.settings}', каб адчыніць акно налад.", - "Гуляць з іншымі весела! Націсніце '{gameinput.social}', каб убачыць, хто ў сетцы.", - "Націсніце '{gameinput.dance}', каб патанчыць. Гэй!", - "Націсніце '{gameinput.glide}', каб разгарнуць дэльтаплан ды пакарыць нябёсы!", - "Veloren пакуль у стадыі прэ-альфа. Мы імкнемся паляпшаць гульню кожны дзень!", - "Калі вы жадаеце далучыцца да распрацоўкі ці проста пагутарыць з намі, зайдзіце на наш Discord сервер.", - "Вы можаце змяніць тып адлюстроўвання колькасці здароўя ў наладах.", - "Сядзьце каля вогнішча (націсніце клавішу '{gameinput.sit}'), каб павольна загаіць свае раны.", - "Трэба больш торб ці лепшую браню, каб працягуць падарожжа? Націсніце '{gameinput.crafting}', каб адчыніць акно рамяства!", - "Націсніце '{gameinput.roll}', каб зрабіць перакат. Перакаты дазваляюць ухіляцца ад атак ды рухацца хутчэй.", - "Не ведаеце, для чаго карысны прадмет? Напішыце 'input:' у акне рамяства, каб даведацца, у якіх рэцэптах ён ужываецца.", - "Знайшлі нешта выдатнае? Зрабіце здымак экрана, націснуўшы клавішу '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/be_BY/npc.ftl b/assets/voxygen/i18n/be_BY/npc.ftl new file mode 100644 index 0000000000..abdab3d926 --- /dev/null +++ b/assets/voxygen/i18n/be_BY/npc.ftl @@ -0,0 +1,210 @@ +npc-speech-villager = + .a0 = Мне вельмі падабаецца сыр. +npc-speech-villager_open = + .a0 = Цікава, пра што думае Катаблепас, калі есць траву?. + .a1 = Як ты лічыш, чаму Святлівыя рэшткі свецяцца? + .a2 = Ці ты ведаеш пра лютых Земных акул? Я чуў, што яны жывуць у пустэльнях. + .a3 = Цікава, што там па іншы бок гор... + .a4 = Я пакінуў трохі сыру ў свайго сваяка. Цяпер нават не ведаю, ці ён яшчэ існуе. Я называю яго сырам Шродзінгера. + .a5 = Ці лавілі вы калісьці светлячка? + .a6 = Кажуць, у пячорах можна знайсці ўсялякія каштоўныя камяні. + .a7 = Я не магу зразумець, адкуль прыходзяць гэтыя Саўрокі. +npc-speech-villager_adventurous = + .a0 = Спадзяюся, што аднойчы я змайструю свой уласны дэльтаплан. + .a1 = Калі стану мацнейшым, я пайду ў паход, даследаваць пячоры. +npc-speech-villager_closed = + .a0 = Хто ты гэткі? Не тутэйшы? Дзе радзіўся, дзе хрысціўся? + .a1 = Ці ты згодны, што нашая вёска найлепшая? + .a2 = Кажуць, што грыбы вельмі карысныя для здароўя. Ніколі іх не еў, шчыра кажучы. + .a3 = Быць або не быць? Думаю, буду земляробам. +npc-speech-villager_conscientious = + .a0 = Я заўсёды чымсьці заняты. Дужа шмат працы. + .a1 = Спадзяюся, хутка будзе дождж! Нашым раслінам патрэбная вільгаць. +npc-speech-villager_busybody = + .a0 = Менш размоў, больш спраў. +npc-speech-villager_unconscientious = + .a0 = Мне здаецца, час для другога сняданку! + .a1 = Эх, вось бы мая хата была прыбраная. Але ж тады б давялося яе такой падтрымліваць. Ха-ха! + .a2 = Халера, куды я яе запхнуў... +npc-speech-villager_extroverted = + .a0 = Ты не паверыш, што я рабіў на выхадных! + .a1 = Добрай табе раніцы! + .a2 = Што ты думаеш пра гэтае паветра? + .a3 = Я проста шалею ад сыру! + .a4 = Не запамятуй сухарыкі! + .a5 = Я абажаю дварфскі сыр. Эх, калі б я ўмеў яго рабіць... + .a6 = Я бачыў цудоўны сон пра сыр. Што гэта значыць? + .a7 = Я люблю мёд! І ненавіджу пчол. +npc-speech-villager_sociable = + .a0 = Запрашаем цябе! Мы як раз збіраліся паесці крыху сыру! + .a1 = Жадаеш падзівіцца на мой сад? Добра, мабыць, іншы раз. +npc-speech-villager_introverted = + .a0 = Вітаю. + .a1 = А што я? Я не вельмі цікавы. +npc-speech-villager_agreeable = + .a0 = Як твае справы? + .a1 = Кажы, калі нешта патрэбна. + .a2 = Ці ты бачыў майго ката? +npc-speech-villager_worried = + .a0 = Будзь асцярожным, добра? Навокал вельмі, вельмі небяспечна. +npc-speech-villager_disagreeable = + .a0 = Я кажу, як мае быць. Калі каму не спадабаецца, мне абыякава. + .a1 = Людзі ўсё ўспрымаюць асабіста. +npc-speech-villager_neurotic = + .a0 = Мурашкі па спіне ад адной толькі думкі пра гэтыя падзямеллі! Спадзяюся, хтосьці з імі разбярэцца. + .a1 = Хтосьці павінен вырашыць пытанне культыстаў. Пажадана, не я. + .a2 = У мяне нейкае дрэннае пачуццё. + .a3 = Вось бы хто-небудзь трымаў ваўкоў як мага далей ад вёскі. +npc-speech-villager_sad_loner = + .a0 = Я такі самотны. + .a1 = ... Прабач за няёмкае маўчанне. Я не вельмі сацыяльны. +npc-speech-villager_seeker = + .a0 = Я хачу аднойчы пабачыць свет. Павінна ж быць яшчэ нешта, акрамя гэтай вёскі. +npc-speech-villager_stable = + .a0 = Хіба ж сёння не цудоўны дзень? + .a1 = Жыццё не такое і благое. + .a2 = Выдатны дзень для шпацыру ў лесе! +npc-speech-villager_decline_trade = + .a0 = Прабач, мне нечым з табой гандляваць. + .a1 = Гандаль? Нібы ў мяне ёсць нешта цікавае. + .a2 = Мая хата - мая, і я яе ні за якія грошы не аддам. +npc-speech-merchant_advertisement = + .a0 = Ці жадаеце пагандляваць? + .a1 = Жадаеце пагандляваць са мною? + .a2 = У мяне шмат тавараў. Хочаш зірнуць? +npc-speech-merchant_busy = + .a0 = Пачакайце, калі ласка, у мяне не дваццаць рук. + .a1 = Адзін момант, дайце мне скончыць. + .a2 = Я зараз заняты. Падыдзіце да мяне пазней. +npc-speech-merchant_busy_rude = + .a0 = Чакай сваю чаргу. + .a1 = Ты бачыш пакупніка перад сабой, ці не? + .a2 = Не спрабуй прапхнуць сябе наперад. +npc-speech-merchant_trade_successful = + .a0 = Дзякуй, што абралі мяне! + .a1 = Вялікі дзякуй! +npc-speech-merchant_trade_declined = + .a0 = Мабыць, у іншы раз. Усяго найлепшага! + .a1 = Які жаль! Прыйдзем да згоды ў наступны раз. +npc-speech-villager_cultist_alarm = + .a0 = Гэй! Тут культыст на волі! + .a1 = Бярыце зброю! Культысты нападаюць! + .a2 = Як гэтыя культысты пасмелі атакаваць нашую вёску! + .a3 = Жыве Веларэн! Смерць культыстам! + .a4 = Тут не церпяць культыстаў! + .a5 = Крывавы культыст! + .a6 = Паспрабуй ляза майго клінка, брудны культыст! + .a7 = Ты не адмыеш кроў са сваіх рук, культыст! + .a8 = Мільёны малых мармуравых малпаў! Культыст сярод нас! + .a9 = Злачынствы гэтага культыста вельмі хутка скончацца! + .a10 = Гэты культыст - мой! + .a11 = Рыхтуйся сустрэцца з Богам, брыдкі культыст! + .a12 = Культыст! Хапай яго! + .a13 = Культыст! Бі яго! + .a14 = Культыст! Не дайце яму ўцячы! + .a15 = Ці жадае шаноўны культыст ЗДОХНУЦЬ?! + .a16 = Ніколі не прабачым! Ніколі не забудзем! Культыст, надышоў час расплаты! + .a17 = Памры, культыст! + .a18 = Ваш тэрор скончыцца! + .a19 = Вось вам за ўсё, што вы ўчынілі! + .a20 = Мы не сустракаем з пяшчотай такіх, як вы. + .a21 = Не трэба было вылазіць са сваіх падзямелляў! +npc-speech-villager_under_attack = + .a0 = Дапамажыце! Мяне б’юць! + .a1 = Дапамажыце! Мяне б’юць! Дапамажыце! + .a2 = Ай! Мяне б’юць! + .a3 = Ай! Мяне б’юць! Дапамажыце! + .a4 = Выратуйце! Мяне б’юць! + .a5 = Забіваюць! Ратуйце! + .a6 = Мяне збіваюць! Дапамажыце! + .a7 = Дапамажыце! + .a8 = Выратуйце, дапамажыце! + .a9 = Калі ласка, калі ласка, дапамажыце! + .a10 = На мяне напалі! + .a11 = АААААЙ! Мяне забіваюць! + .a12 = АААААЙ! Мяне забіваюць! Дапамажыце! + .a13 = Ратуйце! Нас забіваюць! + .a14 = Ратуйце! Забойца! + .a15 = Дапамажыце! Тут забойца на волі! + .a16 = Ратуйце! Яны спрабуюць забіць мяне! + .a17 = Варта, мяне б’юць! + .a18 = Варта! Мяне забіваюць! + .a19 = На мяне напалі! Варта! + .a20 = Ратуйце! Варта! Мяне б’юць! + .a21 = Варта! Хутчэй сюды! + .a22 = Варта! Варта! + .a23 = Варта! Мяне б’е злачынец! + .a24 = Варта, забейце гэтага мярзотніка! + .a25 = Варта! Тут забойца! + .a26 = Варта! Дапамажыце мне! + .a27 = Гэта табе не сыйдзе з рук! Варта! + .a28 = Ты, д’ябал! + .a29 = Дапамажыце! + .a30 = Дапамажыце, калі ласка! + .a31 = Ай! Варта! Дапамажыце! + .a32 = Яны ідуць па мяне! + .a33 = Дапамажыце! Дапамажыце! Мяне прыгнятаюць! + .a34 = Ну вось і бачны гвалт, уласцівы сістэме. + .a35 = Гэта толькі драпіна! + .a36 = Скончвай гэта! + .a37 = Што я табе зрабіў?! + .a38 = Калі ласка, не бі мяне! + .a39 = Гэй! Сачы за тым, куды накіроўваеш сваю зброю! + .a40 = Халера на цябе, знікні! + .a41 = Спыні гэта і знікні! + .a42 = Ты мяне вельмі злуеш! + .a43 = Паглядзі на яго! Ты кім сябе ўявіў?! + .a44 = Я здыму галаву з тваіх плячэй! + .a45 = Калі ласка, не трэба! У мяне нічога няма! + .a46 = Я нацкую свайго брата на цябе, ён большы за мяне! + .a47 = Не-е-е! Я распавяду маці! + .a48 = Каб ты сраў пад плотам калючым дротам! + .a49 = Калі ласка, не трэба гэтага рабіць. + .a50 = Гэта не вельмі добразычліва! + .a51 = Твая зброя адметная, цяпер, калі ласка, схавай яе! + .a52 = Злітуйся нада мной! + .a53 = Калі ласка, у мяне ёсць сям’я! + .a54 = Я яшчэ такі малады! + .a55 = Можна мы гэта мірна абмяркуем? + .a56 = Гвалт - гэта ніколі не адказ! + .a57 = Здаецца, сёння будзе дрэнны дзень... + .a58 = Гэй, балюча! + .a59 = Божа! + .a60 = Якое нахабства! + .a61 = Досыць, я цябе прашу! + .a62 = Халера на цябе! + .a63 = Гэта не смешна. + .a64 = Як ты смееш?! + .a65 = Ты за гэта паплоцішся! + .a66 = Ты вельмі пашкадуеш, калі працягнеш гэта! + .a67 = Не прымушай мяне рабіць табе балюча! + .a68 = Гэта нейкае непаразуменне! + .a69 = Табе не трэба гэтага рабіць! + .a70 = Знікні, чорт! + .a71 = Гэта было дужа балюча! + .a72 = Навошта ты гэта зрабіў? + .a73 = Дзеля духаў, хопіць! + .a74 = Ты, мусіць, мяне з кімсьці пераблытаў! + .a75 = Я гэтага не заслугоўваю! + .a76 = Калі ласка, не паўтарай гэтага больш. + .a77 = Варта, кіньце гэту пачвару ў балота! + .a78 = Я спушчу на цябе свайго цмока! + .a79 = Чаму мяне-е-е? +npc-speech-villager_enemy_killed = + .a0 = Больш ты мяне не будзеш турбаваць! + .a1 = Нарэшце заслужаны спакой! + .a2 = ... так, на чым я спыніўся? +npc-speech-menacing = + .a0 = Я цябе папярэджваю! + .a1 = Яшчэ крок, і я табе пакажу! + .a2 = Ты мяне не пужаеш! + .a3 = Кінь дурное, сыдзі адсюль! + .a4 = Вярніся дадому, калі хочаш жыць! + .a5 = Ты тут не пажаданы! +npc-speech-cultist_low_health_fleeing = + .a0 = Адступаем ва імя нашай справы! + .a1 = Адступаем! + .a2 = Халера на ўсіх вас! + .a3 = Я цябе пракляну ў тагасветным жыцці! + .a4 = Мне трэба перадыхнуць! + .a5 = Яны занадта дужыя! \ No newline at end of file diff --git a/assets/voxygen/i18n/be_BY/npc.ron b/assets/voxygen/i18n/be_BY/npc.ron deleted file mode 100644 index d958eafe96..0000000000 --- a/assets/voxygen/i18n/be_BY/npc.ron +++ /dev/null @@ -1,248 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Мне вельмі падабаецца сыр.", - ], - "npc.speech.villager_open": [ - "Цікава, пра што думае Катаблепас, калі есць траву?.", - "Як ты лічыш, чаму Святлівыя рэшткі свецяцца?", - "Ці ты ведаеш пра лютых Земных акул? Я чуў, што яны жывуць у пустэльнях.", - "Цікава, што там па іншы бок гор...", - "Я пакінуў трохі сыру ў свайго сваяка. Цяпер нават не ведаю, ці ён яшчэ існуе. Я называю яго сырам Шродзінгера.", - "Ці лавілі вы калісьці светлячка?", - "Кажуць, у пячорах можна знайсці ўсялякія каштоўныя камяні.", - "Я не магу зразумець, адкуль прыходзяць гэтыя Саўрокі.", - ], - "npc.speech.villager_adventurous": [ - "Спадзяюся, што аднойчы я змайструю свой уласны дэльтаплан.", - "Калі стану мацнейшым, я пайду ў паход, даследаваць пячоры.", - ], - "npc.speech.villager_closed": [ - "Хто ты гэткі? Не тутэйшы? Дзе радзіўся, дзе хрысціўся?", - "Ці ты згодны, што нашая вёска найлепшая?", - "Кажуць, што грыбы вельмі карысныя для здароўя. Ніколі іх не еў, шчыра кажучы.", - "Быць або не быць? Думаю, буду земляробам.", - ], - "npc.speech.villager_conscientious": [ - "Я заўсёды чымсьці заняты. Дужа шмат працы.", - "Спадзяюся, хутка будзе дождж! Нашым раслінам патрэбная вільгаць.", - ], - "npc.speech.villager_busybody": [ - "Менш размоў, больш спраў.", - ], - "npc.speech.villager_unconscientious": [ - "Мне здаецца, час для другога сняданку!", - "Эх, вось бы мая хата была прыбраная. Але ж тады б давялося яе такой падтрымліваць. Ха-ха!", - "Халера, куды я яе запхнуў...", - ], - "npc.speech.villager_extroverted": [ - "Ты не паверыш, што я рабіў на выхадных!", - "Добрай табе раніцы!", - "Што ты думаеш пра гэтае паветра?", - "Я проста шалею ад сыру!", - "Не запамятуй сухарыкі!", - "Я абажаю дварфскі сыр. Эх, калі б я ўмеў яго рабіць...", - "Я бачыў цудоўны сон пра сыр. Што гэта значыць?", - "Я люблю мёд! І ненавіджу пчол.", - ], - "npc.speech.villager_sociable": [ - "Запрашаем цябе! Мы як раз збіраліся паесці крыху сыру!", - "Жадаеш падзівіцца на мой сад? Добра, мабыць, іншы раз.", - ], - "npc.speech.villager_introverted": [ - "Вітаю.", - "А што я? Я не вельмі цікавы.", - ], - "npc.speech.villager_agreeable": [ - "Як твае справы?", - "Кажы, калі нешта патрэбна.", - "Ці ты бачыў майго ката?", - ], - "npc.speech.villager_worried": [ - "Будзь асцярожным, добра? Навокал вельмі, вельмі небяспечна.", - ], - "npc.speech.villager_disagreeable": [ - "Я кажу, як мае быць. Калі каму не спадабаецца, мне абыякава.", - "Людзі ўсё ўспрымаюць асабіста.", - ], - "npc.speech.villager_neurotic": [ - "Мурашкі па спіне ад адной толькі думкі пра гэтыя падзямеллі! Спадзяюся, хтосьці з імі разбярэцца.", - "Хтосьці павінен вырашыць пытанне культыстаў. Пажадана, не я.", - "У мяне нейкае дрэннае пачуццё.", - "Вось бы хто-небудзь трымаў ваўкоў як мага далей ад вёскі.", - ], - "npc.speech.villager_sad_loner": [ - "Я такі самотны.", - "... Прабач за няёмкае маўчанне. Я не вельмі сацыяльны.", - ], - "npc.speech.villager_seeker": [ - "Я хачу аднойчы пабачыць свет. Павінна ж быць яшчэ нешта, акрамя гэтай вёскі.", - ], - "npc.speech.villager_stable": [ - "Хіба ж сёння не цудоўны дзень?", - "Жыццё не такое і благое.", - "Выдатны дзень для шпацыру ў лесе!", - ], - "npc.speech.villager_decline_trade": [ - "Прабач, мне нечым з табой гандляваць.", - "Гандаль? Нібы ў мяне ёсць нешта цікавае.", - "Мая хата - мая, і я яе ні за якія грошы не аддам.", - ], - "npc.speech.merchant_advertisement": [ - "Ці жадаеце пагандляваць?", - "Жадаеце пагандляваць са мною?", - "У мяне шмат тавараў. Хочаш зірнуць?" - ], - "npc.speech.merchant_busy": [ - "Пачакайце, калі ласка, у мяне не дваццаць рук.", - "Адзін момант, дайце мне скончыць.", - "Я зараз заняты. Падыдзіце да мяне пазней." - ], - "npc.speech.merchant_busy_rude": [ - "Чакай сваю чаргу.", - "Ты бачыш пакупніка перад сабой, ці не?", - "Не спрабуй прапхнуць сябе наперад.", - ], - "npc.speech.merchant_trade_successful": [ - "Дзякуй, што абралі мяне!", - "Вялікі дзякуй!", - ], - "npc.speech.merchant_trade_declined": [ - "Мабыць, у іншы раз. Усяго найлепшага!", - "Які жаль! Прыйдзем да згоды ў наступны раз." - ], - "npc.speech.villager_cultist_alarm": [ - "Гэй! Тут культыст на волі!", - "Бярыце зброю! Культысты нападаюць!", - "Як гэтыя культысты пасмелі атакаваць нашую вёску!", - "Жыве Веларэн! Смерць культыстам!", - "Тут не церпяць культыстаў!", - "Крывавы культыст!", - "Паспрабуй ляза майго клінка, брудны культыст!", - "Ты не адмыеш кроў са сваіх рук, культыст!", - "Мільёны малых мармуравых малпаў! Культыст сярод нас!", - "Злачынствы гэтага культыста вельмі хутка скончацца!", - "Гэты культыст - мой!", - "Рыхтуйся сустрэцца з Богам, брыдкі культыст!", - "Культыст! Хапай яго!", - "Культыст! Бі яго!", - "Культыст! Не дайце яму ўцячы!", - "Ці жадае шаноўны культыст ЗДОХНУЦЬ?!", - "Ніколі не прабачым! Ніколі не забудзем! Культыст, надышоў час расплаты!", - "Памры, культыст!", - "Ваш тэрор скончыцца!", - "Вось вам за ўсё, што вы ўчынілі!", - "Мы не сустракаем з пяшчотай такіх, як вы.", - "Не трэба было вылазіць са сваіх падзямелляў!", - ], - "npc.speech.villager_under_attack": [ - "Дапамажыце! Мяне б’юць!", - "Дапамажыце! Мяне б’юць! Дапамажыце!", - "Ай! Мяне б’юць!", - "Ай! Мяне б’юць! Дапамажыце!", - "Выратуйце! Мяне б’юць!", - "Забіваюць! Ратуйце!", - "Мяне збіваюць! Дапамажыце!", - "Дапамажыце!", - "Выратуйце, дапамажыце!", - "Калі ласка, калі ласка, дапамажыце!", - "На мяне напалі!", - "АААААЙ! Мяне забіваюць!", - "АААААЙ! Мяне забіваюць! Дапамажыце!", - "Ратуйце! Нас забіваюць!", - "Ратуйце! Забойца!", - "Дапамажыце! Тут забойца на волі!", - "Ратуйце! Яны спрабуюць забіць мяне!", - "Варта, мяне б’юць!", - "Варта! Мяне забіваюць!", - "На мяне напалі! Варта!", - "Ратуйце! Варта! Мяне б’юць!", - "Варта! Хутчэй сюды!", - "Варта! Варта!", - "Варта! Мяне б’е злачынец!", - "Варта, забейце гэтага мярзотніка!", - "Варта! Тут забойца!", - "Варта! Дапамажыце мне!", - "Гэта табе не сыйдзе з рук! Варта!", - "Ты, д’ябал!", - "Дапамажыце!", - "Дапамажыце, калі ласка!", - "Ай! Варта! Дапамажыце!", - "Яны ідуць па мяне!", - "Дапамажыце! Дапамажыце! Мяне прыгнятаюць!", - "Ну вось і бачны гвалт, уласцівы сістэме.", - "Гэта толькі драпіна!", - "Скончвай гэта!", - "Што я табе зрабіў?!", - "Калі ласка, не бі мяне!", - "Гэй! Сачы за тым, куды накіроўваеш сваю зброю!", - "Халера на цябе, знікні!", - "Спыні гэта і знікні!", - "Ты мяне вельмі злуеш!", - "Паглядзі на яго! Ты кім сябе ўявіў?!", - "Я здыму галаву з тваіх плячэй!", - "Калі ласка, не трэба! У мяне нічога няма!", - "Я нацкую свайго брата на цябе, ён большы за мяне!", - "Не-е-е! Я распавяду маці!", - "Каб ты сраў пад плотам калючым дротам!", - "Калі ласка, не трэба гэтага рабіць.", - "Гэта не вельмі добразычліва!", - "Твая зброя адметная, цяпер, калі ласка, схавай яе!", - "Злітуйся нада мной!", - "Калі ласка, у мяне ёсць сям’я!", - "Я яшчэ такі малады!", - "Можна мы гэта мірна абмяркуем?", - "Гвалт - гэта ніколі не адказ!", - "Здаецца, сёння будзе дрэнны дзень...", - "Гэй, балюча!", - "Божа!", - "Якое нахабства!", - "Досыць, я цябе прашу!", - "Халера на цябе!", - "Гэта не смешна.", - "Як ты смееш?!", - "Ты за гэта паплоцішся!", - "Ты вельмі пашкадуеш, калі працягнеш гэта!", - "Не прымушай мяне рабіць табе балюча!", - "Гэта нейкае непаразуменне!", - "Табе не трэба гэтага рабіць!", - "Знікні, чорт!", - "Гэта было дужа балюча!", - "Навошта ты гэта зрабіў?", - "Дзеля духаў, хопіць!", - "Ты, мусіць, мяне з кімсьці пераблытаў!", - "Я гэтага не заслугоўваю!", - "Калі ласка, не паўтарай гэтага больш.", - "Варта, кіньце гэту пачвару ў балота!", - "Я спушчу на цябе свайго цмока!", - "Чаму мяне-е-е?", - ], - "npc.speech.villager_enemy_killed": [ - "Больш ты мяне не будзеш турбаваць!", - "Нарэшце заслужаны спакой!", - "... так, на чым я спыніўся?", - ], - "npc.speech.menacing": [ - "Я цябе папярэджваю!", - "Яшчэ крок, і я табе пакажу!", - "Ты мяне не пужаеш!", - "Кінь дурное, сыдзі адсюль!", - "Вярніся дадому, калі хочаш жыць!", - "Ты тут не пажаданы!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Адступаем ва імя нашай справы!", - "Адступаем!", - "Халера на ўсіх вас!", - "Я цябе пракляну ў тагасветным жыцці!", - "Мне трэба перадыхнуць!", - "Яны занадта дужыя!", - ] - } -) diff --git a/assets/voxygen/i18n/be_BY/template.ftl b/assets/voxygen/i18n/be_BY/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/be_BY/template.ron b/assets/voxygen/i18n/be_BY/template.ron deleted file mode 100644 index 4a24393e43..0000000000 --- a/assets/voxygen/i18n/be_BY/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Belarusian -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/buff.ftl b/assets/voxygen/i18n/ca_CA/buff.ftl new file mode 100644 index 0000000000..b9ce5e7905 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Clica per eliminar +buff-title-missing = Sense Títol +buff-desc-missing = Sense Descripció +buff-title-heal = Sanació +buff-desc-heal = Restableix Salut durant un temps. +buff-title-potion = Poció +buff-desc-potion = Bevent... +buff-title-saturation = Saturació +buff-desc-saturation = Restableix Salut durant un temps pels consumibles. +buff-title-campfire_heal = Curació per Foguera +buff-desc-campfire_heal = Descansar prop d'una foguera cura un { $rate }% per segon. +buff-title-invulnerability = Invulnerabilitat +buff-desc-invulnerability = No pots ser ferit per cap atac. +buff-title-protectingward = Custòdia protectora +buff-desc-protectingward = D'alguna manera, estàs sent protegit dels atacs. +buff-title-frenzied = Frenesí +buff-desc-frenzied = Posseeixes una velocitat sobrenatural i pots ignorar ferides menors. +buff-title-hastened = Pressa +buff-desc-hastened = Els teus moviments i atacs són més ràpids. +buff-title-bleed = Sagnant +buff-desc-bleed = Infligeix dany regularment. +buff-title-cursed = Maleït +buff-desc-cursed = Estàs maleït. +buff-title-burn = En Flames +buff-desc-burn = Et cremes viu +buff-title-crippled = Mutilat +buff-desc-crippled = Els teus moviments són força ineficients perquè les teves cames estan greument danyades. +buff-title-frozen = Congelat +buff-desc-frozen = Els teus moviments i atacs s'alenteixen. +buff-title-wet = Mullat +buff-desc-wet = El sol rellisca, fent que parar sigui difícil. +buff-title-ensnared = Atrapat +buff-desc-ensnared = Plantes s'emboliquen a les teves cames, impedint els teus moviments. +buff-stat-health = Restaura { $str_total } Salut +buff-stat-increase_max_energy = Augmenta l'Energia màxima en { $strength } +buff-stat-increase_max_health = Augmenta la Salut màxima en { $strength } +buff-stat-invulnerability = Concedeix invulnerabilitat +buff-text-over_seconds = al llarg de { $dur_secs } segons +buff-text-for_seconds = durant { $dur_secs } segons \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/buff.ron b/assets/voxygen/i18n/ca_CA/buff.ron deleted file mode 100644 index 606e6cbab0..0000000000 --- a/assets/voxygen/i18n/ca_CA/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - // Buffs - "buff.remove": "Clica per eliminar", - "buff.title.missing": "Sense Títol", - "buff.desc.missing": "Sense Descripció", - "buff.title.heal": "Sanació", - "buff.desc.heal": "Restableix Salut durant un temps.", - "buff.title.potion": "Poció", - "buff.desc.potion": "Bevent...", - "buff.title.saturation": "Saturació", - "buff.desc.saturation": "Restableix Salut durant un temps pels consumibles.", - "buff.title.campfire_heal": "Curació per Foguera", - "buff.desc.campfire_heal": "Descansar prop d'una foguera cura un {rate}% per segon.", - "buff.title.invulnerability": "Invulnerabilitat", - "buff.desc.invulnerability": "No pots ser ferit per cap atac.", - "buff.title.protectingward": "Custòdia protectora", - "buff.desc.protectingward": "D'alguna manera, estàs sent protegit dels atacs.", - "buff.title.frenzied": "Frenesí", - "buff.desc.frenzied": "Posseeixes una velocitat sobrenatural i pots ignorar ferides menors.", - "buff.title.hastened": "Pressa", - "buff.desc.hastened": "Els teus moviments i atacs són més ràpids.", - // Debuffs - "buff.title.bleed": "Sagnant", - "buff.desc.bleed": "Infligeix dany regularment.", - "buff.title.cursed": "Maleït", - "buff.desc.cursed": "Estàs maleït.", - "buff.title.burn": "En Flames", - "buff.desc.burn": "Et cremes viu", - "buff.title.crippled": "Mutilat", - "buff.desc.crippled": "Els teus moviments són força ineficients perquè les teves cames estan greument danyades.", - "buff.title.frozen": "Congelat", - "buff.desc.frozen": "Els teus moviments i atacs s'alenteixen.", - "buff.title.wet": "Mullat", - "buff.desc.wet": "El sol rellisca, fent que parar sigui difícil.", - "buff.title.ensnared": "Atrapat", - "buff.desc.ensnared": "Plantes s'emboliquen a les teves cames, impedint els teus moviments.", - // Buffs stats - "buff.stat.health": "Restaura {str_total} Salut", - "buff.stat.increase_max_energy": "Augmenta l'Energia màxima en {strength}", - "buff.stat.increase_max_health": "Augmenta la Salut màxima en {strength}", - "buff.stat.invulnerability": "Concedeix invulnerabilitat", - // Text - "buff.text.over_seconds": "al llarg de {dur_secs} segons", - "buff.text.for_seconds": "durant {dur_secs} segons", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/char_selection.ftl b/assets/voxygen/i18n/ca_CA/char_selection.ftl new file mode 100644 index 0000000000..0b5164110b --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Carregant personatges... +char_selection-delete_permanently = Esborrar permanentment aquest Personatge? +char_selection-deleting_character = Esborrant Personatge... +char_selection-change_server = Canviar Servidor +char_selection-enter_world = Entrar al Món +char_selection-logout = Tancar Sessió +char_selection-create_new_character = Crear Nou Personatge +char_selection-creating_character = Creant Personatge... +char_selection-character_creation = Creador de Personatge +char_selection-human_default = Humà per defecte +char_selection-level_fmt = Nivell { $level_nb } +char_selection-uncanny_valley = Terra Salvatge +char_selection-plains_of_uncertainty = Planes de la Incertesa +char_selection-beard = Barba +char_selection-hair_style = Pentinat +char_selection-hair_color = Color de Pèl +char_selection-eye_color = Color d'Ulls +char_selection-skin = Pell +char_selection-eyeshape = Detalls dels Ulls +char_selection-accessories = Accessoris +char_selection-create_info_name = El teu Personatge necessita un nom! +char_selection-version_mismatch = ATENCIÓ! Aquest servidor corre una versió diferent del joc que potser és incompatible. Si us plau, actualitzeu el joc. \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/char_selection.ron b/assets/voxygen/i18n/ca_CA/char_selection.ron deleted file mode 100644 index 5752a7bd20..0000000000 --- a/assets/voxygen/i18n/ca_CA/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "char_selection.loading_characters": "Carregant personatges...", - "char_selection.delete_permanently": "Esborrar permanentment aquest Personatge?", - "char_selection.deleting_character": "Esborrant Personatge...", - "char_selection.change_server": "Canviar Servidor", - "char_selection.enter_world": "Entrar al Món", - "char_selection.logout": "Tancar Sessió", - "char_selection.create_new_character": "Crear Nou Personatge", - "char_selection.creating_character": "Creant Personatge...", - "char_selection.character_creation": "Creador de Personatge", - "char_selection.human_default": "Humà per defecte", - "char_selection.level_fmt": "Nivell {level_nb}", - "char_selection.uncanny_valley": "Terra Salvatge", - "char_selection.plains_of_uncertainty": "Planes de la Incertesa", - "char_selection.beard": "Barba", - "char_selection.hair_style": "Pentinat", - "char_selection.hair_color": "Color de Pèl", - "char_selection.eye_color": "Color d'Ulls", - "char_selection.skin": "Pell", - "char_selection.eyeshape": "Detalls dels Ulls", - "char_selection.accessories": "Accessoris", - "char_selection.create_info_name": "El teu Personatge necessita un nom!", - "char_selection.version_mismatch": "ATENCIÓ! Aquest servidor corre una versió diferent del joc que potser és incompatible. Si us plau, actualitzeu el joc.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/common.ftl b/assets/voxygen/i18n/ca_CA/common.ftl new file mode 100644 index 0000000000..1dd7062a52 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/common.ftl @@ -0,0 +1,104 @@ +common-username = usuari +common-singleplayer = Un jugador +common-multiplayer = Multijugador +common-servers = Servidors +common-quit = Sortir +common-settings = Ajustos +common-languages = Idiomes +common-interface = Interfície +common-gameplay = Jugabilitat +common-controls = Controls +common-video = Gràfics +common-sound = So +common-chat = Xat +common-resume = Reprendre +common-characters = Personatges +common-close = Tancar +common-yes = Sí +common-no = No +common-back = Enrere +common-create = Crear +common-okay = D'acord +common-add = Afegir +common-accept = Acceptar +common-decline = Refusar +common-disclaimer = Atenció +common-cancel = Cancel·lar +common-none = Cap +common-error = Error +common-fatal_error = Error Fatal +common-you = Tu +common-automatic = Auto +common-random = Aleatori +common-empty = Buit +common-confirm = Confirmar +common-delete_server = Esborrar Servidor +common-interface_settings = Ajustos de la Interfície +common-gameplay_settings = Ajustos de Jugabilitat +common-controls_settings = Ajustos de Control +common-video_settings = Ajustos Gràfics +common-sound_settings = Ajustos Sonors +common-language_settings = Ajustos d'Idioma +common-chat_settings = Ajustos del Xat +common-connection_lost = + Connexió Perduda! + S'ha reiniciat el servidor? + Està el client actualitzat? +common-species-orc = Orc +common-species-human = Humà +common-species-dwarf = Nan +common-species-elf = Elf +common-species-draugr = No-mort +common-species-danari = Danari +common-weapons-axe = Destral +common-weapons-dagger = Daga +common-weapons-greatsword = Bran +common-weapons-shortswords = Espases Curtes +common-weapons-sword = Espasa +common-weapons-staff = Bastó del Foc +common-weapons-bow = Arc +common-weapons-hammer = Martell +common-weapons-general = Combat +common-weapons-sceptre = Ceptre Sanador +common-weapons-shield = Escut +common-weapons-spear = Llança +common-weapons-hammer_simple = Martell Senzill +common-weapons-sword_simple = Espasa Senzilla +common-weapons-staff_simple = Bastó Senzill +common-weapons-axe_simple = Destral Senzilla +common-weapons-bow_simple = Arc Senzill +common-weapons-unique = Únic +common-tool-debug = Depuració +common-tool-farming = Ferramenta de Cultiu +common-tool-pick = Pic +common-tool-mining = Minar +common-kind-modular_component = Component Modular +common-kind-glider = Planador +common-kind-consumable = Consumible +common-kind-throwable = Llençable +common-kind-utility = Utilitat +common-kind-ingredient = Ingredient +common-kind-lantern = Llanterna +common-hands-one = Una Mà +common-hands-two = Dues Mans +common-rand_appearance = Aparença Aleatòria +common-rand_name = Nom Aleatori +common-stats-combat_rating = PC +common-stats-power = Potència +common-stats-speed = Velocitat +common-stats-poise = Estabilitat +common-stats-crit_chance = Probabilitat de Crític +common-stats-crit_mult = Multiplicador de Crític +common-stats-armor = Armadura +common-stats-poise_res = Resistència a l'Atordiment +common-stats-energy_max = Energia Màxima +common-stats-energy_reward = Recompensa d'Energia +common-stats-crit_power = Potència Crítica +common-stats-stealth = Sigil +common-stats-slots = Ranura +common-material-metal = Metall +common-material-wood = Fusta +common-material-stone = Pedra +common-material-cloth = Tela +common-material-hide = Pell +common-sprite-chest = Cofre \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/common.ron b/assets/voxygen/i18n/ca_CA/common.ron deleted file mode 100644 index 4dfae867b1..0000000000 --- a/assets/voxygen/i18n/ca_CA/common.ron +++ /dev/null @@ -1,126 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "usuari", - "common.singleplayer": "Un jugador", - "common.multiplayer": "Multijugador", - "common.servers": "Servidors", - "common.quit": "Sortir", - "common.settings": "Ajustos", - "common.languages": "Idiomes", - "common.interface": "Interfície", - "common.gameplay": "Jugabilitat", - "common.controls": "Controls", - "common.video": "Gràfics", - "common.sound": "So", - "common.chat": "Xat", - "common.resume": "Reprendre", - "common.characters": "Personatges", - "common.close": "Tancar", - "common.yes": "Sí", - "common.no": "No", - "common.back": "Enrere", - "common.create": "Crear", - "common.okay": "D'acord", - "common.add": "Afegir", - "common.accept": "Acceptar", - "common.decline": "Refusar", - "common.disclaimer": "Atenció", - "common.cancel": "Cancel·lar", - "common.none": "Cap", - "common.error": "Error", - "common.fatal_error": "Error Fatal", - "common.you": "Tu", - "common.automatic": "Auto", - "common.random": "Aleatori", - "common.empty": "Buit", - "common.confirm": "Confirmar", - "common.delete_server": "Esborrar Servidor", - - // Settings Window title - "common.interface_settings": "Ajustos de la Interfície", - "common.gameplay_settings": "Ajustos de Jugabilitat", - "common.controls_settings": "Ajustos de Control", - "common.video_settings": "Ajustos Gràfics", - "common.sound_settings": "Ajustos Sonors", - "common.language_settings": "Ajustos d'Idioma", - "common.chat_settings": "Ajustos del Xat", - - // Message when connection to the server is lost - "common.connection_lost": r#"Connexió Perduda! -S'ha reiniciat el servidor? -Està el client actualitzat?"#, - - - "common.species.orc": "Orc", - "common.species.human": "Humà", - "common.species.dwarf": "Nan", - "common.species.elf": "Elf", - "common.species.draugr": "No-mort", - "common.species.danari": "Danari", - - "common.weapons.axe": "Destral", - "common.weapons.dagger": "Daga", - "common.weapons.greatsword": "Bran", - "common.weapons.shortswords": "Espases Curtes", - "common.weapons.sword": "Espasa", - "common.weapons.staff": "Bastó del Foc", - "common.weapons.bow": "Arc", - "common.weapons.hammer": "Martell", - "common.weapons.general": "Combat", - "common.weapons.sceptre": "Ceptre Sanador", - "common.weapons.shield": "Escut", - "common.weapons.spear": "Llança", - "common.weapons.hammer_simple": "Martell Senzill", - "common.weapons.sword_simple": "Espasa Senzilla", - "common.weapons.staff_simple": "Bastó Senzill", - "common.weapons.axe_simple": "Destral Senzilla", - "common.weapons.bow_simple": "Arc Senzill", - "common.weapons.unique": "Únic", - "common.tool.debug": "Depuració", - "common.tool.farming": "Ferramenta de Cultiu", - "common.tool.pick": "Pic", - "common.tool.mining": "Minar", - "common.kind.modular_component": "Component Modular", - "common.kind.glider": "Planador", - "common.kind.consumable": "Consumible", - "common.kind.throwable": "Llençable", - "common.kind.utility": "Utilitat", - "common.kind.ingredient": "Ingredient", - "common.kind.lantern": "Llanterna", - "common.hands.one": "Una Mà", - "common.hands.two": "Dues Mans", - - "common.rand_appearance": "Aparença Aleatòria", - "common.rand_name": "Nom Aleatori", - - "common.stats.combat_rating": "PC", - "common.stats.power": "Potència", - "common.stats.speed": "Velocitat", - "common.stats.poise": "Estabilitat", - "common.stats.crit_chance": "Probabilitat de Crític", - "common.stats.crit_mult": "Multiplicador de Crític", - "common.stats.armor": "Armadura", - "common.stats.poise_res":"Resistència a l'Atordiment", - "common.stats.energy_max": "Energia Màxima", - "common.stats.energy_reward": "Recompensa d'Energia", - "common.stats.crit_power": "Potència Crítica", - "common.stats.stealth": "Sigil", - "common.stats.slots": "Ranura", - - "common.material.metal": "Metall", - "common.material.wood": "Fusta", - "common.material.stone": "Pedra", - "common.material.cloth": "Tela", - "common.material.hide": "Pell", - - "common.sprite.chest": "Cofre", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/esc_menu.ftl b/assets/voxygen/i18n/ca_CA/esc_menu.ftl new file mode 100644 index 0000000000..eaa0da7e40 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Tancar Sessió +esc_menu-quit_game = Sortir del Joc \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/esc_menu.ron b/assets/voxygen/i18n/ca_CA/esc_menu.ron deleted file mode 100644 index 98120016e4..0000000000 --- a/assets/voxygen/i18n/ca_CA/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "esc_menu.logout": "Tancar Sessió", - "esc_menu.quit_game": "Sortir del Joc", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/gameinput.ftl b/assets/voxygen/i18n/ca_CA/gameinput.ftl new file mode 100644 index 0000000000..4edb22c266 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Atac Bàsic +gameinput-secondary = Atac Secundari +gameinput-block = Bloquejar +gameinput-slot1 = Tecla Ràpida 1 +gameinput-slot2 = Tecla Ràpida 2 +gameinput-slot3 = Tecla Ràpida 3 +gameinput-slot4 = Tecla Ràpida 4 +gameinput-slot5 = Tecla Ràpida 5 +gameinput-slot6 = Tecla Ràpida 6 +gameinput-slot7 = Tecla Ràpida 7 +gameinput-slot8 = Tecla Ràpida 8 +gameinput-slot9 = Tecla Ràpida 9 +gameinput-slot10 = Tecla Ràpida 10 +gameinput-swaploadout = Canviar Armament +gameinput-togglecursor = Mostrar Cursor +gameinput-help = Mostrar Finestra d'Ajuda +gameinput-toggleinterface = Mostrar Interfície +gameinput-toggledebug = Mostrar Informació de Depuració i FPS +gameinput-toggle_egui_debug = Mostrar Informació de Depuració d'EGUI +gameinput-togglechat = Mostrar Xat +gameinput-screenshot = Capturar Pantalla +gameinput-toggleingameui = Mostrar Noms d'Usuari +gameinput-fullscreen = Mostrar Pantalla Completa +gameinput-moveforward = Avançar +gameinput-moveleft = Moure's a l'Esquerra +gameinput-moveright = Moure's a la Dreta +gameinput-moveback = Retrocedir +gameinput-jump = Saltar +gameinput-glide = Planador +gameinput-roll = Tombarella +gameinput-climb = Escalar +gameinput-climbdown = Escalar cap avall +gameinput-wallleap = Saltar en Paret +gameinput-togglelantern = Activar Llanterna +gameinput-mount = Muntar +gameinput-chat = Xat +gameinput-command = Comandament +gameinput-escape = Escapar +gameinput-map = Mapa +gameinput-bag = Bossa +gameinput-trade = Comerciar +gameinput-social = Social +gameinput-sit = Seure +gameinput-spellbook = Encanteris +gameinput-settings = Opcions +gameinput-respawn = Reaparèixer +gameinput-charge = Carregar +gameinput-togglewield = Alternar Empunyadura +gameinput-interact = Interactuar +gameinput-freelook = Vista Lliure +gameinput-autowalk = Auto. Caminar/Nadar +gameinput-cameraclamp = Fixar Càmera +gameinput-dance = Ballar +gameinput-select = Seleccionar Entitat +gameinput-acceptgroupinvite = Acceptar Invitació al Grup +gameinput-declinegroupinvite = Refusar Invitació al Grup +gameinput-cyclecamera = Càmera Cíclica +gameinput-crafting = Elaborar +gameinput-fly = Volar +gameinput-sneak = Amagar-se +gameinput-swimdown = Submergir +gameinput-swimup = Emergir +gameinput-mapzoomin = Augmenta zoom del mapa +gameinput-mapzoomout = Redueix zoom del mapa +gameinput-greet = Saludar +gameinput-map-locationmarkerbutton = Col·locar un marcador al Mapa \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/gameinput.ron b/assets/voxygen/i18n/ca_CA/gameinput.ron deleted file mode 100644 index f738394aa6..0000000000 --- a/assets/voxygen/i18n/ca_CA/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "gameinput.primary": "Atac Bàsic", - "gameinput.secondary": "Atac Secundari", - "gameinput.block": "Bloquejar", - "gameinput.slot1": "Tecla Ràpida 1", - "gameinput.slot2": "Tecla Ràpida 2", - "gameinput.slot3": "Tecla Ràpida 3", - "gameinput.slot4": "Tecla Ràpida 4", - "gameinput.slot5": "Tecla Ràpida 5", - "gameinput.slot6": "Tecla Ràpida 6", - "gameinput.slot7": "Tecla Ràpida 7", - "gameinput.slot8": "Tecla Ràpida 8", - "gameinput.slot9": "Tecla Ràpida 9", - "gameinput.slot10": "Tecla Ràpida 10", - "gameinput.swaploadout": "Canviar Armament", - "gameinput.togglecursor": "Mostrar Cursor", - "gameinput.help": "Mostrar Finestra d'Ajuda", - "gameinput.toggleinterface": "Mostrar Interfície", - "gameinput.toggledebug": "Mostrar Informació de Depuració i FPS", - "gameinput.toggle_egui_debug": "Mostrar Informació de Depuració d'EGUI", - "gameinput.togglechat": "Mostrar Xat", - "gameinput.screenshot": "Capturar Pantalla", - "gameinput.toggleingameui": "Mostrar Noms d'Usuari", - "gameinput.fullscreen": "Mostrar Pantalla Completa", - "gameinput.moveforward": "Avançar", - "gameinput.moveleft": "Moure's a l'Esquerra", - "gameinput.moveright": "Moure's a la Dreta", - "gameinput.moveback": "Retrocedir", - "gameinput.jump": "Saltar", - "gameinput.glide": "Planador", - "gameinput.roll": "Tombarella", - "gameinput.climb": "Escalar", - "gameinput.climbdown": "Escalar cap avall", - "gameinput.wallleap": "Saltar en Paret", - "gameinput.togglelantern": "Activar Llanterna", - "gameinput.mount": "Muntar", - "gameinput.chat": "Xat", - "gameinput.command": "Comandament", - "gameinput.escape": "Escapar", - "gameinput.map": "Mapa", - "gameinput.bag": "Bossa", - "gameinput.trade": "Comerciar", - "gameinput.social": "Social", - "gameinput.sit": "Seure", - "gameinput.spellbook": "Encanteris", - "gameinput.settings": "Opcions", - "gameinput.respawn": "Reaparèixer", - "gameinput.charge": "Carregar", - "gameinput.togglewield": "Alternar Empunyadura", - "gameinput.interact": "Interactuar", - "gameinput.freelook": "Vista Lliure", - "gameinput.autowalk": "Auto. Caminar/Nadar", - "gameinput.cameraclamp": "Fixar Càmera", - "gameinput.dance": "Ballar", - "gameinput.select": "Seleccionar Entitat", - "gameinput.acceptgroupinvite": "Acceptar Invitació al Grup", - "gameinput.declinegroupinvite": "Refusar Invitació al Grup", - "gameinput.cyclecamera": "Càmera Cíclica", - "gameinput.crafting": "Elaborar", - "gameinput.fly": "Volar", - "gameinput.sneak": "Amagar-se", - "gameinput.swimdown": "Submergir", - "gameinput.swimup": "Emergir", - "gameinput.mapzoomin": "Augmenta zoom del mapa", - "gameinput.mapzoomout": "Redueix zoom del mapa", - "gameinput.greet": "Saludar", - "gameinput.map.locationmarkerbutton": "Col·locar un marcador al Mapa" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/bag.ftl b/assets/voxygen/i18n/ca_CA/hud/bag.ftl new file mode 100644 index 0000000000..f1913891c5 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Bossa de { $playername } +hud-bag-stats_title = Atributs de { $playername } +hud-bag-exp = Exp +hud-bag-armor = Armadura +hud-bag-stats = Atributs +hud-bag-head = Cap +hud-bag-neck = Coll +hud-bag-tabard = Tabard +hud-bag-shoulders = Muscles +hud-bag-chest = Pit +hud-bag-hands = Mans +hud-bag-lantern = Llanterna +hud-bag-glider = Planador +hud-bag-belt = Cinturó +hud-bag-ring = Anell +hud-bag-back = Esquena +hud-bag-legs = Cames +hud-bag-feet = Peus +hud-bag-mainhand = Mà Principal +hud-bag-offhand = Mà Secundària +hud-bag-inactive_mainhand = Mà Principal Inactiva +hud-bag-inactive_offhand = Mà Secundària Inactiva +hud-bag-swap_equipped_weapons_title = Alternar Armes Equipades +hud-bag-swap_equipped_weapons_desc = Prem { $key } +hud-bag-bag = Bossa +hud-bag-health = Salut +hud-bag-energy = Energia +hud-bag-combat_rating = Punts de Combat +hud-bag-protection = Protecció +hud-bag-stun_res = Resistència a l'Atordiment +hud-bag-combat_rating_desc = + Calculat pel teu + equipament i salut. +hud-bag-protection_desc = Reducció de danys per Armadura +hud-bag-stun_res_desc = + Resistència contra atordiment per cops consecutius. + Es regenera com a Energia. +hud-bag-sort_by_name = Ordena pel Nom +hud-bag-sort_by_quality = Ordena per la Qualitat +hud-bag-sort_by_category = Ordena per la Categoria \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/bag.ron b/assets/voxygen/i18n/ca_CA/hud/bag.ron deleted file mode 100644 index 4eb3c2308c..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - // Inventory - "hud.bag.inventory": "Bossa de {playername}", - "hud.bag.stats_title": "Atributs de {playername}", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armadura", - "hud.bag.stats": "Atributs", - "hud.bag.head": "Cap", - "hud.bag.neck": "Coll", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Muscles", - "hud.bag.chest": "Pit", - "hud.bag.hands": "Mans", - "hud.bag.lantern": "Llanterna", - "hud.bag.glider": "Planador", - "hud.bag.belt": "Cinturó", - "hud.bag.ring": "Anell", - "hud.bag.back": "Esquena", - "hud.bag.legs": "Cames", - "hud.bag.feet": "Peus", - "hud.bag.mainhand": "Mà Principal", - "hud.bag.offhand": "Mà Secundària", - "hud.bag.inactive_mainhand": "Mà Principal Inactiva", - "hud.bag.inactive_offhand": "Mà Secundària Inactiva", - "hud.bag.swap_equipped_weapons_title": "Alternar Armes Equipades", - "hud.bag.swap_equipped_weapons_desc": "Prem {key}", - "hud.bag.bag": "Bossa", - "hud.bag.health": "Salut", - "hud.bag.energy": "Energia", - "hud.bag.combat_rating": "Punts de Combat", - "hud.bag.protection": "Protecció", - "hud.bag.stun_res": "Resistència a l'Atordiment", - "hud.bag.combat_rating_desc": "Calculat pel teu\nequipament i salut.", - "hud.bag.protection_desc": "Reducció de danys per Armadura", - "hud.bag.stun_res_desc": "Resistència contra atordiment per cops consecutius.\nEs regenera com a Energia.", - "hud.bag.sort_by_name": "Ordena pel Nom", - "hud.bag.sort_by_quality": "Ordena per la Qualitat", - "hud.bag.sort_by_category": "Ordena per la Categoria", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/char_window.ftl b/assets/voxygen/i18n/ca_CA/hud/char_window.ftl new file mode 100644 index 0000000000..bd55de9aa0 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Nom del Personatge +character_window-character_stats = + Resistència + + Aptitud + + Força de Voluntat + + Protecció \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/char_window.ron b/assets/voxygen/i18n/ca_CA/hud/char_window.ron deleted file mode 100644 index 81bdd9d4f5..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "character_window.character_name": "Nom del Personatge", - // Character stats - "character_window.character_stats": r#"Resistència - -Aptitud - -Força de Voluntat - -Protecció -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/chat.ftl b/assets/voxygen/i18n/ca_CA/hud/chat.ftl new file mode 100644 index 0000000000..60bf0266c5 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Tothom +hud-chat-chat_tab_hover_tooltip = Clic Dret per a Ajustos +hud-outcome-burning = Ha mort: cremat +hud-outcome-curse = Ha mort: maleït +hud-outcome-bleeding = Ha mort: dessagnat +hud-outcome-crippled = Ha mort: mutilat +hud-outcome-frozen = Ha mort: congelat +hud-chat-online_msg = [{ $name }] s'ha connectat +hud-chat-offline_msg = [{ $name }] s'ha desconnectat +hud-chat-default_death_msg = [{ $name }] ha mort +hud-chat-environmental_kill_msg = [{ $name }] ha mort a { $environment } +hud-chat-fall_kill_msg = [{ $name }] ha mort per caure d'una gran altura +hud-chat-suicide_msg = [{ $name }] ha mort per ferides autoinfligides +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } causat per [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] ha derrotat [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] ha disparat [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] ha fet explotar [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] ha matat [{ $victim }] amb màgia +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } causat per { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } ha matat [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } ha disparat [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } ha fet explotar [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } ha matat [{ $victim }] amb màgia +hud-chat-npc_other_kill_msg = { $attacker } ha matat [{ $victim }] +hud-chat-loot_msg = Has recollit [{ $item }] +hud-chat-loot_fail = La teva bossa és plena! +hud-chat-goodbye = Adeu! +hud-chat-connection_lost = S'ha perdut la connexió. Tancament en { $time } segons. \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/chat.ron b/assets/voxygen/i18n/ca_CA/hud/chat.ron deleted file mode 100644 index c87a6e6ed3..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.chat.all": "Tothom", - "hud.chat.chat_tab_hover_tooltip": "Clic Dret per a Ajustos", - - // Debuff outcomes - "hud.outcome.burning": "Ha mort: cremat", - "hud.outcome.curse": "Ha mort: maleït", - "hud.outcome.bleeding": "Ha mort: dessagnat", - "hud.outcome.crippled": "Ha mort: mutilat", - "hud.outcome.frozen": "Ha mort: congelat", - - // Chat outputs - "hud.chat.online_msg": "[{name}] s'ha connectat", - "hud.chat.offline_msg": "[{name}] s'ha desconnectat", - - "hud.chat.default_death_msg": "[{name}] ha mort", - "hud.chat.environmental_kill_msg": "[{name}] ha mort a {environment}", - "hud.chat.fall_kill_msg": "[{name}] ha mort per caure d'una gran altura", - "hud.chat.suicide_msg": "[{name}] ha mort per ferides autoinfligides", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} causat per [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] ha derrotat [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] ha disparat [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] ha fet explotar [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] ha matat [{victim}] amb màgia", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} causat per {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} ha matat [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} ha disparat [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} ha fet explotar [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} ha matat [{victim}] amb màgia", - "hud.chat.npc_other_kill_msg": "{attacker} ha matat [{victim}]", - - "hud.chat.loot_msg": "Has recollit [{item}]", - "hud.chat.loot_fail": "La teva bossa és plena!", - "hud.chat.goodbye": "Adeu!", - "hud.chat.connection_lost": "S'ha perdut la connexió. Tancament en {time} segons.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/crafting.ftl b/assets/voxygen/i18n/ca_CA/hud/crafting.ftl new file mode 100644 index 0000000000..9d0fb2a7dd --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/crafting.ftl @@ -0,0 +1,33 @@ +hud-crafting = Elaborar +hud-crafting-recipes = Receptes +hud-crafting-ingredients = Ingredients: +hud-crafting-craft = Elaborar +hud-crafting-tool_cata = Requereix: +hud-crafting-req_crafting_station = Requereix: +hud-crafting-anvil = Enclusa +hud-crafting-cauldron = Calderó +hud-crafting-cooking_pot = Cassola per Cuinar +hud-crafting-crafting_bench = Banc de Treball +hud-crafting-forge = Forja +hud-crafting-loom = Teler +hud-crafting-spinning_wheel = Filosa +hud-crafting-tanning_rack = Adoberia +hud-crafting-salvaging_station = Banc de Reciclatge +hud-crafting-campfire = Foguera +hud-crafting-tabs-all = Tot +hud-crafting-tabs-armor = Armadura +hud-crafting-tabs-dismantle = Desmantellar +hud-crafting-tabs-food = Menjar +hud-crafting-tabs-glider = Planadors +hud-crafting-tabs-potion = Pocions +hud-crafting-tabs-tool = Ferramentes +hud-crafting-tabs-utility = Utilitat +hud-crafting-tabs-weapon = Armes +hud-crafting-tabs-bag = Bosses +hud-crafting-tabs-processed_material = Materials +hud-crafting-dismantle_title = Desmantellar +hud-crafting-dismantle_explanation = + Sobrevola els objectes de la teva bossa per veure que + pots reciclar. + + Fes doble clic per desmantellar-los. \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/crafting.ron b/assets/voxygen/i18n/ca_CA/hud/crafting.ron deleted file mode 100644 index 5c27efa18e..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.crafting": "Elaborar", - "hud.crafting.recipes": "Receptes", - "hud.crafting.ingredients": "Ingredients:", - "hud.crafting.craft": "Elaborar", - "hud.crafting.tool_cata": "Requereix:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Requereix:", - "hud.crafting.anvil": "Enclusa", - "hud.crafting.cauldron": "Calderó", - "hud.crafting.cooking_pot": "Cassola per Cuinar", - "hud.crafting.crafting_bench": "Banc de Treball", - "hud.crafting.forge": "Forja", - "hud.crafting.loom": "Teler", - "hud.crafting.spinning_wheel": "Filosa", - "hud.crafting.tanning_rack": "Adoberia", - "hud.crafting.salvaging_station": "Banc de Reciclatge", - "hud.crafting.campfire": "Foguera", - // Tabs - "hud.crafting.tabs.all": "Tot", - "hud.crafting.tabs.armor": "Armadura", - "hud.crafting.tabs.dismantle": "Desmantellar", - "hud.crafting.tabs.food": "Menjar", - "hud.crafting.tabs.glider": "Planadors", - "hud.crafting.tabs.potion": "Pocions", - "hud.crafting.tabs.tool": "Ferramentes", - "hud.crafting.tabs.utility": "Utilitat", - "hud.crafting.tabs.weapon": "Armes", - "hud.crafting.tabs.bag": "Bosses", - "hud.crafting.tabs.processed_material": "Materials", - "hud.crafting.dismantle_title": "Desmantellar", - "hud.crafting.dismantle_explanation" : "Sobrevola els objectes de la teva bossa per veure que\npots reciclar.\n\nFes doble clic per desmantellar-los.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/group.ftl b/assets/voxygen/i18n/ca_CA/hud/group.ftl new file mode 100644 index 0000000000..3aed848a04 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grup +hud-group-invite_to_join = [{ $name }] t'ha convidat al seu grup! +hud-group-invite_to_trade = A [{ $name }] li agradaria comerciar amb tu. +hud-group-invite = Convidar +hud-group-kick = Expulsar +hud-group-assign_leader = Assignar Líder +hud-group-leave = Abandonar Grup +hud-group-dead = Mort +hud-group-out_of_range = Fora d'abast +hud-group-add_friend = Afegir a Amics +hud-group-link_group = Enllaçar Grups +hud-group-in_menu = En el Menú +hud-group-members = Membres del Grup \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/group.ron b/assets/voxygen/i18n/ca_CA/hud/group.ron deleted file mode 100644 index a99938f5e8..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.group": "Grup", - "hud.group.invite_to_join": "[{name}] t'ha convidat al seu grup!", - "hud.group.invite_to_trade": "A [{name}] li agradaria comerciar amb tu.", - "hud.group.invite": "Convidar", - "hud.group.kick": "Expulsar", - "hud.group.assign_leader": "Assignar Líder", - "hud.group.leave": "Abandonar Grup", - "hud.group.dead" : "Mort", - "hud.group.out_of_range": "Fora d'abast", - "hud.group.add_friend": "Afegir a Amics", - "hud.group.link_group": "Enllaçar Grups", - "hud.group.in_menu": "En el Menú", - "hud.group.members": "Membres del Grup", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/map.ftl b/assets/voxygen/i18n/ca_CA/hud/map.ftl new file mode 100644 index 0000000000..5eaf48996c --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/map.ftl @@ -0,0 +1,34 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Missions +hud-map-topo_map = Topogràfic +hud-map-difficulty = Dificultat +hud-map-towns = Pobles +hud-map-castles = Castells +hud-map-dungeons = Masmorres +hud-map-caves = Coves +hud-map-cave = Cova +hud-map-peaks = Muntanyes +hud-map-biomes = Biomes +hud-map-voxel_map = Mapa Vòxel +hud-map-trees = Arbres Gegants +hud-map-tree = Arbre Gegant +hud-map-town = Poble +hud-map-castle = Castell +hud-map-dungeon = Masmorra +hud-map-difficulty_dungeon = + Masmorra + + Dificultat: { $difficulty } +hud-map-drag = Arrossegar +hud-map-zoom = Zoom +hud-map-mid_click = Situar Punt d'Acampada +hud-map-recenter = Centrar +hud-map-marked_location = Localització Marcada +hud-map-marked_location_remove = Clic per eliminar +hud-map-change_map_mode = Canviar Mapa +hud-map-toggle_minimap_voxel = Mostrar Minimapa Vòxel +hud-map-zoom_minimap_explanation = + Fes Zoom al Minimapa per veure + l'àrea al teu voltant amb més detall +hud-map-gnarling = Fortalesa Gnarling +hud-map-placed_by = Situat a { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/map.ron b/assets/voxygen/i18n/ca_CA/hud/map.ron deleted file mode 100644 index 8cfffce216..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Missions", - "hud.map.topo_map": "Topogràfic", - "hud.map.difficulty": "Dificultat", - "hud.map.towns": "Pobles", - "hud.map.castles": "Castells", - "hud.map.dungeons": "Masmorres", - "hud.map.caves": "Coves", - "hud.map.cave": "Cova", - "hud.map.peaks": "Muntanyes", - "hud.map.biomes": "Biomes", - "hud.map.voxel_map": "Mapa Vòxel", - "hud.map.trees": "Arbres Gegants", - "hud.map.tree": "Arbre Gegant", - "hud.map.town": "Poble", - "hud.map.castle": "Castell", - "hud.map.dungeon": "Masmorra", - "hud.map.difficulty_dungeon": "Masmorra\n\nDificultat: {difficulty}", - "hud.map.drag": "Arrossegar", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Situar Punt d'Acampada", - "hud.map.recenter": "Centrar", - "hud.map.marked_location": "Localització Marcada", - "hud.map.marked_location_remove": "Clic per eliminar", - "hud.map.change_map_mode": "Canviar Mapa", - "hud.map.toggle_minimap_voxel": "Mostrar Minimapa Vòxel", - "hud.map.zoom_minimap_explanation": "Fes Zoom al Minimapa per veure\nl'àrea al teu voltant amb més detall", - "hud.map.gnarling": "Fortalesa Gnarling", - "hud.map.placed_by": "Situat a {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/misc.ftl b/assets/voxygen/i18n/ca_CA/hud/misc.ftl new file mode 100644 index 0000000000..fd3ae64b3a --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = No mostris açò en començar +hud-show_tips = Mostra Consells +hud-quests = Missions +hud-you_died = Has Mort +hud-waypoint_saved = Punt d'Acampada Guardat +hud-sp_arrow_txt = PH +hud-inventory_full = Bossa Plena +hud-press_key_to_show_keybindings_fmt = [{ $key }] Controls del Teclat +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Llanterna +hud-press_key_to_show_debug_info_fmt = Prem { $key } per mostrar Informació de Depuració +hud-press_key_to_toggle_keybindings_fmt = Prem { $key } per mostrar controls del teclat +hud-press_key_to_toggle_debug_info_fmt = Prem { $key } per alternar Informació de Depuració +hud-press_key_to_respawn = Prem { $key } per reaparèixer a l'últim Punt d'Acampada visitat. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Prem [ { $key } ] per alliberar el teu cursor i prémer aquest botó! +hud-tutorial_elements = Elaboració +hud-temp_quest_headline = Salutacions, viatger! +hud-temp_quest_text = + Per començar aquest viatge podries buscar per aquesta aldea i arreplegar alguns recursos. + + Pots prendre el que necessites per al teu viatge! + + Mira a la part dreta-inferior de la pantalla per a trobar algunes coses com la teva bossa, el menú d'elaboració i el mapa. + + Les estacions d'elaboració et permeten crear armadures, armes, menjar i moltes coses més! + + Els animals salvatges que viuen prop de l'aldea són una gran font de pells per a crear alguna protecció contra els perills del món. + + Quan et sentis llest, intenta obtenir equipament encara millor dels nombrosos reptes marcats al teu mapa! +hud-spell = Encanteris +hud-diary = Diari +hud-free_look_indicator = Vista lliure activada. Prem { $key } per a desactivar. +hud-camera_clamp_indicator = Càmera vertical fixa activada. Prem { $key } per a desactivar. +hud-auto_walk_indicator = Auto. Caminar/nadar activat +hud-collect = Recollir +hud-pick_up = Recollir +hud-open = Obrir +hud-use = Utilitzar +hud-mine = Minar +hud-talk = Parlar +hud-trade = Comerciar +hud-mount = Muntar +hud-sit = Seure \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/misc.ron b/assets/voxygen/i18n/ca_CA/hud/misc.ron deleted file mode 100644 index 562feff46a..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.do_not_show_on_startup": "No mostris açò en començar", - "hud.show_tips": "Mostra Consells", - "hud.quests": "Missions", - "hud.you_died": "Has Mort", - "hud.waypoint_saved": "Punt d'Acampada Guardat", - "hud.sp_arrow_txt": "PH", - "hud.inventory_full": "Bossa Plena", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Controls del Teclat", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Llanterna", - "hud.press_key_to_show_debug_info_fmt": "Prem {key} per mostrar Informació de Depuració", - "hud.press_key_to_toggle_keybindings_fmt": "Prem {key} per mostrar controls del teclat", - "hud.press_key_to_toggle_debug_info_fmt": "Prem {key} per alternar Informació de Depuració", - - // Respawn message - "hud.press_key_to_respawn": r#"Prem {key} per reaparèixer a l'últim Punt d'Acampada visitat."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Prem [ {key} ] per alliberar el teu cursor i prémer aquest botó!"#, - "hud.tutorial_elements": r#"Elaboració"#, - -"hud.temp_quest_headline": r#"Salutacions, viatger!"#, -"hud.temp_quest_text": r#"Per començar aquest viatge podries buscar per aquesta aldea i arreplegar alguns recursos. - -Pots prendre el que necessites per al teu viatge! - -Mira a la part dreta-inferior de la pantalla per a trobar algunes coses com la teva bossa, el menú d'elaboració i el mapa. - -Les estacions d'elaboració et permeten crear armadures, armes, menjar i moltes coses més! - -Els animals salvatges que viuen prop de l'aldea són una gran font de pells per a crear alguna protecció contra els perills del món. - -Quan et sentis llest, intenta obtenir equipament encara millor dels nombrosos reptes marcats al teu mapa! -"#, - - "hud.spell": "Encanteris", - // Diary - "hud.diary": "Diari", - - "hud.free_look_indicator": "Vista lliure activada. Prem {key} per a desactivar.", - "hud.camera_clamp_indicator": "Càmera vertical fixa activada. Prem {key} per a desactivar.", - "hud.auto_walk_indicator": "Auto. Caminar/nadar activat", - "hud.collect": "Recollir", - "hud.pick_up": "Recollir", - "hud.open": "Obrir", - "hud.use": "Utilitzar", - "hud.mine": "Minar", - "hud.talk": "Parlar", - "hud.trade": "Comerciar", - "hud.mount": "Muntar", - "hud.sit": "Seure", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/sct.ftl b/assets/voxygen/i18n/ca_CA/hud/sct.ftl new file mode 100644 index 0000000000..420c06ecb7 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOQUEJAT \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/sct.ron b/assets/voxygen/i18n/ca_CA/hud/sct.ron deleted file mode 100644 index cfa43a4e98..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOQUEJAT", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/settings.ftl b/assets/voxygen/i18n/ca_CA/hud/settings.ftl new file mode 100644 index 0000000000..8293f11fb5 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/settings.ftl @@ -0,0 +1,123 @@ +hud-settings-general = General +hud-settings-none = Cap +hud-settings-press_behavior-toggle = Mostra +hud-settings-press_behavior-hold = Manté +hud-settings-help_window = Finestra d'Ajuda +hud-settings-debug_info = Informació de Depurat +hud-settings-show_hitboxes = Mostra caixes d'impacte +hud-settings-show_chat = Mostra Xat +hud-settings-show_hotkey_hints = Mostra consells de tecla ràpida +hud-settings-tips_on_startup = Consells en iniciar +hud-settings-ui_scale = Escala de l'IU +hud-settings-relative_scaling = Escalat Relatiu +hud-settings-custom_scaling = Escalat Personalitzat +hud-settings-crosshair = Retícula +hud-settings-opacity = Opacitat +hud-settings-hotbar = Barra Ràpida +hud-settings-toggle_shortcuts = Mostra Dreceres +hud-settings-buffs_skillbar = Buffs a la Barra d'Habilitats +hud-settings-buffs_mmap = Buffs al Minimapa +hud-settings-toggle_bar_experience = Mostra Barra d'Experiència +hud-settings-scrolling_combat_text = Text de Combat Desplaçat +hud-settings-incoming_damage = Dany Imminent +hud-settings-speech_bubble = Bafarades +hud-settings-speech_bubble_self = Mostrar les Bafarades pròpies +hud-settings-speech_bubble_dark_mode = Bafarades Mode Fosc +hud-settings-speech_bubble_icon = Icones Bafarades +hud-settings-energybar_numbers = Nombres a la Barra d'Energia +hud-settings-always_show_bars = Mostrar sempre Barra d'Energia +hud-settings-values = Valors +hud-settings-percentages = Percentatges +hud-settings-chat = Xat +hud-settings-background_opacity = Opacitat del Fons +hud-settings-chat_character_name = Nom dels Personatges al Xat +hud-settings-loading_tips = Consells a la Pantalla de Càrrega +hud-settings-reset_interface = Configuració per defecte +hud-settings-pan_sensitivity = Sensitivitat de Desplaçament de Càmera +hud-settings-zoom_sensitivity = Sensitivitat del Zoom +hud-settings-camera_clamp_angle = Angle del mode Càmera Fixa Vertical +hud-settings-invert_scroll_zoom = Invertir Desplaçament del Zoom +hud-settings-invert_mouse_y_axis = Invertir Eix Y del Ratolí +hud-settings-invert_controller_y_axis = Invertir Eix Y del Control +hud-settings-enable_mouse_smoothing = Suavitzat de Càmera +hud-settings-free_look_behavior = Mode Vista Lliure +hud-settings-auto_walk_behavior = Mode Auto. Caminar +hud-settings-camera_clamp_behavior = Comportament de la Càmera Fixa +hud-settings-player_physics_behavior = Físiques del Jugador (experimental) +hud-settings-stop_auto_walk_on_input = Parar Auto. Caminar en moviment +hud-settings-auto_camera = Auto càmera +hud-settings-reset_gameplay = Configuració per defecte +hud-settings-view_distance = Distància de Visió +hud-settings-sprites_view_distance = Distància de Visió dels Sprites +hud-settings-figures_view_distance = Distància de Visió de les Entitats +hud-settings-maximum_fps = FPS Màxims +hud-settings-background_fps = FPS de fons +hud-settings-present_mode = Mode Present +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = Camp de Visió (graus) +hud-settings-gamma = Gamma +hud-settings-exposure = Exposició +hud-settings-ambiance = Il·luminació Ambiental +hud-settings-antialiasing_mode = Mode Antialiàsing +hud-settings-upscale_factor = Resolució Interna +hud-settings-cloud_rendering_mode = Mode de Renderitzat de Núvols +hud-settings-fluid_rendering_mode = Mode de Renderitzat de Fluids +hud-settings-fluid_rendering_mode-cheap = Barat +hud-settings-fluid_rendering_mode-shiny = Brillant +hud-settings-cloud_rendering_mode-minimal = Mínim +hud-settings-cloud_rendering_mode-low = Baix +hud-settings-cloud_rendering_mode-medium = Mitjà +hud-settings-cloud_rendering_mode-high = Alt +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Pantalla Completa +hud-settings-fullscreen_mode = Mode Pantalla Completa +hud-settings-fullscreen_mode-exclusive = Exclusiu +hud-settings-fullscreen_mode-borderless = Sense Vores +hud-settings-gpu_profiler = Activar GPU timing (no suportat a tot arreu) +hud-settings-particles = Partícules +hud-settings-lossy_terrain_compression = Pèrdua de Qualitat en la Compressió del Terreny +hud-settings-weapon_trails = Rastre de les Armes +hud-settings-resolution = Resolució +hud-settings-bit_depth = Profunditat de Bit +hud-settings-refresh_rate = Tassa de Refresc +hud-settings-lighting_rendering_mode = Mode de Renderitzat de la Llum +hud-settings-lighting_rendering_mode-ashikhmin = Tipus A - Alt +hud-settings-lighting_rendering_mode-blinnphong = Tipus B - Mitjà +hud-settings-lighting_rendering_mode-lambertian = Tipus L - Barat +hud-settings-shadow_rendering_mode = Mode de Renderitzat d'Ombres +hud-settings-shadow_rendering_mode-none = Cap +hud-settings-shadow_rendering_mode-cheap = Barat +hud-settings-shadow_rendering_mode-map = Mapa +hud-settings-shadow_rendering_mode-map-resolution = Resolució +hud-settings-lod_detail = Nivell de Detall +hud-settings-save_window_size = Desar Mida de la Finestra +hud-settings-reset_graphics = Configuració per defecte +hud-settings-bloom = Bloom +hud-settings-point_glow = Point Glow +hud-settings-master_volume = Volum General +hud-settings-inactive_master_volume_perc = Volum de Finestra Inactiva +hud-settings-music_volume = Volum de la Música +hud-settings-sound_effect_volume = Volum dels Efectes de So +hud-settings-audio_device = Dispositiu d'Àudio +hud-settings-reset_sound = Configuració per defecte +hud-settings-english_fallback = Mostrar Anglès per a les traduccions mancants +hud-settings-awaitingkey = Prem qualsevol tecla... +hud-settings-unbound = Cap +hud-settings-reset_keybinds = Configuració per defecte +hud-settings-chat_tabs = Pestanyes de Xat +hud-settings-label = Etiqueta: +hud-settings-delete = Esborrar +hud-settings-show_all = Mostrar Tot +hud-settings-messages = Missatges +hud-settings-activity = Activitat +hud-settings-death = Mort +hud-settings-group = Grup +hud-settings-faction = Facció +hud-settings-world = Món +hud-settings-region = Regió +hud-settings-say = Dir +hud-settings-all = Tothom +hud-settings-group_only = Sols Grup +hud-settings-reset_chat = Configuració per defecte \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/settings.ron b/assets/voxygen/i18n/ca_CA/hud/settings.ron deleted file mode 100644 index ceb0cb20c4..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/settings.ron +++ /dev/null @@ -1,141 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - // Settings - "hud.settings.general": "General", - "hud.settings.none": "Cap", - "hud.settings.press_behavior.toggle": "Mostra", - "hud.settings.press_behavior.hold": "Manté", - "hud.settings.help_window": "Finestra d'Ajuda", - "hud.settings.debug_info": "Informació de Depurat", - "hud.settings.show_hitboxes": "Mostra caixes d'impacte", - "hud.settings.show_chat": "Mostra Xat", - "hud.settings.show_hotkey_hints": "Mostra consells de tecla ràpida", - "hud.settings.tips_on_startup": "Consells en iniciar", - "hud.settings.ui_scale": "Escala de l'IU", - "hud.settings.relative_scaling": "Escalat Relatiu", - "hud.settings.custom_scaling": "Escalat Personalitzat", - "hud.settings.crosshair": "Retícula", - "hud.settings.opacity": "Opacitat", - "hud.settings.hotbar": "Barra Ràpida", - "hud.settings.toggle_shortcuts": "Mostra Dreceres", - "hud.settings.buffs_skillbar": "Buffs a la Barra d'Habilitats", - "hud.settings.buffs_mmap": "Buffs al Minimapa", - "hud.settings.toggle_bar_experience": "Mostra Barra d'Experiència", - "hud.settings.scrolling_combat_text": "Text de Combat Desplaçat", - "hud.settings.incoming_damage": "Dany Imminent", - "hud.settings.speech_bubble": "Bafarades", - "hud.settings.speech_bubble_self": "Mostrar les Bafarades pròpies", - "hud.settings.speech_bubble_dark_mode": "Bafarades Mode Fosc", - "hud.settings.speech_bubble_icon": "Icones Bafarades", - "hud.settings.energybar_numbers": "Nombres a la Barra d'Energia", - "hud.settings.always_show_bars": "Mostrar sempre Barra d'Energia", - "hud.settings.values": "Valors", - "hud.settings.percentages": "Percentatges", - "hud.settings.chat": "Xat", - "hud.settings.background_opacity": "Opacitat del Fons", - "hud.settings.chat_character_name": "Nom dels Personatges al Xat", // force update - "hud.settings.loading_tips": "Consells a la Pantalla de Càrrega", - "hud.settings.reset_interface": "Configuració per defecte", - - "hud.settings.pan_sensitivity": "Sensitivitat de Desplaçament de Càmera", - "hud.settings.zoom_sensitivity": "Sensitivitat del Zoom", - "hud.settings.camera_clamp_angle": "Angle del mode Càmera Fixa Vertical", - "hud.settings.invert_scroll_zoom": "Invertir Desplaçament del Zoom", - "hud.settings.invert_mouse_y_axis": "Invertir Eix Y del Ratolí", - "hud.settings.invert_controller_y_axis": "Invertir Eix Y del Control", - "hud.settings.enable_mouse_smoothing": "Suavitzat de Càmera", - "hud.settings.free_look_behavior": "Mode Vista Lliure", - "hud.settings.auto_walk_behavior": "Mode Auto. Caminar", - "hud.settings.camera_clamp_behavior": "Comportament de la Càmera Fixa", - "hud.settings.player_physics_behavior": "Físiques del Jugador (experimental)", - "hud.settings.stop_auto_walk_on_input": "Parar Auto. Caminar en moviment", - "hud.settings.auto_camera": "Auto càmera", - "hud.settings.reset_gameplay": "Configuració per defecte", - - "hud.settings.view_distance": "Distància de Visió", - "hud.settings.sprites_view_distance": "Distància de Visió dels Sprites", - "hud.settings.figures_view_distance": "Distància de Visió de les Entitats", - "hud.settings.maximum_fps": "FPS Màxims", - "hud.settings.background_fps": "FPS de fons", - "hud.settings.present_mode": "Mode Present", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "Camp de Visió (graus)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Exposició", - "hud.settings.ambiance": "Il·luminació Ambiental", - "hud.settings.antialiasing_mode": "Mode Antialiàsing", - "hud.settings.upscale_factor": "Resolució Interna", - "hud.settings.cloud_rendering_mode": "Mode de Renderitzat de Núvols", - "hud.settings.fluid_rendering_mode": "Mode de Renderitzat de Fluids", - "hud.settings.fluid_rendering_mode.cheap": "Barat", - "hud.settings.fluid_rendering_mode.shiny": "Brillant", - "hud.settings.cloud_rendering_mode.minimal": "Mínim", - "hud.settings.cloud_rendering_mode.low": "Baix", - "hud.settings.cloud_rendering_mode.medium": "Mitjà", - "hud.settings.cloud_rendering_mode.high": "Alt", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Pantalla Completa", - "hud.settings.fullscreen_mode": "Mode Pantalla Completa", - "hud.settings.fullscreen_mode.exclusive": "Exclusiu", - "hud.settings.fullscreen_mode.borderless": "Sense Vores", - "hud.settings.gpu_profiler": "Activar GPU timing (no suportat a tot arreu)", - "hud.settings.particles": "Partícules", - "hud.settings.lossy_terrain_compression": "Pèrdua de Qualitat en la Compressió del Terreny", - "hud.settings.weapon_trails": "Rastre de les Armes", - "hud.settings.resolution": "Resolució", - "hud.settings.bit_depth": "Profunditat de Bit", - "hud.settings.refresh_rate": "Tassa de Refresc", - "hud.settings.lighting_rendering_mode": "Mode de Renderitzat de la Llum", - "hud.settings.lighting_rendering_mode.ashikhmin": "Tipus A - Alt ", - "hud.settings.lighting_rendering_mode.blinnphong": "Tipus B - Mitjà", - "hud.settings.lighting_rendering_mode.lambertian": "Tipus L - Barat", - "hud.settings.shadow_rendering_mode": "Mode de Renderitzat d'Ombres", - "hud.settings.shadow_rendering_mode.none": "Cap", - "hud.settings.shadow_rendering_mode.cheap": "Barat", - "hud.settings.shadow_rendering_mode.map": "Mapa", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolució", - "hud.settings.lod_detail": "Nivell de Detall", - "hud.settings.save_window_size": "Desar Mida de la Finestra", - "hud.settings.reset_graphics": "Configuració per defecte", - "hud.settings.bloom": "Bloom", - "hud.settings.point_glow": "Point Glow", - - "hud.settings.master_volume": "Volum General", - "hud.settings.inactive_master_volume_perc": "Volum de Finestra Inactiva", - "hud.settings.music_volume": "Volum de la Música", - "hud.settings.sound_effect_volume": "Volum dels Efectes de So", - "hud.settings.audio_device": "Dispositiu d'Àudio", - "hud.settings.reset_sound": "Configuració per defecte", - - "hud.settings.english_fallback": "Mostrar Anglès per a les traduccions mancants", - - "hud.settings.awaitingkey": "Prem qualsevol tecla...", - "hud.settings.unbound": "Cap", - "hud.settings.reset_keybinds": "Configuració per defecte", - - "hud.settings.chat_tabs": "Pestanyes de Xat", - "hud.settings.label": "Etiqueta:", - "hud.settings.delete": "Esborrar", - "hud.settings.show_all": "Mostrar Tot", - "hud.settings.messages": "Missatges", - "hud.settings.activity": "Activitat", - "hud.settings.death": "Mort", - "hud.settings.group": "Grup", - "hud.settings.faction": "Facció", - "hud.settings.world": "Món", - "hud.settings.region": "Regió", - "hud.settings.say": "Dir", - "hud.settings.all": "Tothom", - "hud.settings.group_only": "Sols Grup", - "hud.settings.reset_chat" : "Configuració per defecte", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/skills.ftl b/assets/voxygen/i18n/ca_CA/hud/skills.ftl new file mode 100644 index 0000000000..5c4a5a0ada --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Nou Punt d'Habilitat +hud-skill-sp_available = { $number } PH disponibles +hud-skill-not_unlocked = No desbloquejat +hud-skill-req_sp ={"\u000A"} + + Requereix { $number } PH +hud-skill-inc_health_title = Augmentar Salut +hud-skill-inc_health = Augmenta la Salut màxima en { $boost }{ $SP } +hud-skill-inc_energy_title = Augmentar Energia +hud-skill-inc_energy = Augmenta l'Energia Màxima en { $boost }{ $SP } +hud-skill-unlck_sword_title = Desbloquejar Espasa +hud-skill-unlck_sword = Desbloqueja l'arbre d'habilitats de l'espasa{ $SP } +hud-skill-unlck_axe_title = Desbloquejar Destral +hud-skill-unlck_axe = Desbloqueja l'arbre d'habilitats de la destral{ $SP } +hud-skill-unlck_hammer_title = Desbloquejar Martell +hud-skill-unlck_hammer = Desbloqueja l'arbre d'habilitats del martell{ $SP } +hud-skill-unlck_bow_title = Desbloquejar Arc +hud-skill-unlck_bow = Desbloqueja l'arbre d'habilitats de l'arc{ $SP } +hud-skill-unlck_staff_title = Desbloquejar Bastó +hud-skill-unlck_staff = Desbloqueja l'arbre d'habilitats del bastó{ $SP } +hud-skill-unlck_sceptre_title = Desbloquejar Ceptre +hud-skill-unlck_sceptre = Desbloqueja l'arbre d'habilitats del ceptre{ $SP } +hud-skill-dodge_title = Esquivar +hud-skill-dodge = Les tombarelles evasives s'activen fent clic al botó central del ratolí i ofereixen immunitat temporal als atacs físics mentre rodes. +hud-skill-roll_energy_title = Cost Energètic de les Tombarelles +hud-skill-roll_energy = Fer tombarelles utilitza { $boost }% menys energia{ $SP } +hud-skill-roll_speed_title = Velocitat de les Tombarelles +hud-skill-roll_speed = Les tombarelles són un { $boost }% més ràpides{ $SP } +hud-skill-roll_dur_title = Durada de la Tombarella +hud-skill-roll_dur = Les tombarelles duren un { $boost }% més{ $SP } +hud-skill-climbing_title = Escalar +hud-skill-climbing = Salta des de llocs ben alts +hud-skill-climbing_cost_title = Cost de l'Escalada +hud-skill-climbing_cost = Escalar fa servir un { $boost }% menys d'Energia{ $SP } +hud-skill-climbing_speed_title = Velocitat d'Escalada +hud-skill-climbing_speed = Escalar és un { $boost }% més ràpid{ $SP } +hud-skill-swim_title = Nadar +hud-skill-swim = Sostenir-se i avançar dins l’aigua +hud-skill-swim_speed_title = Velocitat de Natació +hud-skill-swim_speed = Nades un { $boost }% més ràpid{ $SP } +hud-skill-sc_lifesteal_title = Raig Drena-vida +hud-skill-sc_lifesteal = Drena la vida dels teus enemics +hud-skill-sc_lifesteal_damage_title = Dany +hud-skill-sc_lifesteal_damage = Fes un { $boost }% més de mal{ $SP } +hud-skill-sc_lifesteal_range_title = Abast +hud-skill-sc_lifesteal_range = El teu raig arriba un { $boost }% més lluny{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Drena-vida +hud-skill-sc_lifesteal_lifesteal = Converteix un { $boost }% de dany addicional en Salut{ $SP } +hud-skill-sc_lifesteal_regen_title = Regeneració Energètica +hud-skill-sc_lifesteal_regen = Replena la teva Energia amb un { $boost }% addicional{ $SP } +hud-skill-sc_heal_title = Aura Sanadora +hud-skill-sc_heal = Cura als teus aliats usant la sang dels teus enemics, requereix un combo per ser activat +hud-skill-sc_heal_heal_title = Curació +hud-skill-sc_heal_heal = Augmenta la capacitat de curar en un { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Cost Energètic +hud-skill-sc_heal_cost = Curar requereix un { $boost }% menys Energia{ $SP } +hud-skill-sc_heal_duration_title = Durada +hud-skill-sc_heal_duration = Els efectes de la teva aura sanadora duren un { $boost }% més{ $SP } +hud-skill-sc_heal_range_title = Radi +hud-skill-sc_heal_range = La teva aura sanadora abasta un { $boost }% més de distància{ $SP } +hud-skill-sc_wardaura_unlock_title = Desbloquejar Aura Protectora +hud-skill-sc_wardaura_unlock = Et permet protegir als teus aliats contra els atacs enemics{ $SP } +hud-skill-sc_wardaura_strength_title = Força +hud-skill-sc_wardaura_strength = La força de la teva protecció augmenta en un { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Durada +hud-skill-sc_wardaura_duration = Els efectes de la teva protecció duren un { $boost }% més temps{ $SP } +hud-skill-sc_wardaura_range_title = Radi +hud-skill-sc_wardaura_range = La teva protecció abasta un { $boost }% més{ $SP } +hud-skill-sc_wardaura_cost_title = Cost Energètic +hud-skill-sc_wardaura_cost = Crear la protecció requereix un { $boost }% menys d'Energia{ $SP } +hud-skill-st_shockwave_range_title = Abast de l'Ona de Xoc +hud-skill-st_shockwave_range = Llança coses que solien estar fora del teu abast. Abast augmentat un { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Cost de l'Ona de Xoc +hud-skill-st_shockwave_cost = Redueix el cost energètic per llençar aldeans innocents un { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Empenta de l'Ona de Xoc +hud-skill-st_shockwave_knockback = Augmenta la potència d'empenta de l'Ona de Xoc un { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Dany de l'Ona de Xoc +hud-skill-st_shockwave_damage = Augmenta el dany generat per l'Ona de Xoc un { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Desbloquejar Ona de Xoc +hud-skill-st_shockwave_unlock = Desbloqueja l'habilitat de llençar enemics fent servir foc{ $SP } +hud-skill-st_flamethrower_title = Llançaflames +hud-skill-st_flamethrower = Llança flames, cuina'ls a tots! +hud-skill-st_flame_velocity_title = Velocitat de les Flames +hud-skill-st_flame_velocity = El foc es mou més de pressa, concretament un { $boost }% més{ $SP } +hud-skill-st_flamethrower_range_title = Abast del Llançaflames +hud-skill-st_flamethrower_range = Arriba on abans no podies, les flames arriben un { $boost }% més lluny{ $SP } +hud-skill-st_energy_drain_title = Consum d'Energia +hud-skill-st_energy_drain = Redueix el consum d'Energia un { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Dany Llançaflames +hud-skill-st_flamethrower_damage = Augmenta el dany un { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Radi d'Explosió +hud-skill-st_explosion_radius = Quan més gran millor. Augmenta el radi de les explosions un { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Regeneració d'Energia +hud-skill-st_energy_regen = Augmenta la regeneració d'Energia un { $boost }%{ $SP } +hud-skill-st_fireball_title = Bola de Foc +hud-skill-st_fireball = Dispara una bola de foc que explota en impactar +hud-skill-st_damage_title = Dany +hud-skill-st_damage = Augmenta el dany un { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Velocitat dels Projectils +hud-skill-bow_projectile_speed = Et permet disparar fletxes un { $boost }% més ràpides{ $SP } +hud-skill-bow_charged_title = Tir Carregat +hud-skill-bow_charged = La concentració té la seva recompensa +hud-skill-bow_charged_damage_title = Dany Carregat +hud-skill-bow_charged_damage = Augmenta el dany un { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Regeneració Carregada +hud-skill-bow_charged_energy_regen = Augmenta l'Energia recuperada un { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Empenta de la Càrrega +hud-skill-bow_charged_knockback = Empenta als teus enemics un { $boost }% més{ $SP } +hud-skill-bow_charged_speed_title = Velocitat Carregada +hud-skill-bow_charged_speed = Augmenta la velocitat a la qual carregues l'arc un { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Velocitat de Moviment en Carregar +hud-skill-bow_charged_move = Augmenta la velocitat a la qual et mous mentre carregues un atac un { $boost }%{ $SP } +hud-skill-bow_repeater_title = Repetidor +hud-skill-bow_repeater = Quan més dispares, més dispararàs +hud-skill-bow_repeater_damage_title = Dany del Repetidor +hud-skill-bow_repeater_damage = Augmenta el dany realitzat un { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Cost del Repetidor +hud-skill-bow_repeater_cost = Redueix el cost energètic per activar el repetidor un { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Velocitat del Repetidor +hud-skill-bow_repeater_speed = Augmenta el ritme al qual dispares fletxes un { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Desbloqueja Escopeta +hud-skill-bow_shotgun_unlock = Desbloqueja l'habilitat de disparar múltiples fletxes alhora{ $SP } +hud-skill-bow_shotgun_damage_title = Dany d'Escopeta +hud-skill-bow_shotgun_damage = Augmenta el dany fet per l'habilitat un { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Cost d'Escopeta +hud-skill-bow_shotgun_cost = Redueix el cost d'Escopeta un { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Nombre de Fletxes d'Escopeta +hud-skill-bow_shotgun_arrow_count = Augmenta el nombre de fletxes en cada ús en { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Difusió d'Escopeta +hud-skill-bow_shotgun_spread = Redueix la difusió de les fletxes un { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Radi del Salt en Picat +hud-skill-hmr_leap_radius = Augmenta el radi d'atac del cop a terra en { $boost } metres{ $SP } +hud-skill-hmr_leap_distance_title = Distància del Salt en Picat +hud-skill-hmr_leap_distance = Augmenta la distància de l'habilitat Salt en Picat un { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Cost del Salt en Picat +hud-skill-hmr_leap_cost = Redueix el cost energètic del Salt en Picat un { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Empenta del Salt en Picat +hud-skill-hmr_leap_knockback = Augmenta l'empenta del Salt en Picat un { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Dany del Salt en Picat +hud-skill-hmr_leap_damage = Augmenta el dany del Salt en Picat un { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Desbloqueja Salt en Picat +hud-skill-hmr_unlock_leap = Desbloqueja l'habilitat Salt en Picat{ $SP } +hud-skill-hmr_charged_melee_title = Atac Carregat +hud-skill-hmr_charged_melee = L'atac de sempre ara carregat! +hud-skill-hmr_charged_rate_title = Velocitat de Càrrega +hud-skill-hmr_charged_rate = Augmenta la velocitat a la qual carregues el cop un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Consum Energètic de l'Atac Carregat +hud-skill-hmr_charged_melee_nrg_drain = Redueix el cost energètic quan carregues un atac un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Dany de l'Atac Carregat +hud-skill-hmr_charged_melee_damage = Augmenta el dany de l'Atac Carregat un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Empenta de l'Atac Carregat +hud-skill-hmr_charged_melee_knockback = Augmenta massivament la potència de llançament de l'atac un { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Atac Individual +hud-skill-hmr_single_strike = Tan solitari com sou vós +hud-skill-hmr_single_strike_regen_title = Regeneració de l'Atac Individual +hud-skill-hmr_single_strike_regen = Augmenta el guany d'Energia per cada cop successiu{ $SP } +hud-skill-hmr_single_strike_speed_title = Velocitat de l'Atac Individual +hud-skill-hmr_single_strike_speed = Augmenta la velocitat dels atacs per cada cop successiu{ $SP } +hud-skill-hmr_single_strike_damage_title = Dany de l'Atac Individual +hud-skill-hmr_single_strike_damage = Augmenta el dany per cada cop successiu{ $SP } +hud-skill-hmr_single_strike_knockback_title = Empenta de l'Atac Individual +hud-skill-hmr_single_strike_knockback = Augmenta la potència de llançament dels atacs un { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Atac Triple +hud-skill-sw_trip_str = Ataca fins a tres cops +hud-skill-sw_trip_str_combo_title = Combo d'Atac Triple +hud-skill-sw_trip_str_combo = Desbloqueja els combos de l'Atac Triple{ $SP } +hud-skill-sw_trip_str_dmg_title = Dany de l'Atac Triple +hud-skill-sw_trip_str_dmg = Augmenta el dany per cada cop successiu{ $SP } +hud-skill-sw_trip_str_sp_title = Velocitat de l'Atac Triple +hud-skill-sw_trip_str_sp = Augmenta la velocitat d'atac per cada cop successiu{ $SP } +hud-skill-sw_trip_str_reg_title = Regeneració d'Atac Triple +hud-skill-sw_trip_str_reg = Augmenta la regeneració d'Energia per cada cop successiu{ $SP } +hud-skill-sw_dash_title = Ímpetu +hud-skill-sw_dash = Travessa als teus enemics! +hud-skill-sw_dash_dmg_title = Dany d'Ímpetu +hud-skill-sw_dash_dmg = Augmenta el dany inicial de l'Ímpetu un { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Drenatge d'Ímpetu +hud-skill-sw_dash_drain = Redueix la quantitat d'Energia que drenes durant l'Ímpetu un { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Cost d'Ímpetu +hud-skill-sw_dash_cost = Redueix el cost inicial de l'Ímpetu un { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Velocitat de l'Ímpetu +hud-skill-sw_dash_speed = Augmenta la teva velocitat durant l'Ímpetu un { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Carrega a través +hud-skill-sw_dash_charge_through = Et permet carregar a través dels primers enemics que t'hi trobis{ $SP } +hud-skill-sw_dash_scale_title = Dany Escalat Impetuós +hud-skill-sw_dash_scale = Augmenta el dany escalat de l'Ímpetu un { $boost }%{ $SP } +hud-skill-sw_spin_title = Desbloqueja Atac Espiral +hud-skill-sw_spin = Desbloqueja l'habilitat d'espasa Espiral{ $SP } +hud-skill-sw_spin_dmg_title = Dany d'Atac Espiral +hud-skill-sw_spin_dmg = Augmenta el dany fet un { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Velocitat d'Atac Espiral +hud-skill-sw_spin_spd = Augmenta la velocitat a la qual gires un { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Cost d'Atac Espiral +hud-skill-sw_spin_cost = Redueix l'Energia de cada gir un { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Gira i gira +hud-skill-sw_spin_spins = Augmenta el nombre de cops que pots girar{ $SP } +hud-skill-sw_interrupt_title = Interrompre Atacs +hud-skill-sw_interrupt = Et permet cancel·lar immediatament un atac amb un altre atac{ $SP } +hud-skill-axe_double_strike_title = Atac Doble +hud-skill-axe_double_strike = Fes xixines als enemics! +hud-skill-axe_double_strike_combo_title = Combo d'Atac Doble +hud-skill-axe_double_strike_combo = Desbloqueja un segon cop{ $SP } +hud-skill-axe_double_strike_damage_title = Dany de l'Atac Doble +hud-skill-axe_double_strike_damage = Augmenta el dany en cada cop successiu{ $SP } +hud-skill-axe_double_strike_speed_title = Velocitat de l'Atac Doble +hud-skill-axe_double_strike_speed = Augmenta la velocitat dels atacs en cada cop successiu{ $SP } +hud-skill-axe_double_strike_regen_title = Regeneració de l'Atac Doble +hud-skill-axe_double_strike_regen = Augmenta el guany d'Energia per cada cop successiu{ $SP } +hud-skill-axe_spin_title = Destral Espiral +hud-skill-axe_spin = Tot dona voltes... +hud-skill-axe_infinite_axe_spin_title = Destral Espiral Infinita +hud-skill-axe_infinite_axe_spin = Gira tants cops com et permeti la teva Energia{ $SP } +hud-skill-axe_spin_damage_title = Dany de Destral Espiral +hud-skill-axe_spin_damage = Augmenta el dany que fa cada gir un { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Destral Helicòpter +hud-skill-axe_spin_helicopter = Caus més lentament mentre dones voltes{ $SP } +hud-skill-axe_spin_speed_title = Velocitat de Destral Espiral +hud-skill-axe_spin_speed = Augmenta la velocitat de gir un { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Cost de Destral Espiral +hud-skill-axe_spin_cost = Redueix el cost energètic dels girs un { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Desbloqueja Salt Mortal +hud-skill-axe_unlock_leap = Desbloqueja el Salt Mortal{ $SP } +hud-skill-axe_leap_damage_title = Dany del Salt Mortal +hud-skill-axe_leap_damage = Augmenta el dany del Salt Mortal un { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Empenta del Salt Mortal +hud-skill-axe_leap_knockback = Augmenta l'empenta del Salt Mortal un { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Cost del Salt +hud-skill-axe_leap_cost = Redueix el cost energètic del Salt Mortal un { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Distància del Salt Mortal +hud-skill-axe_leap_distance = Augmenta la distància del Salt Mortal un { $boost }%{ $SP } +hud-skill-mining_title = Minar +hud-skill-pick_strike_title = Cop de Pic +hud-skill-pick_strike = Colpeja les roques amb el pic per a aconseguir minerals, gemmes i experiència +hud-skill-pick_strike_speed_title = Velocitat del Pic +hud-skill-pick_strike_speed = Mina roques més ràpidament{ $SP } +hud-skill-pick_strike_oregain_title = Mineria amb interessos +hud-skill-pick_strike_oregain = Probabilitat de guanyar mineral extra ({ $boost }% per level){ $SP } +hud-skill-pick_strike_gemgain_title = Joieria amb Interessos +hud-skill-pick_strike_gemgain = Probabilitat de guanyar gemmes extres ({ $boost }% per level){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/skills.ron b/assets/voxygen/i18n/ca_CA/hud/skills.ron deleted file mode 100644 index 05e562d59b..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.rank_up": "Nou Punt d'Habilitat", - "hud.skill.sp_available": "{number} PH disponibles", - "hud.skill.not_unlocked": "No desbloquejat", - "hud.skill.req_sp": "\n\nRequereix {number} PH", - // Skills - // General - "hud.skill.inc_health_title": "Augmentar Salut", - "hud.skill.inc_health": "Augmenta la Salut màxima en {boost}{SP}", - "hud.skill.inc_energy_title": "Augmentar Energia", - "hud.skill.inc_energy": "Augmenta l'Energia Màxima en {boost}{SP}", - "hud.skill.unlck_sword_title": "Desbloquejar Espasa", - "hud.skill.unlck_sword": "Desbloqueja l'arbre d'habilitats de l'espasa{SP}", - "hud.skill.unlck_axe_title": "Desbloquejar Destral", - "hud.skill.unlck_axe": "Desbloqueja l'arbre d'habilitats de la destral{SP}", - "hud.skill.unlck_hammer_title": "Desbloquejar Martell", - "hud.skill.unlck_hammer": "Desbloqueja l'arbre d'habilitats del martell{SP}", - "hud.skill.unlck_bow_title": "Desbloquejar Arc", - "hud.skill.unlck_bow": "Desbloqueja l'arbre d'habilitats de l'arc{SP}", - "hud.skill.unlck_staff_title": "Desbloquejar Bastó", - "hud.skill.unlck_staff": "Desbloqueja l'arbre d'habilitats del bastó{SP}", - "hud.skill.unlck_sceptre_title": "Desbloquejar Ceptre", - "hud.skill.unlck_sceptre": "Desbloqueja l'arbre d'habilitats del ceptre{SP}", - "hud.skill.dodge_title": "Esquivar", - "hud.skill.dodge": "Les tombarelles evasives s'activen fent clic al botó central del ratolí i ofereixen immunitat temporal als atacs físics mentre rodes.", - "hud.skill.roll_energy_title": "Cost Energètic de les Tombarelles", - "hud.skill.roll_energy": "Fer tombarelles utilitza {boost}% menys energia{SP}", - "hud.skill.roll_speed_title": "Velocitat de les Tombarelles", - "hud.skill.roll_speed": "Les tombarelles són un {boost}% més ràpides{SP}", - "hud.skill.roll_dur_title": "Durada de la Tombarella", - "hud.skill.roll_dur": "Les tombarelles duren un {boost}% més{SP}", - "hud.skill.climbing_title": "Escalar", - "hud.skill.climbing": "Salta des de llocs ben alts", - "hud.skill.climbing_cost_title": "Cost de l'Escalada", - "hud.skill.climbing_cost": "Escalar fa servir un {boost}% menys d'Energia{SP}", - "hud.skill.climbing_speed_title": "Velocitat d'Escalada", - "hud.skill.climbing_speed": "Escalar és un {boost}% més ràpid{SP}", - "hud.skill.swim_title": "Nadar", - "hud.skill.swim": "Sostenir-se i avançar dins l’aigua", - "hud.skill.swim_speed_title": "Velocitat de Natació", - "hud.skill.swim_speed": "Nades un {boost}% més ràpid{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Raig Drena-vida", - "hud.skill.sc_lifesteal": "Drena la vida dels teus enemics", - "hud.skill.sc_lifesteal_damage_title": "Dany", - "hud.skill.sc_lifesteal_damage": "Fes un {boost}% més de mal{SP}", - "hud.skill.sc_lifesteal_range_title": "Abast", - "hud.skill.sc_lifesteal_range": "El teu raig arriba un {boost}% més lluny{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Drena-vida", - "hud.skill.sc_lifesteal_lifesteal": "Converteix un {boost}% de dany addicional en Salut{SP}", - "hud.skill.sc_lifesteal_regen_title": "Regeneració Energètica", - "hud.skill.sc_lifesteal_regen": "Replena la teva Energia amb un {boost}% addicional{SP}", - "hud.skill.sc_heal_title": "Aura Sanadora", - "hud.skill.sc_heal": "Cura als teus aliats usant la sang dels teus enemics, requereix un combo per ser activat", - "hud.skill.sc_heal_heal_title": "Curació", - "hud.skill.sc_heal_heal": "Augmenta la capacitat de curar en un {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Cost Energètic", - "hud.skill.sc_heal_cost": "Curar requereix un {boost}% menys Energia{SP}", - "hud.skill.sc_heal_duration_title": "Durada", - "hud.skill.sc_heal_duration": "Els efectes de la teva aura sanadora duren un {boost}% més{SP}", - "hud.skill.sc_heal_range_title": "Radi", - "hud.skill.sc_heal_range": "La teva aura sanadora abasta un {boost}% més de distància{SP}", - "hud.skill.sc_wardaura_unlock_title": "Desbloquejar Aura Protectora", - "hud.skill.sc_wardaura_unlock": "Et permet protegir als teus aliats contra els atacs enemics{SP}", - "hud.skill.sc_wardaura_strength_title": "Força", - "hud.skill.sc_wardaura_strength": "La força de la teva protecció augmenta en un {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Durada", - "hud.skill.sc_wardaura_duration": "Els efectes de la teva protecció duren un {boost}% més temps{SP}", - "hud.skill.sc_wardaura_range_title": "Radi", - "hud.skill.sc_wardaura_range": "La teva protecció abasta un {boost}% més{SP}", - "hud.skill.sc_wardaura_cost_title": "Cost Energètic", - "hud.skill.sc_wardaura_cost": "Crear la protecció requereix un {boost}% menys d'Energia{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Abast de l'Ona de Xoc", - "hud.skill.st_shockwave_range" : "Llança coses que solien estar fora del teu abast. Abast augmentat un {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Cost de l'Ona de Xoc", - "hud.skill.st_shockwave_cost" : "Redueix el cost energètic per llençar aldeans innocents un {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Empenta de l'Ona de Xoc", - "hud.skill.st_shockwave_knockback" : "Augmenta la potència d'empenta de l'Ona de Xoc un {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Dany de l'Ona de Xoc", - "hud.skill.st_shockwave_damage" : "Augmenta el dany generat per l'Ona de Xoc un {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Desbloquejar Ona de Xoc", - "hud.skill.st_shockwave_unlock" : "Desbloqueja l'habilitat de llençar enemics fent servir foc{SP}", - "hud.skill.st_flamethrower_title" : "Llançaflames", - "hud.skill.st_flamethrower" : "Llança flames, cuina'ls a tots!", - "hud.skill.st_flame_velocity_title" : "Velocitat de les Flames", - "hud.skill.st_flame_velocity" : "El foc es mou més de pressa, concretament un {boost}% més{SP}", - "hud.skill.st_flamethrower_range_title" : "Abast del Llançaflames", - "hud.skill.st_flamethrower_range" : "Arriba on abans no podies, les flames arriben un {boost}% més lluny{SP}", - "hud.skill.st_energy_drain_title" : "Consum d'Energia", - "hud.skill.st_energy_drain" : "Redueix el consum d'Energia un {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Dany Llançaflames", - "hud.skill.st_flamethrower_damage" : "Augmenta el dany un {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Radi d'Explosió", - "hud.skill.st_explosion_radius" : "Quan més gran millor. Augmenta el radi de les explosions un {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Regeneració d'Energia", - "hud.skill.st_energy_regen" : "Augmenta la regeneració d'Energia un {boost}%{SP}", - "hud.skill.st_fireball_title" : "Bola de Foc", - "hud.skill.st_fireball" : "Dispara una bola de foc que explota en impactar", - "hud.skill.st_damage_title" : "Dany", - "hud.skill.st_damage" : "Augmenta el dany un {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Velocitat dels Projectils", - "hud.skill.bow_projectile_speed" : "Et permet disparar fletxes un {boost}% més ràpides{SP}", - "hud.skill.bow_charged_title" : "Tir Carregat", - "hud.skill.bow_charged" : "La concentració té la seva recompensa", - "hud.skill.bow_charged_damage_title" : "Dany Carregat", - "hud.skill.bow_charged_damage" : "Augmenta el dany un {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Regeneració Carregada", - "hud.skill.bow_charged_energy_regen" : "Augmenta l'Energia recuperada un {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Empenta de la Càrrega", - "hud.skill.bow_charged_knockback" : "Empenta als teus enemics un {boost}% més{SP}", - "hud.skill.bow_charged_speed_title" : "Velocitat Carregada", - "hud.skill.bow_charged_speed" : "Augmenta la velocitat a la qual carregues l'arc un {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Velocitat de Moviment en Carregar", - "hud.skill.bow_charged_move" : "Augmenta la velocitat a la qual et mous mentre carregues un atac un {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Repetidor", - "hud.skill.bow_repeater" : "Quan més dispares, més dispararàs", - "hud.skill.bow_repeater_damage_title" : "Dany del Repetidor", - "hud.skill.bow_repeater_damage" : "Augmenta el dany realitzat un {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Cost del Repetidor", - "hud.skill.bow_repeater_cost" : "Redueix el cost energètic per activar el repetidor un {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Velocitat del Repetidor", - "hud.skill.bow_repeater_speed" : "Augmenta el ritme al qual dispares fletxes un {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Desbloqueja Escopeta", - "hud.skill.bow_shotgun_unlock" : "Desbloqueja l'habilitat de disparar múltiples fletxes alhora{SP}", - "hud.skill.bow_shotgun_damage_title" : "Dany d'Escopeta", - "hud.skill.bow_shotgun_damage" : "Augmenta el dany fet per l'habilitat un {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Cost d'Escopeta", - "hud.skill.bow_shotgun_cost" : "Redueix el cost d'Escopeta un {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Nombre de Fletxes d'Escopeta", - "hud.skill.bow_shotgun_arrow_count" : "Augmenta el nombre de fletxes en cada ús en {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Difusió d'Escopeta", - "hud.skill.bow_shotgun_spread" : "Redueix la difusió de les fletxes un {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Radi del Salt en Picat", - "hud.skill.hmr_leap_radius" : "Augmenta el radi d'atac del cop a terra en {boost} metres{SP}", - "hud.skill.hmr_leap_distance_title" : "Distància del Salt en Picat", - "hud.skill.hmr_leap_distance" : "Augmenta la distància de l'habilitat Salt en Picat un {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Cost del Salt en Picat", - "hud.skill.hmr_leap_cost" : "Redueix el cost energètic del Salt en Picat un {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Empenta del Salt en Picat", - "hud.skill.hmr_leap_knockback" : "Augmenta l'empenta del Salt en Picat un {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Dany del Salt en Picat", - "hud.skill.hmr_leap_damage" : "Augmenta el dany del Salt en Picat un {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Desbloqueja Salt en Picat", - "hud.skill.hmr_unlock_leap" : "Desbloqueja l'habilitat Salt en Picat{SP}", - "hud.skill.hmr_charged_melee_title" : "Atac Carregat", - "hud.skill.hmr_charged_melee" : "L'atac de sempre ara carregat!", - "hud.skill.hmr_charged_rate_title" : "Velocitat de Càrrega", - "hud.skill.hmr_charged_rate" : "Augmenta la velocitat a la qual carregues el cop un {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Consum Energètic de l'Atac Carregat", - "hud.skill.hmr_charged_melee_nrg_drain" : "Redueix el cost energètic quan carregues un atac un {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Dany de l'Atac Carregat", - "hud.skill.hmr_charged_melee_damage" : "Augmenta el dany de l'Atac Carregat un {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Empenta de l'Atac Carregat", - "hud.skill.hmr_charged_melee_knockback" : "Augmenta massivament la potència de llançament de l'atac un {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Atac Individual", - "hud.skill.hmr_single_strike" : "Tan solitari com sou vós", - "hud.skill.hmr_single_strike_regen_title" : "Regeneració de l'Atac Individual", - "hud.skill.hmr_single_strike_regen" : "Augmenta el guany d'Energia per cada cop successiu{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Velocitat de l'Atac Individual", - "hud.skill.hmr_single_strike_speed" : "Augmenta la velocitat dels atacs per cada cop successiu{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Dany de l'Atac Individual", - "hud.skill.hmr_single_strike_damage" : "Augmenta el dany per cada cop successiu{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Empenta de l'Atac Individual", - "hud.skill.hmr_single_strike_knockback" : "Augmenta la potència de llançament dels atacs un {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Atac Triple", - "hud.skill.sw_trip_str": "Ataca fins a tres cops", - "hud.skill.sw_trip_str_combo_title": "Combo d'Atac Triple", - "hud.skill.sw_trip_str_combo": "Desbloqueja els combos de l'Atac Triple{SP}", - "hud.skill.sw_trip_str_dmg_title": "Dany de l'Atac Triple", - "hud.skill.sw_trip_str_dmg": "Augmenta el dany per cada cop successiu{SP}", - "hud.skill.sw_trip_str_sp_title": "Velocitat de l'Atac Triple", - "hud.skill.sw_trip_str_sp": "Augmenta la velocitat d'atac per cada cop successiu{SP}", - "hud.skill.sw_trip_str_reg_title": "Regeneració d'Atac Triple", - "hud.skill.sw_trip_str_reg": "Augmenta la regeneració d'Energia per cada cop successiu{SP}", - "hud.skill.sw_dash_title": "Ímpetu", - "hud.skill.sw_dash": "Travessa als teus enemics!", - "hud.skill.sw_dash_dmg_title": "Dany d'Ímpetu", - "hud.skill.sw_dash_dmg": "Augmenta el dany inicial de l'Ímpetu un {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Drenatge d'Ímpetu", - "hud.skill.sw_dash_drain": "Redueix la quantitat d'Energia que drenes durant l'Ímpetu un {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Cost d'Ímpetu", - "hud.skill.sw_dash_cost": "Redueix el cost inicial de l'Ímpetu un {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Velocitat de l'Ímpetu", - "hud.skill.sw_dash_speed": "Augmenta la teva velocitat durant l'Ímpetu un {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Carrega a través", - "hud.skill.sw_dash_charge_through": "Et permet carregar a través dels primers enemics que t'hi trobis{SP}", - "hud.skill.sw_dash_scale_title": "Dany Escalat Impetuós", - "hud.skill.sw_dash_scale": "Augmenta el dany escalat de l'Ímpetu un {boost}%{SP}", - "hud.skill.sw_spin_title": "Desbloqueja Atac Espiral", - "hud.skill.sw_spin": "Desbloqueja l'habilitat d'espasa Espiral{SP}", - "hud.skill.sw_spin_dmg_title": "Dany d'Atac Espiral", - "hud.skill.sw_spin_dmg": "Augmenta el dany fet un {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Velocitat d'Atac Espiral", - "hud.skill.sw_spin_spd": "Augmenta la velocitat a la qual gires un {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Cost d'Atac Espiral", - "hud.skill.sw_spin_cost": "Redueix l'Energia de cada gir un {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Gira i gira", - "hud.skill.sw_spin_spins": "Augmenta el nombre de cops que pots girar{SP}", - "hud.skill.sw_interrupt_title": "Interrompre Atacs", - "hud.skill.sw_interrupt": "Et permet cancel·lar immediatament un atac amb un altre atac{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Atac Doble", - "hud.skill.axe_double_strike": "Fes xixines als enemics!", - "hud.skill.axe_double_strike_combo_title": "Combo d'Atac Doble", - "hud.skill.axe_double_strike_combo": "Desbloqueja un segon cop{SP}", - "hud.skill.axe_double_strike_damage_title": "Dany de l'Atac Doble", - "hud.skill.axe_double_strike_damage": "Augmenta el dany en cada cop successiu{SP}", - "hud.skill.axe_double_strike_speed_title": "Velocitat de l'Atac Doble", - "hud.skill.axe_double_strike_speed": "Augmenta la velocitat dels atacs en cada cop successiu{SP}", - "hud.skill.axe_double_strike_regen_title": "Regeneració de l'Atac Doble", - "hud.skill.axe_double_strike_regen": "Augmenta el guany d'Energia per cada cop successiu{SP}", - "hud.skill.axe_spin_title": "Destral Espiral", - "hud.skill.axe_spin": "Tot dona voltes...", - "hud.skill.axe_infinite_axe_spin_title": "Destral Espiral Infinita", - "hud.skill.axe_infinite_axe_spin": "Gira tants cops com et permeti la teva Energia{SP}", - "hud.skill.axe_spin_damage_title": "Dany de Destral Espiral", - "hud.skill.axe_spin_damage": "Augmenta el dany que fa cada gir un {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Destral Helicòpter", - "hud.skill.axe_spin_helicopter": "Caus més lentament mentre dones voltes{SP}", - "hud.skill.axe_spin_speed_title": "Velocitat de Destral Espiral", - "hud.skill.axe_spin_speed": "Augmenta la velocitat de gir un {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Cost de Destral Espiral", - "hud.skill.axe_spin_cost": "Redueix el cost energètic dels girs un {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Desbloqueja Salt Mortal", - "hud.skill.axe_unlock_leap": "Desbloqueja el Salt Mortal{SP}", - "hud.skill.axe_leap_damage_title": "Dany del Salt Mortal", - "hud.skill.axe_leap_damage": "Augmenta el dany del Salt Mortal un {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Empenta del Salt Mortal", - "hud.skill.axe_leap_knockback": "Augmenta l'empenta del Salt Mortal un {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Cost del Salt", - "hud.skill.axe_leap_cost": "Redueix el cost energètic del Salt Mortal un {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Distància del Salt Mortal", - "hud.skill.axe_leap_distance": "Augmenta la distància del Salt Mortal un {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Minar", - "hud.skill.pick_strike_title": "Cop de Pic", - "hud.skill.pick_strike": "Colpeja les roques amb el pic per a aconseguir minerals, gemmes i experiència", - "hud.skill.pick_strike_speed_title": "Velocitat del Pic", - "hud.skill.pick_strike_speed": "Mina roques més ràpidament{SP}", - "hud.skill.pick_strike_oregain_title": "Mineria amb interessos", - "hud.skill.pick_strike_oregain": "Probabilitat de guanyar mineral extra ({boost}% per level){SP}", - "hud.skill.pick_strike_gemgain_title": "Joieria amb Interessos", - "hud.skill.pick_strike_gemgain": "Probabilitat de guanyar gemmes extres ({boost}% per level){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/hud/social.ftl b/assets/voxygen/i18n/ca_CA/hud/social.ftl new file mode 100644 index 0000000000..7655e3af86 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Altres Jugadors +hud-social-online = Connectats: +hud-social-friends = Amics +hud-social-not_yet_available = Encara no disponible +hud-social-faction = Facció +hud-social-play_online_fmt = { $nb_player } jugador(s) connectats +hud-social-name = Nom +hud-social-level = Nivell +hud-social-zone = Zona +hud-social-account = Compte \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/social.ron b/assets/voxygen/i18n/ca_CA/hud/social.ron deleted file mode 100644 index 402a95f0a0..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.social": "Altres Jugadors", - "hud.social.online": "Connectats:", - "hud.social.friends": "Amics", - "hud.social.not_yet_available": "Encara no disponible", - "hud.social.faction": "Facció", - "hud.social.play_online_fmt": "{nb_player} jugador(s) connectats", - "hud.social.name": "Nom", - "hud.social.level": "Nivell", - "hud.social.zone": "Zona", - "hud.social.account": "Compte", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ca_CA/hud/trade.ftl b/assets/voxygen/i18n/ca_CA/hud/trade.ftl new file mode 100644 index 0000000000..de697edb03 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Comerç +hud-trade-phase1_description = + Arrossega els objectes amb què vulguis comerciar + a l'àrea corresponent. +hud-trade-phase2_description = + L'intercanvi està ara blocat per donar-te + temps per revisar-lo. +hud-trade-phase3_description = L'intercanvi s'està processant. +hud-trade-persons_offer = Oferta de { $playername } +hud-trade-has_accepted = + { $playername } + ha acceptat +hud-trade-accept = Acceptar +hud-trade-decline = Refusar +hud-trade-invite_sent = Petició de Comerç enviada a { $playername }. +hud-trade-result-completed = Intercanvi completat amb èxit. +hud-trade-result-declined = Intercanvi refusat. +hud-trade-result-nospace = Espai insuficient per completar l'intercanvi. +hud-trade-buy_price = Preu de Compra +hud-trade-sell_price = Preu de Venda +hud-trade-coin = Diner(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = La teva oferta +hud-trade-their_offer = La seva oferta +hud-trade-amount_input = Tria un objecte \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/hud/trade.ron b/assets/voxygen/i18n/ca_CA/hud/trade.ron deleted file mode 100644 index d8a9efd351..0000000000 --- a/assets/voxygen/i18n/ca_CA/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - "hud.trade.trade_window": "Comerç", - "hud.trade.phase1_description": "Arrossega els objectes amb què vulguis comerciar\n a l'àrea corresponent.", - "hud.trade.phase2_description": "L'intercanvi està ara blocat per donar-te\n temps per revisar-lo.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "L'intercanvi s'està processant.", - "hud.trade.persons_offer": "Oferta de {playername}", // force update - "hud.trade.has_accepted": "{playername}\nha acceptat", - "hud.trade.accept": "Acceptar", - "hud.trade.decline": "Refusar", - "hud.trade.invite_sent": "Petició de Comerç enviada a {playername}.", - "hud.trade.result.completed": "Intercanvi completat amb èxit.", - "hud.trade.result.declined": "Intercanvi refusat.", - "hud.trade.result.nospace": "Espai insuficient per completar l'intercanvi.", - "hud.trade.buy_price": "Preu de Compra", // force update - "hud.trade.sell_price": "Preu de Venda", - "hud.trade.coin": "Diner(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "La teva oferta", - "hud.trade.their_offer": "La seva oferta", - "hud.trade.amount_input": "Tria un objecte" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ca_CA/main.ftl b/assets/voxygen/i18n/ca_CA/main.ftl new file mode 100644 index 0000000000..3e6a08ac03 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/main.ftl @@ -0,0 +1,95 @@ +main-username = Nom d'Usuari +main-server = Servidor +main-password = Contrasenya +main-connecting = Connectant +main-creating_world = Creant món +main-tip = Consell: +main-unbound_key_tip = deslligar +main-notice = + Benvingut a la versió alfa de Veloren! + + Abans de començar a divertir-te, si us plau tingues les següents coses en ment: + + - Aquesta és una versió alfa molt recent. Espera errors, jugabilitat extremadament inacabada, mecàniques per polir i manca d'elements. + + - Si tens algun feedback constructiu o vols reportar un error, pot posar-te en contacte amb nosaltres mitjançant Reddit, GitLab, o el nostre servidor de Discord. + + - Veloren està llicenciat sota una llicència de codi obert GPL 3. Això significa que ets lliure de jugar, modificar, i redistribuir el joc de la manera + que desitges (sempre que aquest producte derivat es trobi sota una llicència GPL 3). + + - Veloren és un projecte comunitari sense ànim de lucre i tothom qui hi treballa en ell és un voluntari. + Si t'agrada el que hi veus, ets benvingut a unir-te a l'equip de desenvolupament o artístic! + + Gràcies per prendre't el temps per llegir aquest avís, esperem que gaudeixis del joc! + + ~ Els Desenvolupadors de Veloren +main-login_process = + Informació sobre el procés d'Inici de Sessió: + + Si us plau, tingues en compte que necessites un compte + per jugar a servidors amb autentificació activada. + + Pots crear un compte a + + https://veloren.net/account/. +main-login-server_not_found = No s'ha trobat el Servidor +main-login-authentication_error = Error d'Autentificació al Servidor +main-login-internal_error = Error intern en el client (probablement el personatge del jugador ha estat esborrat) +main-login-failed_auth_server_url_invalid = No s'ha pogut connectar al Servidor d'Autentificació +main-login-insecure_auth_scheme = L'esquema d'autentificació HTTP NO és suportat. És insegur! Per al desenvolupament, HTTP està permès per a l'ordinador local (localhost) o versions de depuració +main-login-server_full = El Servidor és ple +main-login-untrusted_auth_server = Servidor d'Autentificació poc fiable +main-login-outdated_client_or_server = ServerEmbogit: Probablement les versions són incompatibles, comprova si hi ha actualitzacions. +main-login-timeout = Fora de Temps: el Servidor no ha donat resposta a temps. (Sobrecàrrega o problemes de xarxa). +main-login-server_shut_down = Servidor Apagat +main-login-network_error = Error de Xarxa +main-login-network_wrong_version = La versió del servidor i la del client no coincideixen, si us plau actualitzeu el vostre joc. +main-login-failed_sending_request = La petició al servidor d'autentificació ha fallat +main-login-invalid_character = El personatge seleccionat no és vàlid +main-login-client_crashed = El client s'ha tancat inesperadament +main-login-not_on_whitelist = Necessites l'aprovació d'un Administrador per entrar +main-login-banned = Se t'ha vetat l'entrada pel següent motiu +main-login-kicked = Se t'ha expulsat pel següent motiu +main-login-select_language = Selecciona Idioma +main-login-client_version = Versió del Client +main-login-server_version = Versió del Servidor +main-login-client_init_failed = El client ha fallat a inicialitzar: { $init_fail_reason } +main-login-username_bad_characters = El nom d'usuari conté caracters invàlids! (Sols s'accepta alfanumèric, '_' i '-') +main-login-username_too_long = El nom d'usuari és massa llarg! El tamany màxim és: { $max_len } +main-servers-select_server = Selecciona un Servidor +main-servers-singleplayer_error = No s'ha pogut connectar al servidor intern: { $sp_error } +main-servers-network_error = Error de la xarxa/connexió del servidor: { $raw_error } +main-servers-participant_error = Error de desconnexió/protocol del Participant: { $raw_error } +main-servers-stream_error = Error de la connexió/compressió/(de)serialització del Client: { $raw_error } +main-servers-database_error = Error de la base de dades del servidor: { $raw_error } +main-servers-persistence_error = Error persistent del servidor (Probablement relacionat amb les Dades dels Recursos/Personatges): { $raw_error } +main-servers-other_error = Error general del servidor: { $raw_error } +main-credits = Credits +main-credits-created_by = creat per +main-credits-music = Música +main-credits-fonts = Fonts +main-credits-other_art = Altres Arts +main-credits-contributors = Contribuïdors +loading-tips = + .a0 = Prem '{ $gameinput-togglelantern }' per encendre la llanterna. + .a1 = Prem '{ $gameinput-help }' per veure controls del teclat per defecte. + .a2 = Pots escriure /say o /s per a parlar sols amb jugadors directament al teu voltant. + .a3 = Pots escriure /region o /r per a parlar sols amb jugadors a uns quants centenars de blocs de tu. + .a4 = Els Administradors poden usar el comandament /build per a entrar en el mode construcció. + .a5 = Pots escriure /group o /g per a parlar sols amb els jugadors del teu grup actual. + .a6 = Per a enviar missatges privats, escriu /tell tot seguit del nom del jugador i el teu missatge. + .a7 = Estigues sempre alerta i busca menjar, baguls i altres tresors repartits arreu del món! + .a8 = Tens la bossa plena de menjar? Intenta cuinar menjar encara millor amb ell! + .a9 = Et preguntes que hi ha per fer? Prova una de les masmorres marcades al mapa! + .a10 = No te n'oblidis d'ajustar els gràfics del teu sistema. Prem '{ $gameinput-settings }' per obrir les opcions. + .a11 = Jugar amb altres jugadors és divertit! Prem '{ $gameinput-social }' per veure qui és connectat. + .a12 = Prem '{ $gameinput-dance }' per ballar. Que comenci la festa! + .a13 = Prem '{ $gameinput-glide }' per obrir el teu planador i conquerir els cels! + .a14 = Veloren roman encara en estat pre-Alfa. Estem fent tot el possible per millorar-lo cada dia! + .a15 = Si vols unir-te a l'equip de desenvolupadors o sols xarrar amb nosaltres, uneix-te al nostre servidor de Discord. + .a16 = Pots tirar si mostrar la teva quantitat de salut a la barra de salut o no des de les opcions. + .a17 = Seu prop d'una foguera (prement '{ $gameinput-sit }') i recuperaràs salut lentament. + .a18 = Necessites més bosses o millor armadura per continuar el teu viatge? Prem '{ $gameinput-crafting }' per obrir el menú d'elaboració! + .a19 = Prem '{ $gameinput-roll }' per fer tombarelles. Fer tombarelles es pot fer servir per moure's més ràpid i per esquivar els atacs dels enemics. + .a20 = Et preguntes per a què serveix algun objecte? Busca 'input:' en elaboració per veure quines receptes el fan servir. + .a21 = Has trobat alguna cosa interessant? Fes una fotografia amb '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/main.ron b/assets/voxygen/i18n/ca_CA/main.ron deleted file mode 100644 index bc661e8ee1..0000000000 --- a/assets/voxygen/i18n/ca_CA/main.ron +++ /dev/null @@ -1,115 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - /// Start Main screen section - "main.username": "Nom d'Usuari", - "main.server": "Servidor", - "main.password": "Contrasenya", - "main.connecting": "Connectant", - "main.creating_world": "Creant món", - "main.tip": "Consell:", - "main.unbound_key_tip": "deslligar", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Benvingut a la versió alfa de Veloren! - -Abans de començar a divertir-te, si us plau tingues les següents coses en ment: - -- Aquesta és una versió alfa molt recent. Espera errors, jugabilitat extremadament inacabada, mecàniques per polir i manca d'elements. - -- Si tens algun feedback constructiu o vols reportar un error, pot posar-te en contacte amb nosaltres mitjançant Reddit, GitLab, o el nostre servidor de Discord. - -- Veloren està llicenciat sota una llicència de codi obert GPL 3. Això significa que ets lliure de jugar, modificar, i redistribuir el joc de la manera - que desitges (sempre que aquest producte derivat es trobi sota una llicència GPL 3). - -- Veloren és un projecte comunitari sense ànim de lucre i tothom qui hi treballa en ell és un voluntari. -Si t'agrada el que hi veus, ets benvingut a unir-te a l'equip de desenvolupament o artístic! - -Gràcies per prendre't el temps per llegir aquest avís, esperem que gaudeixis del joc! - -~ Els Desenvolupadors de Veloren"#, - - // Login process description - "main.login_process": r#"Informació sobre el procés d'Inici de Sessió: - -Si us plau, tingues en compte que necessites un compte -per jugar a servidors amb autentificació activada. - -Pots crear un compte a - -https://veloren.net/account/."#, - "main.login.server_not_found": "No s'ha trobat el Servidor", - "main.login.authentication_error": "Error d'Autentificació al Servidor", - "main.login.internal_error": "Error intern en el client (probablement el personatge del jugador ha estat esborrat)", - "main.login.failed_auth_server_url_invalid": "No s'ha pogut connectar al Servidor d'Autentificació", - "main.login.insecure_auth_scheme": "L'esquema d'autentificació HTTP NO és suportat. És insegur! Per al desenvolupament, HTTP està permès per a l'ordinador local (localhost) o versions de depuració", - "main.login.server_full": "El Servidor és ple", - "main.login.untrusted_auth_server": "Servidor d'Autentificació poc fiable", - "main.login.outdated_client_or_server": "ServerEmbogit: Probablement les versions són incompatibles, comprova si hi ha actualitzacions.", - "main.login.timeout": "Fora de Temps: el Servidor no ha donat resposta a temps. (Sobrecàrrega o problemes de xarxa).", - "main.login.server_shut_down": "Servidor Apagat", - "main.login.network_error": "Error de Xarxa", - "main.login.network_wrong_version": "La versió del servidor i la del client no coincideixen, si us plau actualitzeu el vostre joc.", - "main.login.failed_sending_request": "La petició al servidor d'autentificació ha fallat", - "main.login.invalid_character": "El personatge seleccionat no és vàlid", - "main.login.client_crashed": "El client s'ha tancat inesperadament", - "main.login.not_on_whitelist": "Necessites l'aprovació d'un Administrador per entrar", - "main.login.banned": "Se t'ha vetat l'entrada pel següent motiu", - "main.login.kicked": "Se t'ha expulsat pel següent motiu", - "main.login.select_language": "Selecciona Idioma", - "main.login.client_version": "Versió del Client", - "main.login.server_version": "Versió del Servidor", - "main.login.client_init_failed": "El client ha fallat a inicialitzar: {init_fail_reason}", - "main.login.username_bad_characters": "El nom d'usuari conté caracters invàlids! (Sols s'accepta alfanumèric, '_' i '-')", - "main.login.username_too_long": "El nom d'usuari és massa llarg! El tamany màxim és: {max_len}", - "main.servers.select_server": "Selecciona un Servidor", - "main.servers.singleplayer_error": "No s'ha pogut connectar al servidor intern: {sp_error}", - "main.servers.network_error": "Error de la xarxa/connexió del servidor: {raw_error}", - "main.servers.participant_error": "Error de desconnexió/protocol del Participant: {raw_error}", - "main.servers.stream_error": "Error de la connexió/compressió/(de)serialització del Client: {raw_error}", - "main.servers.database_error": "Error de la base de dades del servidor: {raw_error}", - "main.servers.persistence_error": "Error persistent del servidor (Probablement relacionat amb les Dades dels Recursos/Personatges): {raw_error}", - "main.servers.other_error": "Error general del servidor: {raw_error}", - - // Credits screen - "main.credits": "Credits", - "main.credits.created_by": "creat per", - "main.credits.music": "Música", - "main.credits.fonts": "Fonts", - "main.credits.other_art": "Altres Arts", - "main.credits.contributors": "Contribuïdors", - - /// End Main screen section - }, - - - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "Prem '{gameinput.togglelantern}' per encendre la llanterna.", - "Prem '{gameinput.help}' per veure controls del teclat per defecte.", - "Pots escriure /say o /s per a parlar sols amb jugadors directament al teu voltant.", - "Pots escriure /region o /r per a parlar sols amb jugadors a uns quants centenars de blocs de tu.", - "Els Administradors poden usar el comandament /build per a entrar en el mode construcció.", - "Pots escriure /group o /g per a parlar sols amb els jugadors del teu grup actual.", - "Per a enviar missatges privats, escriu /tell tot seguit del nom del jugador i el teu missatge.", - "Estigues sempre alerta i busca menjar, baguls i altres tresors repartits arreu del món!", - "Tens la bossa plena de menjar? Intenta cuinar menjar encara millor amb ell!", - "Et preguntes que hi ha per fer? Prova una de les masmorres marcades al mapa!", - "No te n'oblidis d'ajustar els gràfics del teu sistema. Prem '{gameinput.settings}' per obrir les opcions.", - "Jugar amb altres jugadors és divertit! Prem '{gameinput.social}' per veure qui és connectat.", - "Prem '{gameinput.dance}' per ballar. Que comenci la festa!", - "Prem '{gameinput.glide}' per obrir el teu planador i conquerir els cels!", - "Veloren roman encara en estat pre-Alfa. Estem fent tot el possible per millorar-lo cada dia!", - "Si vols unir-te a l'equip de desenvolupadors o sols xarrar amb nosaltres, uneix-te al nostre servidor de Discord.", - "Pots tirar si mostrar la teva quantitat de salut a la barra de salut o no des de les opcions.", - "Seu prop d'una foguera (prement '{gameinput.sit}') i recuperaràs salut lentament.", - "Necessites més bosses o millor armadura per continuar el teu viatge? Prem '{gameinput.crafting}' per obrir el menú d'elaboració!", - "Prem '{gameinput.roll}' per fer tombarelles. Fer tombarelles es pot fer servir per moure's més ràpid i per esquivar els atacs dels enemics.", - "Et preguntes per a què serveix algun objecte? Busca 'input:' en elaboració per veure quines receptes el fan servir.", - "Has trobat alguna cosa interessant? Fes una fotografia amb '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/ca_CA/npc.ftl b/assets/voxygen/i18n/ca_CA/npc.ftl new file mode 100644 index 0000000000..7c8cef0d89 --- /dev/null +++ b/assets/voxygen/i18n/ca_CA/npc.ftl @@ -0,0 +1,210 @@ +npc-speech-villager = + .a0 = M'encanta el formatge. +npc-speech-villager_open = + .a0 = Em pregunto que pensa el Catoblepas quan menja gespa. + .a1 = Què creus que fa brillar les Restes Brillants? + .a2 = Alguna vegada has sentit parlar dels ferotges Taurons Terrestres? He sentit que viuen als deserts. + .a3 = Em pregunto què hi ha a l'altre costat de les muntanyes. + .a4 = He deixat una mica de formatge amb el meu germà i ara no sé si realment existeix o no. Jo l'anomeno el formatge de Schrödinger. + .a5 = Alguna vegada has enxampat una cuca de llum? + .a6 = Diuen que pots trobar joies brillants de tot tipus a les coves. + .a7 = Encara no entenc d'on segueixen venint aquests Sauroks. +npc-speech-villager_adventurous = + .a0 = Tant de bo faci el meu propi planador algun dia. + .a1 = M'agradaria endinsar-me en una cova quan sigui més fort. +npc-speech-villager_closed = + .a0 = Tu no ets de per aquí, veritat? + .a1 = No creus que la nostra aldea és la millor? + .a2 = Diuen que els bolets són bons per la salut, tot i que mai els he tastat. + .a3 = Ser, o no ser? Bé, jo crec que seré un pagès. +npc-speech-villager_conscientious = + .a0 = Em mantinc ocupat. Sempre hi ha alguna cosa a fer. + .a1 = Espero que plogui prompte, seria bo per als camps. +npc-speech-villager_busybody = + .a0 = La gent hauria de parlar menys i treballar més. +npc-speech-villager_unconscientious = + .a0 = Crec que és el moment d'un segon desdejuni! + .a1 = M'agradaria que ma casa no fos un desastre, però aleshores hauria de ser més ordenat! Haha! + .a2 = I ara, on he deixat allò... +npc-speech-villager_extroverted = + .a0 = No creuràs el que he fet aquest cap de setmana! + .a1 = Et desitjo el millor dels dies! + .a2 = Que n'opines d'aquest temps? + .a3 = Estic gruyère pel formatge! + .a4 = No te n'oblides les galetetes salades! + .a5 = Senzillament, m'encanta el formatge dels nans. Tant de bo pogués fer-lo. + .a6 = Vaig tenir un somni meravellós sobre formatges l'altra nit. Què significarà? + .a7 = M'encanta la mel!... Però odio les abelles. +npc-speech-villager_sociable = + .a0 = No voldries passar a dins? Estem a punt de menjar un poc de formatge! + .a1 = T'agradaria veure el meu jardí? D'acord, potser en un altre moment. +npc-speech-villager_introverted = + .a0 = Hola. + .a1 = Ah, jo? No sóc gens especial. +npc-speech-villager_agreeable = + .a0 = Com estàs avui? + .a1 = Avisa'm si necessites qualsevol cosa. + .a2 = Has vist el meu gat? +npc-speech-villager_worried = + .a0 = Ves amb compte, hi ha molts perills allà fora. +npc-speech-villager_disagreeable = + .a0 = Sempre dic el que penso, i si a la gent no li agrada que se'n fotin. + .a1 = La gent s'ofèn per res. +npc-speech-villager_neurotic = + .a0 = Pensar en les masmorres em fa por. Voldria que algú se n'encarregués d'elles. + .a1 = Algú hauria de fer alguna cosa amb aquests sectaris. Algú que no sigui jo, si fos possible. + .a2 = Tinc la sensació que alguna cosa dolenta ocorrerà. + .a3 = M'agradaria que algú mantingués als llops lluny de l'aldea. +npc-speech-villager_sad_loner = + .a0 = Em sento molt sol. + .a1 = ... Disculpa aquest silenci incòmode. No tinc traça per a la gent. +npc-speech-villager_seeker = + .a0 = Voldria veure el món algun dia. Ha d'haver-hi alguna altra cosa a la vida més enllà d'aquesta aldea. +npc-speech-villager_stable = + .a0 = No fa un dia meravellós? + .a1 = La vida no és tan dolenta. + .a2 = Fa un dia meravellós per passejar pel bosc! +npc-speech-villager_decline_trade = + .a0 = Em sap greu, no tinc res per comerciar. + .a1 = Comerciar? Com si jo tingués alguna cosa que et pogués interessar. + .a2 = Ma casa és meva i no te la vendré per res del món. +npc-speech-merchant_advertisement = + .a0 = Li interessaria comerciar amb alguna cosa? + .a1 = Voldria comerciar amb mi? + .a2 = Tinc molts béns, li agradaria donar una ullada? +npc-speech-merchant_busy = + .a0 = Si us plau, esperi. Sols soc una persona. + .a1 = Un moment, deixi'm acabar. + .a2 = Estic ocupat, torni més tard. +npc-speech-merchant_busy_rude = + .a0 = Eh! Esperi el seu torn. + .a1 = No veu a l'altra persona davant seu? + .a2 = No es coli. +npc-speech-merchant_trade_successful = + .a0 = Gràcies per comerciar amb mi! + .a1 = Gràcies! +npc-speech-merchant_trade_declined = + .a0 = Potser en un altre moment, que tingui un bon dia! + .a1 = Quina llàstima, potser la pròxima vegada! +npc-speech-villager_cultist_alarm = + .a0 = Guaita! Hi ha un sectari solt! + .a1 = A les armes! Els sectaris estan atacant! + .a2 = Com s'atreveixen els sectaris a atacar la nostra aldea?! + .a3 = Mort als sectaris! + .a4 = No tolerarem als sectaris aquí! + .a5 = Sectaris assassins! + .a6 = Tasta la fulla de la meva espasa, maleït sectari! + .a7 = Res podrà rentar la sang de les teves mans, sectari! + .a8 = Per tots els dimonis! Un sectari entre nosaltres! + .a9 = La maldat d'aquest sectari està a punt d'acabar! + .a10 = Aquest sectari és meu! + .a11 = Prepara't per conèixer el teu creador, maleït sectari! + .a12 = Veig un sectari! Enxampeu-lo! + .a13 = Veig un sectari! Ataqueu! + .a14 = Veig un sectari! No el deixeu escapar! + .a15 = Li abelliria al molt honorable sectari una mica de MORT?! + .a16 = Ni oblit, ni perdó! Sectaris, penediu-vos! + .a17 = Mor, sectari! + .a18 = El vostre regnat del terror acabarà! + .a19 = Açò és per tot el que heu fet! + .a20 = No ens agraden els de la vostra classe per aquí. + .a21 = Hauríeu d'haver-vos quedat sota terra! +npc-speech-villager_under_attack = + .a0 = Ajuda, m'ataquen! + .a1 = Ajuda! M'ataquen! + .a2 = Ai! M'ataquen! + .a3 = Ai! M'ataquen! Ajuda! + .a4 = Ajudeu-me! M'ataquen! + .a5 = M'ataquen! Ajuda! + .a6 = M'ataquen! Ajudeu-me! + .a7 = Ajuda! + .a8 = Ajuda! Ajuda! + .a9 = Ajuda! Ajuda! Ajuda! + .a10 = M'ataquen! + .a11 = AAAHHH! M'ataquen! + .a12 = AAAHHH! M'ataquen! Ajuda! + .a13 = Ajuda! Ens ataquen! + .a14 = Ajuda! Assassí! + .a15 = Ajuda! Hi ha un assassí solt! + .a16 = Ajuda! Pretenen matar-me! + .a17 = Guàrdies, m'ataquen! + .a18 = Guàrdies! M'ataquen! + .a19 = M'ataquen! Guàrdies! + .a20 = Ajuda! Guàrdies! M'ataquen! + .a21 = Guàrdies! Veniu de pressa! + .a22 = Guàrdies! Guàrdies! + .a23 = Guàrdies! Un vilà m'ataca! + .a24 = Guàrdies, mateu a aquest infame vilà! + .a25 = Guàrdies! Un assassí! + .a26 = Guàrdies! Ajudeu-me! + .a27 = No te'n sortiràs d'aquesta! Guàrdies! + .a28 = Malvat! + .a29 = Ajudeu-me! + .a30 = Ajuda! Si us plau! + .a31 = Ai! Guàrdies! Ajuda! + .a32 = Venen per mi! + .a33 = Ajuda! Ajuda! Estic sent reprimit! + .a34 = Ah, ara veiem la violència inherent al sistema. + .a35 = Sols ha estat una esgarrapada! + .a36 = Para! + .a37 = Però que t'he fet jo a tu?! + .a38 = Si us plau, deixi d'atacar-me! + .a39 = Eh! Vigila a qui punxes amb això! + .a40 = Desgraciat miserable, fot el camp! + .a41 = Para! Fuig! + .a42 = M'estàs empipant! + .a43 = Eh! Qui et penses que ets?! + .a44 = Això et costarà el cap! + .a45 = Para, si us plau! No duc res de valor! + .a46 = Enviaré al meu germà per tu, és molt més gran que jo! + .a47 = Nooo, li ho diré a la mare! + .a48 = Maleït siguis! + .a49 = Si us plau, no facis això. + .a50 = Això no ha sigut molt amable! + .a51 = D'acord, la teva arma funciona, ara aparta-la! + .a52 = Perdona'm la vida! + .a53 = Pietat, jo tinc dos fills i una esposa! + .a54 = Soc massa jove per morir! + .a55 = Espera, podem parlar-ho? + .a56 = La violència mai és la solució! + .a57 = Sembla que avui serà un dia força dolent... + .a58 = Eh, això m'ha fet mal! + .a59 = Agh! + .a60 = Quin maleducat! + .a61 = Para, t'ho suplico! + .a62 = Espero que agafes la pigota! + .a63 = Açò no és gens divertit. + .a64 = Com t'atreveixes?! + .a65 = Pagaràs per això! + .a66 = Embeina l'arma o ho lamentaràs! + .a67 = No m'obliguis a fer-te mal! + .a68 = Ha d'haver-hi hagut algun malentès! + .a69 = No cal que facis açò! + .a70 = Fuig, malvat! + .a71 = Això ha fet mal! + .a72 = Per què has fet això? + .a73 = Per tots els esperits, cessa! + .a74 = Has d'haver-me confós amb algú altre! + .a75 = No em mereixo açò! + .a76 = Si us plau, no ho tornis a fer. + .a77 = Guàrdies, llanceu aquest monstre al llac! + .a78 = Descarregaré la meva fúria sobre tu! + .a79 = Per què a miiiiii? +npc-speech-villager_enemy_killed = + .a0 = He destruït al meu enemic! + .a1 = Pau per fi! + .a2 = I ara... què estava jo fent? +npc-speech-menacing = + .a0 = T'ho adverteixo! + .a1 = Un pas més i t'atacaré! + .a2 = No em fas gens de por! + .a3 = Fora d'aquí! + .a4 = Ves-te'n si vols viure! + .a5 = No ets benvingut aquí! +npc-speech-cultist_low_health_fleeing = + .a0 = Retireu-vos per lluitar un altre dia! + .a1 = Retirada! + .a2 = Maleït siguis! + .a3 = Et maleiré des del més enllà! + .a4 = He de descansar! + .a5 = Són massa forts! \ No newline at end of file diff --git a/assets/voxygen/i18n/ca_CA/npc.ron b/assets/voxygen/i18n/ca_CA/npc.ron deleted file mode 100644 index 6f192bdd80..0000000000 --- a/assets/voxygen/i18n/ca_CA/npc.ron +++ /dev/null @@ -1,248 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "M'encanta el formatge.", - ], - "npc.speech.villager_open": [ - "Em pregunto que pensa el Catoblepas quan menja gespa.", - "Què creus que fa brillar les Restes Brillants?", - "Alguna vegada has sentit parlar dels ferotges Taurons Terrestres? He sentit que viuen als deserts.", - "Em pregunto què hi ha a l'altre costat de les muntanyes.", - "He deixat una mica de formatge amb el meu germà i ara no sé si realment existeix o no. Jo l'anomeno el formatge de Schrödinger.", - "Alguna vegada has enxampat una cuca de llum?", - "Diuen que pots trobar joies brillants de tot tipus a les coves.", - "Encara no entenc d'on segueixen venint aquests Sauroks.", - ], - "npc.speech.villager_adventurous": [ - "Tant de bo faci el meu propi planador algun dia.", - "M'agradaria endinsar-me en una cova quan sigui més fort.", - ], - "npc.speech.villager_closed": [ - "Tu no ets de per aquí, veritat?", - "No creus que la nostra aldea és la millor?", - "Diuen que els bolets són bons per la salut, tot i que mai els he tastat.", - "Ser, o no ser? Bé, jo crec que seré un pagès.", - ], - "npc.speech.villager_conscientious": [ - "Em mantinc ocupat. Sempre hi ha alguna cosa a fer.", - "Espero que plogui prompte, seria bo per als camps.", - ], - "npc.speech.villager_busybody": [ - "La gent hauria de parlar menys i treballar més.", - ], - "npc.speech.villager_unconscientious": [ - "Crec que és el moment d'un segon desdejuni!", - "M'agradaria que ma casa no fos un desastre, però aleshores hauria de ser més ordenat! Haha!", - "I ara, on he deixat allò...", - ], - "npc.speech.villager_extroverted": [ - "No creuràs el que he fet aquest cap de setmana!", - "Et desitjo el millor dels dies!", - "Que n'opines d'aquest temps?", - "Estic gruyère pel formatge!", - "No te n'oblides les galetetes salades!", - "Senzillament, m'encanta el formatge dels nans. Tant de bo pogués fer-lo.", - "Vaig tenir un somni meravellós sobre formatges l'altra nit. Què significarà?", - "M'encanta la mel!... Però odio les abelles.", - ], - "npc.speech.villager_sociable": [ - "No voldries passar a dins? Estem a punt de menjar un poc de formatge!", - "T'agradaria veure el meu jardí? D'acord, potser en un altre moment.", - ], - "npc.speech.villager_introverted": [ - "Hola.", - "Ah, jo? No sóc gens especial.", - ], - "npc.speech.villager_agreeable": [ - "Com estàs avui?", - "Avisa'm si necessites qualsevol cosa.", - "Has vist el meu gat?", - ], - "npc.speech.villager_worried": [ - "Ves amb compte, hi ha molts perills allà fora.", - ], - "npc.speech.villager_disagreeable": [ - "Sempre dic el que penso, i si a la gent no li agrada que se'n fotin.", - "La gent s'ofèn per res.", - ], - "npc.speech.villager_neurotic": [ - "Pensar en les masmorres em fa por. Voldria que algú se n'encarregués d'elles.", - "Algú hauria de fer alguna cosa amb aquests sectaris. Algú que no sigui jo, si fos possible.", - "Tinc la sensació que alguna cosa dolenta ocorrerà.", - "M'agradaria que algú mantingués als llops lluny de l'aldea.", - ], - "npc.speech.villager_sad_loner": [ - "Em sento molt sol.", - "... Disculpa aquest silenci incòmode. No tinc traça per a la gent.", - ], - "npc.speech.villager_seeker": [ - "Voldria veure el món algun dia. Ha d'haver-hi alguna altra cosa a la vida més enllà d'aquesta aldea.", - ], - "npc.speech.villager_stable": [ - "No fa un dia meravellós?", - "La vida no és tan dolenta.", - "Fa un dia meravellós per passejar pel bosc!", - ], - "npc.speech.villager_decline_trade": [ - "Em sap greu, no tinc res per comerciar.", - "Comerciar? Com si jo tingués alguna cosa que et pogués interessar.", - "Ma casa és meva i no te la vendré per res del món.", - ], - "npc.speech.merchant_advertisement": [ - "Li interessaria comerciar amb alguna cosa?", - "Voldria comerciar amb mi?", - "Tinc molts béns, li agradaria donar una ullada?" - ], - "npc.speech.merchant_busy": [ - "Si us plau, esperi. Sols soc una persona.", - "Un moment, deixi'm acabar.", - "Estic ocupat, torni més tard." - ], - "npc.speech.merchant_busy_rude": [ - "Eh! Esperi el seu torn.", - "No veu a l'altra persona davant seu?", - "No es coli.", - ], - "npc.speech.merchant_trade_successful": [ - "Gràcies per comerciar amb mi!", - "Gràcies!", - ], - "npc.speech.merchant_trade_declined": [ - "Potser en un altre moment, que tingui un bon dia!", - "Quina llàstima, potser la pròxima vegada!" - ], - "npc.speech.villager_cultist_alarm": [ - "Guaita! Hi ha un sectari solt!", - "A les armes! Els sectaris estan atacant!", - "Com s'atreveixen els sectaris a atacar la nostra aldea?!", - "Mort als sectaris!", - "No tolerarem als sectaris aquí!", - "Sectaris assassins!", - "Tasta la fulla de la meva espasa, maleït sectari!", - "Res podrà rentar la sang de les teves mans, sectari!", - "Per tots els dimonis! Un sectari entre nosaltres!", - "La maldat d'aquest sectari està a punt d'acabar!", - "Aquest sectari és meu!", - "Prepara't per conèixer el teu creador, maleït sectari!", - "Veig un sectari! Enxampeu-lo!", - "Veig un sectari! Ataqueu!", - "Veig un sectari! No el deixeu escapar!", - "Li abelliria al molt honorable sectari una mica de MORT?!", - "Ni oblit, ni perdó! Sectaris, penediu-vos!", - "Mor, sectari!", - "El vostre regnat del terror acabarà!", - "Açò és per tot el que heu fet!", - "No ens agraden els de la vostra classe per aquí.", - "Hauríeu d'haver-vos quedat sota terra!", - ], - "npc.speech.villager_under_attack": [ - "Ajuda, m'ataquen!", - "Ajuda! M'ataquen!", - "Ai! M'ataquen!", - "Ai! M'ataquen! Ajuda!", - "Ajudeu-me! M'ataquen!", - "M'ataquen! Ajuda!", - "M'ataquen! Ajudeu-me!", - "Ajuda!", - "Ajuda! Ajuda!", - "Ajuda! Ajuda! Ajuda!", - "M'ataquen!", - "AAAHHH! M'ataquen!", - "AAAHHH! M'ataquen! Ajuda!", - "Ajuda! Ens ataquen!", - "Ajuda! Assassí!", - "Ajuda! Hi ha un assassí solt!", - "Ajuda! Pretenen matar-me!", - "Guàrdies, m'ataquen!", - "Guàrdies! M'ataquen!", - "M'ataquen! Guàrdies!", - "Ajuda! Guàrdies! M'ataquen!", - "Guàrdies! Veniu de pressa!", - "Guàrdies! Guàrdies!", - "Guàrdies! Un vilà m'ataca!", - "Guàrdies, mateu a aquest infame vilà!", - "Guàrdies! Un assassí!", - "Guàrdies! Ajudeu-me!", - "No te'n sortiràs d'aquesta! Guàrdies!", - "Malvat!", - "Ajudeu-me!", - "Ajuda! Si us plau!", - "Ai! Guàrdies! Ajuda!", - "Venen per mi!", - "Ajuda! Ajuda! Estic sent reprimit!", - "Ah, ara veiem la violència inherent al sistema.", - "Sols ha estat una esgarrapada!", - "Para!", - "Però que t'he fet jo a tu?!", - "Si us plau, deixi d'atacar-me!", - "Eh! Vigila a qui punxes amb això!", - "Desgraciat miserable, fot el camp!", - "Para! Fuig!", - "M'estàs empipant!", - "Eh! Qui et penses que ets?!", - "Això et costarà el cap!", - "Para, si us plau! No duc res de valor!", - "Enviaré al meu germà per tu, és molt més gran que jo!", - "Nooo, li ho diré a la mare!", - "Maleït siguis!", - "Si us plau, no facis això.", - "Això no ha sigut molt amable!", - "D'acord, la teva arma funciona, ara aparta-la!", - "Perdona'm la vida!", - "Pietat, jo tinc dos fills i una esposa!", - "Soc massa jove per morir!", - "Espera, podem parlar-ho?", - "La violència mai és la solució!", - "Sembla que avui serà un dia força dolent...", - "Eh, això m'ha fet mal!", - "Agh!", - "Quin maleducat!", - "Para, t'ho suplico!", - "Espero que agafes la pigota!", - "Açò no és gens divertit.", - "Com t'atreveixes?!", - "Pagaràs per això!", - "Embeina l'arma o ho lamentaràs!", - "No m'obliguis a fer-te mal!", - "Ha d'haver-hi hagut algun malentès!", - "No cal que facis açò!", - "Fuig, malvat!", - "Això ha fet mal!", - "Per què has fet això?", - "Per tots els esperits, cessa!", - "Has d'haver-me confós amb algú altre!", - "No em mereixo açò!", - "Si us plau, no ho tornis a fer.", - "Guàrdies, llanceu aquest monstre al llac!", - "Descarregaré la meva fúria sobre tu!", - "Per què a miiiiii?", - ], - "npc.speech.villager_enemy_killed": [ - "He destruït al meu enemic!", - "Pau per fi!", - "I ara... què estava jo fent?", - ], - "npc.speech.menacing": [ - "T'ho adverteixo!", - "Un pas més i t'atacaré!", - "No em fas gens de por!", - "Fora d'aquí!", - "Ves-te'n si vols viure!", - "No ets benvingut aquí!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Retireu-vos per lluitar un altre dia!", - "Retirada!", - "Maleït siguis!", - "Et maleiré des del més enllà!", - "He de descansar!", - "Són massa forts!", - ] - } -) diff --git a/assets/voxygen/i18n/ca_CA/template.ftl b/assets/voxygen/i18n/ca_CA/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ca_CA/template.ron b/assets/voxygen/i18n/ca_CA/template.ron deleted file mode 100644 index 53123098c7..0000000000 --- a/assets/voxygen/i18n/ca_CA/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Catalan (Catalonia) -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/buff.ftl b/assets/voxygen/i18n/cz_CZ/buff.ftl new file mode 100644 index 0000000000..9d37b1be31 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Klikni pro zrušení +buff-title-missing = Chybějící název +buff-desc-missing = Chybějící popis +buff-title-heal = Léčba +buff-desc-heal = Přidá život během určitého času. +buff-title-potion = Lektvar +buff-desc-potion = Piju... +buff-title-saturation = Nasycení +buff-desc-saturation = Přídá život během času ze Spotřebních. +buff-title-campfire_heal = Léčba Táborákem +buff-desc-campfire_heal = Odpočinek u ohně léčí { $rate }% za sekundu. +buff-title-invulnerability = Nezranitelnost +buff-desc-invulnerability = Žádný útok tě nezraní. +buff-title-protectingward = Ochraná Vizita +buff-desc-protectingward = Jsi chráněn, nějak, před útoky. +buff-title-frenzied = Šílený +buff-desc-frenzied = Jsi prostoupen nepřirozenou rychlostí a můžeš ignorovat drobná zranění +buff-title-bleed = Krvácení +buff-desc-bleed = Způsobuje pravidelné poškození. +buff-title-cursed = Prokletí +buff-desc-cursed = Jsi prokletý. +buff-title-burn = V plamenech +buff-desc-burn = Hoříš zaživa +buff-title-crippled = Zmrzačený +buff-desc-crippled = Pohybuješ se jako mrzák, protože tvoje nohy jsou těžce poškozeny. +buff-title-frozen = Zmražen +buff-desc-frozen = Tvé pohyby a útoky jsou zpomaleny. +buff-title-wet = Mokrý +buff-desc-wet = Kloužou ti nohy, proto je obtížné zastavit. +buff-title-ensnared = Polapen +buff-desc-ensnared = Liány ti svazují nohy, takže se nemůžeš hýbat. +buff-stat-health = Obnoví { $str_total } Životů +buff-stat-increase_max_energy = Zvedne Maximalní Výdrž o { $strength } +buff-stat-increase_max_health = Zvedne Maximální počet Životů o { $strength } +buff-stat-invulnerability = Zaručuje nezranitelnost +buff-text-over_seconds = více než { $dur_secs } sekund +buff-text-for_seconds = po dobu { $dur_secs } sekund \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/buff.ron b/assets/voxygen/i18n/cz_CZ/buff.ron deleted file mode 100644 index a37eb4d836..0000000000 --- a/assets/voxygen/i18n/cz_CZ/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - // Buffs - "buff.remove": "Klikni pro zrušení", - "buff.title.missing": "Chybějící název", - "buff.desc.missing": "Chybějící popis", - "buff.title.heal": "Léčba", - "buff.desc.heal": "Přidá život během určitého času.", - "buff.title.potion": "Lektvar", - "buff.desc.potion": "Piju...", - "buff.title.saturation": "Nasycení", - "buff.desc.saturation": "Přídá život během času ze Spotřebních.", - "buff.title.campfire_heal": "Léčba Táborákem", - "buff.desc.campfire_heal": "Odpočinek u ohně léčí {rate}% za sekundu.", - "buff.title.invulnerability": "Nezranitelnost", - "buff.desc.invulnerability": "Žádný útok tě nezraní.", - "buff.title.protectingward": "Ochraná Vizita", - "buff.desc.protectingward": "Jsi chráněn, nějak, před útoky.", - "buff.title.frenzied": "Šílený", - "buff.desc.frenzied": "Jsi prostoupen nepřirozenou rychlostí a můžeš ignorovat drobná zranění", - // Debuffs - "buff.title.bleed": "Krvácení", - "buff.desc.bleed": "Způsobuje pravidelné poškození.", - "buff.title.cursed": "Prokletí", - "buff.desc.cursed": "Jsi prokletý.", - "buff.title.burn": "V plamenech", - "buff.desc.burn": "Hoříš zaživa", - "buff.title.crippled": "Zmrzačený", - "buff.desc.crippled": "Pohybuješ se jako mrzák, protože tvoje nohy jsou těžce poškozeny.", - "buff.title.frozen": "Zmražen", - "buff.desc.frozen": "Tvé pohyby a útoky jsou zpomaleny.", - "buff.title.wet": "Mokrý", - "buff.desc.wet": "Kloužou ti nohy, proto je obtížné zastavit.", - "buff.title.ensnared": "Polapen", - "buff.desc.ensnared": "Liány ti svazují nohy, takže se nemůžeš hýbat.", - // Buffs stats - "buff.stat.health": "Obnoví {str_total} Životů", - "buff.stat.increase_max_energy": "Zvedne Maximalní Výdrž o {strength}", - "buff.stat.increase_max_health": "Zvedne Maximální počet Životů o {strength}", - "buff.stat.invulnerability": "Zaručuje nezranitelnost", - // Text - "buff.text.over_seconds": "více než {dur_secs} sekund", - "buff.text.for_seconds": "po dobu {dur_secs} sekund", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/char_selection.ftl b/assets/voxygen/i18n/cz_CZ/char_selection.ftl new file mode 100644 index 0000000000..ee004173e5 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Načítání postavy... +char_selection-delete_permanently = Chcete smazat tuto postavu? +char_selection-deleting_character = Probíhá mazání postavy... +char_selection-change_server = Změnit server +char_selection-enter_world = Vstup do světa +char_selection-logout = Odhlásit +char_selection-create_new_character = Vytvořit novou postavu +char_selection-creating_character = Vytvářím postavu... +char_selection-character_creation = Tvorba postav +char_selection-human_default = Výchozí postava +char_selection-level_fmt = úroveň { $level_nb } +char_selection-uncanny_valley = Divočina +char_selection-plains_of_uncertainty = Pole nejistoty +char_selection-beard = Vousy +char_selection-hair_style = Styl vlasů +char_selection-hair_color = Barva vlasů +char_selection-eye_color = Barva očí +char_selection-skin = Kůže +char_selection-eyeshape = Tvar očí +char_selection-accessories = Doplňky +char_selection-create_info_name = Tvá postava potřebuje jméno! +char_selection-version_mismatch = VAROVÁNÍ! Na serveru běží jiná, pravděpodobně nekompatibilní verze. Prosím, aktualizuj hru. \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/char_selection.ron b/assets/voxygen/i18n/cz_CZ/char_selection.ron deleted file mode 100644 index 810a6f824b..0000000000 --- a/assets/voxygen/i18n/cz_CZ/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "char_selection.loading_characters": "Načítání postavy...", - "char_selection.delete_permanently": "Chcete smazat tuto postavu?", - "char_selection.deleting_character": "Probíhá mazání postavy...", - "char_selection.change_server": "Změnit server", - "char_selection.enter_world": "Vstup do světa", - "char_selection.logout": "Odhlásit", - "char_selection.create_new_character": "Vytvořit novou postavu", - "char_selection.creating_character": "Vytvářím postavu...", - "char_selection.character_creation": "Tvorba postav", - "char_selection.human_default": "Výchozí postava", - "char_selection.level_fmt": "úroveň {level_nb}", - "char_selection.uncanny_valley": "Divočina", - "char_selection.plains_of_uncertainty": "Pole nejistoty", - "char_selection.beard": "Vousy", - "char_selection.hair_style": "Styl vlasů", - "char_selection.hair_color": "Barva vlasů", - "char_selection.eye_color": "Barva očí", - "char_selection.skin": "Kůže", - "char_selection.eyeshape": "Tvar očí", - "char_selection.accessories": "Doplňky", - "char_selection.create_info_name": "Tvá postava potřebuje jméno!", - "char_selection.version_mismatch": "VAROVÁNÍ! Na serveru běží jiná, pravděpodobně nekompatibilní verze. Prosím, aktualizuj hru.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/common.ftl b/assets/voxygen/i18n/cz_CZ/common.ftl new file mode 100644 index 0000000000..63da5773d6 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/common.ftl @@ -0,0 +1,100 @@ +common-username = jméno +common-singleplayer = Hra jednoho hráče +common-multiplayer = Hra více hráčů +common-servers = Servery +common-quit = Vypnout +common-settings = Nastavení +common-languages = Jazyky +common-interface = Rozhraní +common-gameplay = Hra +common-controls = Ovládání +common-video = Grafika +common-sound = Zvuk +common-chat = Chat +common-resume = Pokračovat +common-characters = Postavy +common-close = Zavřít +common-yes = Ano +common-no = Ne +common-back = Zpět +common-create = Vytvořit +common-okay = OK +common-add = Přidat +common-accept = Přijmout +common-decline = Odmítnout +common-disclaimer = Zřeknutí se odpovědnosti +common-cancel = Zrušit +common-none = Nic +common-error = Chyba +common-fatal_error = Fatalní Chyba +common-you = Ty +common-automatic = Auto +common-random = Náhodný +common-empty = Prázdný +common-interface_settings = Rozhraní +common-gameplay_settings = Hra +common-controls_settings = Ovládání +common-video_settings = Grafika +common-sound_settings = Zvuk +common-language_settings = Jazyk +common-chat_settings = Chat +common-connection_lost = + Spojení ztraceno! + Restartoval se server? + Je klient aktuální? +common-species-orc = Ork +common-species-human = Člověk +common-species-dwarf = Trpaslík +common-species-elf = Elf +common-species-draugr = Nemrtvý +common-species-danari = Danari +common-weapons-axe = Sekera +common-weapons-greatsword = Obouruční meč +common-weapons-shortswords = Krátké meče +common-weapons-sword = Meč +common-weapons-staff = Hůl +common-weapons-bow = Luk +common-weapons-hammer = Kladivo +common-weapons-general = Všeobecný +common-weapons-sceptre = Léčivé Žezlo +common-weapons-shield = Štít +common-weapons-spear = Kopí +common-weapons-hammer_simple = Jednoduché Kladivo +common-weapons-sword_simple = Jednoduchý Meč +common-weapons-staff_simple = Jednoduchá Hůl +common-weapons-axe_simple = Jednoduchá Sekera +common-weapons-bow_simple = Jednoduchý Luk +common-weapons-unique = Unikátní +common-tool-debug = Debug +common-tool-farming = Farmářský Nástroj +common-tool-pick = Krumpáč +common-tool-mining = Dolování +common-kind-modular_component = Modulární komponenta +common-kind-glider = Kluzák +common-kind-consumable = Spotřební +common-kind-throwable = Lze házet +common-kind-utility = Užitečné +common-kind-ingredient = Ingredience +common-kind-lantern = Lucerna +common-hands-one = Jednoruční +common-hands-two = Dvojruční +common-rand_appearance = Náhodný vzhled +common-rand_name = Náhodné jméno +common-stats-combat_rating = CR +common-stats-power = Síla +common-stats-speed = Rychlost +common-stats-poise = Postoj +common-stats-crit_chance = Kritická šance +common-stats-crit_mult = Krit Násobek +common-stats-armor = Zbroj +common-stats-poise_res = Odolnost omráčení +common-stats-energy_max = Max Energie +common-stats-energy_reward = Odměna Energie +common-stats-crit_power = Síla Kritu +common-stats-stealth = Plížení +common-stats-slots = Sloty +common-material-metal = Kov +common-material-wood = Dřevo +common-material-stone = Kámen +common-material-cloth = Látka +common-material-hide = Kůže \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/common.ron b/assets/voxygen/i18n/cz_CZ/common.ron deleted file mode 100644 index b0b61f4b86..0000000000 --- a/assets/voxygen/i18n/cz_CZ/common.ron +++ /dev/null @@ -1,121 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "jméno", - "common.singleplayer": "Hra jednoho hráče", - "common.multiplayer": "Hra více hráčů", - "common.servers": "Servery", - "common.quit": "Vypnout", - "common.settings": "Nastavení", - "common.languages": "Jazyky", - "common.interface": "Rozhraní", - "common.gameplay": "Hra", - "common.controls": "Ovládání", - "common.video": "Grafika", - "common.sound": "Zvuk", - "common.chat": "Chat", - "common.resume": "Pokračovat", - "common.characters": "Postavy", - "common.close": "Zavřít", - "common.yes": "Ano", - "common.no": "Ne", - "common.back": "Zpět", - "common.create": "Vytvořit", - "common.okay": "OK", - "common.add": "Přidat", - "common.accept": "Přijmout", - "common.decline": "Odmítnout", - "common.disclaimer": "Zřeknutí se odpovědnosti", - "common.cancel": "Zrušit", - "common.none": "Nic", - "common.error": "Chyba", - "common.fatal_error": "Fatalní Chyba", - "common.you": "Ty", - "common.automatic": "Auto", - "common.random": "Náhodný", - "common.empty": "Prázdný", - - // Settings Window title - "common.interface_settings": "Rozhraní", - "common.gameplay_settings": "Hra", - "common.controls_settings": "Ovládání", - "common.video_settings": "Grafika", - "common.sound_settings": "Zvuk", - "common.language_settings": "Jazyk", - "common.chat_settings": "Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"Spojení ztraceno! - Restartoval se server? - Je klient aktuální?"#, - - - "common.species.orc": "Ork", - "common.species.human": "Člověk", - "common.species.dwarf": "Trpaslík", - "common.species.elf": "Elf", - "common.species.draugr": "Nemrtvý", - "common.species.danari": "Danari", - - "common.weapons.axe": "Sekera", - "common.weapons.greatsword": "Obouruční meč", - "common.weapons.shortswords": "Krátké meče", - "common.weapons.sword": "Meč", - "common.weapons.staff": "Hůl", - "common.weapons.bow": "Luk", - "common.weapons.hammer": "Kladivo", - "common.weapons.general": "Všeobecný", - "common.weapons.sceptre": "Léčivé Žezlo", - "common.weapons.shield": "Štít", - "common.weapons.spear": "Kopí", - "common.weapons.hammer_simple": "Jednoduché Kladivo", - "common.weapons.sword_simple": "Jednoduchý Meč", - "common.weapons.staff_simple": "Jednoduchá Hůl", - "common.weapons.axe_simple": "Jednoduchá Sekera", - "common.weapons.bow_simple": "Jednoduchý Luk", - "common.weapons.unique": "Unikátní", - "common.tool.debug": "Debug", - "common.tool.farming": "Farmářský Nástroj", - "common.tool.pick": "Krumpáč", - "common.tool.mining": "Dolování", - "common.kind.modular_component": "Modulární komponenta", - "common.kind.glider": "Kluzák", - "common.kind.consumable": "Spotřební", - "common.kind.throwable": "Lze házet", - "common.kind.utility": "Užitečné", - "common.kind.ingredient": "Ingredience", - "common.kind.lantern": "Lucerna", - "common.hands.one": "Jednoruční", - "common.hands.two": "Dvojruční", - - "common.rand_appearance": "Náhodný vzhled", - "common.rand_name": "Náhodné jméno", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Síla", - "common.stats.speed": "Rychlost", - "common.stats.poise": "Postoj", - "common.stats.crit_chance": "Kritická šance", - "common.stats.crit_mult": "Krit Násobek", - "common.stats.armor": "Zbroj", - "common.stats.poise_res": "Odolnost omráčení", - "common.stats.energy_max": "Max Energie", - "common.stats.energy_reward": "Odměna Energie", - "common.stats.crit_power": "Síla Kritu", - "common.stats.stealth": "Plížení", - "common.stats.slots": "Sloty", - - "common.material.metal": "Kov", - "common.material.wood": "Dřevo", - "common.material.stone": "Kámen", - "common.material.cloth": "Látka", - "common.material.hide": "Kůže", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/esc_menu.ftl b/assets/voxygen/i18n/cz_CZ/esc_menu.ftl new file mode 100644 index 0000000000..8ba9c863cc --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Odhlásit +esc_menu-quit_game = Opustit hru \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/esc_menu.ron b/assets/voxygen/i18n/cz_CZ/esc_menu.ron deleted file mode 100644 index f219600d73..0000000000 --- a/assets/voxygen/i18n/cz_CZ/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "esc_menu.logout": "Odhlásit", - "esc_menu.quit_game": "Opustit hru", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/gameinput.ftl b/assets/voxygen/i18n/cz_CZ/gameinput.ftl new file mode 100644 index 0000000000..82ff0036d1 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/gameinput.ftl @@ -0,0 +1,62 @@ +gameinput-primary = Základní Útok +gameinput-secondary = Druhý Útok +gameinput-slot1 = Rychlý výběr 1 +gameinput-slot2 = Rychlý výběr 2 +gameinput-slot3 = Rychlý výběr 3 +gameinput-slot4 = Rychlý výběr 4 +gameinput-slot5 = Rychlý výběr 5 +gameinput-slot6 = Rychlý výběr 6 +gameinput-slot7 = Rychlý výběr 7 +gameinput-slot8 = Rychlý výběr 8 +gameinput-slot9 = Rychlý výběr 9 +gameinput-slot10 = Rychlý výběr 10 +gameinput-swaploadout = Výměna Vybavení +gameinput-togglecursor = Povolit Kurzor +gameinput-help = Povolit Okno Nápovědy +gameinput-toggleinterface = Povolit Rozhraní +gameinput-toggledebug = Povolit FPS a Debug info +gameinput-screenshot = Pořídit Snímek Obrazovky +gameinput-toggleingameui = Povolit Jména +gameinput-fullscreen = Povolit Celou Obrazovku +gameinput-moveforward = Pohyb Dopředu +gameinput-moveleft = Pohyb Doleva +gameinput-moveright = Pohyb Doprava +gameinput-moveback = Pohyb Dozádu +gameinput-jump = Skok +gameinput-glide = Kluzák +gameinput-roll = Kotrmelec +gameinput-climb = Lézt +gameinput-climbdown = Lézt Dolů +gameinput-wallleap = Wall Leap +gameinput-togglelantern = Zapnout Lucernu +gameinput-mount = Nasednout +gameinput-chat = Chat +gameinput-command = Príkaz +gameinput-escape = Nabídka +gameinput-map = Mapa +gameinput-bag = Taška +gameinput-trade = Obchod +gameinput-social = Společenost +gameinput-sit = Sednout +gameinput-spellbook = Dovednosti +gameinput-settings = Nastavení +gameinput-respawn = Oživení +gameinput-charge = Charge +gameinput-togglewield = Vzít zbraň do ruky +gameinput-interact = Interagovat +gameinput-freelook = Volný Pohled +gameinput-autowalk = Auto Chůze +gameinput-cameraclamp = Připnutí Kamery +gameinput-dance = Tanec +gameinput-select = Vybrat Entitu +gameinput-acceptgroupinvite = Příjmout pozvání do Skupiny +gameinput-declinegroupinvite = Odmítnout pozvání do Skupiny +gameinput-cyclecamera = Druhy kamer +gameinput-crafting = Výroba +gameinput-fly = Létání +gameinput-sneak = Plížení +gameinput-swimdown = Plavat Dolů +gameinput-swimup = Plavat Nahoru +gameinput-mapzoomin = Přiblížit mapu +gameinput-mapzoomout = Oddálit mapu +gameinput-greet = Pozdrav \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/gameinput.ron b/assets/voxygen/i18n/cz_CZ/gameinput.ron deleted file mode 100644 index b5e811ed56..0000000000 --- a/assets/voxygen/i18n/cz_CZ/gameinput.ron +++ /dev/null @@ -1,73 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "gameinput.primary": "Základní Útok", - "gameinput.secondary": "Druhý Útok", - "gameinput.slot1": "Rychlý výběr 1", - "gameinput.slot2": "Rychlý výběr 2", - "gameinput.slot3": "Rychlý výběr 3", - "gameinput.slot4": "Rychlý výběr 4", - "gameinput.slot5": "Rychlý výběr 5", - "gameinput.slot6": "Rychlý výběr 6", - "gameinput.slot7": "Rychlý výběr 7", - "gameinput.slot8": "Rychlý výběr 8", - "gameinput.slot9": "Rychlý výběr 9", - "gameinput.slot10": "Rychlý výběr 10", - "gameinput.swaploadout": "Výměna Vybavení", - "gameinput.togglecursor": "Povolit Kurzor", - "gameinput.help": "Povolit Okno Nápovědy", - "gameinput.toggleinterface": "Povolit Rozhraní", - "gameinput.toggledebug": "Povolit FPS a Debug info", - "gameinput.screenshot": "Pořídit Snímek Obrazovky", - "gameinput.toggleingameui": "Povolit Jména", - "gameinput.fullscreen": "Povolit Celou Obrazovku", - "gameinput.moveforward": "Pohyb Dopředu", - "gameinput.moveleft": "Pohyb Doleva", - "gameinput.moveright": "Pohyb Doprava", - "gameinput.moveback": "Pohyb Dozádu", - "gameinput.jump": "Skok", - "gameinput.glide": "Kluzák", - "gameinput.roll": "Kotrmelec", - "gameinput.climb": "Lézt", - "gameinput.climbdown": "Lézt Dolů", - "gameinput.wallleap": "Wall Leap", - "gameinput.togglelantern": "Zapnout Lucernu", - "gameinput.mount": "Nasednout", - "gameinput.chat": "Chat", - "gameinput.command": "Príkaz", - "gameinput.escape": "Nabídka", - "gameinput.map": "Mapa", - "gameinput.bag": "Taška", - "gameinput.trade": "Obchod", - "gameinput.social": "Společenost", - "gameinput.sit": "Sednout", - "gameinput.spellbook": "Dovednosti", - "gameinput.settings": "Nastavení", - "gameinput.respawn": "Oživení", - "gameinput.charge": "Charge", - "gameinput.togglewield": "Vzít zbraň do ruky", - "gameinput.interact": "Interagovat", - "gameinput.freelook": "Volný Pohled", - "gameinput.autowalk": "Auto Chůze", - "gameinput.cameraclamp": "Připnutí Kamery", - "gameinput.dance": "Tanec", - "gameinput.select": "Vybrat Entitu", - "gameinput.acceptgroupinvite": "Příjmout pozvání do Skupiny", - "gameinput.declinegroupinvite": "Odmítnout pozvání do Skupiny", - "gameinput.cyclecamera": "Druhy kamer", - "gameinput.crafting": "Výroba", - "gameinput.fly": "Létání", - "gameinput.sneak": "Plížení", - "gameinput.swimdown": "Plavat Dolů", - "gameinput.swimup": "Plavat Nahoru", - "gameinput.mapzoomin": "Přiblížit mapu", - "gameinput.mapzoomout": "Oddálit mapu", - "gameinput.greet": "Pozdrav", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/bag.ftl b/assets/voxygen/i18n/cz_CZ/hud/bag.ftl new file mode 100644 index 0000000000..4da3b0c002 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/bag.ftl @@ -0,0 +1,38 @@ +hud-bag-glider = Glider +hud-bag-bag = Batoh +hud-bag-health = Život +hud-bag-energy = Výdrž +hud-bag-combat_rating = Bojové hodnocení +hud-bag-protection = Ochrana +hud-bag-combat_rating_desc = Vypočítáno z života/zbroje. +hud-bag-protection_desc = Redukce poškození přes brnení +hud-bag-inventory = Inventář { $playername } +hud-bag-stats_title = Statistiky { $playername } +hud-bag-exp = Zkušenosti +hud-bag-armor = Výzbroj +hud-bag-stats = Statistiky +hud-bag-head = Hlava +hud-bag-neck = Krk +hud-bag-tabard = Tabard +hud-bag-shoulders = Ramena +hud-bag-chest = Hruď +hud-bag-hands = Ruce +hud-bag-lantern = Lampa +hud-bag-belt = Pas +hud-bag-ring = Prsten +hud-bag-back = Záda +hud-bag-legs = Nohy +hud-bag-feet = Chodidla +hud-bag-mainhand = Hlavní Ruka +hud-bag-offhand = Druhá Ruka +hud-bag-inactive_mainhand = Neaktivní hlavní ruka +hud-bag-inactive_offhand = Neaktivní druhá ruka +hud-bag-swap_equipped_weapons_title = Přepnout zbraně +hud-bag-swap_equipped_weapons_desc = Stiskni { $key } +hud-bag-stun_res = Odolnost omráčení +hud-bag-stun_res_desc = + Odolnost proti omráčení sérií útoků + Obnovuje se jako Energie +hud-bag-sort_by_name = Seřadit podle jména +hud-bag-sort_by_quality = Seřadit podle kvality +hud-bag-sort_by_category = Seřadit podle kategorie \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/bag.ron b/assets/voxygen/i18n/cz_CZ/hud/bag.ron deleted file mode 100644 index 22444c7adc..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/bag.ron +++ /dev/null @@ -1,76 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - // Inventory - "hud.bag.glider": "Glider", - "hud.bag.bag": "Batoh", - "hud.bag.health": "Život", - "hud.bag.energy": "Výdrž", - "hud.bag.combat_rating": "Bojové hodnocení", - "hud.bag.protection": "Ochrana", - "hud.bag.combat_rating_desc": "Vypočítáno z života/zbroje.", - "hud.bag.protection_desc": "Redukce poškození přes brnení", - "hud.bag.inventory": "Inventář {playername}", - "hud.bag.stats_title": "Statistiky {playername}", - "hud.bag.exp": "Zkušenosti", - "hud.bag.armor": "Výzbroj", - "hud.bag.stats": "Statistiky", - "hud.bag.head": "Hlava", - "hud.bag.neck": "Krk", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Ramena", - "hud.bag.chest": "Hruď", - "hud.bag.hands": "Ruce", - "hud.bag.lantern": "Lampa", - "hud.bag.belt": "Pas", - "hud.bag.ring": "Prsten", - "hud.bag.back": "Záda", - "hud.bag.legs": "Nohy", - "hud.bag.feet": "Chodidla", - "hud.bag.mainhand": "Hlavní Ruka", - "hud.bag.offhand": "Druhá Ruka", - - "hud.bag.inventory": "Inventář: {playername}", - "hud.bag.stats_title": "Statistiky: {playername}", - "hud.bag.exp": "Zkušenosti", - "hud.bag.armor": "Brnění", - "hud.bag.stats": "Statistiky", - "hud.bag.head": "Hlava", - "hud.bag.neck": "Krk", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Ramena", - "hud.bag.chest": "Hruď", - "hud.bag.hands": "Ruce", - "hud.bag.lantern": "Lucerna", - "hud.bag.glider": "Kluzák", - "hud.bag.belt": "Pásek", - "hud.bag.ring": "Prsten", - "hud.bag.back": "Záda", - "hud.bag.legs": "Kalhoty", - "hud.bag.feet": "Boty", - "hud.bag.mainhand": "Hlavní ruka", - "hud.bag.offhand": "Druhá ruka", - "hud.bag.inactive_mainhand": "Neaktivní hlavní ruka", - "hud.bag.inactive_offhand": "Neaktivní druhá ruka", - "hud.bag.swap_equipped_weapons_title": "Přepnout zbraně", - "hud.bag.swap_equipped_weapons_desc": "Stiskni {key}", - "hud.bag.bag": "Taška", - "hud.bag.health": "Životy", - "hud.bag.energy": "Energie", - "hud.bag.combat_rating": "Bojové hodnocení", - "hud.bag.protection": "Ochrana", - "hud.bag.stun_res": "Odolnost omráčení", - "hud.bag.combat_rating_desc": "Vypočítáno z tvého\nvybavení a života.", - "hud.bag.protection_desc": "Snížení poškození brněním", - "hud.bag.stun_res_desc": "Odolnost proti omráčení sérií útoků\nObnovuje se jako Energie", - "hud.bag.sort_by_name": "Seřadit podle jména", - "hud.bag.sort_by_quality": "Seřadit podle kvality", - "hud.bag.sort_by_category": "Seřadit podle kategorie", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/char_window.ftl b/assets/voxygen/i18n/cz_CZ/hud/char_window.ftl new file mode 100644 index 0000000000..6252816384 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Jméno postavy +character_window-character_stats = + Výdrž + + Zdatnost + + Síla vůle + + Ochrana \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/char_window.ron b/assets/voxygen/i18n/cz_CZ/hud/char_window.ron deleted file mode 100644 index 98df0a3fd0..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/char_window.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - /// Start character window section - "character_window.character_name": "Jméno postavy", - // Charater stats - "character_window.character_stats": r#"Výdrž - -Zdatnost - -Síla vůle - -Ochrana -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/chat.ftl b/assets/voxygen/i18n/cz_CZ/hud/chat.ftl new file mode 100644 index 0000000000..f7ceb91377 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Vše +hud-chat-chat_tab_hover_tooltip = Pravý klik pro nastavení +hud-outcome-burning = uhořel/a +hud-outcome-curse = zemřel/a kletbou +hud-outcome-bleeding = vykrvácel/a +hud-outcome-crippled = zemřel/a zmrzačením +hud-outcome-frozen = umrzl/a +hud-chat-online_msg = [{ $name }] je teď online +hud-chat-offline_msg = [{ $name }] se odhlásil +hud-chat-default_death_msg = [{ $name }] zemřel/a +hud-chat-environmental_kill_msg = [{ $name }] zemřel/a v { $environment } +hud-chat-fall_kill_msg = [{ $name }] zemřel/a pádem +hud-chat-suicide_msg = [{ $name }] si způsobil/a zranění a zemřel/a +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } způsobeno [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] porazil/a [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] zastřelil/a [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] vyhodil/a do vzduchu [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] zabil/a [{ $victim }] kouzlem +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } způsobeno { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } zabil/a [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } zastřelil/a [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } vyhodil/a do vzduchu [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } zabil/a [{ $victim }] kouzlem +hud-chat-npc_other_kill_msg = { $attacker } zabil/a [{ $victim }] +hud-chat-loot_msg = Sebral/a jsi [{ $item }] +hud-chat-loot_fail = Máš plný inventář! +hud-chat-goodbye = Nashledanou! +hud-chat-connection_lost = Připojení ztraceno. Ukončuji za { $time } sekund. \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/chat.ron b/assets/voxygen/i18n/cz_CZ/hud/chat.ron deleted file mode 100644 index 4d1c684853..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "hud.chat.all": "Vše", - "hud.chat.chat_tab_hover_tooltip": "Pravý klik pro nastavení", - - // Debuff outcomes - "hud.outcome.burning": "uhořel/a", - "hud.outcome.curse": "zemřel/a kletbou", - "hud.outcome.bleeding": "vykrvácel/a", - "hud.outcome.crippled": "zemřel/a zmrzačením", - "hud.outcome.frozen": "umrzl/a", - - // Chat outputs - "hud.chat.online_msg": "[{name}] je teď online", - "hud.chat.offline_msg": "[{name}] se odhlásil", - - "hud.chat.default_death_msg": "[{name}] zemřel/a", - "hud.chat.environmental_kill_msg": "[{name}] zemřel/a v {environment}", - "hud.chat.fall_kill_msg": "[{name}] zemřel/a pádem", - "hud.chat.suicide_msg": "[{name}] si způsobil/a zranění a zemřel/a", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} způsobeno [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] porazil/a [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] zastřelil/a [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] vyhodil/a do vzduchu [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] zabil/a [{victim}] kouzlem", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} způsobeno {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} zabil/a [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} zastřelil/a [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} vyhodil/a do vzduchu [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} zabil/a [{victim}] kouzlem", - "hud.chat.npc_other_kill_msg": "{attacker} zabil/a [{victim}]", - - "hud.chat.loot_msg": "Sebral/a jsi [{item}]", - "hud.chat.loot_fail": "Máš plný inventář!", - "hud.chat.goodbye": "Nashledanou!", - "hud.chat.connection_lost": "Připojení ztraceno. Ukončuji za {time} sekund.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/crafting.ftl b/assets/voxygen/i18n/cz_CZ/hud/crafting.ftl new file mode 100644 index 0000000000..97e597e488 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/crafting.ftl @@ -0,0 +1,25 @@ +hud-crafting = Výroba +hud-crafting-recipes = Recepty +hud-crafting-ingredients = Ingredience: +hud-crafting-craft = Vyrobit +hud-crafting-tool_cata = Vyžaduje: +hud-crafting-req_crafting_station = Vyžaduje: +hud-crafting-anvil = Kovadlina +hud-crafting-cauldron = Kotel +hud-crafting-cooking_pot = Hrnec na vaření +hud-crafting-crafting_bench = Řemeslný stůl +hud-crafting-forge = Výheň +hud-crafting-loom = Tkalcovský stav +hud-crafting-spinning_wheel = Kolovrat +hud-crafting-tanning_rack = Koželužský stojan +hud-crafting-tabs-all = Vše +hud-crafting-tabs-armor = Brnění +hud-crafting-tabs-dismantle = Rozebrat +hud-crafting-tabs-food = Jídlo +hud-crafting-tabs-glider = Kluzáky +hud-crafting-tabs-potion = Lektvary +hud-crafting-tabs-tool = Nástroje +hud-crafting-tabs-utility = Užitečnosti +hud-crafting-tabs-weapon = Zbraně +hud-crafting-tabs-bag = Tašky +hud-crafting-tabs-processed_material = Materiály \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/crafting.ron b/assets/voxygen/i18n/cz_CZ/hud/crafting.ron deleted file mode 100644 index afc3dc9d93..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/crafting.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "hud.crafting": "Výroba", - "hud.crafting.recipes": "Recepty", - "hud.crafting.ingredients": "Ingredience:", - "hud.crafting.craft": "Vyrobit", - "hud.crafting.tool_cata": "Vyžaduje:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Vyžaduje:", - "hud.crafting.anvil": "Kovadlina", - "hud.crafting.cauldron": "Kotel", - "hud.crafting.cooking_pot": "Hrnec na vaření", - "hud.crafting.crafting_bench": "Řemeslný stůl", - "hud.crafting.forge": "Výheň", - "hud.crafting.loom": "Tkalcovský stav", - "hud.crafting.spinning_wheel": "Kolovrat", - "hud.crafting.tanning_rack": "Koželužský stojan", - // Tabs - "hud.crafting.tabs.all": "Vše", - "hud.crafting.tabs.armor": "Brnění", - "hud.crafting.tabs.dismantle": "Rozebrat", - "hud.crafting.tabs.food": "Jídlo", - "hud.crafting.tabs.glider": "Kluzáky", - "hud.crafting.tabs.potion": "Lektvary", - "hud.crafting.tabs.tool": "Nástroje", - "hud.crafting.tabs.utility": "Užitečnosti", - "hud.crafting.tabs.weapon": "Zbraně", - "hud.crafting.tabs.bag": "Tašky", - "hud.crafting.tabs.processed_material": "Materiály", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/group.ftl b/assets/voxygen/i18n/cz_CZ/hud/group.ftl new file mode 100644 index 0000000000..0a51e2e1f7 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Skupina +hud-group-invite_to_join = [{ $name }] tě pozval do skupiny! +hud-group-invite_to_trade = [{ $name }] by chtěl s tebou obchodovat. +hud-group-invite = Pozvat +hud-group-kick = Vyhodit +hud-group-assign_leader = Nastavit Vůdcem +hud-group-leave = Opustit Skupinu +hud-group-dead = Mrtvý +hud-group-out_of_range = Nedosažitelný +hud-group-add_friend = Přidat Přítele +hud-group-link_group = Propojit Skupiny +hud-group-in_menu = V Menu +hud-group-members = Členové Skupiny \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/group.ron b/assets/voxygen/i18n/cz_CZ/hud/group.ron deleted file mode 100644 index f9cfb73264..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "hud.group": "Skupina", - "hud.group.invite_to_join": "[{name}] tě pozval do skupiny!", - "hud.group.invite_to_trade": "[{name}] by chtěl s tebou obchodovat.", - "hud.group.invite": "Pozvat", - "hud.group.kick": "Vyhodit", - "hud.group.assign_leader": "Nastavit Vůdcem", - "hud.group.leave": "Opustit Skupinu", - "hud.group.dead" : "Mrtvý", - "hud.group.out_of_range": "Nedosažitelný", - "hud.group.add_friend": "Přidat Přítele", - "hud.group.link_group": "Propojit Skupiny", - "hud.group.in_menu": "V Menu", - "hud.group.members": "Členové Skupiny", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/map.ftl b/assets/voxygen/i18n/cz_CZ/hud/map.ftl new file mode 100644 index 0000000000..1cb5f3aa8c --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/map.ftl @@ -0,0 +1,31 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Úkoly +hud-map-topo_map = Topografická +hud-map-difficulty = Obtížnost +hud-map-towns = Města +hud-map-castles = Hrady +hud-map-dungeons = Kobky +hud-map-caves = Jeskyně +hud-map-cave = Jeskyně +hud-map-peaks = Hory +hud-map-voxel_map = Voxelová mapa +hud-map-trees = Velké Stromy +hud-map-tree = Velký Strom +hud-map-town = Město +hud-map-castle = Hrad +hud-map-dungeon = Kobka +hud-map-difficulty_dungeon = + Kobka + + Obtížnost: { $difficulty } +hud-map-drag = Táhnout +hud-map-zoom = Přiblížit +hud-map-mid_click = Vlastní bod v mapě +hud-map-recenter = Vycentrovat +hud-map-marked_location = Označená oblast +hud-map-marked_location_remove = Klikem odstranit +hud-map-change_map_mode = Změnit režim mapy +hud-map-toggle_minimap_voxel = Voxelová minimapa +hud-map-zoom_minimap_explanation = + Přibliž si minimapu + pro lepší detail oblasti kolem \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/map.ron b/assets/voxygen/i18n/cz_CZ/hud/map.ron deleted file mode 100644 index 5152549940..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Úkoly", - "hud.map.topo_map": "Topografická", - "hud.map.difficulty": "Obtížnost", - "hud.map.towns": "Města", - "hud.map.castles": "Hrady", - "hud.map.dungeons": "Kobky", - "hud.map.caves": "Jeskyně", - "hud.map.cave": "Jeskyně", - "hud.map.peaks": "Hory", - "hud.map.voxel_map": "Voxelová mapa", - "hud.map.trees": "Velké Stromy", - "hud.map.tree": "Velký Strom", - "hud.map.town": "Město", - "hud.map.castle": "Hrad", - "hud.map.dungeon": "Kobka", - "hud.map.difficulty_dungeon": "Kobka\n\nObtížnost: {difficulty}", - "hud.map.drag": "Táhnout", - "hud.map.zoom": "Přiblížit", - "hud.map.mid_click": "Vlastní bod v mapě", - "hud.map.recenter": "Vycentrovat", - "hud.map.marked_location": "Označená oblast", - "hud.map.marked_location_remove": "Klikem odstranit", - "hud.map.change_map_mode": "Změnit režim mapy", - "hud.map.toggle_minimap_voxel": "Voxelová minimapa", - "hud.map.zoom_minimap_explanation": "Přibliž si minimapu\npro lepší detail oblasti kolem", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/misc.ftl b/assets/voxygen/i18n/cz_CZ/hud/misc.ftl new file mode 100644 index 0000000000..77d3ced011 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/misc.ftl @@ -0,0 +1,34 @@ +hud-do_not_show_on_startup = Neukazovat při zapnutí +hud-show_tips = Ukázat tipy +hud-quests = Úkoly +hud-you_died = Zemřel/a jsi +hud-waypoint_saved = Bod uložen +hud-sp_arrow_txt = SP +hud-inventory_full = Plný inventář +hud-press_key_to_show_keybindings_fmt = [{ $key }] Nastavení ovládání +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lucerna +hud-press_key_to_show_debug_info_fmt = Stiskni { $key } pro zobrazení ladících informací +hud-press_key_to_toggle_keybindings_fmt = Stiskni { $key } pro přepnutí ovládání +hud-press_key_to_toggle_debug_info_fmt = Stiskni { $key } pro přepnutí ladících informací +hud-press_key_to_respawn = Stiskni { $key } pro oživení u posledního navštíveného táboráku. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Stiskni [ { $key } ] abys uvolnil/a kurzor a klikni na toto tlačítko! +hud-tutorial_elements = Výroba +hud-temp_quest_headline = Zdravím tě, cestovateli! +hud-temp_quest_text = + Pro začátek by ses mohl/a porozhlédnout po vesnici a pobrat nějaké zásoby. + + Smíš si vzít cokoliv budeš na své cestě potřebovat! + + Podívej se na spodní pravý roh obrazovky, kde máš různé věci, jako batoh, výrobu nebo mapu. + + Výrobní stanice ti umožní vyrábět brnění, zbraně, jídlo a mnoho dalšího! + + Divoká zvěř kolem města je skvělý zdroj kožešin k výrobě nějaké ochrany proti nebezpečím světa. + + Kdykoliv se na to budeš cítit, můžeš získat ještě lepší vybavení z mnoha výzev označených na mapě! +hud-spell = Zkušenosti +hud-diary = Deník +hud-free_look_indicator = Volný rozhled. Stiskni { $key } pro vypnutí. +hud-camera_clamp_indicator = Vertikální zámek kamery aktivní. Stiskni { $key } pro vypnutí. +hud-auto_walk_indicator = Automatická chůze aktivní \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/misc.ron b/assets/voxygen/i18n/cz_CZ/hud/misc.ron deleted file mode 100644 index 3cf21de572..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/misc.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "hud.do_not_show_on_startup": "Neukazovat při zapnutí", - "hud.show_tips": "Ukázat tipy", - "hud.quests": "Úkoly", - "hud.you_died": "Zemřel/a jsi", - "hud.waypoint_saved": "Bod uložen", - "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Plný inventář", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Nastavení ovládání", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lucerna", - "hud.press_key_to_show_debug_info_fmt": "Stiskni {key} pro zobrazení ladících informací", - "hud.press_key_to_toggle_keybindings_fmt": "Stiskni {key} pro přepnutí ovládání", - "hud.press_key_to_toggle_debug_info_fmt": "Stiskni {key} pro přepnutí ladících informací", - - // Respawn message - "hud.press_key_to_respawn": r#"Stiskni {key} pro oživení u posledního navštíveného táboráku."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Stiskni [ {key} ] abys uvolnil/a kurzor a klikni na toto tlačítko!"#, - "hud.tutorial_elements": r#"Výroba"#, - -"hud.temp_quest_headline": r#"Zdravím tě, cestovateli!"#, -"hud.temp_quest_text": r#"Pro začátek by ses mohl/a porozhlédnout po vesnici a pobrat nějaké zásoby. - -Smíš si vzít cokoliv budeš na své cestě potřebovat! - -Podívej se na spodní pravý roh obrazovky, kde máš různé věci, jako batoh, výrobu nebo mapu. - -Výrobní stanice ti umožní vyrábět brnění, zbraně, jídlo a mnoho dalšího! - -Divoká zvěř kolem města je skvělý zdroj kožešin k výrobě nějaké ochrany proti nebezpečím světa. - -Kdykoliv se na to budeš cítit, můžeš získat ještě lepší vybavení z mnoha výzev označených na mapě! -"#, - - "hud.spell": "Zkušenosti", - // Diary - "hud.diary": "Deník", - - "hud.free_look_indicator": "Volný rozhled. Stiskni {key} pro vypnutí.", - "hud.camera_clamp_indicator": "Vertikální zámek kamery aktivní. Stiskni {key} pro vypnutí.", - "hud.auto_walk_indicator": "Automatická chůze aktivní", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/sct.ftl b/assets/voxygen/i18n/cz_CZ/hud/sct.ftl new file mode 100644 index 0000000000..a69e159264 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Zk. +hud-sct-block = BLOKOVÁNO \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/sct.ron b/assets/voxygen/i18n/cz_CZ/hud/sct.ron deleted file mode 100644 index 6b7db65b75..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Zk.", - "hud.sct.block": "BLOKOVÁNO", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/settings.ftl b/assets/voxygen/i18n/cz_CZ/hud/settings.ftl new file mode 100644 index 0000000000..8a64aaf484 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/settings.ftl @@ -0,0 +1,119 @@ +hud-settings-general = Obecné +hud-settings-none = Nic +hud-settings-press_behavior-toggle = Přepnout +hud-settings-press_behavior-hold = Podržet +hud-settings-help_window = Okno nápovědy +hud-settings-debug_info = Ladící informace +hud-settings-show_hitboxes = Ukaž hitboxy +hud-settings-show_chat = Ukaž chat +hud-settings-show_hotkey_hints = Nápovědy k ovládání +hud-settings-tips_on_startup = Rady +hud-settings-ui_scale = Velikost UI +hud-settings-relative_scaling = Relativní škálování +hud-settings-custom_scaling = Vlastní škálování +hud-settings-crosshair = Zaměřování +hud-settings-opacity = Průhlednost +hud-settings-hotbar = Rychlá volba +hud-settings-toggle_shortcuts = Povolit Zkratky +hud-settings-buffs_skillbar = Buffy u Skillbaru +hud-settings-buffs_mmap = Buffy u Minimapy +hud-settings-toggle_bar_experience = Povolit Zkušenostní Bar +hud-settings-scrolling_combat_text = Létajíci Text v boji +hud-settings-incoming_damage = Příchozí Poškození +hud-settings-speech_bubble = Povídací Bublina +hud-settings-speech_bubble_dark_mode = Tmavá Povídací Bublina +hud-settings-speech_bubble_icon = Ikona Povídací Bubliny +hud-settings-energybar_numbers = Čísla u Lišty Energie +hud-settings-always_show_bars = Vždy Ukázat Lištu Energie +hud-settings-values = Hodnoty +hud-settings-percentages = Procenta +hud-settings-chat = Chat +hud-settings-background_opacity = Průhlednost Pozadí +hud-settings-chat_character_name = Jména Postav v Chatu +hud-settings-loading_tips = Rady v Načítání +hud-settings-reset_interface = Výchozí Nastavení +hud-settings-pan_sensitivity = Citlivost Rozhledu +hud-settings-zoom_sensitivity = Citlivost Přiblížení +hud-settings-camera_clamp_angle = Úhel pro vertikální režim upnutí kamery +hud-settings-invert_scroll_zoom = Invertovat rolování zvětšení +hud-settings-invert_mouse_y_axis = Obrátit osu Y myši +hud-settings-invert_controller_y_axis = Obrátit osu Y ovladače +hud-settings-enable_mouse_smoothing = Vyhlazení kamery +hud-settings-free_look_behavior = Chování volného pohledu +hud-settings-auto_walk_behavior = Chování Auto chůze +hud-settings-camera_clamp_behavior = Chování připnuté kamery +hud-settings-player_physics_behavior = Fyzika hráče (experimentální) +hud-settings-stop_auto_walk_on_input = Přestat Auto chodit při pohybu +hud-settings-auto_camera = Automatická kamera +hud-settings-reset_gameplay = Výchozí Nastavení +hud-settings-view_distance = Vykreslovací Vzdálenost +hud-settings-sprites_view_distance = Vykreslovací Vzdálenost Spritů +hud-settings-figures_view_distance = Vykreslovací Vzdálenost Entit +hud-settings-maximum_fps = Maximum FPS +hud-settings-present_mode = Režim snímkování +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = Úhel pohledu (stupně) +hud-settings-gamma = Gama +hud-settings-exposure = Expozice +hud-settings-ambiance = Jas prostředí +hud-settings-antialiasing_mode = Režim AntiAliasing +hud-settings-upscale_factor = Interní Rozlišení +hud-settings-cloud_rendering_mode = Vykreslování Mraků +hud-settings-fluid_rendering_mode = Vykreslování Vody +hud-settings-fluid_rendering_mode-cheap = Levný +hud-settings-fluid_rendering_mode-shiny = Blíštivý +hud-settings-cloud_rendering_mode-minimal = Minimalní +hud-settings-cloud_rendering_mode-low = Nizký +hud-settings-cloud_rendering_mode-medium = Střední +hud-settings-cloud_rendering_mode-high = Vysoký +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Celá Obrazovka +hud-settings-fullscreen_mode = Režim Celé obrazovky +hud-settings-fullscreen_mode-exclusive = Exkluzivní +hud-settings-fullscreen_mode-borderless = Bezokrajový +hud-settings-gpu_profiler = Povolit časování GPU (nepodporováno všude) +hud-settings-particles = Částice +hud-settings-lossy_terrain_compression = Ztrátová komprese terénu +hud-settings-resolution = Rozlišení +hud-settings-bit_depth = Bitová Hloubka +hud-settings-refresh_rate = Obnovovací Frekvence +hud-settings-lighting_rendering_mode = Vykreslování Osvětlení +hud-settings-lighting_rendering_mode-ashikhmin = Typ A - Vysoký +hud-settings-lighting_rendering_mode-blinnphong = Typ B - Střední +hud-settings-lighting_rendering_mode-lambertian = Typ L - Levný +hud-settings-shadow_rendering_mode = Vykreslování Stínů +hud-settings-shadow_rendering_mode-none = Nic +hud-settings-shadow_rendering_mode-cheap = Levný +hud-settings-shadow_rendering_mode-map = Mapa +hud-settings-shadow_rendering_mode-map-resolution = Rozlišení +hud-settings-lod_detail = LoD Detail +hud-settings-save_window_size = Pamatovat velikost okna +hud-settings-reset_graphics = Výchozí nastavení +hud-settings-bloom = Bloom +hud-settings-master_volume = Celková Hlasitost +hud-settings-inactive_master_volume_perc = Hlasitost Na Pozadí +hud-settings-music_volume = Hlasitost Hudby +hud-settings-sound_effect_volume = Hlasitost Efektů +hud-settings-audio_device = Zvukové Zařízení +hud-settings-reset_sound = Výchozí Nastavení +hud-settings-english_fallback = Zobrazit Angličtinu pro chybějící překlady +hud-settings-awaitingkey = Zmáčkni klávesu... +hud-settings-unbound = Žádná +hud-settings-reset_keybinds = Výchozí +hud-settings-chat_tabs = Záložky Chatu +hud-settings-label = Název: +hud-settings-delete = Smazat +hud-settings-show_all = Ukaž vše +hud-settings-messages = Zprávy +hud-settings-activity = Aktivity +hud-settings-death = Smrt +hud-settings-group = Skupina +hud-settings-faction = Faction +hud-settings-world = Svět +hud-settings-region = Region +hud-settings-say = Říct +hud-settings-all = Vše +hud-settings-group_only = Pouze skupina +hud-settings-reset_chat = Výchozí Nastavení \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/settings.ron b/assets/voxygen/i18n/cz_CZ/hud/settings.ron deleted file mode 100644 index a76646c6ae..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/settings.ron +++ /dev/null @@ -1,137 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - // Settings - "hud.settings.general": "Obecné", - "hud.settings.none": "Nic", - "hud.settings.press_behavior.toggle": "Přepnout", - "hud.settings.press_behavior.hold": "Podržet", - "hud.settings.help_window": "Okno nápovědy", - "hud.settings.debug_info": "Ladící informace", - "hud.settings.show_hitboxes": "Ukaž hitboxy", - "hud.settings.show_chat": "Ukaž chat", - "hud.settings.show_hotkey_hints": "Nápovědy k ovládání", - "hud.settings.tips_on_startup": "Rady", - "hud.settings.ui_scale": "Velikost UI", - "hud.settings.relative_scaling": "Relativní škálování", - "hud.settings.custom_scaling": "Vlastní škálování", - "hud.settings.crosshair": "Zaměřování", - "hud.settings.opacity": "Průhlednost", - "hud.settings.hotbar": "Rychlá volba", - "hud.settings.toggle_shortcuts": "Povolit Zkratky", - "hud.settings.buffs_skillbar": "Buffy u Skillbaru", - "hud.settings.buffs_mmap": "Buffy u Minimapy", - "hud.settings.toggle_bar_experience": "Povolit Zkušenostní Bar", - "hud.settings.scrolling_combat_text": "Létajíci Text v boji", - "hud.settings.incoming_damage": "Příchozí Poškození", - "hud.settings.speech_bubble": "Povídací Bublina", - "hud.settings.speech_bubble_dark_mode": "Tmavá Povídací Bublina", - "hud.settings.speech_bubble_icon": "Ikona Povídací Bubliny", - "hud.settings.energybar_numbers": "Čísla u Lišty Energie", - "hud.settings.always_show_bars": "Vždy Ukázat Lištu Energie", - "hud.settings.values": "Hodnoty", - "hud.settings.percentages": "Procenta", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Průhlednost Pozadí", - "hud.settings.chat_character_name": "Jména Postav v Chatu", - "hud.settings.loading_tips": "Rady v Načítání", - "hud.settings.reset_interface": "Výchozí Nastavení", - - "hud.settings.pan_sensitivity": "Citlivost Rozhledu", - "hud.settings.zoom_sensitivity": "Citlivost Přiblížení", - "hud.settings.camera_clamp_angle": "Úhel pro vertikální režim upnutí kamery", - "hud.settings.invert_scroll_zoom": "Invertovat rolování zvětšení", - "hud.settings.invert_mouse_y_axis": "Obrátit osu Y myši", - "hud.settings.invert_controller_y_axis": "Obrátit osu Y ovladače", - "hud.settings.enable_mouse_smoothing": "Vyhlazení kamery", - "hud.settings.free_look_behavior": "Chování volného pohledu", - "hud.settings.auto_walk_behavior": "Chování Auto chůze", - "hud.settings.camera_clamp_behavior": "Chování připnuté kamery", - "hud.settings.player_physics_behavior": "Fyzika hráče (experimentální)", - "hud.settings.stop_auto_walk_on_input": "Přestat Auto chodit při pohybu", - "hud.settings.auto_camera": "Automatická kamera", - "hud.settings.reset_gameplay": "Výchozí Nastavení", - - "hud.settings.view_distance": "Vykreslovací Vzdálenost", - "hud.settings.sprites_view_distance": "Vykreslovací Vzdálenost Spritů", - "hud.settings.figures_view_distance": "Vykreslovací Vzdálenost Entit", - "hud.settings.maximum_fps": "Maximum FPS", - "hud.settings.present_mode": "Režim snímkování", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "Úhel pohledu (stupně)", - "hud.settings.gamma": "Gama", - "hud.settings.exposure": "Expozice", - "hud.settings.ambiance": "Jas prostředí", - "hud.settings.antialiasing_mode": "Režim AntiAliasing", - "hud.settings.upscale_factor": "Interní Rozlišení", - "hud.settings.cloud_rendering_mode": "Vykreslování Mraků", - "hud.settings.fluid_rendering_mode": "Vykreslování Vody", - "hud.settings.fluid_rendering_mode.cheap": "Levný", - "hud.settings.fluid_rendering_mode.shiny": "Blíštivý", - "hud.settings.cloud_rendering_mode.minimal": "Minimalní", - "hud.settings.cloud_rendering_mode.low": "Nizký", - "hud.settings.cloud_rendering_mode.medium": "Střední", - "hud.settings.cloud_rendering_mode.high": "Vysoký", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Celá Obrazovka", - "hud.settings.fullscreen_mode": "Režim Celé obrazovky", - "hud.settings.fullscreen_mode.exclusive": "Exkluzivní", - "hud.settings.fullscreen_mode.borderless": "Bezokrajový", - "hud.settings.gpu_profiler": "Povolit časování GPU (nepodporováno všude)", - "hud.settings.particles": "Částice", - "hud.settings.lossy_terrain_compression": "Ztrátová komprese terénu", - "hud.settings.resolution": "Rozlišení", - "hud.settings.bit_depth": "Bitová Hloubka", - "hud.settings.refresh_rate": "Obnovovací Frekvence", - "hud.settings.lighting_rendering_mode": "Vykreslování Osvětlení", - "hud.settings.lighting_rendering_mode.ashikhmin": "Typ A - Vysoký ", - "hud.settings.lighting_rendering_mode.blinnphong": "Typ B - Střední", - "hud.settings.lighting_rendering_mode.lambertian": "Typ L - Levný", - "hud.settings.shadow_rendering_mode": "Vykreslování Stínů", - "hud.settings.shadow_rendering_mode.none": "Nic", - "hud.settings.shadow_rendering_mode.cheap": "Levný", - "hud.settings.shadow_rendering_mode.map": "Mapa", - "hud.settings.shadow_rendering_mode.map.resolution": "Rozlišení", - "hud.settings.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Pamatovat velikost okna", - "hud.settings.reset_graphics": "Výchozí nastavení", - "hud.settings.bloom": "Bloom", - - "hud.settings.master_volume": "Celková Hlasitost", - "hud.settings.inactive_master_volume_perc": "Hlasitost Na Pozadí", - "hud.settings.music_volume": "Hlasitost Hudby", - "hud.settings.sound_effect_volume": "Hlasitost Efektů", - "hud.settings.audio_device": "Zvukové Zařízení", - "hud.settings.reset_sound": "Výchozí Nastavení", - - "hud.settings.english_fallback": "Zobrazit Angličtinu pro chybějící překlady", - - "hud.settings.awaitingkey": "Zmáčkni klávesu...", - "hud.settings.unbound": "Žádná", - "hud.settings.reset_keybinds": "Výchozí", - - "hud.settings.chat_tabs": "Záložky Chatu", - "hud.settings.label": "Název:", - "hud.settings.delete": "Smazat", - "hud.settings.show_all": "Ukaž vše", - "hud.settings.messages": "Zprávy", - "hud.settings.activity": "Aktivity", - "hud.settings.death": "Smrt", - "hud.settings.group": "Skupina", - "hud.settings.faction": "Faction", - "hud.settings.world": "Svět", - "hud.settings.region": "Region", - "hud.settings.say": "Říct", - "hud.settings.all": "Vše", - "hud.settings.group_only": "Pouze skupina", - "hud.settings.reset_chat" : "Výchozí Nastavení", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/skills.ftl b/assets/voxygen/i18n/cz_CZ/hud/skills.ftl new file mode 100644 index 0000000000..349c9c7553 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/skills.ftl @@ -0,0 +1,230 @@ +hud-rank_up = Nový Bod Zkušenosti +hud-skill-sp_available = { $number } bodů dostupných +hud-skill-not_unlocked = Ještě neodemčeno +hud-skill-req_sp ={"\u000A"} + + Vyžaduje { $number } bodů +hud-skill-inc_health_title = Zvýší Zdraví +hud-skill-inc_health = Zvýší maximální zdraví o { $boost }{ $SP } +hud-skill-inc_energy_title = Zvýší Energii +hud-skill-inc_energy = Zvýší Energii o { $boost }{ $SP } +hud-skill-unlck_sword_title = Odemknutí Meče +hud-skill-unlck_sword = Odemkne strom dovedností pro meče{ $SP } +hud-skill-unlck_axe_title = Odemknutí Sekery +hud-skill-unlck_axe = Odemkne strom dovedností pro sekery{ $SP } +hud-skill-unlck_hammer_title = Odemknutí Kladiva +hud-skill-unlck_hammer = Odemkne strom dovedností pro kladivo{ $SP } +hud-skill-unlck_bow_title = Odemknutí Luku +hud-skill-unlck_bow = Odemkne strom dovedností pro luk{ $SP } +hud-skill-unlck_staff_title = Odemknutí Hole +hud-skill-unlck_staff = Odemkne strom dovedností pro hůl{ $SP } +hud-skill-unlck_sceptre_title = Odemknutí Žezla +hud-skill-unlck_sceptre = Odemkne strom dovedností pro žezlo{ $SP } +hud-skill-dodge_title = Vyhnutí +hud-skill-dodge = Vyhnutí se aktivuje stiskem prostředního tlačítka myši a zajišťuje dočasnou imunitu vůči útokům zblízka (iframes) během kutálení. +hud-skill-roll_energy_title = Spotřeba Energie pro Kotrmelec +hud-skill-roll_energy = Kotrmelec použije o { $boost }% méně energie{ $SP } +hud-skill-roll_speed_title = Rychlost Kotrmelce +hud-skill-roll_speed = Kotrmelec je o { $boost }% rychlejší{ $SP } +hud-skill-roll_dur_title = Délka Kotrmelce +hud-skill-roll_dur = Kotrmelec je delší o { $boost }%{ $SP } +hud-skill-climbing_title = Lezení +hud-skill-climbing = Skočíš výš +hud-skill-climbing_cost_title = Cena Lezení +hud-skill-climbing_cost = Lezení spotřebuje o { $boost }% méně Výdrže{ $SP } +hud-skill-climbing_speed_title = Rychlost Lezení +hud-skill-climbing_speed = Lezení je o { $boost }% rychlejší{ $SP } +hud-skill-swim_title = Plavání +hud-skill-swim = Pohyb v mokrém prostředí +hud-skill-swim_speed_title = Rychlost plávání +hud-skill-swim_speed = Plaveš o { $boost }% rychleji{ $SP } +hud-skill-sc_lifesteal_title = Paprsek Životokrádeže +hud-skill-sc_lifesteal = Vysává život z nepřátel +hud-skill-sc_lifesteal_damage_title = Poškození +hud-skill-sc_lifesteal_damage = Přídá o { $boost }% více poškození{ $SP } +hud-skill-sc_lifesteal_range_title = Dosah +hud-skill-sc_lifesteal_range = Paprsek dosáhne o { $boost }% dále{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Životokrádež +hud-skill-sc_lifesteal_lifesteal = Konvertuje o { $boost }% více poškození na život{ $SP } +hud-skill-sc_lifesteal_regen_title = Obnova Energie +hud-skill-sc_lifesteal_regen = Doplní energii o { $boost }%{ $SP } +hud-skill-sc_heal_title = Léčebná Aura +hud-skill-sc_heal = Vyléčí vaše přátele pomocí krve nepřátel, k aktivaci vyžaduje kombo +hud-skill-sc_heal_heal_title = Léčení +hud-skill-sc_heal_heal = Zvýší efektivnost léčby o { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Spotřeba Energie +hud-skill-sc_heal_cost = Léčení spotřebuje o { $boost }% méně Výdrže{ $SP } +hud-skill-sc_heal_duration_title = Trvání +hud-skill-sc_heal_duration = Efekt tvojí léčebné aury je o { $boost }% delší{ $SP } +hud-skill-sc_heal_range_title = Dosah +hud-skill-sc_heal_range = Aura dosáhne dále o { $boost }% { $SP } +hud-skill-sc_wardaura_unlock_title = Ochranářská Aura +hud-skill-sc_wardaura_unlock = Dovolí ochránit přátele před útoky{ $SP } +hud-skill-sc_wardaura_strength_title = Síla +hud-skill-sc_wardaura_strength = Síla ochrany se zvýší o { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Trvání +hud-skill-sc_wardaura_duration = Efekt vaší ochrany potrvá o { $boost }% déle{ $SP } +hud-skill-sc_wardaura_range_title = Dosah +hud-skill-sc_wardaura_range = Ochrana dosáhne o { $boot }% dále{ $SP } +hud-skill-sc_wardaura_cost_title = Spotřeba Energie +hud-skill-sc_wardaura_cost = Tvorba ochrany stojí o { $boost }% méně Energie{ $SP } +hud-skill-st_shockwave_range_title = Dosah Rázové vlny +hud-skill-st_shockwave_range = Umožný hodit věci mimo dosah. Dosah se zvýšil o { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Spotřeba Rázové vlny +hud-skill-st_shockwave_cost = Snižuje spotřebu energie pro házení bezbraných vesničanů o { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Ráz Rázové vlny +hud-skill-st_shockwave_knockback = Zvyšuje odhození o { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Poškození Rázové Vlny +hud-skill-st_shockwave_damage = Zvyšuje poškození o { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Odemknout Rázovou Vlnu +hud-skill-st_shockwave_unlock = Umožnuje odhazovat nepřátele pomocí ohně{ $SP } +hud-skill-st_flamethrower_title = Plamenomet +hud-skill-st_flamethrower = Metá oheň, jdeme péct +hud-skill-st_flame_velocity_title = Rychlost šíření +hud-skill-st_flame_velocity = Plamen se šíří o { $boost }% rychleji{ $SP } +hud-skill-st_flamethrower_range_title = Dosah Plamenometu +hud-skill-st_flamethrower_range = Když plameny nedosáhnou, tak je potřeba je zvětšit o { $boost }% { $SP } +hud-skill-st_energy_drain_title = Spotřeba Energie +hud-skill-st_energy_drain = Zmenší spotřebu energie o { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Poškození Plamenometem +hud-skill-st_flamethrower_damage = Zvýší poškození o { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Rozsah Exploze +hud-skill-st_explosion_radius = Čím větší, tím lepší. Zvětší Rádius Exploze o { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Obnova Energie +hud-skill-st_energy_regen = Zvýší zisk energie o { $boost }%{ $SP } +hud-skill-st_fireball_title = Ohnivá Koule +hud-skill-st_fireball = Vystřelí ohnivou kouli, která exploduje při dopadu +hud-skill-st_damage_title = Poškození +hud-skill-st_damage = Zvětší poškození o { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Rychlost Projektilu +hud-skill-bow_projectile_speed = Umožňuje střílet šípy dále a rychleji o { $boost }%{ $SP } +hud-skill-bow_charged_title = Silný Výstřel +hud-skill-bow_charged = Protože si počkal/a dýl +hud-skill-bow_charged_damage_title = Silné Poškození +hud-skill-bow_charged_damage = Zvyšuje poškození o { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Obnova energie +hud-skill-bow_charged_energy_regen = Zvyšuje obnovu energie o { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Silný Ráz +hud-skill-bow_charged_knockback = Odhoď neprátele o { $boost }% dále{ $SP } +hud-skill-bow_charged_speed_title = Rychlost natažení +hud-skill-bow_charged_speed = Zrychluje rychlost nátahu o { $boost }%{ $SP } +hud-skill-bow_charged_move_speed_title = Rychlost při míření +hud-skill-bow_charged_move_speed = Zvýší pohyb během natahování luku o { $boost }%{ $SP } +hud-skill-bow_repeater_title = Opakovačka +hud-skill-bow_repeater = Čím déle střílíš, tím rychleji střílíš +hud-skill-bow_repeater_damage_title = Poškození +hud-skill-bow_repeater_damage = Zvýší poškození o { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Zmenšení Spotřeby +hud-skill-bow_repeater_cost = Sníží spotřebu energie o { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Kadence Opakovačky +hud-skill-bow_repeater_speed = Zvyšuje kadenci, kterou střílíš šípy, o { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Odemkne Brokovnici +hud-skill-bow_shotgun_unlock = Odemyká možnost vystřelit několik šípů najednou{ $SP } +hud-skill-bow_shotgun_damage_title = Poškození Brokovnice +hud-skill-bow_shotgun_damage = Zvyšuje udělené poškození o { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Spotřeba Brokovnice +hud-skill-bow_shotgun_cost = Snižuje spotřebu energie o { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Počet Šípů +hud-skill-bow_shotgun_arrow_count = Zvyšuje počet šípů vystřelených v jedné dávce o { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Rozptyl Brokovnice +hud-skill-bow_shotgun_spread = Snižuje rozptyl šípů o { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Rádius Přískoku +hud-skill-hmr_leap_radius = Zvětšuje rádius boucnutí do země o { $boost } metr{ $SP } +hud-skill-hmr_leap_distance_title = Vzdálenost Přískoku +hud-skill-hmr_leap_distance = Zvětší vzdálenost o { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Spotřeba při Přískoku +hud-skill-hmr_leap_cost = Sníží cenu skoku o { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Odražení +hud-skill-hmr_leap_knockback = Zvyšuje odražení z Vyšlehnutí o { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Poškození Přískoku +hud-skill-hmr_leap_damage = Zvyšuje poškození při Přískoku o { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Odemknout Přískok +hud-skill-hmr_unlock_leap = Odemkne přískok{ $SP } +hud-skill-hmr_charged_melee_title = Silný Úder +hud-skill-hmr_charged_melee = Útok na blízko, ale silnější +hud-skill-hmr_charged_rate_title = Rychlost Nápřahu +hud-skill-hmr_charged_rate = Zvýší rychlost napřažení k úderu o { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Menší Spotřeba Energie +hud-skill-hmr_charged_melee_nrg_drain = Snižuje spotřebu energie během napřažení o { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Poškození +hud-skill-hmr_charged_melee_damage = Zvětší poškození silného úderu o { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Odhození +hud-skill-hmr_charged_melee_knockback = Masivně zvětšuje potenciální odhození silným úderem o { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Jednoduchý Úder +hud-skill-hmr_single_strike = Jednoduchý jako ty +hud-skill-hmr_single_strike_regen_title = Regenerace Energie +hud-skill-hmr_single_strike_regen = Zvyšuje energii při každém povedeném úderu{ $SP } +hud-skill-hmr_single_strike_speed_title = Rychlost Jednoduchého Útoku +hud-skill-hmr_single_strike_speed = Zvýší rychlost útoku při každém povedeném úderu{ $SP } +hud-skill-hmr_single_strike_damage_title = Poškození Jednoduchého Útoku +hud-skill-hmr_single_strike_damage = Při každém povedeném úderu zvyšuje poškození{ $SP } +hud-skill-hmr_single_strike_knockback_title = Odražení pomocí Jednoduchého Útoku +hud-skill-hmr_single_strike_knockback = Zvyšuje potenciální odhození o { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Trojtý Úder +hud-skill-sw_trip_str = Udeříš až 3x +hud-skill-sw_trip_str_combo_title = Kombo Trojtého Úderu +hud-skill-sw_trip_str_combo = Odemkne škálování kombíček na trojitém útoku{ $SP } +hud-skill-sw_trip_str_dmg_title = Poškození Trojitým Úderem +hud-skill-sw_trip_str_dmg = Zvyšuje poškození při každém podařeném úderu{ $SP } +hud-skill-sw_trip_str_sp_title = Rychlost Trojtého Úderu +hud-skill-sw_trip_str_sp = Zvýší rychlost útoku při každém úspešném úderu{ $SP } +hud-skill-sw_trip_str_reg_title = Regenerace při Trojtém Úderu +hud-skill-sw_trip_str_reg = Regeneruje Výdrž při každém úspešném úderu{ $SP } +hud-skill-sw_dash_title = Dash +hud-skill-sw_dash = Proběhni přes nepřátele +hud-skill-sw_dash_dmg_title = Poškození Dashem +hud-skill-sw_dash_dmg = Zvýší poškození o 20%{ $SP } +hud-skill-sw_dash_drain_title = Menší spotřeba při Dashy +hud-skill-sw_dash_drain = Sníží průběžnou spotřebu energie o 25%{ $SP } +hud-skill-sw_dash_cost_title = Cena Dashe +hud-skill-sw_dash_cost = Sníží celkovou spotřebu energie o 25%{ $SP } +hud-skill-sw_dash_speed_title = Rychlost Dashe +hud-skill-sw_dash_speed = Zvýší rychlost při Dashování o 30%{ $SP } +hud-skill-sw_dash_inf_title = Nekoneční Dash +hud-skill-sw_dash_inf = Nechá tě používát Dash nekonečně dlouho, než ti dojde energie{ $SP } +hud-skill-sw_dash_scale_title = Škálování Poškození při Dashy +hud-skill-sw_dash_scale = Zvýší škálování poškození o 20%{ $SP } +hud-skill-sw_spin_title = Odemknout Roztočení +hud-skill-sw_spin = Odemkne roztočení{ $SP } +hud-skill-sw_spin_dmg_title = Poškození Roztočení +hud-skill-sw_spin_dmg = Zvýší poškození, které udělíš o 40%{ $SP } +hud-skill-sw_spin_spd_title = Rychlost Roztočení +hud-skill-sw_spin_spd = Zvýší rychlost roztočení o 25%{ $SP } +hud-skill-sw_spin_cost_title = Cena Roztočení +hud-skill-sw_spin_cost = Sníží cenu roztočení o 25%{ $SP } +hud-skill-sw_spin_spins_title = Počet točení při Roztočení +hud-skill-sw_spin_spins = Zvýší počet otoček během roztočení{ $SP } +hud-skill-sw_interrupt_title = Překažení Útoků +hud-skill-sw_interrupt = Dokáže ihned přerušit útok dalším útokem{ $SP } +hud-skill-axe_double_strike_title = Dvojtý Úder +hud-skill-axe_double_strike = Skácej své nepřátele +hud-skill-axe_double_strike_combo_title = Kombo Dvojtého Úderu +hud-skill-axe_double_strike_combo = Odemkne Dvojtý Útok{ $SP } +hud-skill-axe_double_strike_damage_title = Poškození Dvojtého Úderu +hud-skill-axe_double_strike_damage = Zvyšuje poškození při každém podařeném úderu{ $SP } +hud-skill-axe_double_strike_speed_title = Rychlost Dvojtého Úderu +hud-skill-axe_double_strike_speed = Zvyšuje Rychlost Útoku při každém podařeném úderu{ $SP } +hud-skill-axe_double_strike_regen_title = Regenerace při Dvojtém Útoku +hud-skill-axe_double_strike_regen = Zvyšuje regeneraci Výdrže při každém podařeném úderu{ $SP } +hud-skill-axe_spin_title = Roztočení Sekery +hud-skill-axe_spin = Točíš se správným směrem... +hud-skill-axe_infinite_axe_spin_title = Nekonečné Roztočení Sekery +hud-skill-axe_infinite_axe_spin = Toč Sekeru dokaď máš Energii{ $SP } +hud-skill-axe_spin_damage_title = Poškození Roztočení +hud-skill-axe_spin_damage = Zvýší poškození, které udělíš o 30%{ $SP } +hud-skill-axe_spin_helicopter_title = Vrtulníček +hud-skill-axe_spin_helicopter = Při pádu budeš padat pomaleji při Roztočení Sekery{ $SP } +hud-skill-axe_spin_speed_title = Rychlost Roztočení +hud-skill-axe_spin_speed = Zvýší Rychlost Roztočení o 25%{ $SP } +hud-skill-axe_spin_cost_title = Cena Roztočení +hud-skill-axe_spin_cost = Sníží spotřebu výdrže o 25%{ $SP } +hud-skill-axe_unlock_leap_title = Odemknout Vyšlehnutí +hud-skill-axe_unlock_leap = Odemkne Vyšlehnutí{ $SP } +hud-skill-axe_leap_damage_title = Poškození při Vyšlehnutí +hud-skill-axe_leap_damage = Zvýší poškození Vyšlehnutí o 35%{ $SP } +hud-skill-axe_leap_knockback_title = Odražení při Vyšlehnutí +hud-skill-axe_leap_knockback = Při Vyšlehnutí, zvýší odražení o 40%{ $SP } +hud-skill-axe_leap_cost_title = Cena Vyšlehnutí +hud-skill-axe_leap_cost = Sníží cenu vyšlehnutí o 25%{ $SP } +hud-skill-axe_leap_distance_title = Dosah Vyšlehnutí +hud-skill-axe_leap_distance = Zvýší dosah o 20%{ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/skills.ron b/assets/voxygen/i18n/cz_CZ/hud/skills.ron deleted file mode 100644 index 6a6f084898..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/skills.ron +++ /dev/null @@ -1,247 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - "hud.rank_up": "Nový Bod Zkušenosti", - "hud.skill.sp_available": "{number} bodů dostupných", - "hud.skill.not_unlocked": "Ještě neodemčeno", - "hud.skill.req_sp": "\n\nVyžaduje {number} bodů", - // Skills - // General - "hud.skill.inc_health_title": "Zvýší Zdraví", - "hud.skill.inc_health": "Zvýší maximální zdraví o {boost}{SP}", - "hud.skill.inc_energy_title": "Zvýší Energii", - "hud.skill.inc_energy": "Zvýší Energii o {boost}{SP}", - "hud.skill.unlck_sword_title": "Odemknutí Meče", - "hud.skill.unlck_sword": "Odemkne strom dovedností pro meče{SP}", - "hud.skill.unlck_axe_title": "Odemknutí Sekery", - "hud.skill.unlck_axe": "Odemkne strom dovedností pro sekery{SP}", - "hud.skill.unlck_hammer_title": "Odemknutí Kladiva", - "hud.skill.unlck_hammer": "Odemkne strom dovedností pro kladivo{SP}", - "hud.skill.unlck_bow_title": "Odemknutí Luku", - "hud.skill.unlck_bow": "Odemkne strom dovedností pro luk{SP}", - "hud.skill.unlck_staff_title": "Odemknutí Hole", - "hud.skill.unlck_staff": "Odemkne strom dovedností pro hůl{SP}", - "hud.skill.unlck_sceptre_title": "Odemknutí Žezla", - "hud.skill.unlck_sceptre": "Odemkne strom dovedností pro žezlo{SP}", - "hud.skill.dodge_title": "Vyhnutí", - "hud.skill.dodge": "Vyhnutí se aktivuje stiskem prostředního tlačítka myši a zajišťuje dočasnou imunitu vůči útokům zblízka (iframes) během kutálení.", - "hud.skill.roll_energy_title": "Spotřeba Energie pro Kotrmelec", - "hud.skill.roll_energy": "Kotrmelec použije o {boost}% méně energie{SP}", - "hud.skill.roll_speed_title": "Rychlost Kotrmelce", - "hud.skill.roll_speed": "Kotrmelec je o {boost}% rychlejší{SP}", - "hud.skill.roll_dur_title": "Délka Kotrmelce", - "hud.skill.roll_dur": "Kotrmelec je delší o {boost}%{SP}", - "hud.skill.climbing_title": "Lezení", - "hud.skill.climbing": "Skočíš výš", - "hud.skill.climbing_cost_title": "Cena Lezení", - "hud.skill.climbing_cost": "Lezení spotřebuje o {boost}% méně Výdrže{SP}", - "hud.skill.climbing_speed_title": "Rychlost Lezení", - "hud.skill.climbing_speed": "Lezení je o {boost}% rychlejší{SP}", - "hud.skill.swim_title": "Plavání", - "hud.skill.swim": "Pohyb v mokrém prostředí", - "hud.skill.swim_speed_title": "Rychlost plávání", - "hud.skill.swim_speed": "Plaveš o {boost}% rychleji{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Paprsek Životokrádeže", - "hud.skill.sc_lifesteal": "Vysává život z nepřátel", - "hud.skill.sc_lifesteal_damage_title": "Poškození", - "hud.skill.sc_lifesteal_damage": "Přídá o {boost}% více poškození{SP}", - "hud.skill.sc_lifesteal_range_title": "Dosah", - "hud.skill.sc_lifesteal_range": "Paprsek dosáhne o {boost}% dále{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Životokrádež", - "hud.skill.sc_lifesteal_lifesteal": "Konvertuje o {boost}% více poškození na život{SP}", - "hud.skill.sc_lifesteal_regen_title": "Obnova Energie", - "hud.skill.sc_lifesteal_regen": "Doplní energii o {boost}%{SP}", - "hud.skill.sc_heal_title": "Léčebná Aura", - "hud.skill.sc_heal": "Vyléčí vaše přátele pomocí krve nepřátel, k aktivaci vyžaduje kombo", - "hud.skill.sc_heal_heal_title": "Léčení", - "hud.skill.sc_heal_heal": "Zvýší efektivnost léčby o {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Spotřeba Energie", - "hud.skill.sc_heal_cost": "Léčení spotřebuje o {boost}% méně Výdrže{SP}", - "hud.skill.sc_heal_duration_title": "Trvání", - "hud.skill.sc_heal_duration": "Efekt tvojí léčebné aury je o {boost}% delší{SP}", - "hud.skill.sc_heal_range_title": "Dosah", - "hud.skill.sc_heal_range": "Aura dosáhne dále o {boost}% {SP}", - "hud.skill.sc_wardaura_unlock_title": "Ochranářská Aura", - "hud.skill.sc_wardaura_unlock": "Dovolí ochránit přátele před útoky{SP}", - "hud.skill.sc_wardaura_strength_title": "Síla", - "hud.skill.sc_wardaura_strength": "Síla ochrany se zvýší o {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Trvání", - "hud.skill.sc_wardaura_duration": "Efekt vaší ochrany potrvá o {boost}% déle{SP}", - "hud.skill.sc_wardaura_range_title": "Dosah", - "hud.skill.sc_wardaura_range": "Ochrana dosáhne o {boot}% dále{SP}", - "hud.skill.sc_wardaura_cost_title": "Spotřeba Energie", - "hud.skill.sc_wardaura_cost": "Tvorba ochrany stojí o {boost}% méně Energie{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Dosah Rázové vlny", - "hud.skill.st_shockwave_range" : "Umožný hodit věci mimo dosah. Dosah se zvýšil o {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Spotřeba Rázové vlny", - "hud.skill.st_shockwave_cost" : "Snižuje spotřebu energie pro házení bezbraných vesničanů o {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Ráz Rázové vlny", - "hud.skill.st_shockwave_knockback" : "Zvyšuje odhození o {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Poškození Rázové Vlny", - "hud.skill.st_shockwave_damage" : "Zvyšuje poškození o {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Odemknout Rázovou Vlnu", - "hud.skill.st_shockwave_unlock" : "Umožnuje odhazovat nepřátele pomocí ohně{SP}", - "hud.skill.st_flamethrower_title" : "Plamenomet", - "hud.skill.st_flamethrower" : "Metá oheň, jdeme péct", - "hud.skill.st_flame_velocity_title" : "Rychlost šíření", - "hud.skill.st_flame_velocity" : "Plamen se šíří o {boost}% rychleji{SP}", - "hud.skill.st_flamethrower_range_title" : "Dosah Plamenometu", - "hud.skill.st_flamethrower_range" : "Když plameny nedosáhnou, tak je potřeba je zvětšit o {boost}% {SP}", - "hud.skill.st_energy_drain_title" : "Spotřeba Energie", - "hud.skill.st_energy_drain" : "Zmenší spotřebu energie o {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Poškození Plamenometem", - "hud.skill.st_flamethrower_damage" : "Zvýší poškození o {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Rozsah Exploze", - "hud.skill.st_explosion_radius" : "Čím větší, tím lepší. Zvětší Rádius Exploze o {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Obnova Energie", - "hud.skill.st_energy_regen" : "Zvýší zisk energie o {boost}%{SP}", - "hud.skill.st_fireball_title" : "Ohnivá Koule", - "hud.skill.st_fireball" : "Vystřelí ohnivou kouli, která exploduje při dopadu", - "hud.skill.st_damage_title" : "Poškození", - "hud.skill.st_damage" : "Zvětší poškození o {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Rychlost Projektilu", - "hud.skill.bow_projectile_speed" : "Umožňuje střílet šípy dále a rychleji o {boost}%{SP}", - "hud.skill.bow_charged_title" : "Silný Výstřel", - "hud.skill.bow_charged" : "Protože si počkal/a dýl", - "hud.skill.bow_charged_damage_title" : "Silné Poškození", - "hud.skill.bow_charged_damage" : "Zvyšuje poškození o {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Obnova energie", - "hud.skill.bow_charged_energy_regen" : "Zvyšuje obnovu energie o {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Silný Ráz", - "hud.skill.bow_charged_knockback" : "Odhoď neprátele o {boost}% dále{SP}", - "hud.skill.bow_charged_speed_title" : "Rychlost natažení", - "hud.skill.bow_charged_speed" : "Zrychluje rychlost nátahu o {boost}%{SP}", - "hud.skill.bow_charged_move_speed_title" : "Rychlost při míření", - "hud.skill.bow_charged_move_speed" : "Zvýší pohyb během natahování luku o {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Opakovačka", - "hud.skill.bow_repeater" : "Čím déle střílíš, tím rychleji střílíš", - "hud.skill.bow_repeater_damage_title" : "Poškození", - "hud.skill.bow_repeater_damage" : "Zvýší poškození o {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Zmenšení Spotřeby", - "hud.skill.bow_repeater_cost" : "Sníží spotřebu energie o {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Kadence Opakovačky", - "hud.skill.bow_repeater_speed" : "Zvyšuje kadenci, kterou střílíš šípy, o {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Odemkne Brokovnici", - "hud.skill.bow_shotgun_unlock" : "Odemyká možnost vystřelit několik šípů najednou{SP}", - "hud.skill.bow_shotgun_damage_title" : "Poškození Brokovnice", - "hud.skill.bow_shotgun_damage" : "Zvyšuje udělené poškození o {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Spotřeba Brokovnice", - "hud.skill.bow_shotgun_cost" : "Snižuje spotřebu energie o {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Počet Šípů", - "hud.skill.bow_shotgun_arrow_count" : "Zvyšuje počet šípů vystřelených v jedné dávce o {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Rozptyl Brokovnice", - "hud.skill.bow_shotgun_spread" : "Snižuje rozptyl šípů o {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Rádius Přískoku", - "hud.skill.hmr_leap_radius" : "Zvětšuje rádius boucnutí do země o {boost} metr{SP}", - "hud.skill.hmr_leap_distance_title" : "Vzdálenost Přískoku", - "hud.skill.hmr_leap_distance" : "Zvětší vzdálenost o {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Spotřeba při Přískoku", - "hud.skill.hmr_leap_cost" : "Sníží cenu skoku o {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Odražení", - "hud.skill.hmr_leap_knockback" : "Zvyšuje odražení z Vyšlehnutí o {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Poškození Přískoku", - "hud.skill.hmr_leap_damage" : "Zvyšuje poškození při Přískoku o {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Odemknout Přískok", - "hud.skill.hmr_unlock_leap" : "Odemkne přískok{SP}", - "hud.skill.hmr_charged_melee_title" : "Silný Úder", - "hud.skill.hmr_charged_melee" : "Útok na blízko, ale silnější", - "hud.skill.hmr_charged_rate_title" : "Rychlost Nápřahu", - "hud.skill.hmr_charged_rate" : "Zvýší rychlost napřažení k úderu o {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Menší Spotřeba Energie", - "hud.skill.hmr_charged_melee_nrg_drain" : "Snižuje spotřebu energie během napřažení o {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Poškození", - "hud.skill.hmr_charged_melee_damage" : "Zvětší poškození silného úderu o {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Odhození", - "hud.skill.hmr_charged_melee_knockback" : "Masivně zvětšuje potenciální odhození silným úderem o {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Jednoduchý Úder", - "hud.skill.hmr_single_strike" : "Jednoduchý jako ty", - "hud.skill.hmr_single_strike_regen_title" : "Regenerace Energie", - "hud.skill.hmr_single_strike_regen" : "Zvyšuje energii při každém povedeném úderu{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Rychlost Jednoduchého Útoku", - "hud.skill.hmr_single_strike_speed" : "Zvýší rychlost útoku při každém povedeném úderu{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Poškození Jednoduchého Útoku", - "hud.skill.hmr_single_strike_damage" : "Při každém povedeném úderu zvyšuje poškození{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Odražení pomocí Jednoduchého Útoku", - "hud.skill.hmr_single_strike_knockback" : "Zvyšuje potenciální odhození o {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Trojtý Úder", - "hud.skill.sw_trip_str": "Udeříš až 3x", - "hud.skill.sw_trip_str_combo_title": "Kombo Trojtého Úderu", - "hud.skill.sw_trip_str_combo": "Odemkne škálování kombíček na trojitém útoku{SP}", - "hud.skill.sw_trip_str_dmg_title": "Poškození Trojitým Úderem", - "hud.skill.sw_trip_str_dmg": "Zvyšuje poškození při každém podařeném úderu{SP}", - "hud.skill.sw_trip_str_sp_title": "Rychlost Trojtého Úderu", - "hud.skill.sw_trip_str_sp": "Zvýší rychlost útoku při každém úspešném úderu{SP}", - "hud.skill.sw_trip_str_reg_title": "Regenerace při Trojtém Úderu", - "hud.skill.sw_trip_str_reg": "Regeneruje Výdrž při každém úspešném úderu{SP}", - "hud.skill.sw_dash_title": "Dash", - "hud.skill.sw_dash": "Proběhni přes nepřátele", - "hud.skill.sw_dash_dmg_title": "Poškození Dashem", - "hud.skill.sw_dash_dmg": "Zvýší poškození o 20%{SP}", - "hud.skill.sw_dash_drain_title": "Menší spotřeba při Dashy", - "hud.skill.sw_dash_drain": "Sníží průběžnou spotřebu energie o 25%{SP}", - "hud.skill.sw_dash_cost_title": "Cena Dashe ", - "hud.skill.sw_dash_cost": "Sníží celkovou spotřebu energie o 25%{SP}", - "hud.skill.sw_dash_speed_title": "Rychlost Dashe", - "hud.skill.sw_dash_speed": "Zvýší rychlost při Dashování o 30%{SP}", - "hud.skill.sw_dash_inf_title": "Nekoneční Dash", - "hud.skill.sw_dash_inf": "Nechá tě používát Dash nekonečně dlouho, než ti dojde energie{SP}", - "hud.skill.sw_dash_scale_title": "Škálování Poškození při Dashy", - "hud.skill.sw_dash_scale": "Zvýší škálování poškození o 20%{SP}", - "hud.skill.sw_spin_title": "Odemknout Roztočení", - "hud.skill.sw_spin": "Odemkne roztočení{SP}", - "hud.skill.sw_spin_dmg_title": "Poškození Roztočení", - "hud.skill.sw_spin_dmg": "Zvýší poškození, které udělíš o 40%{SP}", - "hud.skill.sw_spin_spd_title": "Rychlost Roztočení", - "hud.skill.sw_spin_spd": "Zvýší rychlost roztočení o 25%{SP}", - "hud.skill.sw_spin_cost_title": "Cena Roztočení", - "hud.skill.sw_spin_cost": "Sníží cenu roztočení o 25%{SP}", - "hud.skill.sw_spin_spins_title": "Počet točení při Roztočení", - "hud.skill.sw_spin_spins": "Zvýší počet otoček během roztočení{SP}", - "hud.skill.sw_interrupt_title": "Překažení Útoků", - "hud.skill.sw_interrupt": "Dokáže ihned přerušit útok dalším útokem{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Dvojtý Úder", - "hud.skill.axe_double_strike": "Skácej své nepřátele", - "hud.skill.axe_double_strike_combo_title": "Kombo Dvojtého Úderu", - "hud.skill.axe_double_strike_combo": "Odemkne Dvojtý Útok{SP}", - "hud.skill.axe_double_strike_damage_title": "Poškození Dvojtého Úderu", - "hud.skill.axe_double_strike_damage": "Zvyšuje poškození při každém podařeném úderu{SP}", - "hud.skill.axe_double_strike_speed_title": "Rychlost Dvojtého Úderu", - "hud.skill.axe_double_strike_speed": "Zvyšuje Rychlost Útoku při každém podařeném úderu{SP}", - "hud.skill.axe_double_strike_regen_title": "Regenerace při Dvojtém Útoku", - "hud.skill.axe_double_strike_regen": "Zvyšuje regeneraci Výdrže při každém podařeném úderu{SP}", - "hud.skill.axe_spin_title": "Roztočení Sekery", - "hud.skill.axe_spin": "Točíš se správným směrem...", - "hud.skill.axe_infinite_axe_spin_title": "Nekonečné Roztočení Sekery", - "hud.skill.axe_infinite_axe_spin": "Toč Sekeru dokaď máš Energii{SP}", - "hud.skill.axe_spin_damage_title": "Poškození Roztočení", - "hud.skill.axe_spin_damage": "Zvýší poškození, které udělíš o 30%{SP}", - "hud.skill.axe_spin_helicopter_title": "Vrtulníček", - "hud.skill.axe_spin_helicopter": "Při pádu budeš padat pomaleji při Roztočení Sekery{SP}", - "hud.skill.axe_spin_speed_title": "Rychlost Roztočení", - "hud.skill.axe_spin_speed": "Zvýší Rychlost Roztočení o 25%{SP}", - "hud.skill.axe_spin_cost_title": "Cena Roztočení", - "hud.skill.axe_spin_cost": "Sníží spotřebu výdrže o 25%{SP}", - "hud.skill.axe_unlock_leap_title": "Odemknout Vyšlehnutí", - "hud.skill.axe_unlock_leap": "Odemkne Vyšlehnutí{SP}", - "hud.skill.axe_leap_damage_title": "Poškození při Vyšlehnutí", - "hud.skill.axe_leap_damage": "Zvýší poškození Vyšlehnutí o 35%{SP}", - "hud.skill.axe_leap_knockback_title": "Odražení při Vyšlehnutí", - "hud.skill.axe_leap_knockback": "Při Vyšlehnutí, zvýší odražení o 40%{SP}", - "hud.skill.axe_leap_cost_title": "Cena Vyšlehnutí", - "hud.skill.axe_leap_cost": "Sníží cenu vyšlehnutí o 25%{SP}", - "hud.skill.axe_leap_distance_title": "Dosah Vyšlehnutí", - "hud.skill.axe_leap_distance": "Zvýší dosah o 20%{SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/cz_CZ/hud/social.ftl b/assets/voxygen/i18n/cz_CZ/hud/social.ftl new file mode 100644 index 0000000000..4959f2ae9e --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Společnost +hud-social-online = Aktivní +hud-social-friends = Přátelé +hud-social-not_yet_available = Ještě není dostupné +hud-social-faction = Cech +hud-social-play_online_fmt = { $nb_player } je aktivní +hud-social-name = Jméno +hud-social-level = Úroveň +hud-social-zone = Zóna +hud-social-account = Účet \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/social.ron b/assets/voxygen/i18n/cz_CZ/hud/social.ron deleted file mode 100644 index 1a5f5f09ee..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/social.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - /// Socialní - - "hud.social": "Společnost", - "hud.social.online": "Aktivní", - "hud.social.friends": "Přátelé", - "hud.social.not_yet_available": "Ještě není dostupné", - "hud.social.faction": "Cech", - "hud.social.play_online_fmt": "{nb_player} je aktivní", - "hud.social.name": "Jméno", - "hud.social.level": "Úroveň", - "hud.social.zone": "Zóna", - "hud.social.account": "Účet", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/cz_CZ/hud/trade.ftl b/assets/voxygen/i18n/cz_CZ/hud/trade.ftl new file mode 100644 index 0000000000..acaf73310f --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/hud/trade.ftl @@ -0,0 +1,17 @@ +hud-trade-trade_window = Obchod +hud-trade-phase1_description = Přetáhněte položky. +hud-trade-phase2_description = + Obchod je nyní uzamčen, abyste měli + čas jej zkontrolovat. +hud-trade-phase3_description = Probíhá zpracování. +hud-trade-persons_offer = Nabídka { $playername } +hud-trade-has_accepted = { $playername }přijal obchod +hud-trade-accept = Akceptovat +hud-trade-decline = Odmítnout +hud-trade-invite_sent = Žádost o obchod zaslána { $playername }. +hud-trade-result-completed = Obchod proběhl úspěšně. +hud-trade-result-declined = Obchod odmítnut. +hud-trade-result-nospace = Nedostatek místa pro dokončení. +hud-trade-buy_price = Cena koupě +hud-trade-sell_price = Cena prodeje +hud-trade-coin = Peníze \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/hud/trade.ron b/assets/voxygen/i18n/cz_CZ/hud/trade.ron deleted file mode 100644 index c3a9f86c0d..0000000000 --- a/assets/voxygen/i18n/cz_CZ/hud/trade.ron +++ /dev/null @@ -1,30 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - /// Obchod - - "hud.trade.trade_window": "Obchod", - "hud.trade.phase1_description": "Přetáhněte položky.", - "hud.trade.phase2_description": "Obchod je nyní uzamčen, abyste měli\n čas jej zkontrolovat.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Probíhá zpracování.", - "hud.trade.persons_offer": "Nabídka {playername}", - "hud.trade.has_accepted": "{playername}přijal obchod", - "hud.trade.accept": "Akceptovat", - "hud.trade.decline": "Odmítnout", - "hud.trade.invite_sent": "Žádost o obchod zaslána {playername}.", - "hud.trade.result.completed": "Obchod proběhl úspěšně.", - "hud.trade.result.declined": "Obchod odmítnut.", - "hud.trade.result.nospace": "Nedostatek místa pro dokončení.", - "hud.trade.buy_price": "Cena koupě", - "hud.trade.sell_price": "Cena prodeje", - "hud.trade.coin": "Peníze", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/cz_CZ/main.ftl b/assets/voxygen/i18n/cz_CZ/main.ftl new file mode 100644 index 0000000000..f8d92aff74 --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/main.ftl @@ -0,0 +1,74 @@ +main-username = Jméno +main-server = Server +main-password = Heslo +main-connecting = Připojování +main-creating_world = Tvorba Světa +main-tip = Tip: +main-notice = + Vítejte v alfa verzi Veloren! + + Než začnete, mějte na paměti, že: + + - Hra je v rané verzi alfa. Očekávejte chyby, extrémně nedokončený příběh, nedostatečně rozvinuté mechaniky a chybějící funkce. + + - Pokud se chcete podělit o svůj názor, máte návrhy nebo nápady nebo chcete nahlásit chybu, můžete nás kontaktovat prostřednictvím Redditu, GitLabu nebo Discordu. + + - Veloren je licencován pod licencí open source GPL 3. To znamená, že máte právo hru upravovat a distribuovat, jakkoliv chcete (pokud je vaše práce licencována také pod GPL 3). + + - Veloren je neziskový projekt, kde je každý pracující člověk dobrovolníkem. Pokud se vám tato hra líbí, připojte se k našemu týmu! + + Děkujeme za přečtení této zprávy a doufáme, že se vám tato hra bude líbit! + + ~ Tvůrci Veloren +main-login_process = + Informace o procesu přihlášení: + + Nezapomeňte, že k připojení na server + se zapnutým ověřením potřebujete účet. + + Účet si můžete vytvořit na webu: + + https://veloren.net/account/. +main-login-server_not_found = Server nenalezen +main-login-authentication_error = Chyba ověření +main-login-internal_error = Interní chyba klienta (nejspíše byla smazána postava hráče) +main-login-failed_auth_server_url_invalid = Chyba v připojení k autentifikačnímu serveru +main-login-insecure_auth_scheme = Ověření přes HTTP není podporováno. Není to bezpečné! Pro účely vývoje je HTTP povoleno pro 'localhost' nebo pro ladění +main-login-server_full = Server je plný +main-login-untrusted_auth_server = Ověřovací server je nedůvěryhodný +main-login-outdated_client_or_server = ServerWentMad: Pravděpodobně jsou verze nekompatibilní, zkontrolujte aktualizace! +main-login-timeout = Timeout: Server neodpověděl včas. (Přetížení nebo chyby v síti). +main-login-server_shut_down = Server Uzavřen +main-login-network_error = Chyba sítě. +main-login-network_wrong_version = Server běží na jiné verzy hry. Aktualizuj si klienta. +main-login-failed_sending_request = Dotaz na ověřovací server se nezdařil +main-login-invalid_character = Vybraná postava je neplatná +main-login-client_crashed = Pád klienta +main-login-not_on_whitelist = Potřebuješ být ve whitelistu. Kontaktuj Admina serveru. +main-login-banned = Byl/a si zabanován/á z tohoto důvodu +main-login-kicked = Byl/a si vyhozen/á z tohoto důvodu +main-login-select_language = Vyber si svůj Jazyk +main-login-client_version = Verze klienta +main-login-server_version = Verze serveru +main-servers-select_server = Výběr serveru +loading-tips = + .a0 = Stisknutím '{ $gameinput-togglelantern }' rozsvítíš svou lucernu. + .a1 = Stisknutím klávesy '{ $gameinput-help }' zobrazíš všechny výchozí klávesy. + .a2 = Můžetš použít /say nebo /s pro chat pouze s hráči přímo kolem vás. + .a3 = Můžeš napsat /region nebo /r pro chat s hráči pát stovek bloků od vás. + .a4 = Admini mohou napsat /build příkaz pro spuštění Stavívího Módu. + .a5 = Můžeš napsat /group nebo /g pro chat s vaší Skupinou. + .a6 = Pro posílání privátních zpráv napiš /tell poté jméno hráce a zprávu. + .a7 = Dávej si pozor na jídlo, truhly a jiný kořisti rozmístěné po celém světě! + .a8 = Inventář plný jídla? Zkus vytvořit z toho lepší jídlo! + .a9 = Přemýšlíš co dělat? Zkus nějakou Kobku označenou na mapě! + .a10 = Nezapomeň si nastavit Grafiku pro svůj systém. Klávesou '{ $gameinput-settings }' otevřeš Nastavení. + .a11 = Hraní s hráči je zábava! Klávesou '{ $gameinput-social }' se podívej kdo je Online. + .a12 = Klávesou '{ $gameinput-dance }' začneš Tancovat. Párty! + .a13 = Klávesou '{ $gameinput-glide }' otevřeš Kluzák a můžeš dobýt nebesa. + .a14 = Veloren je stále v Pre-Alpha. Snažíme se hru zlepšit co to jde! + .a15 = Jestli se chceš napojit k dev teamu nebo jen si napsat, připoj se na náš Discord server. + .a16 = Můžeš povolit zobrazení tvého životu v healthbaru v Nastavení. + .a17 = Sedni si k Táboráku (Klávesa '{ $gameinput-sit }') pro pomalé léčení. + .a18 = Potřebuješ více tašek, či lepší zbroj pro vaše dobrodrušství? Klávesou '{ $gameinput-crafting }' otevřeš nabídku Tvorby! + .a19 = Zkus skončit, když děláš kotrmelec skrz nestvůry. \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/main.ron b/assets/voxygen/i18n/cz_CZ/main.ron deleted file mode 100644 index b96f091c87..0000000000 --- a/assets/voxygen/i18n/cz_CZ/main.ron +++ /dev/null @@ -1,90 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - /// Start Main screen section - "main.username": "Jméno", - "main.server": "Server", - "main.password": "Heslo", - "main.connecting": "Připojování", - "main.creating_world": "Tvorba Světa", - "main.tip": "Tip:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Vítejte v alfa verzi Veloren! - -Než začnete, mějte na paměti, že: - -- Hra je v rané verzi alfa. Očekávejte chyby, extrémně nedokončený příběh, nedostatečně rozvinuté mechaniky a chybějící funkce. - -- Pokud se chcete podělit o svůj názor, máte návrhy nebo nápady nebo chcete nahlásit chybu, můžete nás kontaktovat prostřednictvím Redditu, GitLabu nebo Discordu. - -- Veloren je licencován pod licencí open source GPL 3. To znamená, že máte právo hru upravovat a distribuovat, jakkoliv chcete (pokud je vaše práce licencována také pod GPL 3). - -- Veloren je neziskový projekt, kde je každý pracující člověk dobrovolníkem. Pokud se vám tato hra líbí, připojte se k našemu týmu! - -Děkujeme za přečtení této zprávy a doufáme, že se vám tato hra bude líbit! - -~ Tvůrci Veloren"#, - - // Login process description - "main.login_process": r#"Informace o procesu přihlášení: - -Nezapomeňte, že k připojení na server -se zapnutým ověřením potřebujete účet. - -Účet si můžete vytvořit na webu: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Server nenalezen", - "main.login.authentication_error": "Chyba ověření", - "main.login.internal_error": "Interní chyba klienta (nejspíše byla smazána postava hráče)", - "main.login.failed_auth_server_url_invalid": "Chyba v připojení k autentifikačnímu serveru", - "main.login.insecure_auth_scheme": "Ověření přes HTTP není podporováno. Není to bezpečné! Pro účely vývoje je HTTP povoleno pro 'localhost' nebo pro ladění", - "main.login.server_full": "Server je plný", - "main.login.untrusted_auth_server": "Ověřovací server je nedůvěryhodný", - "main.login.outdated_client_or_server": "ServerWentMad: Pravděpodobně jsou verze nekompatibilní, zkontrolujte aktualizace!", - "main.login.timeout": "Timeout: Server neodpověděl včas. (Přetížení nebo chyby v síti).", - "main.login.server_shut_down": "Server Uzavřen", - "main.login.network_error": "Chyba sítě.", - "main.login.network_wrong_version": "Server běží na jiné verzy hry. Aktualizuj si klienta.", - "main.login.failed_sending_request": "Dotaz na ověřovací server se nezdařil", - "main.login.invalid_character": "Vybraná postava je neplatná", - "main.login.client_crashed": "Pád klienta", - "main.login.not_on_whitelist": "Potřebuješ být ve whitelistu. Kontaktuj Admina serveru.", - "main.login.banned": "Byl/a si zabanován/á z tohoto důvodu", - "main.login.kicked": "Byl/a si vyhozen/á z tohoto důvodu", - "main.login.select_language": "Vyber si svůj Jazyk", - "main.login.client_version": "Verze klienta", - "main.login.server_version": "Verze serveru", - "main.servers.select_server": "Výběr serveru", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Stisknutím '{gameinput.togglelantern}' rozsvítíš svou lucernu.", - "Stisknutím klávesy '{gameinput.help}' zobrazíš všechny výchozí klávesy.", - "Můžetš použít /say nebo /s pro chat pouze s hráči přímo kolem vás.", - "Můžeš napsat /region nebo /r pro chat s hráči pát stovek bloků od vás.", - "Admini mohou napsat /build příkaz pro spuštění Stavívího Módu.", - "Můžeš napsat /group nebo /g pro chat s vaší Skupinou.", - "Pro posílání privátních zpráv napiš /tell poté jméno hráce a zprávu.", - "Dávej si pozor na jídlo, truhly a jiný kořisti rozmístěné po celém světě!", - "Inventář plný jídla? Zkus vytvořit z toho lepší jídlo!", - "Přemýšlíš co dělat? Zkus nějakou Kobku označenou na mapě!", - "Nezapomeň si nastavit Grafiku pro svůj systém. Klávesou '{gameinput.settings}' otevřeš Nastavení.", - "Hraní s hráči je zábava! Klávesou '{gameinput.social}' se podívej kdo je Online.", - "Klávesou '{gameinput.dance}' začneš Tancovat. Párty!", - "Klávesou '{gameinput.glide}' otevřeš Kluzák a můžeš dobýt nebesa.", - "Veloren je stále v Pre-Alpha. Snažíme se hru zlepšit co to jde!", - "Jestli se chceš napojit k dev teamu nebo jen si napsat, připoj se na náš Discord server.", - "Můžeš povolit zobrazení tvého životu v healthbaru v Nastavení.", - "Sedni si k Táboráku (Klávesa '{gameinput.sit}') pro pomalé léčení.", - "Potřebuješ více tašek, či lepší zbroj pro vaše dobrodrušství? Klávesou '{gameinput.crafting}' otevřeš nabídku Tvorby!", - "Zkus skončit, když děláš kotrmelec skrz nestvůry." - ], - } -) diff --git a/assets/voxygen/i18n/cz_CZ/npc.ftl b/assets/voxygen/i18n/cz_CZ/npc.ftl new file mode 100644 index 0000000000..fe117bcc1e --- /dev/null +++ b/assets/voxygen/i18n/cz_CZ/npc.ftl @@ -0,0 +1,138 @@ +npc-speech-villager = + .a0 = Není dnes tak překrásný den? + .a1 = Jak se dneska máš? + .a2 = Dobré ráno! + .a3 = Zajímalo by mě, co si Catoblepové myslí, když jí trávu. + .a4 = Co si myslíš o tomto počasí? + .a5 = Přemýšlení o těchto kobkách mě děsí. Doufám, že je někdo vyčistí. + .a6 = Rád bych šel prozkoumávat jeskyni, až budu silnější. + .a7 = Neviděl si moji kočku? + .a8 = Už si někdy slyšel o divokých Pozemních Žralocích? Slyšel jsem, že žijí v pouštích. + .a9 = Říká se, že v jeskyních se nacházejí lesklé drahokamy všeho druhu. + .a10 = Jsem jen o sýrovích šušenkách! + .a11 = Nepůjdeš dovnitř? Právě jsem si chtěl dát sýr! + .a12 = Říká se, že houby jsou dobré pro vaše zdraví. Nikdy jsem je neměl. + .a13 = Nezapomeňte na sušenky! + .a14 = Prostě zbožňuji trpasličí sýr. Přál bych si, abych ho uměl dělat. + .a15 = Zajímalo by mě, co je na druhé straně hor. + .a16 = Doufám, že si někdy vyrobím vlastní kluzák. + .a17 = Chceš vidět moji zahradu? Dobře, možná někdy jindy. + .a18 = Krásný den na procházku do lesa! + .a19 = Být či nebýt? Myslím, že budu farmář. + .a20 = Nemyslíš si, že naše vesnice je nejlepší? + .a21 = Co podle vás září v Glowing Remains? + .a22 = Myslím, že je čas na druhou snídani! + .a23 = Už si někdy chytil světlušku? + .a24 = Prostě nechápu, odkud ti Saurokové stále přicházejí. + .a25 = Přál bych si, aby někdo držel vlky daleko od vesnice. + .a26 = Minulou noc jsem měl nádherný sen o sýru. Co to znamená? + .a27 = Nechal jsem trochu sýra s bratrem osamotě. Teď nevím, jestli existuje nebo ne. Říkám tomu Schrödingerův sýr. + .a28 = Nechal jsem trochu sýra se setrou osamotě. Teď nevím, jestli existuje nebo ne. Říkám tomu Schrödingerův sýr. + .a29 = Někdo by měl s těmi kultisty něco udělat. Nejlepší kdyý já ne. + .a30 = Doufám, že brzy bude pršet. Bylo by to dobré pro plodiny. + .a31 = Miluji med! A nesnáším včely. + .a32 = Chci jednoho dne vidět svět. Musí tu být více života než v této vesnici. +npc-speech-villager_cultist_alarm = + .a0 = Bacha! Je tu kultista! + .a1 = Do zbroje! Kultisti útočí! + .a2 = Jak se Kultisti opovážli útočit na naší vesnici! + .a3 = Smrt kultistům! + .a4 = Kultisti tu nejsou tolerováni! + .a5 = Vražední Kultisti! + .a6 = Ochutnej mojí čepel Kultisto + .a7 = Nic nedokáže vyčistit krev na tvých rukách Kultisto! + .a8 = Billions of blistering blue barnacles! A cultist among us! + .a9 = Zlo tohoto Kultisty je ukonce! + .a10 = Tento Kultista je můj! + .a11 = Připrav se potkat svého Stvořitele blbý Kultisto! + .a12 = Vidím Kultistu! Na něj! + .a13 = Vidím Kultistu! Útok! + .a14 = Vidím Kultistu! Nenech je utéct! + .a15 = Uvažoval někdy úctiví Kultitsta o SMRŤI?! + .a16 = Nikdy neodpustit! Nikdy nezapomenout! Kultista bude pikat! + .a17 = Umři Kultisto! + .a18 = Tvů začátek chaosu bude u konce! + .a19 = Tady je vše za to, co si udělal! + .a20 = Nejsme moc přátelští k lidem tvého druhu. + .a21 = Měl si zůstat v podzemí! +npc-speech-villager_under_attack = + .a0 = Pomoc, jsem pod útokem! + .a1 = Pomoc! Jsem pod útokem! + .a2 = Au! Jsem pod útokem! + .a3 = Auh! Jsem pod útokem! Pomoc! + .a4 = Pomoc! Jsem pod útokem! + .a5 = Jsem pod útokem, Pomoc! + .a6 = Jsem pod útokem! Pomoc! + .a7 = Pomoc! + .a8 = Pomoc! Pomoc! + .a9 = Pomoc! Pomoc! Pomoc! + .a10 = Jsem pod útokem! + .a11 = AAAHHH! Jsem pod útokem! + .a12 = AAAHHH! Jsem pod útokem! Pomoc! + .a13 = Pomoc! Jseme pod útokem! + .a14 = Pomoc! Vrah! + .a15 = Pomoc! Je tu vrah! + .a16 = Pomoc! Snaží se mě zabít! + .a17 = Stráže, Jsem pod útokem! + .a18 = Stráže! Jsem pod útokem! + .a19 = Jsem pod útokem! Stráže! + .a20 = Pomoc! Stráže! Jsem pod útokem! + .a21 = Stráže! Rychle! + .a22 = Stráže! Stráže! + .a23 = Stráže! Padouch na mě útočí! + .a24 = Stráže, zabte tohoto padoucha! + .a25 = Stráže! Je tu vrah! + .a26 = Stráže! Pomoc! + .a27 = S tím neutečeš jen tak! Stráže! + .a28 = Příteli! + .a29 = Pomoc ! + .a30 = Pomoc! Prosím! + .a31 = Ouch! Stráže! Pomoc! + .a32 = Jdou po mě! + .a33 = Pomoc! Pomoc! Snaží se mě utlačit! + .a34 = Ah, teď vidíme násilí v systému + .a35 = Tohle je jen škrábnutí! + .a36 = Nech toho! + .a37 = Co jsem ti provedl?! + .a38 = Prosím přestaň na mě útočit! + .a39 = Hey! Dávej bacha co s tím děláš! + .a40 = Hajze, zmiz! + .a41 = Dost! Jdi do háje! + .a42 = Teď mě štveš! + .a43 = Oi! Co si myslíš že jsi?! + .a44 = Tak teď chci tvojí hlavu! + .a45 = Přestaň, Prosím! Nemám nic u sebe ceného! + .a46 = Pošlu na tebe bratra, je větší než já! + .a47 = Neeee, já půjdu žalovat matce! + .a48 = Proklínám tě! + .a49 = Prosím nedělej to. + .a50 = Toto nebylo pěkné! + .a51 = Tvá zbraň funguje, teď vypadni + .a52 = Ušetři mě! + .a53 = Prosím, mám rodinu! + .a54 = Jsem moc mladý, abych umřel! + .a55 = Můžeme si o tom promluvit? + .a56 = Násilí není nikdy odpověď! + .a57 = Dnešek bude pěkně na nic... + .a58 = Hey, to bolí! + .a59 = Eek! + .a60 = Jak hnusný! + .a61 = Stop, prosím tě! + .a62 = A pox upon you! + .a63 = Tohle není sranda. + .a64 = Jak se opovažuješ?! + .a65 = Za to zaplatíš! + .a66 = Ještě chvilku porkačuj a budeš toho litovat! + .a67 = Nechtěj, abych tě zranil! + .a68 = To musí být omyl! + .a69 = Nepotřebuješ toto dělat! + .a70 = Vypdni kamaráda! + .a71 = To opravdu bolelo! + .a72 = Proč bys to dělal? + .a73 = ve jménu ducha svatého, vypadni! + .a74 = Musel si se splést! + .a75 = To si nezasloužím! + .a76 = Prosím, nedělej to znova. + .a77 = Stráže, hoďte toto monstrum do jezera! + .a78 = vypustím na tebe Tarasque! + .a79 = Proč jáááá? \ No newline at end of file diff --git a/assets/voxygen/i18n/cz_CZ/npc.ron b/assets/voxygen/i18n/cz_CZ/npc.ron deleted file mode 100644 index 06ee417757..0000000000 --- a/assets/voxygen/i18n/cz_CZ/npc.ron +++ /dev/null @@ -1,152 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Čeština -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Není dnes tak překrásný den?", - "Jak se dneska máš?", - "Dobré ráno!", - "Zajímalo by mě, co si Catoblepové myslí, když jí trávu.", - "Co si myslíš o tomto počasí?", - "Přemýšlení o těchto kobkách mě děsí. Doufám, že je někdo vyčistí.", - "Rád bych šel prozkoumávat jeskyni, až budu silnější.", - "Neviděl si moji kočku?", - "Už si někdy slyšel o divokých Pozemních Žralocích? Slyšel jsem, že žijí v pouštích.", - "Říká se, že v jeskyních se nacházejí lesklé drahokamy všeho druhu.", - "Jsem jen o sýrovích šušenkách!", - "Nepůjdeš dovnitř? Právě jsem si chtěl dát sýr!", - "Říká se, že houby jsou dobré pro vaše zdraví. Nikdy jsem je neměl.", - "Nezapomeňte na sušenky!", - "Prostě zbožňuji trpasličí sýr. Přál bych si, abych ho uměl dělat.", - "Zajímalo by mě, co je na druhé straně hor.", - "Doufám, že si někdy vyrobím vlastní kluzák.", - "Chceš vidět moji zahradu? Dobře, možná někdy jindy.", - "Krásný den na procházku do lesa!", - "Být či nebýt? Myslím, že budu farmář.", - "Nemyslíš si, že naše vesnice je nejlepší?", - "Co podle vás září v Glowing Remains?", - "Myslím, že je čas na druhou snídani!", - "Už si někdy chytil světlušku?", - "Prostě nechápu, odkud ti Saurokové stále přicházejí.", - "Přál bych si, aby někdo držel vlky daleko od vesnice.", - "Minulou noc jsem měl nádherný sen o sýru. Co to znamená?", - "Nechal jsem trochu sýra s bratrem osamotě. Teď nevím, jestli existuje nebo ne. Říkám tomu Schrödingerův sýr.", - "Nechal jsem trochu sýra se setrou osamotě. Teď nevím, jestli existuje nebo ne. Říkám tomu Schrödingerův sýr.", - "Někdo by měl s těmi kultisty něco udělat. Nejlepší kdyý já ne.", - "Doufám, že brzy bude pršet. Bylo by to dobré pro plodiny.", - "Miluji med! A nesnáším včely.", - "Chci jednoho dne vidět svět. Musí tu být více života než v této vesnici.", - ], - "npc.speech.villager_cultist_alarm": [ - "Bacha! Je tu kultista!", - "Do zbroje! Kultisti útočí!", - "Jak se Kultisti opovážli útočit na naší vesnici!", - "Smrt kultistům!", - "Kultisti tu nejsou tolerováni!", - "Vražední Kultisti!", - "Ochutnej mojí čepel Kultisto", - "Nic nedokáže vyčistit krev na tvých rukách Kultisto!", - "Billions of blistering blue barnacles! A cultist among us!", - "Zlo tohoto Kultisty je ukonce!", - "Tento Kultista je můj!", - "Připrav se potkat svého Stvořitele blbý Kultisto!", - "Vidím Kultistu! Na něj!", - "Vidím Kultistu! Útok!", - "Vidím Kultistu! Nenech je utéct!", - "Uvažoval někdy úctiví Kultitsta o SMRŤI?!", - "Nikdy neodpustit! Nikdy nezapomenout! Kultista bude pikat!", - "Umři Kultisto!", - "Tvů začátek chaosu bude u konce!", - "Tady je vše za to, co si udělal!", - "Nejsme moc přátelští k lidem tvého druhu.", - "Měl si zůstat v podzemí!", - ], - "npc.speech.villager_under_attack": [ - "Pomoc, jsem pod útokem!", - "Pomoc! Jsem pod útokem!", - "Au! Jsem pod útokem!", - "Auh! Jsem pod útokem! Pomoc!", - "Pomoc! Jsem pod útokem!", - "Jsem pod útokem, Pomoc!", - "Jsem pod útokem! Pomoc!", - "Pomoc!", - "Pomoc! Pomoc!", - "Pomoc! Pomoc! Pomoc!", - "Jsem pod útokem!", - "AAAHHH! Jsem pod útokem!", - "AAAHHH! Jsem pod útokem! Pomoc!", - "Pomoc! Jseme pod útokem!", - "Pomoc! Vrah!", - "Pomoc! Je tu vrah!", - "Pomoc! Snaží se mě zabít!", - "Stráže, Jsem pod útokem!", - "Stráže! Jsem pod útokem!", - "Jsem pod útokem! Stráže!", - "Pomoc! Stráže! Jsem pod útokem!", - "Stráže! Rychle!", - "Stráže! Stráže!", - "Stráže! Padouch na mě útočí!", - "Stráže, zabte tohoto padoucha!", - "Stráže! Je tu vrah!", - "Stráže! Pomoc!", - "S tím neutečeš jen tak! Stráže!", - "Příteli!", - "Pomoc !", - "Pomoc! Prosím!", - "Ouch! Stráže! Pomoc!", - "Jdou po mě!", - "Pomoc! Pomoc! Snaží se mě utlačit!", - "Ah, teď vidíme násilí v systému", - "Tohle je jen škrábnutí!", - "Nech toho!", - "Co jsem ti provedl?!", - "Prosím přestaň na mě útočit!", - "Hey! Dávej bacha co s tím děláš!", - "Hajze, zmiz!", - "Dost! Jdi do háje!", - "Teď mě štveš!", - "Oi! Co si myslíš že jsi?!", - "Tak teď chci tvojí hlavu!", - "Přestaň, Prosím! Nemám nic u sebe ceného!", - "Pošlu na tebe bratra, je větší než já!", - "Neeee, já půjdu žalovat matce!", - "Proklínám tě!", - "Prosím nedělej to.", - "Toto nebylo pěkné!", - "Tvá zbraň funguje, teď vypadni", - "Ušetři mě!", - "Prosím, mám rodinu!", - "Jsem moc mladý, abych umřel!", - "Můžeme si o tom promluvit?", - "Násilí není nikdy odpověď!", - "Dnešek bude pěkně na nic...", - "Hey, to bolí!", - "Eek!", - "Jak hnusný!", - "Stop, prosím tě!", - "A pox upon you!", - "Tohle není sranda.", - "Jak se opovažuješ?!", - "Za to zaplatíš!", - "Ještě chvilku porkačuj a budeš toho litovat!", - "Nechtěj, abych tě zranil!", - "To musí být omyl!", - "Nepotřebuješ toto dělat!", - "Vypdni kamaráda!", - "To opravdu bolelo!", - "Proč bys to dělal?", - "ve jménu ducha svatého, vypadni!", - "Musel si se splést!", - "To si nezasloužím!", - "Prosím, nedělej to znova.", - "Stráže, hoďte toto monstrum do jezera!", - "vypustím na tebe Tarasque!", - "Proč jáááá?", - ], - - }, -) diff --git a/assets/voxygen/i18n/de_DE/buff.ftl b/assets/voxygen/i18n/de_DE/buff.ftl new file mode 100644 index 0000000000..b4b1c5965c --- /dev/null +++ b/assets/voxygen/i18n/de_DE/buff.ftl @@ -0,0 +1,35 @@ +buff-remove = Klicke zum Entfernen +buff-title-missing = Fehlender Titel +buff-desc-missing = Fehlende Beschreibung +buff-title-heal = Heilung +buff-desc-heal = Heilung über Zeit. +buff-title-potion = Trank +buff-desc-potion = Trinke... +buff-title-saturation = Sättigung +buff-desc-saturation = Erhalte mit der Zeit Lebenspunkte durch Konsumgüter. +buff-title-campfire_heal = Heilung durch Lagerfeuer +buff-desc-campfire_heal = Das sitzen am Lagerfeuer heilt 1% der Lebensenergie pro Sekunde. +buff-title-invulnerability = Unverwundbarkeit +buff-desc-invulnerability = Du bist immun gegen jeglichen Schaden. +buff-title-protectingward = Schutzaura +buff-desc-protectingward = Du bist einigermaßen vor Angriffen geschützt. +buff-title-bleed = Bluten +buff-desc-bleed = Fügt regelmäßigen Schaden zu. +buff-title-cursed = Verflucht +buff-desc-cursed = Du bist verflucht. +buff-title-burn = Brennend.. +buff-desc-burn = Du verbrennst. +buff-title-crippled = Verkrüppelt. +buff-desc-crippled = Deine Bewegungen sind eingeschränkt, da deine Beine schwerst verkrüppelt sind.. +buff-title-frozen = Du frierst. +buff-desc-frozen = Deine Bewegungen und Attacken sind verlangsamt. Wärme dich auf. +buff-title-wet = Du bist nass. +buff-desc-wet = Du rutschst über den Boden und kannst kaum anhalten. +buff-title-ensnared = Gefesselt. +buff-desc-ensnared = Äste greifen nach deinen Beinen und verlangsamen deine Bewegungen. +buff-stat-health = Stellt { $str_total } Leben wiederher +buff-stat-increase_max_energy = Erhöt die maximale Ausdauer um { $strength } +buff-stat-increase_max_health = Erhöht die maximale Lebensenergie um { $strength } +buff-stat-invulnerability = Gewährt Unverwundbarkeit +buff-text-over_seconds = über { $dur_secs } Sekunden +buff-text-for_seconds = für { $dur_secs } Sekunden \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/buff.ron b/assets/voxygen/i18n/de_DE/buff.ron deleted file mode 100644 index 2d76fabe13..0000000000 --- a/assets/voxygen/i18n/de_DE/buff.ron +++ /dev/null @@ -1,50 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - // Buffs - "buff.remove": "Klicke zum Entfernen", - "buff.title.missing": "Fehlender Titel", - "buff.desc.missing": "Fehlende Beschreibung", - "buff.title.heal": "Heilung", - "buff.desc.heal": "Heilung über Zeit.", - "buff.title.potion": "Trank", - "buff.desc.potion": "Trinke...", - "buff.title.saturation": "Sättigung", - "buff.desc.saturation": "Erhalte mit der Zeit Lebenspunkte durch Konsumgüter.", - "buff.title.campfire_heal": "Heilung durch Lagerfeuer", - "buff.desc.campfire_heal": "Das sitzen am Lagerfeuer heilt 1% der Lebensenergie pro Sekunde.", - "buff.title.invulnerability": "Unverwundbarkeit", - "buff.desc.invulnerability": "Du bist immun gegen jeglichen Schaden.", - "buff.title.protectingward": "Schutzaura", - "buff.desc.protectingward": "Du bist einigermaßen vor Angriffen geschützt.", - // Debuffs - "buff.title.bleed": "Bluten", - "buff.desc.bleed": "Fügt regelmäßigen Schaden zu.", - "buff.title.cursed": "Verflucht", - "buff.desc.cursed": "Du bist verflucht.", - "buff.title.burn": "Brennend..", - "buff.desc.burn": "Du verbrennst.", - "buff.title.crippled": "Verkrüppelt.", - "buff.desc.crippled": "Deine Bewegungen sind eingeschränkt, da deine Beine schwerst verkrüppelt sind..", - "buff.title.frozen": "Du frierst.", - "buff.desc.frozen": "Deine Bewegungen und Attacken sind verlangsamt. Wärme dich auf.", - "buff.title.wet": "Du bist nass.", - "buff.desc.wet": "Du rutschst über den Boden und kannst kaum anhalten.", - "buff.title.ensnared": "Gefesselt.", - "buff.desc.ensnared": "Äste greifen nach deinen Beinen und verlangsamen deine Bewegungen.", - // Buffs stats - "buff.stat.health": "Stellt {str_total} Leben wiederher", - "buff.stat.increase_max_energy": "Erhöt die maximale Ausdauer um {strength}", - "buff.stat.increase_max_health": "Erhöht die maximale Lebensenergie um {strength}", - "buff.stat.invulnerability": "Gewährt Unverwundbarkeit", - // Text - "buff.text.over_seconds": "über {dur_secs} Sekunden", - "buff.text.for_seconds": "für {dur_secs} Sekunden", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/char_selection.ftl b/assets/voxygen/i18n/de_DE/char_selection.ftl new file mode 100644 index 0000000000..805faea042 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Lade Charaktere... +char_selection-delete_permanently = Den Charakter unwiderruflich löschen? +char_selection-deleting_character = Lösche Charakter... +char_selection-change_server = Wechsle Server +char_selection-enter_world = Welt betreten +char_selection-logout = Ausloggen +char_selection-create_new_character = Neuen Charakter erstellen +char_selection-creating_character = Erstelle Charakter... +char_selection-character_creation = Charaktererstellung +char_selection-human_default = Human Default +char_selection-level_fmt = Level { $level_nb } +char_selection-uncanny_valley = Wildnis +char_selection-plains_of_uncertainty = Steppen der Ungewissheit +char_selection-beard = Bart +char_selection-hair_style = Frisur +char_selection-hair_color = Haarfarbe +char_selection-eye_color = Augenfarbe +char_selection-skin = Hautfarbe +char_selection-eyeshape = Augendetails +char_selection-accessories = Accessoires +char_selection-create_info_name = Dein Charakter benötigt einen Namen! +char_selection-version_mismatch = WARNUNG! Die Spielversion des Servers unterscheidet sich von deiner und ist möglicherweise inkompatibel. Bitte stelle sicher, dass du die neueste Version installiert hast. \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/char_selection.ron b/assets/voxygen/i18n/de_DE/char_selection.ron deleted file mode 100644 index babad3a0da..0000000000 --- a/assets/voxygen/i18n/de_DE/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "char_selection.loading_characters": "Lade Charaktere...", - "char_selection.delete_permanently": "Den Charakter unwiderruflich löschen?", - "char_selection.deleting_character": "Lösche Charakter...", - "char_selection.change_server": "Wechsle Server", - "char_selection.enter_world": "Welt betreten", - "char_selection.logout": "Ausloggen", - "char_selection.create_new_character": "Neuen Charakter erstellen", - "char_selection.creating_character": "Erstelle Charakter...", - "char_selection.character_creation": "Charaktererstellung", - "char_selection.human_default": "Human Default", - "char_selection.level_fmt": "Level {level_nb}", - "char_selection.uncanny_valley": "Wildnis", - "char_selection.plains_of_uncertainty": "Steppen der Ungewissheit", - "char_selection.beard": "Bart", - "char_selection.hair_style": "Frisur", - "char_selection.hair_color": "Haarfarbe", - "char_selection.eye_color": "Augenfarbe", - "char_selection.skin": "Hautfarbe", - "char_selection.eyeshape": "Augendetails", - "char_selection.accessories": "Accessoires", - "char_selection.create_info_name": "Dein Charakter benötigt einen Namen!", - "char_selection.version_mismatch": "WARNUNG! Die Spielversion des Servers unterscheidet sich von deiner und ist möglicherweise inkompatibel. Bitte stelle sicher, dass du die neueste Version installiert hast.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/common.ftl b/assets/voxygen/i18n/de_DE/common.ftl new file mode 100644 index 0000000000..16682c5d97 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/common.ftl @@ -0,0 +1,100 @@ +common-username = Benutzername +common-singleplayer = Einzelspieler +common-multiplayer = Mehrspieler +common-servers = Server +common-quit = Beenden +common-settings = Einstellungen +common-languages = Sprache +common-interface = Interface +common-gameplay = Spiel +common-controls = Tastenbelegung +common-video = Grafik +common-sound = Audio +common-resume = Fortfahren +common-characters = Charaktere +common-close = Schließen +common-yes = Ja +common-no = Nein +common-back = Zurück +common-create = Erstellen +common-okay = Okay +common-add = Hinzufügen +common-accept = Annehmen +common-decline = Ablehnen +common-disclaimer = Disclaimer +common-cancel = Abbrechen +common-none = Kein +common-error = Fehler +common-fatal_error = Kritischer Fehler +common-you = Ihr +common-automatic = Auto +common-random = Zufällig +common-empty = Leer +common-confirm = Akzeptieren +common-interface_settings = Interfaceeinstellungen +common-gameplay_settings = Spieleinstellungen +common-controls_settings = Steuerungseinstellungen +common-video_settings = Grafikeinstellungen +common-sound_settings = Audioeinstellungen +common-language_settings = Spracheinstellungen +common-chat_settings = Chateinstellungen +common-connection_lost = + Verbindungsabbruch! + Wurde der Server neu gestartet? + Ist das Spiel auf dem neusten Stand? +common-species-orc = Ork +common-species-human = Mensch +common-species-dwarf = Zwerg +common-species-elf = Elf +common-species-draugr = Untoter +common-species-danari = Danari +common-weapons-axe = Axt +common-weapons-sword = Schwert +common-weapons-greatsword = Zweihänder +common-weapons-shortswords = Kurzschwerter +common-weapons-staff = Zauberstab +common-weapons-bow = Bogen +common-weapons-hammer = Hammer +common-weapons-general = Kampf +common-weapons-sceptre = Zepter +common-weapons-shield = Schild +common-weapons-spear = Speer +common-weapons-hammer_simple = Einfacher Hammer +common-weapons-sword_simple = Einfaches Schwert +common-weapons-staff_simple = Einfacher Stab +common-weapons-axe_simple = Einfache Axt +common-weapons-bow_simple = Einfacher Bogen +common-weapons-unique = Einzigartig +common-tool-debug = Debug +common-tool-farming = Erntewerkzeug +common-tool-pick = Spitzhacke +common-tool-mining = Bergbau +common-kind-modular_component = Modulares Bauteil +common-kind-glider = Gleiter +common-kind-consumable = Verbrauchsgegenstand +common-kind-throwable = Kann geworfen werden +common-kind-utility = Hilfsmittel +common-kind-ingredient = Zutat +common-kind-lantern = Laterne +common-hands-one = Einhändig +common-hands-two = Zweihändig +common-rand_appearance = Zufälliges Aussehen +common-rand_name = Zufälliger Name +common-stats-combat_rating = Kampfrating +common-stats-power = Stärke +common-stats-speed = Schnelligkeit +common-stats-poise = Haltung +common-stats-crit_chance = Krit. Trefferchance +common-stats-crit_mult = Krit. Multiplikator +common-stats-armor = Rüstung +common-stats-poise_res = Betäubungsresistenz +common-stats-energy_max = Maximale Ausdauer +common-stats-energy_reward = Ausdauerbonus +common-stats-crit_power = Krit. Multiplikator +common-stats-stealth = Tarnung +common-stats-slots = Inventarplätze +common-material-metal = Metall +common-material-wood = Holz +common-material-stone = Stein +common-material-cloth = Stoff +common-material-hide = Leder \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/common.ron b/assets/voxygen/i18n/de_DE/common.ron deleted file mode 100644 index ad0c579d1a..0000000000 --- a/assets/voxygen/i18n/de_DE/common.ron +++ /dev/null @@ -1,121 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Germany German -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Benutzername", - "common.singleplayer": "Einzelspieler", - "common.multiplayer": "Mehrspieler", - "common.servers": "Server", - "common.quit": "Beenden", - "common.settings": "Einstellungen", - "common.languages": "Sprache", - "common.interface": "Interface", - "common.gameplay": "Spiel", - "common.controls": "Tastenbelegung", - "common.video": "Grafik", - "common.sound": "Audio", - "common.resume": "Fortfahren", - "common.characters": "Charaktere", - "common.close": "Schließen", - "common.yes": "Ja", - "common.no": "Nein", - "common.back": "Zurück", - "common.create": "Erstellen", - "common.okay": "Okay", - "common.add": "Hinzufügen", - "common.accept": "Annehmen", - "common.decline": "Ablehnen", - "common.disclaimer": "Disclaimer", - "common.cancel": "Abbrechen", - "common.none": "Kein", - "common.error": "Fehler", - "common.fatal_error": "Kritischer Fehler", - "common.you": "Ihr", - "common.automatic": "Auto", - "common.random": "Zufällig", - "common.empty": "Leer", - "common.confirm": "Akzeptieren", - - // Settings Window title - "common.interface_settings": "Interfaceeinstellungen", - "common.gameplay_settings": "Spieleinstellungen", - "common.controls_settings": "Steuerungseinstellungen", - "common.video_settings": "Grafikeinstellungen", - "common.sound_settings": "Audioeinstellungen", - "common.language_settings": "Spracheinstellungen", - "common.chat_settings": "Chateinstellungen", - - // Message when connection to the server is lost - "common.connection_lost": r#"Verbindungsabbruch! -Wurde der Server neu gestartet? -Ist das Spiel auf dem neusten Stand?"#, - - - "common.species.orc": "Ork", - "common.species.human": "Mensch", - "common.species.dwarf": "Zwerg", - "common.species.elf": "Elf", - "common.species.draugr": "Untoter", - "common.species.danari": "Danari", - - "common.weapons.axe": "Axt", - "common.weapons.sword": "Schwert", - "common.weapons.greatsword": "Zweihänder", - "common.weapons.shortswords": "Kurzschwerter", - "common.weapons.staff": "Zauberstab", - "common.weapons.bow": "Bogen", - "common.weapons.hammer": "Hammer", - "common.weapons.general": "Kampf", - "common.weapons.sceptre": "Zepter", - "common.weapons.shield": "Schild", - "common.weapons.spear": "Speer", - "common.weapons.hammer_simple": "Einfacher Hammer", - "common.weapons.sword_simple": "Einfaches Schwert", - "common.weapons.staff_simple": "Einfacher Stab", - "common.weapons.axe_simple": "Einfache Axt", - "common.weapons.bow_simple": "Einfacher Bogen", - "common.weapons.unique": "Einzigartig", - "common.tool.debug": "Debug", - "common.tool.farming": "Erntewerkzeug", - "common.tool.pick": "Spitzhacke", - "common.tool.mining": "Bergbau", - "common.kind.modular_component": "Modulares Bauteil", - "common.kind.glider": "Gleiter", - "common.kind.consumable": "Verbrauchsgegenstand", - "common.kind.throwable": "Kann geworfen werden", - "common.kind.utility": "Hilfsmittel", - "common.kind.ingredient": "Zutat", - "common.kind.lantern": "Laterne", - "common.hands.one": "Einhändig", - "common.hands.two": "Zweihändig", - - "common.rand_appearance": "Zufälliges Aussehen", - "common.rand_name": "Zufälliger Name", - - "common.stats.combat_rating": "Kampfrating", - "common.stats.power": "Stärke", - "common.stats.speed": "Schnelligkeit", - "common.stats.poise": "Haltung", - "common.stats.crit_chance": "Krit. Trefferchance", - "common.stats.crit_mult": "Krit. Multiplikator", - "common.stats.armor": "Rüstung", - "common.stats.poise_res":"Betäubungsresistenz", - "common.stats.energy_max": "Maximale Ausdauer", - "common.stats.energy_reward": "Ausdauerbonus", - "common.stats.crit_power": "Krit. Multiplikator", - "common.stats.stealth": "Tarnung", - "common.stats.slots": "Inventarplätze", - - "common.material.metal": "Metall", - "common.material.wood": "Holz", - "common.material.stone": "Stein", - "common.material.cloth": "Stoff", - "common.material.hide": "Leder", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/esc_menu.ftl b/assets/voxygen/i18n/de_DE/esc_menu.ftl new file mode 100644 index 0000000000..6a9372bff5 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Ausloggen +esc_menu-quit_game = Spiel beenden \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/esc_menu.ron b/assets/voxygen/i18n/de_DE/esc_menu.ron deleted file mode 100644 index 035d93b16e..0000000000 --- a/assets/voxygen/i18n/de_DE/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "esc_menu.logout": "Ausloggen", - "esc_menu.quit_game": "Spiel beenden", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/gameinput.ftl b/assets/voxygen/i18n/de_DE/gameinput.ftl new file mode 100644 index 0000000000..436b489122 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/gameinput.ftl @@ -0,0 +1,64 @@ +gameinput-primary = Primärer Angriff +gameinput-secondary = Sekundärer Angriff +gameinput-block = Blockieren +gameinput-slot1 = Hotbarplatz 1 +gameinput-slot2 = Hotbarplatz 2 +gameinput-slot3 = Hotbarplatz 3 +gameinput-slot4 = Hotbarplatz 4 +gameinput-slot5 = Hotbarplatz 5 +gameinput-slot6 = Hotbarplatz 6 +gameinput-slot7 = Hotbarplatz 7 +gameinput-slot8 = Hotbarplatz 8 +gameinput-slot9 = Hotbarplatz 9 +gameinput-slot10 = Hotbarplatz 10 +gameinput-swaploadout = Waffe wechseln +gameinput-togglecursor = Mauszeiger zeigen/verbergen +gameinput-help = Hilfe anzeigen +gameinput-toggleinterface = Interface ein-/ausschalten +gameinput-toggledebug = FPS und Debug-Hilfe ein-/ausschalten +gameinput-screenshot = Bildschirmfoto aufnehmen +gameinput-toggleingameui = Namensschilder ein-/ausschalten +gameinput-toggle_egui_debug = EGUI Debug-Informationen zeigen/verbergen +gameinput-fullscreen = Namen zeigen/verbergen +gameinput-moveforward = Vorwärts bewegen +gameinput-moveleft = Nach links bewegen +gameinput-moveright = Nach rechts bewegen +gameinput-moveback = Rückwärts bewegen +gameinput-jump = Springen +gameinput-glide = Gleiter +gameinput-roll = Rollen +gameinput-climb = Klettern +gameinput-climbdown = Herab klettern +gameinput-wallleap = Wandsprung +gameinput-togglelantern = Laterne ein-/ausschalten +gameinput-mount = Aufsteigen +gameinput-chat = Chat +gameinput-command = Befehl +gameinput-escape = Fliehen +gameinput-map = Karte +gameinput-bag = Inventar +gameinput-trade = Handeln +gameinput-social = Sozial +gameinput-sit = Sitzen +gameinput-spellbook = Zaubersprüche +gameinput-settings = Einstellungen +gameinput-respawn = Wiederbeleben +gameinput-charge = Anstürmen +gameinput-togglewield = Waffe ziehen/wegstecken +gameinput-interact = Interagieren +gameinput-freelook = Freie Sicht +gameinput-autowalk = Automatisch Laufen/Schwimmen +gameinput-cameraclamp = Kamera fixieren +gameinput-dance = Tanzen +gameinput-select = Einheit auswählen +gameinput-acceptgroupinvite = Gruppeneinladung akzeptieren +gameinput-declinegroupinvite = Gruppeneinladung ablehnen +gameinput-cyclecamera = Kamera wechseln +gameinput-crafting = Herstellen +gameinput-fly = Fliegen +gameinput-sneak = Schleichen +gameinput-swimdown = Tauchen +gameinput-swimup = Auftauchen +gameinput-mapzoomin = Kartenzoom erhöhen +gameinput-mapzoomout = Kartenzoom verringern +gameinput-greet = Grüßen \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/gameinput.ron b/assets/voxygen/i18n/de_DE/gameinput.ron deleted file mode 100644 index 6490050b8d..0000000000 --- a/assets/voxygen/i18n/de_DE/gameinput.ron +++ /dev/null @@ -1,75 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "gameinput.primary": "Primärer Angriff", - "gameinput.secondary": "Sekundärer Angriff", - "gameinput.block": "Blockieren", - "gameinput.slot1": "Hotbarplatz 1", - "gameinput.slot2": "Hotbarplatz 2", - "gameinput.slot3": "Hotbarplatz 3", - "gameinput.slot4": "Hotbarplatz 4", - "gameinput.slot5": "Hotbarplatz 5", - "gameinput.slot6": "Hotbarplatz 6", - "gameinput.slot7": "Hotbarplatz 7", - "gameinput.slot8": "Hotbarplatz 8", - "gameinput.slot9": "Hotbarplatz 9", - "gameinput.slot10": "Hotbarplatz 10", - "gameinput.swaploadout": "Waffe wechseln", - "gameinput.togglecursor": "Mauszeiger zeigen/verbergen", - "gameinput.help": "Hilfe anzeigen", - "gameinput.toggleinterface": "Interface ein-/ausschalten", - "gameinput.toggledebug": "FPS und Debug-Hilfe ein-/ausschalten", - "gameinput.screenshot": "Bildschirmfoto aufnehmen", - "gameinput.toggleingameui": "Namensschilder ein-/ausschalten", - "gameinput.toggle_egui_debug": "EGUI Debug-Informationen zeigen/verbergen", - "gameinput.fullscreen": "Namen zeigen/verbergen", - "gameinput.moveforward": "Vorwärts bewegen", - "gameinput.moveleft": "Nach links bewegen", - "gameinput.moveright": "Nach rechts bewegen", - "gameinput.moveback": "Rückwärts bewegen", - "gameinput.jump": "Springen", - "gameinput.glide": "Gleiter", - "gameinput.roll": "Rollen", - "gameinput.climb": "Klettern", - "gameinput.climbdown": "Herab klettern", - "gameinput.wallleap": "Wandsprung", - "gameinput.togglelantern": "Laterne ein-/ausschalten", - "gameinput.mount": "Aufsteigen", - "gameinput.chat": "Chat", - "gameinput.command": "Befehl", - "gameinput.escape": "Fliehen", - "gameinput.map": "Karte", - "gameinput.bag": "Inventar", - "gameinput.trade": "Handeln", - "gameinput.social": "Sozial", - "gameinput.sit": "Sitzen", - "gameinput.spellbook": "Zaubersprüche", - "gameinput.settings": "Einstellungen", - "gameinput.respawn": "Wiederbeleben", - "gameinput.charge": "Anstürmen", - "gameinput.togglewield": "Waffe ziehen/wegstecken", - "gameinput.interact": "Interagieren", - "gameinput.freelook": "Freie Sicht", - "gameinput.autowalk": "Automatisch Laufen/Schwimmen", - "gameinput.cameraclamp": "Kamera fixieren", - "gameinput.dance": "Tanzen", - "gameinput.select": "Einheit auswählen", - "gameinput.acceptgroupinvite": "Gruppeneinladung akzeptieren", - "gameinput.declinegroupinvite": "Gruppeneinladung ablehnen", - "gameinput.cyclecamera": "Kamera wechseln", - "gameinput.crafting": "Herstellen", - "gameinput.fly": "Fliegen", - "gameinput.sneak": "Schleichen", - "gameinput.swimdown": "Tauchen", - "gameinput.swimup": "Auftauchen", - "gameinput.mapzoomin": "Kartenzoom erhöhen", - "gameinput.mapzoomout": "Kartenzoom verringern", - "gameinput.greet": "Grüßen", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/bag.ftl b/assets/voxygen/i18n/de_DE/hud/bag.ftl new file mode 100644 index 0000000000..d9afb2a1ba --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = { $playername }'s Inventar +hud-bag-stats_title = { $playername }'s Statistiken +hud-bag-exp = Exp +hud-bag-armor = Rüstung +hud-bag-stats = Statistiken +hud-bag-head = Kopf +hud-bag-neck = Nacken +hud-bag-tabard = Wappenrock +hud-bag-shoulders = Schultern +hud-bag-chest = Brust +hud-bag-hands = Hände +hud-bag-lantern = Laterne +hud-bag-glider = Gleiter +hud-bag-belt = Gürtel +hud-bag-ring = Ring +hud-bag-back = Rücken +hud-bag-legs = Beine +hud-bag-feet = Füße +hud-bag-mainhand = Haupthand +hud-bag-offhand = Nebenhand +hud-bag-inactive_mainhand = Inaktive Haupthand +hud-bag-inactive_offhand = Inaktive Nebenhand +hud-bag-swap_equipped_weapons_title = Ausgerüstete Waffen tauschen +hud-bag-swap_equipped_weapons_desc = Drücke { $key } +hud-bag-bag = Beutel +hud-bag-health = Leben +hud-bag-energy = Ausdauer +hud-bag-combat_rating = Kampfwertung +hud-bag-protection = Schutz +hud-bag-stun_res = Betäubungsresistenz +hud-bag-combat_rating_desc = + Berechnet aus deiner + Ausrüstung und Gesundheit. +hud-bag-protection_desc = Schadensreduzierung durch Rüstung +hud-bag-stun_res_desc = + Widerstandsfähigkeit gegen Betäubung durch aufeinanderfolgende Treffer. + Regeneriert wie Ausdauer. +hud-bag-sort_by_name = Nach Namen sortieren +hud-bag-sort_by_quality = Nach Qualität sortieren +hud-bag-sort_by_category = Nach Kategorie sortieren \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/bag.ron b/assets/voxygen/i18n/de_DE/hud/bag.ron deleted file mode 100644 index e0a2092692..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}'s Inventar", - "hud.bag.stats_title": "{playername}'s Statistiken", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Rüstung", - "hud.bag.stats": "Statistiken", - "hud.bag.head": "Kopf", - "hud.bag.neck": "Nacken", - "hud.bag.tabard": "Wappenrock", - "hud.bag.shoulders": "Schultern", - "hud.bag.chest": "Brust", - "hud.bag.hands": "Hände", - "hud.bag.lantern": "Laterne", - "hud.bag.glider": "Gleiter", - "hud.bag.belt": "Gürtel", - "hud.bag.ring": "Ring", - "hud.bag.back": "Rücken", - "hud.bag.legs": "Beine", - "hud.bag.feet": "Füße", - "hud.bag.mainhand": "Haupthand", - "hud.bag.offhand": "Nebenhand", - "hud.bag.inactive_mainhand": "Inaktive Haupthand", - "hud.bag.inactive_offhand": "Inaktive Nebenhand", - "hud.bag.swap_equipped_weapons_title": "Ausgerüstete Waffen tauschen", - "hud.bag.swap_equipped_weapons_desc": "Drücke {key}", - "hud.bag.bag": "Beutel", - "hud.bag.health": "Leben", - "hud.bag.energy": "Ausdauer", - "hud.bag.combat_rating": "Kampfwertung", - "hud.bag.protection": "Schutz", - "hud.bag.stun_res": "Betäubungsresistenz", - "hud.bag.combat_rating_desc": "Berechnet aus deiner \nAusrüstung und Gesundheit.", - "hud.bag.protection_desc": "Schadensreduzierung durch Rüstung", - "hud.bag.stun_res_desc": "Widerstandsfähigkeit gegen Betäubung durch aufeinanderfolgende Treffer.\nRegeneriert wie Ausdauer.", - "hud.bag.sort_by_name": "Nach Namen sortieren", - "hud.bag.sort_by_quality": "Nach Qualität sortieren", - "hud.bag.sort_by_category": "Nach Kategorie sortieren", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/char_window.ftl b/assets/voxygen/i18n/de_DE/hud/char_window.ftl new file mode 100644 index 0000000000..c711b1eddf --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Charaktername +character_window-character_stats = + Ausdauer + + Fitness + + Willenskraft + + Schutz \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/char_window.ron b/assets/voxygen/i18n/de_DE/hud/char_window.ron deleted file mode 100644 index 8699c31a23..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "character_window.character_name": "Charaktername", - // Character stats - "character_window.character_stats": r#"Ausdauer - -Fitness - -Willenskraft - -Schutz -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/chat.ftl b/assets/voxygen/i18n/de_DE/hud/chat.ftl new file mode 100644 index 0000000000..7f79cdc9f3 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Alle +hud-chat-chat_tab_hover_tooltip = Rechtsklick für Einstellungen +hud-outcome-burning = An Verbrennung gestorben +hud-outcome-curse = An Verfluchung gestorben +hud-outcome-bleeding = Verblutet +hud-outcome-crippled = An Verkrüpplung gestorben +hud-outcome-frozen = Erfroren +hud-chat-online_msg = [{ $name }] ist nun online +hud-chat-offline_msg = [{ $name }] ging offline +hud-chat-default_death_msg = [{ $name }] Starb +hud-chat-environmental_kill_msg = [{ $name }] starb in { $environment } +hud-chat-fall_kill_msg = [{ $name }] starb durch Fallschaden +hud-chat-suicide_msg = [{ $name }] beging Selbstmord +hud-chat-pvp_buff_kill_msg = [{ $victim }] starb an { $buff } von [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] vernichtete [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] erschoss [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] sprengte [{ $victim }] aus dem Leben +hud-chat-pvp_energy_kill_msg = [{ $attacker }] tötete [{ $victim }] mit Magie +hud-chat-nonexistent_buff_kill_msg = [{ $victim }] starb an { $buff } +hud-chat-npc_buff_kill_msg = [{ $victim }] starb an { $buff } verursacht durch { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } tötete [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } erschoss [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } sprengte [{ $victim }] aus dem Leben +hud-chat-npc_energy_kill_msg = { $attacker } tötete [{ $victim }] mit Magie +hud-chat-npc_other_kill_msg = { $attacker } tötete [{ $victim }] +hud-chat-loot_msg = Du hast [{ $item }] aufgehoben +hud-chat-loot_fail = Dein Inventar ist voll! +hud-chat-goodbye = Auf Wiedersehen! +hud-chat-connection_lost = Verbindungsabbruch. Du wirst in { $time } Sekunden gekickt. \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/chat.ron b/assets/voxygen/i18n/de_DE/hud/chat.ron deleted file mode 100644 index 6d138fae9f..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "hud.chat.all": "Alle", - "hud.chat.chat_tab_hover_tooltip": "Rechtsklick für Einstellungen", - - // Debuff outcomes - "hud.outcome.burning": "An Verbrennung gestorben", - "hud.outcome.curse": "An Verfluchung gestorben", - "hud.outcome.bleeding": "Verblutet", - "hud.outcome.crippled": "An Verkrüpplung gestorben", - "hud.outcome.frozen": "Erfroren", - - // Chat outputs - "hud.chat.online_msg": "[{name}] ist nun online", - "hud.chat.offline_msg": "[{name}] ging offline", - - "hud.chat.default_death_msg": "[{name}] Starb", - "hud.chat.environmental_kill_msg": "[{name}] starb in {environment}", - "hud.chat.fall_kill_msg": "[{name}] starb durch Fallschaden", - "hud.chat.suicide_msg": "[{name}] beging Selbstmord", - - "hud.chat.pvp_buff_kill_msg": "[{victim}] starb an {buff} von [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] vernichtete [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] erschoss [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] sprengte [{victim}] aus dem Leben", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] tötete [{victim}] mit Magie", - - "hud.chat.nonexistent_buff_kill_msg": "[{victim}] starb an {buff}", - - "hud.chat.npc_buff_kill_msg": "[{victim}] starb an {buff} verursacht durch {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} tötete [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} erschoss [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} sprengte [{victim}] aus dem Leben", - "hud.chat.npc_energy_kill_msg": "{attacker} tötete [{victim}] mit Magie", - "hud.chat.npc_other_kill_msg": "{attacker} tötete [{victim}]", - - "hud.chat.loot_msg": "Du hast [{item}] aufgehoben", - "hud.chat.loot_fail": "Dein Inventar ist voll!", - "hud.chat.goodbye": "Auf Wiedersehen!", - "hud.chat.connection_lost": "Verbindungsabbruch. Du wirst in {time} Sekunden gekickt.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/crafting.ftl b/assets/voxygen/i18n/de_DE/hud/crafting.ftl new file mode 100644 index 0000000000..065bcbeaec --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/crafting.ftl @@ -0,0 +1,35 @@ +hud-crafting = Herstellen +hud-crafting-recipes = Rezepte +hud-crafting-ingredients = Zutaten: +hud-crafting-craft = Handwerk +hud-crafting-tool_cata = Benötigt: +hud-crafting-req_crafting_station = Benötigt: +hud-crafting-anvil = Amboss +hud-crafting-cauldron = Kessel +hud-crafting-cooking_pot = Kochtopf +hud-crafting-crafting_bench = Werkbank +hud-crafting-forge = Schmiedeofen +hud-crafting-loom = Webstuhl +hud-crafting-spinning_wheel = Spinnrad +hud-crafting-tanning_rack = Spannrahmen +hud-crafting-salvaging_station = Recyclingtisch +hud-crafting-tabs-all = Alle +hud-crafting-tabs-armor = Rüstung +hud-crafting-tabs-dismantle = Recycling +hud-crafting-tabs-food = Nahrung +hud-crafting-tabs-glider = Gleiter +hud-crafting-tabs-potion = Tränke +hud-crafting-tabs-tool = Werkzeug +hud-crafting-tabs-utility = Hilfsmittel +hud-crafting-tabs-weapon = Waffen +hud-crafting-tabs-bag = Taschen +hud-crafting-tabs-processed_material = Materialien +hud-crafting-dismantle_title = Zerlegung +hud-crafting-dismantle_explanation = + Bewege den Mauszeiger über deine + + Gegenstände, um zu sehen, + + welche zerlegbar sind. + + Doppelklicke, um Zerlegung zu starten. \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/crafting.ron b/assets/voxygen/i18n/de_DE/hud/crafting.ron deleted file mode 100644 index 7c1caddf74..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/crafting.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "hud.crafting": "Herstellen", - "hud.crafting.recipes": "Rezepte", - "hud.crafting.ingredients": "Zutaten:", - "hud.crafting.craft": "Handwerk", - "hud.crafting.tool_cata": "Benötigt:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Benötigt:", - "hud.crafting.anvil": "Amboss", - "hud.crafting.cauldron": "Kessel", - "hud.crafting.cooking_pot": "Kochtopf", - "hud.crafting.crafting_bench": "Werkbank", - "hud.crafting.forge": "Schmiedeofen", - "hud.crafting.loom": "Webstuhl", - "hud.crafting.spinning_wheel": "Spinnrad", - "hud.crafting.tanning_rack": "Spannrahmen", - "hud.crafting.salvaging_station": "Recyclingtisch", - // Tabs - "hud.crafting.tabs.all": "Alle", - "hud.crafting.tabs.armor": "Rüstung", - "hud.crafting.tabs.dismantle": "Recycling", - "hud.crafting.tabs.food": "Nahrung", - "hud.crafting.tabs.glider": "Gleiter", - "hud.crafting.tabs.potion": "Tränke", - "hud.crafting.tabs.tool": "Werkzeug", - "hud.crafting.tabs.utility": "Hilfsmittel", - "hud.crafting.tabs.weapon": "Waffen", - "hud.crafting.tabs.bag": "Taschen", - "hud.crafting.tabs.processed_material": "Materialien", - "hud.crafting.dismantle_title": "Zerlegung", - "hud.crafting.dismantle_explanation" : "Bewege den Mauszeiger über deine \n\nGegenstände, um zu sehen,\n\nwelche zerlegbar sind.\n\nDoppelklicke, um Zerlegung zu starten.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/group.ftl b/assets/voxygen/i18n/de_DE/hud/group.ftl new file mode 100644 index 0000000000..b283c64345 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Gruppe +hud-group-invite_to_join = [{ $name }] hat dich in eine Gruppe eingeladen! +hud-group-invite_to_trade = [{ $name }] will mit dir handeln. +hud-group-invite = Einladen +hud-group-kick = Aus der Gruppe kicken +hud-group-assign_leader = Zum Gruppenanführer machen +hud-group-leave = Gruppe verlassen +hud-group-dead = Tot +hud-group-out_of_range = Außerhalb der Reichweite +hud-group-add_friend = Zur Freundesliste hinzufügen +hud-group-link_group = Gruppe verlinken +hud-group-in_menu = Im Menü +hud-group-members = Gruppenmitglieder \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/group.ron b/assets/voxygen/i18n/de_DE/hud/group.ron deleted file mode 100644 index bae25df4f5..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Germany German -( - string_map: { - "hud.group": "Gruppe", - "hud.group.invite_to_join": "[{name}] hat dich in eine Gruppe eingeladen!", - "hud.group.invite_to_trade": "[{name}] will mit dir handeln.", - "hud.group.invite": "Einladen", - "hud.group.kick": "Aus der Gruppe kicken", - "hud.group.assign_leader": "Zum Gruppenanführer machen", - "hud.group.leave": "Gruppe verlassen", - "hud.group.dead" : "Tot", - "hud.group.out_of_range": "Außerhalb der Reichweite", - "hud.group.add_friend": "Zur Freundesliste hinzufügen", - "hud.group.link_group": "Gruppe verlinken", - "hud.group.in_menu": "Im Menü", - "hud.group.members": "Gruppenmitglieder", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/map.ftl b/assets/voxygen/i18n/de_DE/hud/map.ftl new file mode 100644 index 0000000000..ff06d24cff --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/map.ftl @@ -0,0 +1,31 @@ +hud-map-map_title = Karte +hud-map-qlog_title = Aufgaben +hud-map-topo_map = Topographie +hud-map-difficulty = Schwierigkeitsgrad +hud-map-towns = Städte +hud-map-castles = Burgen +hud-map-dungeons = Katakomben +hud-map-caves = Höhlen +hud-map-cave = Höhle +hud-map-peaks = Berge +hud-map-voxel_map = Voxelkarte +hud-map-trees = Mammutbäume +hud-map-tree = Mammutbaum +hud-map-town = Stadt +hud-map-castle = Burg +hud-map-dungeon = Verlies +hud-map-difficulty_dungeon = + Verlies + + Schwierigkeitsgrad: { $difficulty } +hud-map-drag = Ziehen +hud-map-zoom = Zoom +hud-map-mid_click = Wegpunkt setzen +hud-map-recenter = Zentrieren +hud-map-marked_location = Markierter Standort +hud-map-marked_location_remove = Zum Entfernen klicken +hud-map-change_map_mode = Kartenmodus ändern +hud-map-toggle_minimap_voxel = Voxel-Ansicht der Minikarte an-/ausschalten +hud-map-zoom_minimap_explanation = + Du kannst in der minimap heranzoomen, + um die Welt um dich herum im Detail zu sehen. \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/map.ron b/assets/voxygen/i18n/de_DE/hud/map.ron deleted file mode 100644 index bb1c64f707..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Karte", - "hud.map.qlog_title": "Aufgaben", - "hud.map.topo_map": "Topographie", - "hud.map.difficulty": "Schwierigkeitsgrad", - "hud.map.towns": "Städte", - "hud.map.castles": "Burgen", - "hud.map.dungeons": "Katakomben", - "hud.map.caves": "Höhlen", - "hud.map.cave": "Höhle", - "hud.map.peaks": "Berge", - "hud.map.voxel_map": "Voxelkarte", - "hud.map.trees": "Mammutbäume", - "hud.map.tree": "Mammutbaum", - "hud.map.town": "Stadt", - "hud.map.castle": "Burg", - "hud.map.dungeon": "Verlies", - "hud.map.difficulty_dungeon": "Verlies\n\nSchwierigkeitsgrad: {difficulty}", - "hud.map.drag": "Ziehen", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Wegpunkt setzen", - "hud.map.recenter": "Zentrieren", - "hud.map.marked_location": "Markierter Standort", - "hud.map.marked_location_remove": "Zum Entfernen klicken", - "hud.map.change_map_mode": "Kartenmodus ändern", - "hud.map.toggle_minimap_voxel": "Voxel-Ansicht der Minikarte an-/ausschalten", - "hud.map.zoom_minimap_explanation": "Du kannst in der minimap heranzoomen,\n um die Welt um dich herum im Detail zu sehen.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/misc.ftl b/assets/voxygen/i18n/de_DE/hud/misc.ftl new file mode 100644 index 0000000000..c47fdf6d18 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/misc.ftl @@ -0,0 +1,36 @@ +hud-do_not_show_on_startup = Beim Start nicht mehr anzeigen +hud-show_tips = Tipps anzeigen +hud-quests = Aufgaben +hud-you_died = Du bist gestorben +hud-waypoint_saved = Wegpunkt gespeichert +hud-sp_arrow_txt = SP +hud-inventory_full = Inventar voll +hud-someone_else = jemand anderem +hud-another_group = einer anderen Gruppe +hud-press_key_to_show_keybindings_fmt = [{ $key }] Kurzwahltasten +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Laterne +hud-press_key_to_show_debug_info_fmt = Drücke { $key }, um die Debug-Info anzuzeigen +hud-press_key_to_toggle_keybindings_fmt = Drücke { $key }, um die Kurzwahltasten umzuschalten +hud-press_key_to_toggle_debug_info_fmt = Drücke { $key }, um die Debug-Info umzuschalten +hud-press_key_to_respawn = Drücke { $key }, um am letzten Lagerfeuer wieder einzusteigen. +hud-tutorial_btn = Einführung +hud-tutorial_click_here = Drücke [ { $key } ], um den Mauszeiger frei zu bewegen und klicke auf diese Schaltfläche! +hud-tutorial_elements = Crafting +hud-temp_quest_headline = Sei gegrüßt Reisender! +hud-temp_quest_text = + Um deine Reise zu beginnen, könntest du im Dorf nach nützlichen Gegenständen suchen. + + Dir steht es frei, mitzunehmen, was auch immer du auf deiner Reise findest! + + An der unteren rechten Ecke des Bildschirms findest du verschiedene Dinge, wie deinen Beutel, das Herstellungsmenü und die Karte. + + Im Herstellungsmenü kannst du dir eine Rüstung, verschiedene Waffen, Nahrung und noch vieles mehr herstellen! + + Für den Anfang stellen die wilden Tiere rund um das Dorf eine verlässliche Quelle für Lederstreifen dar, mit denen du dir eine leichte Rüstung gegen die Gefahren dieser Welt herstellen kannst. + + Sobald du dich bereit dafür fühlst, kannst du versuchen, dich den zahlreichen, auf der Karte markierten, Herausforderungen zu stellen, um immer bessere Ausrüstungsgegenstände zu erhalten! +hud-spell = Zaubersprüche +hud-diary = Tagebuch +hud-free_look_indicator = Freie Sicht aktiv. Drücke { $key } zum deaktivieren. +hud-camera_clamp_indicator = Vertikale Kamerafixierung aktiv. Drücke { $key } zum deaktivieren. +hud-auto_walk_indicator = Auto Laufen/Schwimmen aktiv \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/misc.ron b/assets/voxygen/i18n/de_DE/hud/misc.ron deleted file mode 100644 index 0004ed31b5..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/misc.ron +++ /dev/null @@ -1,55 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "hud.do_not_show_on_startup": "Beim Start nicht mehr anzeigen", - "hud.show_tips": "Tipps anzeigen", - "hud.quests": "Aufgaben", - "hud.you_died": "Du bist gestorben", - "hud.waypoint_saved": "Wegpunkt gespeichert", - "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Inventar voll", - "hud.someone_else": "jemand anderem", - "hud.another_group": "einer anderen Gruppe", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Kurzwahltasten", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Laterne", - "hud.press_key_to_show_debug_info_fmt": "Drücke {key}, um die Debug-Info anzuzeigen", - "hud.press_key_to_toggle_keybindings_fmt": "Drücke {key}, um die Kurzwahltasten umzuschalten", - "hud.press_key_to_toggle_debug_info_fmt": "Drücke {key}, um die Debug-Info umzuschalten", - - // Respawn message - "hud.press_key_to_respawn": r#"Drücke {key}, um am letzten Lagerfeuer wieder einzusteigen."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Einführung"#, - "hud.tutorial_click_here": r#"Drücke [ {key} ], um den Mauszeiger frei zu bewegen und klicke auf diese Schaltfläche!"#, - "hud.tutorial_elements": r#"Crafting"#, - -"hud.temp_quest_headline": r#"Sei gegrüßt Reisender!"#, -"hud.temp_quest_text": r#"Um deine Reise zu beginnen, könntest du im Dorf nach nützlichen Gegenständen suchen. - -Dir steht es frei, mitzunehmen, was auch immer du auf deiner Reise findest! - -An der unteren rechten Ecke des Bildschirms findest du verschiedene Dinge, wie deinen Beutel, das Herstellungsmenü und die Karte. - -Im Herstellungsmenü kannst du dir eine Rüstung, verschiedene Waffen, Nahrung und noch vieles mehr herstellen! - -Für den Anfang stellen die wilden Tiere rund um das Dorf eine verlässliche Quelle für Lederstreifen dar, mit denen du dir eine leichte Rüstung gegen die Gefahren dieser Welt herstellen kannst. - -Sobald du dich bereit dafür fühlst, kannst du versuchen, dich den zahlreichen, auf der Karte markierten, Herausforderungen zu stellen, um immer bessere Ausrüstungsgegenstände zu erhalten! -"#, - - "hud.spell": "Zaubersprüche", - // Diary - "hud.diary": "Tagebuch", - "hud.free_look_indicator": "Freie Sicht aktiv. Drücke {key} zum deaktivieren.", - "hud.camera_clamp_indicator": "Vertikale Kamerafixierung aktiv. Drücke {key} zum deaktivieren.", - "hud.auto_walk_indicator": "Auto Laufen/Schwimmen aktiv", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/sct.ftl b/assets/voxygen/i18n/de_DE/hud/sct.ftl new file mode 100644 index 0000000000..6e3890c4be --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOCKIERT \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/sct.ron b/assets/voxygen/i18n/de_DE/hud/sct.ron deleted file mode 100644 index 18fc2f4976..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOCKIERT", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/settings.ftl b/assets/voxygen/i18n/de_DE/hud/settings.ftl new file mode 100644 index 0000000000..86383e95f2 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/settings.ftl @@ -0,0 +1,120 @@ +hud-settings-general = Allgemein +hud-settings-none = Keine +hud-settings-press_behavior-toggle = Umschalten +hud-settings-press_behavior-hold = Halten +hud-settings-help_window = Hilfe zu Fenstern +hud-settings-debug_info = Debug-Informationen +hud-settings-show_hitboxes = Hitboxen anzeigen +hud-settings-show_chat = Chat anzeigen +hud-settings-show_hotkey_hints = Hotkey-Hinweise anzeigen +hud-settings-tips_on_startup = Tipps bei Start +hud-settings-ui_scale = UI-Skalierung +hud-settings-relative_scaling = Relative Skalierung +hud-settings-custom_scaling = Benutzerdefinierte Skalierung +hud-settings-crosshair = Fadenkreuz +hud-settings-opacity = Sichtbarkeit +hud-settings-hotbar = Hotbar +hud-settings-toggle_shortcuts = Tastenkürzel umschalten +hud-settings-buffs_skillbar = Effekte an der Skillbar +hud-settings-buffs_mmap = Effekte an der Minimap +hud-settings-toggle_bar_experience = Erfahrungsleiste umschalten +hud-settings-scrolling_combat_text = Fließtext für Kampfhandlungen +hud-settings-incoming_damage = Erlittener Schaden +hud-settings-speech_bubble = Sprechblase +hud-settings-speech_bubble_dark_mode = Sprechblase: Nachtmodus +hud-settings-speech_bubble_icon = Sprechblasen-Icon +hud-settings-energybar_numbers = Energieleisten-Nummern +hud-settings-always_show_bars = Energieleisten immer anzeigen +hud-settings-values = Werte +hud-settings-percentages = Prozentangaben +hud-settings-chat = Chat +hud-settings-background_opacity = Hintergrundsichtbarkeit +hud-settings-chat_character_name = Charakternamen im Chat +hud-settings-loading_tips = Tipps auf dem Ladebildschirm +hud-settings-reset_interface = Auf Standardwerte zurücksetzen +hud-settings-pan_sensitivity = Kamera-Empfindlichkeit +hud-settings-zoom_sensitivity = Zoom-Empfindlichkeit +hud-settings-camera_clamp_angle = Starrer Winkel für vertikalen Kameramodus +hud-settings-invert_scroll_zoom = Kamera Zoom invertiert +hud-settings-invert_mouse_y_axis = Y-Achse invertieren +hud-settings-invert_controller_y_axis = Controller: Y-Achse invertieren +hud-settings-enable_mouse_smoothing = Kamera-Glättung +hud-settings-free_look_behavior = Verhalten bei freiem Kameramodus +hud-settings-auto_walk_behavior = Verhalten bei automatischem Gehen +hud-settings-camera_clamp_behavior = Verhalten bei starrer Kamera +hud-settings-player_physics_behavior = Spielerphysik (experimentell) +hud-settings-stop_auto_walk_on_input = Automatisches Gehen bei Spieleraktivität anhalten +hud-settings-auto_camera = Auto Kamera +hud-settings-reset_gameplay = Standardeinstellungen wiederherstellen +hud-settings-view_distance = Sichtweite +hud-settings-sprites_view_distance = Sprite-Sichtweite +hud-settings-figures_view_distance = Objekt-Sichtweite +hud-settings-maximum_fps = Maximale FPS +hud-settings-background_fps = Hintergrund-FPS +hud-settings-present_mode = Aktueller Modus +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Unmittelbar +hud-settings-fov = Sichtfeld (Grad) +hud-settings-gamma = Gamma +hud-settings-exposure = Belichtung +hud-settings-ambiance = Umgebungshelligkeit +hud-settings-antialiasing_mode = AntiAliasing-Modus +hud-settings-upscale_factor = Interne Auflösung +hud-settings-cloud_rendering_mode = Wolken-Renderingmodus +hud-settings-fluid_rendering_mode = Flüssigkeiten-Renderingmodus +hud-settings-fluid_rendering_mode-cheap = Billig +hud-settings-fluid_rendering_mode-shiny = Glänzend +hud-settings-cloud_rendering_mode-minimal = Minimal +hud-settings-cloud_rendering_mode-low = Niedrig +hud-settings-cloud_rendering_mode-medium = Mitel +hud-settings-cloud_rendering_mode-high = Hoch +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Vollbild +hud-settings-fullscreen_mode = Vollbildmodus +hud-settings-fullscreen_mode-exclusive = Exklusiv +hud-settings-fullscreen_mode-borderless = Randlos +hud-settings-gpu_profiler = GPU-Timing einschalten (nicht mit allen Geräten kompatibel) +hud-settings-particles = Partikel +hud-settings-lossy_terrain_compression = Verlustbehaftete Kompression des Untergrunds +hud-settings-resolution = Auflösung +hud-settings-bit_depth = Bit-Tiefe +hud-settings-refresh_rate = Bildwiederholrate +hud-settings-lighting_rendering_mode = Beleuchtungs-Renderingmodus +hud-settings-lighting_rendering_mode-ashikhmin = Typ A - Hoch +hud-settings-lighting_rendering_mode-blinnphong = Typ B - Medium +hud-settings-lighting_rendering_mode-lambertian = Typ L - Billig +hud-settings-shadow_rendering_mode = Schatten-Renderingmodus +hud-settings-shadow_rendering_mode-none = Keine +hud-settings-shadow_rendering_mode-cheap = Billig +hud-settings-shadow_rendering_mode-map = Karte +hud-settings-shadow_rendering_mode-map-resolution = Auflösung +hud-settings-lod_detail = LoD Detail +hud-settings-save_window_size = Fenstergröße Speichern +hud-settings-reset_graphics = Standardeinstellungen wiederherstellen +hud-settings-bloom = Bloom-Effekt +hud-settings-master_volume = Lautstärke +hud-settings-inactive_master_volume_perc = Lautstärke, wenn das Fenster inaktiv ist +hud-settings-music_volume = Musik-Lautstärke +hud-settings-sound_effect_volume = Soundeffekt-Lautstärke +hud-settings-audio_device = Audiogerät +hud-settings-reset_sound = Standardeinstellungen wiederherstellen +hud-settings-english_fallback = Englische Einstellungen bei fehlender Übersetzung anzeigen +hud-settings-awaitingkey = Drücke eine Taste... +hud-settings-unbound = Keine +hud-settings-reset_keybinds = Standardeinstellungen wiederherstellen +hud-settings-chat_tabs = Chat-Fenster +hud-settings-label = Bezeichnung: +hud-settings-delete = Löschen +hud-settings-show_all = Alle anzeigen +hud-settings-messages = Nachrichten +hud-settings-activity = Aktivität +hud-settings-death = Tod +hud-settings-group = Gruppe +hud-settings-faction = Fraktion +hud-settings-world = Welt +hud-settings-region = Region +hud-settings-say = Sagen +hud-settings-all = Alle +hud-settings-group_only = Nur für die Gruppe +hud-settings-reset_chat = Standard wiederherstellen \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/settings.ron b/assets/voxygen/i18n/de_DE/hud/settings.ron deleted file mode 100644 index f1e6103f48..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/settings.ron +++ /dev/null @@ -1,138 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - // Settings - "hud.settings.general": "Allgemein", - "hud.settings.none": "Keine", - "hud.settings.press_behavior.toggle": "Umschalten", - "hud.settings.press_behavior.hold": "Halten", - "hud.settings.help_window": "Hilfe zu Fenstern", - "hud.settings.debug_info": "Debug-Informationen", - "hud.settings.show_hitboxes": "Hitboxen anzeigen", - "hud.settings.show_chat": "Chat anzeigen", - "hud.settings.show_hotkey_hints": "Hotkey-Hinweise anzeigen", - "hud.settings.tips_on_startup": "Tipps bei Start", - "hud.settings.ui_scale": "UI-Skalierung", - "hud.settings.relative_scaling": "Relative Skalierung", - "hud.settings.custom_scaling": "Benutzerdefinierte Skalierung", - "hud.settings.crosshair": "Fadenkreuz", - "hud.settings.opacity": "Sichtbarkeit", - "hud.settings.hotbar": "Hotbar", - "hud.settings.toggle_shortcuts": "Tastenkürzel umschalten", - "hud.settings.buffs_skillbar": "Effekte an der Skillbar", - "hud.settings.buffs_mmap": "Effekte an der Minimap", - "hud.settings.toggle_bar_experience": "Erfahrungsleiste umschalten", - "hud.settings.scrolling_combat_text": "Fließtext für Kampfhandlungen", - "hud.settings.incoming_damage": "Erlittener Schaden", - "hud.settings.speech_bubble": "Sprechblase", - "hud.settings.speech_bubble_dark_mode": "Sprechblase: Nachtmodus", - "hud.settings.speech_bubble_icon": "Sprechblasen-Icon", - "hud.settings.energybar_numbers": "Energieleisten-Nummern", - "hud.settings.always_show_bars": "Energieleisten immer anzeigen", - "hud.settings.values": "Werte", - "hud.settings.percentages": "Prozentangaben", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Hintergrundsichtbarkeit", - "hud.settings.chat_character_name": "Charakternamen im Chat", - "hud.settings.loading_tips": "Tipps auf dem Ladebildschirm", - "hud.settings.reset_interface": "Auf Standardwerte zurücksetzen", - - "hud.settings.pan_sensitivity": "Kamera-Empfindlichkeit", - "hud.settings.zoom_sensitivity": "Zoom-Empfindlichkeit", - "hud.settings.camera_clamp_angle": "Starrer Winkel für vertikalen Kameramodus", - "hud.settings.invert_scroll_zoom": "Kamera Zoom invertiert", - "hud.settings.invert_mouse_y_axis": "Y-Achse invertieren", - "hud.settings.invert_controller_y_axis": "Controller: Y-Achse invertieren", - "hud.settings.enable_mouse_smoothing": "Kamera-Glättung", - "hud.settings.free_look_behavior": "Verhalten bei freiem Kameramodus", - "hud.settings.auto_walk_behavior": "Verhalten bei automatischem Gehen", - "hud.settings.camera_clamp_behavior": "Verhalten bei starrer Kamera", - "hud.settings.player_physics_behavior": "Spielerphysik (experimentell)", - "hud.settings.stop_auto_walk_on_input": "Automatisches Gehen bei Spieleraktivität anhalten", - "hud.settings.auto_camera": "Auto Kamera", - "hud.settings.reset_gameplay": "Standardeinstellungen wiederherstellen", - - "hud.settings.view_distance": "Sichtweite", - "hud.settings.sprites_view_distance": "Sprite-Sichtweite", - "hud.settings.figures_view_distance": "Objekt-Sichtweite", - "hud.settings.maximum_fps": "Maximale FPS", - "hud.settings.background_fps": "Hintergrund-FPS", - "hud.settings.present_mode": "Aktueller Modus", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Unmittelbar", - "hud.settings.fov": "Sichtfeld (Grad)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Belichtung", - "hud.settings.ambiance": "Umgebungshelligkeit", - "hud.settings.antialiasing_mode": "AntiAliasing-Modus", - "hud.settings.upscale_factor": "Interne Auflösung", - "hud.settings.cloud_rendering_mode": "Wolken-Renderingmodus", - "hud.settings.fluid_rendering_mode": "Flüssigkeiten-Renderingmodus", - "hud.settings.fluid_rendering_mode.cheap": "Billig", - "hud.settings.fluid_rendering_mode.shiny": "Glänzend", - "hud.settings.cloud_rendering_mode.minimal": "Minimal", - "hud.settings.cloud_rendering_mode.low": "Niedrig", - "hud.settings.cloud_rendering_mode.medium": "Mitel", - "hud.settings.cloud_rendering_mode.high": "Hoch", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Vollbild", - "hud.settings.fullscreen_mode": "Vollbildmodus", - "hud.settings.fullscreen_mode.exclusive": "Exklusiv", - "hud.settings.fullscreen_mode.borderless": "Randlos", - "hud.settings.gpu_profiler": "GPU-Timing einschalten (nicht mit allen Geräten kompatibel)", - "hud.settings.particles": "Partikel", - "hud.settings.lossy_terrain_compression": "Verlustbehaftete Kompression des Untergrunds", - "hud.settings.resolution": "Auflösung", - "hud.settings.bit_depth": "Bit-Tiefe", - "hud.settings.refresh_rate": "Bildwiederholrate", - "hud.settings.lighting_rendering_mode": "Beleuchtungs-Renderingmodus", - "hud.settings.lighting_rendering_mode.ashikhmin": "Typ A - Hoch ", - "hud.settings.lighting_rendering_mode.blinnphong": "Typ B - Medium", - "hud.settings.lighting_rendering_mode.lambertian": "Typ L - Billig", - "hud.settings.shadow_rendering_mode": "Schatten-Renderingmodus", - "hud.settings.shadow_rendering_mode.none": "Keine", - "hud.settings.shadow_rendering_mode.cheap": "Billig", - "hud.settings.shadow_rendering_mode.map": "Karte", - "hud.settings.shadow_rendering_mode.map.resolution": "Auflösung", - "hud.settings.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Fenstergröße Speichern", - "hud.settings.reset_graphics": "Standardeinstellungen wiederherstellen", - "hud.settings.bloom": "Bloom-Effekt", - - "hud.settings.master_volume": "Lautstärke", - "hud.settings.inactive_master_volume_perc": "Lautstärke, wenn das Fenster inaktiv ist", - "hud.settings.music_volume": "Musik-Lautstärke", - "hud.settings.sound_effect_volume": "Soundeffekt-Lautstärke", - "hud.settings.audio_device": "Audiogerät", - "hud.settings.reset_sound": "Standardeinstellungen wiederherstellen", - - "hud.settings.english_fallback": "Englische Einstellungen bei fehlender Übersetzung anzeigen", - - "hud.settings.awaitingkey": "Drücke eine Taste...", - "hud.settings.unbound": "Keine", - "hud.settings.reset_keybinds": "Standardeinstellungen wiederherstellen", - - "hud.settings.chat_tabs": "Chat-Fenster", - "hud.settings.label": "Bezeichnung:", - "hud.settings.delete": "Löschen", - "hud.settings.show_all": "Alle anzeigen", - "hud.settings.messages": "Nachrichten", - "hud.settings.activity": "Aktivität", - "hud.settings.death": "Tod", - "hud.settings.group": "Gruppe", - "hud.settings.faction": "Fraktion", - "hud.settings.world": "Welt", - "hud.settings.region": "Region", - "hud.settings.say": "Sagen", - "hud.settings.all": "Alle", - "hud.settings.group_only": "Nur für die Gruppe", - "hud.settings.reset_chat" : "Standard wiederherstellen", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/skills.ftl b/assets/voxygen/i18n/de_DE/hud/skills.ftl new file mode 100644 index 0000000000..e1b5e26433 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/skills.ftl @@ -0,0 +1,241 @@ +hud-rank_up = Neuer Fähigkeitspunkt +hud-skill-sp_available = { $number } SP verfügbar +hud-skill-not_unlocked = Noch nicht freigeschaltet +hud-skill-req_sp ={"\u000A"} + + Benötigt { $number } SP +hud-skill-inc_health_title = Leben erhöhen +hud-skill-inc_health = Erhöht max. Leben um { $boost }{ $SP } +hud-skill-inc_energy_title = Ausdauer +hud-skill-inc_energy = Erhöht die max. Ausdauer um { $boost }{ $SP } +hud-skill-unlck_sword_title = Schwert freischalten +hud-skill-unlck_sword = Schaltet den Schwert-Fähigkeitenbaum frei{ $SP } +hud-skill-unlck_axe_title = Axt freischalten +hud-skill-unlck_axe = Schaltet den Axt-Fähigkeitenbaum frei{ $SP } +hud-skill-unlck_hammer_title = Hammer freischalten +hud-skill-unlck_hammer = Schaltet den Hammer-Fähigkeitenbaum frei{ $SP } +hud-skill-unlck_bow_title = Bogen freischalten +hud-skill-unlck_bow = Schaltet den Bogen-Fähigkeitenbaum frei{ $SP } +hud-skill-unlck_staff_title = Stab freischalten +hud-skill-unlck_staff = Schaltet den Stab-Fähigkeitenbaum frei{ $SP } +hud-skill-unlck_sceptre_title = Zepter freischalten +hud-skill-unlck_sceptre = Schaltet den Zepter-Fähigkeitenbaum frei{ $SP } +hud-skill-dodge_title = Ausweichen +hud-skill-dodge = Weicht Nahkampfattacken aus{ $SP } +hud-skill-roll_energy_title = Ausdauerkosten beim Rollen +hud-skill-roll_energy = Rollen nutzt { $boost }% weniger Ausdauer{ $SP } +hud-skill-roll_speed_title = Rollgeschwindigkeit +hud-skill-roll_speed = Rolle um { $boost }% schneller{ $SP } +hud-skill-roll_dur_title = Rolldauer +hud-skill-roll_dur = Rolle um { $boost }% länger{ $SP } +hud-skill-climbing_title = Klettern +hud-skill-climbing = Höher springen +hud-skill-climbing_cost_title = Ausdauerkosten Klettern +hud-skill-climbing_cost = Klettern verbraucht { $boost }% weniger Ausdauer{ $SP } +hud-skill-climbing_speed_title = Klettergeschwindigkeit +hud-skill-climbing_speed = Klettere um { $boost }% schneller{ $SP } +hud-skill-swim_title = Schwimmen +hud-skill-swim = Schwimme in Gewässern +hud-skill-swim_speed_title = Schwimmgeschwindigkeit +hud-skill-swim_speed = Schwimme um { $boost }% schneller{ $SP } +hud-skill-sc_lifesteal_title = Strahl des Lebensraubs +hud-skill-sc_lifesteal = Entziehe deinem Gegner Lebensenergie +hud-skill-sc_lifesteal_damage_title = Schaden +hud-skill-sc_lifesteal_damage = Verursache um { $boost }% höheren Schaden{ $SP } +hud-skill-sc_lifesteal_range_title = Reichweite +hud-skill-sc_lifesteal_range = Der Strahl reicht um { $boost }% weiter{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Lebensraub +hud-skill-sc_lifesteal_lifesteal = Wandle weitere { $boost }% Schaden in Lebensenergie um{ $SP } +hud-skill-sc_lifesteal_regen_title = Ausdauerregeneration +hud-skill-sc_lifesteal_regen = Stellt weitere { $boost }% deiner Ausdauer wieder her{ $SP } +hud-skill-sc_heal_title = Strahl der Heilung +hud-skill-sc_heal = Heilt deine Verbündeten mit dem Blut deiner Feinde +hud-skill-sc_heal_heal_title = Heilung +hud-skill-sc_heal_heal = Erhöht die Menge, um die du Verbündete heilst um { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Ausdauerkosten +hud-skill-sc_heal_cost = Heilen benötig { $boost }% weniger Ausdauer{ $SP } +hud-skill-sc_heal_duration_title = Dauer +hud-skill-sc_heal_duration = Die Effekte deiner heilenden Aura dauern { $boost }% länger{ $SP } +hud-skill-sc_heal_range_title = Reichweite +hud-skill-sc_heal_range = Dein Heilstrahl reicht { $boost }% weiter{ $SP } +hud-skill-sc_wardaura_unlock_title = Schutzaura entsperren +hud-skill-sc_wardaura_unlock = Erlaubt es dir deine Verbündeten mit einer schützenden Aura zu umgeben{ $SP } +hud-skill-sc_wardaura_strength_title = Stärke +hud-skill-sc_wardaura_strength = Die Stärke deiner Aura wird um { $boost }% erhöht{ $SP } +hud-skill-sc_wardaura_duration_title = Dauer +hud-skill-sc_wardaura_duration = Der Effekt deiner Aura hält um { $boost }% länger{ $SP } +hud-skill-sc_wardaura_range_title = Reichweite +hud-skill-sc_wardaura_range = Deine Aura reicht um { $boost }% weiter{ $SP } +hud-skill-sc_wardaura_cost_title = Ausdauerkosten +hud-skill-sc_wardaura_cost = Deine Aura verbraucht { $boost }% weniger Energie{ $SP } +hud-skill-st_shockwave_range_title = Reichweite der Schockwelle +hud-skill-st_shockwave_range = Die Reichweite deiner Schockwelle wird um { $boost }% erhöht{ $SP } +hud-skill-st_shockwave_cost_title = Ausdauerkosten der Schockwelle +hud-skill-st_shockwave_cost = Vermindert die Ausdauerkosten für die Schockwelle um { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Rückstoß der Schockwelle +hud-skill-st_shockwave_knockback = Erhöht die Wurfkraft um { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Schaden der Schockwelle +hud-skill-st_shockwave_damage = Erhöht den verursachten Schaden um { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Schockwelle Freischalten +hud-skill-st_shockwave_unlock = Verleiht dir die Fähigkeit, deine Gegner mit Feuer von dir weg zu stoßen{ $SP } +hud-skill-st_flamethrower_title = Flammenwerfer +hud-skill-st_flamethrower = Ein flammendes Inferno heizt deinen Feinden ordentlich ein! +hud-skill-st_flame_velocity_title = Geschwindigkeit der Flammen +hud-skill-st_flame_velocity = Verkohlt deinen Feinden die Augenbrauen schneller, { $boost }% schneller{ $SP } +hud-skill-st_flamethrower_range_title = Reichweite des Flammenwerfers +hud-skill-st_flamethrower_range = Wenn die Flammen einfach nicht weit genug reichen, reichen sie hiermit um { $boost }% weiter{ $SP } +hud-skill-st_energy_drain_title = Energieverbrauch +hud-skill-st_energy_drain = Vermindert den Energieverbrauch um { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Schaden des Flammenwerfers +hud-skill-st_flamethrower_damage = Erhöht den Schaden um { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Explosionsradius +hud-skill-st_explosion_radius = Größer ist besser, erhöht den Radius der Explosion um { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Ausdauerregeneration +hud-skill-st_energy_regen = Erhöht den Ausdauergewinn um { $boost }%{ $SP } +hud-skill-st_fireball_title = Feuerball +hud-skill-st_fireball = Sende brennende Kugeln in Richtung deiner Feinde +hud-skill-st_damage_title = Schaden +hud-skill-st_damage = Erhöht den Schaden um { $boost }%{ $SP } +hud-skill-st_explosion_title = Explosion +hud-skill-st_explosion = Wenn Feuer allein nicht genug ist{ $SP } +hud-skill-bow_projectile_speed_title = Projektilgeschw. +hud-skill-bow_projectile_speed = Erlaubt es dir deine Pfeile schneller und weiter zu schießen{ $SP } +hud-skill-bow_arrow_count_title = Anzahl der Pfeile +hud-skill-bow_arrow_count = Schieße einen weiteren Pfeil wenn du springst{ $SP } +hud-skill-bow_repeater_cost_title = Verstärkerkosten +hud-skill-bow_repeater_cost = Verringert die Kosten um { $boost }%{ $SP } +hud-skill-bow_repeater_glide_title = Repeater Glide +hud-skill-bow_repeater_glide = Glide further while repeating{ $SP } +hud-skill-bow_repeater_damage_title = Repeater Damage +hud-skill-bow_repeater_damage = Increases the damage done by { $boost }%{ $SP } +hud-skill-bow_repeater_unlock_title = Repeater Unlock +hud-skill-bow_repeater_unlock = Schaltet die Fähigkeit frei, in die Luft zu springen und ein Salve von Pfeilen abzuschießen{ $SP } +hud-skill-bow_charged_title = Aufgeladener Schuss +hud-skill-bow_charged = Geduld zahlt sich aus +hud-skill-bow_charged_knockback_title = Rückstoß bei aufgeladenem Schuss +hud-skill-bow_charged_knockback = Stößt deine Feinde um { $boost }% weiter von dir{ $SP } +hud-skill-bow_charged_move_speed_title = Bewegungsgeschw. beim Spannen +hud-skill-bow_charged_move_speed = Erhöht die Bewegungsgeschw. um { $boost }% während du den Bogen spannst{ $SP } +hud-skill-bow_charged_speed_title = Spanngeschwindigkeit +hud-skill-bow_charged_speed = Erhöht die Geschwindigkeit mit der du den Bogen spannst um { $boost }%{ $SP } +hud-skill-bow_charged_projectile_speed_title = Projektilgeschwindigkeit: Aufgeladen +hud-skill-bow_charged_projectile_speed = Die Projektilgeschw. bei geladenen schüssen wird um weitere { $boost }% erhöht{ $SP } +hud-skill-bow_charged_drain_title = Ausdauerverlust: Aufladen +hud-skill-bow_charged_drain = Vermindert den Ausdauerverlust um { $boost }%{ $SP } +hud-skill-bow_charged_damage_title = Schaden: Aufladen +hud-skill-bow_charged_damage = Erhöht den Schaden um { $boost }%{ $SP } +hud-skill-bow_energy_regen_title = Ausdauerregeneration +hud-skill-bow_energy_regen = Erhöht die Ausdauerregeneration um { $boost }%{ $SP } +hud-skill-bow_title = Pfeilschuss +hud-skill-bow = Unendlicher Köcher inklusive, nicht für Kinder geeignet! +hud-skill-bow_damage_title = Schaden +hud-skill-bow_damage = Erhöht den Schaden um { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Radius: Zerschmettern +hud-skill-hmr_leap_radius = Erhöht den Radius, indem du deine Gegner ungespitzt in den Boden rammst um { $boost } Meter{ $SP } +hud-skill-hmr_leap_distance_title = Sprungreichweite +hud-skill-hmr_leap_distance = Du kannst dich auf { $boost }% weiter entfernte Gegner stürzen{ $SP } +hud-skill-hmr_leap_cost_title = Kosten: Zerschmettern +hud-skill-hmr_leap_cost = Verringert die Ausdauerkosten um { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Rückstoß: Zerschmettern +hud-skill-hmr_leap_knockback = Zerschmettern stößt deine Gegner um { $boost }% weiter{ $SP } +hud-skill-hmr_leap_damage_title = Schaden: Zerschmettern +hud-skill-hmr_leap_damage = Du schlägst um { $boost }% stärker auf deine Feinde ein{ $SP } +hud-skill-hmr_unlock_leap_title = Zerschmettern freischalten +hud-skill-hmr_unlock_leap = Du kannst auf deine Gegner zuspringen und sie dem Erdboden gleichmachen{ $SP } +hud-skill-hmr_charged_melee_title = Aufgeladener Schlag +hud-skill-hmr_charged_melee = Schwingt den Prügel aber mit Schmackes +hud-skill-hmr_charged_rate_title = Schwung: Aufgeladener Schlag +hud-skill-hmr_charged_rate = Erhöht den Schwung mit dem du zuschlägst um { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Effizienz: Aufgeladener Schlag +hud-skill-hmr_charged_melee_nrg_drain = Wenn du zum aufgeladenen Schlag ansetzt verbrauchst du { $boost }% weniger Energie{ $SP } +hud-skill-hmr_charged_melee_damage_title = Schaden: Aufgeladener Schlag +hud-skill-hmr_charged_melee_damage = Erhöht den Schaden des aufgeladenen Schlages um { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Rückstoß: Aufgeladener Schlag +hud-skill-hmr_charged_melee_knockback = Erhöht den Rückstoß deines aufgeladenen Schlages um stattliche { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Einfacher Schlag +hud-skill-hmr_single_strike = Weil einfach einfach einfach ist! +hud-skill-hmr_single_strike_regen_title = Regeneration: Einfacher Schlag +hud-skill-hmr_single_strike_regen = Erhöht den Ausdauergewinn mit jedem Treffer{ $SP } +hud-skill-hmr_single_strike_speed_title = Angriffsgeschw.: Einfacher Schlag +hud-skill-hmr_single_strike_speed = Erhöht die Angriffsgeschw. mit jedem Treffer{ $SP } +hud-skill-hmr_single_strike_damage_title = Schaden: Einfacher Schlag +hud-skill-hmr_single_strike_damage = Erhöht den Schaden mit jedem Treffer{ $SP } +hud-skill-hmr_single_strike_knockback_title = Rückstoß: Einfacher Schlag +hud-skill-hmr_single_strike_knockback = Erhöht die Rückstoßkraft um { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Dreifachschlag +hud-skill-sw_trip_str = Eine Dreifach-Kombi Attacke +hud-skill-sw_trip_str_combo_title = Dreifach-Kombi +hud-skill-sw_trip_str_combo = Schalte Kombo-Skalierung bei Dreifach-Kombi frei{ $SP } +hud-skill-sw_trip_str_dmg_title = Schaden: Dreifach-Kombi +hud-skill-sw_trip_str_dmg = Erhöht den Schaden, den jeder aufeinanderfolgende Treffer verursacht{ $SP } +hud-skill-sw_trip_str_sp_title = Geschw.:Dreifachschlag +hud-skill-sw_trip_str_sp = Erhöht die Angriffsgeschw. mit jedem aufeinanderfolgenden Treffer{ $SP } +hud-skill-sw_trip_str_reg_title = Ausdauerregeneration: Dreifachschlag +hud-skill-sw_trip_str_reg = Erhöht Ausdauerregeneration mit jedem aufeinanderfolgenden Treffer{ $SP } +hud-skill-sw_dash_title = Stürmen +hud-skill-sw_dash = Stürme durch deine Gegner, wie ein heißes Messer durch Butter +hud-skill-sw_dash_dmg_title = Schaden: Stürmen +hud-skill-sw_dash_dmg = Erhöht den Initialschaden bei Stürmen um { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Ausdauerverlust: Stürmen +hud-skill-sw_dash_drain = Verringert den Ausdauerverlust beim Stürmen um { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Initialkosten: Stürmen +hud-skill-sw_dash_cost = Verringert die Initialkosten beim Stürmen um { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Geschw.: Stürmen +hud-skill-sw_dash_speed = Du stürmst um { $boost }% schneller auf deine Gegner zu{ $SP } +hud-skill-sw_dash_inf_title = Unendlich Stürmen +hud-skill-sw_dash_inf = Du stürmst solange, bis dir die Puste ausgeht{ $SP } +hud-skill-sw_dash_scale_title = Skalierter Schaden: Stürmen +hud-skill-sw_dash_scale = Erhöht die Skalierung des Schadens beim Stürmen um { $boost }%{ $SP } +hud-skill-sw_spin_title = Rundschlag +hud-skill-sw_spin = Schaltet den Runschlag frei{ $SP } +hud-skill-sw_spin_dmg_title = Triff alle Gegner, die dich umgeben +hud-skill-sw_spin_dmg = Erhöht den Schaden um { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Geschw.: Rundschlag +hud-skill-sw_spin_spd = Erhöht die Geschw. mit der du dich drehst um { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Kosten: Rundschlag +hud-skill-sw_spin_cost = Verringert die Ausdauerkosten des Rundschlags um { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Anzahl: Rundschlag +hud-skill-sw_spin_spins = Du kannst dich öfter drehen bevor dir schwindelig wird{ $SP } +hud-skill-sw_interrupt_title = Attacke abbrechen +hud-skill-sw_interrupt = Erlaubt es dir jede Attacke sofort abzubrechen und eine andere auszuführen{ $SP } +hud-skill-axe_double_strike_title = Doppelschlag +hud-skill-axe_double_strike = Mache sie einen Kopf kürzer +hud-skill-axe_double_strike_combo_title = Doppelschlag Kombo +hud-skill-axe_double_strike_combo = Schaltet einen zweiten Angriff frei{ $SP } +hud-skill-axe_double_strike_damage_title = Schaden: Doppelschlag +hud-skill-axe_double_strike_damage = Erhöht den Schaden, den jeder aufeinanderfolgende Treffer verursacht{ $SP } +hud-skill-axe_double_strike_speed_title = Double Strike Speed +hud-skill-axe_double_strike_speed = Erhöht die Angriffsgeschw. mit jedem aufeinanderfolgenden Treffer{ $SP } +hud-skill-axe_double_strike_regen_title = Double Strike Regen +hud-skill-axe_double_strike_regen = Erhöht Ausdauerregeneration mit jedem aufeinanderfolgenden Treffer{ $SP } +hud-skill-axe_spin_title = Axtrundschlag +hud-skill-axe_spin = Einmal rundherum... +hud-skill-axe_infinite_axe_spin_title = Unendlicher Rundschlag +hud-skill-axe_infinite_axe_spin = Drehe dich solange du Ausdauer hast{ $SP } +hud-skill-axe_spin_damage_title = Schadenrundumschlag +hud-skill-axe_spin_damage = Erhöht den Schaden den jeder Schlag verursacht um { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Axthelikopter +hud-skill-axe_spin_helicopter = Du fällst etwas langsamer während du dich drehst{ $SP } +hud-skill-axe_spin_speed_title = Umfangsgeschwindigkeit +hud-skill-axe_spin_speed = Du drehst dich um { $boost }% schneller{ $SP } +hud-skill-axe_spin_cost_title = Kosten: Rundumschlag +hud-skill-axe_spin_cost = Verringert die Ausdauerkosten um { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Freischalten: Sprung +hud-skill-axe_unlock_leap = Schaltet einen Sprungangriff frei{ $SP } +hud-skill-axe_leap_damage_title = Schaden: Sprungangriff +hud-skill-axe_leap_damage = Erhöht den Schaden des Sprungangriffs um { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Rückstoß: Sprungangriff +hud-skill-axe_leap_knockback = Erhöht den Rückstoß des Sprungangriffs um { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Kosten: Sprungangriff +hud-skill-axe_leap_cost = Verringerst die Ausdauerkosten des Sprungangriffs um { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Reichweite: Sprungangriff +hud-skill-axe_leap_distance = Du springst auf { $boost }% weiter entfernte Gegner{ $SP } +hud-skill-mining_title = Bergbau +hud-skill-pick_strike_title = Spitzhackenschlag +hud-skill-pick_strike = Baue Steine mit deiner Spitzhacke ab, um Erze, seltene Edelsteine und EP zu erhalten +hud-skill-pick_strike_speed_title = Geschwindigkeit des Spitzhackenhiebs +hud-skill-pick_strike_speed = Baue schneller ab{ $SP } +hud-skill-pick_strike_oregain_title = Ausbeute von Erzen +hud-skill-pick_strike_oregain = Erhöht die Chance auf mehr Erze beim Abbauen ({ $boost }% höher pro Level){ $SP } +hud-skill-pick_strike_gemgain_title = Ausbeute von Edelsteinen +hud-skill-pick_strike_gemgain = Erhöht die Chance auf mehr Edelsteine beim Abbauen ({ $boost }% höher pro Level){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/skills.ron b/assets/voxygen/i18n/de_DE/hud/skills.ron deleted file mode 100644 index 6af14f6223..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/skills.ron +++ /dev/null @@ -1,259 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.rank_up": "Neuer Fähigkeitspunkt", - "hud.skill.sp_available": "{number} SP verfügbar", - "hud.skill.not_unlocked": "Noch nicht freigeschaltet", - "hud.skill.req_sp": "\n\nBenötigt {number} SP", - // Skills - // General - "hud.skill.inc_health_title": "Leben erhöhen", - "hud.skill.inc_health": "Erhöht max. Leben um {boost}{SP}", - "hud.skill.inc_energy_title": "Ausdauer", - "hud.skill.inc_energy": "Erhöht die max. Ausdauer um {boost}{SP}", - "hud.skill.unlck_sword_title": "Schwert freischalten", - "hud.skill.unlck_sword": "Schaltet den Schwert-Fähigkeitenbaum frei{SP}", - "hud.skill.unlck_axe_title": "Axt freischalten", - "hud.skill.unlck_axe": "Schaltet den Axt-Fähigkeitenbaum frei{SP}", - "hud.skill.unlck_hammer_title": "Hammer freischalten", - "hud.skill.unlck_hammer": "Schaltet den Hammer-Fähigkeitenbaum frei{SP}", - "hud.skill.unlck_bow_title": "Bogen freischalten", - "hud.skill.unlck_bow": "Schaltet den Bogen-Fähigkeitenbaum frei{SP}", - "hud.skill.unlck_staff_title": "Stab freischalten", - "hud.skill.unlck_staff": "Schaltet den Stab-Fähigkeitenbaum frei{SP}", - "hud.skill.unlck_sceptre_title": "Zepter freischalten", - "hud.skill.unlck_sceptre": "Schaltet den Zepter-Fähigkeitenbaum frei{SP}", - "hud.skill.dodge_title": "Ausweichen", - "hud.skill.dodge": "Weicht Nahkampfattacken aus{SP}", - "hud.skill.roll_energy_title": "Ausdauerkosten beim Rollen", - "hud.skill.roll_energy": "Rollen nutzt {boost}% weniger Ausdauer{SP}", - "hud.skill.roll_speed_title": "Rollgeschwindigkeit", - "hud.skill.roll_speed": "Rolle um {boost}% schneller{SP}", - "hud.skill.roll_dur_title": "Rolldauer", - "hud.skill.roll_dur": "Rolle um {boost}% länger{SP}", - "hud.skill.climbing_title": "Klettern", - "hud.skill.climbing": "Höher springen", - "hud.skill.climbing_cost_title": "Ausdauerkosten Klettern", - "hud.skill.climbing_cost": "Klettern verbraucht {boost}% weniger Ausdauer{SP}", - "hud.skill.climbing_speed_title": "Klettergeschwindigkeit", - "hud.skill.climbing_speed": "Klettere um {boost}% schneller{SP}", - "hud.skill.swim_title": "Schwimmen", - "hud.skill.swim": "Schwimme in Gewässern", - "hud.skill.swim_speed_title": "Schwimmgeschwindigkeit", - "hud.skill.swim_speed": "Schwimme um {boost}% schneller{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Strahl des Lebensraubs", - "hud.skill.sc_lifesteal": "Entziehe deinem Gegner Lebensenergie", - "hud.skill.sc_lifesteal_damage_title": "Schaden", - "hud.skill.sc_lifesteal_damage": "Verursache um {boost}% höheren Schaden{SP}", - "hud.skill.sc_lifesteal_range_title": "Reichweite", - "hud.skill.sc_lifesteal_range": "Der Strahl reicht um {boost}% weiter{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Lebensraub", - "hud.skill.sc_lifesteal_lifesteal": "Wandle weitere {boost}% Schaden in Lebensenergie um{SP}", - "hud.skill.sc_lifesteal_regen_title": "Ausdauerregeneration", - "hud.skill.sc_lifesteal_regen": "Stellt weitere {boost}% deiner Ausdauer wieder her{SP}", - "hud.skill.sc_heal_title": "Strahl der Heilung", - "hud.skill.sc_heal": "Heilt deine Verbündeten mit dem Blut deiner Feinde", - "hud.skill.sc_heal_heal_title": "Heilung", - "hud.skill.sc_heal_heal": "Erhöht die Menge, um die du Verbündete heilst um {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Ausdauerkosten", - "hud.skill.sc_heal_cost": "Heilen benötig {boost}% weniger Ausdauer{SP}", - "hud.skill.sc_heal_duration_title": "Dauer", - "hud.skill.sc_heal_duration": "Die Effekte deiner heilenden Aura dauern {boost}% länger{SP}", - "hud.skill.sc_heal_range_title": "Reichweite", - "hud.skill.sc_heal_range": "Dein Heilstrahl reicht {boost}% weiter{SP}", - "hud.skill.sc_wardaura_unlock_title": "Schutzaura entsperren", - "hud.skill.sc_wardaura_unlock": "Erlaubt es dir deine Verbündeten mit einer schützenden Aura zu umgeben{SP}", - "hud.skill.sc_wardaura_strength_title": "Stärke", - "hud.skill.sc_wardaura_strength": "Die Stärke deiner Aura wird um {boost}% erhöht{SP}", - "hud.skill.sc_wardaura_duration_title": "Dauer", - "hud.skill.sc_wardaura_duration": "Der Effekt deiner Aura hält um {boost}% länger{SP}", - "hud.skill.sc_wardaura_range_title": "Reichweite", - "hud.skill.sc_wardaura_range": "Deine Aura reicht um {boost}% weiter{SP}", - "hud.skill.sc_wardaura_cost_title": "Ausdauerkosten", - "hud.skill.sc_wardaura_cost": "Deine Aura verbraucht {boost}% weniger Energie{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Reichweite der Schockwelle", - "hud.skill.st_shockwave_range" : "Die Reichweite deiner Schockwelle wird um {boost}% erhöht{SP}", - "hud.skill.st_shockwave_cost_title" : "Ausdauerkosten der Schockwelle", - "hud.skill.st_shockwave_cost" : "Vermindert die Ausdauerkosten für die Schockwelle um {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Rückstoß der Schockwelle", - "hud.skill.st_shockwave_knockback" : "Erhöht die Wurfkraft um {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Schaden der Schockwelle", - "hud.skill.st_shockwave_damage" : "Erhöht den verursachten Schaden um {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Schockwelle Freischalten", - "hud.skill.st_shockwave_unlock" : "Verleiht dir die Fähigkeit, deine Gegner mit Feuer von dir weg zu stoßen{SP}", - "hud.skill.st_flamethrower_title" : "Flammenwerfer", - "hud.skill.st_flamethrower" : "Ein flammendes Inferno heizt deinen Feinden ordentlich ein!", - "hud.skill.st_flame_velocity_title" : "Geschwindigkeit der Flammen", - "hud.skill.st_flame_velocity" : "Verkohlt deinen Feinden die Augenbrauen schneller, {boost}% schneller{SP}", - "hud.skill.st_flamethrower_range_title" : "Reichweite des Flammenwerfers", - "hud.skill.st_flamethrower_range" : "Wenn die Flammen einfach nicht weit genug reichen, reichen sie hiermit um {boost}% weiter{SP}", - "hud.skill.st_energy_drain_title" : "Energieverbrauch", - "hud.skill.st_energy_drain" : "Vermindert den Energieverbrauch um {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Schaden des Flammenwerfers", - "hud.skill.st_flamethrower_damage" : "Erhöht den Schaden um {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Explosionsradius", - "hud.skill.st_explosion_radius" : "Größer ist besser, erhöht den Radius der Explosion um {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Ausdauerregeneration", - "hud.skill.st_energy_regen" : "Erhöht den Ausdauergewinn um {boost}%{SP}", - "hud.skill.st_fireball_title" : "Feuerball", - "hud.skill.st_fireball" : "Sende brennende Kugeln in Richtung deiner Feinde", - "hud.skill.st_damage_title" : "Schaden", - "hud.skill.st_damage" : "Erhöht den Schaden um {boost}%{SP}", - "hud.skill.st_explosion_title" : "Explosion", - "hud.skill.st_explosion" : "Wenn Feuer allein nicht genug ist{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Projektilgeschw.", - "hud.skill.bow_projectile_speed" : "Erlaubt es dir deine Pfeile schneller und weiter zu schießen{SP}", - "hud.skill.bow_arrow_count_title" : "Anzahl der Pfeile", - "hud.skill.bow_arrow_count" : "Schieße einen weiteren Pfeil wenn du springst{SP}", - "hud.skill.bow_repeater_cost_title" : "Verstärkerkosten", - "hud.skill.bow_repeater_cost" : "Verringert die Kosten um {boost}%{SP}", - "hud.skill.bow_repeater_glide_title" : "Repeater Glide", - "hud.skill.bow_repeater_glide" : "Glide further while repeating{SP}", - "hud.skill.bow_repeater_damage_title" : "Repeater Damage", - "hud.skill.bow_repeater_damage" : "Increases the damage done by {boost}%{SP}", - "hud.skill.bow_repeater_unlock_title" : "Repeater Unlock", - "hud.skill.bow_repeater_unlock" : "Schaltet die Fähigkeit frei, in die Luft zu springen und ein Salve von Pfeilen abzuschießen{SP}", - "hud.skill.bow_charged_title" : "Aufgeladener Schuss", - "hud.skill.bow_charged" : "Geduld zahlt sich aus", - "hud.skill.bow_charged_knockback_title" : "Rückstoß bei aufgeladenem Schuss", - "hud.skill.bow_charged_knockback" : "Stößt deine Feinde um {boost}% weiter von dir{SP}", - "hud.skill.bow_charged_move_speed_title" : "Bewegungsgeschw. beim Spannen", - "hud.skill.bow_charged_move_speed" : "Erhöht die Bewegungsgeschw. um {boost}% während du den Bogen spannst{SP}", - "hud.skill.bow_charged_speed_title" : "Spanngeschwindigkeit", - "hud.skill.bow_charged_speed" : "Erhöht die Geschwindigkeit mit der du den Bogen spannst um {boost}%{SP}", - "hud.skill.bow_charged_projectile_speed_title" : "Projektilgeschwindigkeit: Aufgeladen", - "hud.skill.bow_charged_projectile_speed" : "Die Projektilgeschw. bei geladenen schüssen wird um weitere {boost}% erhöht{SP}", - "hud.skill.bow_charged_drain_title" : "Ausdauerverlust: Aufladen", - "hud.skill.bow_charged_drain" : "Vermindert den Ausdauerverlust um {boost}%{SP}", - "hud.skill.bow_charged_damage_title" : "Schaden: Aufladen", - "hud.skill.bow_charged_damage" : "Erhöht den Schaden um {boost}%{SP}", - "hud.skill.bow_energy_regen_title" : "Ausdauerregeneration", - "hud.skill.bow_energy_regen" : "Erhöht die Ausdauerregeneration um {boost}%{SP}", - "hud.skill.bow_title" : "Pfeilschuss", - "hud.skill.bow" : "Unendlicher Köcher inklusive, nicht für Kinder geeignet!", - "hud.skill.bow_damage_title" : "Schaden", - "hud.skill.bow_damage" : "Erhöht den Schaden um {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Radius: Zerschmettern", - "hud.skill.hmr_leap_radius" : "Erhöht den Radius, indem du deine Gegner ungespitzt in den Boden rammst um {boost} Meter{SP}", - "hud.skill.hmr_leap_distance_title" : "Sprungreichweite", - "hud.skill.hmr_leap_distance" : "Du kannst dich auf {boost}% weiter entfernte Gegner stürzen{SP}", - "hud.skill.hmr_leap_cost_title" : "Kosten: Zerschmettern", - "hud.skill.hmr_leap_cost" : "Verringert die Ausdauerkosten um {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Rückstoß: Zerschmettern", - "hud.skill.hmr_leap_knockback" : "Zerschmettern stößt deine Gegner um {boost}% weiter{SP}", - "hud.skill.hmr_leap_damage_title" : "Schaden: Zerschmettern", - "hud.skill.hmr_leap_damage" : "Du schlägst um {boost}% stärker auf deine Feinde ein{SP}", - "hud.skill.hmr_unlock_leap_title" : "Zerschmettern freischalten", - "hud.skill.hmr_unlock_leap" : "Du kannst auf deine Gegner zuspringen und sie dem Erdboden gleichmachen{SP}", - "hud.skill.hmr_charged_melee_title" : "Aufgeladener Schlag", - "hud.skill.hmr_charged_melee" : "Schwingt den Prügel aber mit Schmackes", - "hud.skill.hmr_charged_rate_title" : "Schwung: Aufgeladener Schlag", - "hud.skill.hmr_charged_rate" : "Erhöht den Schwung mit dem du zuschlägst um {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Effizienz: Aufgeladener Schlag", - "hud.skill.hmr_charged_melee_nrg_drain" : "Wenn du zum aufgeladenen Schlag ansetzt verbrauchst du {boost}% weniger Energie{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Schaden: Aufgeladener Schlag", - "hud.skill.hmr_charged_melee_damage" : "Erhöht den Schaden des aufgeladenen Schlages um {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Rückstoß: Aufgeladener Schlag", - "hud.skill.hmr_charged_melee_knockback" : "Erhöht den Rückstoß deines aufgeladenen Schlages um stattliche {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Einfacher Schlag", - "hud.skill.hmr_single_strike" : "Weil einfach einfach einfach ist!", - "hud.skill.hmr_single_strike_regen_title" : "Regeneration: Einfacher Schlag", - "hud.skill.hmr_single_strike_regen" : "Erhöht den Ausdauergewinn mit jedem Treffer{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Angriffsgeschw.: Einfacher Schlag", - "hud.skill.hmr_single_strike_speed" : "Erhöht die Angriffsgeschw. mit jedem Treffer{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Schaden: Einfacher Schlag", - "hud.skill.hmr_single_strike_damage" : "Erhöht den Schaden mit jedem Treffer{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Rückstoß: Einfacher Schlag", - "hud.skill.hmr_single_strike_knockback" : "Erhöht die Rückstoßkraft um {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Dreifachschlag", - "hud.skill.sw_trip_str": "Eine Dreifach-Kombi Attacke", - "hud.skill.sw_trip_str_combo_title": "Dreifach-Kombi", - "hud.skill.sw_trip_str_combo": "Schalte Kombo-Skalierung bei Dreifach-Kombi frei{SP}", - "hud.skill.sw_trip_str_dmg_title": "Schaden: Dreifach-Kombi", - "hud.skill.sw_trip_str_dmg": "Erhöht den Schaden, den jeder aufeinanderfolgende Treffer verursacht{SP}", - "hud.skill.sw_trip_str_sp_title": "Geschw.:Dreifachschlag", - "hud.skill.sw_trip_str_sp": "Erhöht die Angriffsgeschw. mit jedem aufeinanderfolgenden Treffer{SP}", - "hud.skill.sw_trip_str_reg_title": "Ausdauerregeneration: Dreifachschlag", - "hud.skill.sw_trip_str_reg": "Erhöht Ausdauerregeneration mit jedem aufeinanderfolgenden Treffer{SP}", - "hud.skill.sw_dash_title": "Stürmen", - "hud.skill.sw_dash": "Stürme durch deine Gegner, wie ein heißes Messer durch Butter", - "hud.skill.sw_dash_dmg_title": "Schaden: Stürmen", - "hud.skill.sw_dash_dmg": "Erhöht den Initialschaden bei Stürmen um {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Ausdauerverlust: Stürmen", - "hud.skill.sw_dash_drain": "Verringert den Ausdauerverlust beim Stürmen um {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Initialkosten: Stürmen", - "hud.skill.sw_dash_cost": "Verringert die Initialkosten beim Stürmen um {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Geschw.: Stürmen", - "hud.skill.sw_dash_speed": "Du stürmst um {boost}% schneller auf deine Gegner zu{SP}", - "hud.skill.sw_dash_inf_title": "Unendlich Stürmen", - "hud.skill.sw_dash_inf": "Du stürmst solange, bis dir die Puste ausgeht{SP}", - "hud.skill.sw_dash_scale_title": "Skalierter Schaden: Stürmen", - "hud.skill.sw_dash_scale": "Erhöht die Skalierung des Schadens beim Stürmen um {boost}%{SP}", - "hud.skill.sw_spin_title": "Rundschlag", - "hud.skill.sw_spin": "Schaltet den Runschlag frei{SP}", - "hud.skill.sw_spin_dmg_title": "Triff alle Gegner, die dich umgeben", - "hud.skill.sw_spin_dmg": "Erhöht den Schaden um {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Geschw.: Rundschlag", - "hud.skill.sw_spin_spd": "Erhöht die Geschw. mit der du dich drehst um {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Kosten: Rundschlag", - "hud.skill.sw_spin_cost": "Verringert die Ausdauerkosten des Rundschlags um {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Anzahl: Rundschlag", - "hud.skill.sw_spin_spins": "Du kannst dich öfter drehen bevor dir schwindelig wird{SP}", - "hud.skill.sw_interrupt_title": "Attacke abbrechen", - "hud.skill.sw_interrupt": "Erlaubt es dir jede Attacke sofort abzubrechen und eine andere auszuführen{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Doppelschlag", - "hud.skill.axe_double_strike": "Mache sie einen Kopf kürzer", - "hud.skill.axe_double_strike_combo_title": "Doppelschlag Kombo", - "hud.skill.axe_double_strike_combo": "Schaltet einen zweiten Angriff frei{SP}", - "hud.skill.axe_double_strike_damage_title": "Schaden: Doppelschlag", - "hud.skill.axe_double_strike_damage": "Erhöht den Schaden, den jeder aufeinanderfolgende Treffer verursacht{SP}", - "hud.skill.axe_double_strike_speed_title": "Double Strike Speed", - "hud.skill.axe_double_strike_speed": "Erhöht die Angriffsgeschw. mit jedem aufeinanderfolgenden Treffer{SP}", - "hud.skill.axe_double_strike_regen_title": "Double Strike Regen", - "hud.skill.axe_double_strike_regen": "Erhöht Ausdauerregeneration mit jedem aufeinanderfolgenden Treffer{SP}", - "hud.skill.axe_spin_title": "Axtrundschlag", - "hud.skill.axe_spin": "Einmal rundherum...", - "hud.skill.axe_infinite_axe_spin_title": "Unendlicher Rundschlag", - "hud.skill.axe_infinite_axe_spin": "Drehe dich solange du Ausdauer hast{SP}", - "hud.skill.axe_spin_damage_title": "Schadenrundumschlag", - "hud.skill.axe_spin_damage": "Erhöht den Schaden den jeder Schlag verursacht um {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Axthelikopter", - "hud.skill.axe_spin_helicopter": "Du fällst etwas langsamer während du dich drehst{SP}", - "hud.skill.axe_spin_speed_title": "Umfangsgeschwindigkeit", - "hud.skill.axe_spin_speed": "Du drehst dich um {boost}% schneller{SP}", - "hud.skill.axe_spin_cost_title": "Kosten: Rundumschlag", - "hud.skill.axe_spin_cost": "Verringert die Ausdauerkosten um {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Freischalten: Sprung", - "hud.skill.axe_unlock_leap": "Schaltet einen Sprungangriff frei{SP}", - "hud.skill.axe_leap_damage_title": "Schaden: Sprungangriff", - "hud.skill.axe_leap_damage": "Erhöht den Schaden des Sprungangriffs um {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Rückstoß: Sprungangriff", - "hud.skill.axe_leap_knockback": "Erhöht den Rückstoß des Sprungangriffs um {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Kosten: Sprungangriff", - "hud.skill.axe_leap_cost": "Verringerst die Ausdauerkosten des Sprungangriffs um {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Reichweite: Sprungangriff", - "hud.skill.axe_leap_distance": "Du springst auf {boost}% weiter entfernte Gegner{SP}", - // Mining - "hud.skill.mining_title": "Bergbau", - "hud.skill.pick_strike_title": "Spitzhackenschlag", - "hud.skill.pick_strike": "Baue Steine mit deiner Spitzhacke ab, um Erze, seltene Edelsteine und EP zu erhalten", - "hud.skill.pick_strike_speed_title": "Geschwindigkeit des Spitzhackenhiebs", - "hud.skill.pick_strike_speed": "Baue schneller ab{SP}", - "hud.skill.pick_strike_oregain_title": "Ausbeute von Erzen", - "hud.skill.pick_strike_oregain": "Erhöht die Chance auf mehr Erze beim Abbauen ({boost}% höher pro Level){SP}", - "hud.skill.pick_strike_gemgain_title": "Ausbeute von Edelsteinen", - "hud.skill.pick_strike_gemgain": "Erhöht die Chance auf mehr Edelsteine beim Abbauen ({boost}% höher pro Level){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/de_DE/hud/social.ftl b/assets/voxygen/i18n/de_DE/hud/social.ftl new file mode 100644 index 0000000000..f555c51a24 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Andere Spieler +hud-social-online = Online: +hud-social-friends = Freunde +hud-social-not_yet_available = Noch nicht verfügbar +hud-social-faction = Fraktion +hud-social-play_online_fmt = { $nb_player } Spieler online +hud-social-name = Name +hud-social-level = Level +hud-social-zone = Zone +hud-social-account = Account \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/social.ron b/assets/voxygen/i18n/de_DE/hud/social.ron deleted file mode 100644 index 17c6175d9d..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "hud.social": "Andere Spieler", - "hud.social.online": "Online:", - "hud.social.friends": "Freunde", - "hud.social.not_yet_available": "Noch nicht verfügbar", - "hud.social.faction": "Fraktion", - "hud.social.play_online_fmt": "{nb_player} Spieler online", - "hud.social.name": "Name", - "hud.social.level": "Level", - "hud.social.zone": "Zone", - "hud.social.account": "Account", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/de_DE/hud/trade.ftl b/assets/voxygen/i18n/de_DE/hud/trade.ftl new file mode 100644 index 0000000000..11ac03fa77 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/hud/trade.ftl @@ -0,0 +1,25 @@ +hud-trade-trade_window = Handelsfenster +hud-trade-phase1_description = + Ziehe die Items, die du handeln möchtest, + in das dafür vorgesehene Feld. +hud-trade-phase2_description = + Der Handel ist jetzt gesperrt, damit du + Zeit hast noch einmal drüber zu schauen. +hud-trade-phase3_description = Handel wird bearbeitet. +hud-trade-persons_offer = { $playername }'s Angebot +hud-trade-has_accepted = + { $playername } + hat akzeptiert +hud-trade-accept = Akzeptieren +hud-trade-decline = Ablehnen +hud-trade-invite_sent = Handelsanfrage an { $playername } gesendet. +hud-trade-result-completed = Handel erfolgreich abgeschlossen. +hud-trade-result-declined = Handel abgelehnt. +hud-trade-result-nospace = Nicht genügend Platz, um den Handel abzuschließen. +hud-trade-buy_price = Kaufpreis +hud-trade-sell_price = Verkaufspreis +hud-trade-coin = Coin(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Dein Angebot +hud-trade-their_offer = Deren Angebot \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/hud/trade.ron b/assets/voxygen/i18n/de_DE/hud/trade.ron deleted file mode 100644 index 53f8baba4a..0000000000 --- a/assets/voxygen/i18n/de_DE/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - "hud.trade.trade_window": "Handelsfenster", - "hud.trade.phase1_description": "Ziehe die Items, die du handeln möchtest,\n in das dafür vorgesehene Feld.", - "hud.trade.phase2_description": "Der Handel ist jetzt gesperrt, damit du\n Zeit hast noch einmal drüber zu schauen.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Handel wird bearbeitet.", - "hud.trade.persons_offer": "{playername}'s Angebot", - "hud.trade.has_accepted": "{playername}\n hat akzeptiert", - "hud.trade.accept": "Akzeptieren", - "hud.trade.decline": "Ablehnen", - "hud.trade.invite_sent": "Handelsanfrage an {playername} gesendet.", - "hud.trade.result.completed": "Handel erfolgreich abgeschlossen.", - "hud.trade.result.declined": "Handel abgelehnt.", - "hud.trade.result.nospace": "Nicht genügend Platz, um den Handel abzuschließen.", - "hud.trade.buy_price": "Kaufpreis", - "hud.trade.sell_price": "Verkaufspreis", - "hud.trade.coin": "Coin(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Dein Angebot", - "hud.trade.their_offer": "Deren Angebot", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/de_DE/main.ftl b/assets/voxygen/i18n/de_DE/main.ftl new file mode 100644 index 0000000000..7c6fafb193 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/main.ftl @@ -0,0 +1,89 @@ +main-username = Benutzername +main-server = Server +main-password = Passwort +main-connecting = Verbinden +main-creating_world = Welt wird generiert +main-tip = Tipp: +main-notice = + Wilkommen in der Alpha-Version von Veloren! + + Bevor du dich ins Abenteuer stürzt, behalte bitte einige Dinge im Hinterkopf: + + - Dies ist eine frühe Alpha. Du wirst auf Bugs, unfertiges Gameplay und Mechaniken, sowie fehlende Features stoßen. + + - Für konstruktives Feedback und Bug-Reports kannst du uns via Reddit, Gitlab oder über unseren Discord-Server kontaktieren. + + - Veloren hat die GPL 3 Open-Source Lizenz. Das heißt du kannst es kostenlos spielen, + aber auch modifizieren (solange die Modifikation auch die selbe Lizenz trägt) und das Spiel an andere weiterschicken. + + - Veloren ist ein Non-Profit Community Projekt und jeder Mitarbeiter entwickelt es als Hobby in seiner Freizeit. + + Wenn dir die Idee gefällt, dann schließe dich doch einfach unserem Dev- oder Art-Team an! + + Danke, dass du dir die Zeit genommen hast diese Zeilen zu lesen und wir hoffen, dass dir Veloren gefällt! + + ~ Die Entwickler*innen +main-login_process = + Informationen zum Login: + + Bitte beachte, dass du einen Account benötigst, + um auf Servern mit Authentifizierung zu spielen. + + Du kannst deinen Account auf folgender Webseite erstellen: + + https://veloren.net/account/. +main-login-server_not_found = Server nicht gefunden +main-login-authentication_error = Authentifizierung fehlgeschlagen +main-login-internal_error = Interner Fehler beim Client (wahrscheinlich wurde der Charakter gelöscht) +main-login-failed_auth_server_url_invalid = Verbindung zum Authentifikationsserver fehlgeschlagen +main-login-insecure_auth_scheme = Das HTTP Protokoll wird nicht unterstützt. Es ist unsicher! Für Entwicklungszwecke kann HTTP für 'localhost'- und debug-builds genutzt werden +main-login-server_full = Server ist voll +main-login-untrusted_auth_server = Auth. Server wird nicht vertraut +main-login-outdated_client_or_server = Client- oder Serverversion ist veraltet +main-login-timeout = Zeitüberschreitung: Der Server hat nicht rechtzeitig geantwortet. (Überlastung oder Netzwerkprobleme). +main-login-server_shut_down = Server wurde heruntergefahren +main-login-network_error = Netzwerkfehler +main-login-network_wrong_version = Der Server läuft auf einer anderen Version als du. Überprüfe deine Version und suche nach Updates. +main-login-failed_sending_request = Authentifizierung fehlgeschlagen +main-login-invalid_character = Ungültiger Charakter +main-login-client_crashed = Client abgestürzt +main-login-not_on_whitelist = Du benötigst einen Whitelist Eintrag durch den Server-Administrator +main-login-banned = Du wurdest aus folgendem Grund gebannt: +main-login-kicked = Du wurdest aus folgendem Grund gekickt: +main-login-select_language = Wähle eine Sprache. +main-login-client_version = Client-Version. +main-login-server_version = Server-Version. +main-login-client_init_failed = Client konnte nicht initialisiert werden: { $init_fail_reason }. +main-login-username_bad_characters = Benutzername enthält nicht erlaubte Zeichen! (Erlaubt sind: alphanumerische Zeichen, '_' und '-'). +main-login-username_too_long = Benutzername zu lang! Beschränke dich auf { $max_len } Zeichen! +main-servers-singleplayer_error = Verbindung zum internen Server fehlgeschlagen: { $sp_error } +main-servers-network_error = Server-netzwerk/-socket Fehler: { $raw_error } +main-servers-participant_error = Verbindungsabbruch bzw. Protokollfehler eines Teilnehmers: { $raw_error } +main-servers-stream_error = Client-Verbindungs-/-Komprimierungs-/-(De-)Serialisierungsfehler: { $raw_error } +main-servers-database_error = Serverdatenbankfehler: { $raw_error } +main-servers-persistence_error = Server-Persistenzfehler (vermutlich im Zusammenhang mit Asset-/Charakterdaten): { $raw_error } +main-servers-other_error = Genereller Serverfehler: { $raw_error } +main-servers-select_server = Wähle einen Server +loading-tips = + .a0 = Mit '{ $gameinput-togglelantern }' aktivierst du deine Laterne. + .a1 = Mit '{ $gameinput-help }' kannst du die Standard-Tastenbelegung einsehen. + .a2 = Mit /say oder /s kannst du mit Spielern in deiner unmittelbaren Umgebung chatten. + .a3 = Mit /region oder /r kannst du mit Spielern chatten, die sich ein paar hundert Meter um dich herum befinden. + .a4 = Als Admin kannst du mit /build den Baumodus nutzen. + .a5 = Mit /group oder /g können deine Nachrichten nur von Mitgliedern deiner Gruppe gelesen werden. + .a6 = Um private Nachrichten zu verschicken, nutze /tell gefolgt von Spielername und deiner Nachricht + .a7 = Halte Ausschau nach Essen, Kisten oder anderen Schätzen überall auf der Welt! + .a8 = Deine Taschen sind voll mit Essen? Versuche besseres Essen damit herzustellen! + .a9 = Du weißt nicht was du tun sollst? Versuche dich doch mal an den Katakomben, die auf der Karte eingezeichnet sind! + .a10 = Vergiss nicht die Grafikeinstellungen an deine Hardware anzupassen. Mit '{ $gameinput-settings }' öffnest du die Grafikeinstellungen. + .a11 = Mit Anderen zusammen zu spielen macht noch viel mehr Spaß! Mit '{ $gameinput-social }' kannst du sehen, wer gerade online ist. + .a12 = Mit '{ $gameinput-dance }' kannst du das Tanzbein schwingen. Party! + .a13 = Mit '{ $gameinput-glide }' kannst du den Gleiter öffnen und hohe Lüfte erobern. + .a14 = Veloren ist immernoch in der Pre-Alpha. Wir tun unser Bestes, um es jeden Tag ein Stück besser zu machen! + .a15 = Du möchtest aktiv an der Entwicklung mitwirken oder einfach nur chatten? Dann komm auf unseren Discord-Server. + .a16 = Die Art, wie dir deine Lebensenergie angezeigt wird, kannst du in den Einstellungen ändern. + .a17 = Setze dich neben ein Lagerfeuer (drücke dafür '{ $gameinput-sit }') um dich langsam von deinen Verletzungen zu erholen. + .a18 = Du brauchst einen größeren Beutel oder bessere Rüstung? Dann drücke '{ $gameinput-crafting }', um das Crafting-Menü zu öffnen! + .a19 = Du weißt nicht, was du mit einem gewissen Gegenstand anfangen sollst? Suche 'input:' im Crafting-Menü! + .a20 = Unterstütze doch die Spielentwicklung und helfe mit! Egal ob Übersetzen, Programmieren oder das Entwickeln neuer Ideen - alles hilft! + .a21 = Du siehst etwas Besonderes? Mach doch einen Screenshot! ({ $gameinput-screenshot }) \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/main.ron b/assets/voxygen/i18n/de_DE/main.ron deleted file mode 100644 index 341d6d2218..0000000000 --- a/assets/voxygen/i18n/de_DE/main.ron +++ /dev/null @@ -1,106 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for German (Germany) -( - string_map: { - /// Start Main screen section - "main.username": "Benutzername", - "main.server": "Server", - "main.password": "Passwort", - "main.connecting": "Verbinden", - "main.creating_world": "Welt wird generiert", - "main.tip": "Tipp:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Wilkommen in der Alpha-Version von Veloren! - -Bevor du dich ins Abenteuer stürzt, behalte bitte einige Dinge im Hinterkopf: - -- Dies ist eine frühe Alpha. Du wirst auf Bugs, unfertiges Gameplay und Mechaniken, sowie fehlende Features stoßen. - -- Für konstruktives Feedback und Bug-Reports kannst du uns via Reddit, Gitlab oder über unseren Discord-Server kontaktieren. - -- Veloren hat die GPL 3 Open-Source Lizenz. Das heißt du kannst es kostenlos spielen, -aber auch modifizieren (solange die Modifikation auch die selbe Lizenz trägt) und das Spiel an andere weiterschicken. - -- Veloren ist ein Non-Profit Community Projekt und jeder Mitarbeiter entwickelt es als Hobby in seiner Freizeit. - -Wenn dir die Idee gefällt, dann schließe dich doch einfach unserem Dev- oder Art-Team an! - -Danke, dass du dir die Zeit genommen hast diese Zeilen zu lesen und wir hoffen, dass dir Veloren gefällt! - -~ Die Entwickler*innen"#, - - // Login process description - "main.login_process": r#"Informationen zum Login: - -Bitte beachte, dass du einen Account benötigst, -um auf Servern mit Authentifizierung zu spielen. - -Du kannst deinen Account auf folgender Webseite erstellen: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Server nicht gefunden", - "main.login.authentication_error": "Authentifizierung fehlgeschlagen", - "main.login.internal_error": "Interner Fehler beim Client (wahrscheinlich wurde der Charakter gelöscht)", - "main.login.failed_auth_server_url_invalid": "Verbindung zum Authentifikationsserver fehlgeschlagen", - "main.login.insecure_auth_scheme": "Das HTTP Protokoll wird nicht unterstützt. Es ist unsicher! Für Entwicklungszwecke kann HTTP für 'localhost'- und debug-builds genutzt werden", - "main.login.server_full": "Server ist voll", - "main.login.untrusted_auth_server": "Auth. Server wird nicht vertraut", - "main.login.outdated_client_or_server": "Client- oder Serverversion ist veraltet ", - "main.login.timeout": "Zeitüberschreitung: Der Server hat nicht rechtzeitig geantwortet. (Überlastung oder Netzwerkprobleme).", - "main.login.server_shut_down": "Server wurde heruntergefahren", - "main.login.network_error": "Netzwerkfehler", - "main.login.network_wrong_version": "Der Server läuft auf einer anderen Version als du. Überprüfe deine Version und suche nach Updates.", - "main.login.failed_sending_request": "Authentifizierung fehlgeschlagen", - "main.login.invalid_character": "Ungültiger Charakter", - "main.login.client_crashed": "Client abgestürzt", - "main.login.not_on_whitelist": "Du benötigst einen Whitelist Eintrag durch den Server-Administrator", - "main.login.banned": "Du wurdest aus folgendem Grund gebannt:", - "main.login.kicked": "Du wurdest aus folgendem Grund gekickt:", - "main.login.select_language": "Wähle eine Sprache.", - "main.login.client_version": "Client-Version.", - "main.login.server_version": "Server-Version.", - "main.login.client_init_failed": "Client konnte nicht initialisiert werden: {init_fail_reason}.", - "main.login.username_bad_characters": "Benutzername enthält nicht erlaubte Zeichen! (Erlaubt sind: alphanumerische Zeichen, '_' und '-').", - "main.login.username_too_long": "Benutzername zu lang! Beschränke dich auf {max_len} Zeichen!", - "main.servers.singleplayer_error": "Verbindung zum internen Server fehlgeschlagen: {sp_error}", - "main.servers.network_error": "Server-netzwerk/-socket Fehler: {raw_error}", - "main.servers.participant_error": "Verbindungsabbruch bzw. Protokollfehler eines Teilnehmers: {raw_error}", - "main.servers.stream_error": "Client-Verbindungs-/-Komprimierungs-/-(De-)Serialisierungsfehler: {raw_error}", - "main.servers.database_error": "Serverdatenbankfehler: {raw_error}", - "main.servers.persistence_error": "Server-Persistenzfehler (vermutlich im Zusammenhang mit Asset-/Charakterdaten): {raw_error}", - "main.servers.other_error": "Genereller Serverfehler: {raw_error}", - - "main.servers.select_server": "Wähle einen Server", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Mit '{gameinput.togglelantern}' aktivierst du deine Laterne.", - "Mit '{gameinput.help}' kannst du die Standard-Tastenbelegung einsehen.", - "Mit /say oder /s kannst du mit Spielern in deiner unmittelbaren Umgebung chatten.", - "Mit /region oder /r kannst du mit Spielern chatten, die sich ein paar hundert Meter um dich herum befinden.", - "Als Admin kannst du mit /build den Baumodus nutzen.", - "Mit /group oder /g können deine Nachrichten nur von Mitgliedern deiner Gruppe gelesen werden.", - "Um private Nachrichten zu verschicken, nutze /tell gefolgt von Spielername und deiner Nachricht", - "Halte Ausschau nach Essen, Kisten oder anderen Schätzen überall auf der Welt!", - "Deine Taschen sind voll mit Essen? Versuche besseres Essen damit herzustellen!", - "Du weißt nicht was du tun sollst? Versuche dich doch mal an den Katakomben, die auf der Karte eingezeichnet sind!", - "Vergiss nicht die Grafikeinstellungen an deine Hardware anzupassen. Mit '{gameinput.settings}' öffnest du die Grafikeinstellungen.", - "Mit Anderen zusammen zu spielen macht noch viel mehr Spaß! Mit '{gameinput.social}' kannst du sehen, wer gerade online ist.", - "Mit '{gameinput.dance}' kannst du das Tanzbein schwingen. Party!", - "Mit '{gameinput.glide}' kannst du den Gleiter öffnen und hohe Lüfte erobern.", - "Veloren ist immernoch in der Pre-Alpha. Wir tun unser Bestes, um es jeden Tag ein Stück besser zu machen!", - "Du möchtest aktiv an der Entwicklung mitwirken oder einfach nur chatten? Dann komm auf unseren Discord-Server.", - "Die Art, wie dir deine Lebensenergie angezeigt wird, kannst du in den Einstellungen ändern.", - "Setze dich neben ein Lagerfeuer (drücke dafür '{gameinput.sit}') um dich langsam von deinen Verletzungen zu erholen.", - "Du brauchst einen größeren Beutel oder bessere Rüstung? Dann drücke '{gameinput.crafting}', um das Crafting-Menü zu öffnen!", - "Du weißt nicht, was du mit einem gewissen Gegenstand anfangen sollst? Suche 'input:' im Crafting-Menü!", - "Unterstütze doch die Spielentwicklung und helfe mit! Egal ob Übersetzen, Programmieren oder das Entwickeln neuer Ideen - alles hilft!", - "Du siehst etwas Besonderes? Mach doch einen Screenshot! ({gameinput.screenshot})" - ], - } -) diff --git a/assets/voxygen/i18n/de_DE/npc.ftl b/assets/voxygen/i18n/de_DE/npc.ftl new file mode 100644 index 0000000000..9b5c48d292 --- /dev/null +++ b/assets/voxygen/i18n/de_DE/npc.ftl @@ -0,0 +1,177 @@ +npc-speech-villager = + .a0 = Ist das nicht ein wunderbarer Tag? + .a1 = Wie geht's dir heute? + .a2 = Einen schönen guten Morgen wünsche ich dir! + .a3 = Ich frage mich, was der Catoblepas denkt, wenn er Gras isst. + .a4 = Was hälst du vom Wetter? + .a5 = Wenn ich an die Katakomben denke, bekomme ich Angst. Ich hoffe jemand befreit sie vom Unheil. + .a6 = Ich würde gerne in eine der Höhlen gehen, wenn ich größer und stärker bin. + .a7 = Hast du meine Katze gesehen? + .a8 = Hast du schonmal etwas von den gefährlichen Landhaien gehört? Ich habe gehört sie leben in der Wüste. + .a9 = Man sagt, es gebe Juwelen aller Art in den Höhlen der Gegend. + .a10 = Ich bin einfach verrückt nach Käse! + .a11 = Möchtest du nicht rein kommen? Bei uns gibt es gleich himmlischen Käse! + .a12 = Man sagt Pilze seien gut für die Gesundheit. Ich selber habe noch nie welche gegessen. + .a13 = Vergiss dein Feuerwerk nicht! + .a14 = Ich liebe Zwergenkäse einfach. Ich wünschte, ich könnte selber welchen herstellen. + .a15 = Ich frage mich, was sich auf der anderen Seite der Berge verbirgt. + .a16 = Ich wünschte, ich könnte mir eines Tages meinen eigenen Gleiter bauen. + .a17 = Möchtest du dir mal meinen Garten ansehen? Okay, vielleicht beim nächsten Mal. + .a18 = Ein perfekter Tag, um in den Wald zu gehen! + .a19 = Sein oder nicht sein? Ich glaube ich werde Landwirt. + .a20 = Findest du nicht auch, dass unser Dorf das schönste ist? + .a21 = Was glaubst du, was glühende Überreste zum Glühen bringt? + .a22 = Ich glaube es ist an der Zeit für ein zweites Frühstück! + .a23 = Hast du jemals ein Glühwürmchen gefangen? + .a24 = Ich verstehe einfach nicht wo die ganzen Sauroks herkommen. + .a25 = Ich wünschte, jemand könnte die ganzen Wölfe vom Dorf fernhalten. + .a26 = Ich hatte letzte Nacht einen wunderbaren Traum über Käse. Was könnte das bedeuten? + .a27 = Ich habe meinem Bruder ein wenig Käse dagelassen. Nun weiß ich nicht, ob er ihn schon aß oder nicht. Ich nenne es Schrödingers Käse. + .a28 = Ich habe meiner Schwester ein wenig Käse dagelassen. Nun weiß ich nicht, ob sie ihn schon aß oder nicht. Ich nenne es Schrödingers Käse. + .a29 = Jemand sollte etwas gegen diese Kultisten unternehmen. Vorzugsweise nicht ich. + .a30 = Ich hoffe es regnet bald wieder. Der Ernte würde es gut tun. + .a31 = Ich liebe Honig! Und hasse Bienen. + .a32 = Eines Tages möchte ich die Welt bereisen. Es muss doch mehr im Leben geben als dieses Dorf. +npc-speech-villager_decline_trade = + .a0 = Tut mir leid, ich habe nichts, was ich mit dir handeln könnte. + .a1 = Du möchtest handeln? Als ob ich etwas hätte, das dich interessieren könnte. + .a2 = Mein Haus gehört mir, ich würde es für nichts auf der Welt hergeben. +npc-speech-merchant_advertisement = + .a0 = Darf ich dir einen Handel vorschlagen? + .a1 = Möchtest du mit mir handeln? + .a2 = Ich habe viele Waren. Möchtest du sie dir mal ansehen? +npc-speech-merchant_busy = + .a0 = Hey, warte bis du an der Reihe bist. + .a1 = Einen Moment bitte, ich kann mich nicht zerteilen. + .a2 = Siehst du nicht, dass jemand vor dir steht? + .a3 = Einen Moment bitte, ich bin gleich bei dir. + .a4 = Nicht vordrängeln bitte. + .a5 = Ich bin gerade beschäftigt, komm doch später wieder. +npc-speech-merchant_trade_successful = + .a0 = Vielen Dank für das Geschäft! + .a1 = Vielen Dank! +npc-speech-merchant_trade_declined = + .a0 = Vielleicht beim nächsten Mal, einen schönen Tag noch! + .a1 = Zu schade, vielleicht beim nächsten mal, bis dann! +npc-speech-villager_cultist_alarm = + .a0 = Achtung! Ein Kultist schleicht hier herum! + .a1 = Zu den Waffen! Die Kultisten attackieren uns! + .a2 = Wie können die Kultisten es wagen, unser Dorf zu attackieren! + .a3 = Tod den Kultisten! + .a4 = Kultisten werden hier nicht toleriert! + .a5 = Mörderischer Kultist! + .a6 = Eine Kostprobe meines Schwertes gefällig? Du reudiger Kultist! + .a7 = Nichts kann das Blut von deinen Händen waschen, Kultist! + .a8 = Ja brat' mir doch einer 'nen Storch! Ein Kultist weilt unter uns! + .a9 = Die Schreckensherrschaft der Kultisten wird bald vorrüber sein! + .a10 = Der Kultist gehört mir! + .a11 = Bereite dich darauf vor deinem Schöpfer gegenüberzutreten, du mieser Kultist! + .a12 = Ich sehe einen Kultisten! Ergreift ihn! + .a13 = Ich sehe einen Kultisten! + .a14 = Ich sehe einen Kultisten! Lasst ihn nicht entkommen! + .a15 = Ist der ehrenwerte Kultist an ein wenig TOD interessiert?! + .a16 = Wir vergeben nicht! Wir vergessen nicht! Kultist, büße! + .a17 = Stirb, Kultist! + .a18 = Deine Schreckensherrschaft wird enden! + .a19 = Nimm das! Für alles, was du getan hast! + .a20 = Wir wollen Abschaum wie euch hier nicht! + .a21 = Du hättest unter der Erde bleiben sollen! Da wo du hingehörst! +npc-speech-villager_under_attack = + .a0 = Hilfe, ich werde angegriffen! + .a1 = Hilfe, ich werde angegriffen! + .a2 = Autsch! ich werde angegriffen! + .a3 = Autsch! ich werde angegriffen! Hilfe! + .a4 = Helft mir! Ich werde angegriffen! + .a5 = Ich werde angegriffen! Hilfe! + .a6 = Ich werde angegriffen! Helft mir! + .a7 = Hilfe! + .a8 = Hilfe! Hilfe! + .a9 = Hilfe! Hilfe! Hilfe! + .a10 = Ich werde angegriffen! + .a11 = AAAHHH! Ich werde angegriffen! + .a12 = AAAHHH! Ich werde angegriffen! So helft mir doch! + .a13 = Hilfe! Wir werden angegriffen! + .a14 = Hilfe! Mörder! + .a15 = Hilfe! Ein Mörder läuft frei herum! + .a16 = Hilfe! Man versucht, mich zu töten! + .a17 = Wachen, ich werde angegriffen! + .a18 = Wachen! Ich werde angegriffen! + .a19 = Ich werde angegriffen! Wachen! + .a20 = Hilfe! Wachen! Ich werde angegriffen! + .a21 = Wachen! Kommt schnell! + .a22 = Wachen! Wachen! + .a23 = Wachen! Ein Schurke attackiert mich! + .a24 = Wachen, erschlagt diesen üblen Schurken! + .a25 = Wachen! Ein Mörder! + .a26 = Wachen! Helft mir! + .a27 = Damit wirst du nicht davonkommen! Wachen! + .a28 = Du Unmensch! + .a29 = Helft mir! + .a30 = Helft mir! Bitte! + .a31 = Autsch! Wachen! Hilfe! + .a32 = Sie kommen, um mich zu holen! + .a33 = Hilfe! Hilfe! Ich werde angefeindet! + .a34 = Ah, jetzt sehen wir die Gewalt, die dem System innewohnt. + .a35 = Ach nur'n Kratzer! + .a36 = Hört auf! + .a37 = Was habe ich euch angetan?! + .a38 = Bitte, hört auf mich anzugreifen! + .a39 = Hey! Pass auf wo du mit dem Ding hinziehlst! + .a40 = Abscheulicher Schuft, hinfort mit dir! + .a41 = Halt! Verzieh dich! + .a42 = Du bringst mich noch zur Weißglut! + .a43 = Oi! Was denkst du wer du bist?! + .a44 = Dafür reiße ich dir den Kopf ab! + .a45 = Stop, bitte! Ich habe nichts wertvolles bei mir! + .a46 = Ich setze meinen Bruder auf dich an, er ist größer als ich! + .a47 = Neiiiin, das erzähle ich meiner Mutter! + .a48 = Verflucht seist du! + .a49 = Bitte, tu's nicht. + .a50 = Das war nicht sehr nett von dir! + .a51 = Deine Waffe erfüllt ihren Zweck, du kannst sie jetzt wegstecken! + .a52 = Verschone mich! + .a53 = Bitte, ich habe Familie! + .a54 = Ich bin zu jung zum sterben! + .a55 = Können wir darüber reden? + .a56 = Gewalt ist keine Lösung! + .a57 = Der heutige Tag entwickelt sich zu einem sehr schlechten Tag... + .a58 = Hey, das tat weh! + .a59 = AAAAHHH! + .a60 = Wie rüpelhaft! + .a61 = Stop, ich flehe dich an! + .a62 = Ein Fluch soll dich heimsuchen! + .a63 = Das ist nicht lustig. + .a64 = Wie könnt Ihr es wagen?! + .a65 = Dafür wirst du bezahlen! + .a66 = Mach weiter so und es wird dir leid tun! + .a67 = Zwing mich nicht, dir weh zu tun! + .a68 = Das muss ein Missverständnis sein! + .a69 = Du musst das nicht tun! + .a70 = Fort mit dir, Schurke! + .a71 = Das hat echt wehgetan! + .a72 = Warum tust du das? + .a73 = Bei den Göttern, hört auf! + .a74 = Du musst mich mit jemand anderem verwechseln! + .a75 = Ich verdiene das nicht! + .a76 = Bitte, tu das nicht nochmal. + .a77 = Wachen, in den Kerker mit diesem Schuft! + .a78 = Ich werde meinen Tarasque auf dich hetzen! + .a79 = Warum iiiich? +npc-speech-villager_enemy_killed = + .a0 = Ich habe den Feind vernichtet! + .a1 = Endlich Frieden! + .a2 = ... also, wo war ich stehengeblieben? +npc-speech-menacing = + .a0 = Ich warne dich! + .a1 = Komm nicht näher oder ich greife an! + .a2 = Du jagst mir keine Angst ein! + .a3 = Verschwinde von hier! + .a4 = Hau bloß ab wenn du überleben willst! + .a5 = Deine Art ist hier nicht willkommen! +npc-speech-cultist_low_health_fleeing = + .a0 = Rückzug für die gute Sache! + .a1 = Rückzug! + .a2 = Verflucht seist du! + .a3 = Mein Geist wird dich verfolgen! + .a4 = Ich muss ruhen. + .a5 = Sie sind zu stark! \ No newline at end of file diff --git a/assets/voxygen/i18n/de_DE/npc.ron b/assets/voxygen/i18n/de_DE/npc.ron deleted file mode 100644 index 908797fc81..0000000000 --- a/assets/voxygen/i18n/de_DE/npc.ron +++ /dev/null @@ -1,198 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Germany German -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Ist das nicht ein wunderbarer Tag?", - "Wie geht's dir heute?", - "Einen schönen guten Morgen wünsche ich dir!", - "Ich frage mich, was der Catoblepas denkt, wenn er Gras isst.", - "Was hälst du vom Wetter?", - "Wenn ich an die Katakomben denke, bekomme ich Angst. Ich hoffe jemand befreit sie vom Unheil.", - "Ich würde gerne in eine der Höhlen gehen, wenn ich größer und stärker bin.", - "Hast du meine Katze gesehen?", - "Hast du schonmal etwas von den gefährlichen Landhaien gehört? Ich habe gehört sie leben in der Wüste.", - "Man sagt, es gebe Juwelen aller Art in den Höhlen der Gegend.", - "Ich bin einfach verrückt nach Käse!", - "Möchtest du nicht rein kommen? Bei uns gibt es gleich himmlischen Käse!", - "Man sagt Pilze seien gut für die Gesundheit. Ich selber habe noch nie welche gegessen.", - "Vergiss dein Feuerwerk nicht!", - "Ich liebe Zwergenkäse einfach. Ich wünschte, ich könnte selber welchen herstellen.", - "Ich frage mich, was sich auf der anderen Seite der Berge verbirgt.", - "Ich wünschte, ich könnte mir eines Tages meinen eigenen Gleiter bauen.", - "Möchtest du dir mal meinen Garten ansehen? Okay, vielleicht beim nächsten Mal.", - "Ein perfekter Tag, um in den Wald zu gehen!", - "Sein oder nicht sein? Ich glaube ich werde Landwirt.", - "Findest du nicht auch, dass unser Dorf das schönste ist?", - "Was glaubst du, was glühende Überreste zum Glühen bringt?", - "Ich glaube es ist an der Zeit für ein zweites Frühstück!", - "Hast du jemals ein Glühwürmchen gefangen?", - "Ich verstehe einfach nicht wo die ganzen Sauroks herkommen.", - "Ich wünschte, jemand könnte die ganzen Wölfe vom Dorf fernhalten.", - "Ich hatte letzte Nacht einen wunderbaren Traum über Käse. Was könnte das bedeuten?", - "Ich habe meinem Bruder ein wenig Käse dagelassen. Nun weiß ich nicht, ob er ihn schon aß oder nicht. Ich nenne es Schrödingers Käse.", - "Ich habe meiner Schwester ein wenig Käse dagelassen. Nun weiß ich nicht, ob sie ihn schon aß oder nicht. Ich nenne es Schrödingers Käse.", - "Jemand sollte etwas gegen diese Kultisten unternehmen. Vorzugsweise nicht ich.", - "Ich hoffe es regnet bald wieder. Der Ernte würde es gut tun.", - "Ich liebe Honig! Und hasse Bienen.", - "Eines Tages möchte ich die Welt bereisen. Es muss doch mehr im Leben geben als dieses Dorf.", - ], - "npc.speech.villager_decline_trade": [ - "Tut mir leid, ich habe nichts, was ich mit dir handeln könnte.", - "Du möchtest handeln? Als ob ich etwas hätte, das dich interessieren könnte.", - "Mein Haus gehört mir, ich würde es für nichts auf der Welt hergeben.", - ], - "npc.speech.merchant_advertisement": [ - "Darf ich dir einen Handel vorschlagen?", - "Möchtest du mit mir handeln?", - "Ich habe viele Waren. Möchtest du sie dir mal ansehen?" - ], - "npc.speech.merchant_busy": [ - "Hey, warte bis du an der Reihe bist.", - "Einen Moment bitte, ich kann mich nicht zerteilen.", - "Siehst du nicht, dass jemand vor dir steht?", - "Einen Moment bitte, ich bin gleich bei dir.", - "Nicht vordrängeln bitte.", - "Ich bin gerade beschäftigt, komm doch später wieder." - ], - "npc.speech.merchant_trade_successful": [ - "Vielen Dank für das Geschäft!", - "Vielen Dank!", - ], - "npc.speech.merchant_trade_declined": [ - "Vielleicht beim nächsten Mal, einen schönen Tag noch!", - "Zu schade, vielleicht beim nächsten mal, bis dann!" - ], - "npc.speech.villager_cultist_alarm": [ - "Achtung! Ein Kultist schleicht hier herum!", - "Zu den Waffen! Die Kultisten attackieren uns!", - "Wie können die Kultisten es wagen, unser Dorf zu attackieren!", - "Tod den Kultisten!", - "Kultisten werden hier nicht toleriert!", - "Mörderischer Kultist!", - "Eine Kostprobe meines Schwertes gefällig? Du reudiger Kultist!", - "Nichts kann das Blut von deinen Händen waschen, Kultist!", - "Ja brat' mir doch einer 'nen Storch! Ein Kultist weilt unter uns!", - "Die Schreckensherrschaft der Kultisten wird bald vorrüber sein!", - "Der Kultist gehört mir!", - "Bereite dich darauf vor deinem Schöpfer gegenüberzutreten, du mieser Kultist!", - "Ich sehe einen Kultisten! Ergreift ihn!", - "Ich sehe einen Kultisten!", - "Ich sehe einen Kultisten! Lasst ihn nicht entkommen!", - "Ist der ehrenwerte Kultist an ein wenig TOD interessiert?!", - "Wir vergeben nicht! Wir vergessen nicht! Kultist, büße!", - "Stirb, Kultist!", - "Deine Schreckensherrschaft wird enden!", - "Nimm das! Für alles, was du getan hast!", - "Wir wollen Abschaum wie euch hier nicht!", - "Du hättest unter der Erde bleiben sollen! Da wo du hingehörst!", - ], - "npc.speech.villager_under_attack": [ - "Hilfe, ich werde angegriffen!", - "Hilfe, ich werde angegriffen!", - "Autsch! ich werde angegriffen!", - "Autsch! ich werde angegriffen! Hilfe!", - "Helft mir! Ich werde angegriffen!", - "Ich werde angegriffen! Hilfe!", - "Ich werde angegriffen! Helft mir!", - "Hilfe!", - "Hilfe! Hilfe!", - "Hilfe! Hilfe! Hilfe!", - "Ich werde angegriffen!", - "AAAHHH! Ich werde angegriffen!", - "AAAHHH! Ich werde angegriffen! So helft mir doch!", - "Hilfe! Wir werden angegriffen!", - "Hilfe! Mörder!", - "Hilfe! Ein Mörder läuft frei herum!", - "Hilfe! Man versucht, mich zu töten!", - "Wachen, ich werde angegriffen!", - "Wachen! Ich werde angegriffen!", - "Ich werde angegriffen! Wachen!", - "Hilfe! Wachen! Ich werde angegriffen!", - "Wachen! Kommt schnell!", - "Wachen! Wachen!", - "Wachen! Ein Schurke attackiert mich!", - "Wachen, erschlagt diesen üblen Schurken!", - "Wachen! Ein Mörder!", - "Wachen! Helft mir!", - "Damit wirst du nicht davonkommen! Wachen!", - "Du Unmensch!", - "Helft mir!", - "Helft mir! Bitte!", - "Autsch! Wachen! Hilfe!", - "Sie kommen, um mich zu holen!", - "Hilfe! Hilfe! Ich werde angefeindet!", - "Ah, jetzt sehen wir die Gewalt, die dem System innewohnt.", - "Ach nur'n Kratzer!", - "Hört auf!", - "Was habe ich euch angetan?!", - "Bitte, hört auf mich anzugreifen!", - "Hey! Pass auf wo du mit dem Ding hinziehlst!", - "Abscheulicher Schuft, hinfort mit dir!", - "Halt! Verzieh dich!", - "Du bringst mich noch zur Weißglut!", - "Oi! Was denkst du wer du bist?!", - "Dafür reiße ich dir den Kopf ab!", - "Stop, bitte! Ich habe nichts wertvolles bei mir!", - "Ich setze meinen Bruder auf dich an, er ist größer als ich!", - "Neiiiin, das erzähle ich meiner Mutter!", - "Verflucht seist du!", - "Bitte, tu's nicht.", - "Das war nicht sehr nett von dir!", - "Deine Waffe erfüllt ihren Zweck, du kannst sie jetzt wegstecken!", - "Verschone mich!", - "Bitte, ich habe Familie!", - "Ich bin zu jung zum sterben!", - "Können wir darüber reden?", - "Gewalt ist keine Lösung!", - "Der heutige Tag entwickelt sich zu einem sehr schlechten Tag...", - "Hey, das tat weh!", - "AAAAHHH!", - "Wie rüpelhaft!", - "Stop, ich flehe dich an!", - "Ein Fluch soll dich heimsuchen!", - "Das ist nicht lustig.", - "Wie könnt Ihr es wagen?!", - "Dafür wirst du bezahlen!", - "Mach weiter so und es wird dir leid tun!", - "Zwing mich nicht, dir weh zu tun!", - "Das muss ein Missverständnis sein!", - "Du musst das nicht tun!", - "Fort mit dir, Schurke!", - "Das hat echt wehgetan!", - "Warum tust du das?", - "Bei den Göttern, hört auf!", - "Du musst mich mit jemand anderem verwechseln!", - "Ich verdiene das nicht!", - "Bitte, tu das nicht nochmal.", - "Wachen, in den Kerker mit diesem Schuft!", - "Ich werde meinen Tarasque auf dich hetzen!", - "Warum iiiich?", - ], - "npc.speech.villager_enemy_killed": [ - "Ich habe den Feind vernichtet!", - "Endlich Frieden!", - "... also, wo war ich stehengeblieben?", - ], - "npc.speech.menacing": [ - "Ich warne dich!", - "Komm nicht näher oder ich greife an!", - "Du jagst mir keine Angst ein!", - "Verschwinde von hier!", - "Hau bloß ab wenn du überleben willst!", - "Deine Art ist hier nicht willkommen!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Rückzug für die gute Sache!", - "Rückzug!", - "Verflucht seist du!", - "Mein Geist wird dich verfolgen!", - "Ich muss ruhen.", - "Sie sind zu stark!", - ] - } -) diff --git a/assets/voxygen/i18n/de_DE/template.ftl b/assets/voxygen/i18n/de_DE/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/de_DE/template.ron b/assets/voxygen/i18n/de_DE/template.ron deleted file mode 100644 index a95240d979..0000000000 --- a/assets/voxygen/i18n/de_DE/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for germany German -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/buff.ftl b/assets/voxygen/i18n/en/buff.ftl new file mode 100644 index 0000000000..8aefd0a07d --- /dev/null +++ b/assets/voxygen/i18n/en/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Click to remove +buff-title-missing = Missing Title +buff-desc-missing = Missing Description +buff-title-heal = Heal +buff-desc-heal = Gain health over time. +buff-title-potion = Potion +buff-desc-potion = Drinking... +buff-title-saturation = Saturation +buff-desc-saturation = Gain health over time from consumables. +buff-title-campfire_heal = Campfire Heal +buff-desc-campfire_heal = Resting at a campfire heals { $rate }% per second. +buff-title-invulnerability = Invulnerability +buff-desc-invulnerability = You cannot be damaged by any attack. +buff-title-protectingward = Protecting Ward +buff-desc-protectingward = You are protected, somewhat, from attacks. +buff-title-frenzied = Frenzied +buff-desc-frenzied = You are imbued with unnatural speed and can ignore minor injuries. +buff-title-hastened = Hastened +buff-desc-hastened = Your movements and attacks are faster. +buff-title-bleed = Bleeding +buff-desc-bleed = Inflicts regular damage. +buff-title-cursed = Cursed +buff-desc-cursed = You are cursed. +buff-title-burn = On Fire +buff-desc-burn = You are burning alive +buff-title-crippled = Crippled +buff-desc-crippled = Your movement is crippled as your legs are heavily injured. +buff-title-frozen = Frozen +buff-desc-frozen = Your movements and attacks are slowed. +buff-title-wet = Wet +buff-desc-wet = The ground rejects your feet, making it hard to stop. +buff-title-ensnared = Ensnared +buff-desc-ensnared = Vines grasp at your legs, impeding your movement. +buff-stat-health = Restores { $str_total } Health +buff-stat-increase_max_energy = Raises Maximum Energy by { $strength } +buff-stat-increase_max_health = Raises Maximum Health by { $strength } +buff-stat-invulnerability = Grants invulnerability +buff-text-over_seconds = over { $dur_secs } seconds +buff-text-for_seconds = for { $dur_secs } seconds \ No newline at end of file diff --git a/assets/voxygen/i18n/en/buff.ron b/assets/voxygen/i18n/en/buff.ron deleted file mode 100644 index 793abe289f..0000000000 --- a/assets/voxygen/i18n/en/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Buffs - "buff.remove": "Click to remove", - "buff.title.missing": "Missing Title", - "buff.desc.missing": "Missing Description", - "buff.title.heal": "Heal", - "buff.desc.heal": "Gain health over time.", - "buff.title.potion": "Potion", - "buff.desc.potion": "Drinking...", - "buff.title.saturation": "Saturation", - "buff.desc.saturation": "Gain health over time from consumables.", - "buff.title.campfire_heal": "Campfire Heal", - "buff.desc.campfire_heal": "Resting at a campfire heals {rate}% per second.", - "buff.title.invulnerability": "Invulnerability", - "buff.desc.invulnerability": "You cannot be damaged by any attack.", - "buff.title.protectingward": "Protecting Ward", - "buff.desc.protectingward": "You are protected, somewhat, from attacks.", - "buff.title.frenzied": "Frenzied", - "buff.desc.frenzied": "You are imbued with unnatural speed and can ignore minor injuries.", - "buff.title.hastened": "Hastened", - "buff.desc.hastened": "Your movements and attacks are faster.", - // Debuffs - "buff.title.bleed": "Bleeding", - "buff.desc.bleed": "Inflicts regular damage.", - "buff.title.cursed": "Cursed", - "buff.desc.cursed": "You are cursed.", - "buff.title.burn": "On Fire", - "buff.desc.burn": "You are burning alive", - "buff.title.crippled": "Crippled", - "buff.desc.crippled": "Your movement is crippled as your legs are heavily injured.", - "buff.title.frozen": "Frozen", - "buff.desc.frozen": "Your movements and attacks are slowed.", - "buff.title.wet": "Wet", - "buff.desc.wet": "The ground rejects your feet, making it hard to stop.", - "buff.title.ensnared": "Ensnared", - "buff.desc.ensnared": "Vines grasp at your legs, impeding your movement.", - // Buffs stats - "buff.stat.health": "Restores {str_total} Health", - "buff.stat.increase_max_energy": "Raises Maximum Energy by {strength}", - "buff.stat.increase_max_health": "Raises Maximum Health by {strength}", - "buff.stat.invulnerability": "Grants invulnerability", - // Text - "buff.text.over_seconds": "over {dur_secs} seconds", - "buff.text.for_seconds": "for {dur_secs} seconds", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/char_selection.ftl b/assets/voxygen/i18n/en/char_selection.ftl new file mode 100644 index 0000000000..c2ebc0cbaf --- /dev/null +++ b/assets/voxygen/i18n/en/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Loading characters... +char_selection-delete_permanently = Permanently delete this Character? +char_selection-deleting_character = Deleting Character... +char_selection-change_server = Change Server +char_selection-enter_world = Enter World +char_selection-logout = Logout +char_selection-create_new_character = Create New Character +char_selection-creating_character = Creating Character... +char_selection-character_creation = Character Creation +char_selection-human_default = Human Default +char_selection-level_fmt = Level { $level_nb } +char_selection-uncanny_valley = Wilderness +char_selection-plains_of_uncertainty = Plains of Uncertainty +char_selection-beard = Beard +char_selection-hair_style = Hair Style +char_selection-hair_color = Hair Color +char_selection-eye_color = Eye Color +char_selection-skin = Skin +char_selection-eyeshape = Eye Details +char_selection-accessories = Accessories +char_selection-create_info_name = Your Character needs a name! +char_selection-version_mismatch = WARNING! This server is running a different, possibly incompatible game version. Please update your game. \ No newline at end of file diff --git a/assets/voxygen/i18n/en/char_selection.ron b/assets/voxygen/i18n/en/char_selection.ron deleted file mode 100644 index 143240f159..0000000000 --- a/assets/voxygen/i18n/en/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "char_selection.loading_characters": "Loading characters...", - "char_selection.delete_permanently": "Permanently delete this Character?", - "char_selection.deleting_character": "Deleting Character...", - "char_selection.change_server": "Change Server", - "char_selection.enter_world": "Enter World", - "char_selection.logout": "Logout", - "char_selection.create_new_character": "Create New Character", - "char_selection.creating_character": "Creating Character...", - "char_selection.character_creation": "Character Creation", - "char_selection.human_default": "Human Default", - "char_selection.level_fmt": "Level {level_nb}", - "char_selection.uncanny_valley": "Wilderness", - "char_selection.plains_of_uncertainty": "Plains of Uncertainty", - "char_selection.beard": "Beard", - "char_selection.hair_style": "Hair Style", - "char_selection.hair_color": "Hair Color", - "char_selection.eye_color": "Eye Color", - "char_selection.skin": "Skin", - "char_selection.eyeshape": "Eye Details", - "char_selection.accessories": "Accessories", - "char_selection.create_info_name": "Your Character needs a name!", - "char_selection.version_mismatch": "WARNING! This server is running a different, possibly incompatible game version. Please update your game.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl new file mode 100644 index 0000000000..f3ff34b9b8 --- /dev/null +++ b/assets/voxygen/i18n/en/common.ftl @@ -0,0 +1,108 @@ +common-username = username +common-singleplayer = Singleplayer +common-multiplayer = Multiplayer +common-servers = Servers +common-quit = Quit +common-settings = Settings +common-languages = Languages +common-interface = Interface +common-gameplay = Gameplay +common-controls = Controls +common-video = Graphics +common-sound = Sound +common-chat = Chat +common-resume = Resume +common-characters = Characters +common-close = Close +common-yes = Yes +common-no = No +common-back = Back +common-create = Create +common-okay = Okay +common-add = Add +common-accept = Accept +common-decline = Decline +common-disclaimer = Disclaimer +common-cancel = Cancel +common-none = None +common-error = Error +common-fatal_error = Fatal Error +common-you = You +common-automatic = Auto +common-random = Random +common-empty = Empty +common-confirm = Confirm +common-delete_server = Delete Server +common-interface_settings = Interface Settings +common-gameplay_settings = Gameplay Settings +common-controls_settings = Controls Settings +common-video_settings = Graphics Settings +common-sound_settings = Sound Settings +common-language_settings = Language Settings +common-chat_settings = Chat Settings +common-connection_lost = + Connection lost! + Did the server restart? + Is the client up to date? +common-species-orc = Orc +common-species-human = Human +common-species-dwarf = Dwarf +common-species-elf = Elf +common-species-draugr = Draugr +common-species-danari = Danari +common-weapons-axe = Axe +common-weapons-dagger = Dagger +common-weapons-greatsword = Greatsword +common-weapons-shortswords = Shortswords +common-weapons-sword = Sword +common-weapons-staff = Firestaff +common-weapons-bow = Bow +common-weapons-hammer = Hammer +common-weapons-general = General Combat +common-weapons-sceptre = Healing Sceptre +common-weapons-shield = Shield +common-weapons-spear = Spear +common-weapons-hammer_simple = Simple Hammer +common-weapons-sword_simple = Simple Sword +common-weapons-staff_simple = Simple Staff +common-weapons-axe_simple = Simple Axe +common-weapons-bow_simple = Simple Bow +common-weapons-unique = Unique +common-tool-debug = Debug +common-tool-farming = Farming Tool +common-tool-pick = Pickaxe +common-tool-mining = Mining +common-kind-modular_component = Modular Component +common-kind-modular_component_partial = Component +common-kind-glider = Glider +common-kind-consumable = Consumable +common-kind-throwable = Can be thrown +common-kind-utility = Utility +common-kind-ingredient = Ingredient +common-kind-lantern = Lantern +common-hands-one = One-Handed +common-hands-two = Two-Handed +common-rand_appearance = Random appearance +common-rand_name = Random name +common-stats-combat_rating = CR +common-stats-power = Power +common-stats-speed = Speed +common-stats-poise = Poise +common-stats-range = Range +common-stats-energy_efficiency = Energy Efficiency +common-stats-buff_strength = Buff/Debuff Strength +common-stats-crit_chance = Crit Chance +common-stats-crit_mult = Crit Mult +common-stats-armor = Armor +common-stats-poise_res = Stun Res +common-stats-energy_max = Max Energy +common-stats-energy_reward = Energy Reward +common-stats-crit_power = Crit Power +common-stats-stealth = Stealth +common-stats-slots = Slots +common-material-metal = Metal +common-material-wood = Wood +common-material-stone = Stone +common-material-cloth = Cloth +common-material-hide = Hide +common-sprite-chest = Chest \ No newline at end of file diff --git a/assets/voxygen/i18n/en/common.ron b/assets/voxygen/i18n/en/common.ron deleted file mode 100644 index 5736ac36bf..0000000000 --- a/assets/voxygen/i18n/en/common.ron +++ /dev/null @@ -1,130 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "username", - "common.singleplayer": "Singleplayer", - "common.multiplayer": "Multiplayer", - "common.servers": "Servers", - "common.quit": "Quit", - "common.settings": "Settings", - "common.languages": "Languages", - "common.interface": "Interface", - "common.gameplay": "Gameplay", - "common.controls": "Controls", - "common.video": "Graphics", - "common.sound": "Sound", - "common.chat": "Chat", - "common.resume": "Resume", - "common.characters": "Characters", - "common.close": "Close", - "common.yes": "Yes", - "common.no": "No", - "common.back": "Back", - "common.create": "Create", - "common.okay": "Okay", - "common.add": "Add", - "common.accept": "Accept", - "common.decline": "Decline", - "common.disclaimer": "Disclaimer", - "common.cancel": "Cancel", - "common.none": "None", - "common.error": "Error", - "common.fatal_error": "Fatal Error", - "common.you": "You", - "common.automatic": "Auto", - "common.random": "Random", - "common.empty": "Empty", - "common.confirm": "Confirm", - "common.delete_server": "Delete Server", - - // Settings Window title - "common.interface_settings": "Interface Settings", - "common.gameplay_settings": "Gameplay Settings", - "common.controls_settings": "Controls Settings", - "common.video_settings": "Graphics Settings", - "common.sound_settings": "Sound Settings", - "common.language_settings": "Language Settings", - "common.chat_settings": "Chat Settings", - - // Message when connection to the server is lost - "common.connection_lost": r#"Connection lost! -Did the server restart? -Is the client up to date?"#, - - - "common.species.orc": "Orc", - "common.species.human": "Human", - "common.species.dwarf": "Dwarf", - "common.species.elf": "Elf", - "common.species.draugr": "Draugr", - "common.species.danari": "Danari", - - "common.weapons.axe": "Axe", - "common.weapons.dagger": "Dagger", - "common.weapons.greatsword": "Greatsword", - "common.weapons.shortswords": "Shortswords", - "common.weapons.sword": "Sword", - "common.weapons.staff": "Firestaff", - "common.weapons.bow": "Bow", - "common.weapons.hammer": "Hammer", - "common.weapons.general": "General Combat", - "common.weapons.sceptre": "Healing Sceptre", - "common.weapons.shield": "Shield", - "common.weapons.spear": "Spear", - "common.weapons.hammer_simple": "Simple Hammer", - "common.weapons.sword_simple": "Simple Sword", - "common.weapons.staff_simple": "Simple Staff", - "common.weapons.axe_simple": "Simple Axe", - "common.weapons.bow_simple": "Simple Bow", - "common.weapons.unique": "Unique", - "common.tool.debug": "Debug", - "common.tool.farming": "Farming Tool", - "common.tool.pick": "Pickaxe", - "common.tool.mining": "Mining", - "common.kind.modular_component": "Modular Component", - "common.kind.modular_component_partial": "Component", - "common.kind.glider": "Glider", - "common.kind.consumable": "Consumable", - "common.kind.throwable": "Can be thrown", - "common.kind.utility": "Utility", - "common.kind.ingredient": "Ingredient", - "common.kind.lantern": "Lantern", - "common.hands.one": "One-Handed", - "common.hands.two": "Two-Handed", - - "common.rand_appearance": "Random appearance", - "common.rand_name": "Random name", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Power", - "common.stats.speed": "Speed", - "common.stats.poise": "Poise", - "common.stats.range": "Range", - "common.stats.energy_efficiency": "Energy Efficiency", - "common.stats.buff_strength": "Buff/Debuff Strength", - "common.stats.crit_chance": "Crit Chance", - "common.stats.crit_mult": "Crit Mult", - "common.stats.armor": "Armor", - "common.stats.poise_res":"Stun Res", - "common.stats.energy_max": "Max Energy", - "common.stats.energy_reward": "Energy Reward", - "common.stats.crit_power": "Crit Power", - "common.stats.stealth": "Stealth", - "common.stats.slots": "Slots", - - "common.material.metal": "Metal", - "common.material.wood": "Wood", - "common.material.stone": "Stone", - "common.material.cloth": "Cloth", - "common.material.hide": "Hide", - - "common.sprite.chest": "Chest", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/esc_menu.ftl b/assets/voxygen/i18n/en/esc_menu.ftl new file mode 100644 index 0000000000..424e5a2c3d --- /dev/null +++ b/assets/voxygen/i18n/en/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Logout +esc_menu-quit_game = Quit Game \ No newline at end of file diff --git a/assets/voxygen/i18n/en/esc_menu.ron b/assets/voxygen/i18n/en/esc_menu.ron deleted file mode 100644 index 538453260a..0000000000 --- a/assets/voxygen/i18n/en/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "esc_menu.logout": "Logout", - "esc_menu.quit_game": "Quit Game", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/gameinput.ftl b/assets/voxygen/i18n/en/gameinput.ftl new file mode 100644 index 0000000000..65cffbdea7 --- /dev/null +++ b/assets/voxygen/i18n/en/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Basic Attack +gameinput-secondary = Secondary Attack +gameinput-block = Block +gameinput-slot1 = Hotbar Slot 1 +gameinput-slot2 = Hotbar Slot 2 +gameinput-slot3 = Hotbar Slot 3 +gameinput-slot4 = Hotbar Slot 4 +gameinput-slot5 = Hotbar Slot 5 +gameinput-slot6 = Hotbar Slot 6 +gameinput-slot7 = Hotbar Slot 7 +gameinput-slot8 = Hotbar Slot 8 +gameinput-slot9 = Hotbar Slot 9 +gameinput-slot10 = Hotbar Slot 10 +gameinput-swaploadout = Swap Loadout +gameinput-togglecursor = Toggle Cursor +gameinput-help = Toggle Help Window +gameinput-toggleinterface = Toggle Interface +gameinput-toggledebug = Toggle FPS and Debug Info +gameinput-toggle_egui_debug = Toggle EGUI Debug Info +gameinput-togglechat = Toggle Chat +gameinput-screenshot = Take Screenshot +gameinput-toggleingameui = Toggle Nametags +gameinput-fullscreen = Toggle Fullscreen +gameinput-moveforward = Move Forward +gameinput-moveleft = Move Left +gameinput-moveright = Move Right +gameinput-moveback = Move Backwards +gameinput-jump = Jump +gameinput-glide = Glider +gameinput-roll = Roll +gameinput-climb = Climb +gameinput-climbdown = Climb Down +gameinput-wallleap = Wall Leap +gameinput-togglelantern = Toggle Lantern +gameinput-mount = Mount +gameinput-chat = Chat +gameinput-command = Command +gameinput-escape = Escape +gameinput-map = Map +gameinput-bag = Bag +gameinput-trade = Trade +gameinput-social = Social +gameinput-sit = Sit +gameinput-spellbook = Spells +gameinput-settings = Settings +gameinput-respawn = Respawn +gameinput-charge = Charge +gameinput-togglewield = Toggle Wield +gameinput-interact = Interact +gameinput-freelook = Free Look +gameinput-autowalk = Auto Walk/Swim +gameinput-cameraclamp = Camera Clamp +gameinput-dance = Dance +gameinput-select = Select Entity +gameinput-acceptgroupinvite = Accept Group Invite +gameinput-declinegroupinvite = Decline Group Invite +gameinput-cyclecamera = Cycle camera +gameinput-crafting = Crafting +gameinput-fly = Fly +gameinput-sneak = Sneak +gameinput-swimdown = Swim downwards +gameinput-swimup = Swim upwards +gameinput-mapzoomin = Increase map zoom +gameinput-mapzoomout = Decrease map zoom +gameinput-greet = Greet +gameinput-map-locationmarkerbutton = Set a waypoint in the Map \ No newline at end of file diff --git a/assets/voxygen/i18n/en/gameinput.ron b/assets/voxygen/i18n/en/gameinput.ron deleted file mode 100644 index 21326a6f63..0000000000 --- a/assets/voxygen/i18n/en/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "gameinput.primary": "Basic Attack", - "gameinput.secondary": "Secondary Attack", - "gameinput.block": "Block", - "gameinput.slot1": "Hotbar Slot 1", - "gameinput.slot2": "Hotbar Slot 2", - "gameinput.slot3": "Hotbar Slot 3", - "gameinput.slot4": "Hotbar Slot 4", - "gameinput.slot5": "Hotbar Slot 5", - "gameinput.slot6": "Hotbar Slot 6", - "gameinput.slot7": "Hotbar Slot 7", - "gameinput.slot8": "Hotbar Slot 8", - "gameinput.slot9": "Hotbar Slot 9", - "gameinput.slot10": "Hotbar Slot 10", - "gameinput.swaploadout": "Swap Loadout", - "gameinput.togglecursor": "Toggle Cursor", - "gameinput.help": "Toggle Help Window", - "gameinput.toggleinterface": "Toggle Interface", - "gameinput.toggledebug": "Toggle FPS and Debug Info", - "gameinput.toggle_egui_debug": "Toggle EGUI Debug Info", - "gameinput.togglechat": "Toggle Chat", - "gameinput.screenshot": "Take Screenshot", - "gameinput.toggleingameui": "Toggle Nametags", - "gameinput.fullscreen": "Toggle Fullscreen", - "gameinput.moveforward": "Move Forward", - "gameinput.moveleft": "Move Left", - "gameinput.moveright": "Move Right", - "gameinput.moveback": "Move Backwards", - "gameinput.jump": "Jump", - "gameinput.glide": "Glider", - "gameinput.roll": "Roll", - "gameinput.climb": "Climb", - "gameinput.climbdown": "Climb Down", - "gameinput.wallleap": "Wall Leap", - "gameinput.togglelantern": "Toggle Lantern", - "gameinput.mount": "Mount", - "gameinput.chat": "Chat", - "gameinput.command": "Command", - "gameinput.escape": "Escape", - "gameinput.map": "Map", - "gameinput.bag": "Bag", - "gameinput.trade": "Trade", - "gameinput.social": "Social", - "gameinput.sit": "Sit", - "gameinput.spellbook": "Spells", - "gameinput.settings": "Settings", - "gameinput.respawn": "Respawn", - "gameinput.charge": "Charge", - "gameinput.togglewield": "Toggle Wield", - "gameinput.interact": "Interact", - "gameinput.freelook": "Free Look", - "gameinput.autowalk": "Auto Walk/Swim", - "gameinput.cameraclamp": "Camera Clamp", - "gameinput.dance": "Dance", - "gameinput.select": "Select Entity", - "gameinput.acceptgroupinvite": "Accept Group Invite", - "gameinput.declinegroupinvite": "Decline Group Invite", - "gameinput.cyclecamera": "Cycle camera", - "gameinput.crafting": "Crafting", - "gameinput.fly": "Fly", - "gameinput.sneak": "Sneak", - "gameinput.swimdown": "Swim downwards", - "gameinput.swimup": "Swim upwards", - "gameinput.mapzoomin": "Increase map zoom", - "gameinput.mapzoomout": "Decrease map zoom", - "gameinput.greet": "Greet", - "gameinput.map.locationmarkerbutton": "Set a waypoint in the Map" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/ability.ftl b/assets/voxygen/i18n/en/hud/ability.ftl new file mode 100644 index 0000000000..6a1e7c1a10 --- /dev/null +++ b/assets/voxygen/i18n/en/hud/ability.ftl @@ -0,0 +1,16 @@ +common-abilities-debug-possess-name = Possessing Arrow +common-abilities-debug-possess-desc = Shoots a poisonous arrow. Lets you control your target. +common-abilities-sword-spin-name = Whirlwind +common-abilities-sword-spin-desc = Move forward while spinning with your sword. +common-abilities-axe-leap-name = Axe Jump +common-abilities-axe-leap-desc = A jump with the slashing leap to position of cursor. +common-abilities-hammer-leap-name = Smash of Doom +common-abilities-hammer-leap-desc = An AOE attack with knockback. Leaps to position of cursor. +common-abilities-bow-shotgun-name = Burst +common-abilities-bow-shotgun-desc = Launches a burst of arrows +common-abilities-staff-fireshockwave-name = Ring of Fire +common-abilities-staff-fireshockwave-desc = Ignites the ground with fiery shockwave. +common-abilities-sceptre-wardingaura-name = Warding Aura +common-abilities-sceptre-wardingaura-desc = Wards your allies against enemy attacks. +common-abilities-unknown-name = Ability has no title +common-abilities-unknown-desc = Ability has no description \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/ability.ron b/assets/voxygen/i18n/en/hud/ability.ron deleted file mode 100644 index e9c64c1039..0000000000 --- a/assets/voxygen/i18n/en/hud/ability.ron +++ /dev/null @@ -1,35 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Debug stick - "common.abilities.debug.possess.name": "Possessing Arrow", - "common.abilities.debug.possess.desc": "Shoots a poisonous arrow. Lets you control your target.", - // Sword - "common.abilities.sword.spin.name": "Whirlwind", - "common.abilities.sword.spin.desc": "Move forward while spinning with your sword.", - // Axe - "common.abilities.axe.leap.name": "Axe Jump", - "common.abilities.axe.leap.desc": "A jump with the slashing leap to position of cursor.", - // Hammer - "common.abilities.hammer.leap.name": "Smash of Doom", - "common.abilities.hammer.leap.desc": "An AOE attack with knockback. Leaps to position of cursor.", - // Bow - "common.abilities.bow.shotgun.name": "Burst", - "common.abilities.bow.shotgun.desc": "Launches a burst of arrows", - // Staff - "common.abilities.staff.fireshockwave.name": "Ring of Fire", - "common.abilities.staff.fireshockwave.desc": "Ignites the ground with fiery shockwave.", - // Sceptre - "common.abilities.sceptre.wardingaura.name": "Warding Aura", - "common.abilities.sceptre.wardingaura.desc": "Wards your allies against enemy attacks.", - // Unknown - "common.abilities.unknown.name": "Ability has no title", - "common.abilities.unknown.desc": "Ability has no description", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/bag.ftl b/assets/voxygen/i18n/en/hud/bag.ftl new file mode 100644 index 0000000000..5a098aa99b --- /dev/null +++ b/assets/voxygen/i18n/en/hud/bag.ftl @@ -0,0 +1,41 @@ +hud-bag-inventory = { $playername }'s Inventory +hud-bag-stats_title = { $playername }'s Stats +hud-bag-exp = Exp +hud-bag-armor = Armor +hud-bag-stats = Stats +hud-bag-head = Head +hud-bag-neck = Neck +hud-bag-tabard = Tabard +hud-bag-shoulders = Shoulders +hud-bag-chest = Chest +hud-bag-hands = Hands +hud-bag-lantern = Lantern +hud-bag-glider = Glider +hud-bag-belt = Belt +hud-bag-ring = Ring +hud-bag-back = Back +hud-bag-legs = Legs +hud-bag-feet = Feet +hud-bag-mainhand = Mainhand +hud-bag-offhand = Offhand +hud-bag-inactive_mainhand = Inactive Mainhand +hud-bag-inactive_offhand = Inactive Offhand +hud-bag-swap_equipped_weapons_title = Swap equipped weapons +hud-bag-swap_equipped_weapons_desc = Press { $key } +hud-bag-bag = Bag +hud-bag-health = Health +hud-bag-energy = Energy +hud-bag-combat_rating = Combat Rating +hud-bag-protection = Protection +hud-bag-stun_res = Stun Resilience +hud-bag-stealth = Stealth +hud-bag-combat_rating_desc = + Calculated from your + equipment and health. +hud-bag-protection_desc = Damage reduction through armor +hud-bag-stun_res_desc = + Resilience against being stunned by consecutive hits. + Regenerates like Energy. +hud-bag-sort_by_name = Sort by Name +hud-bag-sort_by_quality = Sort by Quality +hud-bag-sort_by_category = Sort by Category \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/bag.ron b/assets/voxygen/i18n/en/hud/bag.ron deleted file mode 100644 index f164cf409b..0000000000 --- a/assets/voxygen/i18n/en/hud/bag.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}'s Inventory", - "hud.bag.stats_title": "{playername}'s Stats", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armor", - "hud.bag.stats": "Stats", - "hud.bag.head": "Head", - "hud.bag.neck": "Neck", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Shoulders", - "hud.bag.chest": "Chest", - "hud.bag.hands": "Hands", - "hud.bag.lantern": "Lantern", - "hud.bag.glider": "Glider", - "hud.bag.belt": "Belt", - "hud.bag.ring": "Ring", - "hud.bag.back": "Back", - "hud.bag.legs": "Legs", - "hud.bag.feet": "Feet", - "hud.bag.mainhand": "Mainhand", - "hud.bag.offhand": "Offhand", - "hud.bag.inactive_mainhand": "Inactive Mainhand", - "hud.bag.inactive_offhand": "Inactive Offhand", - "hud.bag.swap_equipped_weapons_title": "Swap equipped weapons", - "hud.bag.swap_equipped_weapons_desc": "Press {key}", - "hud.bag.bag": "Bag", - "hud.bag.health": "Health", - "hud.bag.energy": "Energy", - "hud.bag.combat_rating": "Combat Rating", - "hud.bag.protection": "Protection", - "hud.bag.stun_res": "Stun Resilience", - "hud.bag.stealth": "Stealth", - "hud.bag.combat_rating_desc": "Calculated from your\nequipment and health.", - "hud.bag.protection_desc": "Damage reduction through armor", - "hud.bag.stun_res_desc": "Resilience against being stunned by consecutive hits.\nRegenerates like Energy.", - "hud.bag.sort_by_name": "Sort by Name", - "hud.bag.sort_by_quality": "Sort by Quality", - "hud.bag.sort_by_category": "Sort by Category", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/char_window.ftl b/assets/voxygen/i18n/en/hud/char_window.ftl new file mode 100644 index 0000000000..b3a30861be --- /dev/null +++ b/assets/voxygen/i18n/en/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Character Name +character_window-character_stats = + Endurance + + Fitness + + Willpower + + Protection \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/char_window.ron b/assets/voxygen/i18n/en/hud/char_window.ron deleted file mode 100644 index e8de38bd64..0000000000 --- a/assets/voxygen/i18n/en/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "character_window.character_name": "Character Name", - // Character stats - "character_window.character_stats": r#"Endurance - -Fitness - -Willpower - -Protection -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/chat.ftl b/assets/voxygen/i18n/en/hud/chat.ftl new file mode 100644 index 0000000000..608ac59b30 --- /dev/null +++ b/assets/voxygen/i18n/en/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = All +hud-chat-chat_tab_hover_tooltip = Right click for settings +hud-outcome-burning = died of: burning +hud-outcome-curse = died of: curse +hud-outcome-bleeding = died of: bleeding +hud-outcome-crippled = died of: crippled +hud-outcome-frozen = died of: frozen +hud-chat-online_msg = [{ $name }] is online now +hud-chat-offline_msg = [{ $name }] went offline +hud-chat-default_death_msg = [{ $name }] died +hud-chat-environmental_kill_msg = [{ $name }] died in { $environment } +hud-chat-fall_kill_msg = [{ $name }] died from fall damage +hud-chat-suicide_msg = [{ $name }] died from self-inflicted wounds +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } caused by [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] defeated [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] shot [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] blew up [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] killed [{ $victim }] with magic +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } caused by { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } killed [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } shot [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } blew up [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } killed [{ $victim }] with magic +hud-chat-npc_other_kill_msg = { $attacker } killed [{ $victim }] +hud-chat-loot_msg = You picked up [{ $item }] +hud-chat-loot_fail = Your Inventory is full! +hud-chat-goodbye = Goodbye! +hud-chat-connection_lost = Connection lost. Kicking in { $time } seconds. \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/chat.ron b/assets/voxygen/i18n/en/hud/chat.ron deleted file mode 100644 index c289570965..0000000000 --- a/assets/voxygen/i18n/en/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.chat.all": "All", - "hud.chat.chat_tab_hover_tooltip": "Right click for settings", - - // Debuff outcomes - "hud.outcome.burning": "died of: burning", - "hud.outcome.curse": "died of: curse", - "hud.outcome.bleeding": "died of: bleeding", - "hud.outcome.crippled": "died of: crippled", - "hud.outcome.frozen": "died of: frozen", - - // Chat outputs - "hud.chat.online_msg": "[{name}] is online now", - "hud.chat.offline_msg": "[{name}] went offline", - - "hud.chat.default_death_msg": "[{name}] died", - "hud.chat.environmental_kill_msg": "[{name}] died in {environment}", - "hud.chat.fall_kill_msg": "[{name}] died from fall damage", - "hud.chat.suicide_msg": "[{name}] died from self-inflicted wounds", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} caused by [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] defeated [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] shot [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] blew up [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] killed [{victim}] with magic", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} caused by {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} killed [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} shot [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} blew up [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} killed [{victim}] with magic", - "hud.chat.npc_other_kill_msg": "{attacker} killed [{victim}]", - - "hud.chat.loot_msg": "You picked up [{item}]", - "hud.chat.loot_fail": "Your Inventory is full!", - "hud.chat.goodbye": "Goodbye!", - "hud.chat.connection_lost": "Connection lost. Kicking in {time} seconds.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/crafting.ftl b/assets/voxygen/i18n/en/hud/crafting.ftl new file mode 100644 index 0000000000..8e72a2476a --- /dev/null +++ b/assets/voxygen/i18n/en/hud/crafting.ftl @@ -0,0 +1,44 @@ +hud-crafting = Crafting +hud-crafting-recipes = Recipes +hud-crafting-ingredients = Ingredients: +hud-crafting-craft = Craft +hud-crafting-tool_cata = Requires: +hud-crafting-req_crafting_station = Requires: +hud-crafting-anvil = Anvil +hud-crafting-cauldron = Cauldron +hud-crafting-cooking_pot = Cooking Pot +hud-crafting-crafting_bench = Crafting Bench +hud-crafting-forge = Forge +hud-crafting-loom = Loom +hud-crafting-spinning_wheel = Spinning Wheel +hud-crafting-tanning_rack = Tanning Rack +hud-crafting-salvaging_station = Salvaging Bench +hud-crafting-campfire = Campfire +hud-crafting-tabs-all = All +hud-crafting-tabs-armor = Armor +hud-crafting-tabs-dismantle = Dismantle +hud-crafting-tabs-food = Food +hud-crafting-tabs-glider = Gliders +hud-crafting-tabs-potion = Potions +hud-crafting-tabs-tool = Tools +hud-crafting-tabs-utility = Utility +hud-crafting-tabs-weapon = Weapons +hud-crafting-tabs-bag = Bags +hud-crafting-tabs-processed_material = Materials +hud-crafting-dismantle_title = Dismantling +hud-crafting-dismantle_explanation = + Hover items in your bag to see what + you can salvage. + + Double-Click them to start dismantling. +hud-crafting-modular_desc = Drag Item-Parts here to craft a weapon +hud-crafting-mod_weap_prim_slot_title = Primary Weapon Component +hud-crafting-mod_weap_prim_slot_desc = Place a primary weapon component here (e.g. a sword blade, axe head, or bow limbs). +hud-crafting-mod_weap_sec_slot_title = Secondary Weapon Component +hud-crafting-mod_weap_sec_slot_desc = Place a secondary weapon component here (e.g. a sword hilt, bow grip, or staff core). +hud-crafting-mod_comp_metal_prim_slot_title = Metal Ingot +hud-crafting-mod_comp_metal_prim_slot_desc = Place a metal ingot here, only certain metals can be used to make weapons. +hud-crafting-mod_comp_wood_prim_slot_title = Wood +hud-crafting-mod_comp_wood_prim_slot_desc = Place a kind of wood here, only certain woods can be used to make weapons. +hud-crafting-mod_comp_sec_slot_title = Animal Material +hud-crafting-mod_comp_sec_slot_desc = Optionally place an animal crafting ingredient, only certain ingredients can be used to augment weapons. \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/crafting.ron b/assets/voxygen/i18n/en/hud/crafting.ron deleted file mode 100644 index 9b5bf60112..0000000000 --- a/assets/voxygen/i18n/en/hud/crafting.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.crafting": "Crafting", - "hud.crafting.recipes": "Recipes", - "hud.crafting.ingredients": "Ingredients:", - "hud.crafting.craft": "Craft", - "hud.crafting.tool_cata": "Requires:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Requires:", - "hud.crafting.anvil": "Anvil", - "hud.crafting.cauldron": "Cauldron", - "hud.crafting.cooking_pot": "Cooking Pot", - "hud.crafting.crafting_bench": "Crafting Bench", - "hud.crafting.forge": "Forge", - "hud.crafting.loom": "Loom", - "hud.crafting.spinning_wheel": "Spinning Wheel", - "hud.crafting.tanning_rack": "Tanning Rack", - "hud.crafting.salvaging_station": "Salvaging Bench", - "hud.crafting.campfire": "Campfire", - // Tabs - "hud.crafting.tabs.all": "All", - "hud.crafting.tabs.armor": "Armor", - "hud.crafting.tabs.dismantle": "Dismantle", - "hud.crafting.tabs.food": "Food", - "hud.crafting.tabs.glider": "Gliders", - "hud.crafting.tabs.potion": "Potions", - "hud.crafting.tabs.tool": "Tools", - "hud.crafting.tabs.utility": "Utility", - "hud.crafting.tabs.weapon": "Weapons", - "hud.crafting.tabs.bag": "Bags", - "hud.crafting.tabs.processed_material": "Materials", - "hud.crafting.dismantle_title": "Dismantling", - "hud.crafting.dismantle_explanation" : "Hover items in your bag to see what\nyou can salvage.\n\nDouble-Click them to start dismantling.", - "hud.crafting.modular_desc": "Drag Item-Parts here to craft a weapon", - "hud.crafting.mod_weap_prim_slot_title": "Primary Weapon Component", - "hud.crafting.mod_weap_prim_slot_desc": "Place a primary weapon component here (e.g. a sword blade, axe head, or bow limbs).", - "hud.crafting.mod_weap_sec_slot_title": "Secondary Weapon Component", - "hud.crafting.mod_weap_sec_slot_desc": "Place a secondary weapon component here (e.g. a sword hilt, bow grip, or staff core).", - "hud.crafting.mod_comp_metal_prim_slot_title": "Metal Ingot", - "hud.crafting.mod_comp_metal_prim_slot_desc": "Place a metal ingot here, only certain metals can be used to make weapons.", - "hud.crafting.mod_comp_wood_prim_slot_title": "Wood", - "hud.crafting.mod_comp_wood_prim_slot_desc": "Place a kind of wood here, only certain woods can be used to make weapons.", - "hud.crafting.mod_comp_sec_slot_title": "Animal Material", - "hud.crafting.mod_comp_sec_slot_desc": "Optionally place an animal crafting ingredient, only certain ingredients can be used to augment weapons.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/group.ftl b/assets/voxygen/i18n/en/hud/group.ftl new file mode 100644 index 0000000000..1de1ab856e --- /dev/null +++ b/assets/voxygen/i18n/en/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Group +hud-group-invite_to_join = [{ $name }] invited you to their group! +hud-group-invite_to_trade = [{ $name }] would like to trade with you. +hud-group-invite = Invite +hud-group-kick = Kick +hud-group-assign_leader = Assign Leader +hud-group-leave = Leave Group +hud-group-dead = Dead +hud-group-out_of_range = Out of range +hud-group-add_friend = Add to Friends +hud-group-link_group = Link Groups +hud-group-in_menu = In Menu +hud-group-members = Group Members \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/group.ron b/assets/voxygen/i18n/en/hud/group.ron deleted file mode 100644 index a2290b7b33..0000000000 --- a/assets/voxygen/i18n/en/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.group": "Group", - "hud.group.invite_to_join": "[{name}] invited you to their group!", - "hud.group.invite_to_trade": "[{name}] would like to trade with you.", - "hud.group.invite": "Invite", - "hud.group.kick": "Kick", - "hud.group.assign_leader": "Assign Leader", - "hud.group.leave": "Leave Group", - "hud.group.dead" : "Dead", - "hud.group.out_of_range": "Out of range", - "hud.group.add_friend": "Add to Friends", - "hud.group.link_group": "Link Groups", - "hud.group.in_menu": "In Menu", - "hud.group.members": "Group Members", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/map.ftl b/assets/voxygen/i18n/en/hud/map.ftl new file mode 100644 index 0000000000..94a01a061d --- /dev/null +++ b/assets/voxygen/i18n/en/hud/map.ftl @@ -0,0 +1,34 @@ +hud-map-map_title = Map +hud-map-qlog_title = Quests +hud-map-topo_map = Topographic +hud-map-difficulty = Difficulty +hud-map-towns = Towns +hud-map-castles = Castles +hud-map-dungeons = Dungeons +hud-map-caves = Caves +hud-map-cave = Cave +hud-map-peaks = Mountains +hud-map-biomes = Biomes +hud-map-voxel_map = Voxel map +hud-map-trees = Giant Trees +hud-map-tree = Giant Tree +hud-map-town = Town +hud-map-castle = Castle +hud-map-dungeon = Dungeon +hud-map-difficulty_dungeon = + Dungeon + + Difficulty: { $difficulty } +hud-map-drag = Drag +hud-map-zoom = Zoom +hud-map-mid_click = Set Waypoint +hud-map-recenter = Recenter +hud-map-marked_location = Marked Location +hud-map-marked_location_remove = Click to remove +hud-map-change_map_mode = Change Map Mode +hud-map-toggle_minimap_voxel = Toggle Minimap Voxel View +hud-map-zoom_minimap_explanation = + Zoom in the Minimap to see + the area around you in higher detail +hud-map-gnarling = Gnarling Fortification +hud-map-placed_by = Placed by { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/map.ron b/assets/voxygen/i18n/en/hud/map.ron deleted file mode 100644 index efd688821f..0000000000 --- a/assets/voxygen/i18n/en/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Map", - "hud.map.qlog_title": "Quests", - "hud.map.topo_map": "Topographic", - "hud.map.difficulty": "Difficulty", - "hud.map.towns": "Towns", - "hud.map.castles": "Castles", - "hud.map.dungeons": "Dungeons", - "hud.map.caves": "Caves", - "hud.map.cave": "Cave", - "hud.map.peaks": "Mountains", - "hud.map.biomes": "Biomes", - "hud.map.voxel_map": "Voxel map", - "hud.map.trees": "Giant Trees", - "hud.map.tree": "Giant Tree", - "hud.map.town": "Town", - "hud.map.castle": "Castle", - "hud.map.dungeon": "Dungeon", - "hud.map.difficulty_dungeon": "Dungeon\n\nDifficulty: {difficulty}", - "hud.map.drag": "Drag", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Set Waypoint", - "hud.map.recenter": "Recenter", - "hud.map.marked_location": "Marked Location", - "hud.map.marked_location_remove": "Click to remove", - "hud.map.change_map_mode": "Change Map Mode", - "hud.map.toggle_minimap_voxel": "Toggle Minimap Voxel View", - "hud.map.zoom_minimap_explanation": "Zoom in the Minimap to see\nthe area around you in higher detail", - "hud.map.gnarling": "Gnarling Fortification", - "hud.map.placed_by": "Placed by {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/misc.ftl b/assets/voxygen/i18n/en/hud/misc.ftl new file mode 100644 index 0000000000..6511d5b878 --- /dev/null +++ b/assets/voxygen/i18n/en/hud/misc.ftl @@ -0,0 +1,46 @@ +hud-do_not_show_on_startup = Don't show this on Startup +hud-show_tips = Show Tips +hud-quests = Quests +hud-you_died = You Died +hud-waypoint_saved = Waypoint Saved +hud-sp_arrow_txt = SP +hud-inventory_full = Inventory Full +hud-someone_else = someone else +hud-another_group = another group +hud-owned_by_for_secs = Owned by { $name } for { $secs } secs +hud-press_key_to_show_keybindings_fmt = [{ $key }] Keybindings +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lantern +hud-press_key_to_show_debug_info_fmt = Press { $key } to show debug info +hud-press_key_to_toggle_keybindings_fmt = Press { $key } to toggle keybindings +hud-press_key_to_toggle_debug_info_fmt = Press { $key } to toggle debug info +hud-press_key_to_respawn = Press { $key } to respawn at the last campfire you visited. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Press [ { $key } ] to free your cursor and click this button! +hud-tutorial_elements = Crafting +hud-temp_quest_headline = Greetings Traveller! +hud-temp_quest_text = + To begin your journey you could start looking through this village and gather some supplies. + + You are welcome to take whatever you need on your journey! + + Look at the bottom right of the screen to find various things like your bag, the crafting menu and the map. + + The crafting stations allow you to create armor, weapons, food and much more! + + The wild animals all around town are a great source of Animal Hide to create some protection against the dangers of the world. + + Whenever you feel ready, try to get even better equipment from the many challenges marked on your map! +hud-spell = Spells +hud-diary = Diary +hud-free_look_indicator = Free look active. Press { $key } to disable. +hud-camera_clamp_indicator = Camera vertical clamp active. Press { $key } to disable. +hud-auto_walk_indicator = Auto walk/swim active +hud-collect = Collect +hud-pick_up = Pick up +hud-open = Open +hud-use = Use +hud-mine = Mine +hud-talk = Talk +hud-trade = Trade +hud-mount = Mount +hud-sit = Sit \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/misc.ron b/assets/voxygen/i18n/en/hud/misc.ron deleted file mode 100644 index 96db110eb4..0000000000 --- a/assets/voxygen/i18n/en/hud/misc.ron +++ /dev/null @@ -1,66 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.do_not_show_on_startup": "Don't show this on Startup", - "hud.show_tips": "Show Tips", - "hud.quests": "Quests", - "hud.you_died": "You Died", - "hud.waypoint_saved": "Waypoint Saved", - "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Inventory Full", - "hud.someone_else": "someone else", - "hud.another_group": "another group", - "hud.owned_by_for_secs": "Owned by {name} for {secs} secs", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Keybindings", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lantern", - "hud.press_key_to_show_debug_info_fmt": "Press {key} to show debug info", - "hud.press_key_to_toggle_keybindings_fmt": "Press {key} to toggle keybindings", - "hud.press_key_to_toggle_debug_info_fmt": "Press {key} to toggle debug info", - - // Respawn message - "hud.press_key_to_respawn": r#"Press {key} to respawn at the last campfire you visited."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Press [ {key} ] to free your cursor and click this button!"#, - "hud.tutorial_elements": r#"Crafting"#, - -"hud.temp_quest_headline": r#"Greetings Traveller!"#, -"hud.temp_quest_text": r#"To begin your journey you could start looking through this village and gather some supplies. - -You are welcome to take whatever you need on your journey! - -Look at the bottom right of the screen to find various things like your bag, the crafting menu and the map. - -The crafting stations allow you to create armor, weapons, food and much more! - -The wild animals all around town are a great source of Animal Hide to create some protection against the dangers of the world. - -Whenever you feel ready, try to get even better equipment from the many challenges marked on your map! -"#, - - "hud.spell": "Spells", - // Diary - "hud.diary": "Diary", - - "hud.free_look_indicator": "Free look active. Press {key} to disable.", - "hud.camera_clamp_indicator": "Camera vertical clamp active. Press {key} to disable.", - "hud.auto_walk_indicator": "Auto walk/swim active", - "hud.collect": "Collect", - "hud.pick_up": "Pick up", - "hud.open": "Open", - "hud.use": "Use", - "hud.mine": "Mine", - "hud.talk": "Talk", - "hud.trade": "Trade", - "hud.mount": "Mount", - "hud.sit": "Sit", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/sct.ftl b/assets/voxygen/i18n/en/hud/sct.ftl new file mode 100644 index 0000000000..132666c498 --- /dev/null +++ b/assets/voxygen/i18n/en/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOCKED \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/sct.ron b/assets/voxygen/i18n/en/hud/sct.ron deleted file mode 100644 index 62e47bc983..0000000000 --- a/assets/voxygen/i18n/en/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOCKED", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/settings.ftl b/assets/voxygen/i18n/en/hud/settings.ftl new file mode 100644 index 0000000000..237f222772 --- /dev/null +++ b/assets/voxygen/i18n/en/hud/settings.ftl @@ -0,0 +1,135 @@ +hud-settings-general = General +hud-settings-none = None +hud-settings-press_behavior-toggle = Toggle +hud-settings-press_behavior-hold = Hold +hud-settings-help_window = Help Window +hud-settings-debug_info = Debug Info +hud-settings-show_hitboxes = Show hitboxes +hud-settings-show_chat = Show chat +hud-settings-show_hotkey_hints = Show hotkey hints +hud-settings-tips_on_startup = Tips-On-Startup +hud-settings-ui_scale = UI-Scale +hud-settings-relative_scaling = Relative Scaling +hud-settings-custom_scaling = Custom Scaling +hud-settings-crosshair = Crosshair +hud-settings-opacity = Opacity +hud-settings-hotbar = Hotbar +hud-settings-toggle_shortcuts = Toggle Shortcuts +hud-settings-buffs_skillbar = Buffs at Skillbar +hud-settings-buffs_mmap = Buffs at Minimap +hud-settings-toggle_bar_experience = Toggle Experience Bar +hud-settings-scrolling_combat_text = Scrolling Combat Text +hud-settings-damage_accumulation_duration = Damage Accumulation Duration +hud-settings-incoming_damage = Incoming Damage +hud-settings-incoming_damage_accumulation_duration = Incoming Damage Accumulation Duration +hud-settings-round_damage = Round Damage +hud-settings-speech_bubble = Speech Bubble +hud-settings-speech_bubble_self = Show Own Speech Bubbles +hud-settings-speech_bubble_dark_mode = Speech Bubble Dark Mode +hud-settings-speech_bubble_icon = Speech Bubble Icon +hud-settings-energybar_numbers = Energybar Numbers +hud-settings-always_show_bars = Always show Energybars +hud-settings-experience_numbers = Experience Numbers +hud-settings-accumulate_experience = Accumulate Experience Numbers +hud-settings-values = Values +hud-settings-percentages = Percentages +hud-settings-chat = Chat +hud-settings-background_opacity = Background Opacity +hud-settings-chat_character_name = Character Names in Chat +hud-settings-loading_tips = Loading Screen Tips +hud-settings-reset_interface = Reset to Defaults +hud-settings-pan_sensitivity = Pan Sensitivity +hud-settings-zoom_sensitivity = Zoom Sensitivity +hud-settings-camera_clamp_angle = Angle for vertical camera clamp mode +hud-settings-invert_scroll_zoom = Invert Scroll Zoom +hud-settings-invert_mouse_y_axis = Invert Mouse Y Axis +hud-settings-invert_controller_y_axis = Invert Controller Y Axis +hud-settings-enable_mouse_smoothing = Camera Smoothing +hud-settings-free_look_behavior = Free look behavior +hud-settings-auto_walk_behavior = Auto walk behavior +hud-settings-camera_clamp_behavior = Camera clamp behavior +hud-settings-player_physics_behavior = Player physics (experimental) +hud-settings-stop_auto_walk_on_input = Stop auto walk on movement +hud-settings-auto_camera = Auto camera +hud-settings-bow_zoom = Zoom in when charging bow +hud-settings-reset_gameplay = Reset to Defaults +hud-settings-view_distance = View Distance +hud-settings-lod_distance = LoD Distance +hud-settings-sprites_view_distance = Sprites View Distance +hud-settings-figures_view_distance = Entities View Distance +hud-settings-maximum_fps = Maximum FPS +hud-settings-background_fps = Background FPS +hud-settings-present_mode = Present Mode +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = Field of View (deg) +hud-settings-gamma = Gamma +hud-settings-exposure = Exposure +hud-settings-ambiance = Ambiance Brightness +hud-settings-antialiasing_mode = AntiAliasing Mode +hud-settings-upscale_factor = Internal Resolution +hud-settings-cloud_rendering_mode = Cloud Rendering Mode +hud-settings-fluid_rendering_mode = Fluid Rendering Mode +hud-settings-fluid_rendering_mode-cheap = Cheap +hud-settings-fluid_rendering_mode-shiny = Shiny +hud-settings-cloud_rendering_mode-minimal = Minimal +hud-settings-cloud_rendering_mode-low = Low +hud-settings-cloud_rendering_mode-medium = Medium +hud-settings-cloud_rendering_mode-high = High +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Fullscreen +hud-settings-fullscreen_mode = Fullscreen Mode +hud-settings-fullscreen_mode-exclusive = Exclusive +hud-settings-fullscreen_mode-borderless = Borderless +hud-settings-gpu_profiler = Enable GPU timing (not supported everywhere) +hud-settings-particles = Particles +hud-settings-lossy_terrain_compression = Lossy terrain compression +hud-settings-weapon_trails = Weapon trails +hud-settings-flashing_lights = Flashing lights +hud-settings-flashing_lights_info = Disables all kinds of flashing, e.g. flickering or lightning strikes +hud-settings-resolution = Resolution +hud-settings-bit_depth = Bit Depth +hud-settings-refresh_rate = Refresh Rate +hud-settings-lighting_rendering_mode = Lighting Rendering Mode +hud-settings-lighting_rendering_mode-ashikhmin = Type A - High +hud-settings-lighting_rendering_mode-blinnphong = Type B - Medium +hud-settings-lighting_rendering_mode-lambertian = Type L - Cheap +hud-settings-shadow_rendering_mode = Shadow Rendering Mode +hud-settings-shadow_rendering_mode-none = None +hud-settings-shadow_rendering_mode-cheap = Cheap +hud-settings-shadow_rendering_mode-map = Map +hud-settings-shadow_rendering_mode-map-resolution = Resolution +hud-settings-rain_occlusion-resolution = Rain Occlusion Resolution +hud-settings-lod_detail = LoD Detail +hud-settings-save_window_size = Save window size +hud-settings-reset_graphics = Reset to Defaults +hud-settings-bloom = Bloom +hud-settings-point_glow = Point Glow +hud-settings-master_volume = Master Volume +hud-settings-inactive_master_volume_perc = Inactive Window Volume +hud-settings-music_volume = Music Volume +hud-settings-sound_effect_volume = Sound Effects Volume +hud-settings-ambience_volume = Ambience Volume +hud-settings-music_frequency = Gap Between Songs +hud-settings-audio_device = Audio Device +hud-settings-reset_sound = Reset to Defaults +hud-settings-english_fallback = Display English for missing translations +hud-settings-awaitingkey = Press a key... +hud-settings-unbound = None +hud-settings-reset_keybinds = Reset to Defaults +hud-settings-chat_tabs = Chat Tabs +hud-settings-label = Label: +hud-settings-delete = Delete +hud-settings-show_all = Show all +hud-settings-messages = Messages +hud-settings-activity = Activity +hud-settings-death = Death +hud-settings-group = Group +hud-settings-faction = Faction +hud-settings-world = World +hud-settings-region = Region +hud-settings-say = Say +hud-settings-all = All +hud-settings-group_only = Group only +hud-settings-reset_chat = Reset to Defaults \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/settings.ron b/assets/voxygen/i18n/en/hud/settings.ron deleted file mode 100644 index d62bbfb0e1..0000000000 --- a/assets/voxygen/i18n/en/hud/settings.ron +++ /dev/null @@ -1,153 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Settings - "hud.settings.general": "General", - "hud.settings.none": "None", - "hud.settings.press_behavior.toggle": "Toggle", - "hud.settings.press_behavior.hold": "Hold", - "hud.settings.help_window": "Help Window", - "hud.settings.debug_info": "Debug Info", - "hud.settings.show_hitboxes": "Show hitboxes", - "hud.settings.show_chat": "Show chat", - "hud.settings.show_hotkey_hints": "Show hotkey hints", - "hud.settings.tips_on_startup": "Tips-On-Startup", - "hud.settings.ui_scale": "UI-Scale", - "hud.settings.relative_scaling": "Relative Scaling", - "hud.settings.custom_scaling": "Custom Scaling", - "hud.settings.crosshair": "Crosshair", - "hud.settings.opacity": "Opacity", - "hud.settings.hotbar": "Hotbar", - "hud.settings.toggle_shortcuts": "Toggle Shortcuts", - "hud.settings.buffs_skillbar": "Buffs at Skillbar", - "hud.settings.buffs_mmap": "Buffs at Minimap", - "hud.settings.toggle_bar_experience": "Toggle Experience Bar", - "hud.settings.scrolling_combat_text": "Scrolling Combat Text", - "hud.settings.damage_accumulation_duration": "Damage Accumulation Duration", - "hud.settings.incoming_damage": "Incoming Damage", - "hud.settings.incoming_damage_accumulation_duration": "Incoming Damage Accumulation Duration", - "hud.settings.round_damage": "Round Damage", - "hud.settings.speech_bubble": "Speech Bubble", - "hud.settings.speech_bubble_self": "Show Own Speech Bubbles", - "hud.settings.speech_bubble_dark_mode": "Speech Bubble Dark Mode", - "hud.settings.speech_bubble_icon": "Speech Bubble Icon", - "hud.settings.energybar_numbers": "Energybar Numbers", - "hud.settings.always_show_bars": "Always show Energybars", - "hud.settings.experience_numbers": "Experience Numbers", - "hud.settings.accumulate_experience": "Accumulate Experience Numbers", - "hud.settings.values": "Values", - "hud.settings.percentages": "Percentages", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Background Opacity", - "hud.settings.chat_character_name": "Character Names in Chat", - "hud.settings.loading_tips": "Loading Screen Tips", - "hud.settings.reset_interface": "Reset to Defaults", - - "hud.settings.pan_sensitivity": "Pan Sensitivity", - "hud.settings.zoom_sensitivity": "Zoom Sensitivity", - "hud.settings.camera_clamp_angle": "Angle for vertical camera clamp mode", - "hud.settings.invert_scroll_zoom": "Invert Scroll Zoom", - "hud.settings.invert_mouse_y_axis": "Invert Mouse Y Axis", - "hud.settings.invert_controller_y_axis": "Invert Controller Y Axis", - "hud.settings.enable_mouse_smoothing": "Camera Smoothing", - "hud.settings.free_look_behavior": "Free look behavior", - "hud.settings.auto_walk_behavior": "Auto walk behavior", - "hud.settings.camera_clamp_behavior": "Camera clamp behavior", - "hud.settings.player_physics_behavior": "Player physics (experimental)", - "hud.settings.stop_auto_walk_on_input": "Stop auto walk on movement", - "hud.settings.auto_camera": "Auto camera", - "hud.settings.bow_zoom": "Zoom in when charging bow", - "hud.settings.reset_gameplay": "Reset to Defaults", - - "hud.settings.view_distance": "View Distance", - "hud.settings.lod_distance": "LoD Distance", - "hud.settings.sprites_view_distance": "Sprites View Distance", - "hud.settings.figures_view_distance": "Entities View Distance", - "hud.settings.maximum_fps": "Maximum FPS", - "hud.settings.background_fps": "Background FPS", - "hud.settings.present_mode": "Present Mode", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "Field of View (deg)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Exposure", - "hud.settings.ambiance": "Ambiance Brightness", - "hud.settings.antialiasing_mode": "AntiAliasing Mode", - "hud.settings.upscale_factor": "Internal Resolution", - "hud.settings.cloud_rendering_mode": "Cloud Rendering Mode", - "hud.settings.fluid_rendering_mode": "Fluid Rendering Mode", - "hud.settings.fluid_rendering_mode.cheap": "Cheap", - "hud.settings.fluid_rendering_mode.shiny": "Shiny", - "hud.settings.cloud_rendering_mode.minimal": "Minimal", - "hud.settings.cloud_rendering_mode.low": "Low", - "hud.settings.cloud_rendering_mode.medium": "Medium", - "hud.settings.cloud_rendering_mode.high": "High", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Fullscreen", - "hud.settings.fullscreen_mode": "Fullscreen Mode", - "hud.settings.fullscreen_mode.exclusive": "Exclusive", - "hud.settings.fullscreen_mode.borderless": "Borderless", - "hud.settings.gpu_profiler": "Enable GPU timing (not supported everywhere)", - "hud.settings.particles": "Particles", - "hud.settings.lossy_terrain_compression": "Lossy terrain compression", - "hud.settings.weapon_trails": "Weapon trails", - "hud.settings.flashing_lights": "Flashing lights", - "hud.settings.flashing_lights_info": "Disables all kinds of flashing, e.g. flickering or lightning strikes", - "hud.settings.resolution": "Resolution", - "hud.settings.bit_depth": "Bit Depth", - "hud.settings.refresh_rate": "Refresh Rate", - "hud.settings.lighting_rendering_mode": "Lighting Rendering Mode", - "hud.settings.lighting_rendering_mode.ashikhmin": "Type A - High ", - "hud.settings.lighting_rendering_mode.blinnphong": "Type B - Medium", - "hud.settings.lighting_rendering_mode.lambertian": "Type L - Cheap", - "hud.settings.shadow_rendering_mode": "Shadow Rendering Mode", - "hud.settings.shadow_rendering_mode.none": "None", - "hud.settings.shadow_rendering_mode.cheap": "Cheap", - "hud.settings.shadow_rendering_mode.map": "Map", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolution", - "hud.settings.rain_occlusion.resolution": "Rain Occlusion Resolution", - "hud.settings.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Save window size", - "hud.settings.reset_graphics": "Reset to Defaults", - "hud.settings.bloom": "Bloom", - "hud.settings.point_glow": "Point Glow", - - "hud.settings.master_volume": "Master Volume", - "hud.settings.inactive_master_volume_perc": "Inactive Window Volume", - "hud.settings.music_volume": "Music Volume", - "hud.settings.sound_effect_volume": "Sound Effects Volume", - "hud.settings.ambience_volume": "Ambience Volume", - "hud.settings.music_frequency": "Gap Between Songs", - "hud.settings.audio_device": "Audio Device", - "hud.settings.reset_sound": "Reset to Defaults", - - "hud.settings.english_fallback": "Display English for missing translations", - - "hud.settings.awaitingkey": "Press a key...", - "hud.settings.unbound": "None", - "hud.settings.reset_keybinds": "Reset to Defaults", - - "hud.settings.chat_tabs": "Chat Tabs", - "hud.settings.label": "Label:", - "hud.settings.delete": "Delete", - "hud.settings.show_all": "Show all", - "hud.settings.messages": "Messages", - "hud.settings.activity": "Activity", - "hud.settings.death": "Death", - "hud.settings.group": "Group", - "hud.settings.faction": "Faction", - "hud.settings.world": "World", - "hud.settings.region": "Region", - "hud.settings.say": "Say", - "hud.settings.all": "All", - "hud.settings.group_only": "Group only", - "hud.settings.reset_chat" : "Reset to Defaults", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/skills.ftl b/assets/voxygen/i18n/en/hud/skills.ftl new file mode 100644 index 0000000000..ef4677c5f7 --- /dev/null +++ b/assets/voxygen/i18n/en/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = New Skillpoint +hud-skill-sp_available = { $number } SP available +hud-skill-not_unlocked = Not yet unlocked +hud-skill-req_sp ={"\u000A"} + + Requires { $number } SP +hud-skill-inc_health_title = Increase Health +hud-skill-inc_health = Increases max health by { $boost }{ $SP } +hud-skill-inc_energy_title = Increase Energy +hud-skill-inc_energy = Increases max energy by { $boost }{ $SP } +hud-skill-unlck_sword_title = Unlock Sword +hud-skill-unlck_sword = Unlocks sword skill tree{ $SP } +hud-skill-unlck_axe_title = Unlock Axe +hud-skill-unlck_axe = Unlocks axe skill tree{ $SP } +hud-skill-unlck_hammer_title = Unlock Hammer +hud-skill-unlck_hammer = Unlocks hammer skill tree{ $SP } +hud-skill-unlck_bow_title = Unlock Bow +hud-skill-unlck_bow = Unlocks bow skill tree{ $SP } +hud-skill-unlck_staff_title = Unlock Staff +hud-skill-unlck_staff = Unlocks staff skill tree{ $SP } +hud-skill-unlck_sceptre_title = Unlock Sceptre +hud-skill-unlck_sceptre = Unlocks sceptre skill tree{ $SP } +hud-skill-dodge_title = Dodge +hud-skill-dodge = Dodge rolls are triggered with middle-click, and grant temporary immunity to melee attacks (iframes) while you're rolling. +hud-skill-roll_energy_title = Roll Energy Cost +hud-skill-roll_energy = Rolling uses { $boost }% less energy{ $SP } +hud-skill-roll_speed_title = Rolling Speed +hud-skill-roll_speed = Roll { $boost }% faster{ $SP } +hud-skill-roll_dur_title = Rolling Duration +hud-skill-roll_dur = Roll for { $boost }% more time{ $SP } +hud-skill-climbing_title = Climbing +hud-skill-climbing = Jumping higher +hud-skill-climbing_cost_title = Climbing Cost +hud-skill-climbing_cost = Climbing uses { $boost }% less energy{ $SP } +hud-skill-climbing_speed_title = Climbing Speed +hud-skill-climbing_speed = Climb { $boost }% faster{ $SP } +hud-skill-swim_title = Swimming +hud-skill-swim = Moving in wet environment +hud-skill-swim_speed_title = Swimming Speed +hud-skill-swim_speed = Swim { $boost }% faster{ $SP } +hud-skill-sc_lifesteal_title = Lifesteal Beam +hud-skill-sc_lifesteal = Drain the life from your enemies +hud-skill-sc_lifesteal_damage_title = Damage +hud-skill-sc_lifesteal_damage = Deal { $boost }% more damage{ $SP } +hud-skill-sc_lifesteal_range_title = Range +hud-skill-sc_lifesteal_range = Your beam reaches { $boost }% further{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Lifesteal +hud-skill-sc_lifesteal_lifesteal = Convert an additional { $boost }% of damage into health{ $SP } +hud-skill-sc_lifesteal_regen_title = Energy Regen +hud-skill-sc_lifesteal_regen = Replenish your energy by an additional { $boost }%{ $SP } +hud-skill-sc_heal_title = Healing Aura +hud-skill-sc_heal = Heal your allies using the blood of your enemies, requires combo to activate +hud-skill-sc_heal_heal_title = Heal +hud-skill-sc_heal_heal = Increases the amount you heal by { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Energy Cost +hud-skill-sc_heal_cost = Healing requires { $boost }% less energy{ $SP } +hud-skill-sc_heal_duration_title = Duration +hud-skill-sc_heal_duration = The effects of your healing aura last { $boost }% longer{ $SP } +hud-skill-sc_heal_range_title = Radius +hud-skill-sc_heal_range = Your healing aura reachs { $boost }% further{ $SP } +hud-skill-sc_wardaura_unlock_title = Warding Aura Unlock +hud-skill-sc_wardaura_unlock = Allows you to ward your allies against enemy attacks{ $SP } +hud-skill-sc_wardaura_strength_title = Strength +hud-skill-sc_wardaura_strength = The strength of your protection increases by { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Duration +hud-skill-sc_wardaura_duration = The effects of your ward last { $boost }% longer{ $SP } +hud-skill-sc_wardaura_range_title = Radius +hud-skill-sc_wardaura_range = Your ward reaches { $boost }% further{ $SP } +hud-skill-sc_wardaura_cost_title = Energy Cost +hud-skill-sc_wardaura_cost = Creating the ward requries { $boost }% less energy{ $SP } +hud-skill-st_shockwave_range_title = Shockwave Range +hud-skill-st_shockwave_range = throw things that used to be out of reach, range increased { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Shockwave Cost +hud-skill-st_shockwave_cost = Decreases the energy cost to throw helpless villagers by { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Shockwave Knockback +hud-skill-st_shockwave_knockback = Increases throw potential by { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Shockwave Damage +hud-skill-st_shockwave_damage = Increases the damage done by { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Shockwave Unlock +hud-skill-st_shockwave_unlock = Unlocks the ability to throw enemies away using fire{ $SP } +hud-skill-st_flamethrower_title = Flamethrower +hud-skill-st_flamethrower = Throws fire, cook'em all +hud-skill-st_flame_velocity_title = Flame Velocity +hud-skill-st_flame_velocity = Gets the fire there faster, { $boost }% faster{ $SP } +hud-skill-st_flamethrower_range_title = Flamethrower Range +hud-skill-st_flamethrower_range = For when the flames just won't reach, they go { $boost }% further{ $SP } +hud-skill-st_energy_drain_title = Energy Drain +hud-skill-st_energy_drain = Decreases the rate energy is drained by { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Flamethrower Damage +hud-skill-st_flamethrower_damage = Increases damage by { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Explosion Radius +hud-skill-st_explosion_radius = Bigger is better, increases explosion radius by { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Energy Regen +hud-skill-st_energy_regen = Increases energy gain by { $boost }%{ $SP } +hud-skill-st_fireball_title = Fireball +hud-skill-st_fireball = Shoots a fireball that explodes on impact +hud-skill-st_damage_title = Damage +hud-skill-st_damage = Increases damage by { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Projectile Speed +hud-skill-bow_projectile_speed = Allows you to shoot arrows further, faster, by { $boost }%{ $SP } +hud-skill-bow_charged_title = Charged Shoot +hud-skill-bow_charged = Because you waited longer +hud-skill-bow_charged_damage_title = Charged Damage +hud-skill-bow_charged_damage = Increases damage by { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Charged Regen +hud-skill-bow_charged_energy_regen = Increases energy recovery by { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Charged Knockback +hud-skill-bow_charged_knockback = Knock enemies further back by { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = Charged Speed +hud-skill-bow_charged_speed = Increases the rate that you charge the attack by { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Charged Move Speed +hud-skill-bow_charged_move = Increases how fast you can shuffle while charging the attack by { $boost }%{ $SP } +hud-skill-bow_repeater_title = Repeater +hud-skill-bow_repeater = Shoots faster the longer you fire for +hud-skill-bow_repeater_damage_title = Repeater Damage +hud-skill-bow_repeater_damage = Increases the damage done by { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Repeater Cost +hud-skill-bow_repeater_cost = Decreases the energy cost to become a repeater by { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Repeater Speed +hud-skill-bow_repeater_speed = Increases the rate at which you fire arrows by { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Unlocks Shotgun +hud-skill-bow_shotgun_unlock = Unlocks ability to fire multiple arrows at once{ $SP } +hud-skill-bow_shotgun_damage_title = Shotgun Damage +hud-skill-bow_shotgun_damage = Increases the damage done by { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Shotgun Cost +hud-skill-bow_shotgun_cost = Decreases the cost of shotgun by { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Shotgun Arrows +hud-skill-bow_shotgun_arrow_count = Increases the number of arrows in the burst by { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Shotgun Spread +hud-skill-bow_shotgun_spread = Decreases the spread of the arrows by { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Leap Radius +hud-skill-hmr_leap_radius = Increases attack radius on ground slam by { $boost } meter{ $SP } +hud-skill-hmr_leap_distance_title = Leap Distance +hud-skill-hmr_leap_distance = Increases distance of leap by { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Leap Cost +hud-skill-hmr_leap_cost = Decreases cost of leap by { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Leap Knockback +hud-skill-hmr_leap_knockback = Increases knockback from leap by { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Leap Damage +hud-skill-hmr_leap_damage = Increases damage of leap by { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Unlock Leap +hud-skill-hmr_unlock_leap = Unlocks a leap{ $SP } +hud-skill-hmr_charged_melee_title = Charged Melee +hud-skill-hmr_charged_melee = Melee but with charge +hud-skill-hmr_charged_rate_title = Charge Rate +hud-skill-hmr_charged_rate = Increases the rate that you charge the swing by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Charged Melee Energy Drain +hud-skill-hmr_charged_melee_nrg_drain = Decreases the rate energy drains when charging by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Charged Melee Damage +hud-skill-hmr_charged_melee_damage = Increases the damage of the charged swing by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Charged Melee Knockback +hud-skill-hmr_charged_melee_knockback = Massively increases throw potential of swing by { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Single Strike +hud-skill-hmr_single_strike = As single as you are +hud-skill-hmr_single_strike_regen_title = Single Strike Regen +hud-skill-hmr_single_strike_regen = Increases energy gain with each successive strike{ $SP } +hud-skill-hmr_single_strike_speed_title = Single Strike Speed +hud-skill-hmr_single_strike_speed = Increases the attack speed with each successive strike{ $SP } +hud-skill-hmr_single_strike_damage_title = Single Strike Damage +hud-skill-hmr_single_strike_damage = Increases the damage with each successive strike{ $SP } +hud-skill-hmr_single_strike_knockback_title = Single Strike Knockback +hud-skill-hmr_single_strike_knockback = Increase throw potential of swings by { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Triple Strike +hud-skill-sw_trip_str = Strike, up to three times +hud-skill-sw_trip_str_combo_title = Triple Strike Combo +hud-skill-sw_trip_str_combo = Unlocks combo scaling on triple strike{ $SP } +hud-skill-sw_trip_str_dmg_title = Triple Strike Damage +hud-skill-sw_trip_str_dmg = Increases the damage each successive strike does{ $SP } +hud-skill-sw_trip_str_sp_title = Triple Strike Speed +hud-skill-sw_trip_str_sp = Increases attack speed gained by each successive strike{ $SP } +hud-skill-sw_trip_str_reg_title = Triple Strike Regen +hud-skill-sw_trip_str_reg = Increases energy gain on each successive strike{ $SP } +hud-skill-sw_dash_title = Dash +hud-skill-sw_dash = Pin through your enemies +hud-skill-sw_dash_dmg_title = Dash Damage +hud-skill-sw_dash_dmg = Increases initial damage of the dash by { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Dash Drain +hud-skill-sw_dash_drain = Decreases the rate energy is drained while dashing by { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Dash Cost +hud-skill-sw_dash_cost = Decreases the initial cost of the dash by { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Dash Speed +hud-skill-sw_dash_speed = Increases how fast you go while dashing by { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Charge Through +hud-skill-sw_dash_charge_through = Allows you to charge through the first enemies you hit{ $SP } +hud-skill-sw_dash_scale_title = Dash Scaling Damage +hud-skill-sw_dash_scale = Increases the damage scaling from the dash by { $boost }%{ $SP } +hud-skill-sw_spin_title = Spin Unlock +hud-skill-sw_spin = Unlocks the sword spin{ $SP } +hud-skill-sw_spin_dmg_title = Spin Damage +hud-skill-sw_spin_dmg = Increases the damage done by { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Spin Speed +hud-skill-sw_spin_spd = Increase the speed at which you spin by { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Spin Cost +hud-skill-sw_spin_cost = Decreases the energy cost of each spin by { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Spin Spins +hud-skill-sw_spin_spins = Increases the number of times you can spin{ $SP } +hud-skill-sw_interrupt_title = Interrupting Attacks +hud-skill-sw_interrupt = Allows you to immediately cancel an attack with another attack{ $SP } +hud-skill-axe_double_strike_title = Double Strike +hud-skill-axe_double_strike = Chop down those villains +hud-skill-axe_double_strike_combo_title = Double Strike Combo +hud-skill-axe_double_strike_combo = Unlocks a second strike{ $SP } +hud-skill-axe_double_strike_damage_title = Double Strike Damage +hud-skill-axe_double_strike_damage = Increases the damage dealt in each successive strike{ $SP } +hud-skill-axe_double_strike_speed_title = Double Strike Speed +hud-skill-axe_double_strike_speed = Increases the attack speed with each successive strike{ $SP } +hud-skill-axe_double_strike_regen_title = Double Strike Regen +hud-skill-axe_double_strike_regen = Increases energy gain with each successive strike{ $SP } +hud-skill-axe_spin_title = Axe Spin +hud-skill-axe_spin = You spin it right round ... +hud-skill-axe_infinite_axe_spin_title = Infinite Axe Spin +hud-skill-axe_infinite_axe_spin = Spin for as long as you have energy{ $SP } +hud-skill-axe_spin_damage_title = Spin Damage +hud-skill-axe_spin_damage = Increases the damage each spin does by { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Spin Helicopter +hud-skill-axe_spin_helicopter = You fall a little slower while spinning{ $SP } +hud-skill-axe_spin_speed_title = Spin Speed +hud-skill-axe_spin_speed = Increases your spin speed by { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Spin Cost +hud-skill-axe_spin_cost = Decreases energy cost of spinning by { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Unlock Leap +hud-skill-axe_unlock_leap = Unlocks a leap spin{ $SP } +hud-skill-axe_leap_damage_title = Leap Damage +hud-skill-axe_leap_damage = Increases damage of leap by { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Leap Knockback +hud-skill-axe_leap_knockback = Increases knockback from leap by { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Leap Cost +hud-skill-axe_leap_cost = Decreases cost of leap by { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Leap Distance +hud-skill-axe_leap_distance = Increases distance of leap by { $boost }%{ $SP } +hud-skill-mining_title = Mining +hud-skill-pick_strike_title = Pickaxe Strike +hud-skill-pick_strike = Hit rocks with the pickaxe to gain ore, gems and experience +hud-skill-pick_strike_speed_title = Pickaxe Strike Speed +hud-skill-pick_strike_speed = Mine rocks faster{ $SP } +hud-skill-pick_strike_oregain_title = Pickaxe Strike Ore Yield +hud-skill-pick_strike_oregain = Chance to gain extra ore ({ $boost }% per level){ $SP } +hud-skill-pick_strike_gemgain_title = Pickaxe Strike Gem Yield +hud-skill-pick_strike_gemgain = Chance to gain extra gems ({ $boost }% per level){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/skills.ron b/assets/voxygen/i18n/en/hud/skills.ron deleted file mode 100644 index 139e263fe8..0000000000 --- a/assets/voxygen/i18n/en/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.rank_up": "New Skillpoint", - "hud.skill.sp_available": "{number} SP available", - "hud.skill.not_unlocked": "Not yet unlocked", - "hud.skill.req_sp": "\n\nRequires {number} SP", - // Skills - // General - "hud.skill.inc_health_title": "Increase Health", - "hud.skill.inc_health": "Increases max health by {boost}{SP}", - "hud.skill.inc_energy_title": "Increase Energy", - "hud.skill.inc_energy": "Increases max energy by {boost}{SP}", - "hud.skill.unlck_sword_title": "Unlock Sword", - "hud.skill.unlck_sword": "Unlocks sword skill tree{SP}", - "hud.skill.unlck_axe_title": "Unlock Axe", - "hud.skill.unlck_axe": "Unlocks axe skill tree{SP}", - "hud.skill.unlck_hammer_title": "Unlock Hammer", - "hud.skill.unlck_hammer": "Unlocks hammer skill tree{SP}", - "hud.skill.unlck_bow_title": "Unlock Bow", - "hud.skill.unlck_bow": "Unlocks bow skill tree{SP}", - "hud.skill.unlck_staff_title": "Unlock Staff", - "hud.skill.unlck_staff": "Unlocks staff skill tree{SP}", - "hud.skill.unlck_sceptre_title": "Unlock Sceptre", - "hud.skill.unlck_sceptre": "Unlocks sceptre skill tree{SP}", - "hud.skill.dodge_title": "Dodge", - "hud.skill.dodge": "Dodge rolls are triggered with middle-click, and grant temporary immunity to melee attacks (iframes) while you're rolling.", - "hud.skill.roll_energy_title": "Roll Energy Cost", - "hud.skill.roll_energy": "Rolling uses {boost}% less energy{SP}", - "hud.skill.roll_speed_title": "Rolling Speed", - "hud.skill.roll_speed": "Roll {boost}% faster{SP}", - "hud.skill.roll_dur_title": "Rolling Duration", - "hud.skill.roll_dur": "Roll for {boost}% more time{SP}", - "hud.skill.climbing_title": "Climbing", - "hud.skill.climbing": "Jumping higher", - "hud.skill.climbing_cost_title": "Climbing Cost", - "hud.skill.climbing_cost": "Climbing uses {boost}% less energy{SP}", - "hud.skill.climbing_speed_title": "Climbing Speed", - "hud.skill.climbing_speed": "Climb {boost}% faster{SP}", - "hud.skill.swim_title": "Swimming", - "hud.skill.swim": "Moving in wet environment", - "hud.skill.swim_speed_title": "Swimming Speed", - "hud.skill.swim_speed": "Swim {boost}% faster{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Lifesteal Beam", - "hud.skill.sc_lifesteal": "Drain the life from your enemies", - "hud.skill.sc_lifesteal_damage_title": "Damage", - "hud.skill.sc_lifesteal_damage": "Deal {boost}% more damage{SP}", - "hud.skill.sc_lifesteal_range_title": "Range", - "hud.skill.sc_lifesteal_range": "Your beam reaches {boost}% further{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Lifesteal", - "hud.skill.sc_lifesteal_lifesteal": "Convert an additional {boost}% of damage into health{SP}", - "hud.skill.sc_lifesteal_regen_title": "Energy Regen", - "hud.skill.sc_lifesteal_regen": "Replenish your energy by an additional {boost}%{SP}", - "hud.skill.sc_heal_title": "Healing Aura", - "hud.skill.sc_heal": "Heal your allies using the blood of your enemies, requires combo to activate", - "hud.skill.sc_heal_heal_title": "Heal", - "hud.skill.sc_heal_heal": "Increases the amount you heal by {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Energy Cost", - "hud.skill.sc_heal_cost": "Healing requires {boost}% less energy{SP}", - "hud.skill.sc_heal_duration_title": "Duration", - "hud.skill.sc_heal_duration": "The effects of your healing aura last {boost}% longer{SP}", - "hud.skill.sc_heal_range_title": "Radius", - "hud.skill.sc_heal_range": "Your healing aura reachs {boost}% further{SP}", - "hud.skill.sc_wardaura_unlock_title": "Warding Aura Unlock", - "hud.skill.sc_wardaura_unlock": "Allows you to ward your allies against enemy attacks{SP}", - "hud.skill.sc_wardaura_strength_title": "Strength", - "hud.skill.sc_wardaura_strength": "The strength of your protection increases by {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Duration", - "hud.skill.sc_wardaura_duration": "The effects of your ward last {boost}% longer{SP}", - "hud.skill.sc_wardaura_range_title": "Radius", - "hud.skill.sc_wardaura_range": "Your ward reaches {boost}% further{SP}", - "hud.skill.sc_wardaura_cost_title": "Energy Cost", - "hud.skill.sc_wardaura_cost": "Creating the ward requries {boost}% less energy{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Shockwave Range", - "hud.skill.st_shockwave_range" : "throw things that used to be out of reach, range increased {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Shockwave Cost", - "hud.skill.st_shockwave_cost" : "Decreases the energy cost to throw helpless villagers by {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Shockwave Knockback", - "hud.skill.st_shockwave_knockback" : "Increases throw potential by {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Shockwave Damage", - "hud.skill.st_shockwave_damage" : "Increases the damage done by {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Shockwave Unlock", - "hud.skill.st_shockwave_unlock" : "Unlocks the ability to throw enemies away using fire{SP}", - "hud.skill.st_flamethrower_title" : "Flamethrower", - "hud.skill.st_flamethrower" : "Throws fire, cook'em all", - "hud.skill.st_flame_velocity_title" : "Flame Velocity", - "hud.skill.st_flame_velocity" : "Gets the fire there faster, {boost}% faster{SP}", - "hud.skill.st_flamethrower_range_title" : "Flamethrower Range", - "hud.skill.st_flamethrower_range" : "For when the flames just won't reach, they go {boost}% further{SP}", - "hud.skill.st_energy_drain_title" : "Energy Drain", - "hud.skill.st_energy_drain" : "Decreases the rate energy is drained by {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Flamethrower Damage", - "hud.skill.st_flamethrower_damage" : "Increases damage by {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Explosion Radius", - "hud.skill.st_explosion_radius" : "Bigger is better, increases explosion radius by {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Energy Regen", - "hud.skill.st_energy_regen" : "Increases energy gain by {boost}%{SP}", - "hud.skill.st_fireball_title" : "Fireball", - "hud.skill.st_fireball" : "Shoots a fireball that explodes on impact", - "hud.skill.st_damage_title" : "Damage", - "hud.skill.st_damage" : "Increases damage by {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Projectile Speed", - "hud.skill.bow_projectile_speed" : "Allows you to shoot arrows further, faster, by {boost}%{SP}", - "hud.skill.bow_charged_title" : "Charged Shoot", - "hud.skill.bow_charged" : "Because you waited longer", - "hud.skill.bow_charged_damage_title" : "Charged Damage", - "hud.skill.bow_charged_damage" : "Increases damage by {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Charged Regen", - "hud.skill.bow_charged_energy_regen" : "Increases energy recovery by {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Charged Knockback", - "hud.skill.bow_charged_knockback" : "Knock enemies further back by {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "Charged Speed", - "hud.skill.bow_charged_speed" : "Increases the rate that you charge the attack by {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Charged Move Speed", - "hud.skill.bow_charged_move" : "Increases how fast you can shuffle while charging the attack by {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Repeater", - "hud.skill.bow_repeater" : "Shoots faster the longer you fire for", - "hud.skill.bow_repeater_damage_title" : "Repeater Damage", - "hud.skill.bow_repeater_damage" : "Increases the damage done by {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Repeater Cost", - "hud.skill.bow_repeater_cost" : "Decreases the energy cost to become a repeater by {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Repeater Speed", - "hud.skill.bow_repeater_speed" : "Increases the rate at which you fire arrows by {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Unlocks Shotgun", - "hud.skill.bow_shotgun_unlock" : "Unlocks ability to fire multiple arrows at once{SP}", - "hud.skill.bow_shotgun_damage_title" : "Shotgun Damage", - "hud.skill.bow_shotgun_damage" : "Increases the damage done by {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Shotgun Cost", - "hud.skill.bow_shotgun_cost" : "Decreases the cost of shotgun by {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Shotgun Arrows", - "hud.skill.bow_shotgun_arrow_count" : "Increases the number of arrows in the burst by {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Shotgun Spread", - "hud.skill.bow_shotgun_spread" : "Decreases the spread of the arrows by {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Leap Radius", - "hud.skill.hmr_leap_radius" : "Increases attack radius on ground slam by {boost} meter{SP}", - "hud.skill.hmr_leap_distance_title" : "Leap Distance", - "hud.skill.hmr_leap_distance" : "Increases distance of leap by {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Leap Cost", - "hud.skill.hmr_leap_cost" : "Decreases cost of leap by {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Leap Knockback", - "hud.skill.hmr_leap_knockback" : "Increases knockback from leap by {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Leap Damage", - "hud.skill.hmr_leap_damage" : "Increases damage of leap by {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Unlock Leap", - "hud.skill.hmr_unlock_leap" : "Unlocks a leap{SP}", - "hud.skill.hmr_charged_melee_title" : "Charged Melee", - "hud.skill.hmr_charged_melee" : "Melee but with charge", - "hud.skill.hmr_charged_rate_title" : "Charge Rate", - "hud.skill.hmr_charged_rate" : "Increases the rate that you charge the swing by {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Charged Melee Energy Drain", - "hud.skill.hmr_charged_melee_nrg_drain" : "Decreases the rate energy drains when charging by {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Charged Melee Damage", - "hud.skill.hmr_charged_melee_damage" : "Increases the damage of the charged swing by {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Charged Melee Knockback", - "hud.skill.hmr_charged_melee_knockback" : "Massively increases throw potential of swing by {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Single Strike", - "hud.skill.hmr_single_strike" : "As single as you are", - "hud.skill.hmr_single_strike_regen_title" : "Single Strike Regen", - "hud.skill.hmr_single_strike_regen" : "Increases energy gain with each successive strike{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Single Strike Speed", - "hud.skill.hmr_single_strike_speed" : "Increases the attack speed with each successive strike{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Single Strike Damage", - "hud.skill.hmr_single_strike_damage" : "Increases the damage with each successive strike{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Single Strike Knockback", - "hud.skill.hmr_single_strike_knockback" : "Increase throw potential of swings by {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Triple Strike", - "hud.skill.sw_trip_str": "Strike, up to three times", - "hud.skill.sw_trip_str_combo_title": "Triple Strike Combo", - "hud.skill.sw_trip_str_combo": "Unlocks combo scaling on triple strike{SP}", - "hud.skill.sw_trip_str_dmg_title": "Triple Strike Damage", - "hud.skill.sw_trip_str_dmg": "Increases the damage each successive strike does{SP}", - "hud.skill.sw_trip_str_sp_title": "Triple Strike Speed", - "hud.skill.sw_trip_str_sp": "Increases attack speed gained by each successive strike{SP}", - "hud.skill.sw_trip_str_reg_title": "Triple Strike Regen", - "hud.skill.sw_trip_str_reg": "Increases energy gain on each successive strike{SP}", - "hud.skill.sw_dash_title": "Dash", - "hud.skill.sw_dash": "Pin through your enemies", - "hud.skill.sw_dash_dmg_title": "Dash Damage", - "hud.skill.sw_dash_dmg": "Increases initial damage of the dash by {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Dash Drain", - "hud.skill.sw_dash_drain": "Decreases the rate energy is drained while dashing by {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Dash Cost", - "hud.skill.sw_dash_cost": "Decreases the initial cost of the dash by {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Dash Speed", - "hud.skill.sw_dash_speed": "Increases how fast you go while dashing by {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Charge Through", - "hud.skill.sw_dash_charge_through": "Allows you to charge through the first enemies you hit{SP}", - "hud.skill.sw_dash_scale_title": "Dash Scaling Damage", - "hud.skill.sw_dash_scale": "Increases the damage scaling from the dash by {boost}%{SP}", - "hud.skill.sw_spin_title": "Spin Unlock", - "hud.skill.sw_spin": "Unlocks the sword spin{SP}", - "hud.skill.sw_spin_dmg_title": "Spin Damage", - "hud.skill.sw_spin_dmg": "Increases the damage done by {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Spin Speed", - "hud.skill.sw_spin_spd": "Increase the speed at which you spin by {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Spin Cost", - "hud.skill.sw_spin_cost": "Decreases the energy cost of each spin by {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Spin Spins", - "hud.skill.sw_spin_spins": "Increases the number of times you can spin{SP}", - "hud.skill.sw_interrupt_title": "Interrupting Attacks", - "hud.skill.sw_interrupt": "Allows you to immediately cancel an attack with another attack{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Double Strike", - "hud.skill.axe_double_strike": "Chop down those villains", - "hud.skill.axe_double_strike_combo_title": "Double Strike Combo", - "hud.skill.axe_double_strike_combo": "Unlocks a second strike{SP}", - "hud.skill.axe_double_strike_damage_title": "Double Strike Damage", - "hud.skill.axe_double_strike_damage": "Increases the damage dealt in each successive strike{SP}", - "hud.skill.axe_double_strike_speed_title": "Double Strike Speed", - "hud.skill.axe_double_strike_speed": "Increases the attack speed with each successive strike{SP}", - "hud.skill.axe_double_strike_regen_title": "Double Strike Regen", - "hud.skill.axe_double_strike_regen": "Increases energy gain with each successive strike{SP}", - "hud.skill.axe_spin_title": "Axe Spin", - "hud.skill.axe_spin": "You spin it right round ...", - "hud.skill.axe_infinite_axe_spin_title": "Infinite Axe Spin", - "hud.skill.axe_infinite_axe_spin": "Spin for as long as you have energy{SP}", - "hud.skill.axe_spin_damage_title": "Spin Damage", - "hud.skill.axe_spin_damage": "Increases the damage each spin does by {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Spin Helicopter", - "hud.skill.axe_spin_helicopter": "You fall a little slower while spinning{SP}", - "hud.skill.axe_spin_speed_title": "Spin Speed", - "hud.skill.axe_spin_speed": "Increases your spin speed by {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Spin Cost", - "hud.skill.axe_spin_cost": "Decreases energy cost of spinning by {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Unlock Leap", - "hud.skill.axe_unlock_leap": "Unlocks a leap spin{SP}", - "hud.skill.axe_leap_damage_title": "Leap Damage", - "hud.skill.axe_leap_damage": "Increases damage of leap by {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Leap Knockback", - "hud.skill.axe_leap_knockback": "Increases knockback from leap by {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Leap Cost", - "hud.skill.axe_leap_cost": "Decreases cost of leap by {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Leap Distance", - "hud.skill.axe_leap_distance": "Increases distance of leap by {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Mining", - "hud.skill.pick_strike_title": "Pickaxe Strike", - "hud.skill.pick_strike": "Hit rocks with the pickaxe to gain ore, gems and experience", - "hud.skill.pick_strike_speed_title": "Pickaxe Strike Speed", - "hud.skill.pick_strike_speed": "Mine rocks faster{SP}", - "hud.skill.pick_strike_oregain_title": "Pickaxe Strike Ore Yield", - "hud.skill.pick_strike_oregain": "Chance to gain extra ore ({boost}% per level){SP}", - "hud.skill.pick_strike_gemgain_title": "Pickaxe Strike Gem Yield", - "hud.skill.pick_strike_gemgain": "Chance to gain extra gems ({boost}% per level){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/hud/social.ftl b/assets/voxygen/i18n/en/hud/social.ftl new file mode 100644 index 0000000000..b89104c7ff --- /dev/null +++ b/assets/voxygen/i18n/en/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Other Players +hud-social-online = Online: +hud-social-friends = Friends +hud-social-not_yet_available = Not yet available +hud-social-faction = Faction +hud-social-play_online_fmt = { $nb_player } player(s) online +hud-social-name = Name +hud-social-level = Level +hud-social-zone = Zone +hud-social-account = Account \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/social.ron b/assets/voxygen/i18n/en/hud/social.ron deleted file mode 100644 index 576f0bee35..0000000000 --- a/assets/voxygen/i18n/en/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.social": "Other Players", - "hud.social.online": "Online:", - "hud.social.friends": "Friends", - "hud.social.not_yet_available": "Not yet available", - "hud.social.faction": "Faction", - "hud.social.play_online_fmt": "{nb_player} player(s) online", - "hud.social.name": "Name", - "hud.social.level": "Level", - "hud.social.zone": "Zone", - "hud.social.account": "Account", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/en/hud/trade.ftl b/assets/voxygen/i18n/en/hud/trade.ftl new file mode 100644 index 0000000000..396ac9d73a --- /dev/null +++ b/assets/voxygen/i18n/en/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Trade +hud-trade-phase1_description = + Drag the items you want to trade + into the corresponding area. +hud-trade-phase2_description = + The trade is now locked to give you + time to review it. +hud-trade-phase3_description = Trade is being processed. +hud-trade-persons_offer = Offer from { $playername } +hud-trade-has_accepted = + { $playername } + has accepted +hud-trade-accept = Accept +hud-trade-decline = Decline +hud-trade-invite_sent = Trade request sent to { $playername }. +hud-trade-result-completed = Trade completed successfully. +hud-trade-result-declined = Trade declined. +hud-trade-result-nospace = Not enough space to complete the trade. +hud-trade-buy_price = Buy Price +hud-trade-sell_price = Sell Price +hud-trade-coin = coin(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Your offer +hud-trade-their_offer = Their offer +hud-trade-amount_input = Select an item \ No newline at end of file diff --git a/assets/voxygen/i18n/en/hud/trade.ron b/assets/voxygen/i18n/en/hud/trade.ron deleted file mode 100644 index 54dca95f59..0000000000 --- a/assets/voxygen/i18n/en/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.trade.trade_window": "Trade", - "hud.trade.phase1_description": "Drag the items you want to trade\n into the corresponding area.", - "hud.trade.phase2_description": "The trade is now locked to give you\n time to review it.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Trade is being processed.", - "hud.trade.persons_offer": "Offer from {playername}", - "hud.trade.has_accepted": "{playername}\nhas accepted", - "hud.trade.accept": "Accept", - "hud.trade.decline": "Decline", - "hud.trade.invite_sent": "Trade request sent to {playername}.", - "hud.trade.result.completed": "Trade completed successfully.", - "hud.trade.result.declined": "Trade declined.", - "hud.trade.result.nospace": "Not enough space to complete the trade.", - "hud.trade.buy_price": "Buy Price", - "hud.trade.sell_price": "Sell Price", - "hud.trade.coin": "coin(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Your offer", - "hud.trade.their_offer": "Their offer", - "hud.trade.amount_input": "Select an item" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/en/main.ftl b/assets/voxygen/i18n/en/main.ftl new file mode 100644 index 0000000000..84ae49843d --- /dev/null +++ b/assets/voxygen/i18n/en/main.ftl @@ -0,0 +1,95 @@ +main-username = Username +main-server = Server +main-password = Password +main-connecting = Connecting +main-creating_world = Creating world +main-tip = Tip: +main-unbound_key_tip = unbound +main-notice = + Welcome to the alpha version of Veloren! + + Before you dive into the fun, please keep a few things in mind: + + - This is a very early alpha. Expect bugs, extremely unfinished gameplay, unpolished mechanics, and missing features. + + - If you have constructive feedback or bug reports, you can contact us via Reddit, GitLab, or our community Discord server. + + - Veloren is licensed under the GPL 3 open-source licence. That means you're free to play, modify, and redistribute the game however + you wish (provided derived work is also under GPL 3). + + - Veloren is a non-profit community project, and everybody working on it is a volunteer. + If you like what you see, you're welcome to join the development or art teams! + + Thanks for taking the time to read this notice, we hope you enjoy the game! + + ~ The Veloren Devs +main-login_process = + Information on the Login Process: + + Please note that you need an account + to play on auth-enabled servers. + + You can create an account over at + + https://veloren.net/account/. +main-login-server_not_found = Server not found +main-login-authentication_error = Auth error on server +main-login-internal_error = Internal error on client (most likely, player character was deleted) +main-login-failed_auth_server_url_invalid = Failed to connect to auth server +main-login-insecure_auth_scheme = The auth Scheme HTTP is NOT supported. It's insecure! For development purposes, HTTP is allowed for 'localhost' or debug builds +main-login-server_full = Server is full +main-login-untrusted_auth_server = Auth server not trusted +main-login-outdated_client_or_server = ServerWentMad: Probably versions are incompatible, check for updates. +main-login-timeout = Timeout: Server did not respond in time. (Overloaded or network issues). +main-login-server_shut_down = Server shut down +main-login-network_error = Network error +main-login-network_wrong_version = Mismatched server and client version, please update your game client. +main-login-failed_sending_request = Request to Auth server failed +main-login-invalid_character = The selected character is invalid +main-login-client_crashed = Client crashed +main-login-not_on_whitelist = You need a Whitelist entry by an Admin to join +main-login-banned = You have been banned with the following reason +main-login-kicked = You have been kicked with the following reason +main-login-select_language = Select a language +main-login-client_version = Client Version +main-login-server_version = Server Version +main-login-client_init_failed = Client failed to initialize: { $init_fail_reason } +main-login-username_bad_characters = Username contains invalid characters! (Only alphanumeric, '_' and '-' are allowed) +main-login-username_too_long = Username is too long! Max length is: { $max_len } +main-servers-select_server = Select a server +main-servers-singleplayer_error = Failed to connect to internal server: { $sp_error } +main-servers-network_error = Server network/socket error: { $raw_error } +main-servers-participant_error = Participant disconnect/protocol error: { $raw_error } +main-servers-stream_error = Client connection/compression/(de)serialization error: { $raw_error } +main-servers-database_error = Server database error: { $raw_error } +main-servers-persistence_error = Server persistence error (Probably Asset/Character Data related): { $raw_error } +main-servers-other_error = Server general error: { $raw_error } +main-credits = Credits +main-credits-created_by = created by +main-credits-music = Music +main-credits-fonts = Fonts +main-credits-other_art = Other Art +main-credits-contributors = Contributors +loading-tips = + .a0 = Press '{ $gameinput-togglelantern }' to light your lantern. + .a1 = Press '{ $gameinput-help }' to see all default keybindings. + .a2 = You can type /say or /s to only chat with players directly around you. + .a3 = You can type /region or /r to only chat with players a couple of hundred blocks around you. + .a4 = Admins can use the /build command to enter build mode. + .a5 = You can type /group or /g to only chat with players in your current group. + .a6 = To send private messages type /tell followed by a player name and your message. + .a7 = Keep an eye out for food, chests and other loot spread all around the world! + .a8 = Inventory filled with food? Try crafting better food from it! + .a9 = Wondering what there is to do? Try out one of the dungeons marked on the map! + .a10 = Don't forget to adjust the graphics for your system. Press '{ $gameinput-settings }' to open the settings. + .a11 = Playing with others is fun! Press '{ $gameinput-social }' to see who is online. + .a12 = Press '{ $gameinput-dance }' to dance. Party! + .a13 = Press '{ $gameinput-glide }' to open your Glider and conquer the skies. + .a14 = Veloren is still in Pre-Alpha. We do our best to improve it every day! + .a15 = If you want to join the dev team or just have a chat with us, join our Discord server. + .a16 = You can toggle showing your amount of health on the healthbar in the settings. + .a17 = Sit near a campfire (with the '{ $gameinput-sit }' key) to slowly recover from your injuries. + .a18 = Need more bags or better armor to continue your journey? Press '{ $gameinput-crafting }' to open the crafting menu! + .a19 = Press '{ $gameinput-roll }' to roll. Rolling can be used to move faster and dodge enemy attacks. + .a20 = Wondering what an item is used for? Search 'input:' in crafting to see what recipes it's used in. + .a21 = Find something cool? Take a screenshot of it with '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/en/main.ron b/assets/voxygen/i18n/en/main.ron deleted file mode 100644 index b610b8e7e5..0000000000 --- a/assets/voxygen/i18n/en/main.ron +++ /dev/null @@ -1,115 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - /// Start Main screen section - "main.username": "Username", - "main.server": "Server", - "main.password": "Password", - "main.connecting": "Connecting", - "main.creating_world": "Creating world", - "main.tip": "Tip:", - "main.unbound_key_tip": "unbound", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Welcome to the alpha version of Veloren! - -Before you dive into the fun, please keep a few things in mind: - -- This is a very early alpha. Expect bugs, extremely unfinished gameplay, unpolished mechanics, and missing features. - -- If you have constructive feedback or bug reports, you can contact us via Reddit, GitLab, or our community Discord server. - -- Veloren is licensed under the GPL 3 open-source licence. That means you're free to play, modify, and redistribute the game however - you wish (provided derived work is also under GPL 3). - -- Veloren is a non-profit community project, and everybody working on it is a volunteer. -If you like what you see, you're welcome to join the development or art teams! - -Thanks for taking the time to read this notice, we hope you enjoy the game! - -~ The Veloren Devs"#, - - // Login process description - "main.login_process": r#"Information on the Login Process: - -Please note that you need an account -to play on auth-enabled servers. - -You can create an account over at - -https://veloren.net/account/."#, - "main.login.server_not_found": "Server not found", - "main.login.authentication_error": "Auth error on server", - "main.login.internal_error": "Internal error on client (most likely, player character was deleted)", - "main.login.failed_auth_server_url_invalid": "Failed to connect to auth server", - "main.login.insecure_auth_scheme": "The auth Scheme HTTP is NOT supported. It's insecure! For development purposes, HTTP is allowed for 'localhost' or debug builds", - "main.login.server_full": "Server is full", - "main.login.untrusted_auth_server": "Auth server not trusted", - "main.login.outdated_client_or_server": "ServerWentMad: Probably versions are incompatible, check for updates.", - "main.login.timeout": "Timeout: Server did not respond in time. (Overloaded or network issues).", - "main.login.server_shut_down": "Server shut down", - "main.login.network_error": "Network error", - "main.login.network_wrong_version": "Mismatched server and client version, please update your game client.", - "main.login.failed_sending_request": "Request to Auth server failed", - "main.login.invalid_character": "The selected character is invalid", - "main.login.client_crashed": "Client crashed", - "main.login.not_on_whitelist": "You need a Whitelist entry by an Admin to join", - "main.login.banned": "You have been banned with the following reason", - "main.login.kicked": "You have been kicked with the following reason", - "main.login.select_language": "Select a language", - "main.login.client_version": "Client Version", - "main.login.server_version": "Server Version", - "main.login.client_init_failed": "Client failed to initialize: {init_fail_reason}", - "main.login.username_bad_characters": "Username contains invalid characters! (Only alphanumeric, '_' and '-' are allowed)", - "main.login.username_too_long": "Username is too long! Max length is: {max_len}", - "main.servers.select_server": "Select a server", - "main.servers.singleplayer_error": "Failed to connect to internal server: {sp_error}", - "main.servers.network_error": "Server network/socket error: {raw_error}", - "main.servers.participant_error": "Participant disconnect/protocol error: {raw_error}", - "main.servers.stream_error": "Client connection/compression/(de)serialization error: {raw_error}", - "main.servers.database_error": "Server database error: {raw_error}", - "main.servers.persistence_error": "Server persistence error (Probably Asset/Character Data related): {raw_error}", - "main.servers.other_error": "Server general error: {raw_error}", - - // Credits screen - "main.credits": "Credits", - "main.credits.created_by": "created by", - "main.credits.music": "Music", - "main.credits.fonts": "Fonts", - "main.credits.other_art": "Other Art", - "main.credits.contributors": "Contributors", - - /// End Main screen section - }, - - - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "Press '{gameinput.togglelantern}' to light your lantern.", - "Press '{gameinput.help}' to see all default keybindings.", - "You can type /say or /s to only chat with players directly around you.", - "You can type /region or /r to only chat with players a couple of hundred blocks around you.", - "Admins can use the /build command to enter build mode.", - "You can type /group or /g to only chat with players in your current group.", - "To send private messages type /tell followed by a player name and your message.", - "Keep an eye out for food, chests and other loot spread all around the world!", - "Inventory filled with food? Try crafting better food from it!", - "Wondering what there is to do? Try out one of the dungeons marked on the map!", - "Don't forget to adjust the graphics for your system. Press '{gameinput.settings}' to open the settings.", - "Playing with others is fun! Press '{gameinput.social}' to see who is online.", - "Press '{gameinput.dance}' to dance. Party!", - "Press '{gameinput.glide}' to open your Glider and conquer the skies.", - "Veloren is still in Pre-Alpha. We do our best to improve it every day!", - "If you want to join the dev team or just have a chat with us, join our Discord server.", - "You can toggle showing your amount of health on the healthbar in the settings.", - "Sit near a campfire (with the '{gameinput.sit}' key) to slowly recover from your injuries.", - "Need more bags or better armor to continue your journey? Press '{gameinput.crafting}' to open the crafting menu!", - "Press '{gameinput.roll}' to roll. Rolling can be used to move faster and dodge enemy attacks.", - "Wondering what an item is used for? Search 'input:' in crafting to see what recipes it's used in.", - "Find something cool? Take a screenshot of it with '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/en/npc.ftl b/assets/voxygen/i18n/en/npc.ftl new file mode 100644 index 0000000000..708e649d7b --- /dev/null +++ b/assets/voxygen/i18n/en/npc.ftl @@ -0,0 +1,216 @@ +npc-speech-villager = + .a0 = I love cheese. +npc-speech-villager_open = + .a0 = I wonder what the Catoblepas thinks when it eats grass. + .a1 = What do you suppose makes Glowing Remains glow? + .a2 = Have you ever heard of the ferocious Land Sharks? I hear they live in deserts. + .a3 = I wonder what is on the other side of the mountains. + .a4 = I left some cheese with my sibling. Now I don't know if it exists or not. I call it Schrödinger's cheese. + .a5 = Have you ever caught a firefly? + .a6 = They say shiny gems of all kinds can be found in caves. + .a7 = I just can't understand where those Sauroks keep coming from. +npc-speech-villager_adventurous = + .a0 = I hope to make my own glider someday. + .a1 = I'd like to go spelunking in a cave when I'm stronger. +npc-speech-villager_closed = + .a0 = You're not from around here are you? + .a1 = Don't you think our village is the best? + .a2 = They say mushrooms are good for your health. Never eat them myself. + .a3 = To be, or not to be? I think I'll be a farmer. +npc-speech-villager_conscientious = + .a0 = I keep busy. There's always something to do. + .a1 = I hope it rains soon. Would be good for the crops. +npc-speech-villager_busybody = + .a0 = People should talk less and work more. +npc-speech-villager_unconscientious = + .a0 = I think it's time for second breakfast! + .a1 = I wish was my house wasn't such a mess. But then I'd have to tidy up! Haha! + .a2 = Now where did I leave that thing... +npc-speech-villager_extroverted = + .a0 = You won't believe what I did this weekend! + .a1 = Top of the morning to you! + .a2 = What do you think about this weather? + .a3 = I'm just crackers about cheese! + .a4 = Don't forget the crackers! + .a5 = I simply adore dwarven cheese. I wish I could make it. + .a6 = I had a wonderful dream about cheese last night. What does it mean? + .a7 = I love honey! And I hate bees. +npc-speech-villager_sociable = + .a0 = Won't you come in? We were just about to have some cheese! + .a1 = Would you like to see my garden? Okay, maybe some other time. +npc-speech-villager_introverted = + .a0 = Hi. + .a1 = Oh me? I'm nothing special. +npc-speech-villager_agreeable = + .a0 = How are you today? + .a1 = Just tell me if you need anything. + .a2 = Have you seen my cat? +npc-speech-villager_worried = + .a0 = Be careful, alright? There are so many dangers out there. +npc-speech-villager_disagreeable = + .a0 = I say it like it is. If people don't like that, too bad. + .a1 = People are too easily offended. +npc-speech-villager_neurotic = + .a0 = Thinking about those dungeons makes me scared. I hope someone will clear them out. + .a1 = Someone should do something about those cultists. Preferably not me. + .a2 = I have the feeling something bad will happen. + .a3 = I wish someone would keep the wolves away from the village. +npc-speech-villager_sad_loner = + .a0 = I'm so lonely. + .a1 = ... Sorry about this awkward silence. I'm not so good with people. +npc-speech-villager_seeker = + .a0 = I want to see the world one day. There's got to be more to life than this village. +npc-speech-villager_stable = + .a0 = Isn't it such a lovely day? + .a1 = Life's not too bad. + .a2 = Lovely day for a stroll in the woods! +npc-speech-villager_decline_trade = + .a0 = Sorry, I don't have anything to trade. + .a1 = Trade? Like I got anything that may interest you. + .a2 = My house is mine, I won't trade it for anything. +npc-speech-villager_busy = + .a0 = Sorry, I can't speak with you right now. + .a1 = We'll talk later, I'm busy. +npc-speech-merchant_advertisement = + .a0 = Can I interest you in a trade? + .a1 = Do you want to trade with me? + .a2 = I have plenty of goods, Do you want to take a look? +npc-speech-merchant_busy = + .a0 = Please wait, I'm only one person. + .a1 = Just a moment, let me finish. + .a2 = I'm busy, come back later. +npc-speech-merchant_busy_rude = + .a0 = Hey, wait your turn. + .a1 = Do you see the other person in front of you? + .a2 = No cutting in line. +npc-speech-merchant_trade_successful = + .a0 = Thank you for trading with me! + .a1 = Thank you! +npc-speech-merchant_trade_declined = + .a0 = Maybe another time, have a good day! + .a1 = Too bad, maybe next time, then! +npc-speech-merchant_trade_cancelled_hostile = + .a0 = Sorry to cut it short, we have a problem to solve here! + .a1 = We'll trade later, I need to take care of this first! +npc-speech-villager_cultist_alarm = + .a0 = Lookout! There is a cultist on the loose! + .a1 = To arms! The cultists are attacking! + .a2 = How dare the cultists attack our village! + .a3 = Death to the cultists! + .a4 = Cultists will not be tolerated here! + .a5 = Murderous cultist! + .a6 = Taste the edge of my sword, you dirty cultist! + .a7 = Nothing can clean the blood from your hands, cultist! + .a8 = Billions of blistering blue barnacles! A cultist among us! + .a9 = The evils of this cultist are about to be over! + .a10 = This cultist is mine! + .a11 = Prepare to meet your maker, foul cultist! + .a12 = I see a cultist! Get them! + .a13 = I see a cultist! Attack! + .a14 = I see a cultist! Don't let them escape! + .a15 = Would the most honorable cultist care for some DEATH?! + .a16 = Never forgive! Never forget! Cultist, regret! + .a17 = Die, cultist! + .a18 = Your reign of terror will seize! + .a19 = Here's for all that you've done! + .a20 = We don't take kindly to your types around here. + .a21 = You should have stayed underground! +npc-speech-villager_under_attack = + .a0 = Help, I'm under attack! + .a1 = Help! I'm under attack! + .a2 = Ouch! I'm under attack! + .a3 = Ouch! I'm under attack! Help! + .a4 = Help me! I'm under attack! + .a5 = I'm under attack! Help! + .a6 = I'm under attack! Help me! + .a7 = Help! + .a8 = Help! Help! + .a9 = Help! Help! Help! + .a10 = I'm under attack! + .a11 = AAAHHH! I'm under attack! + .a12 = AAAHHH! I'm under attack! Help! + .a13 = Help! We're under attack! + .a14 = Help! Murderer! + .a15 = Help! There's a murderer on the loose! + .a16 = Help! They're trying to kill me! + .a17 = Guards, I'm under attack! + .a18 = Guards! I'm under attack! + .a19 = I'm under attack! Guards! + .a20 = Help! Guards! I'm under attack! + .a21 = Guards! Come quick! + .a22 = Guards! Guards! + .a23 = Guards! There's a villain attacking me! + .a24 = Guards, slay this foul villain! + .a25 = Guards! There's a murderer! + .a26 = Guards! Help me! + .a27 = You won't get away with this! Guards! + .a28 = You fiend! + .a29 = Help me! + .a30 = Help! Please! + .a31 = Ouch! Guards! Help! + .a32 = They're coming for me! + .a33 = Help! Help! I'm being repressed! + .a34 = Ah, now we see the violence inherent in the system. + .a35 = 'Tis but a scratch! + .a36 = Stop that! + .a37 = What did I ever do to you?! + .a38 = Please stop attacking me! + .a39 = Hey! Watch where you point that thing! + .a40 = Heinous wretch, be gone with you! + .a41 = Stop it! Go away! + .a42 = Now you're making me mad! + .a43 = Oi! Who do you think you are?! + .a44 = I'll have your head for that! + .a45 = Stop, please! I carry nothing of value! + .a46 = I'll set my brother on you, he's bigger than I am! + .a47 = Nooo, I'm telling mother! + .a48 = Curse you! + .a49 = Please don't do that. + .a50 = That wasn't very nice! + .a51 = Your weapon works, you can put it away now! + .a52 = Spare me! + .a53 = Please, I have a family! + .a54 = I'm too young to die! + .a55 = Can we talk about this? + .a56 = Violence is never the answer! + .a57 = Today is turning out to be a very bad day... + .a58 = Hey, that hurt! + .a59 = Eek! + .a60 = How rude! + .a61 = Stop, I beg you! + .a62 = A pox upon you! + .a63 = This isn't fun. + .a64 = How dare you?! + .a65 = You'll pay for that! + .a66 = Keep that up and you'll be sorry! + .a67 = Don't make me hurt you! + .a68 = There must be some misunderstanding! + .a69 = You don't need to do this! + .a70 = Be gone, fiend! + .a71 = That really hurt! + .a72 = Why would you do that? + .a73 = By the spirits, cease! + .a74 = You must have me confused with someone else! + .a75 = I don't deserve this! + .a76 = Please don't do that again. + .a77 = Guards, throw this monster in the lake! + .a78 = I'll set my tarasque on you! + .a79 = Why meeeeeee? +npc-speech-villager_enemy_killed = + .a0 = I have destroyed my enemy! + .a1 = Finally at peace! + .a2 = ... now what was I doing? +npc-speech-menacing = + .a0 = I'm warning you! + .a1 = Any closer and I'll attack! + .a2 = You don't scare me! + .a3 = Get away from here! + .a4 = Turn around if you want to live! + .a5 = You're not welcome here! +npc-speech-cultist_low_health_fleeing = + .a0 = Retreat for the cause! + .a1 = Retreat! + .a2 = Curse you! + .a3 = I will curse you in the afterlife! + .a4 = I must rest! + .a5 = They're too strong! \ No newline at end of file diff --git a/assets/voxygen/i18n/en/npc.ron b/assets/voxygen/i18n/en/npc.ron deleted file mode 100644 index b53f7d19ae..0000000000 --- a/assets/voxygen/i18n/en/npc.ron +++ /dev/null @@ -1,256 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "I love cheese.", - ], - "npc.speech.villager_open": [ - "I wonder what the Catoblepas thinks when it eats grass.", - "What do you suppose makes Glowing Remains glow?", - "Have you ever heard of the ferocious Land Sharks? I hear they live in deserts.", - "I wonder what is on the other side of the mountains.", - "I left some cheese with my sibling. Now I don't know if it exists or not. I call it Schrödinger's cheese.", - "Have you ever caught a firefly?", - "They say shiny gems of all kinds can be found in caves.", - "I just can't understand where those Sauroks keep coming from.", - ], - "npc.speech.villager_adventurous": [ - "I hope to make my own glider someday.", - "I'd like to go spelunking in a cave when I'm stronger.", - ], - "npc.speech.villager_closed": [ - "You're not from around here are you?", - "Don't you think our village is the best?", - "They say mushrooms are good for your health. Never eat them myself.", - "To be, or not to be? I think I'll be a farmer.", - ], - "npc.speech.villager_conscientious": [ - "I keep busy. There's always something to do.", - "I hope it rains soon. Would be good for the crops.", - ], - "npc.speech.villager_busybody": [ - "People should talk less and work more.", - ], - "npc.speech.villager_unconscientious": [ - "I think it's time for second breakfast!", - "I wish was my house wasn't such a mess. But then I'd have to tidy up! Haha!", - "Now where did I leave that thing...", - ], - "npc.speech.villager_extroverted": [ - "You won't believe what I did this weekend!", - "Top of the morning to you!", - "What do you think about this weather?", - "I'm just crackers about cheese!", - "Don't forget the crackers!", - "I simply adore dwarven cheese. I wish I could make it.", - "I had a wonderful dream about cheese last night. What does it mean?", - "I love honey! And I hate bees.", - ], - "npc.speech.villager_sociable": [ - "Won't you come in? We were just about to have some cheese!", - "Would you like to see my garden? Okay, maybe some other time.", - ], - "npc.speech.villager_introverted": [ - "Hi.", - "Oh me? I'm nothing special.", - ], - "npc.speech.villager_agreeable": [ - "How are you today?", - "Just tell me if you need anything.", - "Have you seen my cat?", - ], - "npc.speech.villager_worried": [ - "Be careful, alright? There are so many dangers out there.", - ], - "npc.speech.villager_disagreeable": [ - "I say it like it is. If people don't like that, too bad.", - "People are too easily offended.", - ], - "npc.speech.villager_neurotic": [ - "Thinking about those dungeons makes me scared. I hope someone will clear them out.", - "Someone should do something about those cultists. Preferably not me.", - "I have the feeling something bad will happen.", - "I wish someone would keep the wolves away from the village.", - ], - "npc.speech.villager_sad_loner": [ - "I'm so lonely.", - "... Sorry about this awkward silence. I'm not so good with people.", - ], - "npc.speech.villager_seeker": [ - "I want to see the world one day. There's got to be more to life than this village.", - ], - "npc.speech.villager_stable": [ - "Isn't it such a lovely day?", - "Life's not too bad.", - "Lovely day for a stroll in the woods!", - ], - "npc.speech.villager_decline_trade": [ - "Sorry, I don't have anything to trade.", - "Trade? Like I got anything that may interest you.", - "My house is mine, I won't trade it for anything.", - ], - "npc.speech.villager_busy": [ - "Sorry, I can't speak with you right now.", - "We'll talk later, I'm busy." - ], - "npc.speech.merchant_advertisement": [ - "Can I interest you in a trade?", - "Do you want to trade with me?", - "I have plenty of goods, Do you want to take a look?" - ], - "npc.speech.merchant_busy": [ - "Please wait, I'm only one person.", - "Just a moment, let me finish.", - "I'm busy, come back later." - ], - "npc.speech.merchant_busy_rude": [ - "Hey, wait your turn.", - "Do you see the other person in front of you?", - "No cutting in line.", - ], - "npc.speech.merchant_trade_successful": [ - "Thank you for trading with me!", - "Thank you!", - ], - "npc.speech.merchant_trade_declined": [ - "Maybe another time, have a good day!", - "Too bad, maybe next time, then!" - ], - "npc.speech.merchant_trade_cancelled_hostile": [ - "Sorry to cut it short, we have a problem to solve here!", - "We'll trade later, I need to take care of this first!" - ], - "npc.speech.villager_cultist_alarm": [ - "Lookout! There is a cultist on the loose!", - "To arms! The cultists are attacking!", - "How dare the cultists attack our village!", - "Death to the cultists!", - "Cultists will not be tolerated here!", - "Murderous cultist!", - "Taste the edge of my sword, you dirty cultist!", - "Nothing can clean the blood from your hands, cultist!", - "Billions of blistering blue barnacles! A cultist among us!", - "The evils of this cultist are about to be over!", - "This cultist is mine!", - "Prepare to meet your maker, foul cultist!", - "I see a cultist! Get them!", - "I see a cultist! Attack!", - "I see a cultist! Don't let them escape!", - "Would the most honorable cultist care for some DEATH?!", - "Never forgive! Never forget! Cultist, regret!", - "Die, cultist!", - "Your reign of terror will seize!", - "Here's for all that you've done!", - "We don't take kindly to your types around here.", - "You should have stayed underground!", - ], - "npc.speech.villager_under_attack": [ - "Help, I'm under attack!", - "Help! I'm under attack!", - "Ouch! I'm under attack!", - "Ouch! I'm under attack! Help!", - "Help me! I'm under attack!", - "I'm under attack! Help!", - "I'm under attack! Help me!", - "Help!", - "Help! Help!", - "Help! Help! Help!", - "I'm under attack!", - "AAAHHH! I'm under attack!", - "AAAHHH! I'm under attack! Help!", - "Help! We're under attack!", - "Help! Murderer!", - "Help! There's a murderer on the loose!", - "Help! They're trying to kill me!", - "Guards, I'm under attack!", - "Guards! I'm under attack!", - "I'm under attack! Guards!", - "Help! Guards! I'm under attack!", - "Guards! Come quick!", - "Guards! Guards!", - "Guards! There's a villain attacking me!", - "Guards, slay this foul villain!", - "Guards! There's a murderer!", - "Guards! Help me!", - "You won't get away with this! Guards!", - "You fiend!", - "Help me!", - "Help! Please!", - "Ouch! Guards! Help!", - "They're coming for me!", - "Help! Help! I'm being repressed!", - "Ah, now we see the violence inherent in the system.", - "'Tis but a scratch!", - "Stop that!", - "What did I ever do to you?!", - "Please stop attacking me!", - "Hey! Watch where you point that thing!", - "Heinous wretch, be gone with you!", - "Stop it! Go away!", - "Now you're making me mad!", - "Oi! Who do you think you are?!", - "I'll have your head for that!", - "Stop, please! I carry nothing of value!", - "I'll set my brother on you, he's bigger than I am!", - "Nooo, I'm telling mother!", - "Curse you!", - "Please don't do that.", - "That wasn't very nice!", - "Your weapon works, you can put it away now!", - "Spare me!", - "Please, I have a family!", - "I'm too young to die!", - "Can we talk about this?", - "Violence is never the answer!", - "Today is turning out to be a very bad day...", - "Hey, that hurt!", - "Eek!", - "How rude!", - "Stop, I beg you!", - "A pox upon you!", - "This isn't fun.", - "How dare you?!", - "You'll pay for that!", - "Keep that up and you'll be sorry!", - "Don't make me hurt you!", - "There must be some misunderstanding!", - "You don't need to do this!", - "Be gone, fiend!", - "That really hurt!", - "Why would you do that?", - "By the spirits, cease!", - "You must have me confused with someone else!", - "I don't deserve this!", - "Please don't do that again.", - "Guards, throw this monster in the lake!", - "I'll set my tarasque on you!", - "Why meeeeeee?", - ], - "npc.speech.villager_enemy_killed": [ - "I have destroyed my enemy!", - "Finally at peace!", - "... now what was I doing?", - ], - "npc.speech.menacing": [ - "I'm warning you!", - "Any closer and I'll attack!", - "You don't scare me!", - "Get away from here!", - "Turn around if you want to live!", - "You're not welcome here!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Retreat for the cause!", - "Retreat!", - "Curse you!", - "I will curse you in the afterlife!", - "I must rest!", - "They're too strong!", - ] - } -) diff --git a/assets/voxygen/i18n/en/template.ftl b/assets/voxygen/i18n/en/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/en/template.ron b/assets/voxygen/i18n/en/template.ron deleted file mode 100644 index f0d8b704da..0000000000 --- a/assets/voxygen/i18n/en/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/buff.ftl b/assets/voxygen/i18n/es_ES/buff.ftl new file mode 100644 index 0000000000..2778845ae7 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Clic para quitar +buff-title-missing = Sin Título +buff-desc-missing = Sin Descripción +buff-title-heal = Sanación +buff-desc-heal = Restaura salud con el paso del tiempo +buff-title-potion = Poción +buff-desc-potion = Bebiendo... +buff-title-saturation = Saturación +buff-desc-saturation = Restaura salud con el paso del tiempo por consumibles. +buff-title-campfire_heal = Sanación en Fogata +buff-desc-campfire_heal = Descansar en una fogata te sana un { $rate }% por segundo. +buff-title-invulnerability = Invulnerabilidad +buff-desc-invulnerability = No puedes ser dañado por ningún ataque. +buff-title-protectingward = Aura Protectora +buff-desc-protectingward = De alguna manera, estás protegido de los ataques. +buff-title-frenzied = Frenético +buff-desc-frenzied = Estas imbuido con una velocidad sobrenatural y puedes ignorar heridas leves +buff-title-bleed = Sangrado +buff-desc-bleed = Inflige un daño periódico. +buff-title-cursed = Maldito +buff-desc-cursed = Estás maldito. +buff-title-burn = Ardiendo +buff-desc-burn = Te estas quemando vivo +buff-title-crippled = Lisiado +buff-desc-crippled = Te mueves lentamente porque tus piernas estan muy heridas. +buff-title-frozen = Congelado +buff-desc-frozen = Tus movimientos y ataques son lentos. +buff-title-wet = Mojado +buff-desc-wet = El suelo rechaza a tus pies, dificultando que te detengas. +buff-title-ensnared = Atrapado +buff-desc-ensnared = Enredaderas agarran tus pies, impidiéndote el movimiento. +buff-stat-health = Restaura { $str_total } salud +buff-stat-increase_max_energy = Sube la Energía Máxima en { $strength } +buff-stat-increase_max_health = Sube la Salud Máxima en { $strength } +buff-stat-invulnerability = Concede invulnerabilidad +buff-text-over_seconds = por { $dur_secs } segundos +buff-text-for_seconds = durante { $dur_secs } segundos \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/buff.ron b/assets/voxygen/i18n/es_ES/buff.ron deleted file mode 100644 index e3234e9197..0000000000 --- a/assets/voxygen/i18n/es_ES/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - // Buffs - "buff.remove": "Clic para quitar", - "buff.title.missing": "Sin Título", - "buff.desc.missing": "Sin Descripción", - "buff.title.heal": "Sanación", - "buff.desc.heal": "Restaura salud con el paso del tiempo", - "buff.title.potion": "Poción", - "buff.desc.potion": "Bebiendo...", - "buff.title.saturation": "Saturación", - "buff.desc.saturation": "Restaura salud con el paso del tiempo por consumibles.", - "buff.title.campfire_heal": "Sanación en Fogata", - "buff.desc.campfire_heal": "Descansar en una fogata te sana un {rate}% por segundo.", - "buff.title.invulnerability": "Invulnerabilidad", - "buff.desc.invulnerability": "No puedes ser dañado por ningún ataque.", - "buff.title.protectingward": "Aura Protectora", - "buff.desc.protectingward": "De alguna manera, estás protegido de los ataques.", - "buff.title.frenzied": "Frenético", - "buff.desc.frenzied": "Estas imbuido con una velocidad sobrenatural y puedes ignorar heridas leves", - // Debuffs - "buff.title.bleed": "Sangrado", - "buff.desc.bleed": "Inflige un daño periódico.", - "buff.title.cursed": "Maldito", - "buff.desc.cursed": "Estás maldito.", - "buff.title.burn": "Ardiendo", - "buff.desc.burn": "Te estas quemando vivo", - "buff.title.crippled": "Lisiado", - "buff.desc.crippled": "Te mueves lentamente porque tus piernas estan muy heridas.", - "buff.title.frozen": "Congelado", - "buff.desc.frozen": "Tus movimientos y ataques son lentos.", - "buff.title.wet": "Mojado", - "buff.desc.wet": "El suelo rechaza a tus pies, dificultando que te detengas.", - "buff.title.ensnared": "Atrapado", - "buff.desc.ensnared": "Enredaderas agarran tus pies, impidiéndote el movimiento.", - // Buffs stats - "buff.stat.health": "Restaura {str_total} salud", - "buff.stat.increase_max_energy": "Sube la Energía Máxima en {strength}", - "buff.stat.increase_max_health": "Sube la Salud Máxima en {strength}", - "buff.stat.invulnerability": "Concede invulnerabilidad", - // Text - "buff.text.over_seconds": "por {dur_secs} segundos", - "buff.text.for_seconds": "durante {dur_secs} segundos", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/char_selection.ftl b/assets/voxygen/i18n/es_ES/char_selection.ftl new file mode 100644 index 0000000000..04c917fb20 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Cargando personajes... +char_selection-delete_permanently = ¿Borrar permanentemente este Personaje? +char_selection-deleting_character = Borrando Personaje... +char_selection-change_server = Cambiar de Servidor +char_selection-enter_world = Entrar al Mundo +char_selection-logout = Salir +char_selection-create_new_character = Crear Nuevo Personaje +char_selection-creating_character = Creando Personaje... +char_selection-character_creation = Creación de Personaje +char_selection-human_default = Humano Por Defecto +char_selection-level_fmt = Nivel { $level_nb } +char_selection-uncanny_valley = Tierra Salvaje +char_selection-plains_of_uncertainty = Llanuras de la Incertidumbre +char_selection-beard = Barba +char_selection-hair_style = Estilo de Pelo +char_selection-hair_color = Color de Pelo +char_selection-eye_color = Color de Ojos +char_selection-skin = Piel +char_selection-eyeshape = Detalle de los Ojos +char_selection-accessories = Accesorios +char_selection-create_info_name = ¡Tu Personaje necesita un nombre! +char_selection-version_mismatch = !Aviso! Este servidor esta ejecutando una versión diferente, posiblemente incompatible del juego. Por favor actualiza el juego. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/char_selection.ron b/assets/voxygen/i18n/es_ES/char_selection.ron deleted file mode 100644 index be01da008d..0000000000 --- a/assets/voxygen/i18n/es_ES/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "char_selection.loading_characters": "Cargando personajes...", - "char_selection.delete_permanently": "¿Borrar permanentemente este Personaje?", - "char_selection.deleting_character": "Borrando Personaje...", - "char_selection.change_server": "Cambiar de Servidor", - "char_selection.enter_world": "Entrar al Mundo", - "char_selection.logout": "Salir", - "char_selection.create_new_character": "Crear Nuevo Personaje", - "char_selection.creating_character": "Creando Personaje...", - "char_selection.character_creation": "Creación de Personaje", - "char_selection.human_default": "Humano Por Defecto", - "char_selection.level_fmt": "Nivel {level_nb}", - "char_selection.uncanny_valley": "Tierra Salvaje", - "char_selection.plains_of_uncertainty": "Llanuras de la Incertidumbre", - "char_selection.beard": "Barba", - "char_selection.hair_style": "Estilo de Pelo", - "char_selection.hair_color": "Color de Pelo", - "char_selection.eye_color": "Color de Ojos", - "char_selection.skin": "Piel", - "char_selection.eyeshape": "Detalle de los Ojos", - "char_selection.accessories": "Accesorios", - "char_selection.create_info_name": "¡Tu Personaje necesita un nombre!", - "char_selection.version_mismatch": "!Aviso! Este servidor esta ejecutando una versión diferente, posiblemente incompatible del juego. Por favor actualiza el juego.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/common.ftl b/assets/voxygen/i18n/es_ES/common.ftl new file mode 100644 index 0000000000..48d00a9a59 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/common.ftl @@ -0,0 +1,105 @@ +common-username = Usuario +common-singleplayer = Solo +common-multiplayer = Multijugador +common-servers = Servidores +common-quit = Salir +common-settings = Opciones +common-languages = Idiomas +common-interface = Interfaz +common-gameplay = Juego +common-controls = Controles +common-video = Gráficos +common-sound = Sonido +common-chat = Chat +common-resume = Reanudar +common-characters = Personajes +common-close = Cerrar +common-yes = Sí +common-no = No +common-back = Atrás +common-create = Crear +common-okay = Vale +common-add = Añadir +common-accept = Aceptar +common-decline = Rechazar +common-disclaimer = Atención +common-cancel = Cancelar +common-none = Ninguno +common-error = Error +common-fatal_error = Error Fatal +common-you = Tú +common-automatic = Auto +common-random = Aleatorio +common-empty = Vacío +common-confirm = Confirmar +common-delete_server = Eliminar Servidor +common-interface_settings = Ajustes de Interfaz +common-gameplay_settings = Ajustes del Juego +common-controls_settings = Ajustes de Controles +common-video_settings = Ajustes Gráficos +common-sound_settings = Ajustes de Sonido +common-language_settings = Ajustes de Idioma +common-chat_settings = Ajustes de Chat +common-connection_lost = + ¡Conexión perdida! + ¿Se reinició el servidor? + ¿Está el cliente actualizado? +common-species-orc = Orco +common-species-human = Humano +common-species-dwarf = Enano +common-species-elf = Elfo +common-species-draugr = No muerto +common-species-danari = Danari +common-weapons-axe = Hacha +common-weapons-dagger = Daga +common-weapons-greatsword = Gran Espada +common-weapons-shortswords = Espadas Cortas +common-weapons-sword = Espada +common-weapons-staff = Báculo de Fuego +common-weapons-bow = Arco +common-weapons-hammer = Martillo +common-weapons-general = Combate General +common-weapons-sceptre = Cetro de Sanación +common-weapons-shield = Escudo +common-weapons-spear = Lanza +common-weapons-hammer_simple = Martillo Simple +common-weapons-sword_simple = Espada Simple +common-weapons-staff_simple = Báculo Simple +common-weapons-axe_simple = Hacha Simple +common-weapons-bow_simple = Arco Simple +common-weapons-unique = Único +common-tool-debug = Depuración +common-tool-faming = Herramienta Agrícola +common-tool-pick = Pico +common-tool-mining = Minería +common-kind-modular_component = Componente modular +common-kind-glider = Planeador +common-kind-consumable = Consumible +common-kind-throwable = Puede ser lanzado +common-kind-utility = Utilidad +common-kind-ingredient = Ingrediente +common-kind-lantern = Linterna +common-hands-one = Una mano +common-hands-two = Dos manos +common-rand_appearance = Apariencia aleatoria +common-rand_name = Nombre aleatorio +common-stats-combat_rating = PC +common-stats-power = Poder +common-stats-speed = Velocidad +common-stats-poise = Equilibrio +common-stats-crit_chance = Prob. Crítica +common-stats-crit_mult = Mult. Crítico +common-stats-armor = Armadura +common-stats-poise_res = Res. Aturdimiento +common-stats-energy_max = Energía Max. +common-stats-energy_reward = Recompensa de Energía +common-stats-crit_power = Poder Crítico +common-stats-stealth = Sigilo +common-stats-slots = Espacios +common-tool-farming = Herramienta de colecta +common-material-metal = Metal +common-material-wood = Madera +common-material-stone = Piedra +common-material-cloth = Tela +common-material-hide = Piel +common-sprite-chest = Cofre \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/common.ron b/assets/voxygen/i18n/es_ES/common.ron deleted file mode 100644 index ce0b9276d7..0000000000 --- a/assets/voxygen/i18n/es_ES/common.ron +++ /dev/null @@ -1,153 +0,0 @@ -/// warning: localization files shall be saved in utf-8 format without bom - -/// Localization for Spanish (Spain) -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Usuario", - "common.singleplayer": "Solo", - "common.multiplayer": "Multijugador", - "common.servers": "Servidores", - "common.quit": "Salir", - "common.settings": "Opciones", - "common.languages": "Idiomas", - "common.interface": "Interfaz", - "common.gameplay": "Juego", - "common.controls": "Controles", - "common.video": "Gráficos", - "common.sound": "Sonido", - "common.chat": "Chat", - "common.resume": "Reanudar", - "common.characters": "Personajes", - "common.close": "Cerrar", - "common.yes": "Sí", - "common.no": "No", - "common.back": "Atrás", - "common.create": "Crear", - "common.okay": "Vale", - "common.add": "Añadir", - "common.accept": "Aceptar", - "common.decline": "Rechazar", - "common.disclaimer": "Atención", - "common.cancel": "Cancelar", - "common.none": "Ninguno", - "common.error": "Error", - "common.fatal_error": "Error Fatal", - "common.you": "Tú", - "common.automatic": "Auto", - "common.random": "Aleatorio", - "common.empty": "Vacío", - "common.confirm": "Confirmar", - "common.delete_server": "Eliminar Servidor", - - // Settings Window title - "common.interface_settings": "Ajustes de Interfaz", - "common.gameplay_settings": "Ajustes del Juego", - "common.controls_settings": "Ajustes de Controles", - "common.video_settings": "Ajustes Gráficos", - "common.sound_settings": "Ajustes de Sonido", - "common.language_settings": "Ajustes de Idioma", - "common.chat_settings": "Ajustes de Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"¡Conexión perdida! - ¿Se reinició el servidor? - ¿Está el cliente actualizado?"#, - - "common.species.orc": "Orco", - "common.species.human": "Humano", - "common.species.dwarf": "Enano", - "common.species.elf": "Elfo", - "common.species.draugr": "No muerto", - "common.species.danari": "Danari", - - "common.weapons.axe": "Hacha", - "common.weapons.dagger": "Daga", - "common.weapons.greatsword": "Gran Espada", - "common.weapons.shortswords": "Espadas Cortas", - "common.weapons.sword": "Espada", - "common.weapons.staff": "Báculo de Fuego", - "common.weapons.bow": "Arco", - "common.weapons.hammer": "Martillo", - "common.weapons.general": "Combate General", - "common.weapons.sceptre": "Cetro de Sanación", - "common.weapons.shield": "Escudo", - "common.weapons.spear": "Lanza", - "common.weapons.hammer_simple": "Martillo Simple", - "common.weapons.sword_simple": "Espada Simple", - "common.weapons.staff_simple": "Báculo Simple", - "common.weapons.axe_simple": "Hacha Simple", - "common.weapons.bow_simple": "Arco Simple", - "common.weapons.unique": "Único", - "common.tool.debug": "Depuración", - "common.tool.faming": "Herramienta Agrícola", - "common.tool.pick": "Pico", - "common.tool.mining": "Minería", - "common.kind.modular_component": "Componente modular", - "common.kind.glider": "Planeador", - "common.kind.consumable": "Consumible", - "common.kind.throwable": "Puede ser lanzado", - "common.kind.utility": "Utilidad", - "common.kind.ingredient": "Ingrediente", - "common.kind.lantern": "Linterna", - "common.hands.one": "Una mano", - "common.hands.two": "Dos manos", - - "common.rand_appearance": "Apariencia aleatoria", - "common.rand_name": "Nombre aleatorio", - - "common.stats.combat_rating": "PC", - "common.stats.power": "Poder", - "common.stats.speed": "Velocidad", - "common.stats.poise": "Equilibrio", - "common.stats.crit_chance": "Prob. Crítica", - "common.stats.crit_mult": "Mult. Crítico", - "common.stats.armor": "Armadura", - "common.stats.poise_res":"Res. Aturdimiento", - "common.stats.energy_max": "Energía Max.", - "common.stats.energy_reward": "Recompensa de Energía", - "common.stats.crit_power": "Poder Crítico", - "common.stats.stealth": "Sigilo", - "common.stats.slots": "Espacios", - - "common.weapons.axe": "Hacha", - "common.weapons.sword": "Espada", - "common.weapons.staff": "Bastón", - "common.weapons.bow": "Arco", - "common.weapons.hammer": "Martillo", - "common.weapons.general": "Combate", - "common.weapons.sceptre": "Cetro sanador", - "common.weapons.shield": "Escudo", - "common.weapons.spear": "Lanza", - "common.weapons.hammer_simple": "Martillo simple", - "common.weapons.sword_simple": "Espada simple", - "common.weapons.staff_simple": "Bastón simple", - "common.weapons.axe_simple": "Hacha simple", - "common.weapons.bow_simple": "Arco simple", - "common.weapons.unique": "Único", - "common.tool.debug": "Depuración", - "common.tool.farming": "Herramienta de colecta", - "common.tool.pick": "Pico", - "common.kind.modular_component": "Componente modular", - "common.kind.glider": "Planeador", - "common.kind.consumable": "Consumible", - "common.kind.throwable": "Arrojadizo", - "common.kind.utility": "Utilidad", - "common.kind.ingredient": "Ingrediente", - "common.kind.lantern": "Linterna", - "common.hands.one": "Una mano", - "common.hands.two": "Dos manos", - - "common.material.metal": "Metal", - "common.material.wood": "Madera", - "common.material.stone": "Piedra", - "common.material.cloth": "Tela", - "common.material.hide": "Piel", - - "common.sprite.chest": "Cofre", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/esc_menu.ftl b/assets/voxygen/i18n/es_ES/esc_menu.ftl new file mode 100644 index 0000000000..f8f3b09eab --- /dev/null +++ b/assets/voxygen/i18n/es_ES/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Salir +esc_menu-quit_game = Salir del juego \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/esc_menu.ron b/assets/voxygen/i18n/es_ES/esc_menu.ron deleted file mode 100644 index 23b3a572fa..0000000000 --- a/assets/voxygen/i18n/es_ES/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "esc_menu.logout": "Salir", - "esc_menu.quit_game": "Salir del juego", - }, - - - vector_map: { - } -) \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/gameinput.ftl b/assets/voxygen/i18n/es_ES/gameinput.ftl new file mode 100644 index 0000000000..dee14456ff --- /dev/null +++ b/assets/voxygen/i18n/es_ES/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Ataque Básico +gameinput-secondary = Ataque Secundario +gameinput-block = Bloqueo +gameinput-slot1 = Ranura 1 de barra rápida +gameinput-slot2 = Ranura 2 de barra rápida +gameinput-slot3 = Ranura 3 de barra rápida +gameinput-slot4 = Ranura 4 de barra rápida +gameinput-slot5 = Ranura 5 de barra rápida +gameinput-slot6 = Ranura 6 de barra rápida +gameinput-slot7 = Ranura 7 de barra rápida +gameinput-slot8 = Ranura 8 de barra rápida +gameinput-slot9 = Ranura 9 de barra rápida +gameinput-slot10 = Ranura 10 de barra rápida +gameinput-swaploadout = Intercambiar Armamento +gameinput-togglecursor = Alternar Cursor +gameinput-help = Alternar Ventana de Ayuda +gameinput-toggleinterface = Alternar Interfaz +gameinput-toggledebug = Alternar FPS e Información de Depuración +gameinput-toggle_egui_debug = Alternar Info de Depuración EGUI +gameinput-togglechat = Alternar Chat +gameinput-screenshot = Tomar captura de pantalla +gameinput-toggleingameui = Alternar Etiquetas +gameinput-fullscreen = Alternar Pantalla Completa +gameinput-moveforward = Moverse Hacia Delante +gameinput-moveleft = Moverse a la Izquierda +gameinput-moveright = Moverse a la Derecha +gameinput-moveback = Moverse hacia Atrás +gameinput-jump = Saltar +gameinput-glide = Planear +gameinput-roll = Rodar +gameinput-climb = Ascender +gameinput-climbdown = Descender +gameinput-wallleap = Salto de Pared +gameinput-togglelantern = Alternar linterna +gameinput-mount = Montar +gameinput-chat = Chat +gameinput-command = Linea Comandos +gameinput-escape = Escapar +gameinput-map = Mapa +gameinput-bag = Bolsa +gameinput-trade = Comerciar +gameinput-social = Social +gameinput-sit = Sentarse +gameinput-spellbook = Hechizos +gameinput-settings = Opciones +gameinput-respawn = Reaparecer +gameinput-charge = Cargar +gameinput-togglewield = Alternar Empuñadura +gameinput-interact = Interactuar +gameinput-freelook = Vista Libre +gameinput-autowalk = Auto Andar/Nadar +gameinput-cameraclamp = Cámara Fija +gameinput-dance = Bailar +gameinput-select = Seleccionar Entidad +gameinput-acceptgroupinvite = Aceptar Invitación de Grupo +gameinput-declinegroupinvite = Rechazar Invitación de Grupo +gameinput-cyclecamera = Cambiar Cámara +gameinput-crafting = Fabricar +gameinput-fly = Volar +gameinput-sneak = Entrar en sigilo +gameinput-swimdown = Sumergirse +gameinput-swimup = Emerger +gameinput-mapzoomin = Aumentar Zoom de Mapa +gameinput-mapzoomout = Reducir Zoom de Mapa +gameinput-greet = Saludar +gameinput-map-locationmarkerbutton = Establecer un punto en el Mapa \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/gameinput.ron b/assets/voxygen/i18n/es_ES/gameinput.ron deleted file mode 100644 index 4feff6ac48..0000000000 --- a/assets/voxygen/i18n/es_ES/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "gameinput.primary": "Ataque Básico", - "gameinput.secondary": "Ataque Secundario", - "gameinput.block": "Bloqueo", - "gameinput.slot1": "Ranura 1 de barra rápida", - "gameinput.slot2": "Ranura 2 de barra rápida", - "gameinput.slot3": "Ranura 3 de barra rápida", - "gameinput.slot4": "Ranura 4 de barra rápida", - "gameinput.slot5": "Ranura 5 de barra rápida", - "gameinput.slot6": "Ranura 6 de barra rápida", - "gameinput.slot7": "Ranura 7 de barra rápida", - "gameinput.slot8": "Ranura 8 de barra rápida", - "gameinput.slot9": "Ranura 9 de barra rápida", - "gameinput.slot10": "Ranura 10 de barra rápida", - "gameinput.swaploadout": "Intercambiar Armamento", - "gameinput.togglecursor": "Alternar Cursor", - "gameinput.help": "Alternar Ventana de Ayuda", - "gameinput.toggleinterface": "Alternar Interfaz", - "gameinput.toggledebug": "Alternar FPS e Información de Depuración", - "gameinput.toggle_egui_debug": "Alternar Info de Depuración EGUI", - "gameinput.togglechat": "Alternar Chat", - "gameinput.screenshot": "Tomar captura de pantalla", - "gameinput.toggleingameui": "Alternar Etiquetas", - "gameinput.fullscreen": "Alternar Pantalla Completa", - "gameinput.moveforward": "Moverse Hacia Delante", - "gameinput.moveleft": "Moverse a la Izquierda", - "gameinput.moveright": "Moverse a la Derecha", - "gameinput.moveback": "Moverse hacia Atrás", - "gameinput.jump": "Saltar", - "gameinput.glide": "Planear", - "gameinput.roll": "Rodar", - "gameinput.climb": "Ascender", - "gameinput.climbdown": "Descender", - "gameinput.wallleap": "Salto de Pared", - "gameinput.togglelantern": "Alternar linterna", - "gameinput.mount": "Montar", - "gameinput.chat": "Chat", - "gameinput.command": "Linea Comandos", - "gameinput.escape": "Escapar", - "gameinput.map": "Mapa", - "gameinput.bag": "Bolsa", - "gameinput.trade": "Comerciar", - "gameinput.social": "Social", - "gameinput.sit": "Sentarse", - "gameinput.spellbook": "Hechizos", - "gameinput.settings": "Opciones", - "gameinput.respawn": "Reaparecer", - "gameinput.charge": "Cargar", - "gameinput.togglewield": "Alternar Empuñadura", - "gameinput.interact": "Interactuar", - "gameinput.freelook": "Vista Libre", - "gameinput.autowalk": "Auto Andar/Nadar", - "gameinput.cameraclamp": "Cámara Fija", - "gameinput.dance": "Bailar", - "gameinput.select": "Seleccionar Entidad", - "gameinput.acceptgroupinvite": "Aceptar Invitación de Grupo", - "gameinput.declinegroupinvite": "Rechazar Invitación de Grupo", - "gameinput.cyclecamera": "Cambiar Cámara", - "gameinput.crafting": "Fabricar", - "gameinput.fly": "Volar", - "gameinput.sneak": "Entrar en sigilo", - "gameinput.swimdown": "Sumergirse", - "gameinput.swimup": "Emerger", - "gameinput.mapzoomin": "Aumentar Zoom de Mapa", - "gameinput.mapzoomout": "Reducir Zoom de Mapa", - "gameinput.greet": "Saludar", - "gameinput.map.locationmarkerbutton": "Establecer un punto en el Mapa" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/bag.ftl b/assets/voxygen/i18n/es_ES/hud/bag.ftl new file mode 100644 index 0000000000..5b8dbe14ab --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Inventario de { $playername } +hud-bag-stats_title = Atributos de { $playername } +hud-bag-exp = Experiencia +hud-bag-armor = Armadura +hud-bag-stats = Atributos +hud-bag-head = Cabeza +hud-bag-neck = Cuello +hud-bag-tabard = Tabardo +hud-bag-shoulders = Hombros +hud-bag-chest = Pecho +hud-bag-hands = Manos +hud-bag-lantern = Linterna +hud-bag-glider = Planeador +hud-bag-belt = Cinturón +hud-bag-ring = Anillo +hud-bag-back = Espalda +hud-bag-legs = Piernas +hud-bag-feet = Pies +hud-bag-mainhand = Mano Principal +hud-bag-offhand = Mano Secundaria +hud-bag-inactive_mainhand = Mano Principal Inactiva +hud-bag-inactive_offhand = Mano Secundaria Inactiva +hud-bag-swap_equipped_weapons_title = Intercambiar armas equipadas +hud-bag-swap_equipped_weapons_desc = Pulsa { $key } +hud-bag-bag = Mochila +hud-bag-health = Salud +hud-bag-energy = Energía +hud-bag-combat_rating = Puntuación de Combate +hud-bag-protection = Protección +hud-bag-stun_res = Resistencia a Aturdimiento +hud-bag-combat_rating_desc = + Calculado por tu + equipamiento y salud +hud-bag-protection_desc = Reducción de daño por armadura +hud-bag-stun_res_desc = + Resistencia a ser aturdido por golpes consecutivos. + Se regenera como la Energía. +hud-bag-sort_by_name = Ordenar por Nombre +hud-bag-sort_by_quality = Ordenar por Calidad +hud-bag-sort_by_category = Ordenar por Categoría \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/bag.ron b/assets/voxygen/i18n/es_ES/hud/bag.ron deleted file mode 100644 index a60a2addb0..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - // Inventory - "hud.bag.inventory": "Inventario de {playername}", - "hud.bag.stats_title": "Atributos de {playername}", - "hud.bag.exp": "Experiencia", - "hud.bag.armor": "Armadura", - "hud.bag.stats": "Atributos", - "hud.bag.head": "Cabeza", - "hud.bag.neck": "Cuello", - "hud.bag.tabard": "Tabardo", - "hud.bag.shoulders": "Hombros", - "hud.bag.chest": "Pecho", - "hud.bag.hands": "Manos", - "hud.bag.lantern": "Linterna", - "hud.bag.glider": "Planeador", - "hud.bag.belt": "Cinturón", - "hud.bag.ring": "Anillo", - "hud.bag.back": "Espalda", - "hud.bag.legs": "Piernas", - "hud.bag.feet": "Pies", - "hud.bag.mainhand": "Mano Principal", - "hud.bag.offhand": "Mano Secundaria", - "hud.bag.inactive_mainhand": "Mano Principal Inactiva", - "hud.bag.inactive_offhand": "Mano Secundaria Inactiva", - "hud.bag.swap_equipped_weapons_title": "Intercambiar armas equipadas", - "hud.bag.swap_equipped_weapons_desc": "Pulsa {key}", - "hud.bag.bag": "Mochila", - "hud.bag.health": "Salud", - "hud.bag.energy": "Energía", - "hud.bag.combat_rating": "Puntuación de Combate", - "hud.bag.protection": "Protección", - "hud.bag.stun_res": "Resistencia a Aturdimiento", - "hud.bag.combat_rating_desc": "Calculado por tu\nequipamiento y salud", - "hud.bag.protection_desc": "Reducción de daño por armadura", - "hud.bag.stun_res_desc": "Resistencia a ser aturdido por golpes consecutivos.\nSe regenera como la Energía.", - "hud.bag.sort_by_name": "Ordenar por Nombre", - "hud.bag.sort_by_quality": "Ordenar por Calidad", - "hud.bag.sort_by_category": "Ordenar por Categoría", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/char_window.ftl b/assets/voxygen/i18n/es_ES/hud/char_window.ftl new file mode 100644 index 0000000000..605bd3d4f9 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Nombre del Personaje +character_window-character_stats = + Resistencia + + Estado Físico + + Fuerza de Voluntad + + Protección \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/char_window.ron b/assets/voxygen/i18n/es_ES/hud/char_window.ron deleted file mode 100644 index 71aac380c1..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "character_window.character_name": "Nombre del Personaje", - // Charater stats - "character_window.character_stats": r#"Resistencia - -Estado Físico - -Fuerza de Voluntad - -Protección -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/chat.ftl b/assets/voxygen/i18n/es_ES/hud/chat.ftl new file mode 100644 index 0000000000..f9523fce9c --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Todos +hud-chat-chat_tab_hover_tooltip = Click derecho para opciones +hud-outcome-burning = murió: quemado +hud-outcome-curse = murió: maldito +hud-outcome-bleeding = murió: desangrado +hud-outcome-crippled = murió: lisiado +hud-outcome-frozen = murió: congelado +hud-chat-online_msg = [{ $name }] se ha conectado. +hud-chat-offline_msg = { $name } se ha desconectado. +hud-chat-default_death_msg = [{ $name }] murió +hud-chat-environmental_kill_msg = [{ $name }] murió en { $environment } +hud-chat-fall_kill_msg = [{ $name }] murió por daño de caída +hud-chat-suicide_msg = [{ $name }] murió por heridas autoinfligidas +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } causado por [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] derrotó a [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] disparó a [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] hizo explotar a [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] mató a [{ $victim }] con magia +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } causado por { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } mató a [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } disparó a [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } hizo explotar a [{ $victim }] +hud-chat-npc_energy_kill_msg = [{ $attacker }] mató a [{ $victim }] con magia +hud-chat-npc_other_kill_msg = [{ $attacker }] mató a [{ $victim }] +hud-chat-loot_msg = Recogiste [{ $item }] +hud-chat-loot_fail = ¡Tu inventario está lleno! +hud-chat-goodbye = ¡Adiós! +hud-chat-connection_lost = Conexión perdida. Expulsando en { $time } segundos. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/chat.ron b/assets/voxygen/i18n/es_ES/hud/chat.ron deleted file mode 100644 index 5d6b2ee16e..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.chat.all": "Todos", - "hud.chat.chat_tab_hover_tooltip": "Click derecho para opciones", - - // Debuff outcomes - "hud.outcome.burning": "murió: quemado", - "hud.outcome.curse": "murió: maldito", - "hud.outcome.bleeding": "murió: desangrado", - "hud.outcome.crippled": "murió: lisiado", - "hud.outcome.frozen": "murió: congelado", - - // Chat outputs - "hud.chat.online_msg": "[{name}] se ha conectado.", - "hud.chat.offline_msg": "{name} se ha desconectado.", - - "hud.chat.default_death_msg": "[{name}] murió", - "hud.chat.environmental_kill_msg": "[{name}] murió en {environment}", - "hud.chat.fall_kill_msg": "[{name}] murió por daño de caída", - "hud.chat.suicide_msg": "[{name}] murió por heridas autoinfligidas", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} causado por [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] derrotó a [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] disparó a [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] hizo explotar a [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] mató a [{victim}] con magia", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} causado por {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} mató a [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} disparó a [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} hizo explotar a [{victim}]", - "hud.chat.npc_energy_kill_msg": "[{attacker}] mató a [{victim}] con magia", - "hud.chat.npc_other_kill_msg": "[{attacker}] mató a [{victim}]", - - "hud.chat.loot_msg": "Recogiste [{item}]", - "hud.chat.loot_fail": "¡Tu inventario está lleno!", - "hud.chat.goodbye": "¡Adiós!", - "hud.chat.connection_lost": "Conexión perdida. Expulsando en {time} segundos.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/crafting.ftl b/assets/voxygen/i18n/es_ES/hud/crafting.ftl new file mode 100644 index 0000000000..fdb35bef08 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/crafting.ftl @@ -0,0 +1,34 @@ +hud-crafting = Fabricación +hud-crafting-recipes = Recetas +hud-crafting-ingredients = Ingredientes: +hud-crafting-craft = Fabricar +hud-crafting-tool_cata = Requisitos: +hud-crafting-req_crafting_station = Requisitos: +hud-crafting-anvil = Yunque +hud-crafting-cauldron = Caldero +hud-crafting-cooking_pot = Olla de Cocina +hud-crafting-crafting_bench = Mesa de Fabricación +hud-crafting-forge = Forja +hud-crafting-loom = Telar +hud-crafting-spinning_wheel = Rueca +hud-crafting-tanning_rack = Estante de Curtido +hud-crafting-salvaging_station = Banco de desmantelado +hud-crafting-campfire = Fogata +hud-crafting-tabs-all = Todo +hud-crafting-tabs-armor = Armadura +hud-crafting-tabs-dismantle = Desmantelar +hud-crafting-tabs-food = Comida +hud-crafting-tabs-glider = Planeadores +hud-crafting-tabs-potion = Pociones +hud-crafting-tabs-tool = Herramientas +hud-crafting-tabs-utility = Útiles +hud-crafting-tabs-weapon = Armas +hud-crafting-tabs-bag = Bolsas +hud-crafting-tabs-processed_material = Materiales +hud-crafting-dismantle_title = Desmontaje +hud-crafting-dismantle_explanation = + Pon el ratón encima de los objetos de + tu inventario para ver que puedes + desmontar en partes + + Doble-Click para empezar a desmontar. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/crafting.ron b/assets/voxygen/i18n/es_ES/hud/crafting.ron deleted file mode 100644 index 1fcfcd20e3..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.crafting": "Fabricación", - "hud.crafting.recipes": "Recetas", - "hud.crafting.ingredients": "Ingredientes:", - "hud.crafting.craft": "Fabricar", - "hud.crafting.tool_cata": "Requisitos:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Requisitos:", - "hud.crafting.anvil": "Yunque", - "hud.crafting.cauldron": "Caldero", - "hud.crafting.cooking_pot": "Olla de Cocina", - "hud.crafting.crafting_bench": "Mesa de Fabricación", - "hud.crafting.forge": "Forja", - "hud.crafting.loom": "Telar", - "hud.crafting.spinning_wheel": "Rueca", - "hud.crafting.tanning_rack": "Estante de Curtido", - "hud.crafting.salvaging_station": "Banco de desmantelado", - "hud.crafting.campfire": "Fogata", - // Tabs - "hud.crafting.tabs.all": "Todo", - "hud.crafting.tabs.armor": "Armadura", - "hud.crafting.tabs.dismantle": "Desmantelar", - "hud.crafting.tabs.food": "Comida", - "hud.crafting.tabs.glider": "Planeadores", - "hud.crafting.tabs.potion": "Pociones", - "hud.crafting.tabs.tool": "Herramientas", - "hud.crafting.tabs.utility": "Útiles", - "hud.crafting.tabs.weapon": "Armas", - "hud.crafting.tabs.bag": "Bolsas", - "hud.crafting.tabs.processed_material": "Materiales", - "hud.crafting.dismantle_title": "Desmontaje", - "hud.crafting.dismantle_explanation" : "Pon el ratón encima de los objetos de\ntu inventario para ver que puedes\n desmontar en partes\n\nDoble-Click para empezar a desmontar.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/group.ftl b/assets/voxygen/i18n/es_ES/hud/group.ftl new file mode 100644 index 0000000000..4a1e036626 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grupo +hud-group-invite_to_join = ¡{ $name } Te invito a su grupo! +hud-group-invite_to_trade = [{ $name }] le gustaria comerciar contigo. +hud-group-invite = Invitar +hud-group-kick = Expulsar +hud-group-assign_leader = Asignar Lider +hud-group-leave = Dejar Grupo +hud-group-dead = Muerto +hud-group-out_of_range = Fuera de Alcance +hud-group-add_friend = Agregar a Amigos +hud-group-link_group = Conectar Grupos +hud-group-in_menu = En el Menu +hud-group-members = Miembros del Grupo \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/group.ron b/assets/voxygen/i18n/es_ES/hud/group.ron deleted file mode 100644 index 4ce3886e71..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.group": "Grupo", - "hud.group.invite_to_join": "¡{name} Te invito a su grupo!", - "hud.group.invite_to_trade": "[{name}] le gustaria comerciar contigo.", - "hud.group.invite": "Invitar", - "hud.group.kick": "Expulsar", - "hud.group.assign_leader": "Asignar Lider", - "hud.group.leave": "Dejar Grupo", - "hud.group.dead" : "Muerto", - "hud.group.out_of_range": "Fuera de Alcance", - "hud.group.add_friend": "Agregar a Amigos", - "hud.group.link_group": "Conectar Grupos", - "hud.group.in_menu": "En el Menu", - "hud.group.members": "Miembros del Grupo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/map.ftl b/assets/voxygen/i18n/es_ES/hud/map.ftl new file mode 100644 index 0000000000..0f1573543f --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/map.ftl @@ -0,0 +1,31 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Misiones +hud-map-topo_map = Topografia +hud-map-difficulty = Dificultad +hud-map-towns = Pueblos +hud-map-castles = Castillos +hud-map-dungeons = Mazmorras +hud-map-caves = Cuevas +hud-map-cave = Cueva +hud-map-peaks = Montañas +hud-map-voxel_map = Mapa de Voxel +hud-map-trees = Árboles Enormes +hud-map-tree = Árbol Enorme +hud-map-town = Pueblo +hud-map-castle = Castillo +hud-map-dungeon = Mazmorra +hud-map-difficulty_dungeon = + Dificultad de + + mazmorra: { $difficulty } +hud-map-drag = Arrastrar +hud-map-zoom = Zoom +hud-map-mid_click = Poner Marcador +hud-map-recenter = Recentrar +hud-map-marked_location = Ubicación Marcada +hud-map-marked_location_remove = Click para quitar +hud-map-change_map_mode = Cambiar Modo de Mapa +hud-map-toggle_minimap_voxel = Alternar Vista Voxel Minimapa +hud-map-zoom_minimap_explanation = + Zoom en el Minimapa para ver + la zona de alrededor con mayor detalle \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/map.ron b/assets/voxygen/i18n/es_ES/hud/map.ron deleted file mode 100644 index 687393fa97..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Misiones", - "hud.map.topo_map": "Topografia", - "hud.map.difficulty": "Dificultad", - "hud.map.towns": "Pueblos", - "hud.map.castles": "Castillos", - "hud.map.dungeons": "Mazmorras", - "hud.map.caves": "Cuevas", - "hud.map.cave": "Cueva", - "hud.map.peaks": "Montañas", - "hud.map.voxel_map": "Mapa de Voxel", - "hud.map.trees": "Árboles Enormes", - "hud.map.tree": "Árbol Enorme", - "hud.map.town": "Pueblo", - "hud.map.castle": "Castillo", - "hud.map.dungeon": "Mazmorra", - "hud.map.difficulty_dungeon": "Dificultad de\n\nmazmorra: {difficulty}", - "hud.map.drag": "Arrastrar", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Poner Marcador", - "hud.map.recenter": "Recentrar", - "hud.map.marked_location": "Ubicación Marcada", - "hud.map.marked_location_remove": "Click para quitar", - "hud.map.change_map_mode": "Cambiar Modo de Mapa", - "hud.map.toggle_minimap_voxel": "Alternar Vista Voxel Minimapa", - "hud.map.zoom_minimap_explanation": "Zoom en el Minimapa para ver\n la zona de alrededor con mayor detalle", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/misc.ftl b/assets/voxygen/i18n/es_ES/hud/misc.ftl new file mode 100644 index 0000000000..9ea208e18d --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = No mostrar esto al Inicio +hud-show_tips = Mostrar Consejos +hud-quests = Misiones +hud-you_died = Has Muerto +hud-waypoint_saved = Punto de Ruta Guardado +hud-sp_arrow_txt = PH +hud-inventory_full = Inventario Lleno +hud-press_key_to_show_keybindings_fmt = Pulsa { $key } para mostrar Atajos de Teclado +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Linterna +hud-press_key_to_show_debug_info_fmt = Pulsa { $key } para mostrar info. de depuración +hud-press_key_to_toggle_keybindings_fmt = Pulsa { $key } para alternar atajos de teclado +hud-press_key_to_toggle_debug_info_fmt = Pulsa { $key } para alternar la información de depuración +hud-press_key_to_respawn = Pulsa { $key } para aparecer en el último campamento visitado. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Pulsa [ { $key } ] para liberar tu cursor y clica en el botón! +hud-tutorial_elements = Fabricación +hud-temp_quest_headline = Saludos Viajero! +hud-temp_quest_text = + Para comenzar tu viaje puedes empezar a buscar en esta aldea y recoger algunos suministros. + + ¡Puedes llevarte todo lo que necesites en tu viaje! + + Mira en la parte inferior derecha de la pantalla para encontrar cosas como tu bolsa, el menú de fabricación y el mapa. + + El menú de fabricación te permite crear armaduras, armas, comida y mucho más! + + Los animales salvajes que rodean la ciudad son una gran fuente de Pieles de Animal para crear algunas protecciones contra los peligros del mundo. + + Cuando te sientas preparado, ¡intenta conseguir un equipo aún mejor en los numerosos desafíos marcados en tu mapa! +hud-spell = Hechizos +hud-diary = Diario +hud-free_look_indicator = Vista libre activa. Pulsa { $key } para desactivarla. +hud-camera_clamp_indicator = Cámara fija vertical activa. Pulsa { $key } para desactivarla. +hud-auto_walk_indicator = Auto andar/nadar activado +hud-collect = Recolectar +hud-pick_up = Recoger +hud-open = Abrir +hud-use = Usar +hud-mine = Picar +hud-talk = Hablar +hud-trade = Comerciar +hud-mount = Montar +hud-sit = Sentarse \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/misc.ron b/assets/voxygen/i18n/es_ES/hud/misc.ron deleted file mode 100644 index 720a32865e..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.do_not_show_on_startup": "No mostrar esto al Inicio", - "hud.show_tips": "Mostrar Consejos", - "hud.quests": "Misiones", - "hud.you_died": "Has Muerto", - "hud.waypoint_saved": "Punto de Ruta Guardado", - "hud.sp_arrow_txt": "PH", - "hud.inventory_full": "Inventario Lleno", - - "hud.press_key_to_show_keybindings_fmt": "Pulsa {key} para mostrar Atajos de Teclado", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Linterna", - "hud.press_key_to_show_debug_info_fmt": "Pulsa {key} para mostrar info. de depuración", - "hud.press_key_to_toggle_keybindings_fmt": "Pulsa {key} para alternar atajos de teclado", - "hud.press_key_to_toggle_debug_info_fmt": "Pulsa {key} para alternar la información de depuración", - - // Respawn message - "hud.press_key_to_respawn": r#"Pulsa {key} para aparecer en el último campamento visitado."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Pulsa [ {key} ] para liberar tu cursor y clica en el botón!"#, - "hud.tutorial_elements": r#"Fabricación"#, - -"hud.temp_quest_headline": r#"Saludos Viajero!"#, -"hud.temp_quest_text": r#"Para comenzar tu viaje puedes empezar a buscar en esta aldea y recoger algunos suministros. - -¡Puedes llevarte todo lo que necesites en tu viaje! - -Mira en la parte inferior derecha de la pantalla para encontrar cosas como tu bolsa, el menú de fabricación y el mapa. - -El menú de fabricación te permite crear armaduras, armas, comida y mucho más! - -Los animales salvajes que rodean la ciudad son una gran fuente de Pieles de Animal para crear algunas protecciones contra los peligros del mundo. - -Cuando te sientas preparado, ¡intenta conseguir un equipo aún mejor en los numerosos desafíos marcados en tu mapa! -"#, - - "hud.spell": "Hechizos", - // Diary - "hud.diary": "Diario", - - "hud.free_look_indicator": "Vista libre activa. Pulsa {key} para desactivarla.", - "hud.camera_clamp_indicator": "Cámara fija vertical activa. Pulsa {key} para desactivarla.", - "hud.auto_walk_indicator": "Auto andar/nadar activado", - "hud.collect": "Recolectar", - "hud.pick_up": "Recoger", - "hud.open": "Abrir", - "hud.use": "Usar", - "hud.mine": "Picar", - "hud.talk": "Hablar", - "hud.trade": "Comerciar", - "hud.mount": "Montar", - "hud.sit": "Sentarse", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/sct.ftl b/assets/voxygen/i18n/es_ES/hud/sct.ftl new file mode 100644 index 0000000000..f19983caf4 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = Experiencia { $amount } +hud-sct-block = BLOQUEADO \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/sct.ron b/assets/voxygen/i18n/es_ES/hud/sct.ron deleted file mode 100644 index 5280b8bf47..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - // SCT outputs - "hud.sct.experience": "Experiencia {amount}", - "hud.sct.block": "BLOQUEADO", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/settings.ftl b/assets/voxygen/i18n/es_ES/hud/settings.ftl new file mode 100644 index 0000000000..f8e21e20d0 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/settings.ftl @@ -0,0 +1,121 @@ +hud-settings-general = General +hud-settings-none = Ninguno +hud-settings-press_behavior-toggle = Alternar +hud-settings-press_behavior-hold = Mantener +hud-settings-help_window = Ventana de Ayuda +hud-settings-debug_info = Info de Depuración +hud-settings-show_hitboxes = Mostrar cajas de golpe +hud-settings-show_chat = Mostrar chat +hud-settings-show_hotkey_hints = Mostrar sugerencias de atajos +hud-settings-tips_on_startup = Consejos Iniciales +hud-settings-ui_scale = Escala-IU +hud-settings-relative_scaling = Escala Relativa +hud-settings-custom_scaling = Escala Personalizada +hud-settings-crosshair = Punto de Mira +hud-settings-opacity = Opacidad +hud-settings-hotbar = Barra Rápida +hud-settings-toggle_shortcuts = Alternar Atajos +hud-settings-buffs_skillbar = Estados en Barra de Habilidades. +hud-settings-buffs_mmap = Estados en el Minimapa +hud-settings-toggle_bar_experience = Alternar Barra de Experiencia +hud-settings-scrolling_combat_text = Texto de Combate Deslizante +hud-settings-incoming_damage = Daño Entrante +hud-settings-speech_bubble = Burbuja de Diálogo +hud-settings-speech_bubble_self = Mostrar Diálogos propios en Burbuja +hud-settings-speech_bubble_dark_mode = Modo Oscuro de Burbuja de Diálogo +hud-settings-speech_bubble_icon = Icono de Burbuja de Diálogo +hud-settings-energybar_numbers = Números de Barra de Energía +hud-settings-always_show_bars = Siempre Mostrar Barras de Energía +hud-settings-values = Valores +hud-settings-percentages = Porcentajes +hud-settings-chat = Chat +hud-settings-background_opacity = Opacidad del Fondo +hud-settings-chat_character_name = Nombres de Personajes en el chat +hud-settings-loading_tips = Consejos mientras se carga +hud-settings-reset_interface = Restablecer Por Defecto +hud-settings-pan_sensitivity = Sensibilidad de Paneo +hud-settings-zoom_sensitivity = Sensibilidad de Zoom +hud-settings-camera_clamp_angle = Ángulo para el modo fijo de la cámara vertical +hud-settings-invert_scroll_zoom = Invertir el Deslizamiento del Zoom +hud-settings-invert_mouse_y_axis = Invertir Eje Y del Ratón +hud-settings-invert_controller_y_axis = Invert Eje Y del Mando +hud-settings-enable_mouse_smoothing = Suavizado de Cámara +hud-settings-free_look_behavior = Comportamiento de vista libre +hud-settings-auto_walk_behavior = Comportamiento de autoandar +hud-settings-camera_clamp_behavior = Comportamiento de la cámara fija +hud-settings-player_physics_behavior = Física de Jugador (experimental) +hud-settings-stop_auto_walk_on_input = Detener autoandar en movimiento +hud-settings-auto_camera = Cámara automática +hud-settings-reset_gameplay = Restablecer Valores Por Defecto +hud-settings-view_distance = Distancia de Visión +hud-settings-sprites_view_distance = Distancia de Visión de Sprites +hud-settings-figures_view_distance = Distancia de Visión de Entidades +hud-settings-maximum_fps = FPS Máximos +hud-settings-background_fps = FPS de Fondo +hud-settings-present_mode = Modo Presente +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Inmediato +hud-settings-fov = Campo de visión en (grados) +hud-settings-gamma = Gamma +hud-settings-exposure = Exposición +hud-settings-ambiance = Brillo Ambiental +hud-settings-antialiasing_mode = Modo AntiAliasing +hud-settings-upscale_factor = Resolución Interna +hud-settings-cloud_rendering_mode = Modo Renderizado de Nubes +hud-settings-fluid_rendering_mode = Modo Renderizado de Fluido +hud-settings-fluid_rendering_mode-cheap = Barato +hud-settings-fluid_rendering_mode-shiny = Brillante +hud-settings-cloud_rendering_mode-minimal = Mínimo +hud-settings-cloud_rendering_mode-low = Bajo +hud-settings-cloud_rendering_mode-medium = Medio +hud-settings-cloud_rendering_mode-high = Alto +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Pantalla Completa +hud-settings-fullscreen_mode = Modo de Pantalla Completa +hud-settings-fullscreen_mode-exclusive = Completo +hud-settings-fullscreen_mode-borderless = Sin bordes +hud-settings-gpu_profiler = Habilitar GPU timing (no soportado en todos los sistemas) +hud-settings-particles = Partículas +hud-settings-lossy_terrain_compression = Comprensión del terreno +hud-settings-resolution = Resolución +hud-settings-bit_depth = Profundidad de Bits +hud-settings-refresh_rate = Tasa de Refresco +hud-settings-lighting_rendering_mode = Modo de Renderizado de Luz +hud-settings-lighting_rendering_mode-ashikhmin = Tipo A - Alto +hud-settings-lighting_rendering_mode-blinnphong = Tipo B - Medio +hud-settings-lighting_rendering_mode-lambertian = Tipo L - Barato +hud-settings-shadow_rendering_mode = Modo de Renderizado de Sombras +hud-settings-shadow_rendering_mode-none = Ninguno +hud-settings-shadow_rendering_mode-cheap = Barato +hud-settings-shadow_rendering_mode-map = Mapeado +hud-settings-shadow_rendering_mode-map-resolution = Resolución +hud-settings-lod_detail = Nivel de Detalle +hud-settings-save_window_size = Guardar tamaño de ventana +hud-settings-reset_graphics = Restablecer Valores Por Defecto +hud-settings-bloom = Efecto Cámara +hud-settings-master_volume = Volumen Principal +hud-settings-inactive_master_volume_perc = Volumen Ventana Inactivo +hud-settings-music_volume = Volumen de Música +hud-settings-sound_effect_volume = Volumen de Efectos de Sonido +hud-settings-audio_device = Dispositivo de Audio +hud-settings-reset_sound = Restablecer Valores Por Defecto +hud-settings-english_fallback = Mostrar inglés para traducciones pendientes +hud-settings-awaitingkey = Pulsa una tecla... +hud-settings-unbound = Ninguno +hud-settings-reset_keybinds = Restablecer Valores Por Defecto +hud-settings-chat_tabs = Pestañas de Chat +hud-settings-label = Etiqueta: +hud-settings-delete = Borrar +hud-settings-show_all = Mostrar Todo +hud-settings-messages = Mensajes +hud-settings-activity = Actividad +hud-settings-death = Muerte +hud-settings-group = Grupo +hud-settings-faction = Facción +hud-settings-world = Mundo +hud-settings-region = Región +hud-settings-say = Decir +hud-settings-all = Todo +hud-settings-group_only = Solo a grupo +hud-settings-reset_chat = Restablecer Valores Por Defecto \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/settings.ron b/assets/voxygen/i18n/es_ES/hud/settings.ron deleted file mode 100644 index b765788888..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/settings.ron +++ /dev/null @@ -1,138 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - // Settings - "hud.settings.general": "General", - "hud.settings.none": "Ninguno", - "hud.settings.press_behavior.toggle": "Alternar", - "hud.settings.press_behavior.hold": "Mantener", - "hud.settings.help_window": "Ventana de Ayuda", - "hud.settings.debug_info": "Info de Depuración", - "hud.settings.show_hitboxes": "Mostrar cajas de golpe", - "hud.settings.show_chat": "Mostrar chat", - "hud.settings.show_hotkey_hints": "Mostrar sugerencias de atajos", - "hud.settings.tips_on_startup": "Consejos Iniciales", - "hud.settings.ui_scale": "Escala-IU", - "hud.settings.relative_scaling": "Escala Relativa", - "hud.settings.custom_scaling": "Escala Personalizada", - "hud.settings.crosshair": "Punto de Mira", - "hud.settings.opacity": "Opacidad", - "hud.settings.hotbar": "Barra Rápida", - "hud.settings.toggle_shortcuts": "Alternar Atajos", - "hud.settings.buffs_skillbar": "Estados en Barra de Habilidades.", - "hud.settings.buffs_mmap": "Estados en el Minimapa", - "hud.settings.toggle_bar_experience": "Alternar Barra de Experiencia", - "hud.settings.scrolling_combat_text": "Texto de Combate Deslizante", - "hud.settings.incoming_damage": "Daño Entrante", - "hud.settings.speech_bubble": "Burbuja de Diálogo", - "hud.settings.speech_bubble_self": "Mostrar Diálogos propios en Burbuja", - "hud.settings.speech_bubble_dark_mode": "Modo Oscuro de Burbuja de Diálogo", - "hud.settings.speech_bubble_icon": "Icono de Burbuja de Diálogo", - "hud.settings.energybar_numbers": "Números de Barra de Energía", - "hud.settings.always_show_bars": "Siempre Mostrar Barras de Energía", - "hud.settings.values": "Valores", - "hud.settings.percentages": "Porcentajes", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Opacidad del Fondo", - "hud.settings.chat_character_name": "Nombres de Personajes en el chat", - "hud.settings.loading_tips": "Consejos mientras se carga", - "hud.settings.reset_interface": "Restablecer Por Defecto", - - "hud.settings.pan_sensitivity": "Sensibilidad de Paneo", - "hud.settings.zoom_sensitivity": "Sensibilidad de Zoom", - "hud.settings.camera_clamp_angle": "Ángulo para el modo fijo de la cámara vertical", - "hud.settings.invert_scroll_zoom": "Invertir el Deslizamiento del Zoom", - "hud.settings.invert_mouse_y_axis": "Invertir Eje Y del Ratón", - "hud.settings.invert_controller_y_axis": "Invert Eje Y del Mando", - "hud.settings.enable_mouse_smoothing": "Suavizado de Cámara", - "hud.settings.free_look_behavior": "Comportamiento de vista libre", - "hud.settings.auto_walk_behavior": "Comportamiento de autoandar", - "hud.settings.camera_clamp_behavior": "Comportamiento de la cámara fija", - "hud.settings.player_physics_behavior": "Física de Jugador (experimental)", - "hud.settings.stop_auto_walk_on_input": "Detener autoandar en movimiento", - "hud.settings.auto_camera": "Cámara automática", - "hud.settings.reset_gameplay": "Restablecer Valores Por Defecto", - - "hud.settings.view_distance": "Distancia de Visión", - "hud.settings.sprites_view_distance": "Distancia de Visión de Sprites", - "hud.settings.figures_view_distance": "Distancia de Visión de Entidades", - "hud.settings.maximum_fps": "FPS Máximos", - "hud.settings.background_fps": "FPS de Fondo", - "hud.settings.present_mode": "Modo Presente", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Inmediato", - "hud.settings.fov": "Campo de visión en (grados)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Exposición", - "hud.settings.ambiance": "Brillo Ambiental", - "hud.settings.antialiasing_mode": "Modo AntiAliasing", - "hud.settings.upscale_factor": "Resolución Interna", - "hud.settings.cloud_rendering_mode": "Modo Renderizado de Nubes", - "hud.settings.fluid_rendering_mode": "Modo Renderizado de Fluido", - "hud.settings.fluid_rendering_mode.cheap": "Barato", - "hud.settings.fluid_rendering_mode.shiny": "Brillante", - "hud.settings.cloud_rendering_mode.minimal": "Mínimo", - "hud.settings.cloud_rendering_mode.low": "Bajo", - "hud.settings.cloud_rendering_mode.medium": "Medio", - "hud.settings.cloud_rendering_mode.high": "Alto", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Pantalla Completa", - "hud.settings.fullscreen_mode": "Modo de Pantalla Completa", - "hud.settings.fullscreen_mode.exclusive": "Completo", - "hud.settings.fullscreen_mode.borderless": "Sin bordes", - "hud.settings.gpu_profiler": "Habilitar GPU timing (no soportado en todos los sistemas)", - "hud.settings.particles": "Partículas", - "hud.settings.lossy_terrain_compression": "Comprensión del terreno", - "hud.settings.resolution": "Resolución", - "hud.settings.bit_depth": "Profundidad de Bits", - "hud.settings.refresh_rate": "Tasa de Refresco", - "hud.settings.lighting_rendering_mode": "Modo de Renderizado de Luz", - "hud.settings.lighting_rendering_mode.ashikhmin": "Tipo A - Alto", - "hud.settings.lighting_rendering_mode.blinnphong": "Tipo B - Medio", - "hud.settings.lighting_rendering_mode.lambertian": "Tipo L - Barato", - "hud.settings.shadow_rendering_mode": "Modo de Renderizado de Sombras", - "hud.settings.shadow_rendering_mode.none": "Ninguno", - "hud.settings.shadow_rendering_mode.cheap": "Barato", - "hud.settings.shadow_rendering_mode.map": "Mapeado", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolución", - "hud.settings.lod_detail": "Nivel de Detalle", - "hud.settings.save_window_size": "Guardar tamaño de ventana", - "hud.settings.reset_graphics": "Restablecer Valores Por Defecto", - "hud.settings.bloom": "Efecto Cámara", - "hud.settings.master_volume": "Volumen Principal", - "hud.settings.inactive_master_volume_perc": "Volumen Ventana Inactivo", - "hud.settings.music_volume": "Volumen de Música", - "hud.settings.sound_effect_volume": "Volumen de Efectos de Sonido", - "hud.settings.audio_device": "Dispositivo de Audio", - "hud.settings.reset_sound": "Restablecer Valores Por Defecto", - - "hud.settings.english_fallback": "Mostrar inglés para traducciones pendientes", - - "hud.settings.awaitingkey": "Pulsa una tecla...", - "hud.settings.unbound": "Ninguno", - "hud.settings.reset_keybinds": "Restablecer Valores Por Defecto", - - "hud.settings.chat_tabs": "Pestañas de Chat", - "hud.settings.label": "Etiqueta:", - "hud.settings.delete": "Borrar", - "hud.settings.show_all": "Mostrar Todo", - "hud.settings.messages": "Mensajes", - "hud.settings.activity": "Actividad", - "hud.settings.death": "Muerte", - "hud.settings.group": "Grupo", - "hud.settings.faction": "Facción", - "hud.settings.world": "Mundo", - "hud.settings.region": "Región", - "hud.settings.say": "Decir", - "hud.settings.all": "Todo", - "hud.settings.group_only": "Solo a grupo", - "hud.settings.reset_chat" : "Restablecer Valores Por Defecto", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/skills.ftl b/assets/voxygen/i18n/es_ES/hud/skills.ftl new file mode 100644 index 0000000000..bae257e8c5 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Nuevo Punto de Habilidad +hud-skill-sp_available = PH disponibles { $number } +hud-skill-not_unlocked = Todavía no está desbloqueado +hud-skill-req_sp ={"\u000A"} + + Requiere { $number } PH +hud-skill-inc_health_title = Incrementar Salud +hud-skill-inc_health = Incrementa la salud máxima en { $boost }{ $SP } +hud-skill-inc_energy_title = Incrementar Energía +hud-skill-inc_energy = Incrementa la Energía máxima en { $boost }{ $SP } +hud-skill-unlck_sword_title = Desbloquear Espada +hud-skill-unlck_sword = Desbloquea el árbol de habilidades de la espada{ $SP } +hud-skill-unlck_axe_title = Desbloquear Hacha +hud-skill-unlck_axe = Desbloquea el árbol de habilidades del hacha{ $SP } +hud-skill-unlck_hammer_title = Desbloquear Martillo +hud-skill-unlck_hammer = Desbloquea el árbol de habilidades del martillo{ $SP } +hud-skill-unlck_bow_title = Desbloquea Arco +hud-skill-unlck_bow = Desbloquea el árbol de habilidades del arco{ $SP } +hud-skill-unlck_staff_title = Desbloquear Báculo +hud-skill-unlck_staff = Desbloquea el árbol de habilidades del báculo{ $SP } +hud-skill-unlck_sceptre_title = Desbloquear Cetro +hud-skill-unlck_sceptre = Desbloquea el árbol de habilidades del cetro{ $SP } +hud-skill-dodge_title = Esquivar +hud-skill-dodge = Esquivar al rodar es desencadenado con el botón central del ratón y concede inmunidad temporal a los ataques cuerpo a cuerpo (iframes) mientras ruedas +hud-skill-roll_energy_title = Coste de Energía al Rodar +hud-skill-roll_energy = Rodar usa un { $boost }% menos de energía{ $SP } +hud-skill-roll_speed_title = Velocidad al Rodar +hud-skill-roll_speed = Rodar es un { $boost }% más rápido{ $SP } +hud-skill-roll_dur_title = Duración de Rodar +hud-skill-roll_dur = Rodar dura un { $boost }% más de tiempo{ $SP } +hud-skill-climbing_title = Escalada +hud-skill-climbing = Llegar más alto +hud-skill-climbing_cost_title = Coste de Energía de Escalar +hud-skill-climbing_cost = Escalar usa un { $boost }% menos de energía{ $SP } +hud-skill-climbing_speed_title = Velocidad al Escalar +hud-skill-climbing_speed = Escalar es un { $boost }% más rápido{ $SP } +hud-skill-swim_title = Nadar +hud-skill-swim = Moverte por entornos húmedos +hud-skill-swim_speed_title = Velocidad al Nadar +hud-skill-swim_speed = Nadas un { $boost }% más rápido{ $SP } +hud-skill-sc_lifesteal_title = Rayo Robavida +hud-skill-sc_lifesteal = Succiona la vida de tus enemigos +hud-skill-sc_lifesteal_damage_title = Daño +hud-skill-sc_lifesteal_damage = Hace un { $boost }% más de daño{ $SP } +hud-skill-sc_lifesteal_range_title = Alcance +hud-skill-sc_lifesteal_range = Tu rayo llega un { $boost }% más lejos{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Robavida +hud-skill-sc_lifesteal_lifesteal = Convierte un { $boost }% adicional del daño a vida{ $SP } +hud-skill-sc_lifesteal_regen_title = Regeneración de Energía +hud-skill-sc_lifesteal_regen = Recupera un { $boost }% de energía adicional{ $SP } +hud-skill-sc_heal_title = Aura Sanadora +hud-skill-sc_heal = Sanas a tus aliados usando la sangre de tus enemigos, requiere combate para ser activado +hud-skill-sc_heal_heal_title = Sanación +hud-skill-sc_heal_heal = Incrementa la Sanación que haces en un { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Coste de Energía +hud-skill-sc_heal_cost = Sanar consume un { $boost }% menos de energía{ $SP } +hud-skill-sc_heal_duration_title = Duración +hud-skill-sc_heal_duration = Los efectos de tu aura de sanación duran un { $boost }% más{ $SP } +hud-skill-sc_heal_range_title = Radio +hud-skill-sc_heal_range = Tu aura sanadora llega un { $boost }% más lejos{ $SP } +hud-skill-sc_wardaura_unlock_title = Desbloquear Aura Protectora +hud-skill-sc_wardaura_unlock = Te permite proteger a tus aliados de los ataques enemigos{ $SP } +hud-skill-sc_wardaura_strength_title = Fuerza +hud-skill-sc_wardaura_strength = La fuerza de tu protección se incrementa en un { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Duración +hud-skill-sc_wardaura_duration = Los efectos de tu última protección duran un { $boost }% más{ $SP } +hud-skill-sc_wardaura_range_title = Radio +hud-skill-sc_wardaura_range = Tu protección llega un { $boost }% más lejos{ $SP } +hud-skill-sc_wardaura_cost_title = Coste de Energía +hud-skill-sc_wardaura_cost = Crear la protección requiere un { $boost }% menos de energía{ $SP } +hud-skill-st_shockwave_range_title = Alcance de Onda de Choque +hud-skill-st_shockwave_range = Lanza cosas que antes estaban fuera de tu alcance, alcance incrementado { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Coste de Onda de Choque +hud-skill-st_shockwave_cost = Reduce el coste de energía para lanzar aldeanos indefensos en un { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Retroceso de Onda de Choque +hud-skill-st_shockwave_knockback = Incrementa el potencial de lanzamiento por { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Daño de Onda de Choque +hud-skill-st_shockwave_damage = Incrementa el daño causado en un { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Desbloquear Onda De Choque +hud-skill-st_shockwave_unlock = Desbloquea la habilidad de lanzar a los enemigos usando fuego{ $SP } +hud-skill-st_flamethrower_title = Lanzallamas +hud-skill-st_flamethrower = Lanza fuego, cocínalos a todos +hud-skill-st_flame_velocity_title = Velocidad de la Llama +hud-skill-st_flame_velocity = Haz que el fuego vaya más rápido, en un { $boost }%{ $SP } +hud-skill-st_flamethrower_range_title = Alcance del Lanzallamas +hud-skill-st_flamethrower_range = Para cuando las llamas no llegan, un { $boost }% más lejos{ $SP } +hud-skill-st_energy_drain_title = Drenaje de Energía +hud-skill-st_energy_drain = Reduce la tasa de drenaje de energía en un { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Daño del Lanzallamas +hud-skill-st_flamethrower_damage = Incrementa el daño en un { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Radio de explosión +hud-skill-st_explosion_radius = Más grande es mejor, Incrementa el radio de explosión en un { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Regeneración de Energía +hud-skill-st_energy_regen = Incrementa la regeneración de energía en un { $boost }%{ $SP } +hud-skill-st_fireball_title = Bola de Fuego +hud-skill-st_fireball = Dispara una bola de fuego que explota al impactar +hud-skill-st_damage_title = Daño +hud-skill-st_damage = Incrementa el daño en un { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Velocidad de proyectil +hud-skill-bow_projectile_speed = Te permite disparar flechas más lejos, más rápido, en un { $boost }%{ $SP } +hud-skill-bow_charged_title = Tiro Cargado +hud-skill-bow_charged = Porque esperastes mucho +hud-skill-bow_charged_damage_title = Daño Cargado +hud-skill-bow_charged_damage = Incrementa el daño en un { $boost }%{ $SP } +hud-skill-bow_energy_regen_title = Regeneración Cargada +hud-skill-bow_energy_regen = Incrementa la recuperación de energía en un { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Retroceso Cargado +hud-skill-bow_charged_knockback = Haz retroceder a los enemigos un { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = Velocidad de Cargado +hud-skill-bow_charged_speed = Incrementa la velocidad a la que cargas el ataque en un { $boost }%{ $SP } +hud-skill-bow_charged_move_speed_title = Velocidad de Mov. Cargado +hud-skill-bow_charged_move_speed = Incrementa la velocidad con la que puedes desplazarte mientras cargas el ataque en un { $boost }%{ $SP } +hud-skill-bow_repeater_title = Repetidor +hud-skill-bow_repeater = Dispara más rápido cuanto más disparas +hud-skill-bow_repeater_damage_title = Daño Repetidor +hud-skill-bow_repeater_damage = Incrementa el daño realizado en un { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Coste Repetidor +hud-skill-bow_repeater_cost = Reduce el coste energía al empezar un repetidor en un { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Velocidad Repetidor +hud-skill-bow_repeater_speed = Incrementa la tasa de disparo de flechas en un { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Desbloquear Escopeta +hud-skill-bow_shotgun_unlock = Desbloquea la capacidad de disparar multiples flechas a la vez{ $SP } +hud-skill-bow_shotgun_damage_title = Daño Escopeta +hud-skill-bow_shotgun_damage = Incrementa el daño hecho en un { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Coste Escopeta +hud-skill-bow_shotgun_cost = Reduce el coste de escopeta en un { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Flechas Escopeta +hud-skill-bow_shotgun_arrow_count = Incrementa el número de flechas por disparo en { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Difusión Escopeta +hud-skill-bow_shotgun_spread = Reduce la dispersión de las flechas en un { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Radio de Salto +hud-skill-hmr_leap_radius = Incrementa el radio de ataque en el suelo del golpe en { $boost } metro{ $SP } +hud-skill-hmr_leap_distance_title = Distancia de Salto +hud-skill-hmr_leap_distance = Incrementa la distancia del salto en un { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Coste del Salto +hud-skill-hmr_leap_cost = Reduce el coste del salto en un { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Retroceso de Salto +hud-skill-hmr_leap_knockback = Incrementa el retroceso del salto en un { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Daño de Salto +hud-skill-hmr_leap_damage = Incrementa el daño del salto en un { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Desbloquear Salto +hud-skill-hmr_unlock_leap = Desbloquea un Salto{ $SP } +hud-skill-hmr_charged_melee_title = Cuerpo a Cuerpo Cargado +hud-skill-hmr_charged_melee = Cuerpo a cuerpo pero cargado +hud-skill-hmr_charged_rate_title = Tasa de Cargado +hud-skill-hmr_charged_rate = Incrementa la tasa de carga del golpe en un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Drenaje Energía Cuerpo a Cuerpo Cargado +hud-skill-hmr_charged_melee_nrg_drain = Reduce la tasa de drenaje de energía al cargar en un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Daño Cuerpo a Cuerpo Cargado +hud-skill-hmr_charged_melee_damage = Incrementa el daño del golpe cargado en un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Retroceso Cuerpo a Cuerpo Cargado +hud-skill-hmr_charged_melee_knockback = Incrementa masivamente el potencial de lanzamiento del golpe en un { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Golpe único +hud-skill-hmr_single_strike = Tan único como tú +hud-skill-hmr_single_strike_regen_title = Regeneración de Golpe Único +hud-skill-hmr_single_strike_regen = Incrementa la energía ganada con cada golpe sucesivo{ $SP } +hud-skill-hmr_single_strike_speed_title = Velocidad de Golpe Único +hud-skill-hmr_single_strike_speed = Incrementa la velocidad de ataque con cada golpe sucesivo{ $SP } +hud-skill-hmr_single_strike_damage_title = Daño de Golpe Único +hud-skill-hmr_single_strike_damage = Incrementa el daño con cada golpe sucesivo{ $SP } +hud-skill-hmr_single_strike_knockback_title = Retroceso de Golpe Único +hud-skill-hmr_single_strike_knockback = Incrementa el retroceso de los golpes en un { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Golpe triple +hud-skill-sw_trip_str = Golpe, hasta tres veces +hud-skill-sw_trip_str_combo_title = Combo de Golpe Triple +hud-skill-sw_trip_str_combo = Desbloquea el combo potente de golpe triple{ $SP } +hud-skill-sw_trip_str_dmg_title = Daño de Golpe Triple +hud-skill-sw_trip_str_dmg = Incrementa el daño que hace cada golpe sucesivo{ $SP } +hud-skill-sw_trip_str_sp_title = Velocidad de Golpe Triple +hud-skill-sw_trip_str_sp = Incrementa la velocidad de ataque obtenida por cada golpe sucesivo{ $SP } +hud-skill-sw_trip_str_reg_title = Regeneracion de Golpe Triple +hud-skill-sw_trip_str_reg = Incrementa la energía ganada en cada golpe sucesivo{ $SP } +hud-skill-sw_dash_title = Embestida +hud-skill-sw_dash = Embiste a tus enemigos +hud-skill-sw_dash_dmg_title = Daño de Embestida +hud-skill-sw_dash_dmg = Incrementa el daño inicial de embestida en un { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Drenaje de Carga +hud-skill-sw_dash_drain = Reduce la tasa de drenaje de energía al embestir en un { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Coste de Embestida +hud-skill-sw_dash_cost = Reduce el coste inicial de la embestida en un { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Velocidad de Embestida +hud-skill-sw_dash_speed = Incrementa la velocidad al embestir en un { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Embestida Atravesante +hud-skill-sw_dash_charge_through = Te permite embestir atravesando los primeros enemigos que golpeas{ $SP } +hud-skill-sw_dash_scale_title = Intensidad Daño de Embestida +hud-skill-sw_dash_scale = Incrementa el daño cuanto más embistes en un { $boost }%{ $SP } +hud-skill-sw_spin_title = Desbloquear Giro +hud-skill-sw_spin = Desbloquea el giro de la espada{ $SP } +hud-skill-sw_spin_dmg_title = Daño por Giro +hud-skill-sw_spin_dmg = Incrementa el daño realizado en un { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Velocidad de Giro +hud-skill-sw_spin_spd = Incrementa la velocidad de giro en un { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Coste de Giro +hud-skill-sw_spin_cost = Reduce el coste de energía de cada giro en un { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Gira que Gira +hud-skill-sw_spin_spins = Incrementa el número de veces que puedes girar{ $SP } +hud-skill-sw_interrupt_title = Interrupción de Ataques +hud-skill-sw_interrupt = Te permite cancelar inmediatamente un ataque con otro ataque{ $SP } +hud-skill-axe_double_strike_title = Golpe Doble +hud-skill-axe_double_strike = Haz picadillo a esos villanos +hud-skill-axe_double_strike_combo_title = Combo Golpe Doble +hud-skill-axe_double_strike_combo = Desbloquea un segundo golpe{ $SP } +hud-skill-axe_double_strike_damage_title = Daño de Golpe Doble +hud-skill-axe_double_strike_damage = Incrementa el daño infligido en cada golpe sucesivo{ $SP } +hud-skill-axe_double_strike_speed_title = Velocidad de Golpe Doble +hud-skill-axe_double_strike_speed = Incrementa la velocidad de ataque con cada golpe sucesivo{ $SP } +hud-skill-axe_double_strike_regen_title = Regeneración de Golpe Doble +hud-skill-axe_double_strike_regen = Incrementa la ganancia de energía con cada golpe sucesivo{ $SP } +hud-skill-axe_spin_title = Giro de Hacha +hud-skill-axe_spin = Haces girar el hacha... +hud-skill-axe_infinite_axe_spin_title = Giro de Hacha Infinito +hud-skill-axe_infinite_axe_spin = Gira durante tanto tiempo como energía tengas{ $SP } +hud-skill-axe_spin_damage_title = Daño Giro +hud-skill-axe_spin_damage = Incrementa el daño que hace cada giro en un { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Helicóptero Giratorio +hud-skill-axe_spin_helicopter = Caes un poco más lento mientras giras{ $SP } +hud-skill-axe_spin_speed_title = Velocidad de Giro +hud-skill-axe_spin_speed = Incrementa tu velocidad de giro en un { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Coste de Giro +hud-skill-axe_spin_cost = Reduce el coste de energía de los giros en un { $boost }% +hud-skill-axe_unlock_leap_title = Desbloquear Salto +hud-skill-axe_unlock_leap = Desbloquea salto giratorio{ $SP } +hud-skill-axe_leap_damage_title = Daño de Salto +hud-skill-axe_leap_damage = Incrementa el daño del salto en un { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Retroceso de Salto +hud-skill-axe_leap_knockback = Incrementa el retroceso del salto en un { $boost }% +hud-skill-axe_leap_cost_title = Coste del Salto +hud-skill-axe_leap_cost = Reduce el coste del salto en un { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Distancia de Salto +hud-skill-axe_leap_distance = Incrementa la distancia del salto en un { $boost }%{ $SP } +hud-skill-mining_title = Minería +hud-skill-pick_strike_title = Golpe de Pico +hud-skill-pick_strike = Pica rocas con el pico para ganar minerales, gemas y experiencia +hud-skill-pick_strike_speed_title = Velocidad Golpe de Pico +hud-skill-pick_strike_speed = Pica rocas más rápido{ $SP } +hud-skill-pick_strike_oregain_title = Producción de Minerales de Golpe de Pico +hud-skill-pick_strike_oregain = Probabilidad de ganar minerales extras un ({ $boost }% por nivel){ $SP } +hud-skill-pick_strike_gemgain_title = Producción de Gemas de Golpe de Pico +hud-skill-pick_strike_gemgain = Probabilidad de ganar gemas extras un ({ $boost }% por nivel){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/skills.ron b/assets/voxygen/i18n/es_ES/hud/skills.ron deleted file mode 100644 index c24ddbbc63..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.rank_up": "Nuevo Punto de Habilidad", - "hud.skill.sp_available": "PH disponibles {number}", - "hud.skill.not_unlocked": "Todavía no está desbloqueado", - "hud.skill.req_sp": "\n\nRequiere {number} PH", - // Skills - // General - "hud.skill.inc_health_title": "Incrementar Salud", - "hud.skill.inc_health": "Incrementa la salud máxima en {boost}{SP}", - "hud.skill.inc_energy_title": "Incrementar Energía", - "hud.skill.inc_energy": "Incrementa la Energía máxima en {boost}{SP}", - "hud.skill.unlck_sword_title": "Desbloquear Espada", - "hud.skill.unlck_sword": "Desbloquea el árbol de habilidades de la espada{SP}", - "hud.skill.unlck_axe_title": "Desbloquear Hacha", - "hud.skill.unlck_axe": "Desbloquea el árbol de habilidades del hacha{SP}", - "hud.skill.unlck_hammer_title": "Desbloquear Martillo", - "hud.skill.unlck_hammer": "Desbloquea el árbol de habilidades del martillo{SP}", - "hud.skill.unlck_bow_title": "Desbloquea Arco", - "hud.skill.unlck_bow": "Desbloquea el árbol de habilidades del arco{SP}", - "hud.skill.unlck_staff_title": "Desbloquear Báculo", - "hud.skill.unlck_staff": "Desbloquea el árbol de habilidades del báculo{SP}", - "hud.skill.unlck_sceptre_title": "Desbloquear Cetro", - "hud.skill.unlck_sceptre": "Desbloquea el árbol de habilidades del cetro{SP}", - "hud.skill.dodge_title": "Esquivar", - "hud.skill.dodge": "Esquivar al rodar es desencadenado con el botón central del ratón y concede inmunidad temporal a los ataques cuerpo a cuerpo (iframes) mientras ruedas", - "hud.skill.roll_energy_title": "Coste de Energía al Rodar", - "hud.skill.roll_energy": "Rodar usa un {boost}% menos de energía{SP}", - "hud.skill.roll_speed_title": "Velocidad al Rodar", - "hud.skill.roll_speed": "Rodar es un {boost}% más rápido{SP}", - "hud.skill.roll_dur_title": "Duración de Rodar", - "hud.skill.roll_dur": "Rodar dura un {boost}% más de tiempo{SP}", - "hud.skill.climbing_title": "Escalada", - "hud.skill.climbing": "Llegar más alto", - "hud.skill.climbing_cost_title": "Coste de Energía de Escalar", - "hud.skill.climbing_cost": "Escalar usa un {boost}% menos de energía{SP}", - "hud.skill.climbing_speed_title": "Velocidad al Escalar", - "hud.skill.climbing_speed": "Escalar es un {boost}% más rápido{SP}", - "hud.skill.swim_title": "Nadar", - "hud.skill.swim": "Moverte por entornos húmedos", - "hud.skill.swim_speed_title": "Velocidad al Nadar", - "hud.skill.swim_speed": "Nadas un {boost}% más rápido{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Rayo Robavida", - "hud.skill.sc_lifesteal": "Succiona la vida de tus enemigos", - "hud.skill.sc_lifesteal_damage_title": "Daño", - "hud.skill.sc_lifesteal_damage": "Hace un {boost}% más de daño{SP}", - "hud.skill.sc_lifesteal_range_title": "Alcance", - "hud.skill.sc_lifesteal_range": "Tu rayo llega un {boost}% más lejos{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Robavida", - "hud.skill.sc_lifesteal_lifesteal": "Convierte un {boost}% adicional del daño a vida{SP}", - "hud.skill.sc_lifesteal_regen_title": "Regeneración de Energía", - "hud.skill.sc_lifesteal_regen": "Recupera un {boost}% de energía adicional{SP}", - "hud.skill.sc_heal_title": "Aura Sanadora", - "hud.skill.sc_heal": "Sanas a tus aliados usando la sangre de tus enemigos, requiere combate para ser activado", - "hud.skill.sc_heal_heal_title": "Sanación", - "hud.skill.sc_heal_heal": "Incrementa la Sanación que haces en un {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Coste de Energía", - "hud.skill.sc_heal_cost": "Sanar consume un {boost}% menos de energía{SP}", - "hud.skill.sc_heal_duration_title": "Duración", - "hud.skill.sc_heal_duration": "Los efectos de tu aura de sanación duran un {boost}% más{SP}", - "hud.skill.sc_heal_range_title": "Radio", - "hud.skill.sc_heal_range": "Tu aura sanadora llega un {boost}% más lejos{SP}", - "hud.skill.sc_wardaura_unlock_title": "Desbloquear Aura Protectora", - "hud.skill.sc_wardaura_unlock": "Te permite proteger a tus aliados de los ataques enemigos{SP}", - "hud.skill.sc_wardaura_strength_title": "Fuerza", - "hud.skill.sc_wardaura_strength": "La fuerza de tu protección se incrementa en un {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Duración", - "hud.skill.sc_wardaura_duration": "Los efectos de tu última protección duran un {boost}% más{SP}", - "hud.skill.sc_wardaura_range_title": "Radio", - "hud.skill.sc_wardaura_range": "Tu protección llega un {boost}% más lejos{SP}", - "hud.skill.sc_wardaura_cost_title": "Coste de Energía", - "hud.skill.sc_wardaura_cost": "Crear la protección requiere un {boost}% menos de energía{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Alcance de Onda de Choque", - "hud.skill.st_shockwave_range" : "Lanza cosas que antes estaban fuera de tu alcance, alcance incrementado {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Coste de Onda de Choque", - "hud.skill.st_shockwave_cost" : "Reduce el coste de energía para lanzar aldeanos indefensos en un {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Retroceso de Onda de Choque", - "hud.skill.st_shockwave_knockback" : "Incrementa el potencial de lanzamiento por {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Daño de Onda de Choque", - "hud.skill.st_shockwave_damage" : "Incrementa el daño causado en un {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Desbloquear Onda De Choque", - "hud.skill.st_shockwave_unlock" : "Desbloquea la habilidad de lanzar a los enemigos usando fuego{SP}", - "hud.skill.st_flamethrower_title" : "Lanzallamas", - "hud.skill.st_flamethrower" : "Lanza fuego, cocínalos a todos", - "hud.skill.st_flame_velocity_title" : "Velocidad de la Llama", - "hud.skill.st_flame_velocity" : "Haz que el fuego vaya más rápido, en un {boost}%{SP}", - "hud.skill.st_flamethrower_range_title" : "Alcance del Lanzallamas", - "hud.skill.st_flamethrower_range" : "Para cuando las llamas no llegan, un {boost}% más lejos{SP}", - "hud.skill.st_energy_drain_title" : "Drenaje de Energía", - "hud.skill.st_energy_drain" : "Reduce la tasa de drenaje de energía en un {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Daño del Lanzallamas", - "hud.skill.st_flamethrower_damage" : "Incrementa el daño en un {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Radio de explosión", - "hud.skill.st_explosion_radius" : "Más grande es mejor, Incrementa el radio de explosión en un {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Regeneración de Energía", - "hud.skill.st_energy_regen" : "Incrementa la regeneración de energía en un {boost}%{SP}", - "hud.skill.st_fireball_title" : "Bola de Fuego", - "hud.skill.st_fireball" : "Dispara una bola de fuego que explota al impactar", - "hud.skill.st_damage_title" : "Daño", - "hud.skill.st_damage" : "Incrementa el daño en un {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Velocidad de proyectil", - "hud.skill.bow_projectile_speed" : "Te permite disparar flechas más lejos, más rápido, en un {boost}%{SP}", - "hud.skill.bow_charged_title" : "Tiro Cargado", - "hud.skill.bow_charged" : "Porque esperastes mucho", - "hud.skill.bow_charged_damage_title" : "Daño Cargado", - "hud.skill.bow_charged_damage" : "Incrementa el daño en un {boost}%{SP}", - "hud.skill.bow_energy_regen_title" : "Regeneración Cargada", - "hud.skill.bow_energy_regen" : "Incrementa la recuperación de energía en un {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Retroceso Cargado", - "hud.skill.bow_charged_knockback" : "Haz retroceder a los enemigos un {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "Velocidad de Cargado", - "hud.skill.bow_charged_speed" : "Incrementa la velocidad a la que cargas el ataque en un {boost}%{SP}", - "hud.skill.bow_charged_move_speed_title" : "Velocidad de Mov. Cargado", - "hud.skill.bow_charged_move_speed" : "Incrementa la velocidad con la que puedes desplazarte mientras cargas el ataque en un {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Repetidor", - "hud.skill.bow_repeater" : "Dispara más rápido cuanto más disparas", - "hud.skill.bow_repeater_damage_title" : "Daño Repetidor", - "hud.skill.bow_repeater_damage" : "Incrementa el daño realizado en un {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Coste Repetidor", - "hud.skill.bow_repeater_cost" : "Reduce el coste energía al empezar un repetidor en un {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Velocidad Repetidor", - "hud.skill.bow_repeater_speed" : "Incrementa la tasa de disparo de flechas en un {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Desbloquear Escopeta", - "hud.skill.bow_shotgun_unlock" : "Desbloquea la capacidad de disparar multiples flechas a la vez{SP}", - "hud.skill.bow_shotgun_damage_title" : "Daño Escopeta", - "hud.skill.bow_shotgun_damage" : "Incrementa el daño hecho en un {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Coste Escopeta", - "hud.skill.bow_shotgun_cost" : "Reduce el coste de escopeta en un {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Flechas Escopeta", - "hud.skill.bow_shotgun_arrow_count" : "Incrementa el número de flechas por disparo en {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Difusión Escopeta", - "hud.skill.bow_shotgun_spread" : "Reduce la dispersión de las flechas en un {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Radio de Salto", - "hud.skill.hmr_leap_radius" : "Incrementa el radio de ataque en el suelo del golpe en {boost} metro{SP}", - "hud.skill.hmr_leap_distance_title" : "Distancia de Salto", - "hud.skill.hmr_leap_distance" : "Incrementa la distancia del salto en un {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Coste del Salto", - "hud.skill.hmr_leap_cost" : "Reduce el coste del salto en un {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Retroceso de Salto", - "hud.skill.hmr_leap_knockback" : "Incrementa el retroceso del salto en un {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Daño de Salto", - "hud.skill.hmr_leap_damage" : "Incrementa el daño del salto en un {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Desbloquear Salto", - "hud.skill.hmr_unlock_leap" : "Desbloquea un Salto{SP}", - "hud.skill.hmr_charged_melee_title" : "Cuerpo a Cuerpo Cargado", - "hud.skill.hmr_charged_melee" : "Cuerpo a cuerpo pero cargado", - "hud.skill.hmr_charged_rate_title" : "Tasa de Cargado", - "hud.skill.hmr_charged_rate" : "Incrementa la tasa de carga del golpe en un {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Drenaje Energía Cuerpo a Cuerpo Cargado", - "hud.skill.hmr_charged_melee_nrg_drain" : "Reduce la tasa de drenaje de energía al cargar en un {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Daño Cuerpo a Cuerpo Cargado", - "hud.skill.hmr_charged_melee_damage" : "Incrementa el daño del golpe cargado en un {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Retroceso Cuerpo a Cuerpo Cargado", - "hud.skill.hmr_charged_melee_knockback" : "Incrementa masivamente el potencial de lanzamiento del golpe en un {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Golpe único", - "hud.skill.hmr_single_strike" : "Tan único como tú", - "hud.skill.hmr_single_strike_regen_title" : "Regeneración de Golpe Único", - "hud.skill.hmr_single_strike_regen" : "Incrementa la energía ganada con cada golpe sucesivo{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Velocidad de Golpe Único", - "hud.skill.hmr_single_strike_speed" : "Incrementa la velocidad de ataque con cada golpe sucesivo{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Daño de Golpe Único", - "hud.skill.hmr_single_strike_damage" : "Incrementa el daño con cada golpe sucesivo{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Retroceso de Golpe Único", - "hud.skill.hmr_single_strike_knockback" : "Incrementa el retroceso de los golpes en un {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Golpe triple", - "hud.skill.sw_trip_str": "Golpe, hasta tres veces", - "hud.skill.sw_trip_str_combo_title": "Combo de Golpe Triple", - "hud.skill.sw_trip_str_combo": "Desbloquea el combo potente de golpe triple{SP}", - "hud.skill.sw_trip_str_dmg_title": "Daño de Golpe Triple", - "hud.skill.sw_trip_str_dmg": "Incrementa el daño que hace cada golpe sucesivo{SP}", - "hud.skill.sw_trip_str_sp_title": "Velocidad de Golpe Triple", - "hud.skill.sw_trip_str_sp": "Incrementa la velocidad de ataque obtenida por cada golpe sucesivo{SP}", - "hud.skill.sw_trip_str_reg_title": "Regeneracion de Golpe Triple", - "hud.skill.sw_trip_str_reg": "Incrementa la energía ganada en cada golpe sucesivo{SP}", - "hud.skill.sw_dash_title": "Embestida", - "hud.skill.sw_dash": "Embiste a tus enemigos", - "hud.skill.sw_dash_dmg_title": "Daño de Embestida", - "hud.skill.sw_dash_dmg": "Incrementa el daño inicial de embestida en un {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Drenaje de Carga", - "hud.skill.sw_dash_drain": "Reduce la tasa de drenaje de energía al embestir en un {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Coste de Embestida", - "hud.skill.sw_dash_cost": "Reduce el coste inicial de la embestida en un {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Velocidad de Embestida", - "hud.skill.sw_dash_speed": "Incrementa la velocidad al embestir en un {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Embestida Atravesante", - "hud.skill.sw_dash_charge_through": "Te permite embestir atravesando los primeros enemigos que golpeas{SP}", - "hud.skill.sw_dash_scale_title": "Intensidad Daño de Embestida", - "hud.skill.sw_dash_scale": "Incrementa el daño cuanto más embistes en un {boost}%{SP}", - "hud.skill.sw_spin_title": "Desbloquear Giro", - "hud.skill.sw_spin": "Desbloquea el giro de la espada{SP}", - "hud.skill.sw_spin_dmg_title": "Daño por Giro", - "hud.skill.sw_spin_dmg": "Incrementa el daño realizado en un {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Velocidad de Giro", - "hud.skill.sw_spin_spd": "Incrementa la velocidad de giro en un {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Coste de Giro", - "hud.skill.sw_spin_cost": "Reduce el coste de energía de cada giro en un {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Gira que Gira", - "hud.skill.sw_spin_spins": "Incrementa el número de veces que puedes girar{SP}", - "hud.skill.sw_interrupt_title": "Interrupción de Ataques", - "hud.skill.sw_interrupt": "Te permite cancelar inmediatamente un ataque con otro ataque{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Golpe Doble", - "hud.skill.axe_double_strike": "Haz picadillo a esos villanos", - "hud.skill.axe_double_strike_combo_title": "Combo Golpe Doble", - "hud.skill.axe_double_strike_combo": "Desbloquea un segundo golpe{SP}", - "hud.skill.axe_double_strike_damage_title": "Daño de Golpe Doble", - "hud.skill.axe_double_strike_damage": "Incrementa el daño infligido en cada golpe sucesivo{SP}", - "hud.skill.axe_double_strike_speed_title": "Velocidad de Golpe Doble", - "hud.skill.axe_double_strike_speed": "Incrementa la velocidad de ataque con cada golpe sucesivo{SP}", - "hud.skill.axe_double_strike_regen_title": "Regeneración de Golpe Doble ", - "hud.skill.axe_double_strike_regen": "Incrementa la ganancia de energía con cada golpe sucesivo{SP}", - "hud.skill.axe_spin_title": "Giro de Hacha", - "hud.skill.axe_spin": "Haces girar el hacha...", - "hud.skill.axe_infinite_axe_spin_title": "Giro de Hacha Infinito", - "hud.skill.axe_infinite_axe_spin": "Gira durante tanto tiempo como energía tengas{SP}", - "hud.skill.axe_spin_damage_title": "Daño Giro", - "hud.skill.axe_spin_damage": "Incrementa el daño que hace cada giro en un {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Helicóptero Giratorio", - "hud.skill.axe_spin_helicopter": "Caes un poco más lento mientras giras{SP}", - "hud.skill.axe_spin_speed_title": "Velocidad de Giro", - "hud.skill.axe_spin_speed": "Incrementa tu velocidad de giro en un {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Coste de Giro", - "hud.skill.axe_spin_cost": "Reduce el coste de energía de los giros en un {boost}%", - "hud.skill.axe_unlock_leap_title": "Desbloquear Salto", - "hud.skill.axe_unlock_leap": "Desbloquea salto giratorio{SP}", - "hud.skill.axe_leap_damage_title": "Daño de Salto", - "hud.skill.axe_leap_damage": "Incrementa el daño del salto en un {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Retroceso de Salto", - "hud.skill.axe_leap_knockback": "Incrementa el retroceso del salto en un {boost}%", - "hud.skill.axe_leap_cost_title": "Coste del Salto", - "hud.skill.axe_leap_cost": "Reduce el coste del salto en un {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Distancia de Salto", - "hud.skill.axe_leap_distance": "Incrementa la distancia del salto en un {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Minería", - "hud.skill.pick_strike_title": "Golpe de Pico", - "hud.skill.pick_strike": "Pica rocas con el pico para ganar minerales, gemas y experiencia", - "hud.skill.pick_strike_speed_title": "Velocidad Golpe de Pico", - "hud.skill.pick_strike_speed": "Pica rocas más rápido{SP}", - "hud.skill.pick_strike_oregain_title": "Producción de Minerales de Golpe de Pico", - "hud.skill.pick_strike_oregain": "Probabilidad de ganar minerales extras un ({boost}% por nivel){SP}", - "hud.skill.pick_strike_gemgain_title": "Producción de Gemas de Golpe de Pico", - "hud.skill.pick_strike_gemgain": "Probabilidad de ganar gemas extras un ({boost}% por nivel){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/social.ftl b/assets/voxygen/i18n/es_ES/hud/social.ftl new file mode 100644 index 0000000000..c646610030 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Otros jugadores +hud-social-online = Conectados +hud-social-friends = Amigos +hud-social-not_yet_available = No disponible todavía +hud-social-faction = Facción +hud-social-play_online_fmt = { $nb_player } jugador(es) conectados +hud-social-name = Nombre +hud-social-level = Nivel +hud-social-zone = Zona +hud-social-account = Cuenta \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/social.ron b/assets/voxygen/i18n/es_ES/hud/social.ron deleted file mode 100644 index 60c55f26dd..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/social.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.social": "Otros jugadores", - "hud.social.online": "Conectados", - "hud.social.friends": "Amigos", - "hud.social.not_yet_available": "No disponible todavía", - "hud.social.faction": "Facción", - "hud.social.play_online_fmt": "{nb_player} jugador(es) conectados", - "hud.social.name": "Nombre", - "hud.social.level": "Nivel", - "hud.social.zone": "Zona", - "hud.social.account": "Cuenta", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_ES/hud/trade.ftl b/assets/voxygen/i18n/es_ES/hud/trade.ftl new file mode 100644 index 0000000000..eb4c37c0ad --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/trade.ftl @@ -0,0 +1,25 @@ +hud-trade-trade_window = Comercio +hud-trade-phase1_description = + Arrastra los objetos a comerciar + al área correspondiente +hud-trade-phase2_description = + El comercio está ahora bloqueado para darte + tiempo a revisarlo +hud-trade-phase3_description = El trato está siendo procesado +hud-trade-persons_offer = Oferta de { $playername } +hud-trade-has_accepted = + { $playername } + ha aceptado +hud-trade-accept = Aceptar +hud-trade-decline = Rechazar +hud-trade-invite_sent = Solicitud de comercio enviada a { $playername } +hud-trade-result-completed = Trato completado con éxito +hud-trade-result-declined = Trato rechazado +hud-trade-result-nospace = No hay suficiente espacio para completar el comercio +hud-trade-buy_price = Precio de Compra +hud-trade-sell_price = Precio de Venta +hud-trade-coin = moneda(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Tu oferta +hud-trade-their_offer = Su oferta \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/trade.ron b/assets/voxygen/i18n/es_ES/hud/trade.ron deleted file mode 100644 index 8bbf0ac187..0000000000 --- a/assets/voxygen/i18n/es_ES/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - "hud.trade.trade_window": "Comercio", - "hud.trade.phase1_description": "Arrastra los objetos a comerciar\n al área correspondiente", - "hud.trade.phase2_description": "El comercio está ahora bloqueado para darte \ntiempo a revisarlo", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "El trato está siendo procesado", - "hud.trade.persons_offer": "Oferta de {playername}", - "hud.trade.has_accepted": "{playername}\nha aceptado", - "hud.trade.accept": "Aceptar", - "hud.trade.decline": "Rechazar", - "hud.trade.invite_sent": "Solicitud de comercio enviada a {playername}", - "hud.trade.result.completed": "Trato completado con éxito", - "hud.trade.result.declined": "Trato rechazado", - "hud.trade.result.nospace": "No hay suficiente espacio para completar el comercio", - "hud.trade.buy_price": "Precio de Compra", - "hud.trade.sell_price": "Precio de Venta", - "hud.trade.coin": "moneda(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Tu oferta", - "hud.trade.their_offer": "Su oferta", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/es_ES/main.ftl b/assets/voxygen/i18n/es_ES/main.ftl new file mode 100644 index 0000000000..a6b6a05df3 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/main.ftl @@ -0,0 +1,94 @@ +main-username = Usuario +main-server = Servidor +main-password = Contraseña +main-connecting = Conectando +main-creating_world = Creando Mundo +main-tip = Consejo: +main-notice = + ¡Bienvenido a la versión alfa de Veloren! + + Antes de que te adentres en la diversión, por favor ten en cuenta un par de cosas: + + - Esto es una alfa muy temprana. Espera errores, mecánicas de juego muy inacabadas, mecánicas sin pulir, y cosas que faltan. + + - Si tienes críticas constructivas o reportes de error, puedes contactar con nosotros vía Reddit, GitLab, o nuestro servidor de Discord comunitario. + + - Veloren se licencia bajo la licencia de código abierto GPL 3. Esto quiere decir que eres libre para jugar, modificar y redistribuir el juego tal y como desees (siempre y cuando tal trabajo se licencie también bajo la GPL 3). + + - Veloren es un proyecto comunitario sin ánimo de lucro, y todo aquel que trabaja en él es un voluntario. + Si te gusta lo que ves, ¡eres bienvenido de unirte a los equipos de desarrollo o arte! + + Gracias por tomarte el tiempo de leer esta noticia, ¡esperamos que disfrutes del juego! + + ~ Los desarrolladores de Veloren +main-login_process = + Información sobre el Proceso de Login: + + Por favor, ten en cuenta que ahora necesitas una cuenta + para jugar en servidores con autenticación activada. + + Puedes crear una cuenta en + + https://veloren.net/account/. +main-login-server_not_found = Servidor no encontrado +main-login-authentication_error = Error de autenticación al servidor +main-login-failed_auth_server_url_invalid = Fallo al conectar con el servidor de Autenticación +main-login-insecure_auth_scheme = El esquema HTTP no esta soportado. ¡Es inseguro! Para propósitos de desarrollo, HTTP esta permitido para 'localhost' o versiones de depuración +main-login-server_full = El servidor está lleno +main-login-untrusted_auth_server = Servidor de Autenticación sin confianza +main-login-outdated_client_or_server = ServerEnloquecido: Probablemente las versiones son incompatibles, revisa si hay actualizaciones. +main-login-timeout = Timeout: El servidor no respondió a tiempo. (Sobrecargado o con problemas de red). +main-login-server_shut_down = Servidor apagado +main-login-network_error = Error de red +main-login-network_wrong_version = El servidor está ejecutando una versión diferente a la tuya. Comprueba tu versión y actualiza tu juego. +main-login-failed_sending_request = Petición al servidor de autenticación fallida +main-login-invalid_character = El personaje seleccionado no es válido +main-login-client_crashed = El cliente se cerró inesperadamente +main-login-not_on_whitelist = Necesitas estar en la lista blanca de un Administrador para poder unirte +main-login-banned = Has sido baneado por la siguiente razón +main-login-kicked = Has sido expulsado por la siguiente razón +main-login-select_language = Selecciona un idioma +main-login-client_version = Versión de Cliente +main-login-server_version = Versión de Servidor +main-login-client_init_failed = Fallo de Cliente al inicializar: { $init_fail_reason } +main-login-username_bad_characters = ¡Nombre de Usuario contiene caracteres inválidos! (Solo alfanuméricos, '_' y '-' están permitidos) +main-login-username_too_long = ¡Nombre de usuario demasiado largo! Máxima longitud es: { $max_len } +main-servers-select_server = Selecciona un servidor +main-servers-singleplayer_error = Fallo al conectar con el servidor interno: { $sp_error } +main-servers-network_error = Red de Servidor/Error de socket: { $raw_error } +main-servers-participant_error = Desconexión de Participante/error protocolo: { $raw_error } +main-servers-stream_error = Conexión de cliente/compression/error (de)serialización: { $raw_error } +main-servers-database_error = Error servidor base de datos: { $raw_error } +main-servers-persistence_error = Error servidor persistente (Probablemente datos Asset/Personaje): { $raw_error } +main-servers-other_error = Error servidor general: { $raw_error } +main-credits = Creditos +main-credits-created_by = creado por +main-credits-music = Música +main-credits-fonts = Fuentes +main-credits-other_art = Otros Artistas +main-credits-contributors = Colaboradores +loading-tips = + .a0 = Pulsa '{ $gameinput-togglelantern }' para encender tu linterna. + .a1 = Pulsa '{ $gameinput-help }' para ver todos las atajos de teclado predeterminados. + .a2 = Puedes escribir /say o /s para chatear con jugadores que estén a tu alrededor. + .a3 = Puedes escribir /region o /r para chatear con jugadores que se encuentren a doscientos bloques a tu alrededor. + .a4 = Administradores pueden usar el comando /build para entrar en modo construcción + .a5 = Puedes escribir /group o /g para chatear con jugadores en tu grupo actual. + .a6 = Para enviar mensajes privados escribe /tell seguido del nombre y tu mensaje. + .a7 = ¡Estate atento a la comida, cofres y otros botines esparcidos por el mundo! + .a8 = ¿Inventario lleno de comida? ¡Intenta elaborar mejor comida de ella! + .a9 = ¿Preguntándote que hacer? ¡Intenta hacer una de las mazmorras marcadas del mapa! + .a10 = No te olvides de ajustar los gráficos de tu sistema. Pulsa '{ $gameinput-settings }' para abrir la configuración. + .a11 = ¡Jugar con otros jugadores es divertido! Pulsa '{ $gameinput-social }' para ver quien esta en línea. + .a12 = Pulsa '{ $gameinput-dance }' para bailar. ¡Fiesta! + .a13 = Pulsa '{ $gameinput-glide }' para desplegar tu planeador y conquistar los cielos + .a14 = Veloren se encuentra todavia en Pre-Alpha. ¡Hacemos todo lo posible para mejorar la experiencia de juego día a día! + .a15 = Si quieres unirte al equipo de desarrollo o conversar con nosotros, únete a nuestro servidor de Discord. + .a16 = Puedes mostrar o ocultar tu total de salud en la barra de salud en ajustes. + .a17 = Siéntate cerca de una fogata (con la tecla '{ $gameinput-sit }') para recuperarte de tus heridas. + .a18 = ¿Necesitas más bolsas o mejores armaduras para continuar tu viaje? Pulsa '{ $gameinput-crafting }' para abrir el menú de elaboración. + .a19 = Pulsa '{ $gameinput-roll }' para rodar. Rodar puede se puede usar para moverte más rápido y esquivar los ataques. + .a20 = ¿Para que sirve este objeto? Buscar 'input:' en fabricación para ver que en que recetas se usa. + .a21 = ¿Eh mira eso? Toma un pantallazo pulsando '{ $gameinput-screenshot }'. + .a22 = Intenta saltar al rodar para pasar a través de las criaturas. + .a23 = Para ver tus atributos, haz clic en el botón 'Atributos' del inventario. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/main.ron b/assets/voxygen/i18n/es_ES/main.ron deleted file mode 100644 index 0ca292a499..0000000000 --- a/assets/voxygen/i18n/es_ES/main.ron +++ /dev/null @@ -1,114 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - /// Start Main screen section - "main.username": "Usuario", - "main.server": "Servidor", - "main.password": "Contraseña", - "main.connecting": "Conectando", - "main.creating_world": "Creando Mundo", - "main.tip": "Consejo:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"¡Bienvenido a la versión alfa de Veloren! - -Antes de que te adentres en la diversión, por favor ten en cuenta un par de cosas: - -- Esto es una alfa muy temprana. Espera errores, mecánicas de juego muy inacabadas, mecánicas sin pulir, y cosas que faltan. - -- Si tienes críticas constructivas o reportes de error, puedes contactar con nosotros vía Reddit, GitLab, o nuestro servidor de Discord comunitario. - -- Veloren se licencia bajo la licencia de código abierto GPL 3. Esto quiere decir que eres libre para jugar, modificar y redistribuir el juego tal y como desees (siempre y cuando tal trabajo se licencie también bajo la GPL 3). - -- Veloren es un proyecto comunitario sin ánimo de lucro, y todo aquel que trabaja en él es un voluntario. -Si te gusta lo que ves, ¡eres bienvenido de unirte a los equipos de desarrollo o arte! - -Gracias por tomarte el tiempo de leer esta noticia, ¡esperamos que disfrutes del juego! - -~ Los desarrolladores de Veloren"#, - - // Login process description - "main.login_process": r#"Información sobre el Proceso de Login: - -Por favor, ten en cuenta que ahora necesitas una cuenta -para jugar en servidores con autenticación activada. - -Puedes crear una cuenta en - -https://veloren.net/account/."#, - "main.login.server_not_found": "Servidor no encontrado", - "main.login.authentication_error": "Error de autenticación al servidor", - "main.login.failed_auth_server_url_invalid": "Fallo al conectar con el servidor de Autenticación", - "main.login.insecure_auth_scheme": "El esquema HTTP no esta soportado. ¡Es inseguro! Para propósitos de desarrollo, HTTP esta permitido para 'localhost' o versiones de depuración", - "main.login.server_full": "El servidor está lleno", - "main.login.untrusted_auth_server": "Servidor de Autenticación sin confianza", - "main.login.outdated_client_or_server": "ServerEnloquecido: Probablemente las versiones son incompatibles, revisa si hay actualizaciones.", - "main.login.timeout": "Timeout: El servidor no respondió a tiempo. (Sobrecargado o con problemas de red).", - "main.login.server_shut_down": "Servidor apagado", - "main.login.network_error": "Error de red", - "main.login.network_wrong_version": "El servidor está ejecutando una versión diferente a la tuya. Comprueba tu versión y actualiza tu juego.", - "main.login.failed_sending_request": "Petición al servidor de autenticación fallida", - "main.login.invalid_character": "El personaje seleccionado no es válido", - "main.login.client_crashed": "El cliente se cerró inesperadamente", - "main.login.not_on_whitelist": "Necesitas estar en la lista blanca de un Administrador para poder unirte", - "main.login.banned": "Has sido baneado por la siguiente razón", - "main.login.kicked": "Has sido expulsado por la siguiente razón", - "main.login.select_language": "Selecciona un idioma", - "main.login.client_version": "Versión de Cliente", - "main.login.server_version": "Versión de Servidor", - "main.login.client_init_failed": "Fallo de Cliente al inicializar: {init_fail_reason}", - "main.login.username_bad_characters": "¡Nombre de Usuario contiene caracteres inválidos! (Solo alfanuméricos, '_' y '-' están permitidos)", - "main.login.username_too_long": "¡Nombre de usuario demasiado largo! Máxima longitud es: {max_len}", - "main.servers.select_server": "Selecciona un servidor", - "main.servers.singleplayer_error": "Fallo al conectar con el servidor interno: {sp_error}", - "main.servers.network_error": "Red de Servidor/Error de socket: {raw_error}", - "main.servers.participant_error": "Desconexión de Participante/error protocolo: {raw_error}", - "main.servers.stream_error": "Conexión de cliente/compression/error (de)serialización: {raw_error}", - "main.servers.database_error": "Error servidor base de datos: {raw_error}", - "main.servers.persistence_error": "Error servidor persistente (Probablemente datos Asset/Personaje): {raw_error}", - "main.servers.other_error": "Error servidor general: {raw_error}", - - // Credits screen - "main.credits": "Creditos", - "main.credits.created_by": "creado por", - "main.credits.music": "Música", - "main.credits.fonts": "Fuentes", - "main.credits.other_art": "Otros Artistas", - "main.credits.contributors": "Colaboradores", - - - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Pulsa '{gameinput.togglelantern}' para encender tu linterna.", - "Pulsa '{gameinput.help}' para ver todos las atajos de teclado predeterminados.", - "Puedes escribir /say o /s para chatear con jugadores que estén a tu alrededor.", - "Puedes escribir /region o /r para chatear con jugadores que se encuentren a doscientos bloques a tu alrededor.", - "Administradores pueden usar el comando /build para entrar en modo construcción", - "Puedes escribir /group o /g para chatear con jugadores en tu grupo actual.", - "Para enviar mensajes privados escribe /tell seguido del nombre y tu mensaje.", - "¡Estate atento a la comida, cofres y otros botines esparcidos por el mundo!", - "¿Inventario lleno de comida? ¡Intenta elaborar mejor comida de ella!", - "¿Preguntándote que hacer? ¡Intenta hacer una de las mazmorras marcadas del mapa!", - "No te olvides de ajustar los gráficos de tu sistema. Pulsa '{gameinput.settings}' para abrir la configuración.", - "¡Jugar con otros jugadores es divertido! Pulsa '{gameinput.social}' para ver quien esta en línea.", - "Pulsa '{gameinput.dance}' para bailar. ¡Fiesta!", - "Pulsa '{gameinput.glide}' para desplegar tu planeador y conquistar los cielos", - "Veloren se encuentra todavia en Pre-Alpha. ¡Hacemos todo lo posible para mejorar la experiencia de juego día a día!", - "Si quieres unirte al equipo de desarrollo o conversar con nosotros, únete a nuestro servidor de Discord.", - "Puedes mostrar o ocultar tu total de salud en la barra de salud en ajustes.", - "Siéntate cerca de una fogata (con la tecla '{gameinput.sit}') para recuperarte de tus heridas.", - "¿Necesitas más bolsas o mejores armaduras para continuar tu viaje? Pulsa '{gameinput.crafting}' para abrir el menú de elaboración.", - "Pulsa '{gameinput.roll}' para rodar. Rodar puede se puede usar para moverte más rápido y esquivar los ataques.", - "¿Para que sirve este objeto? Buscar 'input:' en fabricación para ver que en que recetas se usa.", - "¿Eh mira eso? Toma un pantallazo pulsando '{gameinput.screenshot}'.", - "Intenta saltar al rodar para pasar a través de las criaturas.", - "Para ver tus atributos, haz clic en el botón 'Atributos' del inventario.", - ], - } -) diff --git a/assets/voxygen/i18n/es_ES/npc.ftl b/assets/voxygen/i18n/es_ES/npc.ftl new file mode 100644 index 0000000000..4953bc3184 --- /dev/null +++ b/assets/voxygen/i18n/es_ES/npc.ftl @@ -0,0 +1,177 @@ +npc-speech-villager = + .a0 = ¿A que hace un buen día? + .a1 = ¿Cómo estás hoy? + .a2 = ¡Que tengas una buena mañana! + .a3 = Me pregunto qué piensa el Catoblepas cuando come hierba + .a4 = ¿Qué piensas de este tiempo? + .a5 = Solo pensar en esas mazmorras y me asusto. Espero que alguien pueda poner orden ahí dentro + .a6 = Me gustaría hacer espeleología en una cueva cuando sea más fuerte + .a7 = ¿Has visto mi gato? + .a8 = ¿Has oído hablar de los feroces Tiburones de Tierra? He oído que viven en los desiertos + .a9 = Dicen que en las cuevas se pueden encontrar gemas brillantes de todo tipo + .a10 = ¡Sólo me interesan crackers con queso! + .a11 = ¿No vas a entrar? ¡Estábamos a punto de comer queso! + .a12 = Dicen que las setas son buenas para tu salud. Yo nunca las he comido + .a13 = ¡No te olvides los crackers! + .a14 = Adoro el queso enano. Me encantaria aprender hacerlo + .a15 = Me pregunto qué habrá al otro lado de las montañas + .a16 = Espero hacer mi propio planeador algún día + .a17 = ¿Te gustaría ver mi jardín? Bueno, tal vez en otro momento + .a18 = ¡Hace un día precioso para pasear por el bosque! + .a19 = ¿Ser o no ser? Creo que seré granjero + .a20 = ¿No crees que nuestro pueblo es el mejor? + .a21 = ¿Qué supones que hace brillar a los Restos Luminosos? + .a22 = ¡Creo que es la hora del segundo desayuno! + .a23 = ¿Has cogido alguna vez una luciérnaga? + .a24 = No puedo entender de dónde vienen esos Sauroks + .a25 = Me gustaría que alguien mantuviera a los lobos alejados del pueblo + .a26 = Anoche tuve un sueño maravilloso sobre el queso. ¿Qué significa? + .a27 = He dejado algo de queso con mi hermano. Ahora no se si existe o no. Lo llamo el queso de Schrödinger. + .a28 = He dejado algo de queso con mi hermana. Ahora no se si existe o no. Lo llamo el queso de Schrödinger. + .a29 = Alguien debería de hacer algo con esos cultistas. Preferiblemente alguien que no sea yo + .a30 = Espero que llueva pronto. Sería bueno para los cultivos. + .a31 = ¡Me encanta la miel! Y odio las abejas. + .a32 = Quiero ver el mundo algun día. Tiene que haber algo más en esta vida que este pueblo. +npc-speech-villager_decline_trade = + .a0 = Lo siento, no tengo nada para comerciar. + .a1 = ¿Comerciar? Como si tuviera algo que te pudiera interesar. + .a2 = Mi casa es mía y no la cambiaré por nada. +npc-speech-merchant_advertisement = + .a0 = ¿Te interesaría comerciar conmigo? + .a1 = ¿Querrías comerciar conmigo? + .a2 = Tengo muchos bienes. ¿Quieres echar un vistazo? +npc-speech-merchant_busy = + .a0 = Hey, espera tu turno + .a1 = Ten paciencia, solo soy una persona. + .a2 = ¿No ves que estoy comerciando con alguien? + .a3 = Un momento, dejame acabar. + .a4 = Nada de colarse. + .a5 = Estoy ocupado, vuelve más tarde. +npc-speech-merchant_trade_successful = + .a0 = ¡Gracias por comerciar conmigo! + .a1 = ¡Gracias! +npc-speech-merchant_trade_declined = + .a0 = Quizás en otra ocasión, ¡ten un buen día! + .a1 = Vaya, supongo que en otra ocasión. +npc-speech-villager_cultist_alarm = + .a0 = ¡Cuidado! ¡Hay cultistas sueltos! + .a1 = ¡A las armas! ¡Los cultistas nos atacan! + .a2 = ¡Como se atreven los cultistas a atacar esta aldea! + .a3 = ¡Muerte a los cultistas! + .a4 = ¡Aquí no toleramos a los cultistas! + .a5 = ¡Cultista asesino! + .a6 = ¡Prueba el filo de mi espada, sucio cultista! + .a7 = ¡Nada podrá limpiar la sangre de tus manos, cultista! + .a8 = ¡Billones de percebes azules! ¡Un cultista entre nosotros! + .a9 = ¡Esos malvados cultistas seran aniquilados! + .a10 = ¡Este cultista es mío! + .a11 = ¡Prepárate para conocer a tu creador, sucio cultista! + .a12 = ¡Veo un cultista! ¡Atrapadlo! + .a13 = ¡Veo un cultista! ¡Atacadlo! + .a14 = ¡Veo un cultista! ¡No dejéis que escape! + .a15 = ¿Le importaría al más honorable de los cultistas un poco de MUERTE? + .a16 = ¡Nunca perdonamos!¡Nunca olvidamos!¡Muere, cultista! + .a17 = ¡Muere, cultista! + .a18 = ¡Tu reinado de terror llegará a su fin! + .a19 = ¡Pagarás por todo lo que has hecho! + .a20 = Por aquí no tratamos con amabilidad a los de tu especie. + .a21 = ¡Deberías de haberte quedado bajo tierra! +npc-speech-villager_under_attack = + .a0 = Ayuda, ¡me atacan! + .a1 = ¡Ayuda! ¡Me atacan! + .a2 = ¡Aaah! ¡Me atacan! + .a3 = ¡Aaah! ¡Me atacan! ¡Ayuda! + .a4 = ¡Ayúdame! ¡Me atacan! + .a5 = ¡Me atacan! ¡Ayuda! + .a6 = ¡Me atacan! ¡Ayúdame! + .a7 = ¡Ayuda! + .a8 = ¡Ayuda! ¡Ayuda! + .a9 = ¡Ayuda! ¡Ayuda! ¡Ayuda! + .a10 = ¡Me atacan! + .a11 = ¡AAAHHH! ¡Me atacan! + .a12 = ¡AAAHHH! ¡Me atacan! ¡Ayuda! + .a13 = ¡Ayuda! ¡Nos están atacando! + .a14 = ¡Ayuda! ¡Asesino! + .a15 = ¡Ayuda! ¡Hay un asesino suelto! + .a16 = ¡Ayuda! ¡Me están intentando matar! + .a17 = Guardias, ¡me están atacando! + .a18 = Guardias, ¡me están atacando! + .a19 = ¡Me están atacando! ¡Guardias! + .a20 = ¡Ayuda! ¡Guardias! ¡Me están atacando! + .a21 = ¡Guardias! ¡Venid rápido! + .a22 = ¡Guardias! ¡Guardias! + .a23 = ¡Guardias! ¡Un villano me ataca! + .a24 = Guardias, ¡acabad con este infame villano! + .a25 = ¡Guardias! ¡Hay un asesino! + .a26 = ¡Guardias! ¡Ayudadme! + .a27 = ¡No te saldrás con la tuya! ¡Guardias! + .a28 = ¡Desalmado! + .a29 = ¡Ayúdame! + .a30 = ¡Ayuda! ¡Por favor! + .a31 = ¡Aaah! ¡Guardias! ¡Ayuda! + .a32 = ¡Vienen a por mí! + .a33 = ¡Ayuda! ¡Ayuda! Me están reprimiendo + .a34 = Ah, ahora vemos la violencia inherente al sistema. + .a35 = ¡Esto, bah, un rasguño! + .a36 = ¡Deja de hacer eso! + .a37 = ¡¿Qué te he hecho?! + .a38 = ¡Por favor, deja de atacarme! + .a39 = ¡Eh! ¡Mira a dónde apuntas esa cosa! + .a40 = Desgraciado, vete de aqui! + .a41 = Para ya! Vete! + .a42 = ¡Me estas haciendo enfadar! + .a43 = ¡Oye! ¡¿Quién te crees que eres?! + .a44 = Te arrancaré la cabeza por eso! + .a45 = ¡Para, por favor! ¡No llevo nada de valor! + .a46 = ¡Mi hermano es más grande que yo y te machacará! + .a47 = ¡Nooo, se lo voy a decir a mamá! + .a48 = ¡Maldito seas! + .a49 = Por favor, no hagas eso + .a50 = ¡Eso no fue muy agradable! + .a51 = Tu arma funciona, ahora aléjala! + .a52 = ¡Perdóname! + .a53 = ¡Por favor, tengo familia! + .a54 = ¡Soy demasiado joven para morir! + .a55 = ¿Podemos hablar de esto? + .a56 = ¡La violencia nunca es la respuesta! + .a57 = Hoy se está torciendo el día... + .a58 = ¡Eh, eso duele! + .a59 = ¡Ayy! + .a60 = ¡Qué grosero! + .a61 = ¡Para, te lo ruego! + .a62 = ¡Ojala te enfermes! + .a63 = Esto no es divertido + .a64 = ¡¿Cómo te atreves?! + .a65 = ¡Pagarás por eso! + .a66 = ¡Sigue así y te arrepentirás! + .a67 = ¡No hagas que te pegue! + .a68 = ¡Debe haber algún malentendido! + .a69 = ¡No hay necesidad de hacer esto! + .a70 = ¡Vete, demonio! + .a71 = ¡Eso sí que duele! + .a72 = ¿Por qué harías eso? + .a73 = Por los espíritus, ¡basta! + .a74 = ¡Debes haberme confundido con otra persona! + .a75 = ¡No me merezco esto! + .a76 = Por favor, no vuelvas a hacer eso. + .a77 = ¡Guardias, arrojad a este monstruo al lago! + .a78 = ¡Enviare mi tarasca a por ti! + .a79 = ¿Porque Yoooooo? +npc-speech-villager_enemy_killed = + .a0 = ¡He destruido a mi enemigo! + .a1 = ¡Por fin, paz! + .a2 = ... ahora, ¿qué estaba haciendo? +npc-speech-menacing = + .a0 = ¡Te lo advierto! + .a1 = ¡Si te acercas te atacaré! + .a2 = ¡No me das miedo! + .a3 = ¡Vete de aquí! + .a4 = ¡Da la vuelta y vete si quieres vivir! + .a5 = ¡No eres bienvenido aquí! +npc-speech-cultist_low_health_fleeing = + .a0 = ¡Retirada por la causa! + .a1 = ¡Retirada! + .a2 = ¡Maldito Seas! + .a3 = ¡Te maldeciré en el más allá! + .a4 = ¡Debo descansar! + .a5 = ¡Son demasiado fuertes! \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/npc.ron b/assets/voxygen/i18n/es_ES/npc.ron deleted file mode 100644 index 60527ae345..0000000000 --- a/assets/voxygen/i18n/es_ES/npc.ron +++ /dev/null @@ -1,199 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Spanish (Spain) -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "¿A que hace un buen día?", - "¿Cómo estás hoy?", - "¡Que tengas una buena mañana!", - "Me pregunto qué piensa el Catoblepas cuando come hierba", - "¿Qué piensas de este tiempo?", - "Solo pensar en esas mazmorras y me asusto. Espero que alguien pueda poner orden ahí dentro", - "Me gustaría hacer espeleología en una cueva cuando sea más fuerte", - "¿Has visto mi gato?", - "¿Has oído hablar de los feroces Tiburones de Tierra? He oído que viven en los desiertos", - "Dicen que en las cuevas se pueden encontrar gemas brillantes de todo tipo", - "¡Sólo me interesan crackers con queso!", - "¿No vas a entrar? ¡Estábamos a punto de comer queso!", - "Dicen que las setas son buenas para tu salud. Yo nunca las he comido", - "¡No te olvides los crackers!", - "Adoro el queso enano. Me encantaria aprender hacerlo", - "Me pregunto qué habrá al otro lado de las montañas", - "Espero hacer mi propio planeador algún día", - "¿Te gustaría ver mi jardín? Bueno, tal vez en otro momento", - "¡Hace un día precioso para pasear por el bosque!", - "¿Ser o no ser? Creo que seré granjero", - "¿No crees que nuestro pueblo es el mejor?", - "¿Qué supones que hace brillar a los Restos Luminosos?", - "¡Creo que es la hora del segundo desayuno!", - "¿Has cogido alguna vez una luciérnaga?", - "No puedo entender de dónde vienen esos Sauroks", - "Me gustaría que alguien mantuviera a los lobos alejados del pueblo", - "Anoche tuve un sueño maravilloso sobre el queso. ¿Qué significa?", - "He dejado algo de queso con mi hermano. Ahora no se si existe o no. Lo llamo el queso de Schrödinger.", - "He dejado algo de queso con mi hermana. Ahora no se si existe o no. Lo llamo el queso de Schrödinger.", - "Alguien debería de hacer algo con esos cultistas. Preferiblemente alguien que no sea yo", - "Espero que llueva pronto. Sería bueno para los cultivos.", - "¡Me encanta la miel! Y odio las abejas.", - "Quiero ver el mundo algun día. Tiene que haber algo más en esta vida que este pueblo.", - ], - "npc.speech.villager_decline_trade": [ - "Lo siento, no tengo nada para comerciar.", - "¿Comerciar? Como si tuviera algo que te pudiera interesar.", - "Mi casa es mía y no la cambiaré por nada.", - ], - "npc.speech.merchant_advertisement": [ - "¿Te interesaría comerciar conmigo?", - "¿Querrías comerciar conmigo?", - "Tengo muchos bienes. ¿Quieres echar un vistazo?", - ], - "npc.speech.merchant_busy": [ - "Hey, espera tu turno", - "Ten paciencia, solo soy una persona.", - "¿No ves que estoy comerciando con alguien?", - "Un momento, dejame acabar.", - "Nada de colarse.", - "Estoy ocupado, vuelve más tarde.", - ], - "npc.speech.merchant_trade_successful": [ - "¡Gracias por comerciar conmigo!", - "¡Gracias!", - ], - "npc.speech.merchant_trade_declined": [ - "Quizás en otra ocasión, ¡ten un buen día!", - "Vaya, supongo que en otra ocasión.", - ], - "npc.speech.villager_cultist_alarm": [ - "¡Cuidado! ¡Hay cultistas sueltos!", - "¡A las armas! ¡Los cultistas nos atacan!", - "¡Como se atreven los cultistas a atacar esta aldea!", - "¡Muerte a los cultistas!", - "¡Aquí no toleramos a los cultistas!", - "¡Cultista asesino!", - "¡Prueba el filo de mi espada, sucio cultista!", - "¡Nada podrá limpiar la sangre de tus manos, cultista!", - "¡Billones de percebes azules! ¡Un cultista entre nosotros!", - "¡Esos malvados cultistas seran aniquilados!", - "¡Este cultista es mío!", - "¡Prepárate para conocer a tu creador, sucio cultista!", - "¡Veo un cultista! ¡Atrapadlo!", - "¡Veo un cultista! ¡Atacadlo!", - "¡Veo un cultista! ¡No dejéis que escape!", - "¿Le importaría al más honorable de los cultistas un poco de MUERTE?", - "¡Nunca perdonamos!¡Nunca olvidamos!¡Muere, cultista!", - "¡Muere, cultista!", - "¡Tu reinado de terror llegará a su fin!", - "¡Pagarás por todo lo que has hecho!", - "Por aquí no tratamos con amabilidad a los de tu especie.", - "¡Deberías de haberte quedado bajo tierra!", - ], - "npc.speech.villager_under_attack": [ - "Ayuda, ¡me atacan!", - "¡Ayuda! ¡Me atacan!", - "¡Aaah! ¡Me atacan!", - "¡Aaah! ¡Me atacan! ¡Ayuda!", - "¡Ayúdame! ¡Me atacan!", - "¡Me atacan! ¡Ayuda!", - "¡Me atacan! ¡Ayúdame!", - "¡Ayuda!", - "¡Ayuda! ¡Ayuda!", - "¡Ayuda! ¡Ayuda! ¡Ayuda!", - "¡Me atacan!", - "¡AAAHHH! ¡Me atacan!", - "¡AAAHHH! ¡Me atacan! ¡Ayuda!", - "¡Ayuda! ¡Nos están atacando!", - "¡Ayuda! ¡Asesino!", - "¡Ayuda! ¡Hay un asesino suelto!", - "¡Ayuda! ¡Me están intentando matar!", - "Guardias, ¡me están atacando!", - "Guardias, ¡me están atacando!", - "¡Me están atacando! ¡Guardias!", - "¡Ayuda! ¡Guardias! ¡Me están atacando!", - "¡Guardias! ¡Venid rápido!", - "¡Guardias! ¡Guardias!", - "¡Guardias! ¡Un villano me ataca!", - "Guardias, ¡acabad con este infame villano!", - "¡Guardias! ¡Hay un asesino!", - "¡Guardias! ¡Ayudadme!", - "¡No te saldrás con la tuya! ¡Guardias!", - "¡Desalmado!", - "¡Ayúdame!", - "¡Ayuda! ¡Por favor!", - "¡Aaah! ¡Guardias! ¡Ayuda!", - "¡Vienen a por mí!", - "¡Ayuda! ¡Ayuda! Me están reprimiendo", - "Ah, ahora vemos la violencia inherente al sistema.", - "¡Esto, bah, un rasguño!", - "¡Deja de hacer eso!", - "¡¿Qué te he hecho?!", - "¡Por favor, deja de atacarme!", - "¡Eh! ¡Mira a dónde apuntas esa cosa!", - "Desgraciado, vete de aqui!", - "Para ya! Vete!", - "¡Me estas haciendo enfadar!", - "¡Oye! ¡¿Quién te crees que eres?!", - "Te arrancaré la cabeza por eso!", - "¡Para, por favor! ¡No llevo nada de valor!", - "¡Mi hermano es más grande que yo y te machacará!", - "¡Nooo, se lo voy a decir a mamá!", - "¡Maldito seas!", - "Por favor, no hagas eso", - "¡Eso no fue muy agradable!", - "Tu arma funciona, ahora aléjala!", - "¡Perdóname!", - "¡Por favor, tengo familia!", - "¡Soy demasiado joven para morir!", - "¿Podemos hablar de esto?", - "¡La violencia nunca es la respuesta!", - "Hoy se está torciendo el día...", - "¡Eh, eso duele!", - "¡Ayy!", - "¡Qué grosero!", - "¡Para, te lo ruego!", - "¡Ojala te enfermes!", - "Esto no es divertido", - "¡¿Cómo te atreves?!", - "¡Pagarás por eso!", - "¡Sigue así y te arrepentirás!", - "¡No hagas que te pegue!", - "¡Debe haber algún malentendido!", - "¡No hay necesidad de hacer esto!", - "¡Vete, demonio!", - "¡Eso sí que duele!", - "¿Por qué harías eso?", - "Por los espíritus, ¡basta!", - "¡Debes haberme confundido con otra persona!", - "¡No me merezco esto!", - "Por favor, no vuelvas a hacer eso.", - "¡Guardias, arrojad a este monstruo al lago!", - "¡Enviare mi tarasca a por ti!", - "¿Porque Yoooooo?", - ], - "npc.speech.villager_enemy_killed": [ - "¡He destruido a mi enemigo!", - "¡Por fin, paz!", - "... ahora, ¿qué estaba haciendo?", - ], - "npc.speech.menacing": [ - "¡Te lo advierto!", - "¡Si te acercas te atacaré!", - "¡No me das miedo!", - "¡Vete de aquí!", - "¡Da la vuelta y vete si quieres vivir!", - "¡No eres bienvenido aquí!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "¡Retirada por la causa!", - "¡Retirada!", - "¡Maldito Seas!", - "¡Te maldeciré en el más allá!", - "¡Debo descansar!", - "¡Son demasiado fuertes!", - ] - } -) diff --git a/assets/voxygen/i18n/es_LA/buff.ftl b/assets/voxygen/i18n/es_LA/buff.ftl new file mode 100644 index 0000000000..07f7f21704 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Click para quitar +buff-title-missing = Sin Título +buff-desc-missing = Sin Descripción +buff-title-heal = Curación +buff-desc-heal = Recupera vida durante un tiempo. +buff-title-potion = Poción +buff-desc-potion = Bebiendo... +buff-title-saturation = Saturación +buff-desc-saturation = Recupera vida durante un tiempo por objetos. +buff-title-campfire_heal = Curación de fogata +buff-desc-campfire_heal = Descansar en una fogata recupera { $rate }% por segundo. +buff-title-invulnerability = Invulnerabilidad +buff-desc-invulnerability = No puedes ser atacado. +buff-title-protectingward = Guardián Protector +buff-desc-protectingward = Eres protegido, de alguna manera, de los ataques. +buff-title-frenzied = Frenesí +buff-desc-frenzied = Estás impregnado de una velocidad antinatural y puedes ignorar lesiones menores. +buff-title-bleed = Sangrando +buff-desc-bleed = Inflinge daño regularmente. +buff-title-cursed = Maldición +buff-desc-cursed = Estás maldito. +buff-title-burn = En llamas +buff-desc-burn = Estás quemandote vivo +buff-title-crippled = Paralizado +buff-desc-crippled = Tu movimiento está paralizado porque tus piernas están heridas gravemente. +buff-title-frozen = Congelado +buff-desc-frozen = Tu movimiento y ataques están ralentizados. +buff-title-wet = Humedo +buff-desc-wet = El suelo rechaza tus pies, haciéndolos difíciles de detener. +buff-title-ensnared = Atrapado +buff-desc-ensnared = Las enredaderas se agarran a tus piernas, impidiendo tu movimiento. +buff-stat-health = Restaura { $str_total } Salud +buff-stat-increase_max_energy = Aumenta la energía máxima en { $strength } +buff-stat-increase_max_health = Aumenta la salud máxima en { $strength } +buff-stat-invulnerability = Otorga invulnerabilidad +buff-text-over_seconds = por { $dur_secs } segundos +buff-text-for_seconds = por { $dur_secs } segundos \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/buff.ron b/assets/voxygen/i18n/es_LA/buff.ron deleted file mode 100644 index 310933c4ff..0000000000 --- a/assets/voxygen/i18n/es_LA/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - // Buffs - "buff.remove": "Click para quitar", - "buff.title.missing": "Sin Título", - "buff.desc.missing": "Sin Descripción", - "buff.title.heal": "Curación", - "buff.desc.heal": "Recupera vida durante un tiempo.", - "buff.title.potion": "Poción", - "buff.desc.potion": "Bebiendo...", - "buff.title.saturation": "Saturación", - "buff.desc.saturation": "Recupera vida durante un tiempo por objetos.", - "buff.title.campfire_heal": "Curación de fogata", - "buff.desc.campfire_heal": "Descansar en una fogata recupera {rate}% por segundo.", - "buff.title.invulnerability": "Invulnerabilidad", - "buff.desc.invulnerability": "No puedes ser atacado.", - "buff.title.protectingward": "Guardián Protector", - "buff.desc.protectingward": "Eres protegido, de alguna manera, de los ataques.", - "buff.title.frenzied": "Frenesí", - "buff.desc.frenzied": "Estás impregnado de una velocidad antinatural y puedes ignorar lesiones menores.", - // Debuffs - "buff.title.bleed": "Sangrando", - "buff.desc.bleed": "Inflinge daño regularmente.", - "buff.title.cursed": "Maldición", - "buff.desc.cursed": "Estás maldito.", - "buff.title.burn": "En llamas", - "buff.desc.burn": "Estás quemandote vivo", - "buff.title.crippled": "Paralizado", - "buff.desc.crippled": "Tu movimiento está paralizado porque tus piernas están heridas gravemente.", - "buff.title.frozen": "Congelado", - "buff.desc.frozen": "Tu movimiento y ataques están ralentizados.", - "buff.title.wet": "Humedo", - "buff.desc.wet": "El suelo rechaza tus pies, haciéndolos difíciles de detener.", - "buff.title.ensnared": "Atrapado", - "buff.desc.ensnared": "Las enredaderas se agarran a tus piernas, impidiendo tu movimiento.", - // Buffs stats - "buff.stat.health": "Restaura {str_total} Salud", - "buff.stat.increase_max_energy": "Aumenta la energía máxima en {strength}", - "buff.stat.increase_max_health": "Aumenta la salud máxima en {strength}", - "buff.stat.invulnerability": "Otorga invulnerabilidad", - // Text - "buff.text.over_seconds": "por {dur_secs} segundos", - "buff.text.for_seconds": "por {dur_secs} segundos", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/char_selection.ftl b/assets/voxygen/i18n/es_LA/char_selection.ftl new file mode 100644 index 0000000000..ff5abbdee5 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Cargando personajes... +char_selection-delete_permanently = ¿Borrar este Personaje permanentemente? +char_selection-deleting_character = Borrando Personaje... +char_selection-change_server = Cambiar Servidor +char_selection-enter_world = Entrar al Mundo +char_selection-logout = Volver +char_selection-create_new_character = Crear Nuevo Personaje +char_selection-creating_character = Creando Personaje... +char_selection-character_creation = Creación de Personaje +char_selection-human_default = Humano por defecto +char_selection-level_fmt = Nivel { $level_nb } +char_selection-uncanny_valley = Valle Misterioso +char_selection-plains_of_uncertainty = Planicies de la Incertidumbre +char_selection-beard = Barba +char_selection-hair_style = Peinado +char_selection-hair_color = Color de Pelo +char_selection-eye_color = Color de Ojos +char_selection-skin = Color de Piel +char_selection-eyeshape = Detalles de los Ojos +char_selection-accessories = Accesorios +char_selection-create_info_name = Tu Personaje necesita un nombre! +char_selection-version_mismatch = ¡ADVERTENCIA! Este servidor está ejecutando una versión de juego diferente, posiblemente incompatible. Actualiza tu juego. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/char_selection.ron b/assets/voxygen/i18n/es_LA/char_selection.ron deleted file mode 100644 index df699171a7..0000000000 --- a/assets/voxygen/i18n/es_LA/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "char_selection.loading_characters": "Cargando personajes...", - "char_selection.delete_permanently": "¿Borrar este Personaje permanentemente?", - "char_selection.deleting_character": "Borrando Personaje...", - "char_selection.change_server": "Cambiar Servidor", - "char_selection.enter_world": "Entrar al Mundo", - "char_selection.logout": "Volver", - "char_selection.create_new_character": "Crear Nuevo Personaje", - "char_selection.creating_character": "Creando Personaje...", - "char_selection.character_creation": "Creación de Personaje", - "char_selection.human_default": "Humano por defecto", - "char_selection.level_fmt": "Nivel {level_nb}", - "char_selection.uncanny_valley": "Valle Misterioso", - "char_selection.plains_of_uncertainty": "Planicies de la Incertidumbre", - "char_selection.beard": "Barba", - "char_selection.hair_style": "Peinado", - "char_selection.hair_color": "Color de Pelo", - "char_selection.eye_color": "Color de Ojos", - "char_selection.skin": "Color de Piel", - "char_selection.eyeshape": "Detalles de los Ojos", - "char_selection.accessories": "Accesorios", - "char_selection.create_info_name": "Tu Personaje necesita un nombre!", - "char_selection.version_mismatch": "¡ADVERTENCIA! Este servidor está ejecutando una versión de juego diferente, posiblemente incompatible. Actualiza tu juego.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/common.ftl b/assets/voxygen/i18n/es_LA/common.ftl new file mode 100644 index 0000000000..ed4c442a10 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/common.ftl @@ -0,0 +1,104 @@ +common-username = Usuario +common-singleplayer = Un Jugador +common-multiplayer = Multijugador +common-servers = Servidores +common-quit = Salir +common-settings = Opciones +common-languages = Idiomas +common-interface = Interfaz +common-gameplay = Jugabilidad +common-controls = Controles +common-video = Gráficos +common-sound = Sonido +common-chat = Chat +common-resume = Continuar +common-characters = Personajes +common-close = Cerrar +common-yes = Sí +common-no = No +common-back = Volver +common-create = Crear +common-okay = Ok +common-add = Agregar +common-accept = Aceptar +common-decline = Rechazar +common-disclaimer = Cuidado +common-cancel = Cancelar +common-none = Ninguno +common-error = Error +common-fatal_error = Error Fatal +common-you = Tú +common-automatic = Automático +common-random = Aleatorio +common-empty = Vacio +common-confirm = Confirmar +common-delete_server = Eliminar Servidor +common-interface_settings = Ajustes de Interfaz +common-gameplay_settings = Ajustes de Jugabilidad +common-controls_settings = Ajustes de Controles +common-video_settings = Ajustes de Graficos +common-sound_settings = Ajustes de Sonido +common-language_settings = Ajustes de Idiomas +common-chat_settings = Ajustes del Chat +common-connection_lost = + ¡Conexión perdida! + ¿Se reinició el servidor? + ¿El cliente está actualizado? +common-species-orc = Orco +common-species-human = Humano +common-species-dwarf = Enano +common-species-elf = Elfo +common-species-draugr = No-Muerto +common-species-danari = Danari +common-weapons-axe = Hacha +common-weapons-dagger = Daga +common-weapons-greatsword = Mandoble +common-weapons-shortswords = Espada corta +common-weapons-sword = Espada +common-weapons-staff = Vara de Fuego +common-weapons-bow = Arco +common-weapons-hammer = Martillo +common-weapons-general = Combate general +common-weapons-sceptre = Cetro curativo +common-weapons-shield = Escudo +common-weapons-spear = Lanza +common-weapons-hammer_simple = Martillo simple +common-weapons-sword_simple = Espada simple +common-weapons-staff_simple = Vara simple +common-weapons-axe_simple = Hacha simple +common-weapons-bow_simple = Arco simple +common-weapons-unique = Unico +common-tool-debug = Debug +common-tool-faming = Herramienta de granja +common-tool-pick = Pico +common-tool-mining = Minería +common-kind-modular_component = Componente modular +common-kind-glider = Planeador +common-kind-consumable = Consumible +common-kind-throwable = Puede ser lanzado +common-kind-utility = Utildad +common-kind-ingredient = Ingrediente +common-kind-lantern = Linterna +common-hands-one = De una mano +common-hands-two = A dos manos +common-rand_appearance = Apariencia Aleatoria +common-rand_name = Nombre Aleatorio +common-stats-combat_rating = PC +common-stats-power = Poder +common-stats-speed = Velocidad +common-stats-poise = Equilibrio +common-stats-crit_chance = % de critico +common-stats-crit_mult = Mult de Critico +common-stats-armor = Armadura +common-stats-poise_res = Res. a Stuns +common-stats-energy_max = Energia Maxima +common-stats-energy_reward = Recuperación de Energia +common-stats-crit_power = Daño critico +common-stats-stealth = Sigilo +common-stats-slots = Ranuras +common-material-metal = Metal +common-material-wood = Madera +common-material-stone = Piedra +common-material-cloth = Tela +common-material-hide = Piel +common-sprite-chest = Cofre \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/common.ron b/assets/voxygen/i18n/es_LA/common.ron deleted file mode 100644 index 7592fcb392..0000000000 --- a/assets/voxygen/i18n/es_LA/common.ron +++ /dev/null @@ -1,126 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Usuario", - "common.singleplayer": "Un Jugador", - "common.multiplayer": "Multijugador", - "common.servers": "Servidores", - "common.quit": "Salir", - "common.settings": "Opciones", - "common.languages": "Idiomas", //this one is repeated in en.ron (53 and 59) - "common.interface": "Interfaz", - "common.gameplay": "Jugabilidad", - "common.controls": "Controles", - "common.video": "Gráficos", - "common.sound": "Sonido", - "common.chat": "Chat", - "common.resume": "Continuar", - "common.characters": "Personajes", - "common.close": "Cerrar", - "common.yes": "Sí", - "common.no": "No", - "common.back": "Volver", - "common.create": "Crear", - "common.okay": "Ok", - "common.add": "Agregar", - "common.accept": "Aceptar", - "common.decline": "Rechazar", - "common.disclaimer": "Cuidado", - "common.cancel": "Cancelar", - "common.none": "Ninguno", - "common.error": "Error", - "common.fatal_error": "Error Fatal", - "common.you": "Tú", - "common.automatic": "Automático", - "common.random": "Aleatorio", - "common.empty": "Vacio", - "common.confirm": "Confirmar", - "common.delete_server": "Eliminar Servidor", - - // Settings Window title - "common.interface_settings": "Ajustes de Interfaz", - "common.gameplay_settings": "Ajustes de Jugabilidad", - "common.controls_settings": "Ajustes de Controles", - "common.video_settings": "Ajustes de Graficos", - "common.sound_settings": "Ajustes de Sonido", - "common.language_settings": "Ajustes de Idiomas", - "common.chat_settings": "Ajustes del Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"¡Conexión perdida! -¿Se reinició el servidor? -¿El cliente está actualizado?"#, - - - "common.species.orc": "Orco", - "common.species.human": "Humano", - "common.species.dwarf": "Enano", - "common.species.elf": "Elfo", - "common.species.draugr": "No-Muerto", - "common.species.danari": "Danari", - - "common.weapons.axe": "Hacha", - "common.weapons.dagger": "Daga", - "common.weapons.greatsword": "Mandoble", - "common.weapons.shortswords": "Espada corta", - "common.weapons.sword": "Espada", - "common.weapons.staff": "Vara de Fuego", - "common.weapons.bow": "Arco", - "common.weapons.hammer": "Martillo", - "common.weapons.general": "Combate general", - "common.weapons.sceptre": "Cetro curativo", - "common.weapons.shield": "Escudo", - "common.weapons.spear": "Lanza", - "common.weapons.hammer_simple": "Martillo simple", - "common.weapons.sword_simple": "Espada simple", - "common.weapons.staff_simple": "Vara simple", - "common.weapons.axe_simple": "Hacha simple", - "common.weapons.bow_simple": "Arco simple", - "common.weapons.unique": "Unico", - "common.tool.debug": "Debug", - "common.tool.faming": "Herramienta de granja", - "common.tool.pick": "Pico", - "common.tool.mining": "Minería", - "common.kind.modular_component": "Componente modular", - "common.kind.glider": "Planeador", - "common.kind.consumable": "Consumible", - "common.kind.throwable": "Puede ser lanzado", - "common.kind.utility": "Utildad", - "common.kind.ingredient": "Ingrediente", - "common.kind.lantern": "Linterna", - "common.hands.one": "De una mano", - "common.hands.two": "A dos manos", - - "common.rand_appearance": "Apariencia Aleatoria", - "common.rand_name": "Nombre Aleatorio", - - "common.stats.combat_rating": "PC", - "common.stats.power": "Poder", - "common.stats.speed": "Velocidad", - "common.stats.poise": "Equilibrio", - "common.stats.crit_chance": "% de critico", - "common.stats.crit_mult": "Mult de Critico", - "common.stats.armor": "Armadura", - "common.stats.poise_res":"Res. a Stuns", - "common.stats.energy_max": "Energia Maxima", - "common.stats.energy_reward": "Recuperación de Energia", - "common.stats.crit_power": "Daño critico", - "common.stats.stealth": "Sigilo", - "common.stats.slots": "Ranuras", - - "common.material.metal": "Metal", - "common.material.wood": "Madera", - "common.material.stone": "Piedra", - "common.material.cloth": "Tela", - "common.material.hide": "Piel", - - "common.sprite.chest": "Cofre", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/esc_menu.ftl b/assets/voxygen/i18n/es_LA/esc_menu.ftl new file mode 100644 index 0000000000..4a53673ac6 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Cerrar Sesión +esc_menu-quit_game = Salir del Juego \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/esc_menu.ron b/assets/voxygen/i18n/es_LA/esc_menu.ron deleted file mode 100644 index b17495ff1c..0000000000 --- a/assets/voxygen/i18n/es_LA/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "esc_menu.logout": "Cerrar Sesión", - "esc_menu.quit_game": "Salir del Juego", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/gameinput.ftl b/assets/voxygen/i18n/es_LA/gameinput.ftl new file mode 100644 index 0000000000..449f2affbe --- /dev/null +++ b/assets/voxygen/i18n/es_LA/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Ataque Básico +gameinput-secondary = Ataque Secundario +gameinput-block = Bloquear +gameinput-slot1 = Ranura de Inventario Rápido 1 +gameinput-slot2 = Ranura de Inventario Rápido 2 +gameinput-slot3 = Ranura de Inventario Rápido 3 +gameinput-slot4 = Ranura de Inventario Rápido 4 +gameinput-slot5 = Ranura de Inventario Rápido 5 +gameinput-slot6 = Ranura de Inventario Rápido 6 +gameinput-slot7 = Ranura de Inventario Rápido 7 +gameinput-slot8 = Ranura de Inventario Rápido 8 +gameinput-slot9 = Ranura de Inventario Rápido 9 +gameinput-slot10 = Ranura de Inventario Rápido 10 +gameinput-swaploadout = Cambiar Equipamiento +gameinput-togglecursor = Mostrar Cursor +gameinput-help = Mostrar Ventana de Ayuda +gameinput-toggleinterface = Mostrar Interfaz +gameinput-toggledebug = Mostrar FPS y la Info de Depuración +gameinput-toggle_egui_debug = Mostrar Info de Depuración de EGUI +gameinput-togglechat = Mostrar Chat +gameinput-screenshot = Tomar Captura de Pantalla +gameinput-toggleingameui = Mostrar Nombres +gameinput-fullscreen = Pantalla Completa +gameinput-moveforward = Moverse hacia Adelante +gameinput-moveleft = Moverse hacia la Izquierda +gameinput-moveright = Moverse hacia la Derecha +gameinput-moveback = Moverse hacia Atras +gameinput-jump = Saltar +gameinput-glide = Planeador +gameinput-roll = Rodar +gameinput-climb = Trepar +gameinput-climbdown = Descender +gameinput-wallleap = Saltar a la Pared +gameinput-togglelantern = Encender Farol +gameinput-mount = Montar +gameinput-chat = Abrir Chat +gameinput-command = Insertar Comandos +gameinput-escape = Escapar +gameinput-map = Mapa +gameinput-bag = Inventario +gameinput-trade = Comerciar +gameinput-social = Lista de jugadores +gameinput-sit = Sentarse +gameinput-spellbook = Hechizos +gameinput-settings = Configuración +gameinput-respawn = Reaparecer +gameinput-charge = Cargar +gameinput-togglewield = Alternar empuñadura +gameinput-interact = Interactuar +gameinput-freelook = Vista Libre +gameinput-autowalk = Caminata/Nado Automático +gameinput-cameraclamp = Camara con soporte +gameinput-dance = Bailar +gameinput-select = Seleccione la Entidad +gameinput-acceptgroupinvite = Aceptar invitación al grupo +gameinput-declinegroupinvite = Rechazar invitación al grupo +gameinput-cyclecamera = Cambiar Cámara +gameinput-crafting = Craftear +gameinput-fly = Volar +gameinput-sneak = Entrar en sigilo +gameinput-swimdown = Sumergirse +gameinput-swimup = Nadar hacia arriba +gameinput-mapzoomin = Incrementar el zoom del mapa +gameinput-mapzoomout = Disminui el zoom del mapa +gameinput-greet = Saludar +gameinput-map-locationmarkerbutton = Establecer un punto en el Mapa \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/gameinput.ron b/assets/voxygen/i18n/es_LA/gameinput.ron deleted file mode 100644 index d540f8e29c..0000000000 --- a/assets/voxygen/i18n/es_LA/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "gameinput.primary": "Ataque Básico", - "gameinput.secondary": "Ataque Secundario", - "gameinput.block": "Bloquear", - "gameinput.slot1": "Ranura de Inventario Rápido 1", - "gameinput.slot2": "Ranura de Inventario Rápido 2", - "gameinput.slot3": "Ranura de Inventario Rápido 3", - "gameinput.slot4": "Ranura de Inventario Rápido 4", - "gameinput.slot5": "Ranura de Inventario Rápido 5", - "gameinput.slot6": "Ranura de Inventario Rápido 6", - "gameinput.slot7": "Ranura de Inventario Rápido 7", - "gameinput.slot8": "Ranura de Inventario Rápido 8", - "gameinput.slot9": "Ranura de Inventario Rápido 9", - "gameinput.slot10": "Ranura de Inventario Rápido 10", - "gameinput.swaploadout": "Cambiar Equipamiento", - "gameinput.togglecursor": "Mostrar Cursor", - "gameinput.help": "Mostrar Ventana de Ayuda", - "gameinput.toggleinterface": "Mostrar Interfaz", - "gameinput.toggledebug": "Mostrar FPS y la Info de Depuración", - "gameinput.toggle_egui_debug": "Mostrar Info de Depuración de EGUI", - "gameinput.togglechat": "Mostrar Chat", - "gameinput.screenshot": "Tomar Captura de Pantalla", - "gameinput.toggleingameui": "Mostrar Nombres", - "gameinput.fullscreen": "Pantalla Completa", - "gameinput.moveforward": "Moverse hacia Adelante", - "gameinput.moveleft": "Moverse hacia la Izquierda", - "gameinput.moveright": "Moverse hacia la Derecha", - "gameinput.moveback": "Moverse hacia Atras", - "gameinput.jump": "Saltar", - "gameinput.glide": "Planeador", - "gameinput.roll": "Rodar", - "gameinput.climb": "Trepar", - "gameinput.climbdown": "Descender", - "gameinput.wallleap": "Saltar a la Pared", - "gameinput.togglelantern": "Encender Farol", - "gameinput.mount": "Montar", - "gameinput.chat": "Abrir Chat", - "gameinput.command": "Insertar Comandos", - "gameinput.escape": "Escapar", - "gameinput.map": "Mapa", - "gameinput.bag": "Inventario", - "gameinput.trade": "Comerciar", - "gameinput.social": "Lista de jugadores", - "gameinput.sit": "Sentarse", - "gameinput.spellbook": "Hechizos", - "gameinput.settings": "Configuración", - "gameinput.respawn": "Reaparecer", - "gameinput.charge": "Cargar", - "gameinput.togglewield": "Alternar empuñadura", - "gameinput.interact": "Interactuar", - "gameinput.freelook": "Vista Libre", - "gameinput.autowalk": "Caminata/Nado Automático", - "gameinput.cameraclamp": "Camara con soporte", - "gameinput.dance": "Bailar", - "gameinput.select": "Seleccione la Entidad", - "gameinput.acceptgroupinvite": "Aceptar invitación al grupo", - "gameinput.declinegroupinvite": "Rechazar invitación al grupo", - "gameinput.cyclecamera": "Cambiar Cámara", - "gameinput.crafting": "Craftear", - "gameinput.fly": "Volar", - "gameinput.sneak": "Entrar en sigilo", - "gameinput.swimdown": "Sumergirse", - "gameinput.swimup": "Nadar hacia arriba", - "gameinput.mapzoomin": "Incrementar el zoom del mapa", - "gameinput.mapzoomout": "Disminui el zoom del mapa", - "gameinput.greet": "Saludar", - "gameinput.map.locationmarkerbutton": "Establecer un punto en el Mapa" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/bag.ftl b/assets/voxygen/i18n/es_LA/hud/bag.ftl new file mode 100644 index 0000000000..0e12fc8304 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Inventario de { $playername } +hud-bag-stats_title = Estadísticas de { $playername } +hud-bag-exp = Exp +hud-bag-armor = Armadura +hud-bag-stats = Estadísticas +hud-bag-head = Cabeza +hud-bag-neck = Cuello +hud-bag-tabard = Tabardo +hud-bag-shoulders = Hombros +hud-bag-chest = Torso +hud-bag-hands = Manos +hud-bag-lantern = Linterna +hud-bag-glider = Planeador +hud-bag-belt = Cinturón +hud-bag-ring = Anillo +hud-bag-back = Espalda +hud-bag-legs = Piernas +hud-bag-feet = Pies +hud-bag-mainhand = Mano Principal +hud-bag-offhand = Mano Secundaria +hud-bag-inactive_mainhand = Mano principal inactiva +hud-bag-inactive_offhand = Mano secundaria inactiva +hud-bag-swap_equipped_weapons_title = Intercambiar armas equipadas +hud-bag-swap_equipped_weapons_desc = Presiona { $key } +hud-bag-bag = Mochila +hud-bag-health = Salud +hud-bag-energy = Energía +hud-bag-combat_rating = Puntos de combate +hud-bag-protection = Protección +hud-bag-stun_res = Resistencia a aturdimiento +hud-bag-combat_rating_desc = + Calculado a partir de tu + equipo y salud. +hud-bag-protection_desc = Reducción de daño por armadura +hud-bag-stun_res_desc = + Resistencia contra ser aturdido por golpes consecutivos. + Regenera como Energía. +hud-bag-sort_by_name = Ordenar por nombre +hud-bag-sort_by_quality = Ordenar por calidad +hud-bag-sort_by_category = Ordenar por categoría \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/bag.ron b/assets/voxygen/i18n/es_LA/hud/bag.ron deleted file mode 100644 index 6e204487f2..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - // Inventory - "hud.bag.inventory": "Inventario de {playername}", - "hud.bag.stats_title": "Estadísticas de {playername}", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armadura", - "hud.bag.stats": "Estadísticas", - "hud.bag.head": "Cabeza", - "hud.bag.neck": "Cuello", - "hud.bag.tabard": "Tabardo", - "hud.bag.shoulders": "Hombros", - "hud.bag.chest": "Torso", - "hud.bag.hands": "Manos", - "hud.bag.lantern": "Linterna", - "hud.bag.glider": "Planeador", - "hud.bag.belt": "Cinturón", - "hud.bag.ring": "Anillo", - "hud.bag.back": "Espalda", - "hud.bag.legs": "Piernas", - "hud.bag.feet": "Pies", - "hud.bag.mainhand": "Mano Principal", - "hud.bag.offhand": "Mano Secundaria", - "hud.bag.inactive_mainhand": "Mano principal inactiva", - "hud.bag.inactive_offhand": "Mano secundaria inactiva", - "hud.bag.swap_equipped_weapons_title": "Intercambiar armas equipadas", - "hud.bag.swap_equipped_weapons_desc": "Presiona {key}", - "hud.bag.bag": "Mochila", - "hud.bag.health": "Salud", - "hud.bag.energy": "Energía", - "hud.bag.combat_rating": "Puntos de combate", - "hud.bag.protection": "Protección", - "hud.bag.stun_res": "Resistencia a aturdimiento", - "hud.bag.combat_rating_desc": "Calculado a partir de tu\nequipo y salud.", - "hud.bag.protection_desc": "Reducción de daño por armadura", - "hud.bag.stun_res_desc": "Resistencia contra ser aturdido por golpes consecutivos.\nRegenera como Energía.", - "hud.bag.sort_by_name": "Ordenar por nombre", - "hud.bag.sort_by_quality": "Ordenar por calidad", - "hud.bag.sort_by_category": "Ordenar por categoría", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/char_window.ftl b/assets/voxygen/i18n/es_LA/hud/char_window.ftl new file mode 100644 index 0000000000..8106e39aeb --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Nombre de Personaje +character_window-character_stats = + Resistencia + + Estado Físico + + Valentía + + Protección \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/char_window.ron b/assets/voxygen/i18n/es_LA/hud/char_window.ron deleted file mode 100644 index 402e5073eb..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/char_window.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - /// Start character window section - "character_window.character_name": "Nombre de Personaje", - // Character stats - "character_window.character_stats": r#"Resistencia - -Estado Físico - -Valentía - -Protección -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/chat.ftl b/assets/voxygen/i18n/es_LA/hud/chat.ftl new file mode 100644 index 0000000000..d12e09ada9 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Todos +hud-chat-chat_tab_hover_tooltip = Haga clic derecho para configurar +hud-outcome-burning = murio de: quemarse +hud-outcome-curse = murio de: maldición +hud-outcome-bleeding = murio de: sangrado +hud-outcome-crippled = murio de: paralisis +hud-outcome-frozen = murio: congelado +hud-chat-online_msg = [{ $name }] se ha conectado. +hud-chat-offline_msg = [{ $name }] se ha desconectado. +hud-chat-default_death_msg = [{ $name }] murió +hud-chat-environmental_kill_msg = [{ $name }] murió en { $environment } +hud-chat-fall_kill_msg = [{ $name }] murió por daño de caída +hud-chat-suicide_msg = [{ $name }] murió por heridas autoinfligidas +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } causado por [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] derrotó a [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] le disparó a [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] hizo explotar a [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] usó magia para matar a [{ $victim }] +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } causado por { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } mató a [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } le disparó a [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } hizo explotar a [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } usó magia para matar a [{ $victim }] +hud-chat-npc_other_kill_msg = { $attacker } mató a [{ $victim }] +hud-chat-loot_msg = Recogiste [{ $item }] +hud-chat-loot_fail = ¡Tu inventario está lleno! +hud-chat-goodbye = ¡Adiós! +hud-chat-connection_lost = Conexión perdida. Expulsando en { $time } segundos. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/chat.ron b/assets/voxygen/i18n/es_LA/hud/chat.ron deleted file mode 100644 index c41d1947ae..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.chat.all": "Todos", - "hud.chat.chat_tab_hover_tooltip": "Haga clic derecho para configurar", - - // Debuff outcomes - "hud.outcome.burning": "murio de: quemarse", - "hud.outcome.curse": "murio de: maldición", - "hud.outcome.bleeding": "murio de: sangrado", - "hud.outcome.crippled": "murio de: paralisis", - "hud.outcome.frozen": "murio: congelado", - - // Chat outputs - "hud.chat.online_msg": "[{name}] se ha conectado.", - "hud.chat.offline_msg": "[{name}] se ha desconectado.", - - "hud.chat.default_death_msg": "[{name}] murió", - "hud.chat.environmental_kill_msg": "[{name}] murió en {environment}", - "hud.chat.fall_kill_msg": "[{name}] murió por daño de caída", - "hud.chat.suicide_msg": "[{name}] murió por heridas autoinfligidas", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} causado por [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] derrotó a [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] le disparó a [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] hizo explotar a [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] usó magia para matar a [{victim}]", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} causado por {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} mató a [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} le disparó a [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} hizo explotar a [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} usó magia para matar a [{victim}]", - "hud.chat.npc_other_kill_msg": "{attacker} mató a [{victim}]", - - "hud.chat.loot_msg": "Recogiste [{item}]", - "hud.chat.loot_fail": "¡Tu inventario está lleno!", - "hud.chat.goodbye": "¡Adiós!", - "hud.chat.connection_lost": "Conexión perdida. Expulsando en {time} segundos.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/crafting.ftl b/assets/voxygen/i18n/es_LA/hud/crafting.ftl new file mode 100644 index 0000000000..28f36ea4b6 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/crafting.ftl @@ -0,0 +1,33 @@ +hud-crafting = Crafteo +hud-crafting-recipes = Recetas +hud-crafting-ingredients = Ingredientes: +hud-crafting-craft = Fabricar +hud-crafting-tool_cata = Requisitos: +hud-crafting-req_crafting_station = Requiere: +hud-crafting-anvil = Yunque +hud-crafting-cauldron = Caldera +hud-crafting-cooking_pot = Olla de cocina +hud-crafting-crafting_bench = Banco de trabajo +hud-crafting-forge = Forja +hud-crafting-loom = Tejedora +hud-crafting-spinning_wheel = Máquina de Hilar +hud-crafting-tanning_rack = Estación de curtido +hud-crafting-salvaging_station = Banco de desmantelado +hud-crafting-campfire = Fogata +hud-crafting-tabs-all = Todos +hud-crafting-tabs-armor = Armadura +hud-crafting-tabs-dismantle = Desmontar +hud-crafting-tabs-food = Comida +hud-crafting-tabs-glider = Planeadores +hud-crafting-tabs-potion = Pociones +hud-crafting-tabs-tool = Herramientas +hud-crafting-tabs-utility = Utilidad +hud-crafting-tabs-weapon = Armas +hud-crafting-tabs-bag = Bolsas +hud-crafting-tabs-processed_material = Materiales +hud-crafting-dismantle_title = Desmantelar +hud-crafting-dismantle_explanation = + Coloca el cursor encima de un item para ver + que puedes obtener. + + Doble click en el objeto para comenzar a desmantelar. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/crafting.ron b/assets/voxygen/i18n/es_LA/hud/crafting.ron deleted file mode 100644 index cb39bf80d4..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.crafting": "Crafteo", - "hud.crafting.recipes": "Recetas", - "hud.crafting.ingredients": "Ingredientes:", - "hud.crafting.craft": "Fabricar", - "hud.crafting.tool_cata": "Requisitos:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Requiere:", - "hud.crafting.anvil": "Yunque", - "hud.crafting.cauldron": "Caldera", - "hud.crafting.cooking_pot": "Olla de cocina", - "hud.crafting.crafting_bench": "Banco de trabajo", - "hud.crafting.forge": "Forja", - "hud.crafting.loom": "Tejedora", - "hud.crafting.spinning_wheel": "Máquina de Hilar", - "hud.crafting.tanning_rack": "Estación de curtido", - "hud.crafting.salvaging_station": "Banco de desmantelado", - "hud.crafting.campfire": "Fogata", - // Tabs - "hud.crafting.tabs.all": "Todos", - "hud.crafting.tabs.armor": "Armadura", - "hud.crafting.tabs.dismantle": "Desmontar", - "hud.crafting.tabs.food": "Comida", - "hud.crafting.tabs.glider": "Planeadores", - "hud.crafting.tabs.potion": "Pociones", - "hud.crafting.tabs.tool": "Herramientas", - "hud.crafting.tabs.utility": "Utilidad", - "hud.crafting.tabs.weapon": "Armas", - "hud.crafting.tabs.bag": "Bolsas", - "hud.crafting.tabs.processed_material": "Materiales", - "hud.crafting.dismantle_title": "Desmantelar", - "hud.crafting.dismantle_explanation" : "Coloca el cursor encima de un item para ver\nque puedes obtener.\n\nDoble click en el objeto para comenzar a desmantelar.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/group.ftl b/assets/voxygen/i18n/es_LA/hud/group.ftl new file mode 100644 index 0000000000..ac435178a2 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grupo +hud-group-invite_to_join = [{ $name }] Te invito a su Grupo! +hud-group-invite_to_trade = [{ $name }] quiere comerciar contigo. +hud-group-invite = Invitar +hud-group-kick = Echar +hud-group-assign_leader = Asignar Lider +hud-group-leave = Salir del Grupo +hud-group-dead = Muerto +hud-group-out_of_range = Fuera de Alcance +hud-group-add_friend = Agregar a Amigos +hud-group-link_group = Conectar Grupos +hud-group-in_menu = Eligiendo Personaje +hud-group-members = Miembros del Grupo \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/group.ron b/assets/voxygen/i18n/es_LA/hud/group.ron deleted file mode 100644 index f2d1d95242..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.group": "Grupo", - "hud.group.invite_to_join": "[{name}] Te invito a su Grupo!", - "hud.group.invite_to_trade": "[{name}] quiere comerciar contigo.", - "hud.group.invite": "Invitar", - "hud.group.kick": "Echar", - "hud.group.assign_leader": "Asignar Lider", - "hud.group.leave": "Salir del Grupo", - "hud.group.dead" : "Muerto", - "hud.group.out_of_range": "Fuera de Alcance", - "hud.group.add_friend": "Agregar a Amigos", - "hud.group.link_group": "Conectar Grupos", - "hud.group.in_menu": "Eligiendo Personaje", - "hud.group.members": "Miembros del Grupo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/map.ftl b/assets/voxygen/i18n/es_LA/hud/map.ftl new file mode 100644 index 0000000000..d1726cf483 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/map.ftl @@ -0,0 +1,35 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Misiones +hud-map-topo_map = Fisico +hud-map-difficulty = Dificultad +hud-map-towns = Pueblos +hud-map-castles = Castillos +hud-map-dungeons = Calabozos +hud-map-caves = Cuevas +hud-map-cave = Cueva +hud-map-peaks = Montañas +hud-map-voxel_map = Voxel map +hud-map-trees = + Árboles + Gigantes +hud-map-tree = Árbol Gigante +hud-map-town = Pueblo +hud-map-castle = Castillo +hud-map-dungeon = Calabozo +hud-map-difficulty_dungeon = + Dificultad de + + Calabozo: { $difficulty } +hud-map-drag = Arrastrar +hud-map-zoom = Zoom +hud-map-recenter = Centrar +hud-map-mid_click = + Establecer + punto +hud-map-marked_location = Ubicación marcada +hud-map-marked_location_remove = Click para eliminar +hud-map-change_map_mode = Cambiar modo de mapa +hud-map-toggle_minimap_voxel = Alternar vista de Voxel en el minimapa +hud-map-zoom_minimap_explanation = + Amplíe el minimapa para ver + el área a su alrededor con mayor detalle \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/map.ron b/assets/voxygen/i18n/es_LA/hud/map.ron deleted file mode 100644 index 84fdf970fc..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/map.ron +++ /dev/null @@ -1,39 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Misiones", - "hud.map.topo_map": "Fisico", - "hud.map.difficulty": "Dificultad", - "hud.map.towns": "Pueblos", - "hud.map.castles": "Castillos", - "hud.map.dungeons": "Calabozos", - "hud.map.caves": "Cuevas", - "hud.map.cave": "Cueva", - "hud.map.peaks": "Montañas", - "hud.map.voxel_map": "Voxel map", - "hud.map.trees": "Árboles\nGigantes", - "hud.map.tree": "Árbol Gigante", - "hud.map.town": "Pueblo", - "hud.map.castle": "Castillo", - "hud.map.dungeon": "Calabozo", - "hud.map.difficulty_dungeon": "Dificultad de\n\nCalabozo: {difficulty}", - "hud.map.drag": "Arrastrar", - "hud.map.zoom": "Zoom", - "hud.map.recenter": "Centrar", - "hud.map.mid_click": "Establecer \npunto", - "hud.map.recenter": "Centrar", - "hud.map.marked_location": "Ubicación marcada", - "hud.map.marked_location_remove": "Click para eliminar", - "hud.map.change_map_mode": "Cambiar modo de mapa", - "hud.map.toggle_minimap_voxel": "Alternar vista de Voxel en el minimapa", - "hud.map.zoom_minimap_explanation": "Amplíe el minimapa para ver\nel área a su alrededor con mayor detalle", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/misc.ftl b/assets/voxygen/i18n/es_LA/hud/misc.ftl new file mode 100644 index 0000000000..865b72c3ad --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/misc.ftl @@ -0,0 +1,45 @@ +hud-do_not_show_on_startup = No muestres esto al iniciar +hud-show_tips = Mostrar Consejos +hud-quests = Misiones +hud-you_died = Moriste +hud-waypoint_saved = Marcador Guardado +hud-sp_arrow_txt = SP +hud-inventory_full = Inventario lleno +hud-press_key_to_show_keybindings_fmt = Presiona { $key } para mostrar los controles del teclado +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Linterna +hud-press_key_to_show_debug_info_fmt = Presiona { $key } para mostrar información de depuración +hud-press_key_to_toggle_keybindings_fmt = Presiona { $key } para alternar los controles del teclado +hud-press_key_to_toggle_debug_info_fmt = Presiona { $key } para alternar la información de depuración +hud-press_key_to_respawn = Presiona { $key } para reaparecer en la ultima fogata que visitaste. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = + ¡Presiona [ { $key } ] para + mover libremente el cursor y clickear este boton! +hud-tutorial_elements = Craftear +hud-temp_quest_headline = Saludos viajero! +hud-temp_quest_text = + Para comenzar tu viaje puedes empezar a buscar en esta aldea y reunir algunos provisiones. + + Puedes llevar todo lo que necesites en tu viaje! + + Mira en la parte inferior derecha de la pantalla para encontrar cosas como tu bolsa, el menú de artesanía y el mapa. + + El menú de elaboracion te permite crear armaduras, armas, comida y mucho más! + + Los animales salvajes que rodean la ciudad son una gran fuente de trozos de cuero para crear alguna protección contra los peligros del mundo. + + Cuando te sientas preparado, ¡intenta conseguir un equipo aún mejor en los numerosos desafíos marcados en el mapa! +hud-spell = Hechizos +hud-diary = Diario +hud-free_look_indicator = Vista libre activa +hud-camera_clamp_indicator = Soporte vertical de la cámara activa. Presiona { $key } para desactivarla. +hud-auto_walk_indicator = Caminata automática activa +hud-collect = Recolectar +hud-pick_up = Recoger +hud-open = Abrir +hud-use = Usar +hud-mine = Picar +hud-talk = Hablar +hud-trade = Comerciar +hud-mount = Montar +hud-sit = Sentarse \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/misc.ron b/assets/voxygen/i18n/es_LA/hud/misc.ron deleted file mode 100644 index 19d24eb7dd..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/misc.ron +++ /dev/null @@ -1,64 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.do_not_show_on_startup": "No muestres esto al iniciar", - "hud.show_tips": "Mostrar Consejos", - "hud.quests": "Misiones", - "hud.you_died": "Moriste", - "hud.waypoint_saved": "Marcador Guardado", - "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Inventario lleno", - - "hud.press_key_to_show_keybindings_fmt": "Presiona {key} para mostrar los controles del teclado", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Linterna", - "hud.press_key_to_show_debug_info_fmt": "Presiona {key} para mostrar información de depuración", - "hud.press_key_to_toggle_keybindings_fmt": "Presiona {key} para alternar los controles del teclado", - "hud.press_key_to_toggle_debug_info_fmt": "Presiona {key} para alternar la información de depuración", - - // Respawn message - "hud.press_key_to_respawn": r#"Presiona {key} para reaparecer en la ultima fogata que visitaste."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"¡Presiona [ {key} ] para -mover libremente el cursor y clickear este boton!"#, - "hud.tutorial_elements": r#"Craftear"#, - -"hud.temp_quest_headline": r#"Saludos viajero!"#, -"hud.temp_quest_text": r#"Para comenzar tu viaje puedes empezar a buscar en esta aldea y reunir algunos provisiones. - -Puedes llevar todo lo que necesites en tu viaje! - -Mira en la parte inferior derecha de la pantalla para encontrar cosas como tu bolsa, el menú de artesanía y el mapa. - -El menú de elaboracion te permite crear armaduras, armas, comida y mucho más! - -Los animales salvajes que rodean la ciudad son una gran fuente de trozos de cuero para crear alguna protección contra los peligros del mundo. - -Cuando te sientas preparado, ¡intenta conseguir un equipo aún mejor en los numerosos desafíos marcados en el mapa! -"#, - - "hud.spell": "Hechizos", - // Diary - "hud.diary": "Diario", - - "hud.free_look_indicator": "Vista libre activa", - "hud.camera_clamp_indicator": "Soporte vertical de la cámara activa. Presiona {key} para desactivarla.", - "hud.auto_walk_indicator": "Caminata automática activa", - "hud.collect": "Recolectar", - "hud.pick_up": "Recoger", - "hud.open": "Abrir", - "hud.use": "Usar", - "hud.mine": "Picar", - "hud.talk": "Hablar", - "hud.trade": "Comerciar", - "hud.mount": "Montar", - "hud.sit": "Sentarse", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/sct.ftl b/assets/voxygen/i18n/es_LA/hud/sct.ftl new file mode 100644 index 0000000000..c3a3934ae6 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOQUEADO \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/sct.ron b/assets/voxygen/i18n/es_LA/hud/sct.ron deleted file mode 100644 index 88760ebbfb..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOQUEADO", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/settings.ftl b/assets/voxygen/i18n/es_LA/hud/settings.ftl new file mode 100644 index 0000000000..bb748c9744 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/settings.ftl @@ -0,0 +1,122 @@ +hud-settings-general = General +hud-settings-none = Ninguno +hud-settings-press_behavior-toggle = Alternar +hud-settings-press_behavior-hold = Mantener +hud-settings-help_window = Ventana de Ayuda +hud-settings-debug_info = Información de Depuración +hud-settings-show_hitboxes = Mostrar hitboxes +hud-settings-show_chat = Mostrar chat +hud-settings-show_hotkey_hints = Mostrar sugerencias de teclas +hud-settings-tips_on_startup = Consejos de Inicio +hud-settings-ui_scale = Escala de la Interfaz +hud-settings-relative_scaling = Escalado Relativo +hud-settings-custom_scaling = Escalado Personalizado +hud-settings-crosshair = Mira +hud-settings-opacity = Transparencia +hud-settings-hotbar = Inventario Rápido +hud-settings-toggle_shortcuts = Alternar Atajos +hud-settings-buffs_skillbar = Buffs en la barra de habilidades. +hud-settings-buffs_mmap = Buffs en el Minimapa +hud-settings-toggle_bar_experience = Alternar Barra de Experiencia +hud-settings-scrolling_combat_text = Texto de Combate con Desplazamiento +hud-settings-incoming_damage = Daño Recibido +hud-settings-speech_bubble = Burbuja de Diálogo +hud-settings-speech_bubble_self = Mostrar Diálogos propios en Burbuja +hud-settings-speech_bubble_dark_mode = Burbuja de Diálogo en Modo Oscuro +hud-settings-speech_bubble_icon = Icono de Burbuja de Diálogo +hud-settings-energybar_numbers = Números de la Barra de Energia +hud-settings-always_show_bars = Mostrar siempre barra de energia +hud-settings-values = Valores +hud-settings-percentages = Porcentajes +hud-settings-chat = Chat +hud-settings-background_opacity = Transparencia del Fondo +hud-settings-chat_character_name = Nombres de Personajes en el chat +hud-settings-loading_tips = Consejos en Pantalla de Carga +hud-settings-reset_interface = Restaurar valores +hud-settings-pan_sensitivity = Sensibilidad de Desplazamiento de la Cámara +hud-settings-zoom_sensitivity = Sensibilidad del Zoom +hud-settings-camera_clamp_angle = Ángulo para el modo de soporte de cámara vertical +hud-settings-invert_scroll_zoom = Invertir Zoom +hud-settings-invert_mouse_y_axis = Invertir eje Y del Ratón +hud-settings-invert_controller_y_axis = Invertir el eje Y del Mando +hud-settings-enable_mouse_smoothing = Suavizado de Cámara +hud-settings-free_look_behavior = Modo de vista libre +hud-settings-auto_walk_behavior = Modo de caminata automática +hud-settings-camera_clamp_behavior = Comportamiento del soporte de la cámara +hud-settings-player_physics_behavior = Física en jugador (experimental) +hud-settings-stop_auto_walk_on_input = Parar caminata automática +hud-settings-auto_camera = Cámara automatica +hud-settings-reset_gameplay = Restaurar valores +hud-settings-view_distance = Distancia de Visión +hud-settings-sprites_view_distance = Distancia de Visión de Sprites +hud-settings-figures_view_distance = Distancia de Visión de Entidades +hud-settings-maximum_fps = FPS Máximos +hud-settings-background_fps = FPS de fondo +hud-settings-present_mode = Present Mode +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Intermedio +hud-settings-fov = Campo de Visión (grados) +hud-settings-gamma = Gama +hud-settings-exposure = Exposición +hud-settings-ambiance = Brillo del Ambiente +hud-settings-antialiasing_mode = Modo Anti-Aliasing +hud-settings-upscale_factor = Factor de Escala +hud-settings-cloud_rendering_mode = Modo de Renderizado de Nubes +hud-settings-fluid_rendering_mode = Modo de Renderizado del Agua +hud-settings-fluid_rendering_mode-cheap = Bajo +hud-settings-fluid_rendering_mode-shiny = Alto +hud-settings-cloud_rendering_mode-minimal = Mínimo +hud-settings-cloud_rendering_mode-low = Bajo +hud-settings-cloud_rendering_mode-medium = Medio +hud-settings-cloud_rendering_mode-high = Alto +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Pantalla Completa +hud-settings-fullscreen_mode = Modo de Pantalla Completa +hud-settings-fullscreen_mode-exclusive = Completo +hud-settings-fullscreen_mode-borderless = Con Bordes +hud-settings-gpu_profiler = Habilitar la sincronización de la GPU (no es compatible en cualquier PC) +hud-settings-particles = Partículas +hud-settings-lossy_terrain_compression = Compresión de terreno con pérdidas +hud-settings-resolution = Resolución +hud-settings-bit_depth = Profundidad de Bits +hud-settings-refresh_rate = Taza de Refresco +hud-settings-lighting_rendering_mode = Renderizado de la luz de la Linterna +hud-settings-lighting_rendering_mode-ashikhmin = Tipo A - Alto +hud-settings-lighting_rendering_mode-blinnphong = Tipo B - Medio +hud-settings-lighting_rendering_mode-lambertian = Tipo L - Bajo +hud-settings-shadow_rendering_mode = Renderizado de Sombras +hud-settings-shadow_rendering_mode-none = Ninguno +hud-settings-shadow_rendering_mode-cheap = Barato +hud-settings-shadow_rendering_mode-map = Mapeado +hud-settings-shadow_rendering_mode-map-resolution = Resolución +hud-settings-lod_detail = Nivel de detalle (LOD) +hud-settings-save_window_size = Guardar tamaño +hud-settings-reset_graphics = Restaurar valores +hud-settings-bloom = Flora +hud-settings-point_glow = Intensidad de luces +hud-settings-master_volume = Volumen maestro +hud-settings-inactive_master_volume_perc = Volumen de ventana inactivo +hud-settings-music_volume = Volumen de Música +hud-settings-sound_effect_volume = Volumen de Efectos de Sonido +hud-settings-audio_device = Dispositivo de Audio +hud-settings-reset_sound = Restaurar valores +hud-settings-english_fallback = Mostrar inglés para las traducciones que faltan +hud-settings-awaitingkey = Presiona una tecla... +hud-settings-unbound = Ninguno +hud-settings-reset_keybinds = Restaurar Controles +hud-settings-chat_tabs = Pestañas de Chat +hud-settings-label = Etiqueta: +hud-settings-delete = Borrar +hud-settings-show_all = Mostrar todo +hud-settings-messages = Mensajes +hud-settings-activity = Actividad +hud-settings-death = Muerte +hud-settings-group = Grupo +hud-settings-faction = Facciones +hud-settings-world = Mundo +hud-settings-region = Region +hud-settings-say = Decir +hud-settings-all = Todos +hud-settings-group_only = Solo grupo +hud-settings-reset_chat = Restaurar valores \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/settings.ron b/assets/voxygen/i18n/es_LA/hud/settings.ron deleted file mode 100644 index 53d59ee9cc..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/settings.ron +++ /dev/null @@ -1,140 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - // Settings - "hud.settings.general": "General", - "hud.settings.none": "Ninguno", - "hud.settings.press_behavior.toggle": "Alternar", - "hud.settings.press_behavior.hold": "Mantener", - "hud.settings.help_window": "Ventana de Ayuda", - "hud.settings.debug_info": "Información de Depuración", - "hud.settings.show_hitboxes": "Mostrar hitboxes", - "hud.settings.show_chat": "Mostrar chat", - "hud.settings.show_hotkey_hints": "Mostrar sugerencias de teclas", - "hud.settings.tips_on_startup": "Consejos de Inicio", - "hud.settings.ui_scale": "Escala de la Interfaz", - "hud.settings.relative_scaling": "Escalado Relativo", - "hud.settings.custom_scaling": "Escalado Personalizado", - "hud.settings.crosshair": "Mira", - "hud.settings.opacity": "Transparencia", - "hud.settings.hotbar": "Inventario Rápido", - "hud.settings.toggle_shortcuts": "Alternar Atajos", - "hud.settings.buffs_skillbar": "Buffs en la barra de habilidades.", - "hud.settings.buffs_mmap": "Buffs en el Minimapa", - "hud.settings.toggle_bar_experience": "Alternar Barra de Experiencia", - "hud.settings.scrolling_combat_text": "Texto de Combate con Desplazamiento", - "hud.settings.incoming_damage": "Daño Recibido", - "hud.settings.speech_bubble": "Burbuja de Diálogo", - "hud.settings.speech_bubble_self": "Mostrar Diálogos propios en Burbuja", - "hud.settings.speech_bubble_dark_mode": "Burbuja de Diálogo en Modo Oscuro", - "hud.settings.speech_bubble_icon": "Icono de Burbuja de Diálogo", - "hud.settings.energybar_numbers": "Números de la Barra de Energia", - "hud.settings.always_show_bars": "Mostrar siempre barra de energia", - "hud.settings.values": "Valores", - "hud.settings.percentages": "Porcentajes", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Transparencia del Fondo", - "hud.settings.chat_character_name": "Nombres de Personajes en el chat", - "hud.settings.loading_tips": "Consejos en Pantalla de Carga", - "hud.settings.reset_interface": "Restaurar valores", - - "hud.settings.pan_sensitivity": "Sensibilidad de Desplazamiento de la Cámara", - "hud.settings.zoom_sensitivity": "Sensibilidad del Zoom", - "hud.settings.camera_clamp_angle": "Ángulo para el modo de soporte de cámara vertical", - "hud.settings.invert_scroll_zoom": "Invertir Zoom", - "hud.settings.invert_mouse_y_axis": "Invertir eje Y del Ratón", - "hud.settings.invert_controller_y_axis": "Invertir el eje Y del Mando", - "hud.settings.enable_mouse_smoothing": "Suavizado de Cámara", - "hud.settings.free_look_behavior": "Modo de vista libre", - "hud.settings.auto_walk_behavior": "Modo de caminata automática", - "hud.settings.camera_clamp_behavior": "Comportamiento del soporte de la cámara", - "hud.settings.player_physics_behavior": "Física en jugador (experimental)", - "hud.settings.stop_auto_walk_on_input": "Parar caminata automática", - "hud.settings.auto_camera": "Cámara automatica", - "hud.settings.reset_gameplay": "Restaurar valores", - - "hud.settings.view_distance": "Distancia de Visión", - "hud.settings.sprites_view_distance": "Distancia de Visión de Sprites", - "hud.settings.figures_view_distance": "Distancia de Visión de Entidades", - "hud.settings.maximum_fps": "FPS Máximos", - "hud.settings.background_fps": "FPS de fondo", - "hud.settings.present_mode": "Present Mode", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Intermedio", - "hud.settings.fov": "Campo de Visión (grados)", - "hud.settings.gamma": "Gama", - "hud.settings.exposure": "Exposición", - "hud.settings.ambiance": "Brillo del Ambiente", - "hud.settings.antialiasing_mode": "Modo Anti-Aliasing", - "hud.settings.upscale_factor": "Factor de Escala", - "hud.settings.cloud_rendering_mode": "Modo de Renderizado de Nubes", - "hud.settings.fluid_rendering_mode": "Modo de Renderizado del Agua", - "hud.settings.fluid_rendering_mode.cheap": "Bajo", - "hud.settings.fluid_rendering_mode.shiny": "Alto", - "hud.settings.cloud_rendering_mode.minimal": "Mínimo", - "hud.settings.cloud_rendering_mode.low": "Bajo", - "hud.settings.cloud_rendering_mode.medium": "Medio", - "hud.settings.cloud_rendering_mode.high": "Alto", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Pantalla Completa", - "hud.settings.fullscreen_mode": "Modo de Pantalla Completa", - "hud.settings.fullscreen_mode.exclusive": "Completo", - "hud.settings.fullscreen_mode.borderless": "Con Bordes", - "hud.settings.gpu_profiler": "Habilitar la sincronización de la GPU (no es compatible en cualquier PC)", - "hud.settings.particles": "Partículas", - "hud.settings.lossy_terrain_compression": "Compresión de terreno con pérdidas", - "hud.settings.resolution": "Resolución", - "hud.settings.bit_depth": "Profundidad de Bits", - "hud.settings.refresh_rate": "Taza de Refresco", - "hud.settings.lighting_rendering_mode": "Renderizado de la luz de la Linterna", - "hud.settings.lighting_rendering_mode.ashikhmin": "Tipo A - Alto", - "hud.settings.lighting_rendering_mode.blinnphong": "Tipo B - Medio", - "hud.settings.lighting_rendering_mode.lambertian": "Tipo L - Bajo", - "hud.settings.shadow_rendering_mode": "Renderizado de Sombras", - "hud.settings.shadow_rendering_mode.none": "Ninguno", - "hud.settings.shadow_rendering_mode.cheap": "Barato", - "hud.settings.shadow_rendering_mode.map": "Mapeado", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolución", - "hud.settings.lod_detail": "Nivel de detalle (LOD)", - "hud.settings.save_window_size": "Guardar tamaño", //It's repeated in en.ron (359 and 370) - "hud.settings.reset_graphics": "Restaurar valores", - "hud.settings.bloom": "Flora", - "hud.settings.point_glow": "Intensidad de luces", - - "hud.settings.master_volume": "Volumen maestro", - "hud.settings.inactive_master_volume_perc": "Volumen de ventana inactivo", - "hud.settings.music_volume": "Volumen de Música", - "hud.settings.sound_effect_volume": "Volumen de Efectos de Sonido", - "hud.settings.audio_device": "Dispositivo de Audio", - "hud.settings.reset_sound": "Restaurar valores", - - "hud.settings.english_fallback": "Mostrar inglés para las traducciones que faltan", - - "hud.settings.awaitingkey": "Presiona una tecla...", - "hud.settings.unbound": "Ninguno", - "hud.settings.reset_keybinds": "Restaurar Controles", - - "hud.settings.chat_tabs": "Pestañas de Chat", - "hud.settings.label": "Etiqueta:", - "hud.settings.delete": "Borrar", - "hud.settings.show_all": "Mostrar todo", - "hud.settings.messages": "Mensajes", - "hud.settings.activity": "Actividad", - "hud.settings.death": "Muerte", - "hud.settings.group": "Grupo", - "hud.settings.faction": "Facciones", - "hud.settings.world": "Mundo", - "hud.settings.region": "Region", - "hud.settings.say": "Decir", - "hud.settings.all": "Todos", - "hud.settings.group_only": "Solo grupo", - "hud.settings.reset_chat" : "Restaurar valores", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/skills.ftl b/assets/voxygen/i18n/es_LA/hud/skills.ftl new file mode 100644 index 0000000000..1f40cfef37 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/skills.ftl @@ -0,0 +1,238 @@ +hud-skill-not_unlocked = Todavía no desbloqueado +hud-skill-req_sp ={"\u000A"} + + Requiere { $number } PH +hud-rank_up = Nuevo punto de habilidad +hud-skill-sp_available = { $number } PH disponible/s +hud-skill-inc_health_title = Aumenta la salud +hud-skill-inc_health = Aumenta la salud máxima de { $boost }%{ $SP } +hud-skill-inc_energy_title = Aumenta la energía +hud-skill-inc_energy = Aumenta la energía máxima de { $boost }%{ $SP } +hud-skill-unlck_sword_title = Desbloquea Espada +hud-skill-unlck_sword = Desbloquea el arbol de la Espada{ $SP } +hud-skill-unlck_axe_title = Desbloquea Hacha +hud-skill-unlck_axe = Desbloquea el arbol de la Hacha{ $SP } +hud-skill-unlck_hammer_title = Desbloquea Martillo +hud-skill-unlck_hammer = Desbloquea el arbol del Martillo{ $SP } +hud-skill-unlck_bow_title = Desbloquea Arco +hud-skill-unlck_bow = Desbloquea el arbol del Arco{ $SP } +hud-skill-unlck_staff_title = Desbloquea Vara +hud-skill-unlck_staff = Desbloquea el arbol del Vara{ $SP } +hud-skill-unlck_sceptre_title = Desbloquea Cetro +hud-skill-unlck_sceptre = Desbloquea el arbol del Cetro{ $SP } +hud-skill-dodge_title = Rodar +hud-skill-dodge = Rodar se activa con el clic del medio y otorgan inmunidad temporal a los ataques cuerpo a cuerpo (iframes) mientras estás rodando. +hud-skill-roll_energy_title = Coste de Energía al Rodar +hud-skill-roll_energy = Rodar usa un { $boost }% menos de energía{ $SP } +hud-skill-roll_speed_title = Velocidad de Rodar +hud-skill-roll_speed = Rueda un { $boost }% más rapido{ $SP } +hud-skill-roll_dur_title = Duración de Rodar +hud-skill-roll_dur = Rodar dura un { $boost }% más{ $SP } +hud-skill-climbing_title = Escalar +hud-skill-climbing = Saltando más alto +hud-skill-climbing_cost_title = Costo de Escalar +hud-skill-climbing_cost = Escalar usa un { $boost }% menos de energía{ $SP } +hud-skill-climbing_speed_title = Velocidad de Escalamiento +hud-skill-climbing_speed = Escala un { $boost }% más rapido{ $SP } +hud-skill-swim_title = Nado +hud-skill-swim = Moverse en entornos húmedos +hud-skill-swim_speed_title = Velocidad de Nado +hud-skill-swim_speed = Nada un { $boost }% más rapido{ $SP } +hud-skill-sc_lifesteal_title = Rayo vampirico +hud-skill-sc_lifesteal = Drena la vida de tus enemigos +hud-skill-sc_lifesteal_damage_title = Daño +hud-skill-sc_lifesteal_damage = Inflinge { $boost }% más de daño{ $SP } +hud-skill-sc_lifesteal_range_title = Rango +hud-skill-sc_lifesteal_range = Tu rayo llega un { $boost }% mas lejos{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Robo de vida +hud-skill-sc_lifesteal_lifesteal = Convierte un { $boost }% más de daño en vida{ $SP } +hud-skill-sc_lifesteal_regen_title = Regeneración de vida +hud-skill-sc_lifesteal_regen = Regenera un { $boost }% más tu energia{ $SP } +hud-skill-sc_heal_title = Aura Sanadora +hud-skill-sc_heal = Cura a tus aliados usando la sangre de tus enemigos, requiere un combo para activarse +hud-skill-sc_heal_heal_title = Cura +hud-skill-sc_heal_heal = Aumenta la cantidad de curación en un { $boost }% { $SP } +hud-skill-sc_heal_cost_title = Coste de Energia +hud-skill-sc_heal_cost = La curación requiere { $boost }% menos de energía { $SP } +hud-skill-sc_heal_duration_title = Duración +hud-skill-sc_heal_duration = Los efectos de tu aura curativa duran un { $boost }% más{ $SP } +hud-skill-sc_heal_range_title = Radio +hud-skill-sc_heal_range = Tu aura curativa llega un { $boost }% más{ $SP } +hud-skill-sc_wardaura_unlock_title = Desbloqueo de aura protectora +hud-skill-sc_wardaura_unlock = Te permite proteger a tus aliados contra ataques enemigos.{ $SP } +hud-skill-sc_wardaura_strength_title = Fuerza +hud-skill-sc_wardaura_strength = La fuerza de tu protección aumenta en un { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Duración +hud-skill-sc_wardaura_duration = Los efectos de tu vara duran un { $boost }% más{ $SP } +hud-skill-sc_wardaura_range_title = Radio +hud-skill-sc_wardaura_range = Tu vara llega un { $boost }% más{ $SP } +hud-skill-sc_wardaura_cost_title = Coste de energia +hud-skill-sc_wardaura_cost = Crear el aura costa un { $boost }% menos de energia{ $SP } +hud-skill-st_shockwave_range_title = Alcance de Onda de Choque +hud-skill-st_shockwave_range = tira cosas que solian solian estar fuera de alcance, rango aumentado un { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Coste de Onda de Choque +hud-skill-st_shockwave_cost = Baja el costo de energía para arrojar a los aldeanos indefensos en un { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Golpe de Onda de Choque +hud-skill-st_shockwave_knockback = Aumenta la potencia de lanzamiento en un { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Daño por Onda de Choque +hud-skill-st_shockwave_damage = Aumenta el daño causado en un { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Desbloquea Onda de Choque +hud-skill-st_shockwave_unlock = Desbloquea la habilidad de arrojar enemigos usando fuego{ $SP } +hud-skill-st_flamethrower_title = Lanzallamas +hud-skill-st_flamethrower = Lanza fuego, cocinalos +hud-skill-st_flame_velocity_title = Velocidad de la llama +hud-skill-st_flame_velocity = Hace que el fuego llegue más rápido, { $boost }% más rápido{ $SP } +hud-skill-st_flamethrower_range_title = Alcance de Lanzallamas +hud-skill-st_flamethrower_range = Para cuando no alcanzan las llamas, aumentara el alcance un { $boost }%{ $SP } +hud-skill-st_energy_drain_title = Drenaje de energía +hud-skill-st_energy_drain = Disminuye la velocidad a la que se drena la energía en un { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Daño del lanzallamas +hud-skill-st_flamethrower_damage = Aumenta el daño en un { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Radio de explosión +hud-skill-st_explosion_radius = Cuanto más grande, mejor, aumenta el radio de explosión en un { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Regeneración de energía +hud-skill-st_energy_regen = Aumenta la ganancia de energía en { $boost }%{ $SP } +hud-skill-st_fireball_title = Bola de fuego +hud-skill-st_fireball = Dispara una bola de fuego que explota al impactar +hud-skill-st_damage_title = Daño +hud-skill-st_damage = Aumenta el daño en un { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Velocidad del proyectil +hud-skill-bow_projectile_speed = Le permite disparar flechas más lejos, más rápido, un { $boost }%{ $SP } +hud-skill-bow_charged_title = Disparo cargado +hud-skill-bow_charged = Porque esperaste más +hud-skill-bow_charged_damage_title = Daño cargado +hud-skill-bow_charged_damage = Aumenta el daño en un { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Regeneración cargada +hud-skill-bow_charged_energy_regen = Aumenta la recuperación de energía en un { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Golpe cargado +hud-skill-bow_charged_knockback = Derriba a los enemigos más atrás { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = Velocidad de carga +hud-skill-bow_charged_speed = Aumenta la velocidad de carga en un { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Velocidad de movimiento al recargar +hud-skill-bow_charged_move = Aumenta la velocidad con la que puedes desplazarte mientras recargas en un { $boost }%{ $SP } +hud-skill-bow_repeater_title = Arco Repetidor +hud-skill-bow_repeater = Dispara más rápido cuanto más tiempo disparas +hud-skill-bow_repeater_damage_title = Daño del arco repetidor +hud-skill-bow_repeater_damage = Aumenta el daño realizado en un { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Coste del arco repetidor +hud-skill-bow_repeater_cost = Disminuye el coste de energía para convertirse en un arco repetidor de planeo en un { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Velocidad del repetidor +hud-skill-bow_repeater_speed = Aumenta la velocidad a la que disparas flechas en un { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Desbloquea la escopeta +hud-skill-bow_shotgun_unlock = Desbloquea la capacidad de disparar varias flechas a la vez{ $SP } +hud-skill-bow_shotgun_damage_title = Daño de Escopeta +hud-skill-bow_shotgun_damage = Aumenta el daño causado por { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Costo de la Escopeta +hud-skill-bow_shotgun_cost = Disminuye el costo de la escopeta en un { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Flechas de escopeta +hud-skill-bow_shotgun_arrow_count = Increases the number of arrows in the burst by { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Flechas de escopeta +hud-skill-bow_shotgun_spread = Disminuye la propagación de las flechas en un { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Radio de Salto +hud-skill-hmr_leap_radius = Aumenta el radio de ataque en golpes de tierra en{ $boost } metros más{ $SP } +hud-skill-hmr_leap_distance_title = Distancia de salto +hud-skill-hmr_leap_distance = Aumenta la distancia de salto en un { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Costo de salto +hud-skill-hmr_leap_cost = Disminuye el costo del salto en un { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Retroceso de salto +hud-skill-hmr_leap_knockback = Aumenta el retroceso del salto en un { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Daño de salto +hud-skill-hmr_leap_damage = Aumenta el daño de salto por { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Desbloquear Salto +hud-skill-hmr_unlock_leap = Desbloquea un salto{ $SP } +hud-skill-hmr_charged_melee_title = Basico cargado +hud-skill-hmr_charged_melee = Ataque basico pero cargado +hud-skill-hmr_charged_rate_title = Velocidad de carga +hud-skill-hmr_charged_rate = Aumenta velocidad de carga en un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Energia del Basico Cargado +hud-skill-hmr_charged_melee_nrg_drain = Disminuye la cantidad de energía necesaria de la carga en un { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Daño del Basico Cargado +hud-skill-hmr_charged_melee_damage = Aumenta el daño del golpe en { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Empujo de Basico Cargado +hud-skill-hmr_charged_melee_knockback = Aumenta enormemente el potencial de lanzamiento del empujon en un { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Ataque Único +hud-skill-hmr_single_strike = Tan único como tú +hud-skill-hmr_single_strike_regen_title = Regeneración de Ataque Único +hud-skill-hmr_single_strike_regen = Aumenta la ganancia de energía con cada golpe{ $SP } +hud-skill-hmr_single_strike_speed_title = Velocidad de Ataque Único +hud-skill-hmr_single_strike_speed = Aumenta la velocidad de ataque con cada golpe sucesivo{ $SP } +hud-skill-hmr_single_strike_damage_title = Daño de Ataque Único +hud-skill-hmr_single_strike_damage = Aumenta el daño con cada golpe sucesivo{ $SP } +hud-skill-hmr_single_strike_knockback_title = Empuje de Ataque Único +hud-skill-hmr_single_strike_knockback = Aumenta el empuje en un { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Golpe triple +hud-skill-sw_trip_str = Golpe, hasta tres veces +hud-skill-sw_trip_str_combo_title = Combo de triple golpe +hud-skill-sw_trip_str_combo = Desbloquea la escala de combo en triple strike{ $SP } +hud-skill-sw_trip_str_dmg_title = Daño de triple golpe +hud-skill-sw_trip_str_dmg = Aumenta el daño que hace cada golpe sucesivo{ $SP } +hud-skill-sw_trip_str_sp_title = Velocidad de golpe triple +hud-skill-sw_trip_str_sp = Aumenta la velocidad de ataque ganada por cada golpe sucesivo{ $SP } +hud-skill-sw_trip_str_reg_title = Regeneración de Triple Golpe +hud-skill-sw_trip_str_reg = Aumenta la ganancia de energía en cada golpe sucesivo{ $SP } +hud-skill-sw_dash_title = Embestida +hud-skill-sw_dash = Atraviesa a tus enemigos +hud-skill-sw_dash_dmg_title = Daño de Embestida +hud-skill-sw_dash_dmg = Aumenta el daño inicial de la embestida en un { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Drenaje de la Embestida +hud-skill-sw_dash_drain = Reduce el drenaje de energía al embestir en un { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Coste de la Embestida +hud-skill-sw_dash_cost = Reduce el coste inicial al embestir en un { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Velocidad de la Embestida +hud-skill-sw_dash_speed = Aumenta la velocidad del Dash { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Embestida Atravesante +hud-skill-sw_dash_charge_through = Te permite embestir atravesando los primeros enemigos que golpeas{ $SP } +hud-skill-sw_dash_scale_title = Escalado de la Embestida +hud-skill-sw_dash_scale = Aumenta el daño cuanto más embistes en un { $boost }%{ $SP } +hud-skill-sw_spin_title = Desbloquear Giro +hud-skill-sw_spin = Desbloquea el giro de la espada{ $SP } +hud-skill-sw_spin_dmg_title = Daño por giro +hud-skill-sw_spin_dmg = Incrementa el daño realizado en un { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Velocidad de giro +hud-skill-sw_spin_spd = Aumenta la velocidad de giro en un { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Coste de giro +hud-skill-sw_spin_cost = Disminuye el coste de energía de cada giro en un { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Gira que gira +hud-skill-sw_spin_spins = Aumenta el número de veces que puedes girar{ $SP } +hud-skill-sw_interrupt_title = Interrumpir ataques +hud-skill-sw_interrupt = Te permite cancelar inmediatamente un ataque con otro ataque{ $SP } +hud-skill-axe_double_strike_title = Golpe Doble +hud-skill-axe_double_strike = Troza a esos villanos +hud-skill-axe_double_strike_combo_title = Combo de Golpe Doble +hud-skill-axe_double_strike_combo = Desbloquea un segundo golpe{ $SP } +hud-skill-axe_double_strike_damage_title = Daño de golpe doble +hud-skill-axe_double_strike_damage = Aumenta el daño infligido en cada golpe sucesivo{ $SP } +hud-skill-axe_double_strike_speed_title = Velocidad de golpe doble +hud-skill-axe_double_strike_speed = Aumenta la velocidad de ataque con cada golpe sucesivo{ $SP } +hud-skill-axe_double_strike_regen_title = Regeneración de Golpe Doble +hud-skill-axe_double_strike_regen = Aumenta la ganancia de resistencia con cada golpe sucesivo{ $SP } +hud-skill-axe_spin_title = Giro con hacha +hud-skill-axe_spin = Giras con el hacha al rededor ... +hud-skill-axe_infinite_axe_spin_title = Giro de hacha infinito +hud-skill-axe_infinite_axe_spin = Gira durante todo el tiempo que tengas energía{ $SP } +hud-skill-axe_spin_damage_title = Daño por giro +hud-skill-axe_spin_damage = Aumenta el daño que hace cada giro en un { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Helicóptero giratorio +hud-skill-axe_spin_helicopter = Caes un poco más lento mientras giras{ $SP } +hud-skill-axe_spin_speed_title = Velocidad de giro +hud-skill-axe_spin_speed = Aumenta tu velocidad de giro en un { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Coste de giro +hud-skill-axe_spin_cost = Disminuye el coste de aguante de los giros en un { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Desbloquear Salto +hud-skill-axe_unlock_leap = Desbloquea salto con giro{ $SP } +hud-skill-axe_leap_damage_title = Daño de salto +hud-skill-axe_leap_damage = Aumenta el daño del salto en un { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Retroceso de salto +hud-skill-axe_leap_cost = Disminuye el coste del salto en un { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Coste del salto +hud-skill-axe_leap_distance_title = Distancia de salto +hud-skill-axe_leap_distance = Aumenta la distancia del salto en un { $boost }%{ $SP } +hud-skill-mining_title = Mineria +hud-skill-pick_strike_title = Golpe con pico +hud-skill-pick_strike = Golpea rocas con el pico para conseguir minerales, gemas y experiencia +hud-skill-pick_strike_speed_title = Velocidad de golpe de pico +hud-skill-pick_strike_speed = Mina más rapido{ $SP } +hud-skill-pick_strike_oregain_title = Rendimiento del Pico con Minerales +hud-skill-pick_strike_oregain = Posibilidad de conseguir mineral extra({ $boost }% por nivel){ $SP } +hud-skill-pick_strike_gemgain_title = Rendimiento del Pico con Gemas +hud-skill-pick_strike_gemgain = Posibilidad de conseguir gemas extras ({ $boost }% por nivel){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/skills.ron b/assets/voxygen/i18n/es_LA/hud/skills.ron deleted file mode 100644 index 8e5e0f699e..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/skills.ron +++ /dev/null @@ -1,259 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.skill.not_unlocked": "Todavía no desbloqueado", - "hud.skill.req_sp": "\n\nRequiere {number} PH", - "hud.rank_up": "Nuevo punto de habilidad", - "hud.skill.sp_available": "{number} PH disponible/s", - // Skills - // General - "hud.skill.inc_health_title": "Aumenta la salud", - "hud.skill.inc_health": "Aumenta la salud máxima de {boost}%{SP}", - "hud.skill.inc_energy_title": "Aumenta la energía", - "hud.skill.inc_energy": "Aumenta la energía máxima de {boost}%{SP}", - "hud.skill.unlck_sword_title": "Desbloquea Espada", - "hud.skill.unlck_sword": "Desbloquea el arbol de la Espada{SP}", - "hud.skill.unlck_axe_title": "Desbloquea Hacha", - "hud.skill.unlck_axe": "Desbloquea el arbol de la Hacha{SP}", - "hud.skill.unlck_hammer_title": "Desbloquea Martillo", - "hud.skill.unlck_hammer": "Desbloquea el arbol del Martillo{SP}", - "hud.skill.unlck_bow_title": "Desbloquea Arco", - "hud.skill.unlck_bow": "Desbloquea el arbol del Arco{SP}", - "hud.skill.unlck_staff_title": "Desbloquea Vara", - "hud.skill.unlck_staff": "Desbloquea el arbol del Vara{SP}", - "hud.skill.unlck_sceptre_title": "Desbloquea Cetro", - "hud.skill.unlck_sceptre": "Desbloquea el arbol del Cetro{SP}", - "hud.skill.dodge_title": "Rodar", - "hud.skill.dodge": "Rodar se activa con el clic del medio y otorgan inmunidad temporal a los ataques cuerpo a cuerpo (iframes) mientras estás rodando.", - "hud.skill.roll_energy_title": "Coste de Energía al Rodar", - "hud.skill.roll_energy": "Rodar usa un {boost}% menos de energía{SP}", - "hud.skill.roll_speed_title": "Velocidad de Rodar", - "hud.skill.roll_speed": "Rueda un {boost}% más rapido{SP}", - "hud.skill.roll_dur_title": "Duración de Rodar", - "hud.skill.roll_dur": "Rodar dura un {boost}% más{SP}", - "hud.skill.climbing_title": "Escalar", - "hud.skill.climbing": "Saltando más alto", - "hud.skill.climbing_cost_title": "Costo de Escalar", - "hud.skill.climbing_cost": "Escalar usa un {boost}% menos de energía{SP}", - "hud.skill.climbing_speed_title": "Velocidad de Escalamiento", - "hud.skill.climbing_speed": "Escala un {boost}% más rapido{SP}", - "hud.skill.swim_title": "Nado", - "hud.skill.swim": "Moverse en entornos húmedos", - "hud.skill.swim_speed_title": "Velocidad de Nado", - "hud.skill.swim_speed": "Nada un {boost}% más rapido{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Rayo vampirico", - "hud.skill.sc_lifesteal": "Drena la vida de tus enemigos", - "hud.skill.sc_lifesteal_damage_title": "Daño", - "hud.skill.sc_lifesteal_damage": "Inflinge {boost}% más de daño{SP}", - "hud.skill.sc_lifesteal_range_title": "Rango", - "hud.skill.sc_lifesteal_range": "Tu rayo llega un {boost}% mas lejos{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Robo de vida", - "hud.skill.sc_lifesteal_lifesteal": "Convierte un {boost}% más de daño en vida{SP}", - "hud.skill.sc_lifesteal_regen_title": "Regeneración de vida", - "hud.skill.sc_lifesteal_regen": "Regenera un {boost}% más tu energia{SP}", - "hud.skill.sc_heal_title": "Aura Sanadora", - "hud.skill.sc_heal": "Cura a tus aliados usando la sangre de tus enemigos, requiere un combo para activarse", - "hud.skill.sc_heal_heal_title": "Cura", - "hud.skill.sc_heal_heal": "Aumenta la cantidad de curación en un {boost}% {SP}", - "hud.skill.sc_heal_cost_title": "Coste de Energia", - "hud.skill.sc_heal_cost": "La curación requiere {boost}% menos de energía {SP}", - "hud.skill.sc_heal_duration_title": "Duración", - "hud.skill.sc_heal_duration": "Los efectos de tu aura curativa duran un {boost}% más{SP}", - "hud.skill.sc_heal_range_title": "Radio", - "hud.skill.sc_heal_range": "Tu aura curativa llega un {boost}% más{SP}", - "hud.skill.sc_wardaura_unlock_title": "Desbloqueo de aura protectora", - "hud.skill.sc_wardaura_unlock": "Te permite proteger a tus aliados contra ataques enemigos.{SP}", - "hud.skill.sc_wardaura_strength_title": "Fuerza", - "hud.skill.sc_wardaura_strength": "La fuerza de tu protección aumenta en un {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Duración", - "hud.skill.sc_wardaura_duration": "Los efectos de tu vara duran un {boost}% más{SP}", - "hud.skill.sc_wardaura_range_title": "Radio", - "hud.skill.sc_wardaura_range": "Tu vara llega un {boost}% más{SP}", - "hud.skill.sc_wardaura_cost_title": "Coste de energia", - "hud.skill.sc_wardaura_cost": "Crear el aura costa un {boost}% menos de energia{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Alcance de Onda de Choque", - "hud.skill.st_shockwave_range" : "tira cosas que solian solian estar fuera de alcance, rango aumentado un {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Coste de Onda de Choque", - "hud.skill.st_shockwave_cost" : "Baja el costo de energía para arrojar a los aldeanos indefensos en un {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Golpe de Onda de Choque", - "hud.skill.st_shockwave_knockback" : "Aumenta la potencia de lanzamiento en un {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Daño por Onda de Choque", - "hud.skill.st_shockwave_damage" : "Aumenta el daño causado en un {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Desbloquea Onda de Choque", - "hud.skill.st_shockwave_unlock" : "Desbloquea la habilidad de arrojar enemigos usando fuego{SP}", - "hud.skill.st_flamethrower_title" : "Lanzallamas", - "hud.skill.st_flamethrower" : "Lanza fuego, cocinalos", - "hud.skill.st_flame_velocity_title" : "Velocidad de la llama", - "hud.skill.st_flame_velocity" : "Hace que el fuego llegue más rápido, {boost}% más rápido{SP}", - "hud.skill.st_flamethrower_range_title" : "Alcance de Lanzallamas", - "hud.skill.st_flamethrower_range" : "Para cuando no alcanzan las llamas, aumentara el alcance un {boost}%{SP}", - "hud.skill.st_energy_drain_title" : "Drenaje de energía", - "hud.skill.st_energy_drain" : "Disminuye la velocidad a la que se drena la energía en un {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Daño del lanzallamas", - "hud.skill.st_flamethrower_damage" : "Aumenta el daño en un {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Radio de explosión", - "hud.skill.st_explosion_radius" : "Cuanto más grande, mejor, aumenta el radio de explosión en un {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Regeneración de energía", - "hud.skill.st_energy_regen" : "Aumenta la ganancia de energía en {boost}%{SP}", - "hud.skill.st_fireball_title" : "Bola de fuego", - "hud.skill.st_fireball" : "Dispara una bola de fuego que explota al impactar", - "hud.skill.st_damage_title" : "Daño", - "hud.skill.st_damage" : "Aumenta el daño en un {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Velocidad del proyectil", - "hud.skill.bow_projectile_speed" : "Le permite disparar flechas más lejos, más rápido, un {boost}%{SP}", - "hud.skill.bow_charged_title" : "Disparo cargado", - "hud.skill.bow_charged" : "Porque esperaste más", - "hud.skill.bow_charged_damage_title" : "Daño cargado", - "hud.skill.bow_charged_damage" : "Aumenta el daño en un {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Regeneración cargada", - "hud.skill.bow_charged_energy_regen" : "Aumenta la recuperación de energía en un {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Golpe cargado", - "hud.skill.bow_charged_knockback" : "Derriba a los enemigos más atrás {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "Velocidad de carga", - "hud.skill.bow_charged_speed" : "Aumenta la velocidad de carga en un {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Velocidad de movimiento al recargar", - "hud.skill.bow_charged_move" : "Aumenta la velocidad con la que puedes desplazarte mientras recargas en un {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Arco Repetidor", - "hud.skill.bow_repeater" : "Dispara más rápido cuanto más tiempo disparas", - "hud.skill.bow_repeater_damage_title" : "Daño del arco repetidor", - "hud.skill.bow_repeater_damage" : "Aumenta el daño realizado en un {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Coste del arco repetidor", - "hud.skill.bow_repeater_cost" : "Disminuye el coste de energía para convertirse en un arco repetidor de planeo en un {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Velocidad del repetidor", - "hud.skill.bow_repeater_speed" : "Aumenta la velocidad a la que disparas flechas en un {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Desbloquea la escopeta", - "hud.skill.bow_shotgun_unlock" : "Desbloquea la capacidad de disparar varias flechas a la vez{SP}", - "hud.skill.bow_shotgun_damage_title" : "Daño de Escopeta", - "hud.skill.bow_shotgun_damage" : "Aumenta el daño causado por {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Costo de la Escopeta", - "hud.skill.bow_shotgun_cost" : "Disminuye el costo de la escopeta en un {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Flechas de escopeta", - "hud.skill.bow_shotgun_arrow_count" : "Increases the number of arrows in the burst by {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Flechas de escopeta", - "hud.skill.bow_shotgun_spread" : "Disminuye la propagación de las flechas en un {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Radio de Salto", - "hud.skill.hmr_leap_radius" : "Aumenta el radio de ataque en golpes de tierra en{boost} metros más{SP}", - "hud.skill.hmr_leap_distance_title" : "Distancia de salto", - "hud.skill.hmr_leap_distance" : "Aumenta la distancia de salto en un {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Costo de salto", - "hud.skill.hmr_leap_cost" : "Disminuye el costo del salto en un {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Retroceso de salto", - "hud.skill.hmr_leap_knockback" : "Aumenta el retroceso del salto en un {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Daño de salto", - "hud.skill.hmr_leap_damage" : "Aumenta el daño de salto por {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Desbloquear Salto", - "hud.skill.hmr_unlock_leap" : "Desbloquea un salto{SP}", - "hud.skill.hmr_charged_melee_title" : "Basico cargado", - "hud.skill.hmr_charged_melee" : "Ataque basico pero cargado", - "hud.skill.hmr_charged_rate_title" : "Velocidad de carga", - "hud.skill.hmr_charged_rate" : "Aumenta velocidad de carga en un {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Energia del Basico Cargado", - "hud.skill.hmr_charged_melee_nrg_drain" : "Disminuye la cantidad de energía necesaria de la carga en un {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Daño del Basico Cargado", - "hud.skill.hmr_charged_melee_damage" : "Aumenta el daño del golpe en {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Empujo de Basico Cargado", - "hud.skill.hmr_charged_melee_knockback" : "Aumenta enormemente el potencial de lanzamiento del empujon en un {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Ataque Único", - "hud.skill.hmr_single_strike" : "Tan único como tú", - "hud.skill.hmr_single_strike_regen_title" : "Regeneración de Ataque Único", - "hud.skill.hmr_single_strike_regen" : "Aumenta la ganancia de energía con cada golpe{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Velocidad de Ataque Único", - "hud.skill.hmr_single_strike_speed" : "Aumenta la velocidad de ataque con cada golpe sucesivo{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Daño de Ataque Único", - "hud.skill.hmr_single_strike_damage" : "Aumenta el daño con cada golpe sucesivo{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Empuje de Ataque Único", - "hud.skill.hmr_single_strike_knockback" : "Aumenta el empuje en un {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Golpe triple", - "hud.skill.sw_trip_str": "Golpe, hasta tres veces", - "hud.skill.sw_trip_str_combo_title": "Combo de triple golpe", - "hud.skill.sw_trip_str_combo": "Desbloquea la escala de combo en triple strike{SP}", - "hud.skill.sw_trip_str_dmg_title": "Daño de triple golpe", - "hud.skill.sw_trip_str_dmg": "Aumenta el daño que hace cada golpe sucesivo{SP}", - "hud.skill.sw_trip_str_sp_title": "Velocidad de golpe triple", - "hud.skill.sw_trip_str_sp": "Aumenta la velocidad de ataque ganada por cada golpe sucesivo{SP}", - "hud.skill.sw_trip_str_reg_title": "Regeneración de Triple Golpe", - "hud.skill.sw_trip_str_reg": "Aumenta la ganancia de energía en cada golpe sucesivo{SP}", - "hud.skill.sw_dash_title": "Embestida", - "hud.skill.sw_dash": "Atraviesa a tus enemigos", - "hud.skill.sw_dash_dmg_title": "Daño de Embestida", - "hud.skill.sw_dash_dmg": "Aumenta el daño inicial de la embestida en un {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Drenaje de la Embestida", - "hud.skill.sw_dash_drain": "Reduce el drenaje de energía al embestir en un {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Coste de la Embestida", - "hud.skill.sw_dash_cost": "Reduce el coste inicial al embestir en un {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Velocidad de la Embestida", - "hud.skill.sw_dash_speed": "Aumenta la velocidad del Dash {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Embestida Atravesante", // TODO: Check - "hud.skill.sw_dash_charge_through": "Te permite embestir atravesando los primeros enemigos que golpeas{SP}", - "hud.skill.sw_dash_scale_title": "Escalado de la Embestida", - "hud.skill.sw_dash_scale": "Aumenta el daño cuanto más embistes en un {boost}%{SP}", - "hud.skill.sw_spin_title": "Desbloquear Giro", - "hud.skill.sw_spin": "Desbloquea el giro de la espada{SP}", - "hud.skill.sw_spin_dmg_title": "Daño por giro", - "hud.skill.sw_spin_dmg": "Incrementa el daño realizado en un {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Velocidad de giro", - "hud.skill.sw_spin_spd": "Aumenta la velocidad de giro en un {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Coste de giro", - "hud.skill.sw_spin_cost": "Disminuye el coste de energía de cada giro en un {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Gira que gira", - "hud.skill.sw_spin_spins": "Aumenta el número de veces que puedes girar{SP}", - "hud.skill.sw_interrupt_title": "Interrumpir ataques", - "hud.skill.sw_interrupt": "Te permite cancelar inmediatamente un ataque con otro ataque{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Golpe Doble", - "hud.skill.axe_double_strike": "Troza a esos villanos", - "hud.skill.axe_double_strike_combo_title": "Combo de Golpe Doble", - "hud.skill.axe_double_strike_combo": "Desbloquea un segundo golpe{SP}", - "hud.skill.axe_double_strike_damage_title": "Daño de golpe doble", - "hud.skill.axe_double_strike_damage": "Aumenta el daño infligido en cada golpe sucesivo{SP}", - "hud.skill.axe_double_strike_speed_title": "Velocidad de golpe doble", - "hud.skill.axe_double_strike_speed": "Aumenta la velocidad de ataque con cada golpe sucesivo{SP}", - "hud.skill.axe_double_strike_regen_title": "Regeneración de Golpe Doble ", - "hud.skill.axe_double_strike_regen": "Aumenta la ganancia de resistencia con cada golpe sucesivo{SP}", - "hud.skill.axe_spin_title": "Giro con hacha", - "hud.skill.axe_spin": "Giras con el hacha al rededor ...", - "hud.skill.axe_infinite_axe_spin_title": "Giro de hacha infinito", - "hud.skill.axe_infinite_axe_spin": "Gira durante todo el tiempo que tengas energía{SP}", - "hud.skill.axe_spin_damage_title": "Daño por giro", - "hud.skill.axe_spin_damage": "Aumenta el daño que hace cada giro en un {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Helicóptero giratorio", - "hud.skill.axe_spin_helicopter": "Caes un poco más lento mientras giras{SP}", - "hud.skill.axe_spin_speed_title": "Velocidad de giro", - "hud.skill.axe_spin_speed": "Aumenta tu velocidad de giro en un {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Coste de giro", - "hud.skill.axe_spin_cost": "Disminuye el coste de aguante de los giros en un {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Desbloquear Salto", - "hud.skill.axe_unlock_leap": "Desbloquea salto con giro{SP}", - "hud.skill.axe_leap_damage_title": "Daño de salto", - "hud.skill.axe_leap_damage": "Aumenta el daño del salto en un {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Retroceso de salto", - "hud.skill.axe_leap_cost": "Disminuye el coste del salto en un {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Coste del salto", - "hud.skill.axe_leap_cost": "Disminuye el coste del salto en un {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Distancia de salto", - "hud.skill.axe_leap_distance": "Aumenta la distancia del salto en un {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Mineria", - "hud.skill.pick_strike_title": "Golpe con pico", - "hud.skill.pick_strike": "Golpea rocas con el pico para conseguir minerales, gemas y experiencia", - "hud.skill.pick_strike_speed_title": "Velocidad de golpe de pico", - "hud.skill.pick_strike_speed": "Mina más rapido{SP}", - "hud.skill.pick_strike_oregain_title": "Rendimiento del Pico con Minerales", - "hud.skill.pick_strike_oregain": "Posibilidad de conseguir mineral extra({boost}% por nivel){SP}", - "hud.skill.pick_strike_gemgain_title": "Rendimiento del Pico con Gemas", - "hud.skill.pick_strike_gemgain": "Posibilidad de conseguir gemas extras ({boost}% por nivel){SP}", - - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/es_LA/hud/social.ftl b/assets/voxygen/i18n/es_LA/hud/social.ftl new file mode 100644 index 0000000000..620a1271b3 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Lista de jugadores +hud-social-online = En Línea +hud-social-friends = Amigos +hud-social-not_yet_available = Aún no esta disponible +hud-social-faction = Facción +hud-social-play_online_fmt = { $nb_player } jugador(es) en línea +hud-social-name = Nombre +hud-social-level = Nivel +hud-social-zone = Zona +hud-social-account = Cuenta \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/social.ron b/assets/voxygen/i18n/es_LA/hud/social.ron deleted file mode 100644 index 2a4fb78afd..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.social": "Lista de jugadores", - "hud.social.online": "En Línea", - "hud.social.friends": "Amigos", - "hud.social.not_yet_available": "Aún no esta disponible", - "hud.social.faction": "Facción", - "hud.social.play_online_fmt": "{nb_player} jugador(es) en línea", - "hud.social.name": "Nombre", - "hud.social.level": "Nivel", - "hud.social.zone": "Zona", - "hud.social.account": "Cuenta", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/es_LA/hud/trade.ftl b/assets/voxygen/i18n/es_LA/hud/trade.ftl new file mode 100644 index 0000000000..e0d2566d3c --- /dev/null +++ b/assets/voxygen/i18n/es_LA/hud/trade.ftl @@ -0,0 +1,25 @@ +hud-trade-trade_window = Intercambio +hud-trade-phase1_description = + Arrastra los objetos que quieras comerciar + en la zona correspondiente. +hud-trade-phase2_description = + El intercambio está bloqueado para que tengas + tiempo de revisarlo. +hud-trade-phase3_description = El intercambio está siendo procesado. +hud-trade-persons_offer = Oferta de { $playername } +hud-trade-has_accepted = + { $playername } + ha aceptado +hud-trade-accept = Aceptar +hud-trade-decline = Rechazar +hud-trade-invite_sent = Solicitud de intercambio enviada a { $playername }. +hud-trade-result-completed = Intercambio completado con éxito. +hud-trade-result-declined = Intercambio rechazado. +hud-trade-result-nospace = No hay suficiente espacio para completar el intercambio. +hud-trade-buy_price = Precio de compra +hud-trade-sell_price = Precio de venta +hud-trade-coin = moneda(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Tu oferta +hud-trade-their_offer = Su oferta \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/hud/trade.ron b/assets/voxygen/i18n/es_LA/hud/trade.ron deleted file mode 100644 index 1dca511798..0000000000 --- a/assets/voxygen/i18n/es_LA/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - "hud.trade.trade_window": "Intercambio", - "hud.trade.phase1_description": "Arrastra los objetos que quieras comerciar\n en la zona correspondiente.", - "hud.trade.phase2_description": "El intercambio está bloqueado para que tengas\n tiempo de revisarlo.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "El intercambio está siendo procesado.", - "hud.trade.persons_offer": "Oferta de {playername}", - "hud.trade.has_accepted": "{playername}\nha aceptado", - "hud.trade.accept": "Aceptar", - "hud.trade.decline": "Rechazar", - "hud.trade.invite_sent": "Solicitud de intercambio enviada a {playername}.", - "hud.trade.result.completed": "Intercambio completado con éxito.", - "hud.trade.result.declined": "Intercambio rechazado.", - "hud.trade.result.nospace": "No hay suficiente espacio para completar el intercambio.", - "hud.trade.buy_price": "Precio de compra", - "hud.trade.sell_price": "Precio de venta", - "hud.trade.coin": "moneda(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Tu oferta", - "hud.trade.their_offer": "Su oferta", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/es_LA/main.ftl b/assets/voxygen/i18n/es_LA/main.ftl new file mode 100644 index 0000000000..1b745f1710 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/main.ftl @@ -0,0 +1,99 @@ +main-username = Usuario +main-server = Servidor +main-password = Contraseña +main-connecting = Conectando +main-creating_world = Creando Mundo +main-tip = Consejo: +main-unbound_key_tip = unbound +main-notice = + Bienvenido a la version alfa de Veloren! + + Antes de que te diviertas, por favor ten en cuenta lo siguiente: + + - Esta es una alfa muy temprana, espera fallos, jugabilidad extremadamente incompleta, mecánicas sin pulir y características faltantes. + + - Si tienes críticas constructivas o reportes de fallos, puedes contactarnos por reddit, GitLab, o por el server de Discord de nuestra comunidad. + + - Veloren esta licenciado bajo la licencia GPL 3 open-source (código abierto). Eso significa que tienes la libertad de jugar, modificar, y redistribuir el Juego como + desees (siempre y cuando dicho trabajo también este licenciado como GPL 3). + + - Veloren es un proyecto en comunidad sin ánimo de lucro, y todos los que trabajan en el son voluntarios. + Si te gusta lo que ves, eres bienvenido a unirte a los equipos de desarrollo o de arte! + + Gracias por tomarte el tiempo de leer este mensaje, esperamos que disfrutes el juego! + + ~ Los Desarrolladores de Veloren +main-login_process = + Información sobre el proceso para Iniciar Sesión: + + Por favor ten en cuenta que ahora necesitas una cuenta + para jugar en servidores con autenticación activada. + + Puedes crearte una cuenta en + + https://veloren.net/account/. +main-login-server_not_found = No se encontró el servidor +main-login-authentication_error = Error de autenticación en el servidor +main-login-internal_error = Error interno en el cliente (lo más probable es que se haya eliminado el personaje del jugador) +main-login-failed_auth_server_url_invalid = Error para conectar con el servidor de autenticación +main-login-insecure_auth_scheme = El esquema de autenticación HTTP NO es compatible. ¡Es inseguro! Para propósitos de desarrollo, HTTP está permitido para 'localhost' o versiones de depuración +main-login-server_full = El servidor está lleno +main-login-untrusted_auth_server = El servidor de autenticación no es confiable +main-login-outdated_client_or_server = ServidorEnloquecido: Probablemente las versiones son incompatibles, intenta actualizar tu cliente. +main-login-timeout = Tiempo de espera agotado: El servidor no respondio a tiempo. (Puede estar sobrecargado o tener problemas de red). +main-login-server_shut_down = El servidor se apagó +main-login-network_error = Error de red +main-login-network_wrong_version = Versión de servidor y cliente no coincidente, actualice su cliente de juego. +main-login-failed_sending_request = El pedido al servidor de autenticacion fallo +main-login-invalid_character = El personaje seleccionado no es válido +main-login-client_crashed = El cliente crasheó +main-login-not_on_whitelist = No estás en la lista. Contacta al Dueño del Servidor si quieres unirte. +main-login-banned = Usted ha sido baneado por la siguiente razón +main-login-kicked = Te han echado por la siguiente razón +main-login-select_language = Elige un idioma +main-login-client_version = Version del cliente +main-login-server_version = Version del servidor +main-login-client_init_failed = Fallo de Cliente al inicializar: { $init_fail_reason } +main-login-username_bad_characters = ¡Nombre de Usuario contiene caracteres inválidos! (Solo alfanuméricos, '_' y '-' están permitidos) +main-login-username_too_long = ¡Nombre de usuario demasiado largo! La Longitud máxima es: { $max_len } +main-servers-select_server = Elige un servidor +main-servers-singleplayer_error = Fallo al conectar con el servidor interno: { $sp_error } +main-servers-network_error = Red de Servidor/Error de socket: { $raw_error } +main-servers-participant_error = Participante desconectado/error protocolo: { $raw_error } +main-servers-stream_error = Client connection/compression/(de)serialization error: { $raw_error } +main-servers-database_error = Error en la base de datos del servidor: { $raw_error } +main-servers-persistence_error = Error del servidor persistente (Probablemente datos de Assets/Personajes): { $raw_error } +main-servers-other_error = Error en el servidor general: { $raw_error } +main-credits = Créditos +main-credits-created_by = creado por +main-credits-music = Musica +main-credits-fonts = Fuentes +main-credits-other_art = Otras Artes +main-credits-contributors = Colaboradores +loading-tips = + .a0 = Presiona '{ $gameinput-togglelantern }' para encender tu linterna. + .a1 = Presiona '{ $gameinput-help }' para ver los controles predeterminados. + .a2 = Puedes escribir /say o /s para chatear solo con jugadores alrededor tuyo. + .a3 = Puedes escribir /region o /r para chatear solo con jugadores que están a unos cientos bloques alrededor tuyo. + .a4 = Los Admins pueden usar el comando /build para entrar en el modo construir. + .a5 = Puedes escribir /group o /g para solo chatear con jugadores en tu grupo actual. + .a6 = Para enviar mensajes privados escribe /tell seguido de el nombre de un jugador y luego tu mensaje. + .a7 = Observa el terreno en búsqueda de comida, cofres y botines! + .a8 = ¿Inventario lleno de comida? Intenta craftear mejor comida con ella! + .a9 = ¿Te preguntas dónde debes hacerlo? ¡Las Dungeons están marcadas en el mapa! + .a10 = No te olvides de ajustar los gráficos de tu pc. Presiona '{ $gameinput-settings }' para abrir la configuración. + .a11 = Jugar con otros es divertido! Presiona '{ $gameinput-social }' para ver quien esta conectado. + .a12 = Presiona '{ $gameinput-dance }' para bailar. Fiesta! + .a13 = Presiona '{ $gameinput-glide }' para abrir tu planeador y conquistar los cielos. + .a14 = Veloren está aún en Alfa temprana. Hacemos lo mejor para mejorar día a día! + .a15 = Si te quieres unir al equipo de desarrolladores o chatear con nosotros, únete a nuestro servidor de Discord. + .a16 = Puedes elegir mostrar tu cantidad de vida en la barra de vida en ajustes. + .a17 = Sientate cerca de una fogata (con la tecla '{ $gameinput-sit }') para recuperarse lentamente de sus heridas. + .a18 = ¿Necesitas más mochilas o una mejor armadura para continuar tu viaje? ¡Presione '{ $gameinput-crafting }' para abrir el menú de creación! + .a19 = Presiona '{ $gameinput-roll }' para rodar. Rodar puede usarse para moverse rapidamente y esquivar ataques enemigos. + .a20 = ¿Te preguntas para qué se utiliza un objeto? Busque 'input:' en el menu de creación para ver en qué recetas se usa. + .a21 = ¿Encontraste algo genial? Toma una captura de pantalla con '{ $gameinput-screenshot }'. + .a22 = Intenta saltar cuando ruedas entre criaturas. + .a23 = NPCs con el mismo nivel pueden tener una dificultad diferente. + .a24 = Un NPC con un craneo debajo de su barra de vida es bastante más poderoso comparado contigo. + .a25 = Para ver tus estadísticas, haz click en el botón 'Estadísticas' en el inventario. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/main.ron b/assets/voxygen/i18n/es_LA/main.ron deleted file mode 100644 index 48e508fc21..0000000000 --- a/assets/voxygen/i18n/es_LA/main.ron +++ /dev/null @@ -1,120 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Latin-American -( - string_map: { - /// Start Main screen section - "main.username": "Usuario", - "main.server": "Servidor", - "main.password": "Contraseña", - "main.connecting": "Conectando", - "main.creating_world": "Creando Mundo", - "main.tip": "Consejo:", - "main.unbound_key_tip": "unbound", // TODO: Check - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Bienvenido a la version alfa de Veloren! - -Antes de que te diviertas, por favor ten en cuenta lo siguiente: - -- Esta es una alfa muy temprana, espera fallos, jugabilidad extremadamente incompleta, mecánicas sin pulir y características faltantes. - -- Si tienes críticas constructivas o reportes de fallos, puedes contactarnos por reddit, GitLab, o por el server de Discord de nuestra comunidad. - -- Veloren esta licenciado bajo la licencia GPL 3 open-source (código abierto). Eso significa que tienes la libertad de jugar, modificar, y redistribuir el Juego como - desees (siempre y cuando dicho trabajo también este licenciado como GPL 3). - -- Veloren es un proyecto en comunidad sin ánimo de lucro, y todos los que trabajan en el son voluntarios. -Si te gusta lo que ves, eres bienvenido a unirte a los equipos de desarrollo o de arte! - -Gracias por tomarte el tiempo de leer este mensaje, esperamos que disfrutes el juego! - -~ Los Desarrolladores de Veloren"#, - - // Login process description - "main.login_process": r#"Información sobre el proceso para Iniciar Sesión: - -Por favor ten en cuenta que ahora necesitas una cuenta -para jugar en servidores con autenticación activada. - -Puedes crearte una cuenta en - -https://veloren.net/account/."#, - "main.login.server_not_found": "No se encontró el servidor", - "main.login.authentication_error": "Error de autenticación en el servidor", - "main.login.internal_error": "Error interno en el cliente (lo más probable es que se haya eliminado el personaje del jugador)", - "main.login.failed_auth_server_url_invalid": "Error para conectar con el servidor de autenticación", - "main.login.insecure_auth_scheme": "El esquema de autenticación HTTP NO es compatible. ¡Es inseguro! Para propósitos de desarrollo, HTTP está permitido para 'localhost' o versiones de depuración", - "main.login.server_full": "El servidor está lleno", - "main.login.untrusted_auth_server": "El servidor de autenticación no es confiable", - "main.login.outdated_client_or_server": "ServidorEnloquecido: Probablemente las versiones son incompatibles, intenta actualizar tu cliente.", - "main.login.timeout": "Tiempo de espera agotado: El servidor no respondio a tiempo. (Puede estar sobrecargado o tener problemas de red).", - "main.login.server_shut_down": "El servidor se apagó", - "main.login.network_error": "Error de red", - "main.login.network_wrong_version": "Versión de servidor y cliente no coincidente, actualice su cliente de juego.", - "main.login.failed_sending_request": "El pedido al servidor de autenticacion fallo", - "main.login.invalid_character": "El personaje seleccionado no es válido", - "main.login.client_crashed": "El cliente crasheó", - "main.login.not_on_whitelist": "No estás en la lista. Contacta al Dueño del Servidor si quieres unirte.", - "main.login.banned": "Usted ha sido baneado por la siguiente razón", - "main.login.kicked": "Te han echado por la siguiente razón", - "main.login.select_language": "Elige un idioma", - "main.login.client_version": "Version del cliente", - "main.login.server_version": "Version del servidor", - "main.login.client_init_failed": "Fallo de Cliente al inicializar: {init_fail_reason}", - "main.login.username_bad_characters": "¡Nombre de Usuario contiene caracteres inválidos! (Solo alfanuméricos, '_' y '-' están permitidos)", - "main.login.username_too_long": "¡Nombre de usuario demasiado largo! La Longitud máxima es: {max_len}", - "main.servers.select_server": "Elige un servidor", - "main.servers.singleplayer_error": "Fallo al conectar con el servidor interno: {sp_error}", - "main.servers.network_error": "Red de Servidor/Error de socket: {raw_error}", - "main.servers.participant_error": "Participante desconectado/error protocolo: {raw_error}", - "main.servers.stream_error": "Client connection/compression/(de)serialization error: {raw_error}", - "main.servers.database_error": "Error en la base de datos del servidor: {raw_error}", - "main.servers.persistence_error": "Error del servidor persistente (Probablemente datos de Assets/Personajes): {raw_error}", - "main.servers.other_error": "Error en el servidor general: {raw_error}", - - // Credits screen - "main.credits": "Créditos", - "main.credits.created_by": "creado por", - "main.credits.music": "Musica", - "main.credits.fonts": "Fuentes", - "main.credits.other_art": "Otras Artes", - "main.credits.contributors": "Colaboradores", - - /// End Main screen section - }, - - - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "Presiona '{gameinput.togglelantern}' para encender tu linterna.", - "Presiona '{gameinput.help}' para ver los controles predeterminados.", - "Puedes escribir /say o /s para chatear solo con jugadores alrededor tuyo.", - "Puedes escribir /region o /r para chatear solo con jugadores que están a unos cientos bloques alrededor tuyo.", - "Los Admins pueden usar el comando /build para entrar en el modo construir.", - "Puedes escribir /group o /g para solo chatear con jugadores en tu grupo actual.", - "Para enviar mensajes privados escribe /tell seguido de el nombre de un jugador y luego tu mensaje.", - "Observa el terreno en búsqueda de comida, cofres y botines!", - "¿Inventario lleno de comida? Intenta craftear mejor comida con ella!", - "¿Te preguntas dónde debes hacerlo? ¡Las Dungeons están marcadas en el mapa!", - "No te olvides de ajustar los gráficos de tu pc. Presiona '{gameinput.settings}' para abrir la configuración.", - "Jugar con otros es divertido! Presiona '{gameinput.social}' para ver quien esta conectado.", - "Presiona '{gameinput.dance}' para bailar. Fiesta!", - "Presiona '{gameinput.glide}' para abrir tu planeador y conquistar los cielos.", - "Veloren está aún en Alfa temprana. Hacemos lo mejor para mejorar día a día!", - "Si te quieres unir al equipo de desarrolladores o chatear con nosotros, únete a nuestro servidor de Discord.", - "Puedes elegir mostrar tu cantidad de vida en la barra de vida en ajustes.", - "Sientate cerca de una fogata (con la tecla '{gameinput.sit}') para recuperarse lentamente de sus heridas.", - "¿Necesitas más mochilas o una mejor armadura para continuar tu viaje? ¡Presione '{gameinput.crafting}' para abrir el menú de creación!", - "Presiona '{gameinput.roll}' para rodar. Rodar puede usarse para moverse rapidamente y esquivar ataques enemigos.", - "¿Te preguntas para qué se utiliza un objeto? Busque 'input:' en el menu de creación para ver en qué recetas se usa.", - "¿Encontraste algo genial? Toma una captura de pantalla con '{gameinput.screenshot}'.", - - "Intenta saltar cuando ruedas entre criaturas.", - "NPCs con el mismo nivel pueden tener una dificultad diferente.", - "Un NPC con un craneo debajo de su barra de vida es bastante más poderoso comparado contigo.", - "Para ver tus estadísticas, haz click en el botón 'Estadísticas' en el inventario.", - ], - } -) diff --git a/assets/voxygen/i18n/es_LA/npc.ftl b/assets/voxygen/i18n/es_LA/npc.ftl new file mode 100644 index 0000000000..f3f1c57bf2 --- /dev/null +++ b/assets/voxygen/i18n/es_LA/npc.ftl @@ -0,0 +1,177 @@ +npc-speech-villager = + .a0 = ¿No es un hermoso día? + .a1 = ¿Como estás? + .a2 = ¡Muy buenos días! + .a3 = Me gustaria saber que piensa un Catoblepas cuando come cesped. + .a4 = ¿Qué piensas sobre este clima? + .a5 = Pensar en esas mazmorras me da miedo. Espero que alguien las limpie. + .a6 = Me gustaria explorar una cueva cuando sea más fuerte. + .a7 = ¿Has visto a mi gato? + .a8 = ¿Alguna vez escuchaste sobre la ferocidad de los Tiburones de Tierra? Yo escuche que viven en el desierto. + .a9 = Dicen que se encuentran gemas brillantes de todo tipo en las cuevas. + .a10 = Estoy loco por este queso! + .a11 = ¿No vas a entrar? ¡Justo estabamos por comer algo de queso! + .a12 = Se dice que los hongos son buenos para tu salud. Nunca los probe. + .a13 = ¡No te olvides las galletas! + .a14 = Simplemente adoro el queso de enanos. Ojala pudiera hacerlo. + .a15 = Me pregunto que habra del otro lado de las montañas. + .a16 = Espero poder hacer mi propio planeador algún día. + .a17 = ¿Te gustaria ver mi jardín? Bien, tal vez en otro momento. + .a18 = ¡Que lindo día para dar un paseo por el bosque! + .a19 = ¿Ser o no ser? Creo que sere un granjero. + .a20 = ¿No crees que nuestra aldea es la mejor? + .a21 = ¿Qué supones que hace brillar a los Restos Brillantes (Glowing Remains)? + .a22 = ¡Pienso que es hora para un segundo desayuno! + .a23 = ¿Has alguna vez capturado a una libelula? + .a24 = No puedo entender de donde esos Sauroks siguen viniendo. + .a25 = Desearia que alguien mantuviera los lobos alejados de la aldea. + .a26 = Anoche tuve un maravilloso sueño sobre queso. ¿Qué significa? + .a27 = Dejé algo de queso a mi hermano. Ahora no se si existe o no. Lo llamo el queso de Schrödinger. + .a28 = Dejé algo de queso a mi hermana. Ahora no se si existe o no. Lo llamo el queso de Schrödinger. + .a29 = Alguien deberia de hacer algo con esos cultistas. De preferencia yo no. + .a30 = Espero que llueva pronto. Sería bueno para la cosecha. + .a31 = ¡Me encanta la miel! Y odio las abejas. + .a32 = Quiero ver el mundo algún día. Tiene que haber más por vivir que lo que ofrece esta aldea. +npc-speech-villager_decline_trade = + .a0 = Lo siento, no tengo nada para intercambiar. + .a1 = ¿Quieres intercambiar? Como si tuviera algo que te interesara. + .a2 = Mi casa is mia, no quiero intercambiarla por nada. +npc-speech-merchant_advertisement = + .a0 = ¿Puedo ofrecerte algo que te interese para intercambiar? + .a1 = ¿Quieres intercambiar conmigo? + .a2 = Tengo muchos bienes, ¿Quieres echar un vistazo? +npc-speech-merchant_busy = + .a0 = Hey, espera tu turno. + .a1 = Espere por favor, soy sólo una persona. + .a2 = ¿Ves a la otra persona en frente tuyo? + .a3 = Un momento, déjame terminar. + .a4 = No saltarse la cola. + .a5 = Estoy ocupado, vuelva más tarde. +npc-speech-merchant_trade_successful = + .a0 = ¡Gracias por comerciar conmigo! + .a1 = ¡Gracias! +npc-speech-merchant_trade_declined = + .a0 = Quizas en otro momento, ¡tenga un buen día! + .a1 = Que mal, ¡tal vez la proxima! +npc-speech-villager_cultist_alarm = + .a0 = ¡Cuidado! ¡Hay un cultista suelto! + .a1 = ¡A las armas! ¡Los cultistas nos atacan! + .a2 = ¡Como se atreven los cultistas a atacar nuestra aldea! + .a3 = ¡Muerte a los cultistas! + .a4 = ¡Aquí no toleramos a los cultistas! + .a5 = ¡Cultista asesino! + .a6 = ¡Saborea el filo de mi espada, sucio cultista! + .a7 = ¡Nada puede limpiar la sangre de tus manos, cultista! + .a8 = ¡Maldición! ¡Un cultista entre nosotros! + .a9 = ¡Los males de estos cultistas estan por acabarse! + .a10 = ¡Este cultista es mío! + .a11 = ¡Preparate para conocer a tu creador, estupido cultista! + .a12 = ¡Veo a un cultista! ¡Atrapenlo! + .a13 = ¡Veo a un cultista! ¡Ataquen! + .a14 = ¡Veo a un cultista! ¡No dejen que escape! + .a15 = ¡¿Le importara al más honorable de los cultistas algo de MUERTE?! + .a16 = ¡Prohibido perdonar! ¡Prohibido olvidar! ¡Cultista, lo lamentaras! + .a17 = ¡Muere, cultista! + .a18 = ¡Tu reino de terror llegara a su fin! + .a19 = ¡Esto es por todo lo que has hecho! + .a20 = No somos amables con los de tu tipo por aquí. + .a21 = ¡Debiste haberte quedado bajo tierra! +npc-speech-villager_under_attack = + .a0 = Ayuda, ¡Me están atacando! + .a1 = ¡Ayuda! ¡Me están atacando! + .a2 = ¡Auch! ¡Me están atacando! + .a3 = ¡Auch! ¡Me están atacando! ¡Ayuda! + .a4 = ¡Ayudenme! ¡Me están atacando! + .a5 = ¡Me están atacando! ¡Ayuda! + .a6 = ¡Me están atacando! ¡Ayudenme! + .a7 = ¡Ayuda! + .a8 = ¡Ayuda! ¡Ayuda! + .a9 = ¡Ayuda! ¡Ayuda! ¡Ayuda! + .a10 = ¡Me están atacando! + .a11 = ¡AAAHH! ¡Me están atacando! + .a12 = ¡AAAHH! ¡Me están atacando! ¡Ayuda! + .a13 = ¡Ayuda! ¡Nos están atacando! + .a14 = ¡Ayuda! ¡Asesino! + .a15 = ¡Ayuda! ¡Hay un asesino suelto! + .a16 = ¡Ayuda! ¡Están intentando matarme! + .a17 = ¡Guardias, me están atacando! + .a18 = ¡Guardias! ¡Me están atacando! + .a19 = ¡Me están atacando! ¡Guardias! + .a20 = ¡Ayuda! ¡Guardias! ¡Me están atacando! + .a21 = ¡Guardias! ¡Vengan rapido! + .a22 = ¡Guardias, Guardias! + .a23 = ¡Guardias! ¡Me esta atacando un villano! + .a24 = ¡Guardias, eliminen a este desagradable villano! + .a25 = ¡Guardias! ¡Hay un asesino! + .a26 = ¡Guardias! ¡Ayúdenme! + .a27 = ¡No te saldrás con la tuya! ¡Guardias! + .a28 = ¡Eres despreciable! + .a29 = ¡Ayúdenme! + .a30 = ¡Ayuda! ¡Por favor! + .a31 = ¡Auch! ¡Guardias! ¡Ayuda! + .a32 = ¡Vienen por mi! + .a33 = ¡Ayuda! ¡Ayuda! Estoy siendo atacado + .a34 = Ah, se nota que la violencia es parte del sistema. + .a35 = ¡Esto no es más que un rasguño! + .a36 = ¡Deja de hacer eso! + .a37 = ¿Qué te he hecho? + .a38 = ¡Por favor, para de atacarme! + .a39 = ¡Hey! Mira hacia adonde apuntas con esa cosa + .a40 = ¡Desgraciado, vete de aqui! + .a41 = ¡Para ya! ¡Vete! + .a42 = ¡Me estas haciendo enojar! + .a43 = ¡Hey! ¿Quién te piensas que eres? + .a44 = ¡Te arrancaré la cabeza por eso! + .a45 = ¡Detente, por favor! ¡No llevo nada de valor! + .a46 = Te voy a mandar a mi hermano, ¡el es más grande que yo! + .a47 = Nooo, ¡le contaré a mi madre! + .a48 = ¡Maldito seas! + .a49 = Por favor no lo hagas. + .a50 = ¡Eso no fue agradable! + .a51 = ¡Tu arma funciona, ahora aléjala! + .a52 = Si claro... + .a53 = Por favor, ¡tengo familia! + .a54 = ¡Soy demasiado joven para morir! + .a55 = ¿Podemos hablar sobre esto? + .a56 = ¡La violencia no resuelve nada! + .a57 = Este día se esta convirtiendo en uno muy feo... + .a58 = ¡Hey, eso dolió! + .a59 = ¡Ayy! + .a60 = ¡Qué violento! + .a61 = ¡Detente, te lo suplico! + .a62 = ¡Ojalá te enfermes! + .a63 = Esto no es divertido. + .a64 = ¡¿Cómo te atreves?! + .a65 = ¡Vas a pagar por eso! + .a66 = ¡Sigue con eso y lo lamentarás! + .a67 = ¡No hagas que te lastime! + .a68 = ¡Tiene que ser un malentendido! + .a69 = ¡No necesitas hacer esto! + .a70 = ¡Vete, demonio! + .a71 = ¡Eso realmente dolió! + .a72 = ¿Por qué harias eso? + .a73 = ¡Por todos los Santos, para! + .a74 = ¡Me habrás confundido con alguien más! + .a75 = ¡No me merezco esto! + .a76 = Por favor, no lo hagas de nuevo + .a77 = Guardias, tiren este monstruo al lago + .a78 = ¡Invocaré mis demonios en ti! + .a79 = ¿Por qué a miiii? +npc-speech-villager_enemy_killed = + .a0 = ¡He destruido a mi enemigo! + .a1 = ¡Finalmente en paz! + .a2 = ... ¿En que estaba? +npc-speech-menacing = + .a0 = ¡Te estoy advirtiendo! + .a1 = ¡Acercate y atacare! + .a2 = ¡No me asustas! + .a3 = ¡Vete de aquí! + .a4 = ¡Da la vuelta si quieres vivir! + .a5 = ¡No eres bienvenido aquí! +npc-speech-cultist_low_health_fleeing = + .a0 = ¡Retirada por la causa! + .a1 = ¡Retirada! + .a2 = ¡Maldito Seas! + .a3 = ¡Te maldeciré en el más allá! + .a4 = ¡Debo descansar! + .a5 = ¡Son demasiado fuertes! \ No newline at end of file diff --git a/assets/voxygen/i18n/es_LA/npc.ron b/assets/voxygen/i18n/es_LA/npc.ron deleted file mode 100644 index 9fbcea6043..0000000000 --- a/assets/voxygen/i18n/es_LA/npc.ron +++ /dev/null @@ -1,198 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "latinoamericano" Latin-American -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "¿No es un hermoso día?", - "¿Como estás?", - "¡Muy buenos días!", - "Me gustaria saber que piensa un Catoblepas cuando come cesped.", - "¿Qué piensas sobre este clima?", - "Pensar en esas mazmorras me da miedo. Espero que alguien las limpie.", - "Me gustaria explorar una cueva cuando sea más fuerte.", - "¿Has visto a mi gato?", - "¿Alguna vez escuchaste sobre la ferocidad de los Tiburones de Tierra? Yo escuche que viven en el desierto.", - "Dicen que se encuentran gemas brillantes de todo tipo en las cuevas.", - "Estoy loco por este queso!", - "¿No vas a entrar? ¡Justo estabamos por comer algo de queso!", - "Se dice que los hongos son buenos para tu salud. Nunca los probe.", - "¡No te olvides las galletas!", - "Simplemente adoro el queso de enanos. Ojala pudiera hacerlo.", - "Me pregunto que habra del otro lado de las montañas.", - "Espero poder hacer mi propio planeador algún día.", - "¿Te gustaria ver mi jardín? Bien, tal vez en otro momento.", - "¡Que lindo día para dar un paseo por el bosque!", - "¿Ser o no ser? Creo que sere un granjero.", - "¿No crees que nuestra aldea es la mejor?", - "¿Qué supones que hace brillar a los Restos Brillantes (Glowing Remains)?", - "¡Pienso que es hora para un segundo desayuno!", - "¿Has alguna vez capturado a una libelula?", - "No puedo entender de donde esos Sauroks siguen viniendo.", - "Desearia que alguien mantuviera los lobos alejados de la aldea.", - "Anoche tuve un maravilloso sueño sobre queso. ¿Qué significa?", - "Dejé algo de queso a mi hermano. Ahora no se si existe o no. Lo llamo el queso de Schrödinger.", - "Dejé algo de queso a mi hermana. Ahora no se si existe o no. Lo llamo el queso de Schrödinger.", - "Alguien deberia de hacer algo con esos cultistas. De preferencia yo no.", - "Espero que llueva pronto. Sería bueno para la cosecha.", - "¡Me encanta la miel! Y odio las abejas.", - "Quiero ver el mundo algún día. Tiene que haber más por vivir que lo que ofrece esta aldea.", - ], - "npc.speech.villager_decline_trade": [ - "Lo siento, no tengo nada para intercambiar.", - "¿Quieres intercambiar? Como si tuviera algo que te interesara.", - "Mi casa is mia, no quiero intercambiarla por nada.", - ], - "npc.speech.merchant_advertisement": [ - "¿Puedo ofrecerte algo que te interese para intercambiar?", - "¿Quieres intercambiar conmigo?", - "Tengo muchos bienes, ¿Quieres echar un vistazo?" - ], - "npc.speech.merchant_busy": [ - "Hey, espera tu turno.", - "Espere por favor, soy sólo una persona.", - "¿Ves a la otra persona en frente tuyo?", - "Un momento, déjame terminar.", - "No saltarse la cola.", - "Estoy ocupado, vuelva más tarde." - ], - "npc.speech.merchant_trade_successful": [ - "¡Gracias por comerciar conmigo!", - "¡Gracias!", - ], - "npc.speech.merchant_trade_declined": [ - "Quizas en otro momento, ¡tenga un buen día!", - "Que mal, ¡tal vez la proxima!" - ], - "npc.speech.villager_cultist_alarm": [ - "¡Cuidado! ¡Hay un cultista suelto!", - "¡A las armas! ¡Los cultistas nos atacan!", - "¡Como se atreven los cultistas a atacar nuestra aldea!", - "¡Muerte a los cultistas!", - "¡Aquí no toleramos a los cultistas!", - "¡Cultista asesino!", - "¡Saborea el filo de mi espada, sucio cultista!", - "¡Nada puede limpiar la sangre de tus manos, cultista!", - "¡Maldición! ¡Un cultista entre nosotros!", - "¡Los males de estos cultistas estan por acabarse!", - "¡Este cultista es mío!", - "¡Preparate para conocer a tu creador, estupido cultista!", - "¡Veo a un cultista! ¡Atrapenlo!", - "¡Veo a un cultista! ¡Ataquen!", - "¡Veo a un cultista! ¡No dejen que escape!", - "¡¿Le importara al más honorable de los cultistas algo de MUERTE?!", - "¡Prohibido perdonar! ¡Prohibido olvidar! ¡Cultista, lo lamentaras!", - "¡Muere, cultista!", - "¡Tu reino de terror llegara a su fin!", - "¡Esto es por todo lo que has hecho!", - "No somos amables con los de tu tipo por aquí.", - "¡Debiste haberte quedado bajo tierra!", - ], - "npc.speech.villager_under_attack": [ - "Ayuda, ¡Me están atacando!", - "¡Ayuda! ¡Me están atacando!", - "¡Auch! ¡Me están atacando!", - "¡Auch! ¡Me están atacando! ¡Ayuda!", - "¡Ayudenme! ¡Me están atacando!", - "¡Me están atacando! ¡Ayuda!", - "¡Me están atacando! ¡Ayudenme!", - "¡Ayuda!", - "¡Ayuda! ¡Ayuda!", - "¡Ayuda! ¡Ayuda! ¡Ayuda!", - "¡Me están atacando!", - "¡AAAHH! ¡Me están atacando!", - "¡AAAHH! ¡Me están atacando! ¡Ayuda!", - "¡Ayuda! ¡Nos están atacando!", - "¡Ayuda! ¡Asesino!", - "¡Ayuda! ¡Hay un asesino suelto!", - "¡Ayuda! ¡Están intentando matarme!", - "¡Guardias, me están atacando!", - "¡Guardias! ¡Me están atacando!", - "¡Me están atacando! ¡Guardias!", - "¡Ayuda! ¡Guardias! ¡Me están atacando!", - "¡Guardias! ¡Vengan rapido!", - "¡Guardias, Guardias!", - "¡Guardias! ¡Me esta atacando un villano!", - "¡Guardias, eliminen a este desagradable villano!", - "¡Guardias! ¡Hay un asesino!", - "¡Guardias! ¡Ayúdenme!", - "¡No te saldrás con la tuya! ¡Guardias!", - "¡Eres despreciable!", - "¡Ayúdenme!", - "¡Ayuda! ¡Por favor!", - "¡Auch! ¡Guardias! ¡Ayuda!", - "¡Vienen por mi!", - "¡Ayuda! ¡Ayuda! Estoy siendo atacado", - "Ah, se nota que la violencia es parte del sistema.", - "¡Esto no es más que un rasguño!", - "¡Deja de hacer eso!", - "¿Qué te he hecho?", - "¡Por favor, para de atacarme!", - "¡Hey! Mira hacia adonde apuntas con esa cosa", - "¡Desgraciado, vete de aqui!", - "¡Para ya! ¡Vete!", - "¡Me estas haciendo enojar!", - "¡Hey! ¿Quién te piensas que eres?", - "¡Te arrancaré la cabeza por eso!", - "¡Detente, por favor! ¡No llevo nada de valor!", - "Te voy a mandar a mi hermano, ¡el es más grande que yo!", - "Nooo, ¡le contaré a mi madre!", - "¡Maldito seas!", - "Por favor no lo hagas.", - "¡Eso no fue agradable!", - "¡Tu arma funciona, ahora aléjala!", - "Si claro...", - "Por favor, ¡tengo familia!", - "¡Soy demasiado joven para morir!", - "¿Podemos hablar sobre esto?", - "¡La violencia no resuelve nada!", - "Este día se esta convirtiendo en uno muy feo...", - "¡Hey, eso dolió!", - "¡Ayy!", - "¡Qué violento!", - "¡Detente, te lo suplico!", - "¡Ojalá te enfermes!", - "Esto no es divertido.", - "¡¿Cómo te atreves?!", - "¡Vas a pagar por eso!", - "¡Sigue con eso y lo lamentarás!", - "¡No hagas que te lastime!", - "¡Tiene que ser un malentendido!", - "¡No necesitas hacer esto!", - "¡Vete, demonio!", - "¡Eso realmente dolió!", - "¿Por qué harias eso?", - "¡Por todos los Santos, para!", - "¡Me habrás confundido con alguien más!", - "¡No me merezco esto!", - "Por favor, no lo hagas de nuevo", - "Guardias, tiren este monstruo al lago", - "¡Invocaré mis demonios en ti!", - "¿Por qué a miiii?", - ], - "npc.speech.villager_enemy_killed": [ - "¡He destruido a mi enemigo!", - "¡Finalmente en paz!", - "... ¿En que estaba?", - ], - "npc.speech.menacing": [ - "¡Te estoy advirtiendo!", - "¡Acercate y atacare!", - "¡No me asustas!", - "¡Vete de aquí!", - "¡Da la vuelta si quieres vivir!", - "¡No eres bienvenido aquí!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "¡Retirada por la causa!", - "¡Retirada!", - "¡Maldito Seas!", - "¡Te maldeciré en el más allá!", - "¡Debo descansar!", - "¡Son demasiado fuertes!", - ] - } -) diff --git a/assets/voxygen/i18n/eu/buff.ftl b/assets/voxygen/i18n/eu/buff.ftl new file mode 100644 index 0000000000..6a9de08c7a --- /dev/null +++ b/assets/voxygen/i18n/eu/buff.ftl @@ -0,0 +1,32 @@ +buff-remove = Egin klik kentzeko +buff-title-missing = Izenburua falta da +buff-desc-missing = Deskribapena falta da +buff-title-heal = Sendatu +buff-desc-heal = Berreskuratu osasuna pixkanaka +buff-title-potion = Edabea +buff-desc-potion = Edaten... +buff-title-saturation = Asetasuna +buff-title-campfire_heal = Sutondoan sendatzea +buff-desc-campfire_heal = Sutondoan atseden hartuta osasunaren %{ $rate } berreskuratuko duzu segundoro. +buff-title-invulnerability = Erasoezina +buff-desc-invulnerability = Ezin zaurituzkoa zara edozein erasoren aurrean. +buff-title-protectingward = Babes eremua +buff-desc-protectingward = Erasoengandik babestuta zaude nolabait. +buff-title-bleed = Odoletan +buff-desc-bleed = Pixkanaka osasuna galduko duzu. +buff-title-cursed = Sorginduta +buff-desc-cursed = Sorgindu zaituzte. +buff-title-burn = Sutan +buff-desc-burn = Erretzen ari zara +buff-title-frozen = Izoztuta +buff-desc-frozen = Zure mugimendu eta erasoak moteldu dira. +buff-title-wet = Bustita +buff-desc-wet = Kontuz ibili beharko zara ez irristatzeko. +buff-title-ensnared = Harrapatuta +buff-desc-ensnared = Landareek zure oinak harrapatu dituzte mugitzea oztopatuz. +buff-stat-health = { $str_total } osasun puntu ematen ditu +buff-stat-increase_max_energy = Gehieneko energia { $strength } puntu igotzen du +buff-stat-increase_max_health = Gehieneko osasuna { $strength } puntu igotzen du +buff-stat-invulnerability = Hilezkortasuna ematen du +buff-text-over_seconds = { $dur_secs } segundotan +buff-text-for_seconds = { $dur_secs } segundoz \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/buff.ron b/assets/voxygen/i18n/eu/buff.ron deleted file mode 100644 index 168105a17b..0000000000 --- a/assets/voxygen/i18n/eu/buff.ron +++ /dev/null @@ -1,47 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - // Buffs - "buff.remove": "Egin klik kentzeko", - "buff.title.missing": "Izenburua falta da", - "buff.desc.missing": "Deskribapena falta da", - "buff.title.heal": "Sendatu", - "buff.desc.heal": "Berreskuratu osasuna pixkanaka", - "buff.title.potion": "Edabea", - "buff.desc.potion": "Edaten...", - "buff.title.saturation": "Asetasuna", - "buff.title.campfire_heal": "Sutondoan sendatzea", - "buff.desc.campfire_heal": "Sutondoan atseden hartuta osasunaren %{rate} berreskuratuko duzu segundoro.", - "buff.title.invulnerability": "Erasoezina", - "buff.desc.invulnerability": "Ezin zaurituzkoa zara edozein erasoren aurrean.", - "buff.title.protectingward": "Babes eremua", - "buff.desc.protectingward": "Erasoengandik babestuta zaude nolabait.", - // Debuffs - "buff.title.bleed": "Odoletan", - "buff.desc.bleed": "Pixkanaka osasuna galduko duzu.", - "buff.title.cursed": "Sorginduta", - "buff.desc.cursed": "Sorgindu zaituzte.", - "buff.title.burn": "Sutan", - "buff.desc.burn": "Erretzen ari zara", - "buff.title.frozen": "Izoztuta", - "buff.desc.frozen": "Zure mugimendu eta erasoak moteldu dira.", - "buff.title.wet": "Bustita", - "buff.desc.wet": "Kontuz ibili beharko zara ez irristatzeko.", - "buff.title.ensnared": "Harrapatuta", - "buff.desc.ensnared": "Landareek zure oinak harrapatu dituzte mugitzea oztopatuz.", - // Buffs stats - "buff.stat.health": "{str_total} osasun puntu ematen ditu", - "buff.stat.increase_max_energy": "Gehieneko energia {strength} puntu igotzen du", - "buff.stat.increase_max_health": "Gehieneko osasuna {strength} puntu igotzen du", - "buff.stat.invulnerability": "Hilezkortasuna ematen du", - // Text - "buff.text.over_seconds": "{dur_secs} segundotan", - "buff.text.for_seconds": "{dur_secs} segundoz", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/char_selection.ftl b/assets/voxygen/i18n/eu/char_selection.ftl new file mode 100644 index 0000000000..38c7b285ca --- /dev/null +++ b/assets/voxygen/i18n/eu/char_selection.ftl @@ -0,0 +1,21 @@ +char_selection-loading_characters = Pertsonaiak kargatzen... +char_selection-delete_permanently = Pertsonaia hau betiko ezabatu nahi duzu? +char_selection-deleting_character = Pertsonaia ezabatzen... +char_selection-change_server = Aldatu zerbitzaria +char_selection-enter_world = Sartu munduan +char_selection-logout = Itxi saioa +char_selection-create_new_character = Sortu pertsonaia berria +char_selection-creating_character = Pertsonaia sortzen... +char_selection-character_creation = Pertsonaia sortzea +char_selection-human_default = Gizakia lehenetsita +char_selection-level_fmt = { $level_nb }. maila +char_selection-uncanny_valley = Basoa +char_selection-beard = Bizarra +char_selection-hair_style = Ilearen itxura +char_selection-hair_color = Ilearen kolorea +char_selection-eye_color = Begien kolorea +char_selection-skin = Azala +char_selection-eyeshape = Begien itxura +char_selection-accessories = Osagarriak +char_selection-create_info_name = Pertsonaiak izena behar du! +char_selection-version_mismatch = ADI! Zerbitzariaren bertsioa ez dator bat instalatuta duzunarekin. Baliteke bertsioak bateragarriak ez izatea. Jokoa eguneratu beharko zenuke. \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/char_selection.ron b/assets/voxygen/i18n/eu/char_selection.ron deleted file mode 100644 index 63b9214914..0000000000 --- a/assets/voxygen/i18n/eu/char_selection.ron +++ /dev/null @@ -1,31 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "char_selection.loading_characters": "Pertsonaiak kargatzen...", - "char_selection.delete_permanently": "Pertsonaia hau betiko ezabatu nahi duzu?", - "char_selection.deleting_character": "Pertsonaia ezabatzen...", - "char_selection.change_server": "Aldatu zerbitzaria", - "char_selection.enter_world": "Sartu munduan", - "char_selection.logout": "Itxi saioa", - "char_selection.create_new_character": "Sortu pertsonaia berria", - "char_selection.creating_character": "Pertsonaia sortzen...", - "char_selection.character_creation": "Pertsonaia sortzea", - "char_selection.human_default": "Gizakia lehenetsita", - "char_selection.level_fmt": "{level_nb}. maila", - "char_selection.uncanny_valley": "Basoa", - "char_selection.beard": "Bizarra", - "char_selection.hair_style": "Ilearen itxura", - "char_selection.hair_color": "Ilearen kolorea", - "char_selection.eye_color": "Begien kolorea", - "char_selection.skin": "Azala", - "char_selection.eyeshape": "Begien itxura", - "char_selection.accessories": "Osagarriak", - "char_selection.create_info_name": "Pertsonaiak izena behar du!", - "char_selection.version_mismatch": "ADI! Zerbitzariaren bertsioa ez dator bat instalatuta duzunarekin. Baliteke bertsioak bateragarriak ez izatea. Jokoa eguneratu beharko zenuke.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/common.ftl b/assets/voxygen/i18n/eu/common.ftl new file mode 100644 index 0000000000..a281eec773 --- /dev/null +++ b/assets/voxygen/i18n/eu/common.ftl @@ -0,0 +1,87 @@ +common-username = erabiltzaile izena +common-singleplayer = Jokalari bakarra +common-multiplayer = Multijokalaria +common-servers = Zerbitzariak +common-quit = Irten +common-settings = Ezarpenak +common-languages = Hizkuntzak +common-interface = Interfazea +common-gameplay = Gameplay +common-controls = Kontrolak +common-video = Grafikoak +common-sound = Soinua +common-chat = Txata +common-resume = Jarraitu +common-characters = Pertsonaiak +common-close = Itxi +common-yes = Bai +common-no = Ez +common-back = Atzera +common-create = Sortu +common-okay = Ados +common-add = Gehitu +common-accept = Onartu +common-decline = Utzi +common-disclaimer = Ezespena +common-cancel = Ezeztatu +common-none = Bat ere ez +common-error = Errorea +common-fatal_error = Errore larria +common-you = Zu +common-automatic = Automatikoa +common-random = Ausazkoa +common-empty = Hutsik +common-interface_settings = Interfazearen ezarpenak +common-gameplay_settings = Gameplay ezarpenak +common-controls_settings = Kontrolen ezarpenak +common-video_settings = Grafikoen ezarpenak +common-sound_settings = Soinuaren ezarpenak +common-language_settings = Hizkuntzaren ezarpenak +common-chat_settings = Txataren ezarpenak +common-connection_lost = + Konexioa galdu duzu! + Zerbitzaria berrabiarazi da? + Jokoa eguneratuta duzu? +common-species-orc = Ogroa +common-species-human = Gizakia +common-species-dwarf = Dwarf +common-species-elf = Elfoa +common-species-draugr = Ez-hila +common-species-danari = Danari +common-weapons-axe = Aizkora +common-weapons-sword = Ezpata +common-weapons-bow = Arkua +common-weapons-hammer = Mailua +common-weapons-shield = Ezkutua +common-weapons-spear = Lantza +common-weapons-hammer_simple = Oinarrizko mailua +common-weapons-sword_simple = Oinarrizko ezpata +common-weapons-staff_simple = Oinarrizko tramankulua +common-weapons-axe_simple = Oinarrizko aizkora +common-weapons-bow_simple = Oinarrizko arkua +common-weapons-unique = Esklusiboa +common-tool-debug = Debug +common-tool-faming = Nekazaritzako tresna +common-tool-pick = Pikotxa +common-tool-mining = Meatzaritza +common-kind-modular_component = Modular Component +common-kind-glider = Planeagailua +common-kind-consumable = Kontsumigarria +common-kind-throwable = Jaurti daiteke +common-kind-utility = Tresna +common-kind-ingredient = Osagaia +common-kind-lantern = Argiontzia +common-rand_appearance = Ausazko itxura +common-rand_name = Ausazko izena +common-stats-combat_rating = BP +common-stats-power = Ahalmena +common-stats-speed = Abiadura +common-stats-poise = Pozoia +common-stats-armor = Armadura +common-stats-energy_max = Gehienezko energia +common-stats-energy_reward = Energia saria +common-material-metal = Metala +common-material-wood = Egurra +common-material-stone = Harria +common-material-cloth = Oihala +common-material-hide = Larrua \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/common.ron b/assets/voxygen/i18n/eu/common.ron deleted file mode 100644 index 51a0c2dd4f..0000000000 --- a/assets/voxygen/i18n/eu/common.ron +++ /dev/null @@ -1,108 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "erabiltzaile izena", - "common.singleplayer": "Jokalari bakarra", - "common.multiplayer": "Multijokalaria", - "common.servers": "Zerbitzariak", - "common.quit": "Irten", - "common.settings": "Ezarpenak", - "common.languages": "Hizkuntzak", - "common.interface": "Interfazea", - "common.gameplay": "Gameplay", - "common.controls": "Kontrolak", - "common.video": "Grafikoak", - "common.sound": "Soinua", - "common.chat": "Txata", - "common.resume": "Jarraitu", - "common.characters": "Pertsonaiak", - "common.close": "Itxi", - "common.yes": "Bai", - "common.no": "Ez", - "common.back": "Atzera", - "common.create": "Sortu", - "common.okay": "Ados", - "common.add": "Gehitu", - "common.accept": "Onartu", - "common.decline": "Utzi", - "common.disclaimer": "Ezespena", - "common.cancel": "Ezeztatu", - "common.none": "Bat ere ez", - "common.error": "Errorea", - "common.fatal_error": "Errore larria", - "common.you": "Zu", - "common.automatic": "Automatikoa", - "common.random": "Ausazkoa", - "common.empty": "Hutsik", - - // Settings Window title - "common.interface_settings": "Interfazearen ezarpenak", - "common.gameplay_settings": "Gameplay ezarpenak", - "common.controls_settings": "Kontrolen ezarpenak", - "common.video_settings": "Grafikoen ezarpenak", - "common.sound_settings": "Soinuaren ezarpenak", - "common.language_settings": "Hizkuntzaren ezarpenak", - "common.chat_settings": "Txataren ezarpenak", - - // Message when connection to the server is lost - "common.connection_lost": r#"Konexioa galdu duzu! -Zerbitzaria berrabiarazi da? -Jokoa eguneratuta duzu?"#, - - - "common.species.orc": "Ogroa", - "common.species.human": "Gizakia", - "common.species.dwarf": "Dwarf", - "common.species.elf": "Elfoa", - "common.species.draugr": "Ez-hila", - "common.species.danari": "Danari", - - "common.weapons.axe": "Aizkora", - "common.weapons.sword": "Ezpata", - "common.weapons.bow": "Arkua", - "common.weapons.hammer": "Mailua", - "common.weapons.shield": "Ezkutua", - "common.weapons.spear": "Lantza", - "common.weapons.hammer_simple": "Oinarrizko mailua", - "common.weapons.sword_simple": "Oinarrizko ezpata", - "common.weapons.staff_simple": "Oinarrizko tramankulua", - "common.weapons.axe_simple": "Oinarrizko aizkora", - "common.weapons.bow_simple": "Oinarrizko arkua", - "common.weapons.unique": "Esklusiboa", - "common.tool.debug": "Debug", - "common.tool.faming": "Nekazaritzako tresna", - "common.tool.pick": "Pikotxa", - "common.tool.mining": "Meatzaritza", - "common.kind.modular_component": "Modular Component", - "common.kind.glider": "Planeagailua", - "common.kind.consumable": "Kontsumigarria", - "common.kind.throwable": "Jaurti daiteke", - "common.kind.utility": "Tresna", - "common.kind.ingredient": "Osagaia", - "common.kind.lantern": "Argiontzia", - - "common.rand_appearance": "Ausazko itxura", - "common.rand_name": "Ausazko izena", - - "common.stats.combat_rating": "BP", - "common.stats.power": "Ahalmena", - "common.stats.speed": "Abiadura", - "common.stats.poise": "Pozoia", - "common.stats.armor": "Armadura", - "common.stats.energy_max": "Gehienezko energia", - "common.stats.energy_reward": "Energia saria", - - "common.material.metal": "Metala", - "common.material.wood": "Egurra", - "common.material.stone": "Harria", - "common.material.cloth": "Oihala", - "common.material.hide": "Larrua", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/esc_menu.ftl b/assets/voxygen/i18n/eu/esc_menu.ftl new file mode 100644 index 0000000000..b0ccc211c1 --- /dev/null +++ b/assets/voxygen/i18n/eu/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Itxi saioa +esc_menu-quit_game = Itxi jokoa \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/esc_menu.ron b/assets/voxygen/i18n/eu/esc_menu.ron deleted file mode 100644 index 818c181df1..0000000000 --- a/assets/voxygen/i18n/eu/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "esc_menu.logout": "Itxi saioa", - "esc_menu.quit_game": "Itxi jokoa", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/gameinput.ftl b/assets/voxygen/i18n/eu/gameinput.ftl new file mode 100644 index 0000000000..3f811013a1 --- /dev/null +++ b/assets/voxygen/i18n/eu/gameinput.ftl @@ -0,0 +1,43 @@ +gameinput-primary = Eraso nagusia +gameinput-secondary = Bigarren erasoa +gameinput-block = Blokeatu +gameinput-moveforward = Mugitu aurrera +gameinput-moveleft = Mugitu ezkerretara +gameinput-moveright = Mugitu eskuinetara +gameinput-moveback = Mugitu atzera +gameinput-jump = Salto +gameinput-glide = Planeagailua +gameinput-roll = Itzulipurdia +gameinput-climb = Eskalatu +gameinput-climbdown = Eskalatu behera +gameinput-togglelantern = Argiontzia +gameinput-mount = Igo +gameinput-chat = Txata +gameinput-command = Agindua +gameinput-escape = Ihes egin +gameinput-map = Mapa +gameinput-bag = Zorroa +gameinput-trade = Trukaketa +gameinput-social = Soziala +gameinput-sit = Eseri +gameinput-spellbook = Sorginkeria liburua +gameinput-settings = Ezarpenak +gameinput-respawn = Birsortu +gameinput-charge = Kargatu +gameinput-togglewield = Arma +gameinput-interact = Elkarreragin +gameinput-autowalk = Automatikoki oinez ibili/igeri egin +gameinput-cameraclamp = Camera Clamp +gameinput-dance = Dantzatu +gameinput-select = Aukeratu entitatea +gameinput-acceptgroupinvite = Onartu talde gonbidapena +gameinput-declinegroupinvite = Ukatu talde gonbidapena +gameinput-cyclecamera = Aldatu kamera +gameinput-crafting = Sortzen +gameinput-fly = Hegan egin +gameinput-sneak = Sneak +gameinput-swimdown = Igeri egin beherantz +gameinput-swimup = Igeri egin gorantz +gameinput-mapzoomin = Handiagotu mapa +gameinput-mapzoomout = Txikiagotu mapa +gameinput-greet = Agurtu \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/gameinput.ron b/assets/voxygen/i18n/eu/gameinput.ron deleted file mode 100644 index f9400d0d90..0000000000 --- a/assets/voxygen/i18n/eu/gameinput.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "gameinput.primary": "Eraso nagusia", - "gameinput.secondary": "Bigarren erasoa", - "gameinput.block": "Blokeatu", - "gameinput.moveforward": "Mugitu aurrera", - "gameinput.moveleft": "Mugitu ezkerretara", - "gameinput.moveright": "Mugitu eskuinetara", - "gameinput.moveback": "Mugitu atzera", - "gameinput.jump": "Salto", - "gameinput.glide": "Planeagailua", - "gameinput.roll": "Itzulipurdia", - "gameinput.climb": "Eskalatu", - "gameinput.climbdown": "Eskalatu behera", - "gameinput.togglelantern": "Argiontzia", - "gameinput.mount": "Igo", - "gameinput.chat": "Txata", - "gameinput.command": "Agindua", - "gameinput.escape": "Ihes egin", - "gameinput.map": "Mapa", - "gameinput.bag": "Zorroa", - "gameinput.trade": "Trukaketa", - "gameinput.social": "Soziala", - "gameinput.sit": "Eseri", - "gameinput.spellbook": "Sorginkeria liburua", - "gameinput.settings": "Ezarpenak", - "gameinput.respawn": "Birsortu", - "gameinput.charge": "Kargatu", - "gameinput.togglewield": "Arma", - "gameinput.interact": "Elkarreragin", - "gameinput.autowalk": "Automatikoki oinez ibili/igeri egin", - "gameinput.cameraclamp": "Camera Clamp", - "gameinput.dance": "Dantzatu", - "gameinput.select": "Aukeratu entitatea", - "gameinput.acceptgroupinvite": "Onartu talde gonbidapena", - "gameinput.declinegroupinvite": "Ukatu talde gonbidapena", - "gameinput.cyclecamera": "Aldatu kamera", - "gameinput.crafting": "Sortzen", - "gameinput.fly": "Hegan egin", - "gameinput.sneak": "Sneak", - "gameinput.swimdown": "Igeri egin beherantz", - "gameinput.swimup": "Igeri egin gorantz", - "gameinput.mapzoomin": "Handiagotu mapa", - "gameinput.mapzoomout": "Txikiagotu mapa", - "gameinput.greet": "Agurtu", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/bag.ftl b/assets/voxygen/i18n/eu/hud/bag.ftl new file mode 100644 index 0000000000..7777cf2112 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/bag.ftl @@ -0,0 +1,33 @@ +hud-bag-inventory = { $playername }(r)en inbentarioa +hud-bag-stats_title = { $playername }(r)en estatistikak +hud-bag-exp = Esp +hud-bag-armor = Armadura +hud-bag-stats = Estatistikak +hud-bag-head = Burua +hud-bag-neck = Lepoa +hud-bag-tabard = Tabard +hud-bag-shoulders = Sorbalda +hud-bag-chest = Bularra +hud-bag-hands = Eskuak +hud-bag-lantern = Argiontzia +hud-bag-glider = Planeagailua +hud-bag-belt = Gerrikoa +hud-bag-ring = Eraztuna +hud-bag-back = Bizkarra +hud-bag-legs = Hankak +hud-bag-feet = Oinak +hud-bag-mainhand = Esku nagusia +hud-bag-offhand = Bigarren eskua +hud-bag-swap_equipped_weapons_desc = Sakatu { $key } +hud-bag-bag = Zorroa +hud-bag-health = Osasuna +hud-bag-energy = Energia +hud-bag-combat_rating = Borroka maila +hud-bag-protection = Babesa +hud-bag-stun_res = Kolpeen aurkako indarra +hud-bag-combat_rating_desc = Ekipamendua eta osasunaren arabera kalkulatua +hud-bag-protection_desc = Armadurak emandako babesa. +hud-bag-stun_res_desc = Bata bestearen atzetik jasotako kolpeei aurre egiteko indarra. Energia bezala berreskuratzen da. +hud-bag-sort_by_name = Ordenatu izenaren arabera +hud-bag-sort_by_quality = Ordenatu kalitatearen arabera +hud-bag-sort_by_category = Ordenatu kategoriaren arabera \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/bag.ron b/assets/voxygen/i18n/eu/hud/bag.ron deleted file mode 100644 index 2e23c1386a..0000000000 --- a/assets/voxygen/i18n/eu/hud/bag.ron +++ /dev/null @@ -1,45 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}(r)en inbentarioa", - "hud.bag.stats_title": "{playername}(r)en estatistikak", - "hud.bag.exp": "Esp", - "hud.bag.armor": "Armadura", - "hud.bag.stats": "Estatistikak", - "hud.bag.head": "Burua", - "hud.bag.neck": "Lepoa", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Sorbalda", - "hud.bag.chest": "Bularra", - "hud.bag.hands": "Eskuak", - "hud.bag.lantern": "Argiontzia", - "hud.bag.glider": "Planeagailua", - "hud.bag.belt": "Gerrikoa", - "hud.bag.ring": "Eraztuna", - "hud.bag.back": "Bizkarra", - "hud.bag.legs": "Hankak", - "hud.bag.feet": "Oinak", - "hud.bag.mainhand": "Esku nagusia", - "hud.bag.offhand": "Bigarren eskua", - "hud.bag.swap_equipped_weapons_desc": "Sakatu {key}", - "hud.bag.bag": "Zorroa", - "hud.bag.health": "Osasuna", - "hud.bag.energy": "Energia", - "hud.bag.combat_rating": "Borroka maila", - "hud.bag.protection": "Babesa", - "hud.bag.stun_res": "Kolpeen aurkako indarra", - "hud.bag.combat_rating_desc": "Ekipamendua eta osasunaren arabera kalkulatua", - "hud.bag.protection_desc": "Armadurak emandako babesa.", - "hud.bag.stun_res_desc": "Bata bestearen atzetik jasotako kolpeei aurre egiteko indarra. Energia bezala berreskuratzen da.", - "hud.bag.sort_by_name": "Ordenatu izenaren arabera", - "hud.bag.sort_by_quality": "Ordenatu kalitatearen arabera", - "hud.bag.sort_by_category": "Ordenatu kategoriaren arabera", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/char_window.ftl b/assets/voxygen/i18n/eu/hud/char_window.ftl new file mode 100644 index 0000000000..8a324d0fba --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/char_window.ftl @@ -0,0 +1 @@ +character_window-character_name = Pertsonaiaren izena \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/char_window.ron b/assets/voxygen/i18n/eu/hud/char_window.ron deleted file mode 100644 index 332cc3af07..0000000000 --- a/assets/voxygen/i18n/eu/hud/char_window.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "character_window.character_name": "Pertsonaiaren izena" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/chat.ftl b/assets/voxygen/i18n/eu/hud/chat.ftl new file mode 100644 index 0000000000..3b2d51bdc6 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Denak +hud-chat-chat_tab_hover_tooltip = Egin klik eskuineko botoiarekin ezarpenak irekitzeko. +hud-outcome-burning = kiskalita hil da +hud-outcome-curse = sorginduta hil da +hud-outcome-bleeding = odolustuta hil da +hud-outcome-crippled = died of: crippled +hud-outcome-frozen = izoztuta hil da +hud-chat-online_msg = [{ $name }] sartu da +hud-chat-offline_msg = [{ $name }] irten da +hud-chat-default_death_msg = [{ $name }] hil da +hud-chat-environmental_kill_msg = [{ $name }] { $environment }-(e)n hil da +hud-chat-fall_kill_msg = [{ $name }] altuera handi batetik erorita hil da +hud-chat-suicide_msg = [{ $name }]-(e)k bere buruaz beste egin du +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } [{ $attacker }]-(e)ren erruz +hud-chat-pvp_melee_kill_msg = [{ $attacker }](e)k [{ $victim }] garaitu du +hud-chat-pvp_ranged_kill_msg = [{ $attacker }](e)k [{ $victim }] tiroz hil du +hud-chat-pvp_explosion_kill_msg = [{ $attacker }](e)k [{ $victim }] leherrarazi du +hud-chat-pvp_energy_kill_msg = [{ $attacker }](e)k [{ $victim }] magiaz hil du +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } caused by { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker }-(e)k [{ $victim }] hil du +hud-chat-npc_ranged_kill_msg = { $attacker }-(e)k [{ $victim }] tiroz hil du +hud-chat-npc_explosion_kill_msg = { $attacker }-(e)k [{ $victim }] leherrarazi du +hud-chat-npc_energy_kill_msg = { $attacker }-(e)k [{ $victim }] magiaz hil du +hud-chat-npc_other_kill_msg = { $attacker }-(e)k [{ $victim }] hil du +hud-chat-loot_msg = [{ $item }] jaso duzu +hud-chat-loot_fail = Inbentarioa beteta duzu! +hud-chat-goodbye = Agur! +hud-chat-connection_lost = Konexioa galdu duzu. { $time } segundo barru kanporatua izango zara. \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/chat.ron b/assets/voxygen/i18n/eu/hud/chat.ron deleted file mode 100644 index 07fe8dbce4..0000000000 --- a/assets/voxygen/i18n/eu/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "hud.chat.all": "Denak", - "hud.chat.chat_tab_hover_tooltip": "Egin klik eskuineko botoiarekin ezarpenak irekitzeko.", - - // Debuff outcomes - "hud.outcome.burning": "kiskalita hil da", - "hud.outcome.curse": "sorginduta hil da", - "hud.outcome.bleeding": "odolustuta hil da", - "hud.outcome.crippled": "died of: crippled", - "hud.outcome.frozen": "izoztuta hil da", - - // Chat outputs - "hud.chat.online_msg": "[{name}] sartu da", - "hud.chat.offline_msg": "[{name}] irten da", - - "hud.chat.default_death_msg": "[{name}] hil da", - "hud.chat.environmental_kill_msg": "[{name}] {environment}-(e)n hil da", - "hud.chat.fall_kill_msg": "[{name}] altuera handi batetik erorita hil da", - "hud.chat.suicide_msg": "[{name}]-(e)k bere buruaz beste egin du", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} [{attacker}]-(e)ren erruz", - "hud.chat.pvp_melee_kill_msg": "[{attacker}](e)k [{victim}] garaitu du", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}](e)k [{victim}] tiroz hil du", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}](e)k [{victim}] leherrarazi du", - "hud.chat.pvp_energy_kill_msg": "[{attacker}](e)k [{victim}] magiaz hil du", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} caused by {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker}-(e)k [{victim}] hil du", - "hud.chat.npc_ranged_kill_msg": "{attacker}-(e)k [{victim}] tiroz hil du", - "hud.chat.npc_explosion_kill_msg": "{attacker}-(e)k [{victim}] leherrarazi du", - "hud.chat.npc_energy_kill_msg": "{attacker}-(e)k [{victim}] magiaz hil du", - "hud.chat.npc_other_kill_msg": "{attacker}-(e)k [{victim}] hil du", - - "hud.chat.loot_msg": "[{item}] jaso duzu", - "hud.chat.loot_fail": "Inbentarioa beteta duzu!", - "hud.chat.goodbye": "Agur!", - "hud.chat.connection_lost": "Konexioa galdu duzu. {time} segundo barru kanporatua izango zara.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/crafting.ftl b/assets/voxygen/i18n/eu/hud/crafting.ftl new file mode 100644 index 0000000000..7674ba6204 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/crafting.ftl @@ -0,0 +1,25 @@ +hud-crafting = Artisautza +hud-crafting-recipes = Errezetak +hud-crafting-ingredients = Osagaiak: +hud-crafting-craft = Sortu +hud-crafting-tool_cata = Beharrezko tresneria: +hud-crafting-req_crafting_station = Beharrezko tresneria: +hud-crafting-anvil = Ingudea +hud-crafting-cauldron = Pertza +hud-crafting-cooking_pot = Kozinatzeko lapikoa +hud-crafting-crafting_bench = Lan mahaia +hud-crafting-forge = Burdinola +hud-crafting-loom = Ehungailua +hud-crafting-spinning_wheel = Gorua +hud-crafting-tanning_rack = Larrua lantzeko tresna +hud-crafting-tabs-all = Denak +hud-crafting-tabs-armor = Armadura +hud-crafting-tabs-dismantle = Desegin +hud-crafting-tabs-food = Janaria +hud-crafting-tabs-glider = Planeagailuak +hud-crafting-tabs-potion = Edabeak +hud-crafting-tabs-tool = Tresnak +hud-crafting-tabs-utility = Utilitateak +hud-crafting-tabs-weapon = Armak +hud-crafting-tabs-bag = Zorroak +hud-crafting-tabs-processed_material = Materialak \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/crafting.ron b/assets/voxygen/i18n/eu/hud/crafting.ron deleted file mode 100644 index bfd7b7e834..0000000000 --- a/assets/voxygen/i18n/eu/hud/crafting.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "hud.crafting": "Artisautza", - "hud.crafting.recipes": "Errezetak", - "hud.crafting.ingredients": "Osagaiak:", - "hud.crafting.craft": "Sortu", - "hud.crafting.tool_cata": "Beharrezko tresneria:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Beharrezko tresneria:", - "hud.crafting.anvil": "Ingudea", - "hud.crafting.cauldron": "Pertza", - "hud.crafting.cooking_pot": "Kozinatzeko lapikoa", - "hud.crafting.crafting_bench": "Lan mahaia", - "hud.crafting.forge": "Burdinola", - "hud.crafting.loom": "Ehungailua", - "hud.crafting.spinning_wheel": "Gorua", - "hud.crafting.tanning_rack": "Larrua lantzeko tresna", - // Tabs - "hud.crafting.tabs.all": "Denak", - "hud.crafting.tabs.armor": "Armadura", - "hud.crafting.tabs.dismantle": "Desegin", - "hud.crafting.tabs.food": "Janaria", - "hud.crafting.tabs.glider": "Planeagailuak", - "hud.crafting.tabs.potion": "Edabeak", - "hud.crafting.tabs.tool": "Tresnak", - "hud.crafting.tabs.utility": "Utilitateak", - "hud.crafting.tabs.weapon": "Armak", - "hud.crafting.tabs.bag": "Zorroak", - "hud.crafting.tabs.processed_material": "Materialak", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/group.ftl b/assets/voxygen/i18n/eu/hud/group.ftl new file mode 100644 index 0000000000..0a3ade54c2 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Taldea +hud-group-invite_to_join = [{ $name }](e)k taldera gonbidatu zaitu! +hud-group-invite_to_trade = [{ $name }](e)k zurekin zerbait trukatu nahi du!. +hud-group-invite = Gonbidatu +hud-group-kick = Kanporatu +hud-group-assign_leader = Aukeratu liderra +hud-group-leave = Utzi taldea +hud-group-dead = Hilda +hud-group-out_of_range = Irismen eremutik kanpo +hud-group-add_friend = Gehitu lagunen zerrendara +hud-group-link_group = Lotu taldeak +hud-group-in_menu = Menuan +hud-group-members = Taldeko kideak \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/group.ron b/assets/voxygen/i18n/eu/hud/group.ron deleted file mode 100644 index 56c03d50c5..0000000000 --- a/assets/voxygen/i18n/eu/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "hud.group": "Taldea", - "hud.group.invite_to_join": "[{name}](e)k taldera gonbidatu zaitu!", - "hud.group.invite_to_trade": "[{name}](e)k zurekin zerbait trukatu nahi du!.", - "hud.group.invite": "Gonbidatu", - "hud.group.kick": "Kanporatu", - "hud.group.assign_leader": "Aukeratu liderra", - "hud.group.leave": "Utzi taldea", - "hud.group.dead" : "Hilda", - "hud.group.out_of_range": "Irismen eremutik kanpo", - "hud.group.add_friend": "Gehitu lagunen zerrendara", - "hud.group.link_group": "Lotu taldeak", - "hud.group.in_menu": "Menuan", - "hud.group.members": "Taldeko kideak", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/map.ftl b/assets/voxygen/i18n/eu/hud/map.ftl new file mode 100644 index 0000000000..dbb3566ac0 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/map.ftl @@ -0,0 +1,31 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Erronkak +hud-map-topo_map = Topografikoa +hud-map-difficulty = Zailtasuna +hud-map-towns = Herriak +hud-map-castles = Gazteluak +hud-map-dungeons = Ziegak +hud-map-caves = Kobak +hud-map-cave = Koba +hud-map-peaks = Mendiak +hud-map-voxel_map = Voxel mapa +hud-map-trees = Zuhaitz erraldoiak +hud-map-tree = Zuhaitz erraldoia +hud-map-town = Herria +hud-map-castle = Gaztelua +hud-map-dungeon = Ziega +hud-map-difficulty_dungeon = + Ziega + + Zailtasuna: { $difficulty } +hud-map-drag = Arrastatu +hud-map-zoom = Zoom +hud-map-mid_click = Jarri markatzailea +hud-map-recenter = Zentratu +hud-map-marked_location = Markatutako kokalekua +hud-map-marked_location_remove = Egin klik kentzeko +hud-map-change_map_mode = Aldatu mapa mota +hud-map-toggle_minimap_voxel = Erakutsi edo ezkutatu minimapa +hud-map-zoom_minimap_explanation = + Handiagotu minimapa zure ingurua + hobeto ikusteko \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/map.ron b/assets/voxygen/i18n/eu/hud/map.ron deleted file mode 100644 index cbae15ac23..0000000000 --- a/assets/voxygen/i18n/eu/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Erronkak", - "hud.map.topo_map": "Topografikoa", - "hud.map.difficulty": "Zailtasuna", - "hud.map.towns": "Herriak", - "hud.map.castles": "Gazteluak", - "hud.map.dungeons": "Ziegak", - "hud.map.caves": "Kobak", - "hud.map.cave": "Koba", - "hud.map.peaks": "Mendiak", - "hud.map.voxel_map": "Voxel mapa", - "hud.map.trees": "Zuhaitz erraldoiak", - "hud.map.tree": "Zuhaitz erraldoia", - "hud.map.town": "Herria", - "hud.map.castle": "Gaztelua", - "hud.map.dungeon": "Ziega", - "hud.map.difficulty_dungeon": "Ziega\n\nZailtasuna: {difficulty}", - "hud.map.drag": "Arrastatu", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Jarri markatzailea", - "hud.map.recenter": "Zentratu", - "hud.map.marked_location": "Markatutako kokalekua", - "hud.map.marked_location_remove": "Egin klik kentzeko", - "hud.map.change_map_mode": "Aldatu mapa mota", - "hud.map.toggle_minimap_voxel": "Erakutsi edo ezkutatu minimapa", - "hud.map.zoom_minimap_explanation": "Handiagotu minimapa zure ingurua\nhobeto ikusteko", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/misc.ftl b/assets/voxygen/i18n/eu/hud/misc.ftl new file mode 100644 index 0000000000..2261a3f467 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/misc.ftl @@ -0,0 +1,17 @@ +hud-do_not_show_on_startup = Ez erakutsi hau jokoa hastean +hud-show_tips = Erakutsi aholkuak +hud-quests = Quests +hud-you_died = Hil zara +hud-waypoint_saved = Waypoint Saved +hud-sp_arrow_txt = SP +hud-inventory_full = Inbentarioa beteta +hud-press_key_to_show_keybindings_fmt = [{ $key }] kontrolak +hud-press_key_to_toggle_lantern_fmt = [{ $key }] argiontzia +hud-press_key_to_show_debug_info_fmt = Sakatu { $key } arazketa informazioa ikusteko +hud-press_key_to_toggle_keybindings_fmt = Sakatu { $key } laster-teklak erakutsi edo ezkutatzeko +hud-press_key_to_toggle_debug_info_fmt = Sakatu { $key } arazketa informazioa erakutsi edo ezkutatzeko +hud-press_key_to_respawn = Sakatu { $key } azken gordetze puntura itzultzeko. +hud-tutorial_btn = Tutoriala +hud-tutorial_click_here = Sakatu [ { $key } ] kurtsorea askatzeko, eta egin klik botoi honetan! +hud-spell = Sorginkeriak +hud-diary = Egunerokoa \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/misc.ron b/assets/voxygen/i18n/eu/hud/misc.ron deleted file mode 100644 index 53dc08ea31..0000000000 --- a/assets/voxygen/i18n/eu/hud/misc.ron +++ /dev/null @@ -1,34 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "hud.do_not_show_on_startup": "Ez erakutsi hau jokoa hastean", - "hud.show_tips": "Erakutsi aholkuak", - "hud.quests": "Quests", - "hud.you_died": "Hil zara", - "hud.waypoint_saved": "Waypoint Saved", - "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Inbentarioa beteta", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] kontrolak", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] argiontzia", - "hud.press_key_to_show_debug_info_fmt": "Sakatu {key} arazketa informazioa ikusteko", - "hud.press_key_to_toggle_keybindings_fmt": "Sakatu {key} laster-teklak erakutsi edo ezkutatzeko", - "hud.press_key_to_toggle_debug_info_fmt": "Sakatu {key} arazketa informazioa erakutsi edo ezkutatzeko", - - // Respawn message - "hud.press_key_to_respawn": r#"Sakatu {key} azken gordetze puntura itzultzeko."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutoriala"#, - "hud.tutorial_click_here": r#"Sakatu [ {key} ] kurtsorea askatzeko, eta egin klik botoi honetan!"#, - "hud.spell": "Sorginkeriak", - // Diary - "hud.diary": "Egunerokoa" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/sct.ftl b/assets/voxygen/i18n/eu/hud/sct.ftl new file mode 100644 index 0000000000..f5e022e5b6 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Esp +hud-sct-block = BLOKEATUTA \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/sct.ron b/assets/voxygen/i18n/eu/hud/sct.ron deleted file mode 100644 index d50b08222c..0000000000 --- a/assets/voxygen/i18n/eu/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Esp", - "hud.sct.block": "BLOKEATUTA", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/settings.ftl b/assets/voxygen/i18n/eu/hud/settings.ftl new file mode 100644 index 0000000000..02a2951de5 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/settings.ftl @@ -0,0 +1,98 @@ +hud-settings-general = Orokorra +hud-settings-none = Bat ere ez +hud-settings-press_behavior-toggle = Aukeratu +hud-settings-press_behavior-hold = Mantendu +hud-settings-help_window = Laguntza lehioa +hud-settings-debug_info = Arazketa informazioa +hud-settings-show_chat = Erakutsi txata +hud-settings-tips_on_startup = Aholkuak hasieran +hud-settings-ui_scale = UI eskala +hud-settings-relative_scaling = Eskalatze erlatiboa +hud-settings-custom_scaling = Eskalatze pertsonalizatua +hud-settings-opacity = Opakotasuna +hud-settings-toggle_shortcuts = Aldatu laster teklak +hud-settings-toggle_bar_experience = Erakutsi/ezkutatu esperientzia barra +hud-settings-incoming_damage = Jasotako kaltea banaka erakutsi +hud-settings-energybar_numbers = Zenbakiak energia barran +hud-settings-always_show_bars = Erakutsi beti energia barra +hud-settings-values = Balioak +hud-settings-percentages = Egunekoak +hud-settings-chat = Txata +hud-settings-background_opacity = Atzeko planoaren opakotasuna +hud-settings-chat_character_name = Pertsonaien izenak txatean +hud-settings-loading_tips = Kargatze pantailan aholkuak +hud-settings-reset_interface = Berrezarri lehenetsiak +hud-settings-zoom_sensitivity = Zoomaren sentikortasuna +hud-settings-invert_scroll_zoom = Alderantzikatu zoomaren korritzea +hud-settings-invert_mouse_y_axis = Alderantzikatu xaguaren Y ardatza +hud-settings-invert_controller_y_axis = Alderantzikatu agintearen Y ardatza +hud-settings-enable_mouse_smoothing = Kameraren leuntzea +hud-settings-player_physics_behavior = Jokalariaren fisikak (esperimentala) +hud-settings-reset_gameplay = Berrezarri lehenetsiak +hud-settings-view_distance = Errendatze distantzia +hud-settings-maximum_fps = Gehienezko FPS +hud-settings-present_mode = Aurkezpen modua +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Postontzia +hud-settings-present_mode-immediate = Berehalakoa +hud-settings-fov = Field of View (deg) +hud-settings-gamma = Gamma +hud-settings-exposure = Esposizioa +hud-settings-ambiance = Ingurugiroko distira +hud-settings-antialiasing_mode = AntiAliasing modua +hud-settings-upscale_factor = Barneko erresoluzioa +hud-settings-cloud_rendering_mode = Hodeiak errendatzeko modua +hud-settings-fluid_rendering_mode = Fluidoak errendatzeko modua +hud-settings-fluid_rendering_mode-cheap = Arina +hud-settings-fluid_rendering_mode-shiny = Distiratsua +hud-settings-cloud_rendering_mode-minimal = Gutxienekoa +hud-settings-cloud_rendering_mode-low = Baxua +hud-settings-cloud_rendering_mode-medium = Ertaina +hud-settings-cloud_rendering_mode-high = Altua +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Pantaila osoa +hud-settings-fullscreen_mode = Pantaila osoko modua +hud-settings-fullscreen_mode-exclusive = Esklusiboa +hud-settings-fullscreen_mode-borderless = Ertzik gabea +hud-settings-particles = Partikulak +hud-settings-lossy_terrain_compression = Lossy terrain compression +hud-settings-resolution = Erresoluzioa +hud-settings-bit_depth = Bit sakonera +hud-settings-refresh_rate = Freskatze maiztasuna +hud-settings-lighting_rendering_mode = Argia errendatzeko modua +hud-settings-lighting_rendering_mode-ashikhmin = A motakoa - Altua +hud-settings-lighting_rendering_mode-blinnphong = B motakoa - Ertaina +hud-settings-lighting_rendering_mode-lambertian = L motakoa - Arina +hud-settings-shadow_rendering_mode = Itzalak errendatzeko modua +hud-settings-shadow_rendering_mode-none = Bat ere ez +hud-settings-shadow_rendering_mode-cheap = Arina +hud-settings-shadow_rendering_mode-map = Mapa +hud-settings-shadow_rendering_mode-map-resolution = Erresoluzioa +hud-settings-lod_detail = LoD Detail +hud-settings-save_window_size = Gorde leihoaren tamaina +hud-settings-reset_graphics = Berreskuratu lehenentsiak +hud-settings-bloom = Lorea +hud-settings-master_volume = Bolumen nagusia +hud-settings-inactive_master_volume_perc = Leiho inaktiboaren bolumena +hud-settings-music_volume = Musikaren bolumena +hud-settings-sound_effect_volume = Soinu efektuen bolumena +hud-settings-audio_device = Audio gailuak +hud-settings-reset_sound = Berrezarri lehenetsiak +hud-settings-english_fallback = Erakutsi Ingelesez falta diren itzulpenak +hud-settings-awaitingkey = Sakatu tekla bat... +hud-settings-unbound = Bat ere ez +hud-settings-reset_keybinds = Berrezarri lehenetsiak +hud-settings-chat_tabs = Txataren fitxak +hud-settings-label = Etiketa: +hud-settings-delete = Ezabatu +hud-settings-show_all = Erakutsi denak +hud-settings-messages = Mezuak +hud-settings-activity = Ekintzak +hud-settings-death = Heriotza +hud-settings-group = Taldea +hud-settings-world = Mundua +hud-settings-region = Eremua +hud-settings-say = Esan +hud-settings-all = Denak +hud-settings-group_only = Taldean bakarrik +hud-settings-reset_chat = Berrezarri lehenetsiak \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/settings.ron b/assets/voxygen/i18n/eu/hud/settings.ron deleted file mode 100644 index f879930a3c..0000000000 --- a/assets/voxygen/i18n/eu/hud/settings.ron +++ /dev/null @@ -1,116 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - // Settings - "hud.settings.general": "Orokorra", - "hud.settings.none": "Bat ere ez", - "hud.settings.press_behavior.toggle": "Aukeratu", - "hud.settings.press_behavior.hold": "Mantendu", - "hud.settings.help_window": "Laguntza lehioa", - "hud.settings.debug_info": "Arazketa informazioa", - "hud.settings.show_chat": "Erakutsi txata", - "hud.settings.tips_on_startup": "Aholkuak hasieran", - "hud.settings.ui_scale": "UI eskala", - "hud.settings.relative_scaling": "Eskalatze erlatiboa", - "hud.settings.custom_scaling": "Eskalatze pertsonalizatua", - "hud.settings.opacity": "Opakotasuna", - "hud.settings.toggle_shortcuts": "Aldatu laster teklak", - "hud.settings.toggle_bar_experience": "Erakutsi/ezkutatu esperientzia barra", - "hud.settings.incoming_damage": "Jasotako kaltea banaka erakutsi", - "hud.settings.energybar_numbers": "Zenbakiak energia barran", - "hud.settings.always_show_bars": "Erakutsi beti energia barra", - "hud.settings.values": "Balioak", - "hud.settings.percentages": "Egunekoak", - "hud.settings.chat": "Txata", - "hud.settings.background_opacity": "Atzeko planoaren opakotasuna", - "hud.settings.chat_character_name": "Pertsonaien izenak txatean", - "hud.settings.loading_tips": "Kargatze pantailan aholkuak", - "hud.settings.reset_interface": "Berrezarri lehenetsiak", - - "hud.settings.zoom_sensitivity": "Zoomaren sentikortasuna", - "hud.settings.invert_scroll_zoom": "Alderantzikatu zoomaren korritzea", - "hud.settings.invert_mouse_y_axis": "Alderantzikatu xaguaren Y ardatza", - "hud.settings.invert_controller_y_axis": "Alderantzikatu agintearen Y ardatza", - "hud.settings.enable_mouse_smoothing": "Kameraren leuntzea", - "hud.settings.player_physics_behavior": "Jokalariaren fisikak (esperimentala)", - "hud.settings.reset_gameplay": "Berrezarri lehenetsiak", - - "hud.settings.view_distance": "Errendatze distantzia", - "hud.settings.maximum_fps": "Gehienezko FPS", - "hud.settings.present_mode": "Aurkezpen modua", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Postontzia", - "hud.settings.present_mode.immediate": "Berehalakoa", - "hud.settings.fov": "Field of View (deg)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Esposizioa", - "hud.settings.ambiance": "Ingurugiroko distira", - "hud.settings.antialiasing_mode": "AntiAliasing modua", - "hud.settings.upscale_factor": "Barneko erresoluzioa", - "hud.settings.cloud_rendering_mode": "Hodeiak errendatzeko modua", - "hud.settings.fluid_rendering_mode": "Fluidoak errendatzeko modua", - "hud.settings.fluid_rendering_mode.cheap": "Arina", - "hud.settings.fluid_rendering_mode.shiny": "Distiratsua", - "hud.settings.cloud_rendering_mode.minimal": "Gutxienekoa", - "hud.settings.cloud_rendering_mode.low": "Baxua", - "hud.settings.cloud_rendering_mode.medium": "Ertaina", - "hud.settings.cloud_rendering_mode.high": "Altua", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Pantaila osoa", - "hud.settings.fullscreen_mode": "Pantaila osoko modua", - "hud.settings.fullscreen_mode.exclusive": "Esklusiboa", - "hud.settings.fullscreen_mode.borderless": "Ertzik gabea", - "hud.settings.particles": "Partikulak", - "hud.settings.lossy_terrain_compression": "Lossy terrain compression", - "hud.settings.resolution": "Erresoluzioa", - "hud.settings.bit_depth": "Bit sakonera", - "hud.settings.refresh_rate": "Freskatze maiztasuna", - "hud.settings.lighting_rendering_mode": "Argia errendatzeko modua", - "hud.settings.lighting_rendering_mode.ashikhmin": "A motakoa - Altua", - "hud.settings.lighting_rendering_mode.blinnphong": "B motakoa - Ertaina", - "hud.settings.lighting_rendering_mode.lambertian": "L motakoa - Arina", - "hud.settings.shadow_rendering_mode": "Itzalak errendatzeko modua", - "hud.settings.shadow_rendering_mode.none": "Bat ere ez", - "hud.settings.shadow_rendering_mode.cheap": "Arina", - "hud.settings.shadow_rendering_mode.map": "Mapa", - "hud.settings.shadow_rendering_mode.map.resolution": "Erresoluzioa", - "hud.settings.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Gorde leihoaren tamaina", - "hud.settings.reset_graphics": "Berreskuratu lehenentsiak", - "hud.settings.bloom": "Lorea", - - "hud.settings.master_volume": "Bolumen nagusia", - "hud.settings.inactive_master_volume_perc": "Leiho inaktiboaren bolumena", - "hud.settings.music_volume": "Musikaren bolumena", - "hud.settings.sound_effect_volume": "Soinu efektuen bolumena", - "hud.settings.audio_device": "Audio gailuak", - "hud.settings.reset_sound": "Berrezarri lehenetsiak", - - "hud.settings.english_fallback": "Erakutsi Ingelesez falta diren itzulpenak", - - "hud.settings.awaitingkey": "Sakatu tekla bat...", - "hud.settings.unbound": "Bat ere ez", - "hud.settings.reset_keybinds": "Berrezarri lehenetsiak", - - "hud.settings.chat_tabs": "Txataren fitxak", - "hud.settings.label": "Etiketa:", - "hud.settings.delete": "Ezabatu", - "hud.settings.show_all": "Erakutsi denak", - "hud.settings.messages": "Mezuak", - "hud.settings.activity": "Ekintzak", - "hud.settings.death": "Heriotza", - "hud.settings.group": "Taldea", - "hud.settings.world": "Mundua", - "hud.settings.region": "Eremua", - "hud.settings.say": "Esan", - "hud.settings.all": "Denak", - "hud.settings.group_only": "Taldean bakarrik", - "hud.settings.reset_chat" : "Berrezarri lehenetsiak", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/skills.ftl b/assets/voxygen/i18n/eu/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/eu/hud/skills.ron b/assets/voxygen/i18n/eu/hud/skills.ron deleted file mode 100644 index 88dc70f8f8..0000000000 --- a/assets/voxygen/i18n/eu/hud/skills.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/eu/hud/social.ftl b/assets/voxygen/i18n/eu/hud/social.ftl new file mode 100644 index 0000000000..cdadcc7f87 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Jokalari gehiago +hud-social-online = Online: +hud-social-friends = Lagunak +hud-social-not_yet_available = Oraindik ez dago erabilgarri +hud-social-faction = Taldea +hud-social-play_online_fmt = { $nb_player } jokalari daude online +hud-social-name = Izena +hud-social-level = Maila +hud-social-zone = Zona +hud-social-account = Kontua \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/social.ron b/assets/voxygen/i18n/eu/hud/social.ron deleted file mode 100644 index 0339fc05c7..0000000000 --- a/assets/voxygen/i18n/eu/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "hud.social": "Jokalari gehiago", - "hud.social.online": "Online:", - "hud.social.friends": "Lagunak", - "hud.social.not_yet_available": "Oraindik ez dago erabilgarri", - "hud.social.faction": "Taldea", - "hud.social.play_online_fmt": "{nb_player} jokalari daude online", - "hud.social.name": "Izena", - "hud.social.level": "Maila", - "hud.social.zone": "Zona", - "hud.social.account": "Kontua", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/eu/hud/trade.ftl b/assets/voxygen/i18n/eu/hud/trade.ftl new file mode 100644 index 0000000000..411a914ef9 --- /dev/null +++ b/assets/voxygen/i18n/eu/hud/trade.ftl @@ -0,0 +1,23 @@ +hud-trade-trade_window = Trukaketa +hud-trade-phase1_description = Arrastatu trukatu nahi dituzun objektuak. +hud-trade-phase2_description = + Trukaketa blokeatu da dena ondo dagoela + ziurtatzeko denbora izan dezazun. +hud-trade-phase3_description = Trukatzen. +hud-trade-persons_offer = { $playername }(r)en eskaintza +hud-trade-has_accepted = + { $playername }(e)k + onartu du +hud-trade-accept = Onartu +hud-trade-decline = Ukatu +hud-trade-invite_sent = Trukaketa eskaera bidali diozu { $playername }(r)i. +hud-trade-result-completed = Trukaketa burutu da. +hud-trade-result-declined = Trukaketa bertan behera utzi da. +hud-trade-result-nospace = Ez daukazu nahikoa lekurik trukaketa egiteko. +hud-trade-buy_price = Erosketa prezioa +hud-trade-sell_price = Salmenta prezioa +hud-trade-coin = txanpon +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Zure eskaintza +hud-trade-their_offer = Haren eskaintza \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/hud/trade.ron b/assets/voxygen/i18n/eu/hud/trade.ron deleted file mode 100644 index d933256a8f..0000000000 --- a/assets/voxygen/i18n/eu/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - "hud.trade.trade_window": "Trukaketa", - "hud.trade.phase1_description": "Arrastatu trukatu nahi dituzun objektuak.", - "hud.trade.phase2_description": "Trukaketa blokeatu da dena ondo dagoela \nziurtatzeko denbora izan dezazun.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Trukatzen.", - "hud.trade.persons_offer": "{playername}(r)en eskaintza", - "hud.trade.has_accepted": "{playername}(e)k\nonartu du", - "hud.trade.accept": "Onartu", - "hud.trade.decline": "Ukatu", - "hud.trade.invite_sent": "Trukaketa eskaera bidali diozu {playername}(r)i.", - "hud.trade.result.completed": "Trukaketa burutu da.", - "hud.trade.result.declined": "Trukaketa bertan behera utzi da.", - "hud.trade.result.nospace": "Ez daukazu nahikoa lekurik trukaketa egiteko.", - "hud.trade.buy_price": "Erosketa prezioa", - "hud.trade.sell_price": "Salmenta prezioa", - "hud.trade.coin": "txanpon", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Zure eskaintza", - "hud.trade.their_offer": "Haren eskaintza", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/eu/main.ftl b/assets/voxygen/i18n/eu/main.ftl new file mode 100644 index 0000000000..5b11db2a62 --- /dev/null +++ b/assets/voxygen/i18n/eu/main.ftl @@ -0,0 +1,75 @@ +main-username = Erabiltzaile izena +main-server = Zerbitzaria +main-password = Pasahitza +main-connecting = Konektatzen +main-creating_world = Mundua sortzen +main-tip = Aholkua: +main-notice = + Ongi etorri Velorenen alpha bertsiora! + + Jokatzen hasi aurretik, kontuan izan honako ohar hauek: + + - Alpha bertsio oso goiztiarra da hau. Akatsak, findu gabeko mekanikak eta bukatu gabeko ezaugarriak aurkituko dituzu oraindik. + + - Zure iritzia adierazi edo akatsen baten berri eman nahi baduzu, Reddit, Gitlab, Discord eta Matrixen izango gaituzu. + + - Veloren GPL-3 lizentzia librean banatzen da. Horrek esan nahi du libre zarela jokatu, aldatu eta nahi bezala banatzeko (beti ere GPL-3 lizentziaren baldintzak betetzen badituzu) + + - Veloren irabazi asmorik gabeko proiektua da, eta denok modu boluntarioan egiten dugu lan. + Ikusten duzuna gustuko baduzu, ongi etorria izango zara garatzaile zein arte taldeetan! + + Eskerrik asko ohar hau irakurtzeko denbora hartzeagatik, espero dugu jokoa zure gustokoa izango dela! + + ~ Velorenen garatzaile taldea +main-login_process = + Saioa hasteko prozesuaren informazioa: + + Kontua beharko duzu autentikazioa + erabiltzen duten zerbitzarietan jokatzeko. + + Kontua ondorengo helbidean sortu dezakezu: + + https://veloren.net/account/. +main-login-server_not_found = Ezin izan da zerbitzaria aurkitu +main-login-authentication_error = Autentikazio errorea zerbitzarian +main-login-internal_error = Barneko errorea bezeroan (baliteke jokalaria ezabatu izana) +main-login-failed_auth_server_url_invalid = Ezin izan da autentikazio zerbitzarira konektatu +main-login-insecure_auth_scheme = The auth Scheme HTTP is NOT supported. It's insecure! For development purposes, HTTP is allowed for 'localhost' or debug builds +main-login-server_full = Zerbitzaria beteta dago +main-login-untrusted_auth_server = Autentikazio zerbitzaria ez da fidagarria +main-login-outdated_client_or_server = ZerbitzariaErotuDa: ziurrenik bertsioak ez dira bateragarrik, ziurtatu jokoa eguneratuta duzula. +main-login-timeout = Iraungi da: zerbitziak ez du garaiz erantzun. Zerbitzaria gainkargatuta dago edo sare arazoak ditu/dituzu. +main-login-server_shut_down = Zerbitzaria itzalita dago +main-login-network_error = Sare errorea +main-login-network_wrong_version = Zerbitzariaren eta bezeroaren bertsioak ez datoz bat; jokoa eguneratu behar duzu. +main-login-failed_sending_request = Zerbitzarira autentifikazio eskaerak huts egin du. +main-login-invalid_character = Aukeratutako pertsonaia ez da baliozkoa. +main-login-client_crashed = Bezeroak huts egin du. +main-login-not_on_whitelist = Baimenduen zerrendan egon behar duzu sartzeko. +main-login-banned = Zerbizarira sarrera debekatu zaizu ondorengo arrazoia dela eta: +main-login-kicked = Zerbitzaritik kanporatua izan zara ondorengo arrazoia dela eta: +main-login-select_language = Aukeratu hizkuntza +main-login-client_version = Bezeroaren bertsioa +main-login-server_version = Zerbitzariaren bertsioa +main-servers-select_server = Aukeratu zerbitzaria +loading-tips = + .a0 = Sakatu 'G' argiontzia piztu edo itzaltzeko. + .a1 = Sakatu 'F1' kontrolen zerrenda ikusteko. + .a2 = Zure inguruko jokalariekin bakarrik hitz egiteko /say edo /s aginduak erabili ditzakezu. + .a3 = Zure eremuko (berrehun bloke inguru) erabiltzaileekin hitz egiteko /region edo /r erabili dezakezu. + .a4 = Administratzaileek /build agindua erabili dezakete mundua aldatzeko. + .a5 = Txat bidez zure taldekideekin bakarrik hitz egiteko /group edo /g aginduak erabili ditzakezu + .a6 = Mezu pribatuak bidaltzeko idatzi /tell + .a7 = Adi ibili janaririk gabe ez geratzeko! + .a8 = Inbentarioa janariz bete duzu? Saiatu janari landuagoak kozinatzen! + .a9 = Ez dakizula zer egin? Bisitatu mapan markatutako ziegak! + .a10 = Ez ahaztu ezarpen grafikoak zure sistemara egokitzea. Sakatu 'N' ezarpenak irekitzeko. + .a11 = Jokalari gehiagorekin jokatzea oso dibertigarria da! Sakatu 'O' nor dagoen online ikusteko. + .a12 = Sakatu 'J' dantza egiteko. + .a13 = Sakatu 'Ezkerreko-Shift' planeatzailea ireki eta zerua konkistatzeko. + .a14 = Veloren oraindik Pre-Alpha bertsioan dago. Ahalegin handia egiten dugu egunero hobetzeko! + .a15 = Garatzaile taldean parte hartu edo besterik gabe gurekin hitz egin nahi baduzu, sartu gure Discord zerbitzarian! + .a16 = Ezarpenetan osasun barratik kopuru zehatza erakutsi edo ezkutatu dezakezu. + .a17 = Eseri sutondoan ('K' tekla sakatuta) pixkanaka osasuna berreskuratzeko. + .a18 = Zorro gehiago edo armadura hobea behar dituzu? Sakatu 'C' artisautza menua irekitzeko! + .a19 = Saiatu aldi berean salto eta itzulipurdi egiten etsaien aurka borrokan ari zarenean. \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/main.ron b/assets/voxygen/i18n/eu/main.ron deleted file mode 100644 index 7d153fabfa..0000000000 --- a/assets/voxygen/i18n/eu/main.ron +++ /dev/null @@ -1,91 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - /// Start Main screen section - "main.username": "Erabiltzaile izena", - "main.server": "Zerbitzaria", - "main.password": "Pasahitza", - "main.connecting": "Konektatzen", - "main.creating_world": "Mundua sortzen", - "main.tip": "Aholkua:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Ongi etorri Velorenen alpha bertsiora! - -Jokatzen hasi aurretik, kontuan izan honako ohar hauek: - -- Alpha bertsio oso goiztiarra da hau. Akatsak, findu gabeko mekanikak eta bukatu gabeko ezaugarriak aurkituko dituzu oraindik. - -- Zure iritzia adierazi edo akatsen baten berri eman nahi baduzu, Reddit, Gitlab, Discord eta Matrixen izango gaituzu. - -- Veloren GPL-3 lizentzia librean banatzen da. Horrek esan nahi du libre zarela jokatu, aldatu eta nahi bezala banatzeko (beti ere GPL-3 lizentziaren baldintzak betetzen badituzu) - -- Veloren irabazi asmorik gabeko proiektua da, eta denok modu boluntarioan egiten dugu lan. -Ikusten duzuna gustuko baduzu, ongi etorria izango zara garatzaile zein arte taldeetan! - -Eskerrik asko ohar hau irakurtzeko denbora hartzeagatik, espero dugu jokoa zure gustokoa izango dela! - -~ Velorenen garatzaile taldea"#, - - // Login process description - "main.login_process": r#"Saioa hasteko prozesuaren informazioa: - -Kontua beharko duzu autentikazioa -erabiltzen duten zerbitzarietan jokatzeko. - -Kontua ondorengo helbidean sortu dezakezu: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Ezin izan da zerbitzaria aurkitu", - "main.login.authentication_error": "Autentikazio errorea zerbitzarian", - "main.login.internal_error": "Barneko errorea bezeroan (baliteke jokalaria ezabatu izana)", - "main.login.failed_auth_server_url_invalid": "Ezin izan da autentikazio zerbitzarira konektatu", - "main.login.insecure_auth_scheme": "The auth Scheme HTTP is NOT supported. It's insecure! For development purposes, HTTP is allowed for 'localhost' or debug builds", - "main.login.server_full": "Zerbitzaria beteta dago", - "main.login.untrusted_auth_server": "Autentikazio zerbitzaria ez da fidagarria", - "main.login.outdated_client_or_server": "ZerbitzariaErotuDa: ziurrenik bertsioak ez dira bateragarrik, ziurtatu jokoa eguneratuta duzula.", - "main.login.timeout": "Iraungi da: zerbitziak ez du garaiz erantzun. Zerbitzaria gainkargatuta dago edo sare arazoak ditu/dituzu.", - "main.login.server_shut_down": "Zerbitzaria itzalita dago", - "main.login.network_error": "Sare errorea", - "main.login.network_wrong_version": "Zerbitzariaren eta bezeroaren bertsioak ez datoz bat; jokoa eguneratu behar duzu.", - "main.login.failed_sending_request": "Zerbitzarira autentifikazio eskaerak huts egin du.", - "main.login.invalid_character": "Aukeratutako pertsonaia ez da baliozkoa.", - "main.login.client_crashed": "Bezeroak huts egin du.", - "main.login.not_on_whitelist": "Baimenduen zerrendan egon behar duzu sartzeko.", - "main.login.banned": "Zerbizarira sarrera debekatu zaizu ondorengo arrazoia dela eta:", - "main.login.kicked": "Zerbitzaritik kanporatua izan zara ondorengo arrazoia dela eta:", - "main.login.select_language": "Aukeratu hizkuntza", - "main.login.client_version": "Bezeroaren bertsioa", - "main.login.server_version": "Zerbitzariaren bertsioa", - "main.servers.select_server": "Aukeratu zerbitzaria", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Sakatu 'G' argiontzia piztu edo itzaltzeko.", - "Sakatu 'F1' kontrolen zerrenda ikusteko.", - "Zure inguruko jokalariekin bakarrik hitz egiteko /say edo /s aginduak erabili ditzakezu.", - "Zure eremuko (berrehun bloke inguru) erabiltzaileekin hitz egiteko /region edo /r erabili dezakezu.", - "Administratzaileek /build agindua erabili dezakete mundua aldatzeko.", - "Txat bidez zure taldekideekin bakarrik hitz egiteko /group edo /g aginduak erabili ditzakezu", - "Mezu pribatuak bidaltzeko idatzi /tell ", - "Adi ibili janaririk gabe ez geratzeko!", - "Inbentarioa janariz bete duzu? Saiatu janari landuagoak kozinatzen!", - "Ez dakizula zer egin? Bisitatu mapan markatutako ziegak!", - "Ez ahaztu ezarpen grafikoak zure sistemara egokitzea. Sakatu 'N' ezarpenak irekitzeko.", - "Jokalari gehiagorekin jokatzea oso dibertigarria da! Sakatu 'O' nor dagoen online ikusteko.", - "Sakatu 'J' dantza egiteko.", - "Sakatu 'Ezkerreko-Shift' planeatzailea ireki eta zerua konkistatzeko.", - "Veloren oraindik Pre-Alpha bertsioan dago. Ahalegin handia egiten dugu egunero hobetzeko!", - "Garatzaile taldean parte hartu edo besterik gabe gurekin hitz egin nahi baduzu, sartu gure Discord zerbitzarian!", - "Ezarpenetan osasun barratik kopuru zehatza erakutsi edo ezkutatu dezakezu.", - "Eseri sutondoan ('K' tekla sakatuta) pixkanaka osasuna berreskuratzeko.", - "Zorro gehiago edo armadura hobea behar dituzu? Sakatu 'C' artisautza menua irekitzeko!", - "Saiatu aldi berean salto eta itzulipurdi egiten etsaien aurka borrokan ari zarenean.", - ], - } -) diff --git a/assets/voxygen/i18n/eu/npc.ftl b/assets/voxygen/i18n/eu/npc.ftl new file mode 100644 index 0000000000..044715062d --- /dev/null +++ b/assets/voxygen/i18n/eu/npc.ftl @@ -0,0 +1,117 @@ +npc-speech-villager = + .a0 = Ez al da egun zoragarria gaurkoa? + .a1 = Nola zaude gaur? + .a2 = Egun on! + .a3 = Eguraldi ederra, ezta? + .a4 = Ziegetan pentsatze hutsak izugarrizko beldurra ematen dit. Eskertuko nuke norbaitek garbituko balitu. + .a5 = Kobak esploratzea gustatuko litzaidake, baina ez daukat nahikoa indarrik. + .a6 = Ikusi al duzu gure katua? + .a7 = Diotenez mota askotako harribitxi distiratsuak aurkitu daitezke kobazuloetan. + .a8 = Maite dut maite gazta! + .a9 = Zergatik ez zatoz barrura? Gazta pixka bat jateko asmoa geneukan! + .a10 = Diotenez onddoak onak dira osasunarentzat. Nik ez ditut inoiz jan. + .a11 = Izugarri gustatzen zait gazta. Nola egiten den ikasi nahiko nuke. + .a12 = Zer egongo ote da mendien beste aldean? + .a13 = Planeagailu bat eraikitzea gustatuko litzaidake. + .a14 = Gure lorategia ikusi nahi duzu? Ez? Beno, beharbada beste batean. + .a15 = Egun ederra basoan paseotxo bat emateko! + .a16 = Izan edo ez izan? Uste dut baserritarra izango naizela. + .a17 = Ez al duzu uste gure herria dela munduan onena + .a18 = Gose naiz! + .a19 = Harrapatu al duzu inoiz ipurtargirik? + .a20 = Ez dut ulertzen nondik ateratzen den horrenbeste basapizti. + .a21 = Norbaitek otsoak herritik uxatuko balitu asko eskertuko nioke. + .a22 = Gaztei buruzko amets zoragarria izan nuen bart. Zerbait esan nahiko ote du? + .a23 = Espero dut laster euria egitea, lurrak behar du eta + .a24 = Eztia maite dut, baina erleak gorroto ditut. + .a25 = Mundua ikusi nahi dut! Ziur naiz gauza interesgarri asko dagoela herri honetatik kanpo. +npc-speech-villager_decline_trade = + .a0 = Sentitzen dut, ez daukat trukatzeko ezer ere ez. + .a1 = Trukatu? Ez daukat interesatuko zaizun ezer. + .a2 = Nirea nirea da, ez dut zurekin ezer trukatuko. +npc-speech-merchant_advertisement = + .a0 = Ziur nago badudala zure gustuko zerbait, trukaketarik nahi? + .a1 = Zerbait trukatu nahi? + .a2 = Trukatzeko gauza asko ditut, ikusi nahi? +npc-speech-merchant_busy = + .a0 = Aizu, itxaron zure txanda. + .a1 = Itxaron mesedez, bi esku bakarrik ditut. + .a2 = Ez al duzu zure parean dagoen beste pertsona ikusi? + .a3 = Itxaron, utzi aurrekoarekin bukatzen. + .a4 = Errespetatu ilara mesedez. + .a5 = Lanpetuta nago, etorri geroago. +npc-speech-merchant_trade_successful = + .a0 = Eskerrik asko! + .a1 = Mila esker! +npc-speech-merchant_trade_declined = + .a0 = Beharbada beste batean, egun ona izan! + .a1 = Hau pena! Beharbada hurrengo batean! +npc-speech-villager_under_attack = + .a0 = Laguntza, erasotzen ari zaizkit! + .a1 = Lagundu! erasotzen ari zaizkit! + .a2 = Ene bada! Laguntza behar dut! + .a3 = Ez da posible! Lagundu! + .a4 = Lagundu! Erasoa! + .a5 = Laguntza behar dut! + .a6 = Lagundu! + .a7 = Lagundu! Lagundu, mesedez! + .a8 = Laguntza! Lagundu! Lagundu! + .a9 = Hil egin nahi naute! + .a10 = Lagundu, mesedez!! + .a11 = Nire bila datoz! + .a12 = Lagundu! Hil egin nahi naute! + .a13 = Ez daukazu horretarako eskubiderik + .a14 = Geldi! + .a15 = Nola ausartu zara! + .a16 = Mesedez, ez nazazu gehiago jo! + .a17 = Aizu, kontuz horrekin! + .a18 = Ospa! + .a19 = Geldi! Alde! + .a20 = Haserretzen hasita nago! + .a21 = Aizu! Nor uste duzu zarela?! + .a22 = Damutuko zara! + .a23 = Gelditu, mesedez. Ez daukat baliozko ezer! + .a24 = Anaiari esango diot, ni eta zu baino askoz indartsuagoa da! + .a25 = Eezz, amari esango diot! + .a26 = Madarikatua zu! + .a27 = Mesedez, ez egin hori. + .a28 = Hori ez da oso polita izan! + .a29 = Zure arma badabilela ikusi duzu, orain gorde! + .a30 = Utzi bakean! + .a31 = Mesedez, familia daukat! + .a32 = Gazteegia naiz hiltzeko! + .a33 = Azalpen bat zor didazu + .a34 = Indarkeria inoiz ez da erantzuna + .a35 = A ze eguna gaurkoa... + .a36 = Ei, horrek min egin dit! + .a37 = Aizu! + .a38 = Hori bai zakarra! + .a39 = Geldi, erregutzen dizut! + .a40 = Ez dauka graziarik. + .a41 = Nola ausartu zara?! + .a42 = Benetan damutuko zara egindakoaz! + .a43 = Jarraitu eta damutuko zara! + .a44 = Ez dizut minik egin nahi! + .a45 = Gaizki ulerturen bat izan behar du + .a46 = Ez daukazu hau egin beharrik! + .a47 = Ez izan gaiztoa! + .a48 = Horrek min egin dit! + .a49 = Zergatik egin duzu hori?! + .a50 = Jainkoaren izenean, geldi! + .a51 = Beste norbaitekin nahastuko ninduzun! + .a52 = Ez dut hau merezi + .a53 = Mesedez, ez egin hori berriro + .a54 = Guardiak, jaurti munstro hau errekara! + .a55 = Ez, mesedez! + .a56 = Zergatik niii? +npc-speech-villager_enemy_killed = + .a0 = Garaitu dut etsaia! + .a1 = Azkenean bakea! + .a2 = ... zertan ari nintzen? +npc-speech-menacing = + .a0 = Alde! Ez dizut berriro esango! + .a1 = Gerturatu gehiago eta eraso egingo dizut! + .a2 = Ez nauzu beldurtzen! + .a3 = Alde hemendik! + .a4 = Alde hil nahi ez baduzu! + .a5 = Hemen ez zara ongi etorria! \ No newline at end of file diff --git a/assets/voxygen/i18n/eu/npc.ron b/assets/voxygen/i18n/eu/npc.ron deleted file mode 100644 index de69711891..0000000000 --- a/assets/voxygen/i18n/eu/npc.ron +++ /dev/null @@ -1,136 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Ez al da egun zoragarria gaurkoa?", - "Nola zaude gaur?", - "Egun on!", - "Eguraldi ederra, ezta?", - "Ziegetan pentsatze hutsak izugarrizko beldurra ematen dit. Eskertuko nuke norbaitek garbituko balitu.", - "Kobak esploratzea gustatuko litzaidake, baina ez daukat nahikoa indarrik.", - "Ikusi al duzu gure katua?", - "Diotenez mota askotako harribitxi distiratsuak aurkitu daitezke kobazuloetan.", - "Maite dut maite gazta!", - "Zergatik ez zatoz barrura? Gazta pixka bat jateko asmoa geneukan!", - "Diotenez onddoak onak dira osasunarentzat. Nik ez ditut inoiz jan.", - "Izugarri gustatzen zait gazta. Nola egiten den ikasi nahiko nuke.", - "Zer egongo ote da mendien beste aldean?", - "Planeagailu bat eraikitzea gustatuko litzaidake.", - "Gure lorategia ikusi nahi duzu? Ez? Beno, beharbada beste batean.", - "Egun ederra basoan paseotxo bat emateko!", - "Izan edo ez izan? Uste dut baserritarra izango naizela.", - "Ez al duzu uste gure herria dela munduan onena", - "Gose naiz!", - "Harrapatu al duzu inoiz ipurtargirik?", - "Ez dut ulertzen nondik ateratzen den horrenbeste basapizti.", - "Norbaitek otsoak herritik uxatuko balitu asko eskertuko nioke.", - "Gaztei buruzko amets zoragarria izan nuen bart. Zerbait esan nahiko ote du?", - "Espero dut laster euria egitea, lurrak behar du eta", - "Eztia maite dut, baina erleak gorroto ditut.", - "Mundua ikusi nahi dut! Ziur naiz gauza interesgarri asko dagoela herri honetatik kanpo.", - ], - "npc.speech.villager_decline_trade": [ - "Sentitzen dut, ez daukat trukatzeko ezer ere ez.", - "Trukatu? Ez daukat interesatuko zaizun ezer.", - "Nirea nirea da, ez dut zurekin ezer trukatuko.", - ], - "npc.speech.merchant_advertisement": [ - "Ziur nago badudala zure gustuko zerbait, trukaketarik nahi?", - "Zerbait trukatu nahi?", - "Trukatzeko gauza asko ditut, ikusi nahi?" - ], - "npc.speech.merchant_busy": [ - "Aizu, itxaron zure txanda.", - "Itxaron mesedez, bi esku bakarrik ditut.", - "Ez al duzu zure parean dagoen beste pertsona ikusi?", - "Itxaron, utzi aurrekoarekin bukatzen.", - "Errespetatu ilara mesedez.", - "Lanpetuta nago, etorri geroago." - ], - "npc.speech.merchant_trade_successful": [ - "Eskerrik asko!", - "Mila esker!", - ], - "npc.speech.merchant_trade_declined": [ - "Beharbada beste batean, egun ona izan!", - "Hau pena! Beharbada hurrengo batean!" - ], - "npc.speech.villager_under_attack": [ - "Laguntza, erasotzen ari zaizkit!", - "Lagundu! erasotzen ari zaizkit!", - "Ene bada! Laguntza behar dut!", - "Ez da posible! Lagundu!", - "Lagundu! Erasoa!", - "Laguntza behar dut!", - "Lagundu!", - "Lagundu! Lagundu, mesedez!", - "Laguntza! Lagundu! Lagundu!", - "Hil egin nahi naute!", - "Lagundu, mesedez!!", - "Nire bila datoz!", - "Lagundu! Hil egin nahi naute!", - "Ez daukazu horretarako eskubiderik", - "Geldi!", - "Nola ausartu zara!", - "Mesedez, ez nazazu gehiago jo!", - "Aizu, kontuz horrekin!", - "Ospa!", - "Geldi! Alde!", - "Haserretzen hasita nago!", - "Aizu! Nor uste duzu zarela?!", - "Damutuko zara!", - "Gelditu, mesedez. Ez daukat baliozko ezer!", - "Anaiari esango diot, ni eta zu baino askoz indartsuagoa da!", - "Eezz, amari esango diot!", - "Madarikatua zu!", - "Mesedez, ez egin hori.", - "Hori ez da oso polita izan!", - "Zure arma badabilela ikusi duzu, orain gorde!", - "Utzi bakean!", - "Mesedez, familia daukat!", - "Gazteegia naiz hiltzeko!", - "Azalpen bat zor didazu", - "Indarkeria inoiz ez da erantzuna", - "A ze eguna gaurkoa...", - "Ei, horrek min egin dit!", - "Aizu!", - "Hori bai zakarra!", - "Geldi, erregutzen dizut!", - "Ez dauka graziarik.", - "Nola ausartu zara?!", - "Benetan damutuko zara egindakoaz!", - "Jarraitu eta damutuko zara!", - "Ez dizut minik egin nahi!", - "Gaizki ulerturen bat izan behar du", - "Ez daukazu hau egin beharrik!", - "Ez izan gaiztoa!", - "Horrek min egin dit!", - "Zergatik egin duzu hori?!", - "Jainkoaren izenean, geldi!", - "Beste norbaitekin nahastuko ninduzun!", - "Ez dut hau merezi", - "Mesedez, ez egin hori berriro", - "Guardiak, jaurti munstro hau errekara!", - "Ez, mesedez!", - "Zergatik niii?", - ], - "npc.speech.villager_enemy_killed": [ - "Garaitu dut etsaia!", - "Azkenean bakea!", - "... zertan ari nintzen?", - ], - "npc.speech.menacing": [ - "Alde! Ez dizut berriro esango!", - "Gerturatu gehiago eta eraso egingo dizut!", - "Ez nauzu beldurtzen!", - "Alde hemendik!", - "Alde hil nahi ez baduzu!", - "Hemen ez zara ongi etorria!", - ], - } -) diff --git a/assets/voxygen/i18n/eu/template.ftl b/assets/voxygen/i18n/eu/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/eu/template.ron b/assets/voxygen/i18n/eu/template.ron deleted file mode 100644 index c5de20d45c..0000000000 --- a/assets/voxygen/i18n/eu/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Basque -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/buff.ftl b/assets/voxygen/i18n/fr_FR/buff.ftl new file mode 100644 index 0000000000..e8699013ef --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/buff.ftl @@ -0,0 +1,40 @@ +buff-remove = Cliquer pour retirer +buff-title-missing = Titre Manquant +buff-desc-missing = Description Manquante +buff-title-heal = Soin +buff-desc-heal = Régénère progressivement des points de vie. +buff-title-potion = Potion +buff-desc-potion = En train de boire... +buff-title-saturation = Saturation +buff-desc-saturation = Régénère progressivement des points de vie grâce à la nourriture. +buff-title-campfire_heal = Soin autour d'un feu de camp +buff-desc-campfire_heal = Se reposer à côté d'un feu de camp restaure { $rate }% de santé chaque seconde. +buff-title-invulnerability = Invulnérabilité +buff-desc-invulnerability = Vous ne pouvez pas être blessé par une attaque. +buff-title-protectingward = Aura de Protection +buff-desc-protectingward = Vous êtes protégé, d'une quelconque façon, des attaques ennemies +buff-title-frenzied = Frénétique +buff-desc-frenzied = Vous bénéficiez d'une vitesse surnaturelle et ignorez les blessures superficielles. +buff-title-hastened = Hâte +buff-desc-hastened = Vos mouvements et vos attaques sont plus rapides. +buff-title-bleed = Saignement +buff-desc-bleed = Inflige régulièrement des dommages. +buff-title-cursed = Maudit +buff-desc-cursed = Vous êtes maudit. +buff-title-burn = En feu +buff-desc-burn = Vous êtes en train de brûler vivant. +buff-title-crippled = Estropie +buff-desc-crippled = Vos mouvements sont ralentis suite à de graves blessures aux jambes. +buff-title-frozen = Glacé(e) +buff-desc-frozen = Vos mouvements et attaques sont ralentis. +buff-title-wet = Trempé(e) +buff-desc-wet = Le sol rejete vos pieds, rendant le fait de s'arrêter difficile. +buff-title-ensnared = Piégé(e) +buff-desc-ensnared = Des plantes grappantes s'attachent à vos jambes, restraignant vos mouvements. +buff-stat-health = Restaure { $str_total } points de vie +buff-stat-increase_max_energy = Augmente la vigueur maximale de { $strength } +buff-stat-increase_max_health = Augmente la santé maximale de { $strength } +buff-stat-invulnerability = Rend invincible +buff-text-over_seconds = pendant { $dur_secs } secondes +buff-text-for_seconds = pour { $dur_secs } secondes +buff-text-every_second = chaque seconde \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/buff.ron b/assets/voxygen/i18n/fr_FR/buff.ron deleted file mode 100644 index 41b7fd7534..0000000000 --- a/assets/voxygen/i18n/fr_FR/buff.ron +++ /dev/null @@ -1,55 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "buff.remove": "Cliquer pour retirer", - "buff.title.missing": "Titre Manquant", - "buff.desc.missing": "Description Manquante", - // Buffs - "buff.title.heal": "Soin", - "buff.desc.heal": "Régénère progressivement des points de vie.", - "buff.title.potion": "Potion", - "buff.desc.potion": "En train de boire...", - "buff.title.saturation": "Saturation", - "buff.desc.saturation": "Régénère progressivement des points de vie grâce à la nourriture.", - "buff.title.campfire_heal": "Soin autour d'un feu de camp", - "buff.desc.campfire_heal": "Se reposer à côté d'un feu de camp restaure {rate}% de santé chaque seconde.", - "buff.title.invulnerability": "Invulnérabilité", - "buff.desc.invulnerability": "Vous ne pouvez pas être blessé par une attaque.", - "buff.title.protectingward": "Aura de Protection", - "buff.desc.protectingward": "Vous êtes protégé, d'une quelconque façon, des attaques ennemies", - "buff.title.frenzied": "Frénétique", - "buff.desc.frenzied": "Vous bénéficiez d'une vitesse surnaturelle et ignorez les blessures superficielles.", - "buff.title.hastened": "Hâte", - "buff.desc.hastened": "Vos mouvements et vos attaques sont plus rapides.", - // Debuffs - "buff.title.bleed": "Saignement", - "buff.desc.bleed": "Inflige régulièrement des dommages.", - "buff.title.cursed": "Maudit", - "buff.desc.cursed": "Vous êtes maudit.", - "buff.title.burn": "En feu", - "buff.desc.burn": "Vous êtes en train de brûler vivant.", - "buff.title.crippled": "Estropie", - "buff.desc.crippled": "Vos mouvements sont ralentis suite à de graves blessures aux jambes.", - "buff.title.frozen": "Glacé(e)", - "buff.desc.frozen": "Vos mouvements et attaques sont ralentis.", - "buff.title.wet": "Trempé(e)", - "buff.desc.wet": "Le sol rejete vos pieds, rendant le fait de s'arrêter difficile.", - "buff.title.ensnared": "Piégé(e)", - "buff.desc.ensnared": "Des plantes grappantes s'attachent à vos jambes, restraignant vos mouvements.", - // Buffs stats - "buff.stat.health": "Restaure {str_total} points de vie", - "buff.stat.increase_max_energy": "Augmente la vigueur maximale de {strength}", - "buff.stat.increase_max_health": "Augmente la santé maximale de {strength}", - "buff.stat.invulnerability": "Rend invincible", - // Text - "buff.text.over_seconds": "pendant {dur_secs} secondes", - "buff.text.for_seconds": "pour {dur_secs} secondes", - "buff.text.every_second": "chaque seconde", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/char_selection.ftl b/assets/voxygen/i18n/fr_FR/char_selection.ftl new file mode 100644 index 0000000000..522deb183e --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Chargement des personnages... +char_selection-delete_permanently = Supprimer définitivement ce personnage ? +char_selection-deleting_character = Suppression du personnage... +char_selection-change_server = Changer de serveur +char_selection-enter_world = Rejoindre +char_selection-logout = Déconnexion +char_selection-create_new_character = Créer un nouveau personnage +char_selection-creating_character = Création du personnage... +char_selection-character_creation = Création de personnage +char_selection-human_default = Humain par défaut +char_selection-level_fmt = Niveau { $level_nb } +char_selection-uncanny_valley = Région sauvage +char_selection-plains_of_uncertainty = Plaines de l'Incertitude +char_selection-beard = Barbe +char_selection-hair_style = Coupe de cheveux +char_selection-hair_color = Couleur des cheveux +char_selection-eye_color = Couleur des yeux +char_selection-skin = Couleur de la peau +char_selection-eyeshape = Forme des yeux +char_selection-accessories = Accessoires +char_selection-create_info_name = Votre personnage doit avoir un nom ! +char_selection-version_mismatch = ATTENTION! Ce serveur fonctionne sur une version différente et est possiblement incompatible avec celle de votre jeu. Veuillez mettre à jour votre jeu s'il vous plaît. \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/char_selection.ron b/assets/voxygen/i18n/fr_FR/char_selection.ron deleted file mode 100644 index 0550903b10..0000000000 --- a/assets/voxygen/i18n/fr_FR/char_selection.ron +++ /dev/null @@ -1,34 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "char_selection.loading_characters": "Chargement des personnages...", - "char_selection.delete_permanently": "Supprimer définitivement ce personnage ?", - "char_selection.deleting_character": "Suppression du personnage...", - "char_selection.change_server": "Changer de serveur", - "char_selection.enter_world": "Rejoindre", - "char_selection.logout": "Déconnexion", - "char_selection.create_new_character": "Créer un nouveau personnage", - "char_selection.creating_character": "Création du personnage...", - "char_selection.character_creation": "Création de personnage", - - "char_selection.human_default": "Humain par défaut", - "char_selection.level_fmt": "Niveau {level_nb}", - "char_selection.uncanny_valley": "Région sauvage", - "char_selection.plains_of_uncertainty": "Plaines de l'Incertitude", - "char_selection.beard": "Barbe", - "char_selection.hair_style": "Coupe de cheveux", - "char_selection.hair_color": "Couleur des cheveux", - "char_selection.eye_color": "Couleur des yeux", - "char_selection.skin": "Couleur de la peau", - "char_selection.eyeshape": "Forme des yeux", - "char_selection.accessories": "Accessoires", - "char_selection.create_info_name": "Votre personnage doit avoir un nom !", - "char_selection.version_mismatch": "ATTENTION! Ce serveur fonctionne sur une version différente et est possiblement incompatible avec celle de votre jeu. Veuillez mettre à jour votre jeu s'il vous plaît.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/char_window.ftl b/assets/voxygen/i18n/fr_FR/char_window.ftl new file mode 100644 index 0000000000..6ece439be1 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Personnage +character_window-character_stats = + Endurance + + Force + + Volonté + + Protection \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/char_window.ron b/assets/voxygen/i18n/fr_FR/char_window.ron deleted file mode 100644 index 22eec776d7..0000000000 --- a/assets/voxygen/i18n/fr_FR/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "character_window.character_name": "Personnage", - // Character stats - "character_window.character_stats": r#"Endurance - -Force - -Volonté - -Protection -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/common.ftl b/assets/voxygen/i18n/fr_FR/common.ftl new file mode 100644 index 0000000000..76c5543289 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/common.ftl @@ -0,0 +1,104 @@ +common-username = Nom d'utilisateur +common-singleplayer = Solo +common-multiplayer = Multijoueur +common-servers = Serveurs +common-quit = Quitter +common-settings = Paramètres +common-languages = Langues +common-interface = Interface +common-gameplay = Gameplay +common-controls = Contrôles +common-video = Vidéo +common-sound = Audio +common-chat = Chat +common-resume = Reprendre +common-characters = Personnages +common-close = Fermer +common-yes = Oui +common-no = Non +common-back = Retour +common-create = Créer +common-okay = Compris +common-add = Ajouter +common-accept = Accepter +common-decline = Refuser +common-disclaimer = Avertissement +common-cancel = Annuler +common-none = Aucun +common-error = Erreur +common-fatal_error = Erreur Fatale +common-you = Toi +common-automatic = Auto +common-random = Aléatoire +common-empty = Vide +common-confirm = Confirmer +common-delete_server = Supprimer Serveur +common-interface_settings = Options de l'interface +common-gameplay_settings = Options de gameplay +common-controls_settings = Configuration clavier +common-video_settings = Options Vidéo +common-sound_settings = Options Audio +common-language_settings = Langage +common-chat_settings = Réglages Chat +common-connection_lost = + Connexion perdue ! + Le serveur a-t-il redémarré ? + Le client est-il à jour ? +common-species-orc = Orc +common-species-human = Humain +common-species-dwarf = Nain +common-species-elf = Elfe +common-species-draugr = Mort-vivant +common-species-danari = Danari +common-weapons-axe = Hâche +common-weapons-dagger = Dague +common-weapons-greatsword = Épée longue +common-weapons-shortswords = Épée courte +common-weapons-sword = Épée +common-weapons-staff = Bâton +common-weapons-bow = Arc +common-weapons-hammer = Marteau +common-weapons-general = Combat Général +common-weapons-sceptre = Sceptre +common-weapons-shield = Bouclier +common-weapons-spear = Lance +common-weapons-hammer_simple = Marteau Simple +common-weapons-sword_simple = Épée Simple +common-weapons-staff_simple = Bâton Simple +common-weapons-axe_simple = Hache Simple +common-weapons-bow_simple = Arc Simple +common-weapons-unique = Unique +common-tool-debug = Debug +common-tool-farming = Outil agricole +common-tool-pick = Pioche +common-tool-mining = Minage +common-kind-modular_component = Composant Modulaire +common-kind-glider = Planeur +common-kind-consumable = Consommable +common-kind-throwable = Peut être lancé +common-kind-utility = Utilitaire +common-kind-ingredient = Ingrédient +common-kind-lantern = Lanterne +common-hands-one = Une main +common-hands-two = Deux mains +common-rand_appearance = Apparence aléatoire +common-rand_name = Nom aléatoire +common-stats-combat_rating = CR +common-stats-power = Puissance +common-stats-speed = Vitesse +common-stats-poise = Impact +common-stats-crit_chance = Chance Crit +common-stats-crit_mult = Mult Crit +common-stats-armor = Armure +common-stats-poise_res = Res Impact +common-stats-energy_max = Énergie Max +common-stats-energy_reward = Energie Consommée +common-stats-crit_power = Dégâts Crit +common-stats-stealth = Furtivité +common-stats-slots = Emplacements +common-material-metal = Métal +common-material-wood = Bois +common-material-stone = Pierre +common-material-cloth = Tissu +common-material-hide = Peau +common-sprite-chest = Plastron \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/common.ron b/assets/voxygen/i18n/fr_FR/common.ron deleted file mode 100644 index d659bd3c1f..0000000000 --- a/assets/voxygen/i18n/fr_FR/common.ron +++ /dev/null @@ -1,125 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "common.username": "Nom d'utilisateur", - "common.singleplayer": "Solo", - "common.multiplayer": "Multijoueur", - "common.servers": "Serveurs", - "common.quit": "Quitter", - "common.settings": "Paramètres", - "common.languages": "Langues", - "common.interface": "Interface", - "common.gameplay": "Gameplay", - "common.controls": "Contrôles", - "common.video": "Vidéo", - "common.sound": "Audio", - "common.chat": "Chat", - "common.resume": "Reprendre", - "common.characters": "Personnages", - "common.close": "Fermer", - "common.yes": "Oui", - "common.no": "Non", - "common.back": "Retour", - "common.create": "Créer", - "common.okay": "Compris", - "common.add": "Ajouter", - "common.accept": "Accepter", - "common.decline": "Refuser", - "common.disclaimer": "Avertissement", - "common.cancel": "Annuler", - "common.none": "Aucun", - "common.error": "Erreur", - "common.fatal_error": "Erreur Fatale", - "common.you": "Toi", - "common.automatic": "Auto", - "common.random": "Aléatoire", - "common.empty": "Vide", - "common.confirm": "Confirmer", - "common.delete_server": "Supprimer Serveur", - - // Settings Window title - "common.interface_settings": "Options de l'interface", - "common.gameplay_settings": "Options de gameplay", - "common.controls_settings": "Configuration clavier", - "common.video_settings": "Options Vidéo", - "common.sound_settings": "Options Audio", - "common.language_settings": "Langage", - "common.chat_settings": "Réglages Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"Connexion perdue ! -Le serveur a-t-il redémarré ? -Le client est-il à jour ?"#, - - - "common.species.orc": "Orc", - "common.species.human": "Humain", - "common.species.dwarf": "Nain", - "common.species.elf": "Elfe", - "common.species.draugr": "Mort-vivant", - "common.species.danari": "Danari", - - "common.weapons.axe": "Hâche", - "common.weapons.dagger": "Dague", - "common.weapons.greatsword": "Épée longue", - "common.weapons.shortswords": "Épée courte", - "common.weapons.sword": "Épée", - "common.weapons.staff": "Bâton", - "common.weapons.bow": "Arc", - "common.weapons.hammer": "Marteau", - "common.weapons.general": "Combat Général", - "common.weapons.sceptre": "Sceptre", - "common.weapons.shield": "Bouclier", - "common.weapons.spear": "Lance", - "common.weapons.hammer_simple": "Marteau Simple", - "common.weapons.sword_simple": "Épée Simple", - "common.weapons.staff_simple": "Bâton Simple", - "common.weapons.axe_simple": "Hache Simple", - "common.weapons.bow_simple": "Arc Simple", - "common.weapons.unique": "Unique", - "common.tool.debug": "Debug", - "common.tool.farming": "Outil agricole", - "common.tool.pick": "Pioche", - "common.tool.mining": "Minage", - "common.kind.modular_component": "Composant Modulaire", - "common.kind.glider": "Planeur", - "common.kind.consumable": "Consommable", - "common.kind.throwable": "Peut être lancé", - "common.kind.utility": "Utilitaire", - "common.kind.ingredient": "Ingrédient", - "common.kind.lantern": "Lanterne", - "common.hands.one": "Une main", - "common.hands.two": "Deux mains", - - "common.rand_appearance": "Apparence aléatoire", - "common.rand_name": "Nom aléatoire", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Puissance", - "common.stats.speed": "Vitesse", - "common.stats.poise": "Impact", - "common.stats.crit_chance": "Chance Crit", - "common.stats.crit_mult": "Mult Crit", - "common.stats.armor": "Armure", - "common.stats.poise_res": "Res Impact", - "common.stats.energy_max": "Énergie Max", - "common.stats.energy_reward": "Energie Consommée", - "common.stats.crit_power": "Dégâts Crit", - "common.stats.stealth": "Furtivité", - "common.stats.slots": "Emplacements", - - "common.material.metal": "Métal", - "common.material.wood": "Bois", - "common.material.stone": "Pierre", - "common.material.cloth": "Tissu", - "common.material.hide": "Peau", - - "common.sprite.chest": "Plastron", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/esc_menu.ftl b/assets/voxygen/i18n/fr_FR/esc_menu.ftl new file mode 100644 index 0000000000..f32975b2f8 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Déconnexion +esc_menu-quit_game = Quitter le jeu \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/esc_menu.ron b/assets/voxygen/i18n/fr_FR/esc_menu.ron deleted file mode 100644 index 988db53038..0000000000 --- a/assets/voxygen/i18n/fr_FR/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "esc_menu.logout": "Déconnexion", - "esc_menu.quit_game": "Quitter le jeu", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/gameinput.ftl b/assets/voxygen/i18n/fr_FR/gameinput.ftl new file mode 100644 index 0000000000..106c2a975e --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Attaque Basique +gameinput-secondary = Attaque Secondaire/Bloquer/Viser +gameinput-block = Parer +gameinput-slot1 = Emplacement rapide 1 +gameinput-slot2 = Emplacement rapide 2 +gameinput-slot3 = Emplacement rapide 3 +gameinput-slot4 = Emplacement rapide 4 +gameinput-slot5 = Emplacement rapide 5 +gameinput-slot6 = Emplacement rapide 6 +gameinput-slot7 = Emplacement rapide 7 +gameinput-slot8 = Emplacement rapide 8 +gameinput-slot9 = Emplacement rapide 9 +gameinput-slot10 = Emplacement rapide 10 +gameinput-swaploadout = Échanger l'équipement +gameinput-togglecursor = Activer/Desactiver Curseur +gameinput-help = Activer/Desactiver Fenêtre d'aide +gameinput-toggleinterface = Activer/Desactiver Interface +gameinput-toggledebug = Activer/Désactiver FPS et Infos Débogage +gameinput-toggle_egui_debug = Activer EGUI Info Debogage +gameinput-togglechat = Activer Chat +gameinput-screenshot = Prendre une capture d'écran +gameinput-toggleingameui = Activer/Desactiver Noms de joueurs +gameinput-fullscreen = Activer/Desactiver Plein Ecran +gameinput-moveforward = Avancer +gameinput-moveleft = Aller à Gauche +gameinput-moveright = Aller à Droite +gameinput-moveback = Reculer +gameinput-jump = Sauter +gameinput-glide = Planeur +gameinput-roll = Rouler +gameinput-climb = Grimper +gameinput-climbdown = Descendre +gameinput-wallleap = Saut Mural +gameinput-togglelantern = Activer/Désactiver Lanterne +gameinput-mount = Monture +gameinput-chat = Tchat +gameinput-command = Commande +gameinput-escape = Menu principal/Fermer menu +gameinput-map = Carte +gameinput-bag = Sac +gameinput-trade = Échanger +gameinput-social = Social +gameinput-sit = S'asseoir +gameinput-spellbook = Sorts +gameinput-settings = Paramètres +gameinput-respawn = Réapparaître +gameinput-charge = Charger +gameinput-togglewield = Ranger Arme +gameinput-interact = Interagir +gameinput-freelook = Vue Libre +gameinput-autowalk = Marche Automatique +gameinput-cameraclamp = Verrouillage vertical de la caméra +gameinput-dance = Danser +gameinput-select = Sélectionner une Entité +gameinput-acceptgroupinvite = Accepter l'invitation de groupe +gameinput-declinegroupinvite = Décliner l'invitation de groupe +gameinput-cyclecamera = Changer la Caméra +gameinput-crafting = Artisanat +gameinput-fly = Voler +gameinput-sneak = S'accroupir +gameinput-swimdown = Nager vers le bas +gameinput-swimup = Nager vers le haut +gameinput-mapzoomin = Augmenter le zoom de la Carte +gameinput-mapzoomout = Réduire le zoom de la Carte +gameinput-greet = Saluer +gameinput-map-locationmarkerbutton = Ajouter un marqueur sur la Carte \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/gameinput.ron b/assets/voxygen/i18n/fr_FR/gameinput.ron deleted file mode 100644 index 7e788958c3..0000000000 --- a/assets/voxygen/i18n/fr_FR/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "gameinput.primary": "Attaque Basique", - "gameinput.secondary": "Attaque Secondaire/Bloquer/Viser", - "gameinput.block": "Parer", - "gameinput.slot1": "Emplacement rapide 1", - "gameinput.slot2": "Emplacement rapide 2", - "gameinput.slot3": "Emplacement rapide 3", - "gameinput.slot4": "Emplacement rapide 4", - "gameinput.slot5": "Emplacement rapide 5", - "gameinput.slot6": "Emplacement rapide 6", - "gameinput.slot7": "Emplacement rapide 7", - "gameinput.slot8": "Emplacement rapide 8", - "gameinput.slot9": "Emplacement rapide 9", - "gameinput.slot10": "Emplacement rapide 10", - "gameinput.swaploadout": "Échanger l'équipement", - "gameinput.togglecursor": "Activer/Desactiver Curseur", - "gameinput.help": "Activer/Desactiver Fenêtre d'aide", - "gameinput.toggleinterface": "Activer/Desactiver Interface", - "gameinput.toggledebug": "Activer/Désactiver FPS et Infos Débogage", - "gameinput.toggle_egui_debug": "Activer EGUI Info Debogage", - "gameinput.togglechat": "Activer Chat", - "gameinput.screenshot": "Prendre une capture d'écran", - "gameinput.toggleingameui": "Activer/Desactiver Noms de joueurs", - "gameinput.fullscreen": "Activer/Desactiver Plein Ecran", - "gameinput.moveforward": "Avancer", - "gameinput.moveleft": "Aller à Gauche", - "gameinput.moveright": "Aller à Droite", - "gameinput.moveback": "Reculer", - "gameinput.jump": "Sauter", - "gameinput.glide": "Planeur", - "gameinput.roll": "Rouler", - "gameinput.climb": "Grimper", - "gameinput.climbdown": "Descendre", - "gameinput.wallleap": "Saut Mural", - "gameinput.togglelantern": "Activer/Désactiver Lanterne", - "gameinput.mount": "Monture", - "gameinput.chat": "Tchat", - "gameinput.command": "Commande", - "gameinput.escape": "Menu principal/Fermer menu", - "gameinput.map": "Carte", - "gameinput.bag": "Sac", - "gameinput.trade": "Échanger", - "gameinput.social": "Social", - "gameinput.sit": "S'asseoir", - "gameinput.spellbook": "Sorts", - "gameinput.settings": "Paramètres", - "gameinput.respawn": "Réapparaître", - "gameinput.charge": "Charger", - "gameinput.togglewield": "Ranger Arme", - "gameinput.interact": "Interagir", - "gameinput.freelook": "Vue Libre", - "gameinput.autowalk": "Marche Automatique", - "gameinput.cameraclamp": "Verrouillage vertical de la caméra", - "gameinput.dance": "Danser", - "gameinput.select": "Sélectionner une Entité", - "gameinput.acceptgroupinvite": "Accepter l'invitation de groupe", - "gameinput.declinegroupinvite": "Décliner l'invitation de groupe", - "gameinput.cyclecamera": "Changer la Caméra", - "gameinput.crafting": "Artisanat", - "gameinput.fly": "Voler", - "gameinput.sneak": "S'accroupir", - "gameinput.swimdown": "Nager vers le bas", - "gameinput.swimup": "Nager vers le haut", - "gameinput.mapzoomin": "Augmenter le zoom de la Carte", - "gameinput.mapzoomout": "Réduire le zoom de la Carte", - "gameinput.greet": "Saluer", - "gameinput.map.locationmarkerbutton": "Ajouter un marqueur sur la Carte" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/bag.ftl b/assets/voxygen/i18n/fr_FR/hud/bag.ftl new file mode 100644 index 0000000000..29f6177d01 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Inventaire de { $playername } +hud-bag-stats_title = Attributs de { $playername } +hud-bag-exp = Exp +hud-bag-armor = Armure +hud-bag-stats = Attributs +hud-bag-head = Tête +hud-bag-neck = Cou +hud-bag-tabard = Tabard +hud-bag-shoulders = Épaules +hud-bag-chest = Torse +hud-bag-hands = Mains +hud-bag-lantern = Lanterne +hud-bag-glider = Planeur +hud-bag-belt = Ceinture +hud-bag-ring = Bague +hud-bag-back = Dos +hud-bag-legs = Jambes +hud-bag-feet = Pieds +hud-bag-mainhand = Main Dominante +hud-bag-offhand = Main Secondaire +hud-bag-inactive_mainhand = Main Dominante Inactive +hud-bag-inactive_offhand = Main Secondaire Inactive +hud-bag-swap_equipped_weapons_title = Échanger armes équipées +hud-bag-swap_equipped_weapons_desc = Appuyez sur { $key } +hud-bag-bag = Sac +hud-bag-health = Santé +hud-bag-energy = Vigueur +hud-bag-combat_rating = Niveau de Combat +hud-bag-protection = Protection +hud-bag-stun_res = Résistance aux étourdissements +hud-bag-combat_rating_desc = + Calculé depuis votre + équipement et votre santé +hud-bag-protection_desc = Réduction des dégats de votre armure +hud-bag-stun_res_desc = + Résistance contre les effets d'étourdissements après plusieurs coups reçu. + Se régénère tout comme l'énergie. +hud-bag-sort_by_name = Trier par Nom +hud-bag-sort_by_quality = Trier par Qualité +hud-bag-sort_by_category = Trier par Catégorie \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/bag.ron b/assets/voxygen/i18n/fr_FR/hud/bag.ron deleted file mode 100644 index f9f35ee922..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Inventaire - "hud.bag.inventory": "Inventaire de {playername}", - "hud.bag.stats_title": "Attributs de {playername}", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armure", - "hud.bag.stats": "Attributs", - "hud.bag.head": "Tête", - "hud.bag.neck": "Cou", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Épaules", - "hud.bag.chest": "Torse", - "hud.bag.hands": "Mains", - "hud.bag.lantern": "Lanterne", - "hud.bag.glider": "Planeur", - "hud.bag.belt": "Ceinture", - "hud.bag.ring": "Bague", - "hud.bag.back": "Dos", - "hud.bag.legs": "Jambes", - "hud.bag.feet": "Pieds", - "hud.bag.mainhand": "Main Dominante", - "hud.bag.offhand": "Main Secondaire", - "hud.bag.inactive_mainhand": "Main Dominante Inactive", - "hud.bag.inactive_offhand": "Main Secondaire Inactive", - "hud.bag.swap_equipped_weapons_title": "Échanger armes équipées", - "hud.bag.swap_equipped_weapons_desc": "Appuyez sur {key}", - "hud.bag.bag": "Sac", - "hud.bag.health": "Santé", - "hud.bag.energy": "Vigueur", - "hud.bag.combat_rating": "Niveau de Combat", - "hud.bag.protection": "Protection", - "hud.bag.stun_res": "Résistance aux étourdissements", - "hud.bag.combat_rating_desc": "Calculé depuis votre\néquipement et votre santé", - "hud.bag.protection_desc": "Réduction des dégats de votre armure", - "hud.bag.stun_res_desc": "Résistance contre les effets d'étourdissements après plusieurs coups reçu.\nSe régénère tout comme l'énergie.", - "hud.bag.sort_by_name": "Trier par Nom", - "hud.bag.sort_by_quality": "Trier par Qualité", - "hud.bag.sort_by_category": "Trier par Catégorie", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/chat.ftl b/assets/voxygen/i18n/fr_FR/hud/chat.ftl new file mode 100644 index 0000000000..56bae0f761 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Global +hud-chat-chat_tab_hover_tooltip = Clique Droit pour ouvrir les paramètres +hud-outcome-burning = Mort: brûlé(e) +hud-outcome-curse = Mort: malédiction +hud-outcome-bleeding = Mort: saignement +hud-outcome-crippled = Mort: estropié(e) +hud-outcome-frozen = Mort: glacé(e) +hud-chat-online_msg = [{ $name }] est maintenant en ligne. +hud-chat-offline_msg = [{ $name }] s'est déconnecté. +hud-chat-default_death_msg = [{ $name }] est mort +hud-chat-environmental_kill_msg = [{ $name }] est mort dans { $environment } +hud-chat-fall_kill_msg = [{ $name }] est mort de dégâts de chute +hud-chat-suicide_msg = [{ $name }] est mort des suites de ses propres blessures +hud-chat-died_of_pvp_buff_msg = [{ $victim }] est mort de{ $died_of_buff } causé par [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] a tué [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] a tiré sur [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] a explosé [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] a tué [{ $victim }] avec de la magie +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] est mort de { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] est mort de { $died_of_buff } causé par { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } a tué [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } a tiré sur [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } a fait exploser [{ $victim }] +hud-chat-npc_energy_kill_msg = [{ $attacker }] a tué [{ $victim }] avec de la magie +hud-chat-npc_other_kill_msg = [{ $attacker }] a tué [{ $victim }] +hud-chat-loot_msg = Vous avez ramassé [{ $item }] +hud-chat-loot_fail = Votre inventaire est plein ! +hud-chat-goodbye = Au revoir! +hud-chat-connection_lost = Connexion perdue. Expulsion dans { $time } secondes. \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/chat.ron b/assets/voxygen/i18n/fr_FR/hud/chat.ron deleted file mode 100644 index fae52eb305..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/chat.ron +++ /dev/null @@ -1,50 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.chat.all": "Global", - "hud.chat.chat_tab_hover_tooltip": "Clique Droit pour ouvrir les paramètres", - - // Annonce de Debuff - "hud.outcome.burning": "Mort: brûlé(e)", - "hud.outcome.curse": "Mort: malédiction", - "hud.outcome.bleeding": "Mort: saignement", - "hud.outcome.crippled": "Mort: estropié(e)", - "hud.outcome.frozen": "Mort: glacé(e)", - - // Sorties Tchat - "hud.chat.online_msg": "[{name}] est maintenant en ligne.", - "hud.chat.offline_msg": "[{name}] s'est déconnecté.", - - "hud.chat.default_death_msg": "[{name}] est mort", - "hud.chat.environmental_kill_msg": "[{name}] est mort dans {environment}", - "hud.chat.fall_kill_msg": "[{name}] est mort de dégâts de chute", - "hud.chat.suicide_msg": "[{name}] est mort des suites de ses propres blessures", - - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] est mort de{died_of_buff} causé par [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] a tué [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] a tiré sur [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] a explosé [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] a tué [{victim}] avec de la magie", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] est mort de {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] est mort de {died_of_buff} causé par {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} a tué [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} a tiré sur [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} a fait exploser [{victim}]", - "hud.chat.npc_energy_kill_msg": "[{attacker}] a tué [{victim}] avec de la magie", - "hud.chat.npc_other_kill_msg": "[{attacker}] a tué [{victim}]", - - "hud.chat.loot_msg": "Vous avez ramassé [{item}]", - "hud.chat.loot_fail": "Votre inventaire est plein !", - "hud.chat.goodbye": "Au revoir!", - "hud.chat.connection_lost": "Connexion perdue. Expulsion dans {time} secondes.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/crafting.ftl b/assets/voxygen/i18n/fr_FR/hud/crafting.ftl new file mode 100644 index 0000000000..3fc546d361 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/crafting.ftl @@ -0,0 +1,33 @@ +hud-crafting = Fabrication +hud-crafting-recipes = Recettes +hud-crafting-ingredients = Ingrédients : +hud-crafting-craft = Fabriquer +hud-crafting-tool_cata = Nécessite : +hud-crafting-req_crafting_station = Nécessite: +hud-crafting-anvil = Enclume +hud-crafting-cauldron = Chaudron +hud-crafting-cooking_pot = Marmite +hud-crafting-crafting_bench = Établi +hud-crafting-forge = Forge +hud-crafting-loom = Métier à tisser +hud-crafting-spinning_wheel = Rouet +hud-crafting-tanning_rack = Chevalet de tannage +hud-crafting-salvaging_station = Table d'extraction +hud-crafting-campfire = Feu de camp +hud-crafting-tabs-all = Global +hud-crafting-tabs-armor = Armure +hud-crafting-tabs-dismantle = Démanteler +hud-crafting-tabs-food = Nourriture +hud-crafting-tabs-glider = Planeur +hud-crafting-tabs-potion = Potions +hud-crafting-tabs-tool = Outils +hud-crafting-tabs-utility = Utilitaires +hud-crafting-tabs-weapon = Armes +hud-crafting-tabs-bag = Sacs +hud-crafting-tabs-processed_material = Matériaux +hud-crafting-dismantle_title = Démantelage +hud-crafting-dismantle_explanation = + Survoler un objet dans votre sac pour pouvoir voir + ce que vous pouvez récupérer. + + Double-Clique pour pouvoir le démanteler. \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/crafting.ron b/assets/voxygen/i18n/fr_FR/hud/crafting.ron deleted file mode 100644 index 3e9bfa2751..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.crafting": "Fabrication", - "hud.crafting.recipes": "Recettes", - "hud.crafting.ingredients": "Ingrédients :", - "hud.crafting.craft": "Fabriquer", - "hud.crafting.tool_cata": "Nécessite :", - // Station de fabrication - "hud.crafting.req_crafting_station": "Nécessite:", - "hud.crafting.anvil": "Enclume", - "hud.crafting.cauldron": "Chaudron", - "hud.crafting.cooking_pot": "Marmite", - "hud.crafting.crafting_bench": "Établi", - "hud.crafting.forge": "Forge", - "hud.crafting.loom": "Métier à tisser", - "hud.crafting.spinning_wheel": "Rouet", - "hud.crafting.tanning_rack": "Chevalet de tannage", - "hud.crafting.salvaging_station": "Table d'extraction", - "hud.crafting.campfire": "Feu de camp", - // Tabs - "hud.crafting.tabs.all": "Global", - "hud.crafting.tabs.armor": "Armure", - "hud.crafting.tabs.dismantle": "Démanteler", - "hud.crafting.tabs.food": "Nourriture", - "hud.crafting.tabs.glider": "Planeur", - "hud.crafting.tabs.potion": "Potions", - "hud.crafting.tabs.tool": "Outils", - "hud.crafting.tabs.utility": "Utilitaires", - "hud.crafting.tabs.weapon": "Armes", - "hud.crafting.tabs.bag": "Sacs", - "hud.crafting.tabs.processed_material": "Matériaux", - "hud.crafting.dismantle_title": "Démantelage", - "hud.crafting.dismantle_explanation" : "Survoler un objet dans votre sac pour pouvoir voir\nce que vous pouvez récupérer.\n\nDouble-Clique pour pouvoir le démanteler.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/group.ftl b/assets/voxygen/i18n/fr_FR/hud/group.ftl new file mode 100644 index 0000000000..80112671d3 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Groupe +hud-group-invite_to_join = { $name } vous a invité dans son groupe ! +hud-group-invite_to_trade = [{ $name }] souhaiterait faire un échange avec vous ! +hud-group-invite = Inviter +hud-group-kick = Exclure +hud-group-assign_leader = Assigner un Chef +hud-group-leave = Quitter le Groupe +hud-group-dead = Mort +hud-group-out_of_range = Hors de portée +hud-group-add_friend = Ajouter aux Amis +hud-group-link_group = Lier le Groupe +hud-group-in_menu = Dans les Menus +hud-group-members = Membres du groupe \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/group.ron b/assets/voxygen/i18n/fr_FR/hud/group.ron deleted file mode 100644 index 06ad431eb9..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.group": "Groupe", - "hud.group.invite_to_join": "{name} vous a invité dans son groupe !", - "hud.group.invite_to_trade": "[{name}] souhaiterait faire un échange avec vous !", - "hud.group.invite": "Inviter", - "hud.group.kick": "Exclure", - "hud.group.assign_leader": "Assigner un Chef", - "hud.group.leave": "Quitter le Groupe", - "hud.group.dead" : "Mort", - "hud.group.out_of_range": "Hors de portée", - "hud.group.add_friend": "Ajouter aux Amis", - "hud.group.link_group": "Lier le Groupe", - "hud.group.in_menu": "Dans les Menus", - "hud.group.members": "Membres du groupe", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/map.ftl b/assets/voxygen/i18n/fr_FR/hud/map.ftl new file mode 100644 index 0000000000..b9bdc76c96 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/map.ftl @@ -0,0 +1,34 @@ +hud-map-map_title = Carte +hud-map-qlog_title = Quêtes +hud-map-topo_map = Topographique +hud-map-difficulty = Difficulté +hud-map-towns = Villes +hud-map-castles = Châteaux +hud-map-dungeons = Donjons +hud-map-caves = Cavernes +hud-map-cave = Caverne +hud-map-peaks = Montagnes +hud-map-biomes = Biomes +hud-map-voxel_map = carte Voxel +hud-map-trees = Arbres Géants +hud-map-tree = Arbre Géant +hud-map-town = Ville +hud-map-castle = Château +hud-map-dungeon = Donjon +hud-map-difficulty_dungeon = + Difficulté + + du Donjon: { $difficulty } +hud-map-drag = Déplacer +hud-map-zoom = Zoomer +hud-map-mid_click = Ajouter un repère +hud-map-recenter = Recentrer +hud-map-marked_location = Endroit marqué +hud-map-marked_location_remove = Cliquer pour retirer +hud-map-change_map_mode = Changer le mode de la Carte +hud-map-toggle_minimap_voxel = Zoom sur la mini-carte Voxel +hud-map-zoom_minimap_explanation = + Zoom sur la mini-carte afin + de voir plus précisément la zone alentour +hud-map-gnarling = Gnarling Fortification +hud-map-placed_by = Ajouté par { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/map.ron b/assets/voxygen/i18n/fr_FR/hud/map.ron deleted file mode 100644 index b765f97c0e..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Carte et journal de quetes - "hud.map.map_title": "Carte", - "hud.map.qlog_title": "Quêtes", - "hud.map.topo_map": "Topographique", - "hud.map.difficulty": "Difficulté", - "hud.map.towns": "Villes", - "hud.map.castles": "Châteaux", - "hud.map.dungeons": "Donjons", - "hud.map.caves": "Cavernes", - "hud.map.cave": "Caverne", - "hud.map.peaks": "Montagnes", - "hud.map.biomes": "Biomes", - "hud.map.voxel_map": "carte Voxel", - "hud.map.trees": "Arbres Géants", - "hud.map.tree": "Arbre Géant", - "hud.map.town": "Ville", - "hud.map.castle": "Château", - "hud.map.dungeon": "Donjon", - "hud.map.difficulty_dungeon": "Difficulté\n\ndu Donjon: {difficulty}", - "hud.map.drag": "Déplacer", - "hud.map.zoom": "Zoomer", - "hud.map.mid_click": "Ajouter un repère", - "hud.map.recenter": "Recentrer", - "hud.map.marked_location": "Endroit marqué", - "hud.map.marked_location_remove": "Cliquer pour retirer", - "hud.map.change_map_mode": "Changer le mode de la Carte", - "hud.map.toggle_minimap_voxel": "Zoom sur la mini-carte Voxel", - "hud.map.zoom_minimap_explanation": "Zoom sur la mini-carte afin\nde voir plus précisément la zone alentour", - "hud.map.gnarling": "Gnarling Fortification", - "hud.map.placed_by": "Ajouté par {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/misc.ftl b/assets/voxygen/i18n/fr_FR/hud/misc.ftl new file mode 100644 index 0000000000..08ba3bf1e6 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = Ne pas afficher au démarage +hud-show_tips = Voir les astuces +hud-quests = Quêtes +hud-you_died = Vous êtes mort +hud-waypoint_saved = Point de Repère Sauvegardé +hud-sp_arrow_txt = PC +hud-inventory_full = Inventaire plein +hud-press_key_to_show_keybindings_fmt = [{ $key }] Contrôles +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lanterne +hud-press_key_to_show_debug_info_fmt = Appuyer sur { $key } pour afficher les informations de débogage +hud-press_key_to_toggle_keybindings_fmt = Appuyer sur { $key } pour afficher les contrôles +hud-press_key_to_toggle_debug_info_fmt = Appuyer sur { $key } pour activer les informations de débogage +hud-press_key_to_respawn = Appuyez sur { $key } pour réapparaitre au dernier feu de camp visité +hud-tutorial_btn = Tutoriel +hud-tutorial_click_here = Appuyez sur [ { $key } ] pour libérer votre souris et cliquez sur ce bouton! +hud-tutorial_elements = Artisanat +hud-temp_quest_headline = Salutations, Voyageur ! +hud-temp_quest_text = + Pour commencer votre voyage, vous pourriez commencer à chercher dans ce village et rassembler quelques provisions. + + Vous êtes invités à prendre tout ce dont vous avez besoin pour votre voyage ! + + Regardez en bas à droite de l'écran pour trouver diverses choses comme votre sac, le menu d'artisanat et la carte. + + Le menu d'artisanat vous permet de créer des armures, des armes, de la nourriture et bien plus encore ! + + Les animaux sauvages tout autour de la ville sont une excellente source de Chutes de Cuir pour créer une protection contre les dangers du monde. + + Dès que vous vous sentez prêt, essayez d'obtenir un équipement encore meilleur grâce aux nombreux défis marqués sur votre carte ! +hud-spell = Sorts +hud-diary = Journal +hud-free_look_indicator = Vue libre active, Pressez { $key } pour la désactiver. +hud-camera_clamp_indicator = Verrouillage vertical de la caméra active. Pressez { $key } pour la désactiver. +hud-auto_walk_indicator = Marche automatique active +hud-collect = Collecter +hud-pick_up = Ramasser +hud-open = Ouvrir +hud-use = Utiliser +hud-mine = Miner +hud-talk = Parler +hud-trade = Échanger +hud-mount = Chevaucher +hud-sit = S'assoir \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/misc.ron b/assets/voxygen/i18n/fr_FR/hud/misc.ron deleted file mode 100644 index bdb26f0f86..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.do_not_show_on_startup": "Ne pas afficher au démarage", - "hud.show_tips": "Voir les astuces", - "hud.quests": "Quêtes", - "hud.you_died": "Vous êtes mort", - "hud.waypoint_saved": "Point de Repère Sauvegardé", - "hud.sp_arrow_txt": "PC", - "hud.inventory_full": "Inventaire plein", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Contrôles", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lanterne", - "hud.press_key_to_show_debug_info_fmt": "Appuyer sur {key} pour afficher les informations de débogage", - "hud.press_key_to_toggle_keybindings_fmt": "Appuyer sur {key} pour afficher les contrôles", - "hud.press_key_to_toggle_debug_info_fmt": "Appuyer sur {key} pour activer les informations de débogage", - - // Respawn message - "hud.press_key_to_respawn": r#"Appuyez sur {key} pour réapparaitre au dernier feu de camp visité"#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutoriel"#, - "hud.tutorial_click_here": r#"Appuyez sur [ {key} ] pour libérer votre souris et cliquez sur ce bouton!"#, - "hud.tutorial_elements": r#"Artisanat"#, - -"hud.temp_quest_headline": r#"Salutations, Voyageur !"#, -"hud.temp_quest_text": r#"Pour commencer votre voyage, vous pourriez commencer à chercher dans ce village et rassembler quelques provisions. - -Vous êtes invités à prendre tout ce dont vous avez besoin pour votre voyage ! - -Regardez en bas à droite de l'écran pour trouver diverses choses comme votre sac, le menu d'artisanat et la carte. - -Le menu d'artisanat vous permet de créer des armures, des armes, de la nourriture et bien plus encore ! - -Les animaux sauvages tout autour de la ville sont une excellente source de Chutes de Cuir pour créer une protection contre les dangers du monde. - -Dès que vous vous sentez prêt, essayez d'obtenir un équipement encore meilleur grâce aux nombreux défis marqués sur votre carte ! -"#, - - "hud.spell": "Sorts", - // Diary - "hud.diary": "Journal", - - "hud.free_look_indicator": "Vue libre active, Pressez {key} pour la désactiver.", - "hud.camera_clamp_indicator": "Verrouillage vertical de la caméra active. Pressez {key} pour la désactiver.", - "hud.auto_walk_indicator": "Marche automatique active", - "hud.collect": "Collecter", - "hud.pick_up": "Ramasser", - "hud.open": "Ouvrir", - "hud.use": "Utiliser", - "hud.mine": "Miner", - "hud.talk": "Parler", - "hud.trade": "Échanger", - "hud.mount": "Chevaucher", - "hud.sit": "S'assoir", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/sct.ftl b/assets/voxygen/i18n/fr_FR/hud/sct.ftl new file mode 100644 index 0000000000..839ac2f6ae --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOQUÉ \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/sct.ron b/assets/voxygen/i18n/fr_FR/hud/sct.ron deleted file mode 100644 index a2535fcd5b..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Sorties SCT - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOQUÉ", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/settings.ftl b/assets/voxygen/i18n/fr_FR/hud/settings.ftl new file mode 100644 index 0000000000..f91cab8d32 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/settings.ftl @@ -0,0 +1,123 @@ +hud-settings-general = Général +hud-settings-none = Aucun +hud-settings-press_behavior-toggle = Activer/Désactiver +hud-settings-press_behavior-hold = Maintenir +hud-settings-help_window = Fenêtre d'aide +hud-settings-debug_info = Information de débogage +hud-settings-show_hitboxes = Montrer les hitboxes +hud-settings-show_chat = Montrer le chat +hud-settings-show_hotkey_hints = Montrer les aides aux touches +hud-settings-tips_on_startup = Astuces au démarrage +hud-settings-ui_scale = Échelle de l'interface +hud-settings-relative_scaling = Echelle relative +hud-settings-custom_scaling = Echelle personalisée +hud-settings-crosshair = Réticule +hud-settings-opacity = Transparence +hud-settings-hotbar = Barre d'action +hud-settings-toggle_shortcuts = Activer les raccourcis +hud-settings-buffs_skillbar = Effets sur la barre de compétences +hud-settings-buffs_mmap = Effets sur la minimap +hud-settings-toggle_bar_experience = Activer la barre d'expérience +hud-settings-scrolling_combat_text = Dégats de combat +hud-settings-incoming_damage = Dégats reçus +hud-settings-speech_bubble = Bulle de dialogue +hud-settings-speech_bubble_self = Montrer ses propres bulles de dialogue +hud-settings-speech_bubble_dark_mode = Bulle de dialogue Mode Sombre +hud-settings-speech_bubble_icon = Icône Bulle de dialogue +hud-settings-energybar_numbers = Nombre des barres d'energie +hud-settings-always_show_bars = Toujours montrer les barres d'énergie +hud-settings-values = Valeurs +hud-settings-percentages = Pourcentages +hud-settings-chat = Tchat +hud-settings-background_opacity = Transparence de l'arrière-plan +hud-settings-chat_character_name = Noms des personnages dans le tchat +hud-settings-loading_tips = Astuces sur l'écran de chargement +hud-settings-reset_interface = Restaurer par Défaut +hud-settings-pan_sensitivity = Sensibilité de la souris +hud-settings-zoom_sensitivity = Sensibilité du zoom +hud-settings-camera_clamp_angle = Angle pour le mode Verrouillage Caméra +hud-settings-invert_scroll_zoom = Inverser la molette +hud-settings-invert_mouse_y_axis = Inverser l'axe Y de la souris +hud-settings-invert_controller_y_axis = Inverser l'axe Y de la manette +hud-settings-enable_mouse_smoothing = Lissage de la Caméra +hud-settings-free_look_behavior = Comportement Vue libre +hud-settings-auto_walk_behavior = Comportement Marche Automatique +hud-settings-camera_clamp_behavior = Comportement Verrouillage Caméra +hud-settings-player_physics_behavior = Physique des joueurs (expérimental) +hud-settings-stop_auto_walk_on_input = Arrêt marche-auto si mouvement +hud-settings-auto_camera = Caméra automatique +hud-settings-reset_gameplay = Restaurer par Défaut +hud-settings-view_distance = Distance d'affichage +hud-settings-sprites_view_distance = Distance d'affichage des sprites +hud-settings-figures_view_distance = Distance d'affichage des entités +hud-settings-maximum_fps = Limite FPS +hud-settings-background_fps = FPS en arrière-plan +hud-settings-present_mode = VSync +hud-settings-present_mode-fifo = Vsync limitée +hud-settings-present_mode-mailbox = Vsync max +hud-settings-present_mode-immediate = Vsync désactivée +hud-settings-fov = Champ de vision (degrés) +hud-settings-gamma = Gamma +hud-settings-exposure = Exposition +hud-settings-ambiance = Luminosité ambiante +hud-settings-antialiasing_mode = Mode anticrénelage +hud-settings-upscale_factor = Niveau d'échantillonage +hud-settings-cloud_rendering_mode = Rendu des nuages +hud-settings-fluid_rendering_mode = Rendu des fluides +hud-settings-fluid_rendering_mode-cheap = Rapide +hud-settings-fluid_rendering_mode-shiny = Qualitatif +hud-settings-cloud_rendering_mode-minimal = Minimum +hud-settings-cloud_rendering_mode-low = Bas +hud-settings-cloud_rendering_mode-medium = Moyen +hud-settings-cloud_rendering_mode-high = Élevé +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Plein écran +hud-settings-fullscreen_mode = Mode de plein écran +hud-settings-fullscreen_mode-exclusive = Exclusif +hud-settings-fullscreen_mode-borderless = Sans bordure +hud-settings-gpu_profiler = Activer la synchronisation du processeur graphique (pas toujours supporté) +hud-settings-particles = Particules +hud-settings-lossy_terrain_compression = Compression terrain avec pertes +hud-settings-weapon_trails = Trainées d'armes +hud-settings-resolution = Résolution +hud-settings-bit_depth = Profondeur de bits +hud-settings-refresh_rate = Taux de rafraichissement +hud-settings-lighting_rendering_mode = Mode de rendu des lumières +hud-settings-lighting_rendering_mode-ashikhmin = Type A - Élevé +hud-settings-lighting_rendering_mode-blinnphong = Type B - Moyen +hud-settings-lighting_rendering_mode-lambertian = Type L - Rapide +hud-settings-shadow_rendering_mode = Mode de rendu des ombres +hud-settings-shadow_rendering_mode-none = Aucune +hud-settings-shadow_rendering_mode-cheap = Rapide +hud-settings-shadow_rendering_mode-map = Carte +hud-settings-shadow_rendering_mode-map-resolution = Résolution +hud-settings-lod_detail = Détail du rendu distant +hud-settings-save_window_size = Sauvegarder la taille de fenêtre +hud-settings-reset_graphics = Restaurer par Défaut +hud-settings-bloom = Flou lumineux +hud-settings-point_glow = Effet lumineux +hud-settings-master_volume = Volume principal +hud-settings-inactive_master_volume_perc = Volume de la fenêtre en arrière-plan +hud-settings-music_volume = Volume de la musique +hud-settings-sound_effect_volume = Volume des effets +hud-settings-audio_device = Périphérique audio +hud-settings-reset_sound = Restaurer par Défaut +hud-settings-english_fallback = Afficher en Anglais les traductions manquantes +hud-settings-awaitingkey = Appuyez sur une touche... +hud-settings-unbound = Aucun +hud-settings-reset_keybinds = Réinitialiser touches par défaut +hud-settings-chat_tabs = Onglets de Chat +hud-settings-label = Nom: +hud-settings-delete = Supprimer +hud-settings-show_all = Tout montrer +hud-settings-messages = Messages +hud-settings-activity = Activité +hud-settings-death = Mort +hud-settings-group = Groupe +hud-settings-faction = Faction +hud-settings-world = Monde +hud-settings-region = Région +hud-settings-say = Parler +hud-settings-all = Global +hud-settings-group_only = Groupe seulement +hud-settings-reset_chat = Réinitialiser par défaut \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/settings.ron b/assets/voxygen/i18n/fr_FR/hud/settings.ron deleted file mode 100644 index 7e5088dc0d..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/settings.ron +++ /dev/null @@ -1,141 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - //Paramètres - "hud.settings.general": "Général", - "hud.settings.none": "Aucun", - "hud.settings.press_behavior.toggle": "Activer/Désactiver", - "hud.settings.press_behavior.hold": "Maintenir", - "hud.settings.help_window": "Fenêtre d'aide", - "hud.settings.debug_info": "Information de débogage", - "hud.settings.show_hitboxes": "Montrer les hitboxes", - "hud.settings.show_chat": "Montrer le chat", - "hud.settings.show_hotkey_hints": "Montrer les aides aux touches", - "hud.settings.tips_on_startup": "Astuces au démarrage", - "hud.settings.ui_scale": "Échelle de l'interface", - "hud.settings.relative_scaling": "Echelle relative", - "hud.settings.custom_scaling": "Echelle personalisée", - "hud.settings.crosshair": "Réticule", - "hud.settings.opacity": "Transparence", - "hud.settings.hotbar": "Barre d'action", - "hud.settings.toggle_shortcuts": "Activer les raccourcis", - "hud.settings.buffs_skillbar": "Effets sur la barre de compétences", - "hud.settings.buffs_mmap": "Effets sur la minimap", - "hud.settings.toggle_bar_experience": "Activer la barre d'expérience", - "hud.settings.scrolling_combat_text": "Dégats de combat", - "hud.settings.incoming_damage": "Dégats reçus", - "hud.settings.speech_bubble": "Bulle de dialogue", - "hud.settings.speech_bubble_self": "Montrer ses propres bulles de dialogue", - "hud.settings.speech_bubble_dark_mode": "Bulle de dialogue Mode Sombre", - "hud.settings.speech_bubble_icon": "Icône Bulle de dialogue", - "hud.settings.energybar_numbers": "Nombre des barres d'energie", - "hud.settings.always_show_bars": "Toujours montrer les barres d'énergie", - "hud.settings.values": "Valeurs", - "hud.settings.percentages": "Pourcentages", - "hud.settings.chat": "Tchat", - "hud.settings.background_opacity": "Transparence de l'arrière-plan", - "hud.settings.chat_character_name": "Noms des personnages dans le tchat", - "hud.settings.loading_tips": "Astuces sur l'écran de chargement", - "hud.settings.reset_interface": "Restaurer par Défaut", - - "hud.settings.pan_sensitivity": "Sensibilité de la souris", - "hud.settings.zoom_sensitivity": "Sensibilité du zoom", - "hud.settings.camera_clamp_angle": "Angle pour le mode Verrouillage Caméra", - "hud.settings.invert_scroll_zoom": "Inverser la molette", - "hud.settings.invert_mouse_y_axis": "Inverser l'axe Y de la souris", - "hud.settings.invert_controller_y_axis": "Inverser l'axe Y de la manette", - "hud.settings.enable_mouse_smoothing": "Lissage de la Caméra", - "hud.settings.free_look_behavior": "Comportement Vue libre", - "hud.settings.auto_walk_behavior": "Comportement Marche Automatique", - "hud.settings.camera_clamp_behavior": "Comportement Verrouillage Caméra", - "hud.settings.player_physics_behavior": "Physique des joueurs (expérimental)", - "hud.settings.stop_auto_walk_on_input": "Arrêt marche-auto si mouvement", - "hud.settings.auto_camera": "Caméra automatique", - "hud.settings.reset_gameplay": "Restaurer par Défaut", - - "hud.settings.view_distance": "Distance d'affichage", - "hud.settings.sprites_view_distance": "Distance d'affichage des sprites", - "hud.settings.figures_view_distance": "Distance d'affichage des entités", - "hud.settings.maximum_fps": "Limite FPS", - "hud.settings.background_fps": "FPS en arrière-plan", - "hud.settings.present_mode": "VSync", - "hud.settings.present_mode.fifo": "Vsync limitée", - "hud.settings.present_mode.mailbox": "Vsync max", - "hud.settings.present_mode.immediate": "Vsync désactivée", - "hud.settings.fov": "Champ de vision (degrés)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Exposition", - "hud.settings.ambiance": "Luminosité ambiante", - "hud.settings.antialiasing_mode": "Mode anticrénelage", - "hud.settings.upscale_factor": "Niveau d'échantillonage", - "hud.settings.cloud_rendering_mode": "Rendu des nuages", - "hud.settings.fluid_rendering_mode": "Rendu des fluides", - "hud.settings.fluid_rendering_mode.cheap": "Rapide", - "hud.settings.fluid_rendering_mode.shiny": "Qualitatif", - "hud.settings.cloud_rendering_mode.minimal": "Minimum", - "hud.settings.cloud_rendering_mode.low": "Bas", - "hud.settings.cloud_rendering_mode.medium": "Moyen", - "hud.settings.cloud_rendering_mode.high": "Élevé", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Plein écran", - "hud.settings.fullscreen_mode": "Mode de plein écran", - "hud.settings.fullscreen_mode.exclusive": "Exclusif", - "hud.settings.fullscreen_mode.borderless": "Sans bordure", - "hud.settings.gpu_profiler": "Activer la synchronisation du processeur graphique (pas toujours supporté)", - "hud.settings.particles": "Particules", - "hud.settings.lossy_terrain_compression": "Compression terrain avec pertes", - "hud.settings.weapon_trails": "Trainées d'armes", - "hud.settings.resolution": "Résolution", - "hud.settings.bit_depth": "Profondeur de bits", - "hud.settings.refresh_rate": "Taux de rafraichissement", - "hud.settings.lighting_rendering_mode": "Mode de rendu des lumières", - "hud.settings.lighting_rendering_mode.ashikhmin": "Type A - Élevé", - "hud.settings.lighting_rendering_mode.blinnphong": "Type B - Moyen", - "hud.settings.lighting_rendering_mode.lambertian": "Type L - Rapide", - "hud.settings.shadow_rendering_mode": "Mode de rendu des ombres", - "hud.settings.shadow_rendering_mode.none": "Aucune", - "hud.settings.shadow_rendering_mode.cheap": "Rapide", - "hud.settings.shadow_rendering_mode.map": "Carte", - "hud.settings.shadow_rendering_mode.map.resolution": "Résolution", - "hud.settings.lod_detail": "Détail du rendu distant", - "hud.settings.save_window_size": "Sauvegarder la taille de fenêtre", - "hud.settings.reset_graphics": "Restaurer par Défaut", - "hud.settings.bloom": "Flou lumineux", - "hud.settings.point_glow": "Effet lumineux", - - "hud.settings.master_volume": "Volume principal", - "hud.settings.inactive_master_volume_perc": "Volume de la fenêtre en arrière-plan", - "hud.settings.music_volume": "Volume de la musique", - "hud.settings.sound_effect_volume": "Volume des effets", - "hud.settings.audio_device": "Périphérique audio", - "hud.settings.reset_sound": "Restaurer par Défaut", - - "hud.settings.english_fallback": "Afficher en Anglais les traductions manquantes", - - "hud.settings.awaitingkey": "Appuyez sur une touche...", - "hud.settings.unbound": "Aucun", - "hud.settings.reset_keybinds": "Réinitialiser touches par défaut", - - "hud.settings.chat_tabs": "Onglets de Chat", - "hud.settings.label": "Nom:", - "hud.settings.delete": "Supprimer", - "hud.settings.show_all": "Tout montrer", - "hud.settings.messages": "Messages", - "hud.settings.activity": "Activité", - "hud.settings.death": "Mort", - "hud.settings.group": "Groupe", - "hud.settings.faction": "Faction", - "hud.settings.world": "Monde", - "hud.settings.region": "Région", - "hud.settings.say": "Parler", - "hud.settings.all": "Global", - "hud.settings.group_only": "Groupe seulement", - "hud.settings.reset_chat" : "Réinitialiser par défaut", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/skills.ftl b/assets/voxygen/i18n/fr_FR/hud/skills.ftl new file mode 100644 index 0000000000..d621ad80f1 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Nouveau Point de compétence +hud-skill-sp_available = { $number } PC disponibles +hud-skill-not_unlocked = Pas encore débloqué +hud-skill-req_sp ={"\u000A"} + + Nécessite { $number } PC +hud-skill-inc_health_title = Augmentation de Santé +hud-skill-inc_health = Augmente les points de vie max de { $boost }{ $SP } +hud-skill-inc_energy_title = Augmentation d'Endurance +hud-skill-inc_energy = Augmente les points d'endurance max de { $boost }{ $SP } +hud-skill-unlck_sword_title = Maniement de l'Épée +hud-skill-unlck_sword = Débloque l'arbre de compétence pour l'épée{ $SP } +hud-skill-unlck_axe_title = Maniement de la Hache +hud-skill-unlck_axe = Débloque l'arbre de compétence pour la hache{ $SP } +hud-skill-unlck_hammer_title = Maniement du Marteau +hud-skill-unlck_hammer = Débloque l'arbre de compétence pour le marteau{ $SP } +hud-skill-unlck_bow_title = Maniement de l'Arc +hud-skill-unlck_bow = Débloque l'arbre de compétence pour l'arc{ $SP } +hud-skill-unlck_staff_title = Maniement du Bâton +hud-skill-unlck_staff = Débloque l'arbre de compétence pour le bâton{ $SP } +hud-skill-unlck_sceptre_title = Maniement du Sceptre +hud-skill-unlck_sceptre = Débloque l'arbre de compétence pour le sceptre{ $SP } +hud-skill-dodge_title = Roulade +hud-skill-dodge = Esquivez les attaques de mélée en faisant des roulades{ $SP } +hud-skill-roll_energy_title = Coût d'Endurance de la Roulade +hud-skill-roll_energy = Rouler coûte { $boost }% moins d'endurance{ $SP } +hud-skill-roll_speed_title = Vitesse de la Roulade +hud-skill-roll_speed = Rouler { $boost }% plus vite{ $SP } +hud-skill-roll_dur_title = Durée de la Roulade +hud-skill-roll_dur = Augmente de { $boost }% la durée de la roulade{ $SP } +hud-skill-climbing_title = Escalade +hud-skill-climbing = Sauter encore plus haut +hud-skill-climbing_cost_title = Coût d'endurance de l'Escalade +hud-skill-climbing_cost = Escalader coûte { $boost }% moins d'endurance{ $SP } +hud-skill-climbing_speed_title = Vitesse d'Escalade +hud-skill-climbing_speed = Escalader { $boost }% plus vite{ $SP } +hud-skill-swim_title = Nage +hud-skill-swim = Déplacement en environnement humide +hud-skill-swim_speed_title = Vitesse de nage +hud-skill-swim_speed = Nager { $boost }% plus vite{ $SP } +hud-skill-sc_lifesteal_title = Rayon de Vol-Vie +hud-skill-sc_lifesteal = Draine la vie de vos ennemis +hud-skill-sc_lifesteal_damage_title = Dégâts du Rayon Vol-Vie +hud-skill-sc_lifesteal_damage = Inflige { $boost }% plus de dégâts{ $SP } +hud-skill-sc_lifesteal_range_title = Portée du Rayon Vol-Vie +hud-skill-sc_lifesteal_range = Votre Rayon se propage { $boost }% plus loin{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Efficacité du Rayon Vol-Vie +hud-skill-sc_lifesteal_lifesteal = Convertit { $boost }% plus de dégâts en points de vie{ $SP } +hud-skill-sc_lifesteal_regen_title = Régénération d'Endurance du Rayon Vol-Vie +hud-skill-sc_lifesteal_regen = Restaure de { $boost }% en plus votre endurance{ $SP } +hud-skill-sc_heal_title = Rayon de Soin +hud-skill-sc_heal = Soignez vos alliés par le sang de vos ennemis +hud-skill-sc_heal_heal_title = Efficacité du Rayon de Soin +hud-skill-sc_heal_heal = Augmente de { $boost }% les soins apportés aux autres{ $SP } +hud-skill-sc_heal_cost_title = Coût d'Endurance du Rayon de Soin +hud-skill-sc_heal_cost = Soigner les autres coûte { $boost }% moins d'endurance{ $SP } +hud-skill-sc_heal_range_title = Portée du Rayon de Soin +hud-skill-sc_heal_range = Votre Rayon se propage { $boost }% plus loin{ $SP } +hud-skill-sc_wardaura_unlock_title = Déblocage de l'Aura du Gardien +hud-skill-sc_wardaura_unlock = Débloque une compétence permettant de protéger vos alliés des attaques ennemies{ $SP } +hud-skill-sc_wardaura_strength_title = Puissance de l'Aura du Gardien +hud-skill-sc_wardaura_strength = Augmente de { $boost }% la force de protection{ $SP } +hud-skill-sc_wardaura_duration_title = Durée de l'Aura du Gardien +hud-skill-sc_wardaura_duration = Fait durer les effets de protection { $boost }% plus longtemps{ $SP } +hud-skill-sc_wardaura_range_title = Portée de l'Aura du Gardien +hud-skill-sc_wardaura_range = Votre protection s'étend { $boost }% plus loin{ $SP } +hud-skill-sc_wardaura_cost_title = Coût d'Endurance de l'Aura du Gardien +hud-skill-sc_wardaura_cost = Créer votre aura coûtera { $boost }% moins d'endurance{ $SP } +hud-skill-st_shockwave_range_title = Portée de l'Onde de Choc +hud-skill-st_shockwave_range = Projette ce qui était autrefois inatteignable, Portée augmentée de { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Coût d'Endurance de l'Onde de Choc +hud-skill-st_shockwave_cost = Diminue de { $boost }% l'endurace nécessaire pour projeter ces pauvres villageois{ $SP } +hud-skill-st_shockwave_knockback_title = Projection de l'Onde de Choc +hud-skill-st_shockwave_knockback = Augmente de { $boost }% la force de projection{ $SP } +hud-skill-st_shockwave_damage_title = Dégâts de l'Onde de Choc +hud-skill-st_shockwave_damage = Augmente de { $boost }% les dégâts infligés par l'onde de choc{ $SP } +hud-skill-st_shockwave_unlock_title = Déblocage de l'Onde de Choc +hud-skill-st_shockwave_unlock = Débloque une compétence permettant de projeter les ennemis avec une onde de feu{ $SP } +hud-skill-st_flamethrower_title = Lance-Flammes +hud-skill-st_flamethrower = Lance des flammes, pour un bon barbecue +hud-skill-st_flame_velocity_title = Vélocité des Flammes +hud-skill-st_flame_velocity = Envoie des flammes { $boost }% plus rapides, pour atteindre plus vite le grill{ $SP } +hud-skill-st_flamethrower_range_title = Portée des Flammes +hud-skill-st_flamethrower_range = Envoie des flammes { $boost }% plus loin, plus besoin de s'approcher!{ $SP } +hud-skill-st_energy_drain_title = Drain d'Endurance des Flammes +hud-skill-st_energy_drain = Diminue de { $boost }% la vitesse de consommation d'endurance{ $SP } +hud-skill-st_flamethrower_damage_title = Dégâts des Flammes +hud-skill-st_flamethrower_damage = Augmente de { $boost }% les dégâts{ $SP } +hud-skill-st_explosion_radius_title = Portée de l'Explosion +hud-skill-st_explosion_radius = Augmente la portée d'explosion de { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Régénération d'Endurance des Boules de feu +hud-skill-st_energy_regen = Augmente de { $boost }% la régénération d'endurance{ $SP } +hud-skill-st_fireball_title = Boule de Feu +hud-skill-st_fireball = Joue à la balle avec les ennemis +hud-skill-st_damage_title = Dégâts des boules de feu +hud-skill-st_damage = Augmente de { $boost }% les dégâts{ $SP } +hud-skill-st_explosion_title = Explosion des boules de feu +hud-skill-st_explosion = Quand le feu n'est plus suffisant{ $SP } +hud-skill-bow_projectile_speed_title = Vitesse des Projectiles +hud-skill-bow_projectile_speed = Permet de tirer plus vite, plus loin, de { $boost }%{ $SP } +hud-skill-bow_arrow_count_title = Nombre de Flèches +hud-skill-bow_arrow_count = Tire une flèche supplémentaire quand vous sautez{ $SP } +hud-skill-bow_repeater_cost_title = Coût d'Endurance des Répétitions +hud-skill-bow_repeater_cost = Diminue de { $boost }% le coût en endurance des Répétitions{ $SP } +hud-skill-bow_repeater_glide_title = Saut des Répétitions +hud-skill-bow_repeater_glide = Augmente le temps passé dans les airs des Répétitions{ $SP } +hud-skill-bow_repeater_damage_title = Dégâts des Répétitions +hud-skill-bow_repeater_damage = Increases the damage done by { $boost }%{ $SP } +hud-skill-bow_repeater_unlock_title = Déblocage des Répétitions +hud-skill-bow_repeater_unlock = Débloque une compétence permettant de s'élancer dans les airs et tirer une volée de flèches{ $SP } +hud-skill-bow_charged_title = Tir Chargé +hud-skill-bow_charged = Parce que vous avez attendu +hud-skill-bow_charged_knockback_title = Projection des Tirs Chargés +hud-skill-bow_charged_knockback = Projette les ennemis { $boost }% plus loin{ $SP } +hud-skill-bow_charged_move_speed_title = Vitesse de Déplacement en Tir Chargé +hud-skill-bow_charged_move_speed = Augmente de { $boost }% votre vitesse de déplacement pendant que vous chargez votre tir{ $SP } +hud-skill-bow_charged_speed_title = Vitesse de Charge +hud-skill-bow_charged_speed = Augmente de { $boost }% la vitesse de chargement de vos tirs{ $SP } +hud-skill-bow_charged_projectile_speed_title = Vitesse des projectiles du Tir Chargé +hud-skill-bow_charged_projectile_speed = Augmente de { $boost }% la vitesse des projectiles de votre tir chargé{ $SP } +hud-skill-bow_charged_drain_title = Drain d'Endurance du Tir Chargé +hud-skill-bow_charged_drain = Diminue de { $boost }% la vitesse de drain d'endurance du chargement de votre tir{ $SP } +hud-skill-bow_charged_damage_title = Dégâts du Tir Chargé +hud-skill-bow_charged_damage = Augmente de { $boost }% les dégâts du tir chargé{ $SP } +hud-skill-bow_energy_regen_title = Régénération d'Endurance des Tirs +hud-skill-bow_energy_regen = Augmente de { $boost }% le gain d'endurance{ $SP } +hud-skill-bow_title = Tir de Flèches +hud-skill-bow = Carquois infini inclus, ne convient pas aux enfants +hud-skill-bow_damage_title = Dégâts des Tirs +hud-skill-bow_damage = Augmente de { $boost }% les dégâts des tirs{ $SP } +hud-skill-hmr_leap_radius_title = Rayon du Bond +hud-skill-hmr_leap_radius = Augmente le rayon d'attaque d'{ $boost } mètre de la frappe au sol{ $SP } +hud-skill-hmr_leap_distance_title = Distance du Bond +hud-skill-hmr_leap_distance = Augmente de { $boost }% la distance du bond{ $SP } +hud-skill-hmr_leap_cost_title = Coût d'Endurance du Bond +hud-skill-hmr_leap_cost = Diminue de { $boost }% le coût d'endurance du bond{ $SP } +hud-skill-hmr_leap_knockback_title = Projection du Bond +hud-skill-hmr_leap_knockback = Augmente de { $boost }% la force de projection du bond{ $SP } +hud-skill-hmr_leap_damage_title = Dégâts du Bond +hud-skill-hmr_leap_damage = Augmente de { $boost }% les dégâts causés par le bond{ $SP } +hud-skill-hmr_unlock_leap_title = Déblocage du Bond +hud-skill-hmr_unlock_leap = Débloque une compétence permettant de s'élancer dans les airs pour frapper un ennemi lointain{ $SP } +hud-skill-hmr_charged_melee_title = Coup Chargé +hud-skill-hmr_charged_melee = Un coup mais chargé +hud-skill-hmr_charged_rate_title = Vitesse de Charge +hud-skill-hmr_charged_rate = Augmente de { $boost }% la vitesse du chargement de votre frappe{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Drain d'endurance du Coup Chargé +hud-skill-hmr_charged_melee_nrg_drain = Diminue de { $boost }% la vitesse de drain d'endurance du chargement de votre coup{ $SP } +hud-skill-hmr_charged_melee_damage_title = Dégâts du Coup Chargé +hud-skill-hmr_charged_melee_damage = Augmente de { $boost }% les dégâts du coup chargé{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Projection du Coup Chargé +hud-skill-hmr_charged_melee_knockback = Augmente significativement la force de projection de { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Frappe Simple +hud-skill-hmr_single_strike = Aussi simple que vous +hud-skill-hmr_single_strike_regen_title = Régénération d'Endurance de la Frappe Simple +hud-skill-hmr_single_strike_regen = Augmente le gain d'endurance à chaque frappe successive{ $SP } +hud-skill-hmr_single_strike_speed_title = Vitesse de la Frappe Simple +hud-skill-hmr_single_strike_speed = Augmente la vitesse d'attaque à chaque frappe successive{ $SP } +hud-skill-hmr_single_strike_damage_title = Dégâts de la Frappe Simple +hud-skill-hmr_single_strike_damage = Augmente les dégâts à chaque frappe successive{ $SP } +hud-skill-hmr_single_strike_knockback_title = Projection de la Frappe Simple +hud-skill-hmr_single_strike_knockback = Augmente de { $boost }% la force de projection{ $SP } +hud-skill-sw_trip_str_title = Triple-Frappe +hud-skill-sw_trip_str = Frappez, jusqu'à trois fois +hud-skill-sw_trip_str_combo_title = Combo de la Triple-Frappe +hud-skill-sw_trip_str_combo = Débloque la progression des combos pour la triple-frappe{ $SP } +hud-skill-sw_trip_str_dmg_title = Dégâts de la Triple-Frappe +hud-skill-sw_trip_str_dmg = Augmente les dégâts à chaque frappe successive{ $SP } +hud-skill-sw_trip_str_sp_title = Vitesse de la Triple-Frappe +hud-skill-sw_trip_str_sp = Augmente la vitesse d'attaque à chaque frappe successive{ $SP } +hud-skill-sw_trip_str_reg_title = Régénération d'Endurance de la Triple-Frappe +hud-skill-sw_trip_str_reg = Augmente le gain d'endurance à chaque frappe successive{ $SP } +hud-skill-sw_dash_title = Ruée +hud-skill-sw_dash = Embrochez vos ennemis +hud-skill-sw_dash_dmg_title = Dégâts de la Ruée +hud-skill-sw_dash_dmg = Augmente de { $boost }% les dégâts de la ruée{ $SP } +hud-skill-sw_dash_drain_title = Drain d'Endurance de la Ruée +hud-skill-sw_dash_drain = Diminue de { $boost }% la vitesse de drain d'endurance de la ruée{ $SP } +hud-skill-sw_dash_cost_title = Coût d'Endurance de la Ruée +hud-skill-sw_dash_cost = Diminue de { $boost }% le coût en endurance initial de la ruée{ $SP } +hud-skill-sw_dash_speed_title = Vitesse de la Ruée +hud-skill-sw_dash_speed = Augmente de { $boost }% la vitesse de course durant la ruée{ $SP } +hud-skill-sw_dash_inf_title = Ruée Infinie +hud-skill-sw_dash_inf = Vous permet de vous élancer en ruée tant que vous avez de l'endurance{ $SP } +hud-skill-sw_dash_scale_title = Progression des Dégâts de la Ruée +hud-skill-sw_dash_scale = Augmente de { $boost }% la progression des dégâts de la ruée{ $SP } +hud-skill-sw_spin_title = Déblocage de l'Attaque Tournoyante +hud-skill-sw_spin = Débloque une compétence permettant de faire une attaque tournoyante{ $SP } +hud-skill-sw_spin_dmg_title = Dégâts de l'Attaque Tournoyante +hud-skill-sw_spin_dmg = Augmente de { $boost }% les dégâts causés par l'attaque tournoyante{ $SP } +hud-skill-sw_spin_spd_title = Vitesse de l'Attaque Tournoyante +hud-skill-sw_spin_spd = Augmente de { $boost }% la vitesse à laquelle vous tournoyez{ $SP } +hud-skill-sw_spin_cost_title = Coût d'Endurance de l'Attaque Tournoyante +hud-skill-sw_spin_cost = Diminue de { $boost }% le coût en endurance de chaque tour effectué{ $SP } +hud-skill-sw_spin_spins_title = Nombre de tours de l'Attaque Tournoyante +hud-skill-sw_spin_spins = Augmente le nombre de tours que vous pouvez effectuer avec l'attaque tournoyante{ $SP } +hud-skill-sw_interrupt_title = Interruption des Attaques +hud-skill-sw_interrupt = Vous permet d'interrompre immédiatement une attaque par une autre{ $SP } +hud-skill-axe_double_strike_title = Double-Frappe +hud-skill-axe_double_strike = Abattez les méchants +hud-skill-axe_double_strike_combo_title = Combo de la Double-Frappe +hud-skill-axe_double_strike_combo = Débloque la progression des combos pour la double-frappe{ $SP } +hud-skill-axe_double_strike_damage_title = Dégâts de la Double-Frappe +hud-skill-axe_double_strike_damage = Augmente les dégâts à chaque frappe successive{ $SP } +hud-skill-axe_double_strike_speed_title = Vitesse de la Double-Frappe +hud-skill-axe_double_strike_speed = Augmente la vitesse d'attaque à chaque frappe successive{ $SP } +hud-skill-axe_double_strike_regen_title = Régénération d'Endurance de la Double-Frappe +hud-skill-axe_double_strike_regen = Augmente le gain d'endurance à chaque frappe successive{ $SP } +hud-skill-axe_spin_title = Attaque Tournoyante +hud-skill-axe_spin = You spin it right round ... +hud-skill-axe_infinite_axe_spin_title = Attaque Tournoyante Infinie +hud-skill-axe_infinite_axe_spin = Tournoyez tant que vous avez de l'endurance{ $SP } +hud-skill-axe_spin_damage_title = Dégâts de l'Attaque Tournoyante +hud-skill-axe_spin_damage = Augmente de { $boost }% les dégâts causés par l'attaque tournoyante{ $SP } +hud-skill-axe_spin_helicopter_title = Tournoiement Hélicoptère +hud-skill-axe_spin_helicopter = Vous chutez un peu plus lentement en tournoyant{ $SP } +hud-skill-axe_spin_speed_title = Vitesse de l'Attaque Tournoyante +hud-skill-axe_spin_speed = Augmente de { $boost }% la vitesse à laquelle vous tournoyez{ $SP } +hud-skill-axe_spin_cost_title = Coût d'Endurance de l'Attaque Tournoyante +hud-skill-axe_spin_cost = Diminue de { $boost }% le coût en endurance de chaque tour effectué{ $SP } +hud-skill-axe_unlock_leap_title = Déblocage du Bond +hud-skill-axe_unlock_leap = Débloque une compétence permettant de s'élancer dans les airs en tournoyant{ $SP } +hud-skill-axe_leap_damage_title = Dégâts du Bond +hud-skill-axe_leap_damage = Augmente de { $boost }% les dégâts causés par le bond{ $SP } +hud-skill-axe_leap_knockback_title = Projection du Bond +hud-skill-axe_leap_knockback = Augmente de { $boost }% la force de projection du bond +hud-skill-axe_leap_cost_title = Coût d'Endurance du Bond +hud-skill-axe_leap_cost = Diminue de { $boost }% le coût d'endurance du bond{ $SP } +hud-skill-axe_leap_distance_title = Distance du Bond +hud-skill-axe_leap_distance = Augmente de { $boost }% la distance du bond{ $SP } +hud-skill-mining_title = Minage +hud-skill-pick_strike_title = Coup de pioche +hud-skill-pick_strike = Miner des rochers avec la pioche pour récupérer des minerais, des gemmes et de l'expérience +hud-skill-pick_strike_speed_title = Vitesse de minage +hud-skill-pick_strike_speed = Miner des rochers plus vite{ $SP } +hud-skill-pick_strike_oregain_title = Récolte de minerais +hud-skill-pick_strike_oregain = Possibilité de récupérer plus de minerais ({ $boost }% par niveau){ $SP } +hud-skill-pick_strike_gemgain_title = Récolte de gemmes +hud-skill-pick_strike_gemgain = Possibilité de récupérer plus de gemmes ({ $boost }% par niveau){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/skills.ron b/assets/voxygen/i18n/fr_FR/hud/skills.ron deleted file mode 100644 index 4786968e53..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/skills.ron +++ /dev/null @@ -1,258 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.rank_up": "Nouveau Point de compétence", - "hud.skill.sp_available": "{number} PC disponibles", - "hud.skill.not_unlocked": "Pas encore débloqué", - "hud.skill.req_sp": "\n\nNécessite {number} PC", - // Skills - // General - "hud.skill.inc_health_title": "Augmentation de Santé", - "hud.skill.inc_health": "Augmente les points de vie max de {boost}{SP}", - "hud.skill.inc_energy_title": "Augmentation d'Endurance", - "hud.skill.inc_energy": "Augmente les points d'endurance max de {boost}{SP}", - "hud.skill.unlck_sword_title": "Maniement de l'Épée", - "hud.skill.unlck_sword": "Débloque l'arbre de compétence pour l'épée{SP}", - "hud.skill.unlck_axe_title": "Maniement de la Hache", - "hud.skill.unlck_axe": "Débloque l'arbre de compétence pour la hache{SP}", - "hud.skill.unlck_hammer_title": "Maniement du Marteau", - "hud.skill.unlck_hammer": "Débloque l'arbre de compétence pour le marteau{SP}", - "hud.skill.unlck_bow_title": "Maniement de l'Arc", - "hud.skill.unlck_bow": "Débloque l'arbre de compétence pour l'arc{SP}", - "hud.skill.unlck_staff_title": "Maniement du Bâton", - "hud.skill.unlck_staff": "Débloque l'arbre de compétence pour le bâton{SP}", - "hud.skill.unlck_sceptre_title": "Maniement du Sceptre", - "hud.skill.unlck_sceptre": "Débloque l'arbre de compétence pour le sceptre{SP}", - "hud.skill.dodge_title": "Roulade", - "hud.skill.dodge": "Esquivez les attaques de mélée en faisant des roulades{SP}", - "hud.skill.roll_energy_title": "Coût d'Endurance de la Roulade", - "hud.skill.roll_energy": "Rouler coûte {boost}% moins d'endurance{SP}", - "hud.skill.roll_speed_title": "Vitesse de la Roulade", - "hud.skill.roll_speed": "Rouler {boost}% plus vite{SP}", - "hud.skill.roll_dur_title": "Durée de la Roulade", - "hud.skill.roll_dur": "Augmente de {boost}% la durée de la roulade{SP}", - "hud.skill.climbing_title": "Escalade", - "hud.skill.climbing": "Sauter encore plus haut", - "hud.skill.climbing_cost_title": "Coût d'endurance de l'Escalade", - "hud.skill.climbing_cost": "Escalader coûte {boost}% moins d'endurance{SP}", - "hud.skill.climbing_speed_title": "Vitesse d'Escalade", - "hud.skill.climbing_speed": "Escalader {boost}% plus vite{SP}", - "hud.skill.swim_title": "Nage", - "hud.skill.swim": "Déplacement en environnement humide", - "hud.skill.swim_speed_title": "Vitesse de nage", - "hud.skill.swim_speed": "Nager {boost}% plus vite{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Rayon de Vol-Vie", - "hud.skill.sc_lifesteal": "Draine la vie de vos ennemis", - "hud.skill.sc_lifesteal_damage_title": "Dégâts du Rayon Vol-Vie", - "hud.skill.sc_lifesteal_damage": "Inflige {boost}% plus de dégâts{SP}", - "hud.skill.sc_lifesteal_range_title": "Portée du Rayon Vol-Vie", - "hud.skill.sc_lifesteal_range": "Votre Rayon se propage {boost}% plus loin{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Efficacité du Rayon Vol-Vie", - "hud.skill.sc_lifesteal_lifesteal": "Convertit {boost}% plus de dégâts en points de vie{SP}", - "hud.skill.sc_lifesteal_regen_title": "Régénération d'Endurance du Rayon Vol-Vie", - "hud.skill.sc_lifesteal_regen": "Restaure de {boost}% en plus votre endurance{SP}", - "hud.skill.sc_heal_title": "Rayon de Soin", - "hud.skill.sc_heal": "Soignez vos alliés par le sang de vos ennemis", - "hud.skill.sc_heal_heal_title": "Efficacité du Rayon de Soin", - "hud.skill.sc_heal_heal": "Augmente de {boost}% les soins apportés aux autres{SP}", - "hud.skill.sc_heal_cost_title": "Coût d'Endurance du Rayon de Soin", - "hud.skill.sc_heal_cost": "Soigner les autres coûte {boost}% moins d'endurance{SP}", - "hud.skill.sc_heal_range_title": "Portée du Rayon de Soin", - "hud.skill.sc_heal_range": "Votre Rayon se propage {boost}% plus loin{SP}", - "hud.skill.sc_wardaura_unlock_title": "Déblocage de l'Aura du Gardien", - "hud.skill.sc_wardaura_unlock": "Débloque une compétence permettant de protéger vos alliés des attaques ennemies{SP}", - "hud.skill.sc_wardaura_strength_title": "Puissance de l'Aura du Gardien", - "hud.skill.sc_wardaura_strength": "Augmente de {boost}% la force de protection{SP}", - "hud.skill.sc_wardaura_duration_title": "Durée de l'Aura du Gardien", - "hud.skill.sc_wardaura_duration": "Fait durer les effets de protection {boost}% plus longtemps{SP}", - "hud.skill.sc_wardaura_range_title": "Portée de l'Aura du Gardien", - "hud.skill.sc_wardaura_range": "Votre protection s'étend {boost}% plus loin{SP}", - "hud.skill.sc_wardaura_cost_title": "Coût d'Endurance de l'Aura du Gardien", - "hud.skill.sc_wardaura_cost": "Créer votre aura coûtera {boost}% moins d'endurance{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Portée de l'Onde de Choc", - "hud.skill.st_shockwave_range" : "Projette ce qui était autrefois inatteignable, Portée augmentée de {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Coût d'Endurance de l'Onde de Choc", - "hud.skill.st_shockwave_cost" : "Diminue de {boost}% l'endurace nécessaire pour projeter ces pauvres villageois{SP}", - "hud.skill.st_shockwave_knockback_title" : "Projection de l'Onde de Choc", - "hud.skill.st_shockwave_knockback" : "Augmente de {boost}% la force de projection{SP}", - "hud.skill.st_shockwave_damage_title" : "Dégâts de l'Onde de Choc", - "hud.skill.st_shockwave_damage" : "Augmente de {boost}% les dégâts infligés par l'onde de choc{SP}", - "hud.skill.st_shockwave_unlock_title" : "Déblocage de l'Onde de Choc", - "hud.skill.st_shockwave_unlock" : "Débloque une compétence permettant de projeter les ennemis avec une onde de feu{SP}", - "hud.skill.st_flamethrower_title" : "Lance-Flammes", - "hud.skill.st_flamethrower" : "Lance des flammes, pour un bon barbecue", - "hud.skill.st_flame_velocity_title" : "Vélocité des Flammes", - "hud.skill.st_flame_velocity" : "Envoie des flammes {boost}% plus rapides, pour atteindre plus vite le grill{SP}", - "hud.skill.st_flamethrower_range_title" : "Portée des Flammes", - "hud.skill.st_flamethrower_range" : "Envoie des flammes {boost}% plus loin, plus besoin de s'approcher!{SP}", - "hud.skill.st_energy_drain_title" : "Drain d'Endurance des Flammes", - "hud.skill.st_energy_drain" : "Diminue de {boost}% la vitesse de consommation d'endurance{SP}", - "hud.skill.st_flamethrower_damage_title" : "Dégâts des Flammes", - "hud.skill.st_flamethrower_damage" : "Augmente de {boost}% les dégâts{SP}", - "hud.skill.st_explosion_radius_title" : "Portée de l'Explosion", - "hud.skill.st_explosion_radius" : "Augmente la portée d'explosion de {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Régénération d'Endurance des Boules de feu", - "hud.skill.st_energy_regen" : "Augmente de {boost}% la régénération d'endurance{SP}", - "hud.skill.st_fireball_title" : "Boule de Feu", - "hud.skill.st_fireball" : "Joue à la balle avec les ennemis", - "hud.skill.st_damage_title" : "Dégâts des boules de feu", - "hud.skill.st_damage" : "Augmente de {boost}% les dégâts{SP}", - "hud.skill.st_explosion_title" : "Explosion des boules de feu", - "hud.skill.st_explosion" : "Quand le feu n'est plus suffisant{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Vitesse des Projectiles", - "hud.skill.bow_projectile_speed" : "Permet de tirer plus vite, plus loin, de {boost}%{SP}", - "hud.skill.bow_arrow_count_title" : "Nombre de Flèches", - "hud.skill.bow_arrow_count" : "Tire une flèche supplémentaire quand vous sautez{SP}", - "hud.skill.bow_repeater_cost_title" : "Coût d'Endurance des Répétitions", - "hud.skill.bow_repeater_cost" : "Diminue de {boost}% le coût en endurance des Répétitions{SP}", - "hud.skill.bow_repeater_glide_title" : "Saut des Répétitions", - "hud.skill.bow_repeater_glide" : "Augmente le temps passé dans les airs des Répétitions{SP}", - "hud.skill.bow_repeater_damage_title" : "Dégâts des Répétitions", - "hud.skill.bow_repeater_damage" : "Increases the damage done by {boost}%{SP}", - "hud.skill.bow_repeater_unlock_title" : "Déblocage des Répétitions", - "hud.skill.bow_repeater_unlock" : "Débloque une compétence permettant de s'élancer dans les airs et tirer une volée de flèches{SP}", - "hud.skill.bow_charged_title" : "Tir Chargé", - "hud.skill.bow_charged" : "Parce que vous avez attendu", - "hud.skill.bow_charged_knockback_title" : "Projection des Tirs Chargés", - "hud.skill.bow_charged_knockback" : "Projette les ennemis {boost}% plus loin{SP}", - "hud.skill.bow_charged_move_speed_title" : "Vitesse de Déplacement en Tir Chargé", - "hud.skill.bow_charged_move_speed" : "Augmente de {boost}% votre vitesse de déplacement pendant que vous chargez votre tir{SP}", - "hud.skill.bow_charged_speed_title" : "Vitesse de Charge", - "hud.skill.bow_charged_speed" : "Augmente de {boost}% la vitesse de chargement de vos tirs{SP}", - "hud.skill.bow_charged_projectile_speed_title" : "Vitesse des projectiles du Tir Chargé", - "hud.skill.bow_charged_projectile_speed" : "Augmente de {boost}% la vitesse des projectiles de votre tir chargé{SP}", - "hud.skill.bow_charged_drain_title" : "Drain d'Endurance du Tir Chargé", - "hud.skill.bow_charged_drain" : "Diminue de {boost}% la vitesse de drain d'endurance du chargement de votre tir{SP}", - "hud.skill.bow_charged_damage_title" : "Dégâts du Tir Chargé", - "hud.skill.bow_charged_damage" : "Augmente de {boost}% les dégâts du tir chargé{SP}", - "hud.skill.bow_energy_regen_title" : "Régénération d'Endurance des Tirs", - "hud.skill.bow_energy_regen" : "Augmente de {boost}% le gain d'endurance{SP}", - "hud.skill.bow_title" : "Tir de Flèches", - "hud.skill.bow" : "Carquois infini inclus, ne convient pas aux enfants", - "hud.skill.bow_damage_title" : "Dégâts des Tirs", - "hud.skill.bow_damage" : "Augmente de {boost}% les dégâts des tirs{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Rayon du Bond", - "hud.skill.hmr_leap_radius" : "Augmente le rayon d'attaque d'{boost} mètre de la frappe au sol{SP}", - "hud.skill.hmr_leap_distance_title" : "Distance du Bond", - "hud.skill.hmr_leap_distance" : "Augmente de {boost}% la distance du bond{SP}", - "hud.skill.hmr_leap_cost_title" : "Coût d'Endurance du Bond", - "hud.skill.hmr_leap_cost" : "Diminue de {boost}% le coût d'endurance du bond{SP}", - "hud.skill.hmr_leap_knockback_title" : "Projection du Bond", - "hud.skill.hmr_leap_knockback" : "Augmente de {boost}% la force de projection du bond{SP}", - "hud.skill.hmr_leap_damage_title" : "Dégâts du Bond", - "hud.skill.hmr_leap_damage" : "Augmente de {boost}% les dégâts causés par le bond{SP}", - "hud.skill.hmr_unlock_leap_title" : "Déblocage du Bond", - "hud.skill.hmr_unlock_leap" : "Débloque une compétence permettant de s'élancer dans les airs pour frapper un ennemi lointain{SP}", - "hud.skill.hmr_charged_melee_title" : "Coup Chargé", - "hud.skill.hmr_charged_melee" : "Un coup mais chargé", - "hud.skill.hmr_charged_rate_title" : "Vitesse de Charge", - "hud.skill.hmr_charged_rate" : "Augmente de {boost}% la vitesse du chargement de votre frappe{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Drain d'endurance du Coup Chargé", - "hud.skill.hmr_charged_melee_nrg_drain" : "Diminue de {boost}% la vitesse de drain d'endurance du chargement de votre coup{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Dégâts du Coup Chargé", - "hud.skill.hmr_charged_melee_damage" : "Augmente de {boost}% les dégâts du coup chargé{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Projection du Coup Chargé", - "hud.skill.hmr_charged_melee_knockback" : "Augmente significativement la force de projection de {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Frappe Simple", - "hud.skill.hmr_single_strike" : "Aussi simple que vous", - "hud.skill.hmr_single_strike_regen_title" : "Régénération d'Endurance de la Frappe Simple", - "hud.skill.hmr_single_strike_regen" : "Augmente le gain d'endurance à chaque frappe successive{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Vitesse de la Frappe Simple", - "hud.skill.hmr_single_strike_speed" : "Augmente la vitesse d'attaque à chaque frappe successive{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Dégâts de la Frappe Simple", - "hud.skill.hmr_single_strike_damage" : "Augmente les dégâts à chaque frappe successive{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Projection de la Frappe Simple", - "hud.skill.hmr_single_strike_knockback" : "Augmente de {boost}% la force de projection{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Triple-Frappe", - "hud.skill.sw_trip_str": "Frappez, jusqu'à trois fois", - "hud.skill.sw_trip_str_combo_title": "Combo de la Triple-Frappe", - "hud.skill.sw_trip_str_combo": "Débloque la progression des combos pour la triple-frappe{SP}", - "hud.skill.sw_trip_str_dmg_title": "Dégâts de la Triple-Frappe", - "hud.skill.sw_trip_str_dmg": "Augmente les dégâts à chaque frappe successive{SP}", - "hud.skill.sw_trip_str_sp_title": "Vitesse de la Triple-Frappe", - "hud.skill.sw_trip_str_sp": "Augmente la vitesse d'attaque à chaque frappe successive{SP}", - "hud.skill.sw_trip_str_reg_title": "Régénération d'Endurance de la Triple-Frappe", - "hud.skill.sw_trip_str_reg": "Augmente le gain d'endurance à chaque frappe successive{SP}", - "hud.skill.sw_dash_title": "Ruée", - "hud.skill.sw_dash": "Embrochez vos ennemis", - "hud.skill.sw_dash_dmg_title": "Dégâts de la Ruée", - "hud.skill.sw_dash_dmg": "Augmente de {boost}% les dégâts de la ruée{SP}", - "hud.skill.sw_dash_drain_title": "Drain d'Endurance de la Ruée", - "hud.skill.sw_dash_drain": "Diminue de {boost}% la vitesse de drain d'endurance de la ruée{SP}", - "hud.skill.sw_dash_cost_title": "Coût d'Endurance de la Ruée", - "hud.skill.sw_dash_cost": "Diminue de {boost}% le coût en endurance initial de la ruée{SP}", - "hud.skill.sw_dash_speed_title": "Vitesse de la Ruée", - "hud.skill.sw_dash_speed": "Augmente de {boost}% la vitesse de course durant la ruée{SP}", - "hud.skill.sw_dash_inf_title": "Ruée Infinie", - "hud.skill.sw_dash_inf": "Vous permet de vous élancer en ruée tant que vous avez de l'endurance{SP}", - "hud.skill.sw_dash_scale_title": "Progression des Dégâts de la Ruée", - "hud.skill.sw_dash_scale": "Augmente de {boost}% la progression des dégâts de la ruée{SP}", - "hud.skill.sw_spin_title": "Déblocage de l'Attaque Tournoyante", - "hud.skill.sw_spin": "Débloque une compétence permettant de faire une attaque tournoyante{SP}", - "hud.skill.sw_spin_dmg_title": "Dégâts de l'Attaque Tournoyante", - "hud.skill.sw_spin_dmg": "Augmente de {boost}% les dégâts causés par l'attaque tournoyante{SP}", - "hud.skill.sw_spin_spd_title": "Vitesse de l'Attaque Tournoyante", - "hud.skill.sw_spin_spd": "Augmente de {boost}% la vitesse à laquelle vous tournoyez{SP}", - "hud.skill.sw_spin_cost_title": "Coût d'Endurance de l'Attaque Tournoyante", - "hud.skill.sw_spin_cost": "Diminue de {boost}% le coût en endurance de chaque tour effectué{SP}", - "hud.skill.sw_spin_spins_title": "Nombre de tours de l'Attaque Tournoyante", - "hud.skill.sw_spin_spins": "Augmente le nombre de tours que vous pouvez effectuer avec l'attaque tournoyante{SP}", - "hud.skill.sw_interrupt_title": "Interruption des Attaques", - "hud.skill.sw_interrupt": "Vous permet d'interrompre immédiatement une attaque par une autre{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Double-Frappe", - "hud.skill.axe_double_strike": "Abattez les méchants", - "hud.skill.axe_double_strike_combo_title": "Combo de la Double-Frappe", - "hud.skill.axe_double_strike_combo": "Débloque la progression des combos pour la double-frappe{SP}", - "hud.skill.axe_double_strike_damage_title": "Dégâts de la Double-Frappe", - "hud.skill.axe_double_strike_damage": "Augmente les dégâts à chaque frappe successive{SP}", - "hud.skill.axe_double_strike_speed_title": "Vitesse de la Double-Frappe", - "hud.skill.axe_double_strike_speed": "Augmente la vitesse d'attaque à chaque frappe successive{SP}", - "hud.skill.axe_double_strike_regen_title": "Régénération d'Endurance de la Double-Frappe", - "hud.skill.axe_double_strike_regen": "Augmente le gain d'endurance à chaque frappe successive{SP}", - "hud.skill.axe_spin_title": "Attaque Tournoyante", - "hud.skill.axe_spin": "You spin it right round ...", - "hud.skill.axe_infinite_axe_spin_title": "Attaque Tournoyante Infinie", - "hud.skill.axe_infinite_axe_spin": "Tournoyez tant que vous avez de l'endurance{SP}", - "hud.skill.axe_spin_damage_title": "Dégâts de l'Attaque Tournoyante", - "hud.skill.axe_spin_damage": "Augmente de {boost}% les dégâts causés par l'attaque tournoyante{SP}", - "hud.skill.axe_spin_helicopter_title": "Tournoiement Hélicoptère", - "hud.skill.axe_spin_helicopter": "Vous chutez un peu plus lentement en tournoyant{SP}", - "hud.skill.axe_spin_speed_title": "Vitesse de l'Attaque Tournoyante", - "hud.skill.axe_spin_speed": "Augmente de {boost}% la vitesse à laquelle vous tournoyez{SP}", - "hud.skill.axe_spin_cost_title": "Coût d'Endurance de l'Attaque Tournoyante", - "hud.skill.axe_spin_cost": "Diminue de {boost}% le coût en endurance de chaque tour effectué{SP}", - "hud.skill.axe_unlock_leap_title": "Déblocage du Bond", - "hud.skill.axe_unlock_leap": "Débloque une compétence permettant de s'élancer dans les airs en tournoyant{SP}", - "hud.skill.axe_leap_damage_title": "Dégâts du Bond", - "hud.skill.axe_leap_damage": "Augmente de {boost}% les dégâts causés par le bond{SP}", - "hud.skill.axe_leap_knockback_title": "Projection du Bond", - "hud.skill.axe_leap_knockback": "Augmente de {boost}% la force de projection du bond", - "hud.skill.axe_leap_cost_title": "Coût d'Endurance du Bond", - "hud.skill.axe_leap_cost": "Diminue de {boost}% le coût d'endurance du bond{SP}", - "hud.skill.axe_leap_distance_title": "Distance du Bond", - "hud.skill.axe_leap_distance": "Augmente de {boost}% la distance du bond{SP}", - - // Minage - "hud.skill.mining_title": "Minage", - "hud.skill.pick_strike_title": "Coup de pioche", - "hud.skill.pick_strike": "Miner des rochers avec la pioche pour récupérer des minerais, des gemmes et de l'expérience", - "hud.skill.pick_strike_speed_title": "Vitesse de minage", - "hud.skill.pick_strike_speed": "Miner des rochers plus vite{SP}", - "hud.skill.pick_strike_oregain_title": "Récolte de minerais", - "hud.skill.pick_strike_oregain": "Possibilité de récupérer plus de minerais ({boost}% par niveau){SP}", - "hud.skill.pick_strike_gemgain_title": "Récolte de gemmes", - "hud.skill.pick_strike_gemgain": "Possibilité de récupérer plus de gemmes ({boost}% par niveau){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/social.ftl b/assets/voxygen/i18n/fr_FR/hud/social.ftl new file mode 100644 index 0000000000..a6a6144154 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Social +hud-social-online = En ligne +hud-social-friends = Amis +hud-social-not_yet_available = Pas encore disponible +hud-social-faction = Faction +hud-social-play_online_fmt = { $nb_player } joueur(s) en ligne +hud-social-name = Nom +hud-social-level = Niveau +hud-social-zone = Zone +hud-social-account = Compte \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/social.ron b/assets/voxygen/i18n/fr_FR/hud/social.ron deleted file mode 100644 index c52469af19..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/social.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.social": "Social", - "hud.social.online": "En ligne", - "hud.social.friends": "Amis", - "hud.social.not_yet_available": "Pas encore disponible", - "hud.social.faction": "Faction", - "hud.social.play_online_fmt": "{nb_player} joueur(s) en ligne", - "hud.social.name": "Nom", - "hud.social.level": "Niveau", - "hud.social.zone": "Zone", - "hud.social.account": "Compte", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/fr_FR/hud/trade.ftl b/assets/voxygen/i18n/fr_FR/hud/trade.ftl new file mode 100644 index 0000000000..25a4c171c4 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Fenêtre d'échange +hud-trade-phase1_description = + Déposez les objets que vous souhaitez + échanger dans la zone correspondante. +hud-trade-phase2_description = + L'échange est désormais bloqué pour + vous laisser le temps de vérifier les objets. +hud-trade-phase3_description = Échange en cours. +hud-trade-persons_offer = Offre de { $playername } +hud-trade-has_accepted = + { $playername } + a accepté +hud-trade-accept = Accepter +hud-trade-decline = Décliner +hud-trade-invite_sent = Demande d'échange envoyé à { $playername }. +hud-trade-result-completed = Échange complété avec succès. +hud-trade-result-declined = Échange décliné. +hud-trade-result-nospace = Pas assez d'espace libre pour compléter l'échange. +hud-trade-buy_price = Prix d'achat +hud-trade-sell_price = Prix de vente +hud-trade-coin = pièce(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Votre offre +hud-trade-their_offer = Son offre +hud-trade-amount_input = Seléctionner un objet \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/hud/trade.ron b/assets/voxygen/i18n/fr_FR/hud/trade.ron deleted file mode 100644 index 070531f3d5..0000000000 --- a/assets/voxygen/i18n/fr_FR/hud/trade.ron +++ /dev/null @@ -1,33 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "hud.trade.trade_window": "Fenêtre d'échange", - "hud.trade.phase1_description": "Déposez les objets que vous souhaitez\n échanger dans la zone correspondante.", - "hud.trade.phase2_description": "L'échange est désormais bloqué pour\n vous laisser le temps de vérifier les objets.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Échange en cours.", - "hud.trade.persons_offer": "Offre de {playername}", - "hud.trade.has_accepted": "{playername}\na accepté", - "hud.trade.accept": "Accepter", - "hud.trade.decline": "Décliner", - "hud.trade.invite_sent": "Demande d'échange envoyé à {playername}.", - "hud.trade.result.completed": "Échange complété avec succès.", - "hud.trade.result.declined": "Échange décliné.", - "hud.trade.result.nospace": "Pas assez d'espace libre pour compléter l'échange.", - "hud.trade.buy_price": "Prix d'achat", - "hud.trade.sell_price": "Prix de vente", - "hud.trade.coin": "pièce(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Votre offre", - "hud.trade.their_offer": "Son offre", - "hud.trade.amount_input": "Seléctionner un objet" - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/fr_FR/main.ftl b/assets/voxygen/i18n/fr_FR/main.ftl new file mode 100644 index 0000000000..47f965dfc7 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/main.ftl @@ -0,0 +1,94 @@ +main-username = Nom d'utilisateur +main-server = Serveur +main-password = Mot de passe +main-connecting = Connexion +main-creating_world = Création du monde +main-tip = Astuce: +main-notice = + Bienvenue dans la version alpha de Veloren ! + + Avant de commencer à vous amuser, merci de garder les choses suivantes en tête : + + - Il s'agit d'une version alpha très jeune. Attendez-vous à des bugs, un gameplay non terminé, des mécaniques non peaufinées et des fonctionalités manquantes. + + - Si vous avez des retours constructifs ou avez detecté un bug, vous pouvez nous contacter via Reddit, GitLab ou notre serveur communautaire Discord. + + - Veloren est un logiciel open-source sous licence GPL3. Cela signifit que vous êtes libre de jouer, modfier et redistribuer le jeu comme il vous semble (licence contaminante sous GPL 3 pour toute modification) + + - Veloren est un projet communautaire à but non-lucratif développé par des bénévoles. + Si vous appréciez ce jeu, vous êtes les bienvenus pour rejoindre les équipes de développement ou d'artistes! + + Merci d'avoir pris le temps de lire cette annonce, nous espérons que vous apprécierez le jeu! + + ~ L'équipe de Veloren +main-login_process = + Information sur la procédure de connexion: + + Vous devez à présent posséder un compte + afin de jouer sur les serveurs avec authentification. + + Vous pouvez créer un compte à l'adresse + + https://veloren.net/account/. +main-login-server_not_found = Serveur introuvable +main-login-authentication_error = Erreur d'authentification sur le serveur +main-login-internal_error = Erreur interne du client (Certainement suite à la suppression d'un personnage) +main-login-failed_auth_server_url_invalid = Échec de connexion au serveur d'authentification +main-login-insecure_auth_scheme = Le schéma d'authentification HTTP n'est PAS pris en charge. Ce n'est pas sécurisé ! À des fins de développement, HTTP est autorisé pour 'localhost' ou les build de débogage. +main-login-server_full = Serveur plein +main-login-untrusted_auth_server = Le serveur d'authentification n'est pas de confiance +main-login-outdated_client_or_server = ServeurPasContent: Les versions sont probablement incompatibles, verifiez les mises à jour. +main-login-timeout = DélaiEcoulé: Le serveur n'a pas répondu à temps. (Surchage ou problèmes réseau). +main-login-server_shut_down = Extinction du Serveur +main-login-network_error = Problème Réseau +main-login-network_wrong_version = Le serveur fonctionne avec une version différente de la vôtre. Vérifiez votre version et mettez votre jeu à jour. +main-login-failed_sending_request = Demande d'authentification serveur échouée +main-login-invalid_character = Le personnage sélectionné n'est pas valide +main-login-client_crashed = Le client a planté +main-login-not_on_whitelist = Vous devez être ajouté à la liste blanche par un Admin pour pouvoir entrer +main-login-banned = Vous avez été banni pour la raison suivante +main-login-kicked = Vous avez été exclus pour la raison suivante +main-login-select_language = Sélectionnez une langue +main-login-client_version = Version du client +main-login-server_version = Version du serveur +main-login-client_init_failed = Le client n'a pas réussi à s'initialiser: { $init_fail_reason } +main-login-username_bad_characters = Le pseudo contient des caractères invalides! (Seulement alphanumériques, '_' et '-' sont autorisés) +main-login-username_too_long = Pseudo trop long! La taille maximum est: { $max_len } +main-servers-select_server = Sélectionnez un serveur +main-servers-singleplayer_error = Échec de connexion au serveur interne: { $sp_error } +main-servers-network_error = Réseau serveur/socket erreur: { $raw_error } +main-servers-participant_error = Participant déconnecté/erreur protocole: { $raw_error } +main-servers-stream_error = Connexion du client/compression/(dé)sérialisation erreur: { $raw_error } +main-servers-database_error = Erreur base de données serveur: { $raw_error } +main-servers-persistence_error = Erreur serveur persistante (Probablement données Asset/Character liées): { $raw_error } +main-servers-other_error = Erreur général serveur: { $raw_error } +main-credits = Crédits +main-credits-created_by = créé par +main-credits-music = Musiques +main-credits-fonts = Polices d'écriture +main-credits-other_art = Autre Art +main-credits-contributors = Contributeurs +loading-tips = + .a0 = Appuyez sur '{ $gameinput-togglelantern }' pour allumer ta lanterne. + .a1 = Appuyez sur '{ $gameinput-help }' pour voir les raccourcis clavier par défaut. + .a2 = Vous pouvez taper /say ou /s pour discuter aux joueurs directement à côté toi. + .a3 = Vous pouvez taper /region ou /r pour discuter avec les joueurs situés à quelques centaines de blocs de toi. + .a4 = Pour envoyer un message privé, tapez /tell suivi par un nom de joueur puis votre message. + .a5 = Des PNJs avec le même niveau peuvent varier en difficulté. + .a6 = Regardez le sol pour trouver de la nourriture, des coffres et d'autres butins ! + .a7 = Votre inventaire est rempli de nourriture ? Essayez de créer un meilleur repas avec ! + .a8 = Vous cherchez une activité ? Essayez de visiter un des donjons marqués sur la carte ! + .a9 = N'oubliez pas d'ajuster les graphismes pour votre système. Appuyez sur '{ $gameinput-settings }' pour ouvrir les paramètres. + .a10 = Jouer à plusieurs est amusant ! Appuyez sur '{ $gameinput-social }' pour voir qui est en ligne. + .a11 = Un PNJ avec une tête de mort sous sa barre de vie est plus puissant que vous. + .a12 = Appuyez sur '{ $gameinput-dance }' pour danser. C'est la fête ! + .a13 = Appuyez sur '{ $gameinput-glide }' pour ouvrir votre deltaplane et conquérir les cieux. + .a14 = Veloren est encore en Pré-Alpha. Nous faisons de notre mieux pour l'améliorer chaque jour ! + .a15 = Si vous voulez vous joindre à l'équipe de développement ou juste discuter avec nous, rejoignez notre serveur Discord. + .a16 = Vous pouvez afficher ou non combien de santé vous avez dans les options. + .a17 = Pour voir vos statistiques, cliquez sur le bouton 'Stats' dans l'inventaire + .a18 = Asseyez-vous près d'un feu de camp (avec la touche '{ $gameinput-sit }') pour vous reposer - cela régénèrera votre santé. + .a19 = Besoin de plus de sacs ou de meilleures armures pour continuer votre aventure ? Appuyez sur '{ $gameinput-crafting }' pour ouvrir le menu de craft! + .a20 = Appuyez sur '{ $gameinput-roll }' pour rouler. Faire une roulade peut être utilisé pour se déplacer plus vite et esquiver les attaques ennemies. + .a21 = Vous vous demandez à quoi sert un objet ? Rechercher 'input:' dans le menu de craft pour voir dans quelle(s) recette(s) il est utilisé. + .a22 = Vous avez trouver quelque chose de cool ? Prenez une capture d'écran à l'aide de '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/main.ron b/assets/voxygen/i18n/fr_FR/main.ron deleted file mode 100644 index 9afdcece6d..0000000000 --- a/assets/voxygen/i18n/fr_FR/main.ron +++ /dev/null @@ -1,112 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - "main.username": "Nom d'utilisateur", - "main.server": "Serveur", - "main.password": "Mot de passe", - "main.connecting": "Connexion", - "main.creating_world": "Création du monde", - "main.tip": "Astuce:", - - // Annonce de bienvenue qui apparaît la première fois que Veloren est lancé - "main.notice": r#"Bienvenue dans la version alpha de Veloren ! - -Avant de commencer à vous amuser, merci de garder les choses suivantes en tête : - -- Il s'agit d'une version alpha très jeune. Attendez-vous à des bugs, un gameplay non terminé, des mécaniques non peaufinées et des fonctionalités manquantes. - -- Si vous avez des retours constructifs ou avez detecté un bug, vous pouvez nous contacter via Reddit, GitLab ou notre serveur communautaire Discord. - -- Veloren est un logiciel open-source sous licence GPL3. Cela signifit que vous êtes libre de jouer, modfier et redistribuer le jeu comme il vous semble (licence contaminante sous GPL 3 pour toute modification) - -- Veloren est un projet communautaire à but non-lucratif développé par des bénévoles. -Si vous appréciez ce jeu, vous êtes les bienvenus pour rejoindre les équipes de développement ou d'artistes! - -Merci d'avoir pris le temps de lire cette annonce, nous espérons que vous apprécierez le jeu! - -~ L'équipe de Veloren"#, - - //Informations de connection - "main.login_process": r#"Information sur la procédure de connexion: - -Vous devez à présent posséder un compte -afin de jouer sur les serveurs avec authentification. - -Vous pouvez créer un compte à l'adresse - -https://veloren.net/account/."#, - "main.login.server_not_found": "Serveur introuvable", - "main.login.authentication_error": "Erreur d'authentification sur le serveur", - "main.login.internal_error": "Erreur interne du client (Certainement suite à la suppression d'un personnage)", - "main.login.failed_auth_server_url_invalid": "Échec de connexion au serveur d'authentification", - "main.login.insecure_auth_scheme": "Le schéma d'authentification HTTP n'est PAS pris en charge. Ce n'est pas sécurisé ! À des fins de développement, HTTP est autorisé pour 'localhost' ou les build de débogage.", - "main.login.server_full": "Serveur plein", - "main.login.untrusted_auth_server": "Le serveur d'authentification n'est pas de confiance", - "main.login.outdated_client_or_server": "ServeurPasContent: Les versions sont probablement incompatibles, verifiez les mises à jour.", - "main.login.timeout": "DélaiEcoulé: Le serveur n'a pas répondu à temps. (Surchage ou problèmes réseau).", - "main.login.server_shut_down": "Extinction du Serveur", - "main.login.network_error": "Problème Réseau", - "main.login.network_wrong_version": "Le serveur fonctionne avec une version différente de la vôtre. Vérifiez votre version et mettez votre jeu à jour.", - "main.login.failed_sending_request": "Demande d'authentification serveur échouée", - "main.login.invalid_character": "Le personnage sélectionné n'est pas valide", - "main.login.client_crashed": "Le client a planté", - "main.login.not_on_whitelist": "Vous devez être ajouté à la liste blanche par un Admin pour pouvoir entrer", - "main.login.banned": "Vous avez été banni pour la raison suivante", - "main.login.kicked": "Vous avez été exclus pour la raison suivante", - "main.login.select_language": "Sélectionnez une langue", - "main.login.client_version": "Version du client", - "main.login.server_version": "Version du serveur", - "main.login.client_init_failed": "Le client n'a pas réussi à s'initialiser: {init_fail_reason}", - "main.login.username_bad_characters": "Le pseudo contient des caractères invalides! (Seulement alphanumériques, '_' et '-' sont autorisés)", - "main.login.username_too_long": "Pseudo trop long! La taille maximum est: {max_len}", - "main.servers.select_server": "Sélectionnez un serveur", - "main.servers.singleplayer_error": "Échec de connexion au serveur interne: {sp_error}", - "main.servers.network_error": "Réseau serveur/socket erreur: {raw_error}", - "main.servers.participant_error": "Participant déconnecté/erreur protocole: {raw_error}", - "main.servers.stream_error": "Connexion du client/compression/(dé)sérialisation erreur: {raw_error}", - "main.servers.database_error": "Erreur base de données serveur: {raw_error}", - "main.servers.persistence_error": "Erreur serveur persistante (Probablement données Asset/Character liées): {raw_error}", - "main.servers.other_error": "Erreur général serveur: {raw_error}", - - // Credits screen - "main.credits": "Crédits", - "main.credits.created_by": "créé par", - "main.credits.music": "Musiques", - "main.credits.fonts": "Polices d'écriture", - "main.credits.other_art": "Autre Art", - "main.credits.contributors": "Contributeurs", - - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Appuyez sur '{gameinput.togglelantern}' pour allumer ta lanterne.", - "Appuyez sur '{gameinput.help}' pour voir les raccourcis clavier par défaut.", - "Vous pouvez taper /say ou /s pour discuter aux joueurs directement à côté toi.", - "Vous pouvez taper /region ou /r pour discuter avec les joueurs situés à quelques centaines de blocs de toi.", - "Pour envoyer un message privé, tapez /tell suivi par un nom de joueur puis votre message.", - "Des PNJs avec le même niveau peuvent varier en difficulté.", - "Regardez le sol pour trouver de la nourriture, des coffres et d'autres butins !", - "Votre inventaire est rempli de nourriture ? Essayez de créer un meilleur repas avec !", - "Vous cherchez une activité ? Essayez de visiter un des donjons marqués sur la carte !", - "N'oubliez pas d'ajuster les graphismes pour votre système. Appuyez sur '{gameinput.settings}' pour ouvrir les paramètres.", - "Jouer à plusieurs est amusant ! Appuyez sur '{gameinput.social}' pour voir qui est en ligne.", - "Un PNJ avec une tête de mort sous sa barre de vie est plus puissant que vous.", - "Appuyez sur '{gameinput.dance}' pour danser. C'est la fête !", - "Appuyez sur '{gameinput.glide}' pour ouvrir votre deltaplane et conquérir les cieux.", - "Veloren est encore en Pré-Alpha. Nous faisons de notre mieux pour l'améliorer chaque jour !", - "Si vous voulez vous joindre à l'équipe de développement ou juste discuter avec nous, rejoignez notre serveur Discord.", - "Vous pouvez afficher ou non combien de santé vous avez dans les options.", - "Pour voir vos statistiques, cliquez sur le bouton 'Stats' dans l'inventaire", - "Asseyez-vous près d'un feu de camp (avec la touche '{gameinput.sit}') pour vous reposer - cela régénèrera votre santé.", - "Besoin de plus de sacs ou de meilleures armures pour continuer votre aventure ? Appuyez sur '{gameinput.crafting}' pour ouvrir le menu de craft!", - "Appuyez sur '{gameinput.roll}' pour rouler. Faire une roulade peut être utilisé pour se déplacer plus vite et esquiver les attaques ennemies.", - "Vous vous demandez à quoi sert un objet ? Rechercher 'input:' dans le menu de craft pour voir dans quelle(s) recette(s) il est utilisé.", - "Vous avez trouver quelque chose de cool ? Prenez une capture d'écran à l'aide de '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/fr_FR/npc.ftl b/assets/voxygen/i18n/fr_FR/npc.ftl new file mode 100644 index 0000000000..3602c780d2 --- /dev/null +++ b/assets/voxygen/i18n/fr_FR/npc.ftl @@ -0,0 +1,216 @@ +npc-speech-villager = + .a0 = J'adore le fromage. +npc-speech-villager_open = + .a0 = Je me demande à quoi pense les Catoplébas lorsqu'ils mangent de l'herbe. + .a1 = What do you suppose makes Glowing Remains glow? + .a2 = As-tu déjà entendu parler des féroces Requins Terrestres? J'ai entendu dire qu'ils vivaient dans les déserts. + .a3 = Je me demande ce qu'il y a de l'autre côté de la montagne. + .a4 = J'ai laissé du fromage à mon frère. Maintenant je ne sais pas s'il existe toujours ou non. Je l'ai appelé le fromage de Schrödinger. + .a5 = As-tu déjà attrapé une luciole? + .a6 = Ils disent que des gemmes brillantes en tout genre peuvent être trouvées dans les cavernes. + .a7 = Je ne peux tout simplement pas comprendre d'où ces Sauroks continuent de venir. +npc-speech-villager_adventurous = + .a0 = J'espère créer mon propre planeur un jour. + .a1 = J'aimerai explorer les cavernes quand je serai plus fort. +npc-speech-villager_closed = + .a0 = Tu n'es pas du coin n'est-ce-pas ? + .a1 = Tu ne pense pas que notre vilage est le meilleur ? + .a2 = Ils disent que les champignons sont bons pour la santé. Je n'en ai jamais mangé personnellement. + .a3 = Être, ou ne pas être? Je pense que je deviendrai un fermier. +npc-speech-villager_conscientious = + .a0 = Je suis toujours occupé. Il y a toujours quelque chose à faire. + .a1 = J'espère qu'il va bientôt pleuvoir. Ce serait bien pour les plantes. +npc-speech-villager_busybody = + .a0 = Tout le monde devrait parler moins et travailler plus. +npc-speech-villager_unconscientious = + .a0 = Je pense qu'il est temps pour un second déjeuner! + .a1 = J'aurai souhaité que ma maison ne soit pas autant dérangée. Désormais, je dois tout ranger! Haha! + .a2 = Où ai-je bien pu mettre ceci... +npc-speech-villager_extroverted = + .a0 = Tu ne vas pas croire ce que j'ai fais ce week-end! + .a1 = Bonne journée! + .a2 = Que penses-tu de ce temps ? + .a3 = Je suis juste fana de fromage! + .a4 = N'oublie pas les crackers! + .a5 = J'adore tout simplement le fromage de nain. J'aurai aimé pouvoir en faire. + .a6 = J'ai eu un super rêve à propos de fromage la nuit dernière. Qu'est-ce senser signifier ? + .a7 = J'aime le miel! Et je déteste les abeilles. +npc-speech-villager_sociable = + .a0 = Tu ne viens pas ? Nous étions sur le points de passer au fromage! + .a1 = Tu veux voir mon jardin? D'accord, peut-être une autre fois. +npc-speech-villager_introverted = + .a0 = Bonjour. + .a1 = Oh moi? Je ne suis pas particulier. +npc-speech-villager_agreeable = + .a0 = Comment vas-tu aujourd'hui? + .a1 = Dis-moi juste si tu as besoin de quoi que ce soit. + .a2 = As-tu vu mon chat? +npc-speech-villager_worried = + .a0 = Fais attention, d'accord? Il y a tellement de danger par ici. +npc-speech-villager_disagreeable = + .a0 = Je le dis comme ça. Si les gens n'aime pas ça, tant pis. + .a1 = Tout le monde est offensé trop facilement. +npc-speech-villager_neurotic = + .a0 = Penser à ces donjons me fait peur. J'espère que quelqu'un viendra les compléter. + .a1 = Quelqu'un devrait faire quelque chose à propos de ces cultistes. Préférablement pas moi. + .a2 = J'ai le sentiment que quelque chose de mal va arriver. + .a3 = J'aimerai que quelqu'un garde ces loups loin du village. +npc-speech-villager_sad_loner = + .a0 = Je me sens si seul. + .a1 = ... Désolé à propos de cet étrange silence. Je ne suis pas très sociable. +npc-speech-villager_seeker = + .a0 = J'aimerai voir le monde un jour. Il devrait y avoir plus de personnes que dans ce village. +npc-speech-villager_stable = + .a0 = N'est-ce-pas un merveilleux jour? + .a1 = La vie n'est pas trop mal. + .a2 = Super journée pour se balader dans les bois! +npc-speech-villager_decline_trade = + .a0 = Désolé, je n'ai rien à échanger. + .a1 = Échanger? Comme-si j'avais quoi que ce soit qui pourrait t'intéresser. + .a2 = Ma maison est à moi, je ne l'échangerai pour rien au monde. +npc-speech-villager_busy = + .a0 = Désolé, je ne peux pas vous parler pour le moment. + .a1 = On verra ça plus tard, je suis occupé. +npc-speech-merchant_advertisement = + .a0 = Puis-je t'intéresser par un échange ? + .a1 = Veux-tu échanger avec moi? + .a2 = J'ai plein d'objets, Tu veux jeter un coup d'oeil? +npc-speech-merchant_busy = + .a0 = S'il te plaît attends, Je ne suis qu'une personne. + .a1 = Un petit moment, laisse moi finir. + .a2 = Je suis occupé, reviens plus tard. +npc-speech-merchant_busy_rude = + .a0 = Hey, attends ton tour. + .a1 = Tu ne vois pas qu'il y avait quelqu'un avant toi? + .a2 = On ne dépasse pas dans la file. +npc-speech-merchant_trade_successful = + .a0 = Merci d'avoir échangé avec moi! + .a1 = Merci! +npc-speech-merchant_trade_declined = + .a0 = Peut-être une autre fois, bonne journée! + .a1 = Mince, peut-être une autre fois alors! +npc-speech-merchant_trade_cancelled_hostile = + .a0 = On va devoir arrêter là pour l'instant, on a un problème à régler ! + .a1 = On finira cet échange une prochaine fois, il y a une urgence par ici ! +npc-speech-villager_cultist_alarm = + .a0 = Regarde! Il y a un cultiste errant! + .a1 = Aux armes! Les cultistes attaquent! + .a2 = Comment les cultistes osent-ils attaquer notre village! + .a3 = Mort aux cultistes! + .a4 = Les cultistes ne sont pas tolérés ici! + .a5 = Cultiste meurtrié! + .a6 = Goûte à la pointe de mon épée, satané cultiste! + .a7 = Rien ne peut nettoyer le sang sur vos mains, cultistes! + .a8 = Mille millions de mille sabords! Un cultiste parmi nous! + .a9 = Les actes démoniaques de ce cultiste sont sur le point d'arriver à leur fin! + .a10 = Ce cultiste est à moi! + .a11 = Prépare toi à rencontrer ton créateur, satané cultiste! + .a12 = J'ai vu un cultiste! Attrapez-le! + .a13 = J'ai vu un cultiste! Attaquez! + .a14 = J'ai vu un cultiste! Ne le laissez pas s'échapper! + .a15 = Est-ce que le cultiste le plus honorable prête attention à une quelconque MORT?! + .a16 = Ne pardonnez jamais! N'oubliez jamais! Cultiste, regrette! + .a17 = Meurs, cultiste! + .a18 = Votre règne de terreur est sur le point de cesser! + .a19 = Ça c'est pour tout ce que tu as fais! + .a20 = Nous ne traitons pas gentilement les gens de ton genre par ici. + .a21 = Tu aurais dû rester sous terre! +npc-speech-villager_under_attack = + .a0 = À l'aide, on m'attaque! + .a1 = À l'aide, on m'attaque! + .a2 = Ouch, on m'attaque! + .a3 = Ouch, on m'attaque! À l'aide! + .a4 = À l'aide, on m'attaque! + .a5 = On m'attaque! À l'aide! + .a6 = On m'attaque! À l'aide! + .a7 = À l'aide! + .a8 = À l'aide! À l'aide! + .a9 = À l'aide! À l'aide! À l'aide! + .a10 = On m'attaque! + .a11 = AAAHHH! On m'attaque! + .a12 = AAAHHH! On m'attaque! À l'aide! + .a13 = À l'aide, on se fait attaquer! + .a14 = À l'aide! Meurtrier! + .a15 = À l'aide! Il y a un meurtrier en liberté! + .a16 = À l'aide! Ils tentent de me tuer! + .a17 = Guardes, on m'attaque! + .a18 = Guardes, on m'attaque! + .a19 = On m'attaque! Guardes! + .a20 = À l'aide! Guardes! On m'attaque! + .a21 = Guardes! Venez-vite! + .a22 = Guardes! Guardes! + .a23 = Guardes! Il y a un vilain qui m'attaque! + .a24 = Guardes, découpez ce satané vilain! + .a25 = Guardes! Il y a un meurtrier! + .a26 = Guardes! À l'aide! + .a27 = Tu ne t'enfuiras pas comme ça! Guardes! + .a28 = Démon! + .a29 = À l'aide! + .a30 = À l'aide! S'il-vous-plaît! + .a31 = Ouch! Guardes! À l'aide! + .a32 = Ils viennent pour moi! + .a33 = À l'aide! À l'aide! Je me fais opprimé! + .a34 = Ah, maintenant on peut voir la violence inhérente de ce système. + .a35 = Ce n'est qu'une égratignure! + .a36 = Arrête ça! + .a37 = Que t'ai-je donc fais?! + .a38 = S'il-te-plaît arrêter de m'attaquer! + .a39 = Hey! Fais attention à où tu pointes ce truc! + .a40 = Misérable ingrat, disparaîs! + .a41 = Arrête! Va t'en! + .a42 = Maintenant tu m'énerves! + .a43 = Oi! Qui penses-tu être?! + .a44 = J'aurai ta tête pour ça! + .a45 = Arrête, s'il-te-plaît! Je ne possède rien de valeur! + .a46 = Je vais appeler mon frère, il est plus fort que moi! + .a47 = Nooon, je vais le dire à ma mère! + .a48 = Sois maudit! + .a49 = S'il-te-plaît ne fait pas ça. + .a50 = C'est vraiment pô nice! + .a51 = Ton arme fonctionne, tu peux l'écarter maintenant! + .a52 = Épargne-moi! + .a53 = S'il-te-plaît, j'ai une famille! + .a54 = Je suis trop jeune pour mourrir! + .a55 = Peut-on parler en parler? + .a56 = La violence n'est jamais une solution! + .a57 = Aujourd'hui vient de devenir un mauvais jour... + .a58 = Hey, ça fait mal! + .a59 = Eek! + .a60 = Si rude! + .a61 = Arrête, je t'en supplie! + .a62 = Va au diable! + .a63 = Ce n'est pas marrant. + .a64 = Comment oses-tu?! + .a65 = Tu vas payer pour ça! + .a66 = Continue comme ça et tu vas être désolé! + .a67 = Ne me fais pas te faire du mal! + .a68 = Il doit y avoir une incompréhension! + .a69 = Tu n'as pas besoin de faire ça! + .a70 = Disparaîs, démon! + .a71 = Ça fait un mal de chien! + .a72 = Pourquoi fais-tu ça? + .a73 = Par les esprits, arrête! + .a74 = Tu dois me confondre avec quelqu'un d'autre! + .a75 = Je ne mérite pas ça! + .a76 = S'il-te-plaît ne refais pas ça. + .a77 = Guardes, jetez ce monstre dans le lac! + .a78 = Je vais t'envoyer mon tarasque! + .a79 = Pourquoi moiiiiiii? +npc-speech-villager_enemy_killed = + .a0 = J'ai détruis mon ennemi! + .a1 = Enfin en paix! + .a2 = ... Bon, maintenant on fait quoi? +npc-speech-menacing = + .a0 = Je te préviens! + .a1 = Approche toi encore et je t'attaques! + .a2 = Tu ne me fais pas peur! + .a3 = Va t-en d'ici! + .a4 = Fais demi-tour si tu veux vivre! + .a5 = Tu n'es pas la bienvenue ici! +npc-speech-cultist_low_health_fleeing = + .a0 = Retraite pour la cause! + .a1 = Retraite! + .a2 = Sois maudit! + .a3 = Je te maudirai depuis l'Au-delà! + .a4 = Je dois me reposer! + .a5 = Ils sont bien trop forts! \ No newline at end of file diff --git a/assets/voxygen/i18n/fr_FR/npc.ron b/assets/voxygen/i18n/fr_FR/npc.ron deleted file mode 100644 index 5561d7fc6c..0000000000 --- a/assets/voxygen/i18n/fr_FR/npc.ron +++ /dev/null @@ -1,256 +0,0 @@ -/// Localization for French (France locale) -( - string_map: { - - }, - - - vector_map: { - "npc.speech.villager": [ - "J'adore le fromage.", - ], - "npc.speech.villager_open": [ - "Je me demande à quoi pense les Catoplébas lorsqu'ils mangent de l'herbe.", - "What do you suppose makes Glowing Remains glow?", - "As-tu déjà entendu parler des féroces Requins Terrestres? J'ai entendu dire qu'ils vivaient dans les déserts.", - "Je me demande ce qu'il y a de l'autre côté de la montagne.", - "J'ai laissé du fromage à mon frère. Maintenant je ne sais pas s'il existe toujours ou non. Je l'ai appelé le fromage de Schrödinger.", - "As-tu déjà attrapé une luciole?", - "Ils disent que des gemmes brillantes en tout genre peuvent être trouvées dans les cavernes.", - "Je ne peux tout simplement pas comprendre d'où ces Sauroks continuent de venir.", - ], - "npc.speech.villager_adventurous": [ - "J'espère créer mon propre planeur un jour.", - "J'aimerai explorer les cavernes quand je serai plus fort.", - ], - "npc.speech.villager_closed": [ - "Tu n'es pas du coin n'est-ce-pas ?", - "Tu ne pense pas que notre vilage est le meilleur ?", - "Ils disent que les champignons sont bons pour la santé. Je n'en ai jamais mangé personnellement.", - "Être, ou ne pas être? Je pense que je deviendrai un fermier.", - ], - "npc.speech.villager_conscientious": [ - "Je suis toujours occupé. Il y a toujours quelque chose à faire.", - "J'espère qu'il va bientôt pleuvoir. Ce serait bien pour les plantes.", - ], - "npc.speech.villager_busybody": [ - "Tout le monde devrait parler moins et travailler plus.", - ], - "npc.speech.villager_unconscientious": [ - "Je pense qu'il est temps pour un second déjeuner!", - "J'aurai souhaité que ma maison ne soit pas autant dérangée. Désormais, je dois tout ranger! Haha!", - "Où ai-je bien pu mettre ceci...", - ], - "npc.speech.villager_extroverted": [ - "Tu ne vas pas croire ce que j'ai fais ce week-end!", - "Bonne journée!", - "Que penses-tu de ce temps ?", - "Je suis juste fana de fromage!", - "N'oublie pas les crackers!", - "J'adore tout simplement le fromage de nain. J'aurai aimé pouvoir en faire.", - "J'ai eu un super rêve à propos de fromage la nuit dernière. Qu'est-ce senser signifier ?", - "J'aime le miel! Et je déteste les abeilles.", - ], - "npc.speech.villager_sociable": [ - "Tu ne viens pas ? Nous étions sur le points de passer au fromage!", - "Tu veux voir mon jardin? D'accord, peut-être une autre fois.", - ], - "npc.speech.villager_introverted": [ - "Bonjour.", - "Oh moi? Je ne suis pas particulier.", - ], - "npc.speech.villager_agreeable": [ - "Comment vas-tu aujourd'hui?", - "Dis-moi juste si tu as besoin de quoi que ce soit.", - "As-tu vu mon chat?", - ], - "npc.speech.villager_worried": [ - "Fais attention, d'accord? Il y a tellement de danger par ici.", - ], - "npc.speech.villager_disagreeable": [ - "Je le dis comme ça. Si les gens n'aime pas ça, tant pis.", - "Tout le monde est offensé trop facilement.", - ], - "npc.speech.villager_neurotic": [ - "Penser à ces donjons me fait peur. J'espère que quelqu'un viendra les compléter.", - "Quelqu'un devrait faire quelque chose à propos de ces cultistes. Préférablement pas moi.", - "J'ai le sentiment que quelque chose de mal va arriver.", - "J'aimerai que quelqu'un garde ces loups loin du village.", - ], - "npc.speech.villager_sad_loner": [ - "Je me sens si seul.", - "... Désolé à propos de cet étrange silence. Je ne suis pas très sociable.", - ], - "npc.speech.villager_seeker": [ - "J'aimerai voir le monde un jour. Il devrait y avoir plus de personnes que dans ce village.", - ], - "npc.speech.villager_stable": [ - "N'est-ce-pas un merveilleux jour?", - "La vie n'est pas trop mal.", - "Super journée pour se balader dans les bois!", - ], - "npc.speech.villager_decline_trade": [ - "Désolé, je n'ai rien à échanger.", - "Échanger? Comme-si j'avais quoi que ce soit qui pourrait t'intéresser.", - "Ma maison est à moi, je ne l'échangerai pour rien au monde.", - ], - "npc.speech.villager_busy": [ - "Désolé, je ne peux pas vous parler pour le moment.", - "On verra ça plus tard, je suis occupé." - ], - "npc.speech.merchant_advertisement": [ - "Puis-je t'intéresser par un échange ?", - "Veux-tu échanger avec moi?", - "J'ai plein d'objets, Tu veux jeter un coup d'oeil?" - ], - "npc.speech.merchant_busy": [ - "S'il te plaît attends, Je ne suis qu'une personne.", - "Un petit moment, laisse moi finir.", - "Je suis occupé, reviens plus tard." - ], - "npc.speech.merchant_busy_rude": [ - "Hey, attends ton tour.", - "Tu ne vois pas qu'il y avait quelqu'un avant toi?", - "On ne dépasse pas dans la file.", - ], - "npc.speech.merchant_trade_successful": [ - "Merci d'avoir échangé avec moi!", - "Merci!", - ], - "npc.speech.merchant_trade_declined": [ - "Peut-être une autre fois, bonne journée!", - "Mince, peut-être une autre fois alors!" - ], - "npc.speech.merchant_trade_cancelled_hostile": [ - "On va devoir arrêter là pour l'instant, on a un problème à régler !", - "On finira cet échange une prochaine fois, il y a une urgence par ici !" - ], - "npc.speech.villager_cultist_alarm": [ - "Regarde! Il y a un cultiste errant!", - "Aux armes! Les cultistes attaquent!", - "Comment les cultistes osent-ils attaquer notre village!", - "Mort aux cultistes!", - "Les cultistes ne sont pas tolérés ici!", - "Cultiste meurtrié!", - "Goûte à la pointe de mon épée, satané cultiste!", - "Rien ne peut nettoyer le sang sur vos mains, cultistes!", - "Mille millions de mille sabords! Un cultiste parmi nous!", - "Les actes démoniaques de ce cultiste sont sur le point d'arriver à leur fin!", - "Ce cultiste est à moi!", - "Prépare toi à rencontrer ton créateur, satané cultiste!", - "J'ai vu un cultiste! Attrapez-le!", - "J'ai vu un cultiste! Attaquez!", - "J'ai vu un cultiste! Ne le laissez pas s'échapper!", - "Est-ce que le cultiste le plus honorable prête attention à une quelconque MORT?!", - "Ne pardonnez jamais! N'oubliez jamais! Cultiste, regrette!", - "Meurs, cultiste!", - "Votre règne de terreur est sur le point de cesser!", - "Ça c'est pour tout ce que tu as fais!", - "Nous ne traitons pas gentilement les gens de ton genre par ici.", - "Tu aurais dû rester sous terre!", - ], - "npc.speech.villager_under_attack": [ - "À l'aide, on m'attaque!", - "À l'aide, on m'attaque!", - "Ouch, on m'attaque!", - "Ouch, on m'attaque! À l'aide!", - "À l'aide, on m'attaque!", - "On m'attaque! À l'aide!", - "On m'attaque! À l'aide!", - "À l'aide!", - "À l'aide! À l'aide!", - "À l'aide! À l'aide! À l'aide!", - "On m'attaque!", - "AAAHHH! On m'attaque!", - "AAAHHH! On m'attaque! À l'aide!", - "À l'aide, on se fait attaquer!", - "À l'aide! Meurtrier!", - "À l'aide! Il y a un meurtrier en liberté!", - "À l'aide! Ils tentent de me tuer!", - "Guardes, on m'attaque!", - "Guardes, on m'attaque!", - "On m'attaque! Guardes!", - "À l'aide! Guardes! On m'attaque!", - "Guardes! Venez-vite!", - "Guardes! Guardes!", - "Guardes! Il y a un vilain qui m'attaque!", - "Guardes, découpez ce satané vilain!", - "Guardes! Il y a un meurtrier!", - "Guardes! À l'aide!", - "Tu ne t'enfuiras pas comme ça! Guardes!", - "Démon!", - "À l'aide!", - "À l'aide! S'il-vous-plaît!", - "Ouch! Guardes! À l'aide!", - "Ils viennent pour moi!", - "À l'aide! À l'aide! Je me fais opprimé!", - "Ah, maintenant on peut voir la violence inhérente de ce système.", - "Ce n'est qu'une égratignure!", - "Arrête ça!", - "Que t'ai-je donc fais?!", - "S'il-te-plaît arrêter de m'attaquer!", - "Hey! Fais attention à où tu pointes ce truc!", - "Misérable ingrat, disparaîs!", - "Arrête! Va t'en!", - "Maintenant tu m'énerves!", - "Oi! Qui penses-tu être?!", - "J'aurai ta tête pour ça!", - "Arrête, s'il-te-plaît! Je ne possède rien de valeur!", - "Je vais appeler mon frère, il est plus fort que moi!", - "Nooon, je vais le dire à ma mère!", - "Sois maudit!", - "S'il-te-plaît ne fait pas ça.", - "C'est vraiment pô nice!", - "Ton arme fonctionne, tu peux l'écarter maintenant!", - "Épargne-moi!", - "S'il-te-plaît, j'ai une famille!", - "Je suis trop jeune pour mourrir!", - "Peut-on parler en parler?", - "La violence n'est jamais une solution!", - "Aujourd'hui vient de devenir un mauvais jour...", - "Hey, ça fait mal!", - "Eek!", - "Si rude!", - "Arrête, je t'en supplie!", - "Va au diable!", - "Ce n'est pas marrant.", - "Comment oses-tu?!", - "Tu vas payer pour ça!", - "Continue comme ça et tu vas être désolé!", - "Ne me fais pas te faire du mal!", - "Il doit y avoir une incompréhension!", - "Tu n'as pas besoin de faire ça!", - "Disparaîs, démon!", - "Ça fait un mal de chien!", - "Pourquoi fais-tu ça?", - "Par les esprits, arrête!", - "Tu dois me confondre avec quelqu'un d'autre!", - "Je ne mérite pas ça!", - "S'il-te-plaît ne refais pas ça.", - "Guardes, jetez ce monstre dans le lac!", - "Je vais t'envoyer mon tarasque!", - "Pourquoi moiiiiiii?", - ], - "npc.speech.villager_enemy_killed": [ - "J'ai détruis mon ennemi!", - "Enfin en paix!", - "... Bon, maintenant on fait quoi?", - ], - "npc.speech.menacing": [ - "Je te préviens!", - "Approche toi encore et je t'attaques!", - "Tu ne me fais pas peur!", - "Va t-en d'ici!", - "Fais demi-tour si tu veux vivre!", - "Tu n'es pas la bienvenue ici!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Retraite pour la cause!", - "Retraite!", - "Sois maudit!", - "Je te maudirai depuis l'Au-delà!", - "Je dois me reposer!", - "Ils sont bien trop forts!", - ] - } -) diff --git a/assets/voxygen/i18n/hu_HU/buff.ftl b/assets/voxygen/i18n/hu_HU/buff.ftl new file mode 100644 index 0000000000..e7cba9b57d --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Kattints rá, hogy eltávolítsd +buff-title-missing = Hiányzó név +buff-desc-missing = Hiányzó leírás +buff-title-heal = Gyógyulás +buff-desc-heal = Életerő visszatöltődése bizonyos idő alatt. +buff-title-potion = Főzet +buff-desc-potion = Ivás... +buff-title-saturation = Jóllakottság +buff-desc-saturation = Életerő visszatöltése bizonyos idő alatt élelmiszerek elfogasztásával. +buff-title-campfire_heal = Gyógyulás tábortűznél +buff-desc-campfire_heal = A tábortűz melletti pihenés { $rate }% életerőt tölt vissza másodpercenként. +buff-title-invulnerability = Sebezhetetlenség +buff-desc-invulnerability = Nem fog rajtad semmilyen támadás. +buff-title-protectingward = Védőburok +buff-desc-protectingward = Valamelyest védve vagy az ellenséges támadásoktól. +buff-title-frenzied = Dühöngés +buff-desc-frenzied = Természetfeletti sebességgel vagy felruházva, a kisebb sérülések pedig meg sem kottyannak neked. +buff-title-bleed = Vérzés +buff-desc-bleed = Normál sebződéssel jár. +buff-title-cursed = Megátkozódás +buff-desc-cursed = Meg lettél átkozva. +buff-title-burn = Lángolás +buff-desc-burn = Lángba borultál. +buff-title-crippled = Megbénulás +buff-desc-crippled = A lábad súlyosan megsérült, így nehezedre esik mozogni. +buff-title-frozen = Megfagyás +buff-desc-frozen = Lelassultak mind a mozdulataid, mind a támadásaid. +buff-title-wet = Nedvesség +buff-desc-wet = A föld csúszóssá vált, így igencsak nehéz megállnod rajta. +buff-title-ensnared = Csapdába ejtve +buff-desc-ensnared = Indák kapaszkodnak a lábadba, így szinte lehetetlenné vált számodra a mozgás. +buff-stat-health = { $str_total } életerőt tölt vissza +buff-stat-increase_max_energy = Megnöveli a maximális energiát ennyivel: { $strength } +buff-stat-increase_max_health = Megnöveli a maximális életerőt ennyivel: { $strength } +buff-stat-invulnerability = Sebezhetetlenné tesz +buff-text-over_seconds = { $dur_secs } másodpercre +buff-text-for_seconds = { $dur_secs } másodpercig \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/buff.ron b/assets/voxygen/i18n/hu_HU/buff.ron deleted file mode 100644 index 5a0f8eee85..0000000000 --- a/assets/voxygen/i18n/hu_HU/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - // Buffs - "buff.remove": "Kattints rá, hogy eltávolítsd", - "buff.title.missing": "Hiányzó név", - "buff.desc.missing": "Hiányzó leírás", - "buff.title.heal": "Gyógyulás", - "buff.desc.heal": "Életerő visszatöltődése bizonyos idő alatt.", - "buff.title.potion": "Főzet", - "buff.desc.potion": "Ivás...", - "buff.title.saturation": "Jóllakottság", - "buff.desc.saturation": "Életerő visszatöltése bizonyos idő alatt élelmiszerek elfogasztásával.", - "buff.title.campfire_heal": "Gyógyulás tábortűznél", - "buff.desc.campfire_heal": "A tábortűz melletti pihenés {rate}% életerőt tölt vissza másodpercenként.", - "buff.title.invulnerability": "Sebezhetetlenség", - "buff.desc.invulnerability": "Nem fog rajtad semmilyen támadás.", - "buff.title.protectingward": "Védőburok", - "buff.desc.protectingward": "Valamelyest védve vagy az ellenséges támadásoktól.", - "buff.title.frenzied": "Dühöngés", - "buff.desc.frenzied": "Természetfeletti sebességgel vagy felruházva, a kisebb sérülések pedig meg sem kottyannak neked.", - // Debuffs - "buff.title.bleed": "Vérzés", - "buff.desc.bleed": "Normál sebződéssel jár.", - "buff.title.cursed": "Megátkozódás", - "buff.desc.cursed": "Meg lettél átkozva.", - "buff.title.burn": "Lángolás", - "buff.desc.burn": "Lángba borultál.", - "buff.title.crippled": "Megbénulás", - "buff.desc.crippled": "A lábad súlyosan megsérült, így nehezedre esik mozogni.", - "buff.title.frozen": "Megfagyás", - "buff.desc.frozen": "Lelassultak mind a mozdulataid, mind a támadásaid.", - "buff.title.wet": "Nedvesség", - "buff.desc.wet": "A föld csúszóssá vált, így igencsak nehéz megállnod rajta.", - "buff.title.ensnared": "Csapdába ejtve", - "buff.desc.ensnared": "Indák kapaszkodnak a lábadba, így szinte lehetetlenné vált számodra a mozgás.", - // Buffs stats - "buff.stat.health": "{str_total} életerőt tölt vissza", - "buff.stat.increase_max_energy": "Megnöveli a maximális energiát ennyivel: {strength}", - "buff.stat.increase_max_health": "Megnöveli a maximális életerőt ennyivel: {strength}", - "buff.stat.invulnerability": "Sebezhetetlenné tesz", - // Text - "buff.text.over_seconds": "{dur_secs} másodpercre", - "buff.text.for_seconds": "{dur_secs} másodpercig", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/char_selection.ftl b/assets/voxygen/i18n/hu_HU/char_selection.ftl new file mode 100644 index 0000000000..62b0b3d596 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Karakterek betöltése... +char_selection-delete_permanently = Végérvényesen törlöd ezt a karaktert? +char_selection-deleting_character = Karakter törlése... +char_selection-change_server = Váltás másik szerverre +char_selection-enter_world = Világ betöltése +char_selection-logout = Kijelentkezés +char_selection-create_new_character = Új karakter létrehozása +char_selection-creating_character = Karakter létrehozása... +char_selection-character_creation = Karakterkészítés +char_selection-human_default = Alapértelmezetten ember +char_selection-level_fmt = Szint { $level_nb } +char_selection-uncanny_valley = Vadon +char_selection-plains_of_uncertainty = Bizonytalanság síksága +char_selection-beard = Szakáll +char_selection-hair_style = Fazon +char_selection-hair_color = Hajszín +char_selection-eye_color = Szemszín +char_selection-skin = Bőrszín +char_selection-eyeshape = Szem tulajdonságai +char_selection-accessories = Kiegészítők +char_selection-create_info_name = Még nincs neve a karakterednek! +char_selection-version_mismatch = VIGYÁZAT! Ezen a szerveren egy másik játékverzió fut, mely lehet, hogy nem kompatibilis az általad használttal. Kérlek frissítsd a játékot. \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/char_selection.ron b/assets/voxygen/i18n/hu_HU/char_selection.ron deleted file mode 100644 index 3eb15a9a8a..0000000000 --- a/assets/voxygen/i18n/hu_HU/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "char_selection.loading_characters": "Karakterek betöltése...", - "char_selection.delete_permanently": "Végérvényesen törlöd ezt a karaktert?", - "char_selection.deleting_character": "Karakter törlése...", - "char_selection.change_server": "Váltás másik szerverre", - "char_selection.enter_world": "Világ betöltése", - "char_selection.logout": "Kijelentkezés", - "char_selection.create_new_character": "Új karakter létrehozása", - "char_selection.creating_character": "Karakter létrehozása...", - "char_selection.character_creation": "Karakterkészítés", - "char_selection.human_default": "Alapértelmezetten ember", - "char_selection.level_fmt": "Szint {level_nb}", - "char_selection.uncanny_valley": "Vadon", - "char_selection.plains_of_uncertainty": "Bizonytalanság síksága", - "char_selection.beard": "Szakáll", - "char_selection.hair_style": "Fazon", - "char_selection.hair_color": "Hajszín", - "char_selection.eye_color": "Szemszín", - "char_selection.skin": "Bőrszín", - "char_selection.eyeshape": "Szem tulajdonságai", - "char_selection.accessories": "Kiegészítők", - "char_selection.create_info_name": "Még nincs neve a karakterednek!", - "char_selection.version_mismatch": "VIGYÁZAT! Ezen a szerveren egy másik játékverzió fut, mely lehet, hogy nem kompatibilis az általad használttal. Kérlek frissítsd a játékot.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/common.ftl b/assets/voxygen/i18n/hu_HU/common.ftl new file mode 100644 index 0000000000..01c717b126 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/common.ftl @@ -0,0 +1,98 @@ +common-username = felhasználónév +common-singleplayer = Egyjátékos mód +common-multiplayer = Többjátékos mód +common-servers = Szerverek +common-quit = Kilépés +common-settings = Beállítások +common-languages = Nyelvek +common-interface = Kezelőfelület +common-gameplay = Játékmenet +common-controls = Irányítás +common-video = Grafika +common-sound = Hang +common-chat = Csevegés +common-resume = Folytatás +common-characters = Karakterek +common-close = Bezár +common-yes = Igen +common-no = Nem +common-back = Vissza +common-create = Létrehoz +common-okay = Rendben +common-add = Hozzáad +common-accept = Elfogad +common-decline = Visszautasít +common-disclaimer = Figyelmeztetés +common-cancel = Mégse +common-none = Egyik sem +common-error = Hiba +common-fatal_error = Végzetes hiba +common-you = Te +common-automatic = Automatikus +common-random = Véletlenszerű +common-empty = Üres +common-interface_settings = Kezelőfelület beállításai +common-gameplay_settings = Játékmenet beállításai +common-controls_settings = Irányítás beállításai +common-video_settings = Grafikai beállítások +common-sound_settings = Hangbeállítások +common-language_settings = Nyelvi beállítások +common-chat_settings = Csevegés beállításai +common-connection_lost = + Megszakadt a kapcsolat! + Újraindult a szerver? + Naprakész a kliens? +common-species-orc = Ork +common-species-human = Ember +common-species-dwarf = Törpe +common-species-elf = Tünde +common-species-draugr = Élőhalott +common-species-danari = Danari +common-weapons-axe = Fejsze +common-weapons-sword = Kard +common-weapons-staff = Mágusbot +common-weapons-bow = Íj +common-weapons-hammer = Pöröly +common-weapons-general = Általános harc +common-weapons-sceptre = Varázsjogar +common-weapons-shield = Pajzs +common-weapons-spear = Lándzsa +common-weapons-hammer_simple = Egyszerű pöröly +common-weapons-sword_simple = Egyszerű kard +common-weapons-staff_simple = Egyszerű mágusbot +common-weapons-axe_simple = Egyszerű fejsze +common-weapons-bow_simple = Egyszerű íj +common-weapons-unique = Egyedi +common-tool-debug = Hibakeresés +common-tool-farming = Földművelési eszköz +common-tool-pick = Csákány +common-tool-mining = Bányászás +common-kind-modular_component = Alkotóelem +common-kind-glider = Sárkányrepülő +common-kind-consumable = Fogyasztási cikk +common-kind-throwable = Eldobható +common-kind-utility = Kellék +common-kind-ingredient = Összetevő +common-kind-lantern = Lámpás +common-hands-one = Egykezes +common-hands-two = Kétkezes +common-rand_appearance = Véletlenszerű kinézet +common-rand_name = Véletlenszerű név +common-stats-combat_rating = KÉ +common-stats-power = Erő +common-stats-speed = Gyorsaság +common-stats-poise = Ellentartás +common-stats-crit_chance = Kritikus találat esélye +common-stats-crit_mult = Kritikus találat szorzója +common-stats-armor = Páncélzat +common-stats-poise_res = Megszédíthetőség +common-stats-energy_max = Maximum energia +common-stats-energy_reward = Energiajutalom +common-stats-crit_power = Kritikus találat ereje +common-stats-stealth = Lopakodás +common-stats-slots = Rekeszek +common-material-metal = Fém +common-material-wood = Fa +common-material-stone = Kő +common-material-cloth = Szövet +common-material-hide = Bőr \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/common.ron b/assets/voxygen/i18n/hu_HU/common.ron deleted file mode 100644 index 37572fb98e..0000000000 --- a/assets/voxygen/i18n/hu_HU/common.ron +++ /dev/null @@ -1,119 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "felhasználónév", - "common.singleplayer": "Egyjátékos mód", - "common.multiplayer": "Többjátékos mód", - "common.servers": "Szerverek", - "common.quit": "Kilépés", - "common.settings": "Beállítások", - "common.languages": "Nyelvek", - "common.interface": "Kezelőfelület", - "common.gameplay": "Játékmenet", - "common.controls": "Irányítás", - "common.video": "Grafika", - "common.sound": "Hang", - "common.chat": "Csevegés", - "common.resume": "Folytatás", - "common.characters": "Karakterek", - "common.close": "Bezár", - "common.yes": "Igen", - "common.no": "Nem", - "common.back": "Vissza", - "common.create": "Létrehoz", - "common.okay": "Rendben", - "common.add": "Hozzáad", - "common.accept": "Elfogad", - "common.decline": "Visszautasít", - "common.disclaimer": "Figyelmeztetés", - "common.cancel": "Mégse", - "common.none": "Egyik sem", - "common.error": "Hiba", - "common.fatal_error": "Végzetes hiba", - "common.you": "Te", - "common.automatic": "Automatikus", - "common.random": "Véletlenszerű", - "common.empty": "Üres", - - // Settings Window title - "common.interface_settings": "Kezelőfelület beállításai", - "common.gameplay_settings": "Játékmenet beállításai", - "common.controls_settings": "Irányítás beállításai", - "common.video_settings": "Grafikai beállítások", - "common.sound_settings": "Hangbeállítások", - "common.language_settings": "Nyelvi beállítások", - "common.chat_settings": "Csevegés beállításai", - - // Message when connection to the server is lost - "common.connection_lost": r#"Megszakadt a kapcsolat! -Újraindult a szerver? -Naprakész a kliens?"#, - - - "common.species.orc": "Ork", - "common.species.human": "Ember", - "common.species.dwarf": "Törpe", - "common.species.elf": "Tünde", - "common.species.draugr": "Élőhalott", - "common.species.danari": "Danari", - - "common.weapons.axe": "Fejsze", - "common.weapons.sword": "Kard", - "common.weapons.staff": "Mágusbot", - "common.weapons.bow": "Íj", - "common.weapons.hammer": "Pöröly", - "common.weapons.general": "Általános harc", - "common.weapons.sceptre": "Varázsjogar", - "common.weapons.shield": "Pajzs", - "common.weapons.spear": "Lándzsa", - "common.weapons.hammer_simple": "Egyszerű pöröly", - "common.weapons.sword_simple": "Egyszerű kard", - "common.weapons.staff_simple": "Egyszerű mágusbot", - "common.weapons.axe_simple": "Egyszerű fejsze", - "common.weapons.bow_simple": "Egyszerű íj", - "common.weapons.unique": "Egyedi", - "common.tool.debug": "Hibakeresés", - "common.tool.farming": "Földművelési eszköz", - "common.tool.pick": "Csákány", - "common.tool.mining": "Bányászás", - "common.kind.modular_component": "Alkotóelem", - "common.kind.glider": "Sárkányrepülő", - "common.kind.consumable": "Fogyasztási cikk", - "common.kind.throwable": "Eldobható", - "common.kind.utility": "Kellék", - "common.kind.ingredient": "Összetevő", - "common.kind.lantern": "Lámpás", - "common.hands.one": "Egykezes", - "common.hands.two": "Kétkezes", - - "common.rand_appearance": "Véletlenszerű kinézet", - "common.rand_name": "Véletlenszerű név", - - "common.stats.combat_rating": "KÉ", - "common.stats.power": "Erő", - "common.stats.speed": "Gyorsaság", - "common.stats.poise": "Ellentartás", - "common.stats.crit_chance": "Kritikus találat esélye", - "common.stats.crit_mult": "Kritikus találat szorzója", - "common.stats.armor": "Páncélzat", - "common.stats.poise_res":"Megszédíthetőség", - "common.stats.energy_max": "Maximum energia", - "common.stats.energy_reward": "Energiajutalom", - "common.stats.crit_power": "Kritikus találat ereje", - "common.stats.stealth": "Lopakodás", - "common.stats.slots": "Rekeszek", - - "common.material.metal": "Fém", - "common.material.wood": "Fa", - "common.material.stone": "Kő", - "common.material.cloth": "Szövet", - "common.material.hide": "Bőr", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/esc_menu.ftl b/assets/voxygen/i18n/hu_HU/esc_menu.ftl new file mode 100644 index 0000000000..4ac6983071 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Kijelentkezés +esc_menu-quit_game = Kilépés a játékból \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/esc_menu.ron b/assets/voxygen/i18n/hu_HU/esc_menu.ron deleted file mode 100644 index fce6a2409d..0000000000 --- a/assets/voxygen/i18n/hu_HU/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "esc_menu.logout": "Kijelentkezés", - "esc_menu.quit_game": "Kilépés a játékból", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/gameinput.ftl b/assets/voxygen/i18n/hu_HU/gameinput.ftl new file mode 100644 index 0000000000..603d9c2644 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/gameinput.ftl @@ -0,0 +1,62 @@ +gameinput-primary = Alap támadás +gameinput-secondary = Másodlagos támadás +gameinput-block = Védekezés +gameinput-slot1 = Gyorssáv rekesz 1 +gameinput-slot2 = Gyorssáv rekesz 2 +gameinput-slot3 = Gyorssáv rekesz 3 +gameinput-slot4 = Gyorssáv rekesz 4 +gameinput-slot5 = Gyorssáv rekesz 5 +gameinput-slot6 = Gyorssáv rekesz 6 +gameinput-slot7 = Gyorssáv rekesz 7 +gameinput-slot8 = Gyorssáv rekesz 8 +gameinput-slot9 = Gyorssáv rekesz 9 +gameinput-slot10 = Gyorssáv rekesz 10 +gameinput-swaploadout = Fegyverek megcserélése +gameinput-togglecursor = Kurzor megjelenítése/elrejtése +gameinput-help = Súgóablak megjelenítése/elrejtése +gameinput-toggleinterface = Kezelőfelület megjelenítése/elrejtése +gameinput-toggledebug = FPS és hibakeresési információk megjelenítése/elrejtése +gameinput-screenshot = Képernyőfotó készítése +gameinput-toggleingameui = Névtáblák megjelenítése/elrejtése +gameinput-fullscreen = Teljesképernyős mód ki/bekapcsolása +gameinput-moveforward = Mozgás előre +gameinput-moveleft = Mozgás balra +gameinput-moveright = Mozgás jobbra +gameinput-moveback = Mozgás hátrafelé +gameinput-jump = Ugrás +gameinput-glide = Sárkányrepülő +gameinput-roll = Bukfencezés +gameinput-climb = Mászás +gameinput-climbdown = Mászás lefelé +gameinput-wallleap = Falról való elrugaszkodás +gameinput-togglelantern = Lámpás meggyújtása/eloltása +gameinput-mount = Felülés +gameinput-chat = Csevegés +gameinput-command = Parancs +gameinput-escape = Kilépés +gameinput-map = Térkép +gameinput-bag = Holmi +gameinput-trade = Üzletelés +gameinput-social = Közösségi +gameinput-sit = Leülés +gameinput-spellbook = Varázslatok +gameinput-settings = Beállítások +gameinput-respawn = Újraéledés +gameinput-charge = Töltés +gameinput-togglewield = Fegyver elővétele/elrakása +gameinput-interact = Interakcióba lépés +gameinput-freelook = Szabad nézet +gameinput-autowalk = Automatikus járás/úszás +gameinput-cameraclamp = Kamera mozgásának korlátozása +gameinput-dance = Tánc +gameinput-select = Entitás kiválasztása +gameinput-acceptgroupinvite = Csoportba való meghívás elfogadása +gameinput-declinegroupinvite = Csoportba való meghívás visszautasítása +gameinput-cyclecamera = Kameramódok váltogatása +gameinput-crafting = Tárgykészítés +gameinput-fly = Repülés +gameinput-sneak = Lopakodás +gameinput-swimdown = Úszás lefelé +gameinput-swimup = Úszás felfelé +gameinput-mapzoomin = Térkép nagyítása +gameinput-mapzoomout = Térkép kicsinyítése \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/gameinput.ron b/assets/voxygen/i18n/hu_HU/gameinput.ron deleted file mode 100644 index dc098c7a99..0000000000 --- a/assets/voxygen/i18n/hu_HU/gameinput.ron +++ /dev/null @@ -1,73 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "gameinput.primary": "Alap támadás", - "gameinput.secondary": "Másodlagos támadás", - "gameinput.block": "Védekezés", - "gameinput.slot1": "Gyorssáv rekesz 1", - "gameinput.slot2": "Gyorssáv rekesz 2", - "gameinput.slot3": "Gyorssáv rekesz 3", - "gameinput.slot4": "Gyorssáv rekesz 4", - "gameinput.slot5": "Gyorssáv rekesz 5", - "gameinput.slot6": "Gyorssáv rekesz 6", - "gameinput.slot7": "Gyorssáv rekesz 7", - "gameinput.slot8": "Gyorssáv rekesz 8", - "gameinput.slot9": "Gyorssáv rekesz 9", - "gameinput.slot10": "Gyorssáv rekesz 10", - "gameinput.swaploadout": "Fegyverek megcserélése", - "gameinput.togglecursor": "Kurzor megjelenítése/elrejtése", - "gameinput.help": "Súgóablak megjelenítése/elrejtése", - "gameinput.toggleinterface": "Kezelőfelület megjelenítése/elrejtése", - "gameinput.toggledebug": "FPS és hibakeresési információk megjelenítése/elrejtése", - "gameinput.screenshot": "Képernyőfotó készítése", - "gameinput.toggleingameui": "Névtáblák megjelenítése/elrejtése", - "gameinput.fullscreen": "Teljesképernyős mód ki/bekapcsolása", - "gameinput.moveforward": "Mozgás előre", - "gameinput.moveleft": "Mozgás balra", - "gameinput.moveright": "Mozgás jobbra", - "gameinput.moveback": "Mozgás hátrafelé", - "gameinput.jump": "Ugrás", - "gameinput.glide": "Sárkányrepülő", - "gameinput.roll": "Bukfencezés", - "gameinput.climb": "Mászás", - "gameinput.climbdown": "Mászás lefelé", - "gameinput.wallleap": "Falról való elrugaszkodás", - "gameinput.togglelantern": "Lámpás meggyújtása/eloltása", - "gameinput.mount": "Felülés", - "gameinput.chat": "Csevegés", - "gameinput.command": "Parancs", - "gameinput.escape": "Kilépés", - "gameinput.map": "Térkép", - "gameinput.bag": "Holmi", - "gameinput.trade": "Üzletelés", - "gameinput.social": "Közösségi", - "gameinput.sit": "Leülés", - "gameinput.spellbook": "Varázslatok", - "gameinput.settings": "Beállítások", - "gameinput.respawn": "Újraéledés", - "gameinput.charge": "Töltés", - "gameinput.togglewield": "Fegyver elővétele/elrakása", - "gameinput.interact": "Interakcióba lépés", - "gameinput.freelook": "Szabad nézet", - "gameinput.autowalk": "Automatikus járás/úszás", - "gameinput.cameraclamp": "Kamera mozgásának korlátozása", - "gameinput.dance": "Tánc", - "gameinput.select": "Entitás kiválasztása", - "gameinput.acceptgroupinvite": "Csoportba való meghívás elfogadása", - "gameinput.declinegroupinvite": "Csoportba való meghívás visszautasítása", - "gameinput.cyclecamera": "Kameramódok váltogatása", - "gameinput.crafting": "Tárgykészítés", - "gameinput.fly": "Repülés", - "gameinput.sneak": "Lopakodás", - "gameinput.swimdown": "Úszás lefelé", - "gameinput.swimup": "Úszás felfelé", - "gameinput.mapzoomin": "Térkép nagyítása", - "gameinput.mapzoomout": "Térkép kicsinyítése", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/bag.ftl b/assets/voxygen/i18n/hu_HU/hud/bag.ftl new file mode 100644 index 0000000000..eca8c0129a --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = { $playername } holmija +hud-bag-stats_title = { $playername } statisztikái +hud-bag-exp = Tapasztalat +hud-bag-armor = Páncélzat +hud-bag-stats = Statisztikák +hud-bag-head = Fej +hud-bag-neck = Nyak +hud-bag-tabard = Köntös +hud-bag-shoulders = Váll +hud-bag-chest = Mellkas +hud-bag-hands = Kéz +hud-bag-lantern = Lámpás +hud-bag-glider = Sárkányrepülő +hud-bag-belt = Öv +hud-bag-ring = Gyűrű +hud-bag-back = Hát +hud-bag-legs = Láb +hud-bag-feet = Lábfej +hud-bag-mainhand = Domináns kéz +hud-bag-offhand = Másodlagos kéz +hud-bag-inactive_mainhand = Inaktív domináns kéz +hud-bag-inactive_offhand = Inaktív másodlagos kéz +hud-bag-swap_equipped_weapons_title = Felszerelt fegyverek cseréje +hud-bag-swap_equipped_weapons_desc = Nyomd meg a(z) '{ $key }' gombot +hud-bag-bag = Holmitartó +hud-bag-health = Életerő +hud-bag-energy = Energia +hud-bag-combat_rating = Küzdelmi érték +hud-bag-protection = Védelem +hud-bag-stun_res = Megszédíthetőség +hud-bag-combat_rating_desc = + A felszerelésedből + és a az életerődből kiszámítva. +hud-bag-protection_desc = Páncélzatod sebzéselnyelő képessége +hud-bag-stun_res_desc = + Mutatja, mennyire tudod elkerülni a megszédülést, amikor több egymást követő ütés ér. + Energiádhoz hasonlóan ez is újratöltődik. +hud-bag-sort_by_name = Rendezés név szerint +hud-bag-sort_by_quality = Rendezés minőség szerint +hud-bag-sort_by_category = Rendezés kategória szerint \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/bag.ron b/assets/voxygen/i18n/hu_HU/hud/bag.ron deleted file mode 100644 index ca11e5a763..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername} holmija", - "hud.bag.stats_title": "{playername} statisztikái", - "hud.bag.exp": "Tapasztalat", - "hud.bag.armor": "Páncélzat", - "hud.bag.stats": "Statisztikák", - "hud.bag.head": "Fej", - "hud.bag.neck": "Nyak", - "hud.bag.tabard": "Köntös", - "hud.bag.shoulders": "Váll", - "hud.bag.chest": "Mellkas", - "hud.bag.hands": "Kéz", - "hud.bag.lantern": "Lámpás", - "hud.bag.glider": "Sárkányrepülő", - "hud.bag.belt": "Öv", - "hud.bag.ring": "Gyűrű", - "hud.bag.back": "Hát", - "hud.bag.legs": "Láb", - "hud.bag.feet": "Lábfej", - "hud.bag.mainhand": "Domináns kéz", - "hud.bag.offhand": "Másodlagos kéz", - "hud.bag.inactive_mainhand": "Inaktív domináns kéz", - "hud.bag.inactive_offhand": "Inaktív másodlagos kéz", - "hud.bag.swap_equipped_weapons_title": "Felszerelt fegyverek cseréje", - "hud.bag.swap_equipped_weapons_desc": "Nyomd meg a(z) '{key}' gombot", - "hud.bag.bag": "Holmitartó", - "hud.bag.health": "Életerő", - "hud.bag.energy": "Energia", - "hud.bag.combat_rating": "Küzdelmi érték", - "hud.bag.protection": "Védelem", - "hud.bag.stun_res": "Megszédíthetőség", - "hud.bag.combat_rating_desc": "A felszerelésedből\n és a az életerődből kiszámítva.", - "hud.bag.protection_desc": "Páncélzatod sebzéselnyelő képessége", - "hud.bag.stun_res_desc": "Mutatja, mennyire tudod elkerülni a megszédülést, amikor több egymást követő ütés ér.\n Energiádhoz hasonlóan ez is újratöltődik.", - "hud.bag.sort_by_name": "Rendezés név szerint", - "hud.bag.sort_by_quality": "Rendezés minőség szerint", - "hud.bag.sort_by_category": "Rendezés kategória szerint", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/char_window.ftl b/assets/voxygen/i18n/hu_HU/hud/char_window.ftl new file mode 100644 index 0000000000..b9d19ca1a4 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Karakter neve +character_window-character_stats = + Kitartás + + Fittség + + Akaraterő + + Védelem \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/char_window.ron b/assets/voxygen/i18n/hu_HU/hud/char_window.ron deleted file mode 100644 index de29cd005e..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "character_window.character_name": "Karakter neve", - // Character stats - "character_window.character_stats": r#"Kitartás - -Fittség - -Akaraterő - -Védelem -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/chat.ftl b/assets/voxygen/i18n/hu_HU/hud/chat.ftl new file mode 100644 index 0000000000..d798e2512a --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Összes +hud-chat-chat_tab_hover_tooltip = Jobb klikk a beállítások megtekintéséhez +hud-outcome-burning = halálra égett +hud-outcome-curse = halálra lett átkozva +hud-outcome-bleeding = elvérzett +hud-outcome-crippled = halálra bénult +hud-outcome-frozen = halálra fagyott +hud-chat-online_msg = [{ $name }] belépett +hud-chat-offline_msg = [{ $name }] kilépett +hud-chat-default_death_msg = [{ $name }] meghalt +hud-chat-environmental_kill_msg = [{ $name }] meghalt itt: { $environment } +hud-chat-fall_kill_msg = [{ $name }] belehalt a zuhanásba +hud-chat-suicide_msg = [{ $name }] belehalt önmagának okozott sérüléseibe +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } neki köszönhetően: [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] legyőzte őt: [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] lelőtte őt: [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] felrobbantotta őt: [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] mágiával megölte őt: [{ $victim }] +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } neki köszönhetően: { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } megölte őt: [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } lelőtte őt: [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } felrobbantotta őt:[{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } mágiával megölte őt: [{ $victim }] +hud-chat-npc_other_kill_msg = { $attacker } megölte őt: [{ $victim }] +hud-chat-loot_msg = Felvetted a következőt: [{ $item }] +hud-chat-loot_fail = Túl sok a holmid! +hud-chat-goodbye = Viszlát! +hud-chat-connection_lost = Megszakadt a kapcsolat. Szétkapcsolás { $time } másodpercen belül. \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/chat.ron b/assets/voxygen/i18n/hu_HU/hud/chat.ron deleted file mode 100644 index 6fae1aa5d9..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -//// Localization for Hungarian -( - string_map: { - "hud.chat.all": "Összes", - "hud.chat.chat_tab_hover_tooltip": "Jobb klikk a beállítások megtekintéséhez", - - // Debuff outcomes - "hud.outcome.burning": "halálra égett", - "hud.outcome.curse": "halálra lett átkozva", - "hud.outcome.bleeding": "elvérzett", - "hud.outcome.crippled": "halálra bénult", - "hud.outcome.frozen": "halálra fagyott", - - // Chat outputs - "hud.chat.online_msg": "[{name}] belépett", - "hud.chat.offline_msg": "[{name}] kilépett", - - "hud.chat.default_death_msg": "[{name}] meghalt", - "hud.chat.environmental_kill_msg": "[{name}] meghalt itt: {environment}", - "hud.chat.fall_kill_msg": "[{name}] belehalt a zuhanásba", - "hud.chat.suicide_msg": "[{name}] belehalt önmagának okozott sérüléseibe", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} neki köszönhetően: [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] legyőzte őt: [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] lelőtte őt: [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] felrobbantotta őt: [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] mágiával megölte őt: [{victim}]", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} neki köszönhetően: {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} megölte őt: [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} lelőtte őt: [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} felrobbantotta őt:[{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} mágiával megölte őt: [{victim}]", - "hud.chat.npc_other_kill_msg": "{attacker} megölte őt: [{victim}]", - - "hud.chat.loot_msg": "Felvetted a következőt: [{item}]", - "hud.chat.loot_fail": "Túl sok a holmid!", - "hud.chat.goodbye": "Viszlát!", - "hud.chat.connection_lost": "Megszakadt a kapcsolat. Szétkapcsolás {time} másodpercen belül.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/crafting.ftl b/assets/voxygen/i18n/hu_HU/hud/crafting.ftl new file mode 100644 index 0000000000..4345fb1610 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/crafting.ftl @@ -0,0 +1,25 @@ +hud-crafting = Tárgykészítés +hud-crafting-recipes = Receptek +hud-crafting-ingredients = Alapanyagok: +hud-crafting-craft = Elkészít +hud-crafting-tool_cata = Szükséges hozzá: +hud-crafting-req_crafting_station = Szükséges hozzá: +hud-crafting-anvil = Üllő +hud-crafting-cauldron = Üst +hud-crafting-cooking_pot = Kondér +hud-crafting-crafting_bench = Barkácsasztal +hud-crafting-forge = Kovácstűzhely +hud-crafting-loom = Szövőszék +hud-crafting-spinning_wheel = Rokka +hud-crafting-tanning_rack = Nyújtókeret +hud-crafting-tabs-all = Összes +hud-crafting-tabs-armor = Páncélzat +hud-crafting-tabs-dismantle = Szétbontás +hud-crafting-tabs-food = Élelmiszerek +hud-crafting-tabs-glider = Sárkányrepülők +hud-crafting-tabs-potion = Főzetek +hud-crafting-tabs-tool = Szerszámok +hud-crafting-tabs-utility = Kellékek +hud-crafting-tabs-weapon = Fegyverek +hud-crafting-tabs-bag = Holmitartók +hud-crafting-tabs-processed_material = Nyersanyagok \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/crafting.ron b/assets/voxygen/i18n/hu_HU/hud/crafting.ron deleted file mode 100644 index 859dbf361d..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/crafting.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "hud.crafting": "Tárgykészítés", - "hud.crafting.recipes": "Receptek", - "hud.crafting.ingredients": "Alapanyagok:", - "hud.crafting.craft": "Elkészít", - "hud.crafting.tool_cata": "Szükséges hozzá:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Szükséges hozzá:", - "hud.crafting.anvil": "Üllő", - "hud.crafting.cauldron": "Üst", - "hud.crafting.cooking_pot": "Kondér", - "hud.crafting.crafting_bench": "Barkácsasztal", - "hud.crafting.forge": "Kovácstűzhely", - "hud.crafting.loom": "Szövőszék", - "hud.crafting.spinning_wheel": "Rokka", - "hud.crafting.tanning_rack": "Nyújtókeret", - // Tabs - "hud.crafting.tabs.all": "Összes", - "hud.crafting.tabs.armor": "Páncélzat", - "hud.crafting.tabs.dismantle": "Szétbontás", - "hud.crafting.tabs.food": "Élelmiszerek", - "hud.crafting.tabs.glider": "Sárkányrepülők", - "hud.crafting.tabs.potion": "Főzetek", - "hud.crafting.tabs.tool": "Szerszámok", - "hud.crafting.tabs.utility": "Kellékek", - "hud.crafting.tabs.weapon": "Fegyverek", - "hud.crafting.tabs.bag": "Holmitartók", - "hud.crafting.tabs.processed_material": "Nyersanyagok", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/group.ftl b/assets/voxygen/i18n/hu_HU/hud/group.ftl new file mode 100644 index 0000000000..5b14304b49 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Csoport +hud-group-invite_to_join = [{ $name }] meghívott a csoportjába! +hud-group-invite_to_trade = [{ $name }] szeretne kereskedni veled. +hud-group-invite = Meghív +hud-group-kick = Kirak +hud-group-assign_leader = Vezető kijelölése +hud-group-leave = Csoport elhagyása +hud-group-dead = Halott +hud-group-out_of_range = Túl messze +hud-group-add_friend = Felvétel a barátok közé +hud-group-link_group = Csoportok összekapcsolása +hud-group-in_menu = Menüben +hud-group-members = Csoporttagok \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/group.ron b/assets/voxygen/i18n/hu_HU/hud/group.ron deleted file mode 100644 index cd31768e0e..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "hud.group": "Csoport", - "hud.group.invite_to_join": "[{name}] meghívott a csoportjába!", - "hud.group.invite_to_trade": "[{name}] szeretne kereskedni veled.", - "hud.group.invite": "Meghív", - "hud.group.kick": "Kirak", - "hud.group.assign_leader": "Vezető kijelölése", - "hud.group.leave": "Csoport elhagyása", - "hud.group.dead" : "Halott", - "hud.group.out_of_range": "Túl messze", - "hud.group.add_friend": "Felvétel a barátok közé", - "hud.group.link_group": "Csoportok összekapcsolása", - "hud.group.in_menu": "Menüben", - "hud.group.members": "Csoporttagok", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/map.ftl b/assets/voxygen/i18n/hu_HU/hud/map.ftl new file mode 100644 index 0000000000..bb49719efc --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/map.ftl @@ -0,0 +1,33 @@ +hud-map-map_title = Térkép +hud-map-qlog_title = Küldetések +hud-map-topo_map = Topográfiai térkép +hud-map-difficulty = Nehézség +hud-map-towns = Városok +hud-map-castles = Várak +hud-map-dungeons = Kazamaták +hud-map-caves = Barlangok +hud-map-cave = Barlang +hud-map-peaks = Hegyek +hud-map-voxel_map = Voxeltérkép +hud-map-trees = Óriásfák +hud-map-tree = Óriásfa +hud-map-town = Város +hud-map-castle = Vár +hud-map-dungeon = Kazamata +hud-map-difficulty_dungeon = + Kazamata + + Nehézség: { $difficulty } +hud-map-drag = Arrébbhúzás +hud-map-zoom = Nagyítás +hud-map-mid_click = Tájékozódási pont elhelyezése +hud-map-recenter = Fókusz visszaállítása +hud-map-marked_location = Megjelölt helyszín +hud-map-marked_location_remove = Kattints az eltávolításhoz +hud-map-change_map_mode = Térképmód megváltoztatása +hud-map-toggle_minimap_voxel = Voxel/topográfiai nézet váltogatása a kistérképen +hud-map-zoom_minimap_explanation = + A kistérképet felnagyítva + sokkal részletesebb képet + fogsz kapni a körülötted + lévő területről \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/map.ron b/assets/voxygen/i18n/hu_HU/hud/map.ron deleted file mode 100644 index b4bc091fa1..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Térkép", - "hud.map.qlog_title": "Küldetések", - "hud.map.topo_map": "Topográfiai térkép", - "hud.map.difficulty": "Nehézség", - "hud.map.towns": "Városok", - "hud.map.castles": "Várak", - "hud.map.dungeons": "Kazamaták", - "hud.map.caves": "Barlangok", - "hud.map.cave": "Barlang", - "hud.map.peaks": "Hegyek", - "hud.map.voxel_map": "Voxeltérkép", - "hud.map.trees": "Óriásfák", - "hud.map.tree": "Óriásfa", - "hud.map.town": "Város", - "hud.map.castle": "Vár", - "hud.map.dungeon": "Kazamata", - "hud.map.difficulty_dungeon": "Kazamata\n\nNehézség: {difficulty}", - "hud.map.drag": "Arrébbhúzás", - "hud.map.zoom": "Nagyítás", - "hud.map.mid_click": "Tájékozódási pont elhelyezése", - "hud.map.recenter": "Fókusz visszaállítása", - "hud.map.marked_location": "Megjelölt helyszín", - "hud.map.marked_location_remove": "Kattints az eltávolításhoz", - "hud.map.change_map_mode": "Térképmód megváltoztatása", - "hud.map.toggle_minimap_voxel": "Voxel/topográfiai nézet váltogatása a kistérképen", - "hud.map.zoom_minimap_explanation": "A kistérképet felnagyítva\nsokkal részletesebb képet\nfogsz kapni a körülötted\nlévő területről", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/misc.ftl b/assets/voxygen/i18n/hu_HU/hud/misc.ftl new file mode 100644 index 0000000000..7598705e44 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/misc.ftl @@ -0,0 +1,34 @@ +hud-do_not_show_on_startup = Ne jelenjen meg indításkor +hud-show_tips = Tippek megjelenítése +hud-quests = Küldetések +hud-you_died = Meghaltál +hud-waypoint_saved = Tájékozódási pont elmentve +hud-sp_arrow_txt = KP +hud-inventory_full = Túl sok a holmid +hud-press_key_to_show_keybindings_fmt = [{ $key }] Billentyű-összerendelések +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lámpás +hud-press_key_to_show_debug_info_fmt = A hibakarasési információk megjelenítéséhez nyomd meg a(z) '{ $key }' gombot +hud-press_key_to_toggle_keybindings_fmt = A billentyű-összerendelések megjelenítéséhez/elrejtéséhez nyomd meg a(z) '{ $key }' gombot +hud-press_key_to_toggle_debug_info_fmt = A hibakarasési információk megjelenítéséhez/elrejtéséhez nyomd meg a(z) '{ $key }' gombot +hud-press_key_to_respawn = A legutóbbi tábortűznél való újraéledéshez nyomd meg a(z) '{ $key }' gombot! +hud-tutorial_btn = Bevezetés +hud-tutorial_click_here = Tedd szabaddá a kurzorodat a(z) [ { $key } ] gomb lenyomásával, majd kattints erre a gombra! +hud-tutorial_elements = Tárgykészítés +hud-temp_quest_headline = Üdvözlégy Vándor! +hud-temp_quest_text = + Mielőtt útnak indulsz tégy egy kört ebben a kis városkában, és töltsd föl készleteidet! + + Nyugodtan magadhoz vehetsz bármit, amit szükségesnek ítélsz az utazáshoz! + + A képernyő jobb alsó sarkába pillantva több dolgot is találsz – például a táskádat, a tárgykészítési menüt, és a térképet. + + A különféle kihelyezett eszközök lehetővé teszik számodra, hogy páncélzatot, fegyvereket, ételeket, s még sok egyéb mást készíts magadnak! + + Számos vadállat él a városka közelében; bőrüket könnyen páncéllá alakíthatja bárki, aki meg kívánja magát óvni a világ veszélyeitől. + + Ha úgy érzed, hogy már készen állsz, tedd magad a próbára a térképen megjelölt számos kihívás valamelyikén, és tégy szert egyre jobb és jobb felszerelére! +hud-spell = Varázslatok +hud-diary = Napló +hud-free_look_indicator = Szabad nézet bekapcsolva. A kikapcsoláshoz nyomd meg a(z) { $key } gombot. +hud-camera_clamp_indicator = A kamera függőleges korlátozása bekapcsolva. A kikapcsoláshoz nyomd meg a(z) { $key } gombot. +hud-auto_walk_indicator = Automatikus járás/úszás bekapcsolva \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/misc.ron b/assets/voxygen/i18n/hu_HU/hud/misc.ron deleted file mode 100644 index 5e55f7430e..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/misc.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "hud.do_not_show_on_startup": "Ne jelenjen meg indításkor", - "hud.show_tips": "Tippek megjelenítése", - "hud.quests": "Küldetések", - "hud.you_died": "Meghaltál", - "hud.waypoint_saved": "Tájékozódási pont elmentve", - "hud.sp_arrow_txt": "KP", - "hud.inventory_full": "Túl sok a holmid", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Billentyű-összerendelések", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lámpás", - "hud.press_key_to_show_debug_info_fmt": "A hibakarasési információk megjelenítéséhez nyomd meg a(z) '{key}' gombot", - "hud.press_key_to_toggle_keybindings_fmt": "A billentyű-összerendelések megjelenítéséhez/elrejtéséhez nyomd meg a(z) '{key}' gombot", - "hud.press_key_to_toggle_debug_info_fmt": "A hibakarasési információk megjelenítéséhez/elrejtéséhez nyomd meg a(z) '{key}' gombot", - - // Respawn message - "hud.press_key_to_respawn": r#"A legutóbbi tábortűznél való újraéledéshez nyomd meg a(z) '{key}' gombot!"#, - - // Tutorial Button - "hud.tutorial_btn": r#"Bevezetés"#, - "hud.tutorial_click_here": r#"Tedd szabaddá a kurzorodat a(z) [ {key} ] gomb lenyomásával, majd kattints erre a gombra!"#, - "hud.tutorial_elements": r#"Tárgykészítés"#, - -"hud.temp_quest_headline": r#"Üdvözlégy Vándor!"#, -"hud.temp_quest_text": r#"Mielőtt útnak indulsz tégy egy kört ebben a kis városkában, és töltsd föl készleteidet! - -Nyugodtan magadhoz vehetsz bármit, amit szükségesnek ítélsz az utazáshoz! - -A képernyő jobb alsó sarkába pillantva több dolgot is találsz – például a táskádat, a tárgykészítési menüt, és a térképet. - -A különféle kihelyezett eszközök lehetővé teszik számodra, hogy páncélzatot, fegyvereket, ételeket, s még sok egyéb mást készíts magadnak! - -Számos vadállat él a városka közelében; bőrüket könnyen páncéllá alakíthatja bárki, aki meg kívánja magát óvni a világ veszélyeitől. - -Ha úgy érzed, hogy már készen állsz, tedd magad a próbára a térképen megjelölt számos kihívás valamelyikén, és tégy szert egyre jobb és jobb felszerelére! -"#, - - "hud.spell": "Varázslatok", - // Diary - "hud.diary": "Napló", - - "hud.free_look_indicator": "Szabad nézet bekapcsolva. A kikapcsoláshoz nyomd meg a(z) {key} gombot.", - "hud.camera_clamp_indicator": "A kamera függőleges korlátozása bekapcsolva. A kikapcsoláshoz nyomd meg a(z) {key} gombot.", - "hud.auto_walk_indicator": "Automatikus járás/úszás bekapcsolva", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/sct.ftl b/assets/voxygen/i18n/hu_HU/hud/sct.ftl new file mode 100644 index 0000000000..e00d8f3603 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Tapasztalat +hud-sct-block = HÁRÍTVA \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/sct.ron b/assets/voxygen/i18n/hu_HU/hud/sct.ron deleted file mode 100644 index e88901a920..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Tapasztalat", - "hud.sct.block": "HÁRÍTVA", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/settings.ftl b/assets/voxygen/i18n/hu_HU/hud/settings.ftl new file mode 100644 index 0000000000..6bd8900f75 --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/settings.ftl @@ -0,0 +1,116 @@ +hud-settings-general = Általános +hud-settings-none = Egyik sem +hud-settings-press_behavior-toggle = Átváltás +hud-settings-press_behavior-hold = Tartás +hud-settings-help_window = Súgóablak +hud-settings-debug_info = Hibakeresési információk +hud-settings-show_hitboxes = Hitboxok megjelenítése +hud-settings-show_chat = Csevegés megjelenítése +hud-settings-tips_on_startup = Tippek indulásnál +hud-settings-ui_scale = Felület méretezése +hud-settings-relative_scaling = Relatív méretezés +hud-settings-custom_scaling = Egyéni méretezés +hud-settings-crosshair = Célkereszt +hud-settings-opacity = Átlátszóság +hud-settings-hotbar = Gyorssáv +hud-settings-toggle_shortcuts = Gyorsbillentyűk megjelenítése/elrejtése +hud-settings-buffs_skillbar = Hatások a gyossávnál +hud-settings-buffs_mmap = Hatások a minitérképnél +hud-settings-toggle_bar_experience = Tapasztalatsáv megjelenítése/elrejtése +hud-settings-scrolling_combat_text = Harci szöveg görgetése +hud-settings-incoming_damage = Bejövő sebzés +hud-settings-speech_bubble = Szövegbuborék +hud-settings-speech_bubble_dark_mode = Szövegbuborék sötét mód +hud-settings-speech_bubble_icon = Szövegbuborék ikon +hud-settings-energybar_numbers = Energiasáv számok +hud-settings-values = Értékek +hud-settings-percentages = Százalékok +hud-settings-chat = Csevegés +hud-settings-background_opacity = Háttér átlátszósága +hud-settings-chat_character_name = Karakternevek a csevegésben +hud-settings-loading_tips = Tippek a töltőképernyőn +hud-settings-reset_interface = Alapértékek visszaállítása +hud-settings-pan_sensitivity = Egérérzékenység +hud-settings-zoom_sensitivity = Nagyítás érzékenység +hud-settings-camera_clamp_angle = Szög a függőleges kamera korláthoz +hud-settings-invert_scroll_zoom = Nagyítás megfordítása +hud-settings-invert_mouse_y_axis = Egér Y-tengelyének megfordítása +hud-settings-invert_controller_y_axis = Kontroller Y-tengelyének megfordítás +hud-settings-enable_mouse_smoothing = Kamera simítása +hud-settings-free_look_behavior = Szabad nézet viselkedés +hud-settings-auto_walk_behavior = Automatikus séta viselkedés +hud-settings-camera_clamp_behavior = Kamera korlát viselkedés +hud-settings-player_physics_behavior = Játékosfizika (kísérleti) +hud-settings-stop_auto_walk_on_input = Automatikus séta abbahagyása mozgáskor +hud-settings-auto_camera = Automatikus kamera +hud-settings-reset_gameplay = Alapértékek visszaállítása +hud-settings-view_distance = Látótóávolság +hud-settings-sprites_view_distance = Sprites View Distance +hud-settings-figures_view_distance = Entities View Distance +hud-settings-maximum_fps = Maximum FPS +hud-settings-present_mode = Bemutató mód +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Levéldoboz +hud-settings-present_mode-immediate = Rögtön +hud-settings-fov = Látószög (fok) +hud-settings-gamma = Gamma +hud-settings-exposure = Fényesség +hud-settings-ambiance = Környezet fényereje +hud-settings-antialiasing_mode = Élsimítás módja +hud-settings-upscale_factor = Belső felbontás +hud-settings-cloud_rendering_mode = Felhő renderelési mód +hud-settings-fluid_rendering_mode = Folyadék renderelési mód +hud-settings-fluid_rendering_mode-cheap = Olcsó +hud-settings-fluid_rendering_mode-shiny = Fényes +hud-settings-cloud_rendering_mode-minimal = Minimális +hud-settings-cloud_rendering_mode-low = Alacsony +hud-settings-cloud_rendering_mode-medium = Közepes +hud-settings-cloud_rendering_mode-high = Magas +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Teljes képernyő +hud-settings-fullscreen_mode = Teljes képernyős mód +hud-settings-fullscreen_mode-exclusive = Kizárólagos +hud-settings-fullscreen_mode-borderless = Keret nélküli +hud-settings-gpu_profiler = GPU-időzítés engedélyezése (nem mindenhol támogatott) +hud-settings-particles = Részecskék +hud-settings-lossy_terrain_compression = Terep veszteséges tömörítése +hud-settings-resolution = Felbontás +hud-settings-bit_depth = Bitmélység +hud-settings-refresh_rate = Frissítési ráta +hud-settings-lighting_rendering_mode = világítás renderelési mód +hud-settings-lighting_rendering_mode-ashikhmin = A-típusú - magas +hud-settings-lighting_rendering_mode-blinnphong = B-típusú - közepes +hud-settings-lighting_rendering_mode-lambertian = L-típusú - olcsó +hud-settings-shadow_rendering_mode = Árnyék renderelési mód +hud-settings-shadow_rendering_mode-none = Nincs +hud-settings-shadow_rendering_mode-cheap = Olcsó +hud-settings-shadow_rendering_mode-map = térkép +hud-settings-shadow_rendering_mode-map-resolution = Felbontás +hud-settings-lod_detail = Részletesség mértéke +hud-settings-save_window_size = Ablakméret mentése +hud-settings-reset_graphics = Alapértékek visszaállítása +hud-settings-master_volume = Fő hangerő +hud-settings-inactive_master_volume_perc = Inaktív ablak hangereje +hud-settings-music_volume = Zene hangereje +hud-settings-sound_effect_volume = Effektek hangereje +hud-settings-audio_device = Hangeszköz +hud-settings-reset_sound = Alapértékek visszaállítása +hud-settings-english_fallback = Fordítás hiányában az angol verzió jelenjen meg +hud-settings-awaitingkey = Nyomj meg egy gombot... +hud-settings-unbound = Nincs +hud-settings-reset_keybinds = Alapértékek visszaállítása +hud-settings-chat_tabs = Csevegés fülek +hud-settings-label = Címke: +hud-settings-delete = Törlés +hud-settings-show_all = Összes megjelenítése +hud-settings-messages = Üzenetek +hud-settings-activity = Tevékenységek +hud-settings-death = Halál +hud-settings-group = Csoport +hud-settings-faction = Frakció +hud-settings-world = Világ +hud-settings-region = Régió +hud-settings-say = Beszéd +hud-settings-all = Összes +hud-settings-group_only = Csak csoport +hud-settings-reset_chat = Alapértékek visszaállítása \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/settings.ron b/assets/voxygen/i18n/hu_HU/hud/settings.ron deleted file mode 100644 index 493ec718fa..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/settings.ron +++ /dev/null @@ -1,136 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - // Settings - "hud.settings.general": "Általános", - "hud.settings.none": "Egyik sem", - "hud.settings.press_behavior.toggle": "Átváltás", - "hud.settings.press_behavior.hold": "Tartás", - "hud.settings.help_window": "Súgóablak", - "hud.settings.debug_info": "Hibakeresési információk", - "hud.settings.show_hitboxes": "Hitboxok megjelenítése", - "hud.settings.show_chat": "Csevegés megjelenítése", - "hud.settings.tips_on_startup": "Tippek indulásnál", - "hud.settings.ui_scale": "Felület méretezése", - "hud.settings.relative_scaling": "Relatív méretezés", - "hud.settings.custom_scaling": "Egyéni méretezés", - "hud.settings.crosshair": "Célkereszt", - "hud.settings.opacity": "Átlátszóság", - "hud.settings.hotbar": "Gyorssáv", - "hud.settings.toggle_shortcuts": "Gyorsbillentyűk megjelenítése/elrejtése", - "hud.settings.buffs_skillbar": "Hatások a gyossávnál", - "hud.settings.buffs_mmap": "Hatások a minitérképnél", - "hud.settings.toggle_bar_experience": "Tapasztalatsáv megjelenítése/elrejtése", - "hud.settings.scrolling_combat_text": "Harci szöveg görgetése", - "hud.settings.incoming_damage": "Bejövő sebzés", - "hud.settings.speech_bubble": "Szövegbuborék", - "hud.settings.speech_bubble_dark_mode": "Szövegbuborék sötét mód", - "hud.settings.speech_bubble_icon": "Szövegbuborék ikon", - "hud.settings.energybar_numbers": "Energiasáv számok", - "hud.settings.values": "Értékek", - "hud.settings.percentages": "Százalékok", - "hud.settings.chat": "Csevegés", - "hud.settings.background_opacity": "Háttér átlátszósága", - "hud.settings.chat_character_name": "Karakternevek a csevegésben", - "hud.settings.loading_tips": "Tippek a töltőképernyőn", - "hud.settings.reset_interface": "Alapértékek visszaállítása", - - "hud.settings.pan_sensitivity": "Egérérzékenység", - "hud.settings.zoom_sensitivity": "Nagyítás érzékenység", - "hud.settings.camera_clamp_angle": "Szög a függőleges kamera korláthoz", - "hud.settings.invert_scroll_zoom": "Nagyítás megfordítása", - "hud.settings.invert_mouse_y_axis": "Egér Y-tengelyének megfordítása", - "hud.settings.invert_controller_y_axis": "Kontroller Y-tengelyének megfordítás", - "hud.settings.enable_mouse_smoothing": "Kamera simítása", - "hud.settings.free_look_behavior": "Szabad nézet viselkedés", - "hud.settings.auto_walk_behavior": "Automatikus séta viselkedés", - "hud.settings.camera_clamp_behavior": "Kamera korlát viselkedés", - "hud.settings.player_physics_behavior": "Játékosfizika (kísérleti)", - "hud.settings.stop_auto_walk_on_input": "Automatikus séta abbahagyása mozgáskor", - "hud.settings.auto_camera": "Automatikus kamera", - "hud.settings.reset_gameplay": "Alapértékek visszaállítása", - - "hud.settings.view_distance": "Látótóávolság", - "hud.settings.sprites_view_distance": "Sprites View Distance", - "hud.settings.figures_view_distance": "Entities View Distance", - "hud.settings.maximum_fps": "Maximum FPS", - "hud.settings.present_mode": "Bemutató mód", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Levéldoboz", - "hud.settings.present_mode.immediate": "Rögtön", - "hud.settings.fov": "Látószög (fok)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Fényesség", - "hud.settings.ambiance": "Környezet fényereje", - "hud.settings.antialiasing_mode": "Élsimítás módja", - "hud.settings.upscale_factor": "Belső felbontás", - "hud.settings.cloud_rendering_mode": "Felhő renderelési mód", - "hud.settings.fluid_rendering_mode": "Folyadék renderelési mód", - "hud.settings.fluid_rendering_mode.cheap": "Olcsó", - "hud.settings.fluid_rendering_mode.shiny": "Fényes", - "hud.settings.cloud_rendering_mode.minimal": "Minimális", - "hud.settings.cloud_rendering_mode.low": "Alacsony", - "hud.settings.cloud_rendering_mode.medium": "Közepes", - "hud.settings.cloud_rendering_mode.high": "Magas", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Teljes képernyő", - "hud.settings.fullscreen_mode": "Teljes képernyős mód", - "hud.settings.fullscreen_mode.exclusive": "Kizárólagos", - "hud.settings.fullscreen_mode.borderless": "Keret nélküli", - "hud.settings.gpu_profiler": "GPU-időzítés engedélyezése (nem mindenhol támogatott)", - "hud.settings.particles": "Részecskék", - "hud.settings.lossy_terrain_compression": "Terep veszteséges tömörítése", - "hud.settings.resolution": "Felbontás", - "hud.settings.bit_depth": "Bitmélység", - "hud.settings.refresh_rate": "Frissítési ráta", - "hud.settings.lighting_rendering_mode": "világítás renderelési mód", - "hud.settings.lighting_rendering_mode.ashikhmin": "A-típusú - magas", - "hud.settings.lighting_rendering_mode.blinnphong": "B-típusú - közepes", - "hud.settings.lighting_rendering_mode.lambertian": "L-típusú - olcsó", - "hud.settings.shadow_rendering_mode": "Árnyék renderelési mód", - "hud.settings.shadow_rendering_mode.none": "Nincs", - "hud.settings.shadow_rendering_mode.cheap": "Olcsó", - "hud.settings.shadow_rendering_mode.map": "térkép", - "hud.settings.shadow_rendering_mode.map.resolution": "Felbontás", - "hud.settings.lod_detail": "Részletesség mértéke", - "hud.settings.save_window_size": "Ablakméret mentése", - "hud.settings.reset_graphics": "Alapértékek visszaállítása", - - - "hud.settings.master_volume": "Fő hangerő", - "hud.settings.inactive_master_volume_perc": "Inaktív ablak hangereje", - "hud.settings.music_volume": "Zene hangereje", - "hud.settings.sound_effect_volume": "Effektek hangereje", - "hud.settings.audio_device": "Hangeszköz", - "hud.settings.reset_sound": "Alapértékek visszaállítása", - - "hud.settings.english_fallback": "Fordítás hiányában az angol verzió jelenjen meg", - - "hud.settings.awaitingkey": "Nyomj meg egy gombot...", - "hud.settings.unbound": "Nincs", - "hud.settings.reset_keybinds": "Alapértékek visszaállítása", - - "hud.settings.chat_tabs": "Csevegés fülek", - "hud.settings.label": "Címke:", - "hud.settings.delete": "Törlés", - "hud.settings.show_all": "Összes megjelenítése", - "hud.settings.messages": "Üzenetek", - "hud.settings.activity": "Tevékenységek", - "hud.settings.death": "Halál", - "hud.settings.group": "Csoport", - "hud.settings.faction": "Frakció", - "hud.settings.world": "Világ", - "hud.settings.region": "Régió", - "hud.settings.say": "Beszéd", - "hud.settings.none": "Egyik sem", - "hud.settings.all": "Összes", - "hud.settings.group_only": "Csak csoport", - "hud.settings.reset_chat" : "Alapértékek visszaállítása", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/skills.ftl b/assets/voxygen/i18n/hu_HU/hud/skills.ftl new file mode 100644 index 0000000000..d5bf9f3e2f --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/skills.ftl @@ -0,0 +1,237 @@ +hud-rank_up = Új képességpont +hud-skill-sp_available = { $number } KP áll rendelkezésedre +hud-skill-not_unlocked = Nincs még feloldva +hud-skill-req_sp ={"\u000A"} + + { $number } KP kell hozzá +hud-skill-inc_health_title = Életerő növelése +hud-skill-inc_health = Maximális életerő növelése { $boost } ponttal{ $SP } +hud-skill-inc_energy_title = Energia növelése +hud-skill-inc_energy = Maximális energia növelése { $boost } ponttal{ $SP } +hud-skill-unlck_sword_title = Kard feloldása +hud-skill-unlck_sword = Kard képességfájának feloldása{ $SP } +hud-skill-unlck_axe_title = Fejsze feloldása +hud-skill-unlck_axe = Fejsze képességfájának feloldása{ $SP } +hud-skill-unlck_hammer_title = Pöröly feloldása +hud-skill-unlck_hammer = Pöröly képességfájának feloldása{ $SP } +hud-skill-unlck_bow_title = Íj feloldása +hud-skill-unlck_bow = Íj képességfájának feloldása{ $SP } +hud-skill-unlck_staff_title = Mágusbot feloldása +hud-skill-unlck_staff = Mágusbot képességfájának feloldása{ $SP } +hud-skill-unlck_sceptre_title = Varázsjogar feloldása +hud-skill-unlck_sceptre = Varázsjogar képességfájának feloldása{ $SP } +hud-skill-dodge_title = Kitérés +hud-skill-dodge = A kitérőbukfencet görgőkattintással lehet aktiválni. A gurulás ideje alatt nem lehet megsebezni téged közelharci támadással. +hud-skill-roll_energy_title = Bukfencezés energiaigénye +hud-skill-roll_energy = A bukfencezés { $boost }%-kal kevesebb energiát használ{ $SP } +hud-skill-roll_speed_title = Bukfencezés sebessége +hud-skill-roll_speed = { $boost }%-kal gyorsabb bukfencezés{ $SP } +hud-skill-roll_dur_title = Bukfencezés időtartama +hud-skill-roll_dur = { $boost }%-kal tovább tartó bukfencezés{ $SP } +hud-skill-climbing_title = Mászás +hud-skill-climbing = Magasabbra jutás +hud-skill-climbing_cost_title = Mászás energiaigénye +hud-skill-climbing_cost = A mászás { $boost }%-kal kevesebb energiát használ el{ $SP } +hud-skill-climbing_speed_title = Mászási sebesség +hud-skill-climbing_speed = { $boost }%-kal gyorsabb mászás{ $SP } +hud-skill-swim_title = Úszás +hud-skill-swim = Mozgás nedves környezetben +hud-skill-swim_speed_title = Úszási sebesség +hud-skill-swim_speed = { $boost }%-kal gyorsabb úszás{ $SP } +hud-skill-sc_lifesteal_title = Életlopó sugár +hud-skill-sc_lifesteal = Csapold le az ellenségeid életerejét +hud-skill-sc_lifesteal_damage_title = Sebzés +hud-skill-sc_lifesteal_damage = Okozz { $boost }%-kal több sebzést{ $SP } +hud-skill-sc_lifesteal_range_title = Hatótávolság +hud-skill-sc_lifesteal_range = A sugarad { $boost }%-kal messzebbre ér el{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Életlopás +hud-skill-sc_lifesteal_lifesteal = Alakíts át még { $boost }% sebzést életerővé{ $SP } +hud-skill-sc_lifesteal_regen_title = Energia visszatöltődés +hud-skill-sc_lifesteal_regen = További { $boost }%-kal töltődik vissza az energiád{ $SP } +hud-skill-sc_heal_title = Gyógyító sugár +hud-skill-sc_heal = Gyógyítsd a szövetségeseid az ellenségeid vérével +hud-skill-sc_heal_heal_title = Gyógyítás +hud-skill-sc_heal_heal = { $boost }%-kal növeli meg mások gyógyításának a mennyiségét{ $SP } +hud-skill-sc_heal_cost_title = Energiaigény +hud-skill-sc_heal_cost = Mások gyógyítása { $boost }%-kal kevesebb energiát használ el{ $SP } +hud-skill-sc_heal_range_title = Hatótávolság +hud-skill-sc_heal_range = A sugarad { $boost }%-kal messzebbre ér el{ $SP } +hud-skill-sc_wardaura_unlock_title = Oltalmazó aura feloldása +hud-skill-sc_wardaura_unlock = Védd meg a szövetségeseid az ellenséges támadásoktól{ $SP } +hud-skill-sc_wardaura_strength_title = Erő +hud-skill-sc_wardaura_strength = { $boost }%-kal megnő a védelmed ereje{ $SP } +hud-skill-sc_wardaura_duration_title = Időtartam +hud-skill-sc_wardaura_duration = { $boost }%-kal tovább tart az oltalmad hatása{ $SP } +hud-skill-sc_wardaura_range_title = Sugár +hud-skill-sc_wardaura_range = Az oltalmad { $boost }%-kal messzebbre elér{ $SP } +hud-skill-sc_wardaura_cost_title = Energiaigény +hud-skill-sc_wardaura_cost = Az oltalom létrehozása { $boost }%-kal kevesebb energiát használ el{ $SP } +hud-skill-st_shockwave_range_title = Lökéshullám hatótávolság +hud-skill-st_shockwave_range = Lökj el dolgokat, amelyek hatótávon kívül voltak, hatótávolság megnövelése { $boost }%-kal{ $SP } +hud-skill-st_shockwave_cost_title = Lökéshullám energiaigény +hud-skill-st_shockwave_cost = Csökkentsd { $boost }%-kal az energiaigényt, hogy tehetetlen falusiakat lökj el{ $SP } +hud-skill-st_shockwave_knockback_title = Lökéshullám hátralökés +hud-skill-st_shockwave_knockback = Növeld meg a hátralökés lehetőségét { $boost }%-kal{ $SP } +hud-skill-st_shockwave_damage_title = Lökéshullám sebzés +hud-skill-st_shockwave_damage = Növeld meg a sebzést { $boost }%-kal{ $SP } +hud-skill-st_shockwave_unlock_title = Lökéshullám feloldása +hud-skill-st_shockwave_unlock = Feloldja a képességet, hogy tűz segítségével ellökd az ellenségeket{ $SP } +hud-skill-st_flamethrower_title = Lángszóró +hud-skill-st_flamethrower = Tüzet szór, süssük meg mindet +hud-skill-st_flame_velocity_title = Láng sebesség +hud-skill-st_flame_velocity = Gyorsabban jut oda a tűz { $boost }%-kal{ $SP } +hud-skill-st_flamethrower_range_title = Lángszóró hatótávolság +hud-skill-st_flamethrower_range = Ha a lángok akkor sem érik el, akkor { $boost }%-kal messzebbre mennek{ $SP } +hud-skill-st_energy_drain_title = Energiaigény +hud-skill-st_energy_drain = Lecsökkenti az energiaigényt { $boost }%-kal{ $SP } +hud-skill-st_flamethrower_damage_title = Lángszóró sebzés +hud-skill-st_flamethrower_damage = Megnöveli a sebzést { $boost }%-kal{ $SP } +hud-skill-st_explosion_radius_title = Robbanás sugara +hud-skill-st_explosion_radius = Nagyobb a jobb, megnöveli a robbanás sugarát { $boost }%-kal{ $SP } +hud-skill-st_energy_regen_title = Energia visszatöltődés +hud-skill-st_energy_regen = Megnöveli az energia visszatöltődést { $boost }%-kal{ $SP } +hud-skill-st_fireball_title = Tűzgolyó +hud-skill-st_fireball = Egy tűzgolyót lő ki, amely becsapódáskor felrobban +hud-skill-st_damage_title = Sebzés +hud-skill-st_damage = Megnöveli a sebzést { $boost }%-kal{ $SP } +hud-skill-bow_projectile_speed_title = Lövedéksebesség +hud-skill-bow_projectile_speed = Lehetővé teszi, hogy a nyilakat gyorsabban lődd távolabbra { $boost }%-kal{ $SP } +hud-skill-bow_charged_title = Felhúzott lövés +hud-skill-bow_charged = Mert többet vártál +hud-skill-bow_charged_damage_title = Felhúzott sebzés +hud-skill-bow_charged_damage = Megnöveli a sebzést { $boost }%-kal{ $SP } +hud-skill-bow_charged_energy_regen_title = Felhúzott energia visszatöltődés +hud-skill-bow_charged_energy_regen = Megnöveli az energia visszatöltődést { $boost }%-kal{ $SP } +hud-skill-bow_charged_knockback_title = Felhúzott visszaütés +hud-skill-bow_charged_knockback = Lökd távolabbra az ellenségeket { $boost }%-kal{ $SP } +hud-skill-bow_charged_speed_title = Felhúzott sebesség +hud-skill-bow_charged_speed = Megnöveli a felhúzott támadás mértékét { $boost }%-kal{ $SP } +hud-skill-bow_charged_move_title = Felhúzott mozgási sebesség +hud-skill-bow_charged_move = { $boost }%-kal megnöveli, hogy milyen gyorsan tudsz menni, amikor felhúzod a támadást{ $SP } +hud-skill-bow_repeater_title = Ismétlés +hud-skill-bow_repeater = Minél tovább csinálod, annál gyorsabban lősz +hud-skill-bow_repeater_damage_title = Ismétlés sebzése +hud-skill-bow_repeater_damage = Megnöveli a sebzést { $boost }%-kal{ $SP } +hud-skill-bow_repeater_cost_title = Ismétlés energiaigény +hud-skill-bow_repeater_cost = Csökkenti az ismétlés energiaigényét { $boost }%-kal{ $SP } +hud-skill-bow_repeater_speed_title = Ismétlés sebessége +hud-skill-bow_repeater_speed = Megnöveli a nyilak kilövésének gyakoriságát { $boost }%-kal{ $SP } +hud-skill-bow_shotgun_unlock_title = Szórólövés feloldása +hud-skill-bow_shotgun_unlock = Lehetővé teszi több nyíl kilövését egyszerre{ $SP } +hud-skill-bow_shotgun_damage_title = Szórólövés sebzése +hud-skill-bow_shotgun_damage = Megnöveli a sebzést { $boost }%-kal{ $SP } +hud-skill-bow_shotgun_cost_title = Szórólövés energiaigénye +hud-skill-bow_shotgun_cost = Csökkenti a szórólövés energiaigényét { $boost }%-kal{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Szórólövés nyilai +hud-skill-bow_shotgun_arrow_count = Megnöveli a szétlőtt nyilak számát ennyivel: { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Szórólövés szórása +hud-skill-bow_shotgun_spread = Csökkenti a nyilak szétrepülésének mértékét { $boost }%-kal{ $SP } +hud-skill-hmr_leap_radius_title = Ugrás sugár +hud-skill-hmr_leap_radius = Megnöveli a támadási sugarat földbecsapódáskor { $boost } méterrel{ $SP } +hud-skill-hmr_leap_distance_title = Ugrás távolság +hud-skill-hmr_leap_distance = Megnöveli az ugrás hosszát { $boost }%-kal{ $SP } +hud-skill-hmr_leap_cost_title = Ugrás energiaigénye +hud-skill-hmr_leap_cost = Csökkenti az ugrás energiaigényét { $boost }%-kal{ $SP } +hud-skill-hmr_leap_knockback_title = Ugrás hátralökés +hud-skill-hmr_leap_knockback = Megnöveli az ugrásból származó hátralökést { $boost }%-kal{ $SP } +hud-skill-hmr_leap_damage_title = Ugrás sebzés +hud-skill-hmr_leap_damage = Megnöveli az ugrás sebzését { $boost }%-kal{ $SP } +hud-skill-hmr_unlock_leap_title = Ugrás feloldása +hud-skill-hmr_unlock_leap = Feloldja az ugrást{ $SP } +hud-skill-hmr_charged_melee_title = Felhúzott ütés +hud-skill-hmr_charged_melee = Közelharci ütés, de felhúzással +hud-skill-hmr_charged_rate_title = Felhúzási mennyiség +hud-skill-hmr_charged_rate = Megnöveli a felhúzott ütések mennyiségét { $boost }%-kal{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Felhúzott ütés energiaigény +hud-skill-hmr_charged_melee_nrg_drain = Csökkenti a felhúzás energiaigényét { $boost }%-kal{ $SP } +hud-skill-hmr_charged_melee_damage_title = Felhúzott ütés sebzés +hud-skill-hmr_charged_melee_damage = Növeli a felhúzott ütés sebzését { $boost }%-kal{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Felhúzott ütés visszalökése +hud-skill-hmr_charged_melee_knockback = Masszívan megnöveli az ellökés lehetőségét { $boost }%-kal{ $SP } +hud-skill-hmr_single_strike_title = Egyszeri csapás +hud-skill-hmr_single_strike = Annyira egyedül van, mint te +hud-skill-hmr_single_strike_regen_title = Egyszeri csapás energia visszatöltődése +hud-skill-hmr_single_strike_regen = Megnöveli az energia visszatöltődését minden egyes sikeres csapással{ $SP } +hud-skill-hmr_single_strike_speed_title = Egyszeri csapás sebessége +hud-skill-hmr_single_strike_speed = Megnöveli a támadási sebességet minden egyes sikeres csapással{ $SP } +hud-skill-hmr_single_strike_damage_title = Egyszeri csapás sebzése +hud-skill-hmr_single_strike_damage = Megnöveli a sebzést minden egyes sikeres csapással{ $SP } +hud-skill-hmr_single_strike_knockback_title = Egyszeri csapás visszalökése +hud-skill-hmr_single_strike_knockback = Megnöveli a csapások ellökési sebességét { $boost }%-kal{ $SP } +hud-skill-sw_trip_str_title = Hármas csapás +hud-skill-sw_trip_str = Csapj oda, legfeljebb háromszor +hud-skill-sw_trip_str_combo_title = Hármas csapás kombó +hud-skill-sw_trip_str_combo = Feloldja a kombó skálázását hármas csapáskor{ $SP } +hud-skill-sw_trip_str_dmg_title = Hármas csapás sebzése +hud-skill-sw_trip_str_dmg = Megnöveli a sikeres csapások sebzését{ $SP } +hud-skill-sw_trip_str_sp_title = Hármas csapás sebessége +hud-skill-sw_trip_str_sp = Megnöveli a sikeres csapásokból gyűjtött támadási sebességet{ $SP } +hud-skill-sw_trip_str_reg_title = Hármas csapás energia visszatöltődés +hud-skill-sw_trip_str_reg = Megnöveli a sikeres csapások energia visszatöltődését{ $SP } +hud-skill-sw_dash_title = Roham +hud-skill-sw_dash = Döfd át az ellenségeid +hud-skill-sw_dash_dmg_title = Roham sebzése +hud-skill-sw_dash_dmg = Megnöveli a roham kezdeti sebzését { $boost }%-kal{ $SP } +hud-skill-sw_dash_drain_title = Roham kimerülés +hud-skill-sw_dash_drain = Csökkenti az energiafogyást rohamozáskor { $boost }%-kal{ $SP } +hud-skill-sw_dash_cost_title = Roham +hud-skill-sw_dash_cost = Csökkenti a roham kezdeti energiaigényét { $boost }%-kal{ $SP } +hud-skill-sw_dash_speed_title = Roham sebessége +hud-skill-sw_dash_speed = Megnöveli, hogy milyen gyorsan mész rohamozás közben { $boost }%-kal{ $SP } +hud-skill-sw_dash_charge_through_title = Átdöfés +hud-skill-sw_dash_charge_through = Lehetővé teszi, hogy átmenj az első ellenségen, akit eltalálsz{ $SP } +hud-skill-sw_dash_scale_title = Roham sebzés skálázása +hud-skill-sw_dash_scale = Megnöveli a sebzés skálázását a rohamból { $boost }%-kal{ $SP } +hud-skill-sw_spin_title = Forgás feloldása +hud-skill-sw_spin = Feloldja a karddal való forgást{ $SP } +hud-skill-sw_spin_dmg_title = Forgás sebzése +hud-skill-sw_spin_dmg = Megnöveli a megtett sebzést { $boost }%-kal{ $SP } +hud-skill-sw_spin_spd_title = Forgás sebessége +hud-skill-sw_spin_spd = Megnöveli a sebességet, amivel forogsz, { $boost }%-kal{ $SP } +hud-skill-sw_spin_cost_title = Forgás energiaigénye +hud-skill-sw_spin_cost = Csökkenti az egyes forgások energiaigényét { $boost }%-kal{ $SP } +hud-skill-sw_spin_spins_title = Forgások száma +hud-skill-sw_spin_spins = Megnöveli annak a számát, hogy hányszor foroghatsz{ $SP } +hud-skill-sw_interrupt_title = Megszakított támadások +hud-skill-sw_interrupt = Lehetővé teszi, hogy rögtön abbahagyj egy támadást egy másik támadással{ $SP } +hud-skill-axe_double_strike_title = Kettes csapás +hud-skill-axe_double_strike = Vágd le azokat a gonoszokat +hud-skill-axe_double_strike_combo_title = Kettes csapás kombó +hud-skill-axe_double_strike_combo = Felold egy második csapást{ $SP } +hud-skill-axe_double_strike_damage_title = Kettes csapás sebzése +hud-skill-axe_double_strike_damage = Megnöveli a sikeres csapások során kiosztott sebzést{ $SP } +hud-skill-axe_double_strike_speed_title = Kettes csapás sebessége +hud-skill-axe_double_strike_speed = Megnöveli a kettes csapások támadási sebességét{ $SP } +hud-skill-axe_double_strike_regen_title = Kettes csapás energia visszatöltődés +hud-skill-axe_double_strike_regen = Megnöveli a sikeres csapások által visszatöltődött energiát{ $SP } +hud-skill-axe_spin_title = Fejsze forgatás +hud-skill-axe_spin = Pontosan körbeforgatod ... +hud-skill-axe_infinite_axe_spin_title = Végtelen fejsze forgatás +hud-skill-axe_infinite_axe_spin = Addig forogsz, amíg van energiád{ $SP } +hud-skill-axe_spin_damage_title = Forgás sebzése +hud-skill-axe_spin_damage = Megnöveli az egyes forgások sebzését { $boost }%-kal{ $SP } +hud-skill-axe_spin_helicopter_title = Forgó helikopter +hud-skill-axe_spin_helicopter = Kicsit lassabban esel forgás közben{ $SP } +hud-skill-axe_spin_speed_title = Forgás sebessége +hud-skill-axe_spin_speed = Megnöveli a forgás sebességét { $boost }%-kal{ $SP } +hud-skill-axe_spin_cost_title = Forgás energiaigénye +hud-skill-axe_spin_cost = Csökkenti a forgás energiaigényét { $boost }%-kal{ $SP } +hud-skill-axe_unlock_leap_title = Ugrás feloldása +hud-skill-axe_unlock_leap = Felold egy ugrásos forgást{ $SP } +hud-skill-axe_leap_damage_title = Ugrás sebzése +hud-skill-axe_leap_damage = Megnöveli az ugrás sebzését { $boost }%-kal{ $SP } +hud-skill-axe_leap_knockback_title = Ugrás hátralökés +hud-skill-axe_leap_knockback = Megnöveli a hátralökést { $boost }%-kal{ $SP } +hud-skill-axe_leap_cost_title = Ugrás energiaigénye +hud-skill-axe_leap_cost = Csökkenti az ugrás energiaigényét { $boost }%-kal{ $SP } +hud-skill-axe_leap_distance_title = Ugrás távolsága +hud-skill-axe_leap_distance = Megnöveli az ugrás távolságát { $boost }%-kal{ $SP } +hud-skill-mining_title = Bányászás +hud-skill-pick_strike_title = Csákány csapás +hud-skill-pick_strike = Üss köveket a csákánnyal, hogy érceket, drágaköveket és tapasztalatot szerezz +hud-skill-pick_strike_speed_title = Csákányozás sebessége +hud-skill-pick_strike_speed = Bányássz köveket gyorsabban{ $SP } +hud-skill-pick_strike_oregain_title = Csákány érchozama +hud-skill-pick_strike_oregain = Annak az esélye, hogy plusz érceket kapsz ({ $boost }% szintenként){ $SP } +hud-skill-pick_strike_gemgain_title = Csákány drágakőhozama +hud-skill-pick_strike_gemgain = Annak az esélye, hogy plusz drágaköveket kapsz ({ $boost }% szintenként){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/skills.ron b/assets/voxygen/i18n/hu_HU/hud/skills.ron deleted file mode 100644 index e7bc7f5007..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/skills.ron +++ /dev/null @@ -1,256 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "hud.rank_up": "Új képességpont", - "hud.skill.sp_available": "{number} KP áll rendelkezésedre", - "hud.skill.not_unlocked": "Nincs még feloldva", - "hud.skill.req_sp": "\n\n{number} KP kell hozzá", - // Skills - // General - "hud.skill.inc_health_title": "Életerő növelése", - "hud.skill.inc_health": "Maximális életerő növelése {boost} ponttal{SP}", - "hud.skill.inc_energy_title": "Energia növelése", - "hud.skill.inc_energy": "Maximális energia növelése {boost} ponttal{SP}", - "hud.skill.unlck_sword_title": "Kard feloldása", - "hud.skill.unlck_sword": "Kard képességfájának feloldása{SP}", - "hud.skill.unlck_axe_title": "Fejsze feloldása", - "hud.skill.unlck_axe": "Fejsze képességfájának feloldása{SP}", - "hud.skill.unlck_hammer_title": "Pöröly feloldása", - "hud.skill.unlck_hammer": "Pöröly képességfájának feloldása{SP}", - "hud.skill.unlck_bow_title": "Íj feloldása", - "hud.skill.unlck_bow": "Íj képességfájának feloldása{SP}", - "hud.skill.unlck_staff_title": "Mágusbot feloldása", - "hud.skill.unlck_staff": "Mágusbot képességfájának feloldása{SP}", - "hud.skill.unlck_sceptre_title": "Varázsjogar feloldása", - "hud.skill.unlck_sceptre": "Varázsjogar képességfájának feloldása{SP}", - "hud.skill.dodge_title": "Kitérés", - "hud.skill.dodge": "A kitérőbukfencet görgőkattintással lehet aktiválni. A gurulás ideje alatt nem lehet megsebezni téged közelharci támadással.", - "hud.skill.roll_energy_title": "Bukfencezés energiaigénye", - "hud.skill.roll_energy": "A bukfencezés {boost}%-kal kevesebb energiát használ{SP}", - "hud.skill.roll_speed_title": "Bukfencezés sebessége", - "hud.skill.roll_speed": "{boost}%-kal gyorsabb bukfencezés{SP}", - "hud.skill.roll_dur_title": "Bukfencezés időtartama", - "hud.skill.roll_dur": "{boost}%-kal tovább tartó bukfencezés{SP}", - "hud.skill.climbing_title": "Mászás", - "hud.skill.climbing": "Magasabbra jutás", - "hud.skill.climbing_cost_title": "Mászás energiaigénye", - "hud.skill.climbing_cost": "A mászás {boost}%-kal kevesebb energiát használ el{SP}", - "hud.skill.climbing_speed_title": "Mászási sebesség", - "hud.skill.climbing_speed": "{boost}%-kal gyorsabb mászás{SP}", - "hud.skill.swim_title": "Úszás", - "hud.skill.swim": "Mozgás nedves környezetben", - "hud.skill.swim_speed_title": "Úszási sebesség", - "hud.skill.swim_speed": "{boost}%-kal gyorsabb úszás{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Életlopó sugár", - "hud.skill.sc_lifesteal": "Csapold le az ellenségeid életerejét", - "hud.skill.sc_lifesteal_damage_title": "Sebzés", - "hud.skill.sc_lifesteal_damage": "Okozz {boost}%-kal több sebzést{SP}", - "hud.skill.sc_lifesteal_range_title": "Hatótávolság", - "hud.skill.sc_lifesteal_range": "A sugarad {boost}%-kal messzebbre ér el{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Életlopás", - "hud.skill.sc_lifesteal_lifesteal": "Alakíts át még {boost}% sebzést életerővé{SP}", - "hud.skill.sc_lifesteal_regen_title": "Energia visszatöltődés", - "hud.skill.sc_lifesteal_regen": "További {boost}%-kal töltődik vissza az energiád{SP}", - "hud.skill.sc_heal_title": "Gyógyító sugár", - "hud.skill.sc_heal": "Gyógyítsd a szövetségeseid az ellenségeid vérével", - "hud.skill.sc_heal_heal_title": "Gyógyítás", - "hud.skill.sc_heal_heal": "{boost}%-kal növeli meg mások gyógyításának a mennyiségét{SP}", - "hud.skill.sc_heal_cost_title": "Energiaigény", - "hud.skill.sc_heal_cost": "Mások gyógyítása {boost}%-kal kevesebb energiát használ el{SP}", - "hud.skill.sc_heal_range_title": "Hatótávolság", - "hud.skill.sc_heal_range": "A sugarad {boost}%-kal messzebbre ér el{SP}", - "hud.skill.sc_wardaura_unlock_title": "Oltalmazó aura feloldása", - "hud.skill.sc_wardaura_unlock": "Védd meg a szövetségeseid az ellenséges támadásoktól{SP}", - "hud.skill.sc_wardaura_strength_title": "Erő", - "hud.skill.sc_wardaura_strength": "{boost}%-kal megnő a védelmed ereje{SP}", - "hud.skill.sc_wardaura_duration_title": "Időtartam", - "hud.skill.sc_wardaura_duration": "{boost}%-kal tovább tart az oltalmad hatása{SP}", - "hud.skill.sc_wardaura_range_title": "Sugár", - "hud.skill.sc_wardaura_range": "Az oltalmad {boost}%-kal messzebbre elér{SP}", - "hud.skill.sc_wardaura_cost_title": "Energiaigény", - "hud.skill.sc_wardaura_cost": "Az oltalom létrehozása {boost}%-kal kevesebb energiát használ el{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Lökéshullám hatótávolság", - "hud.skill.st_shockwave_range" : "Lökj el dolgokat, amelyek hatótávon kívül voltak, hatótávolság megnövelése {boost}%-kal{SP}", - "hud.skill.st_shockwave_cost_title" : "Lökéshullám energiaigény", - "hud.skill.st_shockwave_cost" : "Csökkentsd {boost}%-kal az energiaigényt, hogy tehetetlen falusiakat lökj el{SP}", - "hud.skill.st_shockwave_knockback_title" : "Lökéshullám hátralökés", - "hud.skill.st_shockwave_knockback" : "Növeld meg a hátralökés lehetőségét {boost}%-kal{SP}", - "hud.skill.st_shockwave_damage_title" : "Lökéshullám sebzés", - "hud.skill.st_shockwave_damage" : "Növeld meg a sebzést {boost}%-kal{SP}", - "hud.skill.st_shockwave_unlock_title" : "Lökéshullám feloldása", - "hud.skill.st_shockwave_unlock" : "Feloldja a képességet, hogy tűz segítségével ellökd az ellenségeket{SP}", - "hud.skill.st_flamethrower_title" : "Lángszóró", - "hud.skill.st_flamethrower" : "Tüzet szór, süssük meg mindet", - "hud.skill.st_flame_velocity_title" : "Láng sebesség", - "hud.skill.st_flame_velocity" : "Gyorsabban jut oda a tűz {boost}%-kal{SP}", - "hud.skill.st_flamethrower_range_title" : "Lángszóró hatótávolság", - "hud.skill.st_flamethrower_range" : "Ha a lángok akkor sem érik el, akkor {boost}%-kal messzebbre mennek{SP}", - "hud.skill.st_energy_drain_title" : "Energiaigény", - "hud.skill.st_energy_drain" : "Lecsökkenti az energiaigényt {boost}%-kal{SP}", - "hud.skill.st_flamethrower_damage_title" : "Lángszóró sebzés", - "hud.skill.st_flamethrower_damage" : "Megnöveli a sebzést {boost}%-kal{SP}", - "hud.skill.st_explosion_radius_title" : "Robbanás sugara", - "hud.skill.st_explosion_radius" : "Nagyobb a jobb, megnöveli a robbanás sugarát {boost}%-kal{SP}", - "hud.skill.st_energy_regen_title" : "Energia visszatöltődés", - "hud.skill.st_energy_regen" : "Megnöveli az energia visszatöltődést {boost}%-kal{SP}", - "hud.skill.st_fireball_title" : "Tűzgolyó", - "hud.skill.st_fireball" : "Egy tűzgolyót lő ki, amely becsapódáskor felrobban", - "hud.skill.st_damage_title" : "Sebzés", - "hud.skill.st_damage" : "Megnöveli a sebzést {boost}%-kal{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Lövedéksebesség", - "hud.skill.bow_projectile_speed" : "Lehetővé teszi, hogy a nyilakat gyorsabban lődd távolabbra {boost}%-kal{SP}", - "hud.skill.bow_charged_title" : "Felhúzott lövés", - "hud.skill.bow_charged" : "Mert többet vártál", - "hud.skill.bow_charged_damage_title" : "Felhúzott sebzés", - "hud.skill.bow_charged_damage" : "Megnöveli a sebzést {boost}%-kal{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Felhúzott energia visszatöltődés", - "hud.skill.bow_charged_energy_regen" : "Megnöveli az energia visszatöltődést {boost}%-kal{SP}", - "hud.skill.bow_charged_knockback_title" : "Felhúzott visszaütés", - "hud.skill.bow_charged_knockback" : "Lökd távolabbra az ellenségeket {boost}%-kal{SP}", - "hud.skill.bow_charged_speed_title" : "Felhúzott sebesség", - "hud.skill.bow_charged_speed" : "Megnöveli a felhúzott támadás mértékét {boost}%-kal{SP}", - "hud.skill.bow_charged_move_title" : "Felhúzott mozgási sebesség", - "hud.skill.bow_charged_move" : "{boost}%-kal megnöveli, hogy milyen gyorsan tudsz menni, amikor felhúzod a támadást{SP}", - "hud.skill.bow_repeater_title" : "Ismétlés", - "hud.skill.bow_repeater" : "Minél tovább csinálod, annál gyorsabban lősz", - "hud.skill.bow_repeater_damage_title" : "Ismétlés sebzése", - "hud.skill.bow_repeater_damage" : "Megnöveli a sebzést {boost}%-kal{SP}", - "hud.skill.bow_repeater_cost_title" : "Ismétlés energiaigény", - "hud.skill.bow_repeater_cost" : "Csökkenti az ismétlés energiaigényét {boost}%-kal{SP}", - "hud.skill.bow_repeater_speed_title" : "Ismétlés sebessége", - "hud.skill.bow_repeater_speed" : "Megnöveli a nyilak kilövésének gyakoriságát {boost}%-kal{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Szórólövés feloldása", - "hud.skill.bow_shotgun_unlock" : "Lehetővé teszi több nyíl kilövését egyszerre{SP}", - "hud.skill.bow_shotgun_damage_title" : "Szórólövés sebzése", - "hud.skill.bow_shotgun_damage" : "Megnöveli a sebzést {boost}%-kal{SP}", - "hud.skill.bow_shotgun_cost_title" : "Szórólövés energiaigénye", - "hud.skill.bow_shotgun_cost" : "Csökkenti a szórólövés energiaigényét {boost}%-kal{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Szórólövés nyilai", - "hud.skill.bow_shotgun_arrow_count" : "Megnöveli a szétlőtt nyilak számát ennyivel: {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Szórólövés szórása", - "hud.skill.bow_shotgun_spread" : "Csökkenti a nyilak szétrepülésének mértékét {boost}%-kal{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Ugrás sugár", - "hud.skill.hmr_leap_radius" : "Megnöveli a támadási sugarat földbecsapódáskor {boost} méterrel{SP}", - "hud.skill.hmr_leap_distance_title" : "Ugrás távolság", - "hud.skill.hmr_leap_distance" : "Megnöveli az ugrás hosszát {boost}%-kal{SP}", - "hud.skill.hmr_leap_cost_title" : "Ugrás energiaigénye", - "hud.skill.hmr_leap_cost" : "Csökkenti az ugrás energiaigényét {boost}%-kal{SP}", - "hud.skill.hmr_leap_knockback_title" : "Ugrás hátralökés", - "hud.skill.hmr_leap_knockback" : "Megnöveli az ugrásból származó hátralökést {boost}%-kal{SP}", - "hud.skill.hmr_leap_damage_title" : "Ugrás sebzés", - "hud.skill.hmr_leap_damage" : "Megnöveli az ugrás sebzését {boost}%-kal{SP}", - "hud.skill.hmr_unlock_leap_title" : "Ugrás feloldása", - "hud.skill.hmr_unlock_leap" : "Feloldja az ugrást{SP}", - "hud.skill.hmr_charged_melee_title" : "Felhúzott ütés", - "hud.skill.hmr_charged_melee" : "Közelharci ütés, de felhúzással", - "hud.skill.hmr_charged_rate_title" : "Felhúzási mennyiség", - "hud.skill.hmr_charged_rate" : "Megnöveli a felhúzott ütések mennyiségét {boost}%-kal{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Felhúzott ütés energiaigény", - "hud.skill.hmr_charged_melee_nrg_drain" : "Csökkenti a felhúzás energiaigényét {boost}%-kal{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Felhúzott ütés sebzés", - "hud.skill.hmr_charged_melee_damage" : "Növeli a felhúzott ütés sebzését {boost}%-kal{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Felhúzott ütés visszalökése", - "hud.skill.hmr_charged_melee_knockback" : "Masszívan megnöveli az ellökés lehetőségét {boost}%-kal{SP}", - "hud.skill.hmr_single_strike_title" : "Egyszeri csapás", - "hud.skill.hmr_single_strike" : "Annyira egyedül van, mint te", - "hud.skill.hmr_single_strike_regen_title" : "Egyszeri csapás energia visszatöltődése", - "hud.skill.hmr_single_strike_regen" : "Megnöveli az energia visszatöltődését minden egyes sikeres csapással{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Egyszeri csapás sebessége", - "hud.skill.hmr_single_strike_speed" : "Megnöveli a támadási sebességet minden egyes sikeres csapással{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Egyszeri csapás sebzése", - "hud.skill.hmr_single_strike_damage" : "Megnöveli a sebzést minden egyes sikeres csapással{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Egyszeri csapás visszalökése", - "hud.skill.hmr_single_strike_knockback" : "Megnöveli a csapások ellökési sebességét {boost}%-kal{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Hármas csapás", - "hud.skill.sw_trip_str": "Csapj oda, legfeljebb háromszor", - "hud.skill.sw_trip_str_combo_title": "Hármas csapás kombó", - "hud.skill.sw_trip_str_combo": "Feloldja a kombó skálázását hármas csapáskor{SP}", - "hud.skill.sw_trip_str_dmg_title": "Hármas csapás sebzése", - "hud.skill.sw_trip_str_dmg": "Megnöveli a sikeres csapások sebzését{SP}", - "hud.skill.sw_trip_str_sp_title": "Hármas csapás sebessége", - "hud.skill.sw_trip_str_sp": "Megnöveli a sikeres csapásokból gyűjtött támadási sebességet{SP}", - "hud.skill.sw_trip_str_reg_title": "Hármas csapás energia visszatöltődés", - "hud.skill.sw_trip_str_reg": "Megnöveli a sikeres csapások energia visszatöltődését{SP}", - "hud.skill.sw_dash_title": "Roham", - "hud.skill.sw_dash": "Döfd át az ellenségeid", - "hud.skill.sw_dash_dmg_title": "Roham sebzése", - "hud.skill.sw_dash_dmg": "Megnöveli a roham kezdeti sebzését {boost}%-kal{SP}", - "hud.skill.sw_dash_drain_title": "Roham kimerülés", - "hud.skill.sw_dash_drain": "Csökkenti az energiafogyást rohamozáskor {boost}%-kal{SP}", - "hud.skill.sw_dash_cost_title": "Roham", - "hud.skill.sw_dash_cost": "Csökkenti a roham kezdeti energiaigényét {boost}%-kal{SP}", - "hud.skill.sw_dash_speed_title": "Roham sebessége", - "hud.skill.sw_dash_speed": "Megnöveli, hogy milyen gyorsan mész rohamozás közben {boost}%-kal{SP}", - "hud.skill.sw_dash_charge_through_title": "Átdöfés", - "hud.skill.sw_dash_charge_through": "Lehetővé teszi, hogy átmenj az első ellenségen, akit eltalálsz{SP}", - "hud.skill.sw_dash_scale_title": "Roham sebzés skálázása", - "hud.skill.sw_dash_scale": "Megnöveli a sebzés skálázását a rohamból {boost}%-kal{SP}", - "hud.skill.sw_spin_title": "Forgás feloldása", - "hud.skill.sw_spin": "Feloldja a karddal való forgást{SP}", - "hud.skill.sw_spin_dmg_title": "Forgás sebzése", - "hud.skill.sw_spin_dmg": "Megnöveli a megtett sebzést {boost}%-kal{SP}", - "hud.skill.sw_spin_spd_title": "Forgás sebessége", - "hud.skill.sw_spin_spd": "Megnöveli a sebességet, amivel forogsz, {boost}%-kal{SP}", - "hud.skill.sw_spin_cost_title": "Forgás energiaigénye", - "hud.skill.sw_spin_cost": "Csökkenti az egyes forgások energiaigényét {boost}%-kal{SP}", - "hud.skill.sw_spin_spins_title": "Forgások száma", - "hud.skill.sw_spin_spins": "Megnöveli annak a számát, hogy hányszor foroghatsz{SP}", - "hud.skill.sw_interrupt_title": "Megszakított támadások", - "hud.skill.sw_interrupt": "Lehetővé teszi, hogy rögtön abbahagyj egy támadást egy másik támadással{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Kettes csapás", - "hud.skill.axe_double_strike": "Vágd le azokat a gonoszokat", - "hud.skill.axe_double_strike_combo_title": "Kettes csapás kombó", - "hud.skill.axe_double_strike_combo": "Felold egy második csapást{SP}", - "hud.skill.axe_double_strike_damage_title": "Kettes csapás sebzése", - "hud.skill.axe_double_strike_damage": "Megnöveli a sikeres csapások során kiosztott sebzést{SP}", - "hud.skill.axe_double_strike_speed_title": "Kettes csapás sebessége", - "hud.skill.axe_double_strike_speed": "Megnöveli a kettes csapások támadási sebességét{SP}", - "hud.skill.axe_double_strike_regen_title": "Kettes csapás energia visszatöltődés", - "hud.skill.axe_double_strike_regen": "Megnöveli a sikeres csapások által visszatöltődött energiát{SP}", - "hud.skill.axe_spin_title": "Fejsze forgatás", - "hud.skill.axe_spin": "Pontosan körbeforgatod ...", - "hud.skill.axe_infinite_axe_spin_title": "Végtelen fejsze forgatás", - "hud.skill.axe_infinite_axe_spin": "Addig forogsz, amíg van energiád{SP}", - "hud.skill.axe_spin_damage_title": "Forgás sebzése", - "hud.skill.axe_spin_damage": "Megnöveli az egyes forgások sebzését {boost}%-kal{SP}", - "hud.skill.axe_spin_helicopter_title": "Forgó helikopter", - "hud.skill.axe_spin_helicopter": "Kicsit lassabban esel forgás közben{SP}", - "hud.skill.axe_spin_speed_title": "Forgás sebessége", - "hud.skill.axe_spin_speed": "Megnöveli a forgás sebességét {boost}%-kal{SP}", - "hud.skill.axe_spin_cost_title": "Forgás energiaigénye", - "hud.skill.axe_spin_cost": "Csökkenti a forgás energiaigényét {boost}%-kal{SP}", - "hud.skill.axe_unlock_leap_title": "Ugrás feloldása", - "hud.skill.axe_unlock_leap": "Felold egy ugrásos forgást{SP}", - "hud.skill.axe_leap_damage_title": "Ugrás sebzése", - "hud.skill.axe_leap_damage": "Megnöveli az ugrás sebzését {boost}%-kal{SP}", - "hud.skill.axe_leap_knockback_title": "Ugrás hátralökés", - "hud.skill.axe_leap_knockback": "Megnöveli a hátralökést {boost}%-kal{SP}", - "hud.skill.axe_leap_cost_title": "Ugrás energiaigénye", - "hud.skill.axe_leap_cost": "Csökkenti az ugrás energiaigényét {boost}%-kal{SP}", - "hud.skill.axe_leap_distance_title": "Ugrás távolsága", - "hud.skill.axe_leap_distance": "Megnöveli az ugrás távolságát {boost}%-kal{SP}", - // Mining - "hud.skill.mining_title": "Bányászás", - "hud.skill.pick_strike_title": "Csákány csapás", - "hud.skill.pick_strike": "Üss köveket a csákánnyal, hogy érceket, drágaköveket és tapasztalatot szerezz", - "hud.skill.pick_strike_speed_title": "Csákányozás sebessége", - "hud.skill.pick_strike_speed": "Bányássz köveket gyorsabban{SP}", - "hud.skill.pick_strike_oregain_title": "Csákány érchozama", - "hud.skill.pick_strike_oregain": "Annak az esélye, hogy plusz érceket kapsz ({boost}% szintenként){SP}", - "hud.skill.pick_strike_gemgain_title": "Csákány drágakőhozama", - "hud.skill.pick_strike_gemgain": "Annak az esélye, hogy plusz drágaköveket kapsz ({boost}% szintenként){SP}", - }, - - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/hu_HU/hud/social.ftl b/assets/voxygen/i18n/hu_HU/hud/social.ftl new file mode 100644 index 0000000000..abec2bb30e --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Más játékosok +hud-social-online = Online: +hud-social-friends = Barátok +hud-social-not_yet_available = Még nem elérhető +hud-social-faction = Frakció +hud-social-play_online_fmt = { $nb_player } játékos online +hud-social-name = Név +hud-social-level = Szint +hud-social-zone = Zóna +hud-social-account = Felhasználói fiók \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/social.ron b/assets/voxygen/i18n/hu_HU/hud/social.ron deleted file mode 100644 index 9a0ee33197..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "hud.social": "Más játékosok", - "hud.social.online": "Online:", - "hud.social.friends": "Barátok", - "hud.social.not_yet_available": "Még nem elérhető", - "hud.social.faction": "Frakció", - "hud.social.play_online_fmt": "{nb_player} játékos online", - "hud.social.name": "Név", - "hud.social.level": "Szint", - "hud.social.zone": "Zóna", - "hud.social.account": "Felhasználói fiók", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/hu_HU/hud/trade.ftl b/assets/voxygen/i18n/hu_HU/hud/trade.ftl new file mode 100644 index 0000000000..929f5910ce --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/hud/trade.ftl @@ -0,0 +1,23 @@ +hud-trade-trade_window = Üzletelő ablak +hud-trade-phase1_description = + Húzd a cserélni kívánt tárgyakat + a megfelelő mezőbe! +hud-trade-phase2_description = + A cserefolyamat meg lett állítva, + így van időd átnézni az ajánlatokat. +hud-trade-phase3_description = Csere feldolgozása... +hud-trade-persons_offer = { $playername } ajánlata +hud-trade-has_accepted = + { $playername } + elfogadta az ajánlatot +hud-trade-accept = Elfogad +hud-trade-decline = Visszautasít +hud-trade-invite_sent = Üzletelési szándék elküldve neki: { $playername }. +hud-trade-result-completed = Üzlet sikeresen lebonyolítva. +hud-trade-result-declined = Ajánlat visszautasítva. +hud-trade-result-nospace = Nincs elég tárhely üzlet lebonyolításához. +hud-trade-buy_price = Vásárlói ár +hud-trade-sell_price = Eladói ár +hud-trade-coin = érme +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/hud/trade.ron b/assets/voxygen/i18n/hu_HU/hud/trade.ron deleted file mode 100644 index ddd0804858..0000000000 --- a/assets/voxygen/i18n/hu_HU/hud/trade.ron +++ /dev/null @@ -1,30 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - "hud.trade.trade_window": "Üzletelő ablak", - "hud.trade.phase1_description": "Húzd a cserélni kívánt tárgyakat\na megfelelő mezőbe!", - "hud.trade.phase2_description": "A cserefolyamat meg lett állítva,\nígy van időd átnézni az ajánlatokat.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Csere feldolgozása...", - "hud.trade.persons_offer": "{playername} ajánlata", - "hud.trade.has_accepted": "{playername}\nelfogadta az ajánlatot", - "hud.trade.accept": "Elfogad", - "hud.trade.decline": "Visszautasít", - "hud.trade.invite_sent": "Üzletelési szándék elküldve neki: {playername}.", - "hud.trade.result.completed": "Üzlet sikeresen lebonyolítva.", - "hud.trade.result.declined": "Ajánlat visszautasítva.", - "hud.trade.result.nospace": "Nincs elég tárhely üzlet lebonyolításához.", - "hud.trade.buy_price": "Vásárlói ár", - "hud.trade.sell_price": "Eladói ár", - "hud.trade.coin": "érme", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/hu_HU/main.ftl b/assets/voxygen/i18n/hu_HU/main.ftl new file mode 100644 index 0000000000..5bc75dfdbc --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/main.ftl @@ -0,0 +1,77 @@ +main-username = Felhasználónév +main-server = Szerver +main-password = Jelszó +main-connecting = Csatlakozás +main-creating_world = Világ létrehozása +main-tip = Tipp: +main-notice = + Üdvözlünk a Veloren alfa verziójában! + + Mielőtt fejest ugrasz a játékba szeretnénk felhívhi a figyelmedet pár dologra: + + - Ez egy nagyon korai alfa verzió, vagyis akadnak még benne hibák, a játékmenet és a különféle játékmechanikák még csiszolásra szorulnak, bizonyos elemek pedig még nem kerültek implementálásra. + + - Ha van valamilyen építő jellegű visszajelzésed, vagy hibát szeretnél bejelenteni, nyugodtan keress fel minket Redditen, GitLab-en, vagy a közösségi Discord-szerverünkön. + + - A Veloren a GPL 3 nyílt forráskódú licenc alatt van kiadva. Ezt azt jelenti, hogy megkötések nélül játhatsz vele, továbbá saját igényeid szerint módosíthatod és terjesztheted (már amennyiben az új produktum is GPL 3-as licensszel rendelkezik). + + - A Veloren egy nonprofit, közösségi projekt, a fejlesztésben részt vevő emberek pedig egytől-egyik önkéntesek. + Ha tetszik amit látsz, örömmel várunk akár a fejlesztői, akár a művészeti csapatban! + + Köszönjük, hogy szakítottál időt ezen kis értesítő elolvasására. Jó játékot kívánunk! + + ~ A Veloren fejlesztői +main-login_process = + Információ a bejelentkezési folyamatról: + + Ahhoz, hogy játszani tudj hitelesített + szervereken előbb létre kell hoznod + egy felhasználói fiókot. + + Ezt a fiókot a következő weboldalon + tudod létrehozni: + + https://veloren.net/account/. +main-login-server_not_found = Szerver nem található +main-login-authentication_error = Hitelesítési hiba a szerveren +main-login-internal_error = Klienshiba (minden bizonnyal törölve lett a karakter) +main-login-failed_auth_server_url_invalid = Nem sikerült kapcsolódni a hitelesítő szerverhez +main-login-insecure_auth_scheme = A HTTP hitelesítés nem támogatott, mert nem biztonságos! A fejlesztés során csak a 'localhost' és a debug build-ek esetén alkalmazunk HTTP-t. +main-login-server_full = A szerver megtelt +main-login-untrusted_auth_server = A hitelesítő szerver nem megbízható +main-login-outdated_client_or_server = ServerWentMad: A játákverziók minden bizonnyal inkompatibilisek, frissítés szükséges. +main-login-timeout = Időtúllépés: Nem válaszolt időben a szerver (vagy túlterhelés, vagy hálózati problémák miatt). +main-login-server_shut_down = Leállt a szerver +main-login-network_error = Hálózati hiba +main-login-network_wrong_version = Nem egyezik a szerver és a kliens verziója, kérlek frissítsd a játékkliensed! +main-login-failed_sending_request = Meghiúsult a hitelesítő szerver felé irányuló kérés +main-login-invalid_character = A kiválasztott karakter nem megfelelő +main-login-client_crashed = Összeomlott a kliens +main-login-not_on_whitelist = Hogy csatlakozni tudj előbb meg kell kérned az egyik admint, hogy vegyen fel téged a fehér listára. +main-login-banned = Ki lettél tiltva a következő miatt: +main-login-kicked = Ki lettél rakva a következő miatt: +main-login-select_language = Válassz ki egy nyelvet +main-login-client_version = Kliens verzió +main-login-server_version = Szerver verzió +main-servers-select_server = Válassz ki egy szervert +loading-tips = + .a0 = Lámpásod meggyújtásához nyomd meg a '{ $gameinput-togglelantern }' gombot! + .a1 = Az alapértelmezett billentyű-összerendelések megtekintéséhez nyomd meg az '{ $gameinput-help }' gombot! + .a2 = Ha beírod a csevegésbe a /say vagy a /s parancsot, lehetőséged nyílik arra, hogy csak a közvetlen közeledben lévő játékosokkal beszélgess. + .a3 = Ha beírod a csevegésbe a /region vagy a /r parancsot, lehetőséged nyílik arra, hogy csak a tőled max pár száz blokkra lévő játékosokkal beszélgess. + .a4 = Az adminisztrátorok használhatják a /build parancsot – ezzel léphetnek be az építő módba. + .a5 = Ha beírod a csevegésbe a /group vagy a /g parancsot, lehetőséged nyílik arra, hogy csak a csoportodban lévő játékosokkal beszélgess. + .a6 = Privát üzenetek küldéséhez írd be a csevegésbe a /tell parancsot, majd a játékos nevét, végül pedig az üzenetet. + .a7 = Érdemes nyitott szemmel járni, hiszen rengeteg étel, láda és egyéb zsákmány található szerte a világban! + .a8 = Túl sok az étel a holmijaid között? Próbálj meg jobb ételt kotyvasztani belőlük! + .a9 = Azon tűnődsz, hogy mit kellene csinálnod? Tedd magad próbára a térképen megjelölt kazamaták valamelyikében! + .a10 = Ne felejtsd el a rendszeredhez igazítani a grafikát! A beállítások megtekintéséhez nyomd meg az '{ $gameinput-settings }' gombot! + .a11 = Másokkal játszani bizony jó muri! Hogy lásd, épp ki van fönn a hálózaton nyomd meg az '{ $gameinput-social }' gombot! + .a12 = A táncoláshoz nyomd meg a '{ $gameinput-dance }' gombot. Bulira föl! + .a13 = Nyomd meg a '{ $gameinput-glide }'-t és hódítsd meg sárkányrepülőddel az eget! + .a14 = A Veloren még mindig előzetes alfában van. Igyekszünk mindent megtenni annak érdekében, hogy napról-napra jobb és jobb legyen! + .a15 = Szeretnél a feljesztői csapat tagja lenni, vagy netán csak csevegnél velünk? Csatlakozz a Discord szerverünkhöz! + .a16 = A beállításokban azt is eldöntheted, hogy megjelenjen-e az életerőd mennyisége az életerő sávban, vagy sem. + .a17 = Ha lehuppansz (a '{ $gameinput-sit }' gombbal) egy tábortűz mellé szép lassan be fognak gyógyulni a sebeid. + .a18 = Több holmitartóra vagy jobb páncélzatra van szükséged? Nyomd meg a '{ $gameinput-crafting }' gombot, és nézz szét a tárgykészítési menüben! + .a19 = Próbálj meg ugrani egyet, miközben keresztülbukfencezel másokon! \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/main.ron b/assets/voxygen/i18n/hu_HU/main.ron deleted file mode 100644 index c762925ec6..0000000000 --- a/assets/voxygen/i18n/hu_HU/main.ron +++ /dev/null @@ -1,93 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - /// Start Main screen section - "main.username": "Felhasználónév", - "main.server": "Szerver", - "main.password": "Jelszó", - "main.connecting": "Csatlakozás", - "main.creating_world": "Világ létrehozása", - "main.tip": "Tipp:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Üdvözlünk a Veloren alfa verziójában! - -Mielőtt fejest ugrasz a játékba szeretnénk felhívhi a figyelmedet pár dologra: - -- Ez egy nagyon korai alfa verzió, vagyis akadnak még benne hibák, a játékmenet és a különféle játékmechanikák még csiszolásra szorulnak, bizonyos elemek pedig még nem kerültek implementálásra. - -- Ha van valamilyen építő jellegű visszajelzésed, vagy hibát szeretnél bejelenteni, nyugodtan keress fel minket Redditen, GitLab-en, vagy a közösségi Discord-szerverünkön. - -- A Veloren a GPL 3 nyílt forráskódú licenc alatt van kiadva. Ezt azt jelenti, hogy megkötések nélül játhatsz vele, továbbá saját igényeid szerint módosíthatod és terjesztheted (már amennyiben az új produktum is GPL 3-as licensszel rendelkezik). - -- A Veloren egy nonprofit, közösségi projekt, a fejlesztésben részt vevő emberek pedig egytől-egyik önkéntesek. -Ha tetszik amit látsz, örömmel várunk akár a fejlesztői, akár a művészeti csapatban! - -Köszönjük, hogy szakítottál időt ezen kis értesítő elolvasására. Jó játékot kívánunk! - -~ A Veloren fejlesztői"#, - - // Login process description - "main.login_process": r#"Információ a bejelentkezési folyamatról: - -Ahhoz, hogy játszani tudj hitelesített -szervereken előbb létre kell hoznod -egy felhasználói fiókot. - -Ezt a fiókot a következő weboldalon -tudod létrehozni: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Szerver nem található", - "main.login.authentication_error": "Hitelesítési hiba a szerveren", - "main.login.internal_error": "Klienshiba (minden bizonnyal törölve lett a karakter)", - "main.login.failed_auth_server_url_invalid": "Nem sikerült kapcsolódni a hitelesítő szerverhez", - "main.login.insecure_auth_scheme": "A HTTP hitelesítés nem támogatott, mert nem biztonságos! A fejlesztés során csak a 'localhost' és a debug build-ek esetén alkalmazunk HTTP-t.", - "main.login.server_full": "A szerver megtelt", - "main.login.untrusted_auth_server": "A hitelesítő szerver nem megbízható", - "main.login.outdated_client_or_server": "ServerWentMad: A játákverziók minden bizonnyal inkompatibilisek, frissítés szükséges.", - "main.login.timeout": "Időtúllépés: Nem válaszolt időben a szerver (vagy túlterhelés, vagy hálózati problémák miatt).", - "main.login.server_shut_down": "Leállt a szerver", - "main.login.network_error": "Hálózati hiba", - "main.login.network_wrong_version": "Nem egyezik a szerver és a kliens verziója, kérlek frissítsd a játékkliensed!", - "main.login.failed_sending_request": "Meghiúsult a hitelesítő szerver felé irányuló kérés", - "main.login.invalid_character": "A kiválasztott karakter nem megfelelő", - "main.login.client_crashed": "Összeomlott a kliens", - "main.login.not_on_whitelist": "Hogy csatlakozni tudj előbb meg kell kérned az egyik admint, hogy vegyen fel téged a fehér listára.", - "main.login.banned": "Ki lettél tiltva a következő miatt:", - "main.login.kicked": "Ki lettél rakva a következő miatt:", - "main.login.select_language": "Válassz ki egy nyelvet", - "main.login.client_version": "Kliens verzió", - "main.login.server_version": "Szerver verzió", - "main.servers.select_server": "Válassz ki egy szervert", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Lámpásod meggyújtásához nyomd meg a '{gameinput.togglelantern}' gombot!", - "Az alapértelmezett billentyű-összerendelések megtekintéséhez nyomd meg az '{gameinput.help}' gombot!", - "Ha beírod a csevegésbe a /say vagy a /s parancsot, lehetőséged nyílik arra, hogy csak a közvetlen közeledben lévő játékosokkal beszélgess.", - "Ha beírod a csevegésbe a /region vagy a /r parancsot, lehetőséged nyílik arra, hogy csak a tőled max pár száz blokkra lévő játékosokkal beszélgess.", - "Az adminisztrátorok használhatják a /build parancsot – ezzel léphetnek be az építő módba.", - "Ha beírod a csevegésbe a /group vagy a /g parancsot, lehetőséged nyílik arra, hogy csak a csoportodban lévő játékosokkal beszélgess.", - "Privát üzenetek küldéséhez írd be a csevegésbe a /tell parancsot, majd a játékos nevét, végül pedig az üzenetet.", - "Érdemes nyitott szemmel járni, hiszen rengeteg étel, láda és egyéb zsákmány található szerte a világban!", - "Túl sok az étel a holmijaid között? Próbálj meg jobb ételt kotyvasztani belőlük!", - "Azon tűnődsz, hogy mit kellene csinálnod? Tedd magad próbára a térképen megjelölt kazamaták valamelyikében!", - "Ne felejtsd el a rendszeredhez igazítani a grafikát! A beállítások megtekintéséhez nyomd meg az '{gameinput.settings}' gombot!", - "Másokkal játszani bizony jó muri! Hogy lásd, épp ki van fönn a hálózaton nyomd meg az '{gameinput.social}' gombot!", - "A táncoláshoz nyomd meg a '{gameinput.dance}' gombot. Bulira föl!", - "Nyomd meg a '{gameinput.glide}'-t és hódítsd meg sárkányrepülőddel az eget!", - "A Veloren még mindig előzetes alfában van. Igyekszünk mindent megtenni annak érdekében, hogy napról-napra jobb és jobb legyen!", - "Szeretnél a feljesztői csapat tagja lenni, vagy netán csak csevegnél velünk? Csatlakozz a Discord szerverünkhöz!", - "A beállításokban azt is eldöntheted, hogy megjelenjen-e az életerőd mennyisége az életerő sávban, vagy sem.", - "Ha lehuppansz (a '{gameinput.sit}' gombbal) egy tábortűz mellé szép lassan be fognak gyógyulni a sebeid.", - "Több holmitartóra vagy jobb páncélzatra van szükséged? Nyomd meg a '{gameinput.crafting}' gombot, és nézz szét a tárgykészítési menüben!", - "Próbálj meg ugrani egyet, miközben keresztülbukfencezel másokon!", - ], - } -) diff --git a/assets/voxygen/i18n/hu_HU/npc.ftl b/assets/voxygen/i18n/hu_HU/npc.ftl new file mode 100644 index 0000000000..31d13e9edc --- /dev/null +++ b/assets/voxygen/i18n/hu_HU/npc.ftl @@ -0,0 +1,163 @@ +npc-speech-villager = + .a0 = Csodás napunk van, nemde? + .a1 = Hogy vagy? + .a2 = Áldott jó reggelt kívánok! + .a3 = Vajon mire gondol a Catoblepas, miközben legelészik? + .a4 = Mit szólsz ehhez az időjáráshoz? + .a5 = Akárhányszor azokra a kazamatákre gondolok elfog a félelem. Remélem valaki majd megtisztítja őket... + .a6 = Majd szeretnék elmenni barlangászni, amikor már erősebb leszek. + .a7 = Nem láttad a macskámat? + .a8 = Hallottál már a veszedelmes földi cápákról? Úgy tudom a sivatagokban élnek. + .a9 = Azt mondják a barlangok tele vannak mindenféle fényes drágakővel. + .a10 = Megőrülök a sajtért! + .a11 = Nem nézel be hozzánk? Épp most terveztünk nekiállni sajtozni! + .a12 = Azt mondják a gomba jót tesz az egészségednek. Én magam nem szoktam enni. + .a13 = A kekszeket ne feledd! + .a14 = Egyszerűen rajongok a törpe sajtért. Bárcsak én is el tudnám készíteni... + .a15 = Mi lehet vajon a hegyen túl? + .a16 = Remélem egyszer majd elkészíthetem a saját sárkányrepülőmet. + .a17 = Szeretnéd látni a kertem? Hát jó, talán majd máskor. + .a18 = Kitűnő nap ez a mai egy jó erdei sétához! + .a19 = Lenni, vagy nem lenni? Én azt hiszem farmer leszek. + .a20 = Hát nem a mi városkánk a legjobb? + .a21 = Szerinted mitől ragyognak a ragyogó maradványok? + .a22 = Azt hiszem eljött a második reggeli ideje! + .a23 = Fogtál már szentjánosbogarat? + .a24 = Egyszerűen képtelen vagyok rájönni, hogy ugyan honnan jönnek ezek a Saurokok... + .a25 = Bárcsak távol tartaná valaki a farkasokat a városkától... + .a26 = Csodás, sajtos álomban volt tegnap este részem. Mit jelenthet ez vajon? + .a27 = Hagytam egy kis sajtot az öcsémnél. Nem tudom, hogy megvan-e még. Úgy hívom, hogy Schrödinger sajtja. + .a28 = Hagytam egy kis sajtot a húgomnál. Nem tudom, hogy megvan-e még. Úgy hívom, hogy Schrödinger sajtja. + .a29 = Valaki igazán kezdhetne már valamit ezekkel a kultistákkal! Valaki rajtam kívül... + .a30 = Remélem jön némi eső hamarosan, jót tenne a terménynek. + .a31 = Imádom a mézet... és utálom a méheket. + .a32 = Egy napon majd szeretnék világot látni. Csak tartogat nekem valamit az élet ezen a városkán kívül is. +npc-speech-villager_decline_trade = + .a0 = Sajnálom, én nem tudok mit áruba bocsájtani. + .a1 = Üzletelni? Velem? Mintha lenne bármim, ami fel tudná kelteni az érdeklődésedet... + .a2 = A ház az enyém! Nem fogom elcserélni semmiért! +npc-speech-merchant_advertisement = + .a0 = Ajánlhatok személyemben egy kereskedőpartnert? + .a1 = Szeretnél velem üzletelni? + .a2 = Rengeteg árum van, szeretnél vetni rájuk egy pillantást? +npc-speech-merchant_busy = + .a0 = Hé, várd ki a sorod! + .a1 = Várj egy kicsit légyszíves, belőlem is csak egy van. + .a2 = Látod ezt a másik embert előtted? + .a3 = Egy pillanat, hadd fejezzem be! + .a4 = Ne vágj be mások elé! + .a5 = Most épp nem érek rá, gyere vissza később! +npc-speech-merchant_trade_successful = + .a0 = Köszönöm, hogy velem üzleteltél! + .a1 = Hálás köszönet! +npc-speech-merchant_trade_declined = + .a0 = Talán majd máskor. Legyen szép napod! + .a1 = Kár, majd talán legközelebb! +npc-speech-villager_cultist_alarm = + .a0 = Vigyázat! Elszabadult egy kultista! + .a1 = Fegyverbe! Támadnak a kultisták! + .a2 = Hogy merik a kultisták megtámadni a mi városkánkat?! + .a3 = Halál a kultistákra! + .a4 = Itt nem tűrünk meg egy kultistát sem! + .a5 = Te véres kultista! + .a6 = Ízleld meg a kardom élét, mocskos kultista! + .a7 = Semmi nem moshatja le a vért a kezedről, kultista! + .a8 = Millió mérgező mályvaszín medúza! Egy kultista van köztünk! + .a9 = A kultisták gonoszkodásainak hamarosan vége! + .a10 = Ez a kultista az enyém! + .a11 = Ideje, hogy találkozz a teremtőddel, aljas kultista! + .a12 = Itt egy kultista! Kapjuk el! + .a13 = Itt egy kultista! Támadás! + .a14 = Itt egy kultista! Ne hagyjuk megszökni! + .a15 = Nem óhajt kultista őméltósága egy kis HALÁLT?! + .a16 = Nincs bocsánat! Nincs feledés! Kultisták, bűnhődjetek! + .a17 = Pusztulj, kultista! + .a18 = Egyszer véget ér a rémuralmatok! + .a19 = Ezt azt eddigi tetteitekért! + .a20 = Nem látjuk szívesen a fajtátokat errefelé! + .a21 = Maradtatok volna a föld alatt! +npc-speech-villager_under_attack = + .a0 = Segítség, Megtámadtak! + .a1 = Segítség, Megtámadtak! + .a2 = Aúú! Megtámadtak!! + .a3 = Aúú! Megtámadtak! Segítség! + .a4 = Segítsetek! Megtámadtak! + .a5 = Megtámadtak! Segítség! + .a6 = Megtámadtak! Segítsetek! + .a7 = Segítség! + .a8 = Segítség! Segítség! + .a9 = Segítség! Segítség! Segítség! + .a10 = Megtámadtak! + .a11 = ÁÁÁÁÁÁ! Megtámadtak! + .a12 = ÁÁÁÁÁÁ! Megtámadtak! Segítség! + .a13 = Segítség! Megtámadtak minket! + .a14 = Segítség! Gyilkos! + .a15 = Segítség! Elszabadult egy gyilkos! + .a16 = Segítség! Meg akarnak ölni! + .a17 = Őrség, Megtámadtak! + .a18 = Őrség! Megtámadtak! + .a19 = Megtámadtak! Őrség! + .a20 = Segítség! Őrség! Megtámadtak! + .a21 = Őrség! Gyertek gyorsan! + .a22 = Őrség! Őrség! + .a23 = Őrség! Egy gazember megtámadott! + .a24 = Őrség, aprítsátok fel ezt az alávaló gazembert! + .a25 = Őrség! Itt egy gyilkos! + .a26 = Őrség! Segítsetek! + .a27 = Ezt nem úszod meg szárazon! Őrség! + .a28 = Te senkiházi! + .a29 = Valaki segítsen!! + .a30 = Segítsetek! Kérlek! + .a31 = Aúú! Őrség! Segítség! + .a32 = Engem akarnak! + .a33 = Segítség! Segítség! Valaki le akar gyűrni! + .a34 = Áá, most láthatjuk a rendszerrel járó erőszakot. + .a35 = Ez csak egy karcolás! + .a36 = Hagyd abba! + .a37 = Ártottam én neked valaha?! + .a38 = Kérlek ne bántalmazz tovább! + .a39 = Hé! Vigyázz, merre irányzod azt a dolgot! + .a40 = Takarodj innen, te mocskos gazember! + .a41 = Hagyd abba! Menj innen! + .a42 = Sikerült igencsak felbőszítened! + .a43 = Hé! Kinek képzeled magad?! + .a44 = Ezért a fejeddel fogsz fizetni! + .a45 = Hagyd abba, kérlek! Nincs nálam semmi értékes! + .a46 = Rád uszítom a bátyámat, ő nagyobb, mint én! + .a47 = Neee, megmondalak anyának! + .a48 = Légy átkozott! + .a49 = Kérlek ne tedd ezt! + .a50 = Ez nem volt szép tőled! + .a51 = Hatásos a fegyvered, most már igazán elrakhatnád! + .a52 = Könyörülj rajtam! + .a53 = Kérlek, családom van! + .a54 = Még túl fiatal vagyok a halálhoz! + .a55 = Nem tudnánk ezt megbeszélni? + .a56 = Az erőszak nem megoldás! + .a57 = Úgy látszik igencsak pocsék nap ez a mai... + .a58 = Hé, ez fáj! + .a59 = Ííí! + .a60 = Milyen durva vagy! + .a61 = Könyörögve kérlek, hagyd abba! + .a62 = A fene vigyen el! + .a63 = Ez nem vicces! + .a64 = Hogy merészeled?! + .a65 = Ezért megfizetsz! + .a66 = Nagyon meg fogod bánni, ha ezt tovább folytatod! + .a67 = Ne akard, hogy bántsalak! + .a68 = Itt valami félreértés lesz! + .a69 = Erre nincs semmi szükség! + .a70 = Takarodj, te pokolfajzat! + .a71 = Ez nagyon fáj! + .a72 = Miért tennél ilyet?! + .a73 = A szellemekre, hagyd abba! + .a74 = Biztos keversz engem valakivel! + .a75 = Én nem ezt érdemlem! + .a76 = Ezt kérlek ne! + .a77 = Őrség, dobjátok ezt a szörnyeteget a tóba! + .a78 = Rád uszítom a taraszkomat! + .a79 = Mért éééééén? +npc-speech-villager_enemy_killed = + .a0 = Eltiportam az ellenségemet! + .a1 = Végre ismét békességben! + .a2 = ...no, hol is tartottam? \ No newline at end of file diff --git a/assets/voxygen/i18n/hu_HU/npc.ron b/assets/voxygen/i18n/hu_HU/npc.ron deleted file mode 100644 index 0a487b19dc..0000000000 --- a/assets/voxygen/i18n/hu_HU/npc.ron +++ /dev/null @@ -1,183 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Hungarian -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "Csodás napunk van, nemde?", - "Hogy vagy?", - "Áldott jó reggelt kívánok!", - "Vajon mire gondol a Catoblepas, miközben legelészik?", - "Mit szólsz ehhez az időjáráshoz?", - "Akárhányszor azokra a kazamatákre gondolok elfog a félelem. Remélem valaki majd megtisztítja őket...", - "Majd szeretnék elmenni barlangászni, amikor már erősebb leszek.", - "Nem láttad a macskámat?", - "Hallottál már a veszedelmes földi cápákról? Úgy tudom a sivatagokban élnek.", - "Azt mondják a barlangok tele vannak mindenféle fényes drágakővel.", - "Megőrülök a sajtért!", - "Nem nézel be hozzánk? Épp most terveztünk nekiállni sajtozni!", - "Azt mondják a gomba jót tesz az egészségednek. Én magam nem szoktam enni.", - "A kekszeket ne feledd!", - "Egyszerűen rajongok a törpe sajtért. Bárcsak én is el tudnám készíteni...", - "Mi lehet vajon a hegyen túl?", - "Remélem egyszer majd elkészíthetem a saját sárkányrepülőmet.", - "Szeretnéd látni a kertem? Hát jó, talán majd máskor.", - "Kitűnő nap ez a mai egy jó erdei sétához!", - "Lenni, vagy nem lenni? Én azt hiszem farmer leszek.", - "Hát nem a mi városkánk a legjobb?", - "Szerinted mitől ragyognak a ragyogó maradványok?", - "Azt hiszem eljött a második reggeli ideje!", - "Fogtál már szentjánosbogarat?", - "Egyszerűen képtelen vagyok rájönni, hogy ugyan honnan jönnek ezek a Saurokok...", - "Bárcsak távol tartaná valaki a farkasokat a városkától...", - "Csodás, sajtos álomban volt tegnap este részem. Mit jelenthet ez vajon?", - "Hagytam egy kis sajtot az öcsémnél. Nem tudom, hogy megvan-e még. Úgy hívom, hogy Schrödinger sajtja.", - "Hagytam egy kis sajtot a húgomnál. Nem tudom, hogy megvan-e még. Úgy hívom, hogy Schrödinger sajtja.", - "Valaki igazán kezdhetne már valamit ezekkel a kultistákkal! Valaki rajtam kívül...", - "Remélem jön némi eső hamarosan, jót tenne a terménynek.", - "Imádom a mézet... és utálom a méheket.", - "Egy napon majd szeretnék világot látni. Csak tartogat nekem valamit az élet ezen a városkán kívül is.", - ], - "npc.speech.villager_decline_trade": [ - "Sajnálom, én nem tudok mit áruba bocsájtani.", - "Üzletelni? Velem? Mintha lenne bármim, ami fel tudná kelteni az érdeklődésedet...", - "A ház az enyém! Nem fogom elcserélni semmiért!", - ], - "npc.speech.merchant_advertisement": [ - "Ajánlhatok személyemben egy kereskedőpartnert?", - "Szeretnél velem üzletelni?", - "Rengeteg árum van, szeretnél vetni rájuk egy pillantást?" - ], - "npc.speech.merchant_busy": [ - "Hé, várd ki a sorod!", - "Várj egy kicsit légyszíves, belőlem is csak egy van.", - "Látod ezt a másik embert előtted?", - "Egy pillanat, hadd fejezzem be!", - "Ne vágj be mások elé!", - "Most épp nem érek rá, gyere vissza később!" - ], - "npc.speech.merchant_trade_successful": [ - "Köszönöm, hogy velem üzleteltél!", - "Hálás köszönet!", - ], - "npc.speech.merchant_trade_declined": [ - "Talán majd máskor. Legyen szép napod!", - "Kár, majd talán legközelebb!" - ], - "npc.speech.villager_cultist_alarm": [ - "Vigyázat! Elszabadult egy kultista!", - "Fegyverbe! Támadnak a kultisták!", - "Hogy merik a kultisták megtámadni a mi városkánkat?!", - "Halál a kultistákra!", - "Itt nem tűrünk meg egy kultistát sem!", - "Te véres kultista!", - "Ízleld meg a kardom élét, mocskos kultista!", - "Semmi nem moshatja le a vért a kezedről, kultista!", - "Millió mérgező mályvaszín medúza! Egy kultista van köztünk!", - "A kultisták gonoszkodásainak hamarosan vége!", - "Ez a kultista az enyém!", - "Ideje, hogy találkozz a teremtőddel, aljas kultista!", - "Itt egy kultista! Kapjuk el!", - "Itt egy kultista! Támadás!", - "Itt egy kultista! Ne hagyjuk megszökni!", - "Nem óhajt kultista őméltósága egy kis HALÁLT?!", - "Nincs bocsánat! Nincs feledés! Kultisták, bűnhődjetek!", - "Pusztulj, kultista!", - "Egyszer véget ér a rémuralmatok!", - "Ezt azt eddigi tetteitekért!", - "Nem látjuk szívesen a fajtátokat errefelé!", - "Maradtatok volna a föld alatt!", - ], - "npc.speech.villager_under_attack": [ - "Segítség, Megtámadtak!", - "Segítség, Megtámadtak!", - "Aúú! Megtámadtak!!", - "Aúú! Megtámadtak! Segítség!", - "Segítsetek! Megtámadtak!", - "Megtámadtak! Segítség!", - "Megtámadtak! Segítsetek!", - "Segítség!", - "Segítség! Segítség!", - "Segítség! Segítség! Segítség!", - "Megtámadtak!", - "ÁÁÁÁÁÁ! Megtámadtak!", - "ÁÁÁÁÁÁ! Megtámadtak! Segítség!", - "Segítség! Megtámadtak minket!", - "Segítség! Gyilkos!", - "Segítség! Elszabadult egy gyilkos!", - "Segítség! Meg akarnak ölni!", - "Őrség, Megtámadtak!", - "Őrség! Megtámadtak!", - "Megtámadtak! Őrség!", - "Segítség! Őrség! Megtámadtak!", - "Őrség! Gyertek gyorsan!", - "Őrség! Őrség!", - "Őrség! Egy gazember megtámadott!", - "Őrség, aprítsátok fel ezt az alávaló gazembert!", - "Őrség! Itt egy gyilkos!", - "Őrség! Segítsetek!", - "Ezt nem úszod meg szárazon! Őrség!", - "Te senkiházi!", - "Valaki segítsen!!", - "Segítsetek! Kérlek!", - "Aúú! Őrség! Segítség!", - "Engem akarnak!", - "Segítség! Segítség! Valaki le akar gyűrni!", - "Áá, most láthatjuk a rendszerrel járó erőszakot.", - "Ez csak egy karcolás!", - "Hagyd abba!", - "Ártottam én neked valaha?!", - "Kérlek ne bántalmazz tovább!", - "Hé! Vigyázz, merre irányzod azt a dolgot!", - "Takarodj innen, te mocskos gazember!", - "Hagyd abba! Menj innen!", - "Sikerült igencsak felbőszítened!", - "Hé! Kinek képzeled magad?!", - "Ezért a fejeddel fogsz fizetni!", - "Hagyd abba, kérlek! Nincs nálam semmi értékes!", - "Rád uszítom a bátyámat, ő nagyobb, mint én!", - "Neee, megmondalak anyának!", - "Légy átkozott!", - "Kérlek ne tedd ezt!", - "Ez nem volt szép tőled!", - "Hatásos a fegyvered, most már igazán elrakhatnád!", - "Könyörülj rajtam!", - "Kérlek, családom van!", - "Még túl fiatal vagyok a halálhoz!", - "Nem tudnánk ezt megbeszélni?", - "Az erőszak nem megoldás!", - "Úgy látszik igencsak pocsék nap ez a mai...", - "Hé, ez fáj!", - "Ííí!", - "Milyen durva vagy!", - "Könyörögve kérlek, hagyd abba!", - "A fene vigyen el!", - "Ez nem vicces!", - "Hogy merészeled?!", - "Ezért megfizetsz!", - "Nagyon meg fogod bánni, ha ezt tovább folytatod!", - "Ne akard, hogy bántsalak!", - "Itt valami félreértés lesz!", - "Erre nincs semmi szükség!", - "Takarodj, te pokolfajzat!", - "Ez nagyon fáj!", - "Miért tennél ilyet?!", - "A szellemekre, hagyd abba!", - "Biztos keversz engem valakivel!", - "Én nem ezt érdemlem!", - "Ezt kérlek ne!", - "Őrség, dobjátok ezt a szörnyeteget a tóba!", - "Rád uszítom a taraszkomat!", - "Mért éééééén?", - ], - "npc.speech.villager_enemy_killed": [ - "Eltiportam az ellenségemet!", - "Végre ismét békességben!", - "...no, hol is tartottam?", - ] - } -) diff --git a/assets/voxygen/i18n/it_IT/buff.ftl b/assets/voxygen/i18n/it_IT/buff.ftl new file mode 100644 index 0000000000..4fed1687b0 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Clicca per rimuovere +buff-title-missing = Titolo Mancante +buff-desc-missing = Descrizione Mancante +buff-title-heal = Cura +buff-desc-heal = Guadagna vita nel tempo. +buff-title-potion = Pozione +buff-desc-potion = Bevendo... +buff-title-saturation = Saturazione +buff-desc-saturation = Guadagna vita nel tempo dai consumabili. +buff-title-campfire_heal = Cura del Falò +buff-desc-campfire_heal = Riposarsi ad un falò cura del { $rate }% al secondo. +buff-title-invulnerability = Invulnerabilità +buff-desc-invulnerability = Non puoi essere danneggiato da nessun attacco. +buff-title-protectingward = Barriera Protettiva +buff-desc-protectingward = Sei un po' protetto dagli attacchi. +buff-title-frenzied = Frenetico +buff-desc-frenzied = Sei imbevuto con velocità innaturale e puoi ignorare ferite minori. +buff-title-hastened = Rapido +buff-desc-hastened = I tuoi movimenti e i tuoi attachi sono più veloci. +buff-title-bleed = Sanguinante +buff-desc-bleed = Infligge danno regolare. +buff-title-cursed = Maledetto +buff-desc-cursed = Sei maledetto. +buff-title-burn = A Fuoco +buff-desc-burn = Stai bruciando vivo +buff-title-crippled = Storpio +buff-desc-crippled = Il tuo movimento è storpio dal momento che le tue gambe sono gravemente ferite. +buff-title-frozen = Congelato +buff-desc-frozen = I tuoi movimenti e i tuoi attacchi sono rallentati. +buff-title-wet = bagnato +buff-desc-wet = Il terreno rifiuta i tuoi piedi, rendendoti difficile fermarsi. +buff-title-ensnared = Intrappolato +buff-desc-ensnared = Liane si attorcigliano intorno alle tue gambe, impedendo il tuo movimento. +buff-stat-health = Rigenera { $str_total } di Salute +buff-stat-increase_max_energy = Aumenta l'Energia Massima di { $strength } +buff-stat-increase_max_health = Aumenta la Salute Massima di { $strength } +buff-stat-invulnerability = Dona invulnerabilità +buff-text-over_seconds = nella durata di { $dur_secs } secondi +buff-text-for_seconds = per { $dur_secs } secondi \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/buff.ron b/assets/voxygen/i18n/it_IT/buff.ron deleted file mode 100644 index d7c141a820..0000000000 --- a/assets/voxygen/i18n/it_IT/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - // Buffs - "buff.remove": "Clicca per rimuovere", - "buff.title.missing": "Titolo Mancante", - "buff.desc.missing": "Descrizione Mancante", - "buff.title.heal": "Cura", - "buff.desc.heal": "Guadagna vita nel tempo.", - "buff.title.potion": "Pozione", - "buff.desc.potion": "Bevendo...", - "buff.title.saturation": "Saturazione", - "buff.desc.saturation": "Guadagna vita nel tempo dai consumabili.", - "buff.title.campfire_heal": "Cura del Falò", - "buff.desc.campfire_heal": "Riposarsi ad un falò cura del {rate}% al secondo.", - "buff.title.invulnerability": "Invulnerabilità", - "buff.desc.invulnerability": "Non puoi essere danneggiato da nessun attacco.", - "buff.title.protectingward": "Barriera Protettiva", - "buff.desc.protectingward": "Sei un po' protetto dagli attacchi.", - "buff.title.frenzied": "Frenetico", - "buff.desc.frenzied": "Sei imbevuto con velocità innaturale e puoi ignorare ferite minori.", - "buff.title.hastened": "Rapido", - "buff.desc.hastened": "I tuoi movimenti e i tuoi attachi sono più veloci.", - // Debuffs - "buff.title.bleed": "Sanguinante", - "buff.desc.bleed": "Infligge danno regolare.", - "buff.title.cursed": "Maledetto", - "buff.desc.cursed": "Sei maledetto.", - "buff.title.burn": "A Fuoco", - "buff.desc.burn": "Stai bruciando vivo", - "buff.title.crippled": "Storpio", - "buff.desc.crippled": "Il tuo movimento è storpio dal momento che le tue gambe sono gravemente ferite.", - "buff.title.frozen": "Congelato", - "buff.desc.frozen": "I tuoi movimenti e i tuoi attacchi sono rallentati.", - "buff.title.wet": "bagnato", - "buff.desc.wet": "Il terreno rifiuta i tuoi piedi, rendendoti difficile fermarsi.", - "buff.title.ensnared": "Intrappolato", - "buff.desc.ensnared": "Liane si attorcigliano intorno alle tue gambe, impedendo il tuo movimento.", - // Buffs stats - "buff.stat.health": "Rigenera {str_total} di Salute", - "buff.stat.increase_max_energy": "Aumenta l'Energia Massima di {strength}", - "buff.stat.increase_max_health": "Aumenta la Salute Massima di {strength}", - "buff.stat.invulnerability": "Dona invulnerabilità", - // Text - "buff.text.over_seconds": "nella durata di {dur_secs} secondi", - "buff.text.for_seconds": "per {dur_secs} secondi", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/char_selection.ftl b/assets/voxygen/i18n/it_IT/char_selection.ftl new file mode 100644 index 0000000000..723af77c6b --- /dev/null +++ b/assets/voxygen/i18n/it_IT/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Caricamento Personaggi... +char_selection-delete_permanently = Eliminare permanentemente questo Personaggio? +char_selection-deleting_character = Eliminazione Personaggio... +char_selection-change_server = Cambia Server +char_selection-enter_world = Entra nel Mondo +char_selection-logout = Disconnettiti +char_selection-create_new_character = Crea Nuovo Personaggio +char_selection-creating_character = Creazione Personaggio... +char_selection-character_creation = Creazione Personaggio +char_selection-human_default = Umano Default +char_selection-level_fmt = Livello { $level_nb } +char_selection-uncanny_valley = Regiona Selvaggia +char_selection-plains_of_uncertainty = Pianure della Incertezza +char_selection-beard = Barba +char_selection-hair_style = Stile Capelli +char_selection-hair_color = Colore Capelli +char_selection-eye_color = Colore Occhi +char_selection-skin = Pelle +char_selection-eyeshape = Dettagli Occhi +char_selection-accessories = Accessori +char_selection-create_info_name = Il tuo Personaggio ha bisogno di un nome! +char_selection-version_mismatch = ATTENZIONE! Questo server sta usando una versione differente, possibilmente incompatibile, di gioco. Per favore aggiorna la tua versione. \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/char_selection.ron b/assets/voxygen/i18n/it_IT/char_selection.ron deleted file mode 100644 index 5cba584080..0000000000 --- a/assets/voxygen/i18n/it_IT/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "char_selection.loading_characters": "Caricamento Personaggi...", - "char_selection.delete_permanently": "Eliminare permanentemente questo Personaggio?", - "char_selection.deleting_character": "Eliminazione Personaggio...", - "char_selection.change_server": "Cambia Server", - "char_selection.enter_world": "Entra nel Mondo", - "char_selection.logout": "Disconnettiti", - "char_selection.create_new_character": "Crea Nuovo Personaggio", - "char_selection.creating_character": "Creazione Personaggio...", - "char_selection.character_creation": "Creazione Personaggio", - "char_selection.human_default": "Umano Default", - "char_selection.level_fmt": "Livello {level_nb}", - "char_selection.uncanny_valley": "Regiona Selvaggia", - "char_selection.plains_of_uncertainty": "Pianure della Incertezza", - "char_selection.beard": "Barba", - "char_selection.hair_style": "Stile Capelli", - "char_selection.hair_color": "Colore Capelli", - "char_selection.eye_color": "Colore Occhi", - "char_selection.skin": "Pelle", - "char_selection.eyeshape": "Dettagli Occhi", - "char_selection.accessories": "Accessori", - "char_selection.create_info_name": "Il tuo Personaggio ha bisogno di un nome!", - "char_selection.version_mismatch": "ATTENZIONE! Questo server sta usando una versione differente, possibilmente incompatibile, di gioco. Per favore aggiorna la tua versione." - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/common.ftl b/assets/voxygen/i18n/it_IT/common.ftl new file mode 100644 index 0000000000..2371d20bd5 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/common.ftl @@ -0,0 +1,104 @@ +common-username = Nome Utente +common-singleplayer = Giocatore Singolo +common-multiplayer = Multigiocatore +common-servers = Server +common-quit = Esci +common-settings = Impostazioni +common-languages = Lingue +common-interface = Interfaccia +common-gameplay = Gameplay +common-controls = Controlli +common-video = Grafica +common-sound = Audio +common-chat = Chat +common-resume = Riprendi +common-characters = Personaggi +common-close = Chiudi +common-yes = Si +common-no = No +common-back = Indietro +common-create = Crea +common-okay = Okay +common-add = Aggiungi +common-accept = Accetta +common-decline = Declina +common-disclaimer = Disclaimer +common-cancel = Cancella +common-none = Nessuno +common-error = Errore +common-fatal_error = Errore Fatale +common-you = Tu +common-automatic = Auto +common-random = Random +common-empty = Vuoto +common-confirm = Conferma +common-delete_server = Elimina Server +common-interface_settings = Impostazioni Interfaccia +common-gameplay_settings = Impostazioni Gameplay +common-controls_settings = Impostazioni Controlli +common-video_settings = Impostazioni Grafica +common-sound_settings = Impostazioni Audio +common-language_settings = Impostazioni Lingua +common-chat_settings = Impostazioni Chat +common-connection_lost = + Connessione persa! + Il server si è riavviato? + Il client è aggiornato? +common-species-orc = Orco +common-species-human = Umano +common-species-dwarf = Nano +common-species-elf = Elfo +common-species-draugr = Non-Morto +common-species-danari = Danari +common-weapons-axe = Ascia +common-weapons-dagger = Pugnale +common-weapons-greatsword = Spadone +common-weapons-shortsword = Spada Corta +common-weapons-sword = Spada +common-weapons-staff = Staffa del Fuoco +common-weapons-bow = Arco +common-weapons-hammer = Martello +common-weapons-general = Combattimento Generale +common-weapons-sceptre = Scettro Curativo +common-weapons-shield = Scudo +common-weapons-spear = Lancia +common-weapons-hammer_simple = Martello Semplice +common-weapons-sword_simple = Spada Semplice +common-weapons-staff_simple = Staffa Semplice +common-weapons-axe_simple = Ascia Semplice +common-weapons-bow_simple = Arco Semplice +common-weapons-unique = Unico +common-tool-debug = Debug +common-tool-farming = Strumento Agricolo +common-tool-pick = Piccone +common-tool-mining = Estrazione Mineraria +common-kind-modular_component = Componente Modulare +common-kind-glider = Aliante +common-kind-consumable = Consumabile +common-kind-throwable = Può essere lanciato +common-kind-utility = Utilità +common-kind-ingredient = Ingrediente +common-kind-lantern = Lanterna +common-hands-one = A una mano +common-hands-two = A due mani +common-rand_appearance = Aspetto Random +common-rand_name = Nome Random +common-stats-combat_rating = CR +common-stats-power = Potere +common-stats-speed = Velocità +common-stats-poise = Equilibrio +common-stats-crit_chance = Probabilità di Critico +common-stats-crit_mult = Moltiplicatore del Critico +common-stats-armor = Armatura +common-stats-poise_res = Resistenza allo Stordimento +common-stats-energy_max = Energia Massima +common-stats-energy_reward = Ricompensa d'energia +common-stats-crit_power = Potere del Critico +common-stats-stealth = Furtività +common-stats-slots = Slot +common-material-metal = Metallo +common-material-wood = Legno +common-material-stone = Pietra +common-material-cloth = Tessuto +common-material-hide = Pelle +common-sprite-chest = Cassa \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/common.ron b/assets/voxygen/i18n/it_IT/common.ron deleted file mode 100644 index b2e7f64ede..0000000000 --- a/assets/voxygen/i18n/it_IT/common.ron +++ /dev/null @@ -1,126 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Nome Utente", - "common.singleplayer": "Giocatore Singolo", - "common.multiplayer": "Multigiocatore", - "common.servers": "Server", - "common.quit": "Esci", - "common.settings": "Impostazioni", - "common.languages": "Lingue", - "common.interface": "Interfaccia", - "common.gameplay": "Gameplay", - "common.controls": "Controlli", - "common.video": "Grafica", - "common.sound": "Audio", - "common.chat": "Chat", - "common.resume": "Riprendi", - "common.characters": "Personaggi", - "common.close": "Chiudi", - "common.yes": "Si", - "common.no": "No", - "common.back": "Indietro", - "common.create": "Crea", - "common.okay": "Okay", - "common.add": "Aggiungi", - "common.accept": "Accetta", - "common.decline": "Declina", - "common.disclaimer": "Disclaimer", - "common.cancel": "Cancella", - "common.none": "Nessuno", - "common.error": "Errore", - "common.fatal_error": "Errore Fatale", - "common.you": "Tu", - "common.automatic": "Auto", - "common.random": "Random", - "common.empty": "Vuoto", - "common.confirm": "Conferma", - "common.delete_server": "Elimina Server", - - // Settings Window title - "common.interface_settings": "Impostazioni Interfaccia", - "common.gameplay_settings": "Impostazioni Gameplay", - "common.controls_settings": "Impostazioni Controlli", - "common.video_settings": "Impostazioni Grafica", - "common.sound_settings": "Impostazioni Audio", - "common.language_settings": "Impostazioni Lingua", - "common.chat_settings": "Impostazioni Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"Connessione persa! -Il server si è riavviato? -Il client è aggiornato?"#, - - - "common.species.orc": "Orco", - "common.species.human": "Umano", - "common.species.dwarf": "Nano", - "common.species.elf": "Elfo", - "common.species.draugr": "Non-Morto", - "common.species.danari": "Danari", - - "common.weapons.axe": "Ascia", - "common.weapons.dagger": "Pugnale", - "common.weapons.greatsword": "Spadone", - "common.weapons.shortsword": "Spada Corta", - "common.weapons.sword": "Spada", - "common.weapons.staff": "Staffa del Fuoco", - "common.weapons.bow": "Arco", - "common.weapons.hammer": "Martello", - "common.weapons.general": "Combattimento Generale", - "common.weapons.sceptre": "Scettro Curativo", - "common.weapons.shield": "Scudo", - "common.weapons.spear": "Lancia", - "common.weapons.hammer_simple": "Martello Semplice", - "common.weapons.sword_simple": "Spada Semplice", - "common.weapons.staff_simple": "Staffa Semplice", - "common.weapons.axe_simple": "Ascia Semplice", - "common.weapons.bow_simple": "Arco Semplice", - "common.weapons.unique": "Unico", - "common.tool.debug": "Debug", - "common.tool.farming": "Strumento Agricolo", - "common.tool.pick": "Piccone", - "common.tool.mining": "Estrazione Mineraria", - "common.kind.modular_component": "Componente Modulare", - "common.kind.glider": "Aliante", - "common.kind.consumable": "Consumabile", - "common.kind.throwable": "Può essere lanciato", - "common.kind.utility": "Utilità", - "common.kind.ingredient": "Ingrediente", - "common.kind.lantern": "Lanterna", - "common.hands.one": "A una mano", - "common.hands.two": "A due mani", - - "common.rand_appearance": "Aspetto Random", - "common.rand_name": "Nome Random", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Potere", - "common.stats.speed": "Velocità", - "common.stats.poise": "Equilibrio", - "common.stats.crit_chance": "Probabilità di Critico", - "common.stats.crit_mult": "Moltiplicatore del Critico", - "common.stats.armor": "Armatura", - "common.stats.poise_res":"Resistenza allo Stordimento", - "common.stats.energy_max": "Energia Massima", - "common.stats.energy_reward": "Ricompensa d'energia", - "common.stats.crit_power": "Potere del Critico", - "common.stats.stealth": "Furtività", - "common.stats.slots": "Slot", - - "common.material.metal": "Metallo", - "common.material.wood": "Legno", - "common.material.stone": "Pietra", - "common.material.cloth": "Tessuto", - "common.material.hide": "Pelle", - - "common.sprite.chest": "Cassa", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/esc_menu.ftl b/assets/voxygen/i18n/it_IT/esc_menu.ftl new file mode 100644 index 0000000000..50e055f685 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Disconnettiti +esc_menu-quit_game = Esci dal Gioco \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/esc_menu.ron b/assets/voxygen/i18n/it_IT/esc_menu.ron deleted file mode 100644 index 42e6c8b936..0000000000 --- a/assets/voxygen/i18n/it_IT/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "esc_menu.logout": "Disconnettiti", - "esc_menu.quit_game": "Esci dal Gioco", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/gameinput.ftl b/assets/voxygen/i18n/it_IT/gameinput.ftl new file mode 100644 index 0000000000..7323deb299 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Attacco Base +gameinput-secondary = Attacco Secondario +gameinput-block = Parata +gameinput-slot1 = Slot Rapido 1 +gameinput-slot2 = Slot Rapido 2 +gameinput-slot3 = Slot Rapido 3 +gameinput-slot4 = Slot Rapido 4 +gameinput-slot5 = Slot Rapido 5 +gameinput-slot6 = Slot Rapido 6 +gameinput-slot7 = Slot Rapido 7 +gameinput-slot8 = Slot Rapido 8 +gameinput-slot9 = Slot Rapido 9 +gameinput-slot10 = Slot Rapido 10 +gameinput-swaploadout = Cambia Equipaggiamento +gameinput-togglecursor = Attiva/Disattiva Cursore +gameinput-help = Attiva/Disattiva Finestra d'Aiuto +gameinput-toggleinterface = Attiva/Disattiva Interfaccia +gameinput-toggledebug = Attiva/Disattiva Info FPS e Debug +gameinput-toggle_egui_debug = Attiva/Disattiva le Info. di Debug EGUI +gameinput-togglechat = Attiva/Disattiva Chat +gameinput-screenshot = Cattura Schermata +gameinput-toggleingameui = Attiva/Disattiva le Nametag +gameinput-fullscreen = Attiva/Disattiva Schermo Intero +gameinput-moveforward = Movimento in Avanti +gameinput-moveleft = Movimento a Sinistra +gameinput-moveright = Movimento a Destra +gameinput-moveback = Movimento all'Indietro +gameinput-jump = Salto +gameinput-glide = Aliante +gameinput-roll = Rotolata +gameinput-climb = Arrampicata +gameinput-climbdown = Discesa +gameinput-wallleap = Salto dal Muro +gameinput-togglelantern = Attiva/Disattiva Lanterna +gameinput-mount = Cavalcatura +gameinput-chat = Chat +gameinput-command = Comando +gameinput-escape = Esci +gameinput-map = Mappa +gameinput-bag = Borsa +gameinput-trade = Commercio +gameinput-social = Social +gameinput-sit = Sedersi +gameinput-spellbook = Incantesimi +gameinput-settings = Impostazioni +gameinput-respawn = Rinascita +gameinput-charge = Carica +gameinput-togglewield = Impugna/Rinfodera +gameinput-interact = Interagisci +gameinput-freelook = Visuale Libera +gameinput-autowalk = Camminata/Nuoto Automatico +gameinput-cameraclamp = Morsetto della Camera +gameinput-dance = Ballo +gameinput-select = Seleziona Entità +gameinput-acceptgroupinvite = Accetta l'Invito al Gruppo +gameinput-declinegroupinvite = Declina l'Invito al Gruppo +gameinput-cyclecamera = Cambia Camera +gameinput-crafting = Creazione +gameinput-fly = Volo +gameinput-sneak = Sii Furtivo +gameinput-swimdown = Nuota verso il basso +gameinput-swimup = Nuota verso l'alto +gameinput-mapzoomin = Aumenta lo zoom della mappa +gameinput-mapzoomout = Diminuisci lo zoom della mappa +gameinput-greet = Saluta +gameinput-map-locationmarkerbutton = Imposta una coordinata sulla Mappa \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/gameinput.ron b/assets/voxygen/i18n/it_IT/gameinput.ron deleted file mode 100644 index 0e7260de1e..0000000000 --- a/assets/voxygen/i18n/it_IT/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "gameinput.primary": "Attacco Base", - "gameinput.secondary": "Attacco Secondario", - "gameinput.block": "Parata", - "gameinput.slot1": "Slot Rapido 1", - "gameinput.slot2": "Slot Rapido 2", - "gameinput.slot3": "Slot Rapido 3", - "gameinput.slot4": "Slot Rapido 4", - "gameinput.slot5": "Slot Rapido 5", - "gameinput.slot6": "Slot Rapido 6", - "gameinput.slot7": "Slot Rapido 7", - "gameinput.slot8": "Slot Rapido 8", - "gameinput.slot9": "Slot Rapido 9", - "gameinput.slot10": "Slot Rapido 10", - "gameinput.swaploadout": "Cambia Equipaggiamento", - "gameinput.togglecursor": "Attiva/Disattiva Cursore", - "gameinput.help": "Attiva/Disattiva Finestra d'Aiuto", - "gameinput.toggleinterface": "Attiva/Disattiva Interfaccia", - "gameinput.toggledebug": "Attiva/Disattiva Info FPS e Debug", - "gameinput.toggle_egui_debug": "Attiva/Disattiva le Info. di Debug EGUI", - "gameinput.togglechat": "Attiva/Disattiva Chat", - "gameinput.screenshot": "Cattura Schermata", - "gameinput.toggleingameui": "Attiva/Disattiva le Nametag", - "gameinput.fullscreen": "Attiva/Disattiva Schermo Intero", - "gameinput.moveforward": "Movimento in Avanti", - "gameinput.moveleft": "Movimento a Sinistra", - "gameinput.moveright": "Movimento a Destra", - "gameinput.moveback": "Movimento all'Indietro", - "gameinput.jump": "Salto", - "gameinput.glide": "Aliante", - "gameinput.roll": "Rotolata", - "gameinput.climb": "Arrampicata", - "gameinput.climbdown": "Discesa", - "gameinput.wallleap": "Salto dal Muro", - "gameinput.togglelantern": "Attiva/Disattiva Lanterna", - "gameinput.mount": "Cavalcatura", - "gameinput.chat": "Chat", - "gameinput.command": "Comando", - "gameinput.escape": "Esci", - "gameinput.map": "Mappa", - "gameinput.bag": "Borsa", - "gameinput.trade": "Commercio", - "gameinput.social": "Social", - "gameinput.sit": "Sedersi", - "gameinput.spellbook": "Incantesimi", - "gameinput.settings": "Impostazioni", - "gameinput.respawn": "Rinascita", - "gameinput.charge": "Carica", - "gameinput.togglewield": "Impugna/Rinfodera", - "gameinput.interact": "Interagisci", - "gameinput.freelook": "Visuale Libera", - "gameinput.autowalk": "Camminata/Nuoto Automatico", - "gameinput.cameraclamp": "Morsetto della Camera", - "gameinput.dance": "Ballo", - "gameinput.select": "Seleziona Entità", - "gameinput.acceptgroupinvite": "Accetta l'Invito al Gruppo", - "gameinput.declinegroupinvite": "Declina l'Invito al Gruppo", - "gameinput.cyclecamera": "Cambia Camera", - "gameinput.crafting": "Creazione", - "gameinput.fly": "Volo", - "gameinput.sneak": "Sii Furtivo", - "gameinput.swimdown": "Nuota verso il basso", - "gameinput.swimup": "Nuota verso l'alto", - "gameinput.mapzoomin": "Aumenta lo zoom della mappa", - "gameinput.mapzoomout": "Diminuisci lo zoom della mappa", - "gameinput.greet": "Saluta", - "gameinput.map.locationmarkerbutton": "Imposta una coordinata sulla Mappa" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/bag.ftl b/assets/voxygen/i18n/it_IT/hud/bag.ftl new file mode 100644 index 0000000000..2f25a925f4 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Inventario di { $playername } +hud-bag-stats_title = Statistiche di { $playername } +hud-bag-exp = Esp +hud-bag-armor = Armatura +hud-bag-stats = Statistiche +hud-bag-head = Testa +hud-bag-neck = Collo +hud-bag-tabard = Tabarda +hud-bag-shoulders = Spalle +hud-bag-chest = Torso +hud-bag-hands = Mani +hud-bag-lantern = Lanterna +hud-bag-glider = Aliante +hud-bag-belt = Cintura +hud-bag-ring = Anello +hud-bag-back = Schiena +hud-bag-legs = Gambe +hud-bag-feet = Piedi +hud-bag-mainhand = Mano Principale +hud-bag-offhand = Mano Secondaria +hud-bag-inactive_mainhand = Mano Principale Inattiva +hud-bag-inactive_offhand = Mano Secondaria Inattiva +hud-bag-swap_equipped_weapons_title = Scambia le Armi Equipaggiate +hud-bag-swap_equipped_weapons_desc = Premi { $key } +hud-bag-bag = Borsa +hud-bag-health = Salute +hud-bag-energy = Energia +hud-bag-combat_rating = Grado di Combattimento +hud-bag-protection = Protezione +hud-bag-stun_res = Resilienza allo Stordimento +hud-bag-combat_rating_desc = + Calcolata dal tuo + equipaggiamento e dalla tua salute. +hud-bag-protection_desc = Riduzione danno tramite armatura +hud-bag-stun_res_desc = + Resilienza contro l'essere stordito da colpi consecutivi. + Si rigenera come la Stamina. +hud-bag-sort_by_name = Ordina per Nome +hud-bag-sort_by_quality = Ordina per Qualità +hud-bag-sort_by_category = Ordina per Categoria \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/bag.ron b/assets/voxygen/i18n/it_IT/hud/bag.ron deleted file mode 100644 index 76aba4cd09..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - // Inventory - "hud.bag.inventory": "Inventario di {playername}", - "hud.bag.stats_title": "Statistiche di {playername}", - "hud.bag.exp": "Esp", - "hud.bag.armor": "Armatura", - "hud.bag.stats": "Statistiche", - "hud.bag.head": "Testa", - "hud.bag.neck": "Collo", - "hud.bag.tabard": "Tabarda", - "hud.bag.shoulders": "Spalle", - "hud.bag.chest": "Torso", - "hud.bag.hands": "Mani", - "hud.bag.lantern": "Lanterna", - "hud.bag.glider": "Aliante", - "hud.bag.belt": "Cintura", - "hud.bag.ring": "Anello", - "hud.bag.back": "Schiena", - "hud.bag.legs": "Gambe", - "hud.bag.feet": "Piedi", - "hud.bag.mainhand": "Mano Principale", - "hud.bag.offhand": "Mano Secondaria", - "hud.bag.inactive_mainhand": "Mano Principale Inattiva", - "hud.bag.inactive_offhand": "Mano Secondaria Inattiva", - "hud.bag.swap_equipped_weapons_title": "Scambia le Armi Equipaggiate", - "hud.bag.swap_equipped_weapons_desc": "Premi {key}", - "hud.bag.bag": "Borsa", - "hud.bag.health": "Salute", - "hud.bag.energy": "Energia", - "hud.bag.combat_rating": "Grado di Combattimento", - "hud.bag.protection": "Protezione", - "hud.bag.stun_res": "Resilienza allo Stordimento", - "hud.bag.combat_rating_desc": "Calcolata dal tuo\nequipaggiamento e dalla tua salute.", - "hud.bag.protection_desc": "Riduzione danno tramite armatura", - "hud.bag.stun_res_desc": "Resilienza contro l'essere stordito da colpi consecutivi.\nSi rigenera come la Stamina.", - "hud.bag.sort_by_name": "Ordina per Nome", - "hud.bag.sort_by_quality": "Ordina per Qualità", - "hud.bag.sort_by_category": "Ordina per Categoria", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/char_window.ftl b/assets/voxygen/i18n/it_IT/hud/char_window.ftl new file mode 100644 index 0000000000..88c54ad1f6 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Nome Personaggio +character_window-character_stats = + Resistenza + + Fitness + + Volontà + + Protezione \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/char_window.ron b/assets/voxygen/i18n/it_IT/hud/char_window.ron deleted file mode 100644 index 994112366c..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "character_window.character_name": "Nome Personaggio", - // Character stats - "character_window.character_stats": r#"Resistenza - -Fitness - -Volontà - -Protezione -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/chat.ftl b/assets/voxygen/i18n/it_IT/hud/chat.ftl new file mode 100644 index 0000000000..a28ae7245d --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Tutto +hud-chat-chat_tab_hover_tooltip = Click destro per le impostazioni +hud-outcome-burning = morto di: combustione +hud-outcome-curse = morto di: maledizione +hud-outcome-bleeding = morto di: sanguinamento +hud-outcome-crippled = morto di: storpiatura +hud-outcome-frozen = morto di: congelamento +hud-chat-online_msg = [{ $name }] è ora online +hud-chat-offline_msg = [{ $name }] è andato offline +hud-chat-default_death_msg = [{ $name }] è morto +hud-chat-environmental_kill_msg = [{ $name }] è morto in { $environment } +hud-chat-fall_kill_msg = [{ $name }] è morto per danno da caduta +hud-chat-suicide_msg = [{ $name }] è morto per ferite auto inflitte +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } per via di [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] ha sconfitto [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] ha assassinato [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] ha fatto esplodere [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] ha ucciso [{ $victim }] con la magia +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } per via di { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } ha ucciso [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } ha assassinato [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } ha fatto esplodere [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } ha ucciso [{ $victim }] con la magia +hud-chat-npc_other_kill_msg = { $attacker } ha ucciso [{ $victim }] +hud-chat-loot_msg = Hai raccolto [{ $item }] +hud-chat-loot_fail = Il tuo inventario è pieno! +hud-chat-goodbye = Arrivederci! +hud-chat-connection_lost = Connessione persa. Verrai cacciato tra { $time } secondi. \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/chat.ron b/assets/voxygen/i18n/it_IT/hud/chat.ron deleted file mode 100644 index 70b9a2aba0..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.chat.all": "Tutto", - "hud.chat.chat_tab_hover_tooltip": "Click destro per le impostazioni", - - // Debuff outcomes - "hud.outcome.burning": "morto di: combustione", - "hud.outcome.curse": "morto di: maledizione", - "hud.outcome.bleeding": "morto di: sanguinamento", - "hud.outcome.crippled": "morto di: storpiatura", - "hud.outcome.frozen": "morto di: congelamento", - - // Chat outputs - "hud.chat.online_msg": "[{name}] è ora online", - "hud.chat.offline_msg": "[{name}] è andato offline", - - "hud.chat.default_death_msg": "[{name}] è morto", - "hud.chat.environmental_kill_msg": "[{name}] è morto in {environment}", - "hud.chat.fall_kill_msg": "[{name}] è morto per danno da caduta", - "hud.chat.suicide_msg": "[{name}] è morto per ferite auto inflitte", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} per via di [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] ha sconfitto [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] ha assassinato [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] ha fatto esplodere [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] ha ucciso [{victim}] con la magia", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} per via di {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} ha ucciso [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} ha assassinato [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} ha fatto esplodere [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} ha ucciso [{victim}] con la magia", - "hud.chat.npc_other_kill_msg": "{attacker} ha ucciso [{victim}]", - - "hud.chat.loot_msg": "Hai raccolto [{item}]", - "hud.chat.loot_fail": "Il tuo inventario è pieno!", - "hud.chat.goodbye": "Arrivederci!", - "hud.chat.connection_lost": "Connessione persa. Verrai cacciato tra {time} secondi.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/crafting.ftl b/assets/voxygen/i18n/it_IT/hud/crafting.ftl new file mode 100644 index 0000000000..2f5c600f4e --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/crafting.ftl @@ -0,0 +1,33 @@ +hud-crafting = Creazione +hud-crafting-recipes = Ricette +hud-crafting-ingredients = Ingredienti: +hud-crafting-craft = Crea +hud-crafting-tool_cata = Richiede: +hud-crafting-req_crafting_station = Richiede: +hud-crafting-anvil = Incudine +hud-crafting-cauldron = Calderone +hud-crafting-cooking_pot = Pentola +hud-crafting-crafting_bench = Tavolo di Creazione +hud-crafting-forge = Forgia +hud-crafting-loom = Telaio +hud-crafting-spinning_wheel = Filatoio +hud-crafting-tanning_rack = Telaio per la Concia +hud-crafting-salvaging_station = Stazione di Recupero +hud-crafting-campfire = Falò +hud-crafting-tabs-all = Tutto +hud-crafting-tabs-armor = Armatura +hud-crafting-tabs-dismantle = Smantella +hud-crafting-tabs-food = Cibo +hud-crafting-tabs-glider = Alianti +hud-crafting-tabs-potion = Pozioni +hud-crafting-tabs-tool = Strumenti +hud-crafting-tabs-utility = Utilità +hud-crafting-tabs-weapon = Armi +hud-crafting-tabs-bag = Borse +hud-crafting-tabs-processed_material = Materiali +hud-crafting-dismantle_title = Smantellamento +hud-crafting-dismantle_explanation = + Passa il mouse sopra i tuoi oggetti nella borsa per vedere + cosa puoi recuperare. + + Fai Doppio Click per iniziare a smantellarlo. \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/crafting.ron b/assets/voxygen/i18n/it_IT/hud/crafting.ron deleted file mode 100644 index 0b90ac0c1d..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.crafting": "Creazione", - "hud.crafting.recipes": "Ricette", - "hud.crafting.ingredients": "Ingredienti:", - "hud.crafting.craft": "Crea", - "hud.crafting.tool_cata": "Richiede:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Richiede:", - "hud.crafting.anvil": "Incudine", - "hud.crafting.cauldron": "Calderone", - "hud.crafting.cooking_pot": "Pentola", - "hud.crafting.crafting_bench": "Tavolo di Creazione", - "hud.crafting.forge": "Forgia", - "hud.crafting.loom": "Telaio", - "hud.crafting.spinning_wheel": "Filatoio", - "hud.crafting.tanning_rack": "Telaio per la Concia", - "hud.crafting.salvaging_station": "Stazione di Recupero", - "hud.crafting.campfire": "Falò", - // Tabs - "hud.crafting.tabs.all": "Tutto", - "hud.crafting.tabs.armor": "Armatura", - "hud.crafting.tabs.dismantle": "Smantella", - "hud.crafting.tabs.food": "Cibo", - "hud.crafting.tabs.glider": "Alianti", - "hud.crafting.tabs.potion": "Pozioni", - "hud.crafting.tabs.tool": "Strumenti", - "hud.crafting.tabs.utility": "Utilità", - "hud.crafting.tabs.weapon": "Armi", - "hud.crafting.tabs.bag": "Borse", - "hud.crafting.tabs.processed_material": "Materiali", - "hud.crafting.dismantle_title": "Smantellamento", - "hud.crafting.dismantle_explanation" : "Passa il mouse sopra i tuoi oggetti nella borsa per vedere\ncosa puoi recuperare.\n\nFai Doppio Click per iniziare a smantellarlo.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/group.ftl b/assets/voxygen/i18n/it_IT/hud/group.ftl new file mode 100644 index 0000000000..a7ebddfd74 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Gruppo +hud-group-invite_to_join = [{ $name }] ti ha invitato a unirti al loro gruppo! +hud-group-invite_to_trade = [{ $name }] vorrebbe commerciare con te. +hud-group-invite = Invita +hud-group-kick = Caccia +hud-group-assign_leader = Assegna Leader +hud-group-leave = Lascia Gruppo +hud-group-dead = Morto +hud-group-out_of_range = Fuori Portata +hud-group-add_friend = Aggiungi agli Amici +hud-group-link_group = Unisci i Gruppi +hud-group-in_menu = Nel Menu +hud-group-members = Membri del Gruppo \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/group.ron b/assets/voxygen/i18n/it_IT/hud/group.ron deleted file mode 100644 index b183f152da..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.group": "Gruppo", - "hud.group.invite_to_join": "[{name}] ti ha invitato a unirti al loro gruppo!", - "hud.group.invite_to_trade": "[{name}] vorrebbe commerciare con te.", - "hud.group.invite": "Invita", - "hud.group.kick": "Caccia", - "hud.group.assign_leader": "Assegna Leader", - "hud.group.leave": "Lascia Gruppo", - "hud.group.dead" : "Morto", - "hud.group.out_of_range": "Fuori Portata", - "hud.group.add_friend": "Aggiungi agli Amici", - "hud.group.link_group": "Unisci i Gruppi", - "hud.group.in_menu": "Nel Menu", - "hud.group.members": "Membri del Gruppo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/map.ftl b/assets/voxygen/i18n/it_IT/hud/map.ftl new file mode 100644 index 0000000000..5e0c7cb186 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/map.ftl @@ -0,0 +1,34 @@ +hud-map-map_title = Mappa +hud-map-qlog_title = Missioni +hud-map-topo_map = Topografica +hud-map-difficulty = Difficoltà +hud-map-towns = Città +hud-map-castles = Castelli +hud-map-dungeons = Dungeon +hud-map-caves = Caverne +hud-map-cave = Caverna +hud-map-peaks = Montagne +hud-map-biomes = Biomi +hud-map-voxel_map = Mappa con i Voxel +hud-map-trees = Alberi Giganti +hud-map-tree = Albero Gigante +hud-map-town = Città +hud-map-castle = Castello +hud-map-dungeon = Dungeon +hud-map-difficulty_dungeon = + Dungeon + + Difficoltà: { $difficulty } +hud-map-drag = Trascina +hud-map-zoom = Zoom +hud-map-mid_click = Imposta Waypoint +hud-map-recenter = Ricentra +hud-map-marked_location = Posizione Contrassegnata +hud-map-marked_location_remove = Clicca per rimuovere +hud-map-change_map_mode = Cambia Modalità della Mappa +hud-map-toggle_minimap_voxel = Abilità la Visione della Minimappa con i Voxel +hud-map-zoom_minimap_explanation = + Ingrandisci la Minimappa per vedere + l'area intorno a te più dettagliata +hud-map-gnarling = Fortificazioni Gnarling +hud-map-placed_by = Piazzato da { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/map.ron b/assets/voxygen/i18n/it_IT/hud/map.ron deleted file mode 100644 index cc0eaf12ef..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mappa", - "hud.map.qlog_title": "Missioni", - "hud.map.topo_map": "Topografica", - "hud.map.difficulty": "Difficoltà", - "hud.map.towns": "Città", - "hud.map.castles": "Castelli", - "hud.map.dungeons": "Dungeon", - "hud.map.caves": "Caverne", - "hud.map.cave": "Caverna", - "hud.map.peaks": "Montagne", - "hud.map.biomes": "Biomi", - "hud.map.voxel_map": "Mappa con i Voxel", - "hud.map.trees": "Alberi Giganti", - "hud.map.tree": "Albero Gigante", - "hud.map.town": "Città", - "hud.map.castle": "Castello", - "hud.map.dungeon": "Dungeon", - "hud.map.difficulty_dungeon": "Dungeon\n\nDifficoltà: {difficulty}", - "hud.map.drag": "Trascina", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Imposta Waypoint", - "hud.map.recenter": "Ricentra", - "hud.map.marked_location": "Posizione Contrassegnata", - "hud.map.marked_location_remove": "Clicca per rimuovere", - "hud.map.change_map_mode": "Cambia Modalità della Mappa", - "hud.map.toggle_minimap_voxel": "Abilità la Visione della Minimappa con i Voxel", - "hud.map.zoom_minimap_explanation": "Ingrandisci la Minimappa per vedere\nl'area intorno a te più dettagliata", - "hud.map.gnarling": "Fortificazioni Gnarling", - "hud.map.placed_by": "Piazzato da {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/misc.ftl b/assets/voxygen/i18n/it_IT/hud/misc.ftl new file mode 100644 index 0000000000..9976f1e91d --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = Non mostrare all'Avvio +hud-show_tips = Mostra Consigli +hud-quests = Missioni +hud-you_died = Sei Morto +hud-waypoint_saved = Waypoint Salvato +hud-sp_arrow_txt = PA +hud-inventory_full = Inventario Pieno +hud-press_key_to_show_keybindings_fmt = Configurazione dei tasti [{ $key }] +hud-press_key_to_toggle_lantern_fmt = Lanterna [{ $key }] +hud-press_key_to_show_debug_info_fmt = Premi { $key } per mostrare le info di debug +hud-press_key_to_toggle_keybindings_fmt = Premi { $key } per attivare/disattivare la configurazione dei tasti +hud-press_key_to_toggle_debug_info_fmt = Premi { $key } per attivare/disattivare le informazioni di debug +hud-press_key_to_respawn = Premi { $key } per rinascere all'ultimo falò che hai visitato. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Premi [ { $key } ] per liberare il tuo cursore e cliccare questo pulsante! +hud-tutorial_elements = Creazione +hud-temp_quest_headline = Saluti Viaggiatore! +hud-temp_quest_text = + Per iniziare la tua avventura potresti cominciare col controllare questo villaggio e raccogliere delle provviste. + + Sei il benvenuto a prendere qualunque cosa di cui hai bisogno per il tuo viaggio! + + Guarda in basso a destra dello schermo per trovare varie cose come la tua borse, il menù di creazione e la mappa. + + Il menù di creazione ti permette di creare armature, armi, cibo e molto altro! + + Gli animali selvatici intorno alla città sono una grande fonte di Pelle per creare alcune protezioni contro i pericoli del mondo. + + Quando ti sentirai pronto, prova a ottenere un equipaggiamento migliore dalle tante sfide segnate sulla tua mappa! +hud-spell = Incantesimi +hud-diary = Diario +hud-free_look_indicator = Visuale libera attiva. Premi { $key } per disabilitarla. +hud-camera_clamp_indicator = Morsetto Camera verticale attiva. Premi { $key } per disabilitarlo. +hud-auto_walk_indicator = Camminata/Nuoto Automatico attivo +hud-collect = Colleziona +hud-pick_up = Raccogli +hud-open = Apri +hud-use = Usa +hud-mine = Mina +hud-talk = Parla +hud-trade = Commercia +hud-mount = Monta +hud-sit = Siediti \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/misc.ron b/assets/voxygen/i18n/it_IT/hud/misc.ron deleted file mode 100644 index 2939ae45ab..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.do_not_show_on_startup": "Non mostrare all'Avvio", - "hud.show_tips": "Mostra Consigli", - "hud.quests": "Missioni", - "hud.you_died": "Sei Morto", - "hud.waypoint_saved": "Waypoint Salvato", - "hud.sp_arrow_txt": "PA", - "hud.inventory_full": "Inventario Pieno", - - "hud.press_key_to_show_keybindings_fmt": "Configurazione dei tasti [{key}]", - "hud.press_key_to_toggle_lantern_fmt": "Lanterna [{key}]", - "hud.press_key_to_show_debug_info_fmt": "Premi {key} per mostrare le info di debug", - "hud.press_key_to_toggle_keybindings_fmt": "Premi {key} per attivare/disattivare la configurazione dei tasti", - "hud.press_key_to_toggle_debug_info_fmt": "Premi {key} per attivare/disattivare le informazioni di debug", - - // Respawn message - "hud.press_key_to_respawn": r#"Premi {key} per rinascere all'ultimo falò che hai visitato."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Premi [ {key} ] per liberare il tuo cursore e cliccare questo pulsante!"#, - "hud.tutorial_elements": r#"Creazione"#, - -"hud.temp_quest_headline": r#"Saluti Viaggiatore!"#, -"hud.temp_quest_text": r#"Per iniziare la tua avventura potresti cominciare col controllare questo villaggio e raccogliere delle provviste. - -Sei il benvenuto a prendere qualunque cosa di cui hai bisogno per il tuo viaggio! - -Guarda in basso a destra dello schermo per trovare varie cose come la tua borse, il menù di creazione e la mappa. - -Il menù di creazione ti permette di creare armature, armi, cibo e molto altro! - -Gli animali selvatici intorno alla città sono una grande fonte di Pelle per creare alcune protezioni contro i pericoli del mondo. - -Quando ti sentirai pronto, prova a ottenere un equipaggiamento migliore dalle tante sfide segnate sulla tua mappa! -"#, - - "hud.spell": "Incantesimi", - // Diary - "hud.diary": "Diario", - - "hud.free_look_indicator": "Visuale libera attiva. Premi {key} per disabilitarla.", - "hud.camera_clamp_indicator": "Morsetto Camera verticale attiva. Premi {key} per disabilitarlo.", - "hud.auto_walk_indicator": "Camminata/Nuoto Automatico attivo", - "hud.collect": "Colleziona", - "hud.pick_up": "Raccogli", - "hud.open": "Apri", - "hud.use": "Usa", - "hud.mine": "Mina", - "hud.talk": "Parla", - "hud.trade": "Commercia", - "hud.mount": "Monta", - "hud.sit": "Siediti", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/sct.ftl b/assets/voxygen/i18n/it_IT/hud/sct.ftl new file mode 100644 index 0000000000..58b8e51752 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Esp +hud-sct-block = PARATO \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/sct.ron b/assets/voxygen/i18n/it_IT/hud/sct.ron deleted file mode 100644 index 5c798741d3..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Esp", - "hud.sct.block": "PARATO", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/settings.ftl b/assets/voxygen/i18n/it_IT/hud/settings.ftl new file mode 100644 index 0000000000..9e6968f6a2 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/settings.ftl @@ -0,0 +1,123 @@ +hud-settings-general = Generale +hud-settings-none = Nessuno +hud-settings-press_behavior-toggle = Attiva/Disattiva +hud-settings-press_behavior-hold = Tieni premuto +hud-settings-help_window = Finestra d'Aiuto +hud-settings-debug_info = Info Debug +hud-settings-show_hitboxes = Mostra le hitbox +hud-settings-show_chat = Mostra la chat +hud-settings-show_hotkey_hints = Mostra suggerimenti per i tasti di scelta rapidaì +hud-settings-tips_on_startup = Consigli-All'-Avvio +hud-settings-ui_scale = Grandezza UI +hud-settings-relative_scaling = Ridimensionamento Relativo +hud-settings-custom_scaling = Ridimensionamento Personalizzato +hud-settings-crosshair = Mirino +hud-settings-opacity = Trasparenza +hud-settings-hotbar = Slot Rapido +hud-settings-toggle_shortcuts = Attiva/Disattiva Tasti rapidi +hud-settings-buffs_skillbar = Buff alla Barra delle Abilità +hud-settings-buffs_mmap = Buff alla Minimappa +hud-settings-toggle_bar_experience = Attiva/Disattiva Barra dell'Esperienza +hud-settings-scrolling_combat_text = Testo del Combattimento a Scorrimento +hud-settings-incoming_damage = Danno in Entrata +hud-settings-speech_bubble = Fumetto +hud-settings-speech_bubble_self = Mostra i Propri Fumetti +hud-settings-speech_bubble_dark_mode = Fumetto Modalità Scura +hud-settings-speech_bubble_icon = Icona Fumetto +hud-settings-energybar_numbers = Numeri Barra dell'Energia +hud-settings-always_show_bars = Mostra sempre le Barre dell'Energia +hud-settings-values = Valori +hud-settings-percentages = Percentuali +hud-settings-chat = Chat +hud-settings-background_opacity = Trasparenza Sfondo +hud-settings-chat_character_name = Nome Personaggi in chat +hud-settings-loading_tips = Consigli Schermata di Caricamento +hud-settings-reset_interface = Ripristina Predefiniti +hud-settings-pan_sensitivity = Sensibilità Camera +hud-settings-zoom_sensitivity = Sensibilità Zoom +hud-settings-camera_clamp_angle = Angolo per la modalità camera verticale +hud-settings-invert_scroll_zoom = Zoom Invertito +hud-settings-invert_mouse_y_axis = Asse Y del Mouse Invertita +hud-settings-invert_controller_y_axis = Asse Y del Controller Invertita +hud-settings-enable_mouse_smoothing = Camera Cinematica +hud-settings-free_look_behavior = Comportamento Visuale Libera +hud-settings-auto_walk_behavior = Comp. Camminata Automatica +hud-settings-camera_clamp_behavior = Comportamento Morsetto Camera +hud-settings-player_physics_behavior = Fisica del Giocatore (sperimentale) +hud-settings-stop_auto_walk_on_input = Interrompi Camminata Auto. Muovendoti +hud-settings-auto_camera = Camera Automatica +hud-settings-reset_gameplay = Ripristina Predefiniti +hud-settings-view_distance = Distanza di Vista +hud-settings-sprites_view_distance = Distanza di Vista degli Sprite +hud-settings-figures_view_distance = Distanza di Vista delle Entità +hud-settings-maximum_fps = FPS Massimi +hud-settings-background_fps = FPS nel Background +hud-settings-present_mode = Modalità di Presentazione +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Buca delle lettere +hud-settings-present_mode-immediate = Immediato +hud-settings-fov = Campo Visivo (gradi) +hud-settings-gamma = Gamma +hud-settings-exposure = Esposizione +hud-settings-ambiance = Luminosità Ambiente +hud-settings-antialiasing_mode = Modalità AntiAliasing +hud-settings-upscale_factor = Risoluzione Interna +hud-settings-cloud_rendering_mode = Modalità Renderizzazione Nuvole +hud-settings-fluid_rendering_mode = Modalità Renderizzazione Fluido +hud-settings-fluid_rendering_mode-cheap = Economico +hud-settings-fluid_rendering_mode-shiny = Lucente +hud-settings-cloud_rendering_mode-minimal = Minimale +hud-settings-cloud_rendering_mode-low = Bassa +hud-settings-cloud_rendering_mode-medium = Media +hud-settings-cloud_rendering_mode-high = Alta +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Schermo Intero +hud-settings-fullscreen_mode = Modalità Schermo Intero +hud-settings-fullscreen_mode-exclusive = Esclusiva +hud-settings-fullscreen_mode-borderless = Senza Bordi +hud-settings-gpu_profiler = Abilita tempismo GPU (non supportata ovunque) +hud-settings-particles = Particellari +hud-settings-lossy_terrain_compression = Compressione terreno con Perdite +hud-settings-weapon_trails = Tracce delle armi +hud-settings-resolution = Risoluzione +hud-settings-bit_depth = Profondità Bit +hud-settings-refresh_rate = Frequenza di Aggiornamento +hud-settings-lighting_rendering_mode = Modalità Renderizzazione Luce +hud-settings-lighting_rendering_mode-ashikhmin = Tipo A - Alta +hud-settings-lighting_rendering_mode-blinnphong = Tipo B - Media +hud-settings-lighting_rendering_mode-lambertian = Tipo L - Economica +hud-settings-shadow_rendering_mode = Modalità Renderizzazione Ombra +hud-settings-shadow_rendering_mode-none = Nessuna +hud-settings-shadow_rendering_mode-cheap = Economica +hud-settings-shadow_rendering_mode-map = Mappa +hud-settings-shadow_rendering_mode-map-resolution = Risoluzione +hud-settings-lod_detail = Dettagli LoD +hud-settings-save_window_size = Salva Dim. Finestra +hud-settings-reset_graphics = Ripristina Predefiniti +hud-settings-bloom = Bloom +hud-settings-point_glow = Point Glow +hud-settings-master_volume = Volume Principale +hud-settings-inactive_master_volume_perc = Volume Finestra Inattiva +hud-settings-music_volume = Volume Musica +hud-settings-sound_effect_volume = Volume Effetti Sonori +hud-settings-audio_device = Dispositivo Audio +hud-settings-reset_sound = Ripristina Predefiniti +hud-settings-english_fallback = Mostra testo Inglese per traduzioni mancanti +hud-settings-awaitingkey = Premi un tasto... +hud-settings-unbound = Nessuno +hud-settings-reset_keybinds = Ripristina Predefiniti +hud-settings-chat_tabs = Schede Chat +hud-settings-label = Etichetta: +hud-settings-delete = Cancella +hud-settings-show_all = Mostra tutto +hud-settings-messages = Messaggi +hud-settings-activity = Attività +hud-settings-death = Morte +hud-settings-group = Gruppo +hud-settings-faction = Fazione +hud-settings-world = Mondo +hud-settings-region = Regione +hud-settings-say = Parla +hud-settings-all = Tutti +hud-settings-group_only = Solo Gruppo +hud-settings-reset_chat = Ripristina Predefiniti \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/settings.ron b/assets/voxygen/i18n/it_IT/hud/settings.ron deleted file mode 100644 index 5df8c96a78..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/settings.ron +++ /dev/null @@ -1,141 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - // Settings - "hud.settings.general": "Generale", - "hud.settings.none": "Nessuno", - "hud.settings.press_behavior.toggle": "Attiva/Disattiva", - "hud.settings.press_behavior.hold": "Tieni premuto", - "hud.settings.help_window": "Finestra d'Aiuto", - "hud.settings.debug_info": "Info Debug", - "hud.settings.show_hitboxes": "Mostra le hitbox", - "hud.settings.show_chat": "Mostra la chat", - "hud.settings.show_hotkey_hints": "Mostra suggerimenti per i tasti di scelta rapidaì", - "hud.settings.tips_on_startup": "Consigli-All'-Avvio", - "hud.settings.ui_scale": "Grandezza UI", - "hud.settings.relative_scaling": "Ridimensionamento Relativo", - "hud.settings.custom_scaling": "Ridimensionamento Personalizzato", - "hud.settings.crosshair": "Mirino", - "hud.settings.opacity": "Trasparenza", - "hud.settings.hotbar": "Slot Rapido", - "hud.settings.toggle_shortcuts": "Attiva/Disattiva Tasti rapidi", - "hud.settings.buffs_skillbar": "Buff alla Barra delle Abilità", - "hud.settings.buffs_mmap": "Buff alla Minimappa", - "hud.settings.toggle_bar_experience": "Attiva/Disattiva Barra dell'Esperienza", - "hud.settings.scrolling_combat_text": "Testo del Combattimento a Scorrimento", - "hud.settings.incoming_damage": "Danno in Entrata", - "hud.settings.speech_bubble": "Fumetto", - "hud.settings.speech_bubble_self": "Mostra i Propri Fumetti", - "hud.settings.speech_bubble_dark_mode": "Fumetto Modalità Scura", - "hud.settings.speech_bubble_icon": "Icona Fumetto", - "hud.settings.energybar_numbers": "Numeri Barra dell'Energia", - "hud.settings.always_show_bars": "Mostra sempre le Barre dell'Energia", - "hud.settings.values": "Valori", - "hud.settings.percentages": "Percentuali", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Trasparenza Sfondo", - "hud.settings.chat_character_name": "Nome Personaggi in chat", - "hud.settings.loading_tips": "Consigli Schermata di Caricamento", - "hud.settings.reset_interface": "Ripristina Predefiniti", - - "hud.settings.pan_sensitivity": "Sensibilità Camera", - "hud.settings.zoom_sensitivity": "Sensibilità Zoom", - "hud.settings.camera_clamp_angle": "Angolo per la modalità camera verticale", - "hud.settings.invert_scroll_zoom": "Zoom Invertito", - "hud.settings.invert_mouse_y_axis": "Asse Y del Mouse Invertita", - "hud.settings.invert_controller_y_axis": "Asse Y del Controller Invertita", - "hud.settings.enable_mouse_smoothing": "Camera Cinematica", - "hud.settings.free_look_behavior": "Comportamento Visuale Libera", - "hud.settings.auto_walk_behavior": "Comp. Camminata Automatica", - "hud.settings.camera_clamp_behavior": "Comportamento Morsetto Camera", - "hud.settings.player_physics_behavior": "Fisica del Giocatore (sperimentale)", - "hud.settings.stop_auto_walk_on_input": "Interrompi Camminata Auto. Muovendoti", - "hud.settings.auto_camera": "Camera Automatica", - "hud.settings.reset_gameplay": "Ripristina Predefiniti", - - "hud.settings.view_distance": "Distanza di Vista", - "hud.settings.sprites_view_distance": "Distanza di Vista degli Sprite", - "hud.settings.figures_view_distance": "Distanza di Vista delle Entità", - "hud.settings.maximum_fps": "FPS Massimi", - "hud.settings.background_fps": "FPS nel Background", - "hud.settings.present_mode": "Modalità di Presentazione", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Buca delle lettere", - "hud.settings.present_mode.immediate": "Immediato", - "hud.settings.fov": "Campo Visivo (gradi)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Esposizione", - "hud.settings.ambiance": "Luminosità Ambiente", - "hud.settings.antialiasing_mode": "Modalità AntiAliasing", - "hud.settings.upscale_factor": "Risoluzione Interna", - "hud.settings.cloud_rendering_mode": "Modalità Renderizzazione Nuvole", - "hud.settings.fluid_rendering_mode": "Modalità Renderizzazione Fluido", - "hud.settings.fluid_rendering_mode.cheap": "Economico", - "hud.settings.fluid_rendering_mode.shiny": "Lucente", - "hud.settings.cloud_rendering_mode.minimal": "Minimale", - "hud.settings.cloud_rendering_mode.low": "Bassa", - "hud.settings.cloud_rendering_mode.medium": "Media", - "hud.settings.cloud_rendering_mode.high": "Alta", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Schermo Intero", - "hud.settings.fullscreen_mode": "Modalità Schermo Intero", - "hud.settings.fullscreen_mode.exclusive": "Esclusiva", - "hud.settings.fullscreen_mode.borderless": "Senza Bordi", - "hud.settings.gpu_profiler": "Abilita tempismo GPU (non supportata ovunque)", - "hud.settings.particles": "Particellari", - "hud.settings.lossy_terrain_compression": "Compressione terreno con Perdite", - "hud.settings.weapon_trails": "Tracce delle armi", - "hud.settings.resolution": "Risoluzione", - "hud.settings.bit_depth": "Profondità Bit", - "hud.settings.refresh_rate": "Frequenza di Aggiornamento", - "hud.settings.lighting_rendering_mode": "Modalità Renderizzazione Luce", - "hud.settings.lighting_rendering_mode.ashikhmin": "Tipo A - Alta ", - "hud.settings.lighting_rendering_mode.blinnphong": "Tipo B - Media", - "hud.settings.lighting_rendering_mode.lambertian": "Tipo L - Economica", - "hud.settings.shadow_rendering_mode": "Modalità Renderizzazione Ombra", - "hud.settings.shadow_rendering_mode.none": "Nessuna", - "hud.settings.shadow_rendering_mode.cheap": "Economica", - "hud.settings.shadow_rendering_mode.map": "Mappa", - "hud.settings.shadow_rendering_mode.map.resolution": "Risoluzione", - "hud.settings.lod_detail": "Dettagli LoD", - "hud.settings.save_window_size": "Salva Dim. Finestra", - "hud.settings.reset_graphics": "Ripristina Predefiniti", - "hud.settings.bloom": "Bloom", - "hud.settings.point_glow": "Point Glow", - - "hud.settings.master_volume": "Volume Principale", - "hud.settings.inactive_master_volume_perc": "Volume Finestra Inattiva", - "hud.settings.music_volume": "Volume Musica", - "hud.settings.sound_effect_volume": "Volume Effetti Sonori", - "hud.settings.audio_device": "Dispositivo Audio", - "hud.settings.reset_sound": "Ripristina Predefiniti", - - "hud.settings.english_fallback": "Mostra testo Inglese per traduzioni mancanti", - - "hud.settings.awaitingkey": "Premi un tasto...", - "hud.settings.unbound": "Nessuno", - "hud.settings.reset_keybinds": "Ripristina Predefiniti", - - "hud.settings.chat_tabs": "Schede Chat", - "hud.settings.label": "Etichetta:", - "hud.settings.delete": "Cancella", - "hud.settings.show_all": "Mostra tutto", - "hud.settings.messages": "Messaggi", - "hud.settings.activity": "Attività", - "hud.settings.death": "Morte", - "hud.settings.group": "Gruppo", - "hud.settings.faction": "Fazione", - "hud.settings.world": "Mondo", - "hud.settings.region": "Regione", - "hud.settings.say": "Parla", - "hud.settings.all": "Tutti", - "hud.settings.group_only": "Solo Gruppo", - "hud.settings.reset_chat" : "Ripristina Predefiniti", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/skills.ftl b/assets/voxygen/i18n/it_IT/hud/skills.ftl new file mode 100644 index 0000000000..4b1a14423f --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Nuovo Punto Abilità +hud-skill-sp_available = { $number } PA disponibili +hud-skill-not_unlocked = Non ancora sbloccato +hud-skill-req_sp ={"\u000A"} + + Richiede { $number } PA +hud-skill-inc_health_title = Aumenta Salute +hud-skill-inc_health = Incrementa la salute massima di { $boost }{ $SP } +hud-skill-inc_energy_title = Aumenta Energia +hud-skill-inc_energy = Incrementa l'energia massima di { $boost }{ $SP } +hud-skill-unlck_sword_title = Sblocca Spada +hud-skill-unlck_sword = Sblocca l'albero di abilità per la spada{ $SP } +hud-skill-unlck_axe_title = Sblocca Ascia +hud-skill-unlck_axe = Sblocca l'albero di abilità per l'ascia{ $SP } +hud-skill-unlck_hammer_title = Sblocca Martello +hud-skill-unlck_hammer = Sblocca l'albero di abilità per il martello{ $SP } +hud-skill-unlck_bow_title = Sblocca Arco +hud-skill-unlck_bow = Sblocca l'albero di abilità per l'arco{ $SP } +hud-skill-unlck_staff_title = Sblocca Bastone +hud-skill-unlck_staff = Sblocca l'albero di abilità per il bastone{ $SP } +hud-skill-unlck_sceptre_title = Sblocca Scettro +hud-skill-unlck_sceptre = Sblocca l'albero di abilità per lo scettro{ $SP } +hud-skill-dodge_title = Schivata +hud-skill-dodge = Le rotolate per schivare vengono attivate col click del tasto centrale del mouse, e concede immunità temporanea ad attacchi ravvicinati (iframes) mentre stai rotolando. +hud-skill-roll_energy_title = Costo di Energia Rotolata +hud-skill-roll_energy = Rotolare usa il { $boost }% in meno di energia{ $SP } +hud-skill-roll_speed_title = Velocità Rotolata +hud-skill-roll_speed = Rotola il { $boost }% più velocemente{ $SP } +hud-skill-roll_dur_title = Durata Rotolata +hud-skill-roll_dur = Rotola per il { $boost }% di tempo in più{ $SP } +hud-skill-climbing_title = Arrampicata +hud-skill-climbing = Salta più in alto +hud-skill-climbing_cost_title = Costo Arrampicata +hud-skill-climbing_cost = Arrampicarsi usa il { $boost }% in meno di energia{ $SP } +hud-skill-climbing_speed_title = Velocità Arrampicata +hud-skill-climbing_speed = Arrampicati il { $boost }% più velocemente{ $SP } +hud-skill-swim_title = Nuoto +hud-skill-swim = Muoviti in ambienti bagnati +hud-skill-swim_speed_title = Velocità Nuoto +hud-skill-swim_speed = Nuoti il { $boost }% più velocemente{ $SP } +hud-skill-sc_lifesteal_title = Raggio Rubavita +hud-skill-sc_lifesteal = Assorbi la vita dai tuoi nemici +hud-skill-sc_lifesteal_damage_title = Danno +hud-skill-sc_lifesteal_damage = Infliggi il { $boost }% di danno in più{ $SP } +hud-skill-sc_lifesteal_range_title = Portata +hud-skill-sc_lifesteal_range = Il tuo raggio ha una portata aggiuntiva del { $boost }%{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Rubavita +hud-skill-sc_lifesteal_lifesteal = Converti un addizionale { $boost }% di danno in salute{ $SP } +hud-skill-sc_lifesteal_regen_title = Rigenerazione Energia +hud-skill-sc_lifesteal_regen = Recupera la tua energia di un addizionale { $boost }%{ $SP } +hud-skill-sc_heal_title = Aura Curatrice +hud-skill-sc_heal = Cura i tuoi alleati utilizzando il sangue dei tuoi nemici +hud-skill-sc_heal_heal_title = Cura +hud-skill-sc_heal_heal = Incrementa la cura verso altri del { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Costo Energia +hud-skill-sc_heal_cost = Curare gli altri richiede il { $boost }% di energia in meno{ $SP } +hud-skill-sc_heal_duration_title = Durata +hud-skill-sc_heal_duration = Gli effetti della tua aura curativa durano il { $boost }% di più{ $SP } +hud-skill-sc_heal_range_title = Portata +hud-skill-sc_heal_range = Il tuo raggio ha una portata aggiuntiva del { $boost }%{ $SP } +hud-skill-sc_wardaura_unlock_title = Sblocca Aura Protettiva +hud-skill-sc_wardaura_unlock = Ti permette di proteggere i tuoi alleati contro gli attacchi nemici{ $SP } +hud-skill-sc_wardaura_strength_title = Forza +hud-skill-sc_wardaura_strength = La forza della tua protezione aumenta del { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Durata +hud-skill-sc_wardaura_duration = Gli effetti della tua protezione durano il { $boost }% in più{ $SP } +hud-skill-sc_wardaura_range_title = Portata +hud-skill-sc_wardaura_range = La tua protezione ha una portata aggiuntiva del { $boost }%{ $SP } +hud-skill-sc_wardaura_cost_title = Costo Energia +hud-skill-sc_wardaura_cost = Creare la protezione richiede richiede il { $boost }% di energia in meno{ $SP } +hud-skill-st_shockwave_range_title = Gamma Onda d'Urto +hud-skill-st_shockwave_range = Lancia cose che di solito erano fuori portata, portata aumentata del { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Costo Onda d'Urto +hud-skill-st_shockwave_cost = Diminuisce il costo d'energia per lanciare abitanti indifesi del { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Contraccolpo Onda d'Urto +hud-skill-st_shockwave_knockback = Incrementa il potenziale di lancio del { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Danno Onda d'Urto +hud-skill-st_shockwave_damage = Incrementa il danno inflitto del { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Sblocca Onda d'Urto +hud-skill-st_shockwave_unlock = Sblocca l'abilità di lanciare via i nemici utilizzando il fuoco{ $SP } +hud-skill-st_flamethrower_title = Lanciafiamme +hud-skill-st_flamethrower = Lancia fiamme, cucinali tutti +hud-skill-st_flame_velocity_title = Velocità Fiamme +hud-skill-st_flame_velocity = Fa arrivare il fuoco più velocemente, il { $boost }% più velocemente{ $SP } +hud-skill-st_flamethrower_range_title = Portata Lanciafiamma +hud-skill-st_flamethrower_range = Per quando le fiamma semplicemente non arrivano, vanno il { $boost }% più lontano{ $SP } +hud-skill-st_energy_drain_title = Drena Energia +hud-skill-st_energy_drain = Diminuisce la velocità a cui l'energia viene drenata del { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Danno Lanciafiamme +hud-skill-st_flamethrower_damage = Incrementa il danno del { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Portata Esplosione +hud-skill-st_explosion_radius = Più grande è meglio, aumenta la portata dell'esplosione del { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Rigenerazione Stamina +hud-skill-st_energy_regen = Incrementa l'energia ottenuta del { $boost }%{ $SP } +hud-skill-st_fireball_title = Palla di Fuoco +hud-skill-st_fireball = Spara una palla di fuoco che esplode all'impatto +hud-skill-st_damage_title = Danno +hud-skill-st_damage = Incrementa il danno del { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Velocità Proiettile +hud-skill-bow_projectile_speed = Ti permette di sparare frecce più lontano, più velocemente, del { $boost }%{ $SP } +hud-skill-bow_charged_title = Colpo Caricato +hud-skill-bow_charged = Perché hai aspettato più a lungo +hud-skill-bow_charged_damage_title = Danno Caricato +hud-skill-bow_charged_damage = Incrementa il danno del { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Rigenerazione Caricata +hud-skill-bow_charged_energy_regen = Incrementa il recupero dell'energia del { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Contraccolpo Caricato +hud-skill-bow_charged_knockback = Spinge i nemici il { $boost }% più lontano{ $SP } +hud-skill-bow_charged_speed_title = Velocità Caricata +hud-skill-bow_charged_speed = Incrementa la velocità a cui carichi l'attacco del { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Velocità di Movimento Caricata +hud-skill-bow_charged_move = Incrementa quanto velocemente puoi muoverti mentre carichi l'attaco del { $boost }%{ $SP } +hud-skill-bow_repeater_title = Ripetitore +hud-skill-bow_repeater = Più tempo spari, maggiore è il tuo rateo di fuoco{ $SP } +hud-skill-bow_repeater_damage_title = Danno Ripetitore +hud-skill-bow_repeater_damage = Incrementa il danno inflitto del { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Costo Ripetitore +hud-skill-bow_repeater_cost = Diminuisce il costo d'energia per diventare un ripetitore del { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Velocità Ripetitore +hud-skill-bow_repeater_speed = Incrementa il rateo con cui spari del { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Sblocca Shotgun +hud-skill-bow_shotgun_unlock = Sblocca l'abilità di sparare più freccie alla volta{ $SP } +hud-skill-bow_shotgun_damage_title = Danno Shotgun +hud-skill-bow_shotgun_damage = Incrementa il danno fatto del { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Costo Shotgun +hud-skill-bow_shotgun_cost = Diminuisce il costo di shotgun del { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Frecce Shotgun +hud-skill-bow_shotgun_arrow_count = Incrementa il numero di frecce nel colpo del { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Propagazione Shotgun +hud-skill-bow_shotgun_spread = Diminuisce la propagazione delle frecce del { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Portata Balzo +hud-skill-hmr_leap_radius = Incrementa la portata di attacco dello schianto di { $boost } metro{ $SP } +hud-skill-hmr_leap_distance_title = Distanza Balzo +hud-skill-hmr_leap_distance = Incrementa la distanza del Balzo del { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Costo Balzo +hud-skill-hmr_leap_cost = Diminuisce il costo del balzo del { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Contraccolpo Balzo +hud-skill-hmr_leap_knockback = Incrementa il contraccolpo dal balzo del { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Danno Balzo +hud-skill-hmr_leap_damage = Incrementa il danno del balzo del { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Sblocca Balzo +hud-skill-hmr_unlock_leap = Sblocca uno sbalzo{ $SP } +hud-skill-hmr_charged_melee_title = Attacco ravvicinato Caricato +hud-skill-hmr_charged_melee = Attacco ravvicinato ma con carica +hud-skill-hmr_charged_rate_title = Velocità Carica +hud-skill-hmr_charged_rate = Incrementa la velocità a cui carichi il colpo del { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Drenaggio Energia Attacco ravvicinato Caricato +hud-skill-hmr_charged_melee_nrg_drain = Diminuisce la velocità a cui l'energia viene drenata durante il caricamento del { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Danno Attacco ravvicinato Caricato +hud-skill-hmr_charged_melee_damage = Incrementa il danno del colpo caricato del { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Contraccolpo Attacco ravvicinato Caricato +hud-skill-hmr_charged_melee_knockback = Incrementa enormemente il potenziale di lancio del colpo del { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Colpo Singolo +hud-skill-hmr_single_strike = Proprio come te +hud-skill-hmr_single_strike_regen_title = Rigenerazione Colpo Singolo +hud-skill-hmr_single_strike_regen = Incrementa il guadagno di stamina per ogni colpo in successione{ $SP } +hud-skill-hmr_single_strike_speed_title = Velocità Colpo Singolo +hud-skill-hmr_single_strike_speed = Incrementa la velocità d'attacco per ogni colpo in successione{ $SP } +hud-skill-hmr_single_strike_damage_title = Danno Colpo Singolo +hud-skill-hmr_single_strike_damage = Incrementa il danno per ogni colpo in successione{ $SP } +hud-skill-hmr_single_strike_knockback_title = Contraccolpo Colpo Singolo +hud-skill-hmr_single_strike_knockback = Incrementa il potenziale di lancio dei colpi del { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Colpo Triplo +hud-skill-sw_trip_str = Colpisci, fino a tre volte +hud-skill-sw_trip_str_combo_title = Combo Colpo Triplo +hud-skill-sw_trip_str_combo = Sblocca danno scalare sulla combo di colpo triplo{ $SP } +hud-skill-sw_trip_str_dmg_title = Danno Colpo Triplo +hud-skill-sw_trip_str_dmg = Incrementa il danno che ogni colpo in successione infligge{ $SP } +hud-skill-sw_trip_str_sp_title = Velocità Colpo Triplo +hud-skill-sw_trip_str_sp = Incrementa la velocità d'attacco guadagnata per ogni colpo in successione{ $SP } +hud-skill-sw_trip_str_reg_title = Rigenerazione Colpo Triplo +hud-skill-sw_trip_str_reg = Incrementa il guadagno di stamina per ogni colpo in successione{ $SP } +hud-skill-sw_dash_title = Scatto +hud-skill-sw_dash = Scatta attraverso i tuoi nemici +hud-skill-sw_dash_dmg_title = Danno Scatto +hud-skill-sw_dash_dmg = Incrementa il danno iniziale dello scatto del { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Drenaggio Scatto +hud-skill-sw_dash_drain = Diminuisce la velocità a cui l'energia viene drenata mentre scatti del { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Costo Scatto +hud-skill-sw_dash_cost = Diminuisce il costo iniziale dello scatto del { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Velocità Scatto +hud-skill-sw_dash_speed = Incrementa quanto veloce sei mentre scatti{ $SP } +hud-skill-sw_dash_charge_through_title = Carica +hud-skill-sw_dash_charge_through = Ti permette di caricare attraverso i primi nemici che colpisci{ $SP } +hud-skill-sw_dash_scale_title = Danno Scalare Scatto +hud-skill-sw_dash_scale = Incrementa il danno scalare dello scatto del { $boost }%{ $SP } +hud-skill-sw_spin_title = Sblocca Vortice +hud-skill-sw_spin = Sblocca l'abilità di vorticare con la spada{ $SP } +hud-skill-sw_spin_dmg_title = Danno Vortice +hud-skill-sw_spin_dmg = Incrementa il danno inflitto del { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Velocità Vortice +hud-skill-sw_spin_spd = Incrementa la velocità alla cui vortichi del { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Costo Vortice +hud-skill-sw_spin_cost = Diminuisce il costo di energia di ogni giro del { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Vortice Vorticante +hud-skill-sw_spin_spins = Incrementa il numero di volte che puoi vorticare{ $SP } +hud-skill-sw_interrupt_title = Interruzione Attacchi +hud-skill-sw_interrupt = Ti permette di cancellare immediatamente un attacco con un altro attacco{ $SP } +hud-skill-axe_double_strike_title = Colpo Doppio +hud-skill-axe_double_strike = Abbatti quei furfanti +hud-skill-axe_double_strike_combo_title = Combo Colpo Doppio +hud-skill-axe_double_strike_combo = Sblocca un secondo colpo{ $SP } +hud-skill-axe_double_strike_damage_title = Danno Colpo Doppio +hud-skill-axe_double_strike_damage = Incrementa il danno inflitto per ogni colpo in successione{ $SP } +hud-skill-axe_double_strike_speed_title = Velocità Colpo Doppio +hud-skill-axe_double_strike_speed = Incrementa la velocità d'attacco per ogni colpo in successione{ $SP } +hud-skill-axe_double_strike_regen_title = Rigenerazione Colpo Doppio +hud-skill-axe_double_strike_regen = Incrementa la stamina guadagnata per ogni colpo in successione{ $SP } +hud-skill-axe_spin_title = Vortice d'Ascia +hud-skill-axe_spin = You spin it right round ... +hud-skill-axe_infinite_axe_spin_title = Vortice d'Ascia Infinito +hud-skill-axe_infinite_axe_spin = Vortica finché hai dell'energia{ $SP } +hud-skill-axe_spin_damage_title = Danno Vortice +hud-skill-axe_spin_damage = Incrementa il danno che ogni vortice infligge del { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Vortice Elicottero +hud-skill-axe_spin_helicopter = Cadi un po' più lentamente mentre vortichi{ $SP } +hud-skill-axe_spin_speed_title = Velocità Vortice +hud-skill-axe_spin_speed = Incrementa la velocità alla cui vortichi del { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Costo Vortice +hud-skill-axe_spin_cost = Diminuisce il costo in stamina del vorticamento del { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Sblocca Balzo +hud-skill-axe_unlock_leap = Sblocca un balzo vorticante{ $SP } +hud-skill-axe_leap_damage_title = Danno Balzo +hud-skill-axe_leap_damage = Incrementa il danno del balzo del { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Contraccolpo Balzo +hud-skill-axe_leap_knockback = Incrementa il contraccolpo del balzo del { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Costo Balzo +hud-skill-axe_leap_cost = Diminuisce il costo del balzo del { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Distanza Balzo +hud-skill-axe_leap_distance = Incrementa la distanza del balzo del { $boost }%{ $SP } +hud-skill-mining_title = Estrazione Mineraria +hud-skill-pick_strike_title = Picconata +hud-skill-pick_strike = Colpisci rocce col piccone per ottenere materiale grezzo, gemme ed esperienza +hud-skill-pick_strike_speed_title = Velocità Picconata +hud-skill-pick_strike_speed = Scavi le rocce più velocemente{ $SP } +hud-skill-pick_strike_oregain_title = Resa Materiali Grezzi Picconata +hud-skill-pick_strike_oregain = Possibilità di ottenere materiale grezzo extra del ({ $boost }% per livello){ $SP } +hud-skill-pick_strike_gemgain_title = Resa Gemme Picconata +hud-skill-pick_strike_gemgain = Possibilità di ottenere gemme extra del ({ $boost }% per livello){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/skills.ron b/assets/voxygen/i18n/it_IT/hud/skills.ron deleted file mode 100644 index 5f16ec6416..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.rank_up": "Nuovo Punto Abilità", - "hud.skill.sp_available": "{number} PA disponibili", - "hud.skill.not_unlocked": "Non ancora sbloccato", - "hud.skill.req_sp": "\n\nRichiede {number} PA", - // Skills - // General - "hud.skill.inc_health_title": "Aumenta Salute", - "hud.skill.inc_health": "Incrementa la salute massima di {boost}{SP}", - "hud.skill.inc_energy_title": "Aumenta Energia", - "hud.skill.inc_energy": "Incrementa l'energia massima di {boost}{SP}", - "hud.skill.unlck_sword_title": "Sblocca Spada", - "hud.skill.unlck_sword": "Sblocca l'albero di abilità per la spada{SP}", - "hud.skill.unlck_axe_title": "Sblocca Ascia", - "hud.skill.unlck_axe": "Sblocca l'albero di abilità per l'ascia{SP}", - "hud.skill.unlck_hammer_title": "Sblocca Martello", - "hud.skill.unlck_hammer": "Sblocca l'albero di abilità per il martello{SP}", - "hud.skill.unlck_bow_title": "Sblocca Arco", - "hud.skill.unlck_bow": "Sblocca l'albero di abilità per l'arco{SP}", - "hud.skill.unlck_staff_title": "Sblocca Bastone", - "hud.skill.unlck_staff": "Sblocca l'albero di abilità per il bastone{SP}", - "hud.skill.unlck_sceptre_title": "Sblocca Scettro", - "hud.skill.unlck_sceptre": "Sblocca l'albero di abilità per lo scettro{SP}", - "hud.skill.dodge_title": "Schivata", - "hud.skill.dodge": "Le rotolate per schivare vengono attivate col click del tasto centrale del mouse, e concede immunità temporanea ad attacchi ravvicinati (iframes) mentre stai rotolando.", - "hud.skill.roll_energy_title": "Costo di Energia Rotolata", - "hud.skill.roll_energy": "Rotolare usa il {boost}% in meno di energia{SP}", - "hud.skill.roll_speed_title": "Velocità Rotolata", - "hud.skill.roll_speed": "Rotola il {boost}% più velocemente{SP}", - "hud.skill.roll_dur_title": "Durata Rotolata", - "hud.skill.roll_dur": "Rotola per il {boost}% di tempo in più{SP}", - "hud.skill.climbing_title": "Arrampicata", - "hud.skill.climbing": "Salta più in alto", - "hud.skill.climbing_cost_title": "Costo Arrampicata", - "hud.skill.climbing_cost": "Arrampicarsi usa il {boost}% in meno di energia{SP}", - "hud.skill.climbing_speed_title": "Velocità Arrampicata", - "hud.skill.climbing_speed": "Arrampicati il {boost}% più velocemente{SP}", - "hud.skill.swim_title": "Nuoto", - "hud.skill.swim": "Muoviti in ambienti bagnati", - "hud.skill.swim_speed_title": "Velocità Nuoto", - "hud.skill.swim_speed": "Nuoti il {boost}% più velocemente{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Raggio Rubavita", - "hud.skill.sc_lifesteal": "Assorbi la vita dai tuoi nemici", - "hud.skill.sc_lifesteal_damage_title": "Danno", - "hud.skill.sc_lifesteal_damage": "Infliggi il {boost}% di danno in più{SP}", - "hud.skill.sc_lifesteal_range_title": "Portata", - "hud.skill.sc_lifesteal_range": "Il tuo raggio ha una portata aggiuntiva del {boost}%{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Rubavita", - "hud.skill.sc_lifesteal_lifesteal": "Converti un addizionale {boost}% di danno in salute{SP}", - "hud.skill.sc_lifesteal_regen_title": "Rigenerazione Energia", - "hud.skill.sc_lifesteal_regen": "Recupera la tua energia di un addizionale {boost}%{SP}", - "hud.skill.sc_heal_title": "Aura Curatrice", - "hud.skill.sc_heal": "Cura i tuoi alleati utilizzando il sangue dei tuoi nemici", - "hud.skill.sc_heal_heal_title": "Cura", - "hud.skill.sc_heal_heal": "Incrementa la cura verso altri del {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Costo Energia", - "hud.skill.sc_heal_cost": "Curare gli altri richiede il {boost}% di energia in meno{SP}", - "hud.skill.sc_heal_duration_title": "Durata", - "hud.skill.sc_heal_duration": "Gli effetti della tua aura curativa durano il {boost}% di più{SP}", - "hud.skill.sc_heal_range_title": "Portata", - "hud.skill.sc_heal_range": "Il tuo raggio ha una portata aggiuntiva del {boost}%{SP}", - "hud.skill.sc_wardaura_unlock_title": "Sblocca Aura Protettiva", - "hud.skill.sc_wardaura_unlock": "Ti permette di proteggere i tuoi alleati contro gli attacchi nemici{SP}", - "hud.skill.sc_wardaura_strength_title": "Forza", - "hud.skill.sc_wardaura_strength": "La forza della tua protezione aumenta del {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Durata", - "hud.skill.sc_wardaura_duration": "Gli effetti della tua protezione durano il {boost}% in più{SP}", - "hud.skill.sc_wardaura_range_title": "Portata", - "hud.skill.sc_wardaura_range": "La tua protezione ha una portata aggiuntiva del {boost}%{SP}", - "hud.skill.sc_wardaura_cost_title": "Costo Energia", - "hud.skill.sc_wardaura_cost": "Creare la protezione richiede richiede il {boost}% di energia in meno{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Gamma Onda d'Urto", - "hud.skill.st_shockwave_range" : "Lancia cose che di solito erano fuori portata, portata aumentata del {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Costo Onda d'Urto", - "hud.skill.st_shockwave_cost" : "Diminuisce il costo d'energia per lanciare abitanti indifesi del {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Contraccolpo Onda d'Urto", - "hud.skill.st_shockwave_knockback" : "Incrementa il potenziale di lancio del {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Danno Onda d'Urto", - "hud.skill.st_shockwave_damage" : "Incrementa il danno inflitto del {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Sblocca Onda d'Urto", - "hud.skill.st_shockwave_unlock" : "Sblocca l'abilità di lanciare via i nemici utilizzando il fuoco{SP}", - "hud.skill.st_flamethrower_title" : "Lanciafiamme", - "hud.skill.st_flamethrower" : "Lancia fiamme, cucinali tutti", - "hud.skill.st_flame_velocity_title" : "Velocità Fiamme", - "hud.skill.st_flame_velocity" : "Fa arrivare il fuoco più velocemente, il {boost}% più velocemente{SP}", - "hud.skill.st_flamethrower_range_title" : "Portata Lanciafiamma", - "hud.skill.st_flamethrower_range" : "Per quando le fiamma semplicemente non arrivano, vanno il {boost}% più lontano{SP}", - "hud.skill.st_energy_drain_title" : "Drena Energia", - "hud.skill.st_energy_drain" : "Diminuisce la velocità a cui l'energia viene drenata del {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Danno Lanciafiamme", - "hud.skill.st_flamethrower_damage" : "Incrementa il danno del {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Portata Esplosione", - "hud.skill.st_explosion_radius" : "Più grande è meglio, aumenta la portata dell'esplosione del {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Rigenerazione Stamina", - "hud.skill.st_energy_regen" : "Incrementa l'energia ottenuta del {boost}%{SP}", - "hud.skill.st_fireball_title" : "Palla di Fuoco", - "hud.skill.st_fireball" : "Spara una palla di fuoco che esplode all'impatto", - "hud.skill.st_damage_title" : "Danno", - "hud.skill.st_damage" : "Incrementa il danno del {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Velocità Proiettile", - "hud.skill.bow_projectile_speed" : "Ti permette di sparare frecce più lontano, più velocemente, del {boost}%{SP}", - "hud.skill.bow_charged_title" : "Colpo Caricato", - "hud.skill.bow_charged" : "Perché hai aspettato più a lungo", - "hud.skill.bow_charged_damage_title" : "Danno Caricato", - "hud.skill.bow_charged_damage" : "Incrementa il danno del {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Rigenerazione Caricata", - "hud.skill.bow_charged_energy_regen" : "Incrementa il recupero dell'energia del {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Contraccolpo Caricato", - "hud.skill.bow_charged_knockback" : "Spinge i nemici il {boost}% più lontano{SP}", - "hud.skill.bow_charged_speed_title" : "Velocità Caricata", - "hud.skill.bow_charged_speed" : "Incrementa la velocità a cui carichi l'attacco del {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Velocità di Movimento Caricata", - "hud.skill.bow_charged_move" : "Incrementa quanto velocemente puoi muoverti mentre carichi l'attaco del {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Ripetitore", - "hud.skill.bow_repeater" : "Più tempo spari, maggiore è il tuo rateo di fuoco{SP}", - "hud.skill.bow_repeater_damage_title" : "Danno Ripetitore", - "hud.skill.bow_repeater_damage" : "Incrementa il danno inflitto del {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Costo Ripetitore", - "hud.skill.bow_repeater_cost" : "Diminuisce il costo d'energia per diventare un ripetitore del {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Velocità Ripetitore", - "hud.skill.bow_repeater_speed" : "Incrementa il rateo con cui spari del {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Sblocca Shotgun", - "hud.skill.bow_shotgun_unlock" : "Sblocca l'abilità di sparare più freccie alla volta{SP}", - "hud.skill.bow_shotgun_damage_title" : "Danno Shotgun", - "hud.skill.bow_shotgun_damage" : "Incrementa il danno fatto del {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Costo Shotgun", - "hud.skill.bow_shotgun_cost" : "Diminuisce il costo di shotgun del {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Frecce Shotgun", - "hud.skill.bow_shotgun_arrow_count" : "Incrementa il numero di frecce nel colpo del {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Propagazione Shotgun", - "hud.skill.bow_shotgun_spread" : "Diminuisce la propagazione delle frecce del {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Portata Balzo", - "hud.skill.hmr_leap_radius" : "Incrementa la portata di attacco dello schianto di {boost} metro{SP}", - "hud.skill.hmr_leap_distance_title" : "Distanza Balzo", - "hud.skill.hmr_leap_distance" : "Incrementa la distanza del Balzo del {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Costo Balzo", - "hud.skill.hmr_leap_cost" : "Diminuisce il costo del balzo del {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Contraccolpo Balzo", - "hud.skill.hmr_leap_knockback" : "Incrementa il contraccolpo dal balzo del {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Danno Balzo", - "hud.skill.hmr_leap_damage" : "Incrementa il danno del balzo del {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Sblocca Balzo", - "hud.skill.hmr_unlock_leap" : "Sblocca uno sbalzo{SP}", - "hud.skill.hmr_charged_melee_title" : "Attacco ravvicinato Caricato", - "hud.skill.hmr_charged_melee" : "Attacco ravvicinato ma con carica", - "hud.skill.hmr_charged_rate_title" : "Velocità Carica", - "hud.skill.hmr_charged_rate" : "Incrementa la velocità a cui carichi il colpo del {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Drenaggio Energia Attacco ravvicinato Caricato", - "hud.skill.hmr_charged_melee_nrg_drain" : "Diminuisce la velocità a cui l'energia viene drenata durante il caricamento del {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Danno Attacco ravvicinato Caricato", - "hud.skill.hmr_charged_melee_damage" : "Incrementa il danno del colpo caricato del {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Contraccolpo Attacco ravvicinato Caricato", - "hud.skill.hmr_charged_melee_knockback" : "Incrementa enormemente il potenziale di lancio del colpo del {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Colpo Singolo", - "hud.skill.hmr_single_strike" : "Proprio come te", - "hud.skill.hmr_single_strike_regen_title" : "Rigenerazione Colpo Singolo", - "hud.skill.hmr_single_strike_regen" : "Incrementa il guadagno di stamina per ogni colpo in successione{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Velocità Colpo Singolo", - "hud.skill.hmr_single_strike_speed" : "Incrementa la velocità d'attacco per ogni colpo in successione{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Danno Colpo Singolo", - "hud.skill.hmr_single_strike_damage" : "Incrementa il danno per ogni colpo in successione{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Contraccolpo Colpo Singolo", - "hud.skill.hmr_single_strike_knockback" : "Incrementa il potenziale di lancio dei colpi del {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Colpo Triplo", - "hud.skill.sw_trip_str": "Colpisci, fino a tre volte", - "hud.skill.sw_trip_str_combo_title": "Combo Colpo Triplo", - "hud.skill.sw_trip_str_combo": "Sblocca danno scalare sulla combo di colpo triplo{SP}", - "hud.skill.sw_trip_str_dmg_title": "Danno Colpo Triplo", - "hud.skill.sw_trip_str_dmg": "Incrementa il danno che ogni colpo in successione infligge{SP}", - "hud.skill.sw_trip_str_sp_title": "Velocità Colpo Triplo", - "hud.skill.sw_trip_str_sp": "Incrementa la velocità d'attacco guadagnata per ogni colpo in successione{SP}", - "hud.skill.sw_trip_str_reg_title": "Rigenerazione Colpo Triplo", - "hud.skill.sw_trip_str_reg": "Incrementa il guadagno di stamina per ogni colpo in successione{SP}", - "hud.skill.sw_dash_title": "Scatto", - "hud.skill.sw_dash": "Scatta attraverso i tuoi nemici", - "hud.skill.sw_dash_dmg_title": "Danno Scatto", - "hud.skill.sw_dash_dmg": "Incrementa il danno iniziale dello scatto del {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Drenaggio Scatto", - "hud.skill.sw_dash_drain": "Diminuisce la velocità a cui l'energia viene drenata mentre scatti del {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Costo Scatto", - "hud.skill.sw_dash_cost": "Diminuisce il costo iniziale dello scatto del {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Velocità Scatto", - "hud.skill.sw_dash_speed": "Incrementa quanto veloce sei mentre scatti{SP}", - "hud.skill.sw_dash_charge_through_title": "Carica", - "hud.skill.sw_dash_charge_through": "Ti permette di caricare attraverso i primi nemici che colpisci{SP}", - "hud.skill.sw_dash_scale_title": "Danno Scalare Scatto", - "hud.skill.sw_dash_scale": "Incrementa il danno scalare dello scatto del {boost}%{SP}", - "hud.skill.sw_spin_title": "Sblocca Vortice", - "hud.skill.sw_spin": "Sblocca l'abilità di vorticare con la spada{SP}", - "hud.skill.sw_spin_dmg_title": "Danno Vortice", - "hud.skill.sw_spin_dmg": "Incrementa il danno inflitto del {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Velocità Vortice", - "hud.skill.sw_spin_spd": "Incrementa la velocità alla cui vortichi del {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Costo Vortice", - "hud.skill.sw_spin_cost": "Diminuisce il costo di energia di ogni giro del {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Vortice Vorticante", - "hud.skill.sw_spin_spins": "Incrementa il numero di volte che puoi vorticare{SP}", - "hud.skill.sw_interrupt_title": "Interruzione Attacchi", - "hud.skill.sw_interrupt": "Ti permette di cancellare immediatamente un attacco con un altro attacco{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Colpo Doppio", - "hud.skill.axe_double_strike": "Abbatti quei furfanti", - "hud.skill.axe_double_strike_combo_title": "Combo Colpo Doppio", - "hud.skill.axe_double_strike_combo": "Sblocca un secondo colpo{SP}", - "hud.skill.axe_double_strike_damage_title": "Danno Colpo Doppio", - "hud.skill.axe_double_strike_damage": "Incrementa il danno inflitto per ogni colpo in successione{SP}", - "hud.skill.axe_double_strike_speed_title": "Velocità Colpo Doppio", - "hud.skill.axe_double_strike_speed": "Incrementa la velocità d'attacco per ogni colpo in successione{SP}", - "hud.skill.axe_double_strike_regen_title": "Rigenerazione Colpo Doppio", - "hud.skill.axe_double_strike_regen": "Incrementa la stamina guadagnata per ogni colpo in successione{SP}", - "hud.skill.axe_spin_title": "Vortice d'Ascia", - "hud.skill.axe_spin": "You spin it right round ...", - "hud.skill.axe_infinite_axe_spin_title": "Vortice d'Ascia Infinito", - "hud.skill.axe_infinite_axe_spin": "Vortica finché hai dell'energia{SP}", - "hud.skill.axe_spin_damage_title": "Danno Vortice", - "hud.skill.axe_spin_damage": "Incrementa il danno che ogni vortice infligge del {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Vortice Elicottero", - "hud.skill.axe_spin_helicopter": "Cadi un po' più lentamente mentre vortichi{SP}", - "hud.skill.axe_spin_speed_title": "Velocità Vortice", - "hud.skill.axe_spin_speed": "Incrementa la velocità alla cui vortichi del {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Costo Vortice", - "hud.skill.axe_spin_cost": "Diminuisce il costo in stamina del vorticamento del {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Sblocca Balzo", - "hud.skill.axe_unlock_leap": "Sblocca un balzo vorticante{SP}", - "hud.skill.axe_leap_damage_title": "Danno Balzo", - "hud.skill.axe_leap_damage": "Incrementa il danno del balzo del {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Contraccolpo Balzo", - "hud.skill.axe_leap_knockback": "Incrementa il contraccolpo del balzo del {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Costo Balzo", - "hud.skill.axe_leap_cost": "Diminuisce il costo del balzo del {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Distanza Balzo", - "hud.skill.axe_leap_distance": "Incrementa la distanza del balzo del {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Estrazione Mineraria", - "hud.skill.pick_strike_title": "Picconata", - "hud.skill.pick_strike": "Colpisci rocce col piccone per ottenere materiale grezzo, gemme ed esperienza", - "hud.skill.pick_strike_speed_title": "Velocità Picconata", - "hud.skill.pick_strike_speed": "Scavi le rocce più velocemente{SP}", - "hud.skill.pick_strike_oregain_title": "Resa Materiali Grezzi Picconata", - "hud.skill.pick_strike_oregain": "Possibilità di ottenere materiale grezzo extra del ({boost}% per livello){SP}", - "hud.skill.pick_strike_gemgain_title": "Resa Gemme Picconata", - "hud.skill.pick_strike_gemgain": "Possibilità di ottenere gemme extra del ({boost}% per livello){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/it_IT/hud/social.ftl b/assets/voxygen/i18n/it_IT/hud/social.ftl new file mode 100644 index 0000000000..c06cc3599c --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Altri Giocatori +hud-social-online = Online: +hud-social-friends = Amici +hud-social-not_yet_available = Non ancora disponibile +hud-social-faction = Fazione +hud-social-play_online_fmt = { $nb_player } giocatore/i online +hud-social-name = Nome +hud-social-level = Livello +hud-social-zone = Zona +hud-social-account = Account \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/social.ron b/assets/voxygen/i18n/it_IT/hud/social.ron deleted file mode 100644 index 6b8d3e2bfc..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.social": "Altri Giocatori", - "hud.social.online": "Online:", - "hud.social.friends": "Amici", - "hud.social.not_yet_available": "Non ancora disponibile", - "hud.social.faction": "Fazione", - "hud.social.play_online_fmt": "{nb_player} giocatore/i online", - "hud.social.name": "Nome", - "hud.social.level": "Livello", - "hud.social.zone": "Zona", - "hud.social.account": "Account", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/it_IT/hud/trade.ftl b/assets/voxygen/i18n/it_IT/hud/trade.ftl new file mode 100644 index 0000000000..6b98c3c650 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Finestra di scambio +hud-trade-phase1_description = + Trascina gli oggetti che vuoi commerciare + nell'area corrispondente. +hud-trade-phase2_description = + Lo scambio è ora bloccato per darti + tempo di revisionarlo. +hud-trade-phase3_description = Lo scambio sta venendo processato. +hud-trade-persons_offer = Offerta di { $playername } +hud-trade-has_accepted = + { $playername } + ha accettato +hud-trade-accept = Accetta +hud-trade-decline = Declina +hud-trade-invite_sent = Richiesta di scambio inviata a { $playername }. +hud-trade-result-completed = Scambio completato con successo. +hud-trade-result-declined = Scambio rifiutato. +hud-trade-result-nospace = Non c'è abbastanza spazio per completare lo scambio. +hud-trade-buy_price = Prezzo di Acquisto +hud-trade-sell_price = Prezzo di Vendita +hud-trade-coin = moneta/e +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = La tua offerta +hud-trade-their_offer = La sua offerta +hud-trade-amount_input = Seleziona un oggetto \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/hud/trade.ron b/assets/voxygen/i18n/it_IT/hud/trade.ron deleted file mode 100644 index 5aefca02b6..0000000000 --- a/assets/voxygen/i18n/it_IT/hud/trade.ron +++ /dev/null @@ -1,33 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - "hud.trade.trade_window": "Finestra di scambio", - "hud.trade.phase1_description": "Trascina gli oggetti che vuoi commerciare\n nell'area corrispondente.", - "hud.trade.phase2_description": "Lo scambio è ora bloccato per darti\n tempo di revisionarlo.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Lo scambio sta venendo processato.", - "hud.trade.persons_offer": "Offerta di {playername}", - "hud.trade.has_accepted": "{playername}\nha accettato", - "hud.trade.accept": "Accetta", - "hud.trade.decline": "Declina", - "hud.trade.invite_sent": "Richiesta di scambio inviata a {playername}.", - "hud.trade.result.completed": "Scambio completato con successo.", - "hud.trade.result.declined": "Scambio rifiutato.", - "hud.trade.result.nospace": "Non c'è abbastanza spazio per completare lo scambio.", - "hud.trade.buy_price": "Prezzo di Acquisto", - "hud.trade.sell_price": "Prezzo di Vendita", - "hud.trade.coin": "moneta/e", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "La tua offerta", - "hud.trade.their_offer": "La sua offerta", - "hud.trade.amount_input": "Seleziona un oggetto" - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/it_IT/main.ftl b/assets/voxygen/i18n/it_IT/main.ftl new file mode 100644 index 0000000000..5332c8ea62 --- /dev/null +++ b/assets/voxygen/i18n/it_IT/main.ftl @@ -0,0 +1,95 @@ +main-username = Nome Utente +main-server = Server +main-password = Password +main-connecting = Connessione in corso +main-creating_world = Creazione mondo +main-tip = Consiglio: +main-unbound_key_tip = Slega +main-notice = + Benvenuto nella versione Alpha di Veloren! + + Prima di tuffarti nel divertimento, ti preghiamo di tenere a mente che: + + - Questa è un'Alpha molto prematura. Aspettati errori, gameplay non completo, meccaniche non rifinite, e funzioni mancanti. + + - Se hai critiche costruttive o errori da segnalare, ci puoi contattare tramite Reddit, GitLab, o il server Discord della nostra community. + + - Veloren è concesso in licenza con la licenza open-source GPL 3. Il che vuol dire che sei libero di giocare, modificare, e ridistribuire il gioco come + tu desideri (purché il lavoro che ne derivi sia sempre sotto licenza GPL 3). + + - Veloren è un progetto comunitario no-profit, e chiunque ci lavori sopra è un volontario. + Se ti piace ciò che vedi, sei il benvenuto ad unirti ai team di sviluppo e artistico! + + Grazie per aver dedicato del tempo a leggere questo avviso, speriamo che ti divertirai col gioco! + + ~ Il team di sviluppo di Veloren +main-login_process = + Informazioni sul processo di Login: + + Notare che hai bisogno di un account + per giocare su server con autenticazione abilitata. + + Puoi creare un account su + + https://veloren.net/account/. +main-login-server_not_found = Server non trovato +main-login-authentication_error = Errore di autenticazione sul server +main-login-internal_error = Errore interno al client (probabilmente, il personaggio è stato cancellato) +main-login-failed_auth_server_url_invalid = Connessione al server di autenticazione fallita +main-login-insecure_auth_scheme = Lo schema di autenticazione HTTP non è supportato. Non è sicuro! Per motivi di sviluppo, l'HTTP è permesso per 'localhost' o build di debug +main-login-server_full = Il server è pieno +main-login-untrusted_auth_server = Il server di autenticazione non è affidabile +main-login-outdated_client_or_server = ServerWentMad: Probabilmente le versioni sono incompatibili, controlla per degli aggiornamenti. +main-login-timeout = Timeout: Il server non ha risposto in tempo. (Sovraccaricato o problemi di rete). +main-login-server_shut_down = Il server è stato chiuso +main-login-network_error = Errore di rete +main-login-network_wrong_version = Versioni di server e client non corrispondenti, per favore aggiorna il tuo client. +main-login-failed_sending_request = La richiesta al server di Autenticazione è fallita +main-login-invalid_character = Il personaggio selezionato è invalido +main-login-client_crashed = Si è verificato un errore che ha terminato il client +main-login-not_on_whitelist = Hai bisogno di essere inserito nella Whitelist da parte di un Amministratore per unirti +main-login-banned = Sei stato bandito per la seguente ragione +main-login-kicked = Sei stato rimosso per la seguente ragione +main-login-select_language = Seleziona una lingua +main-login-client_version = Versione Client +main-login-server_version = Versione Server +main-login-client_init_failed = Inizializzazione del Client fallita: { $init_fail_reason } +main-login-username_bad_characters = Il Nome Utente contiene caratteri non validi! (Sono permessi solo caratteri alfanumerici, '_' e '-') +main-login-username_too_long = Il Nome Utente è troppo lungo! La lunghezza massima è: { $max_len } +main-servers-select_server = Seleziona un server +main-servers-singleplayer_error = Connessione al server interno Fallita: { $sp_error } +main-servers-network_error = Errore network/socket del Server : { $raw_error } +main-servers-participant_error = Errore di disconnessione/protocollo del Partecipante: { $raw_error } +main-servers-stream_error = Errore di connessione/compressione/(de)serializzazione del Client: { $raw_error } +main-servers-database_error = Errore sul database del Server: { $raw_error } +main-servers-persistence_error = Errore di persistenza del Server (Probabilmente causato da Asset/Dati dei Personaggi): { $raw_error } +main-servers-other_error = Errore generale del Server: { $raw_error } +main-credits = Crediti +main-credits-created_by = creato da +main-credits-music = Musica +main-credits-fonts = Font +main-credits-other_art = Altra Arte +main-credits-contributors = Collaboratori +loading-tips = + .a0 = Premi '{ $gameinput-togglelantern }' per accendere la tua lanterna. + .a1 = Premi '{ $gameinput-help }' per vedere tutte le combinazioni di tasti base. + .a2 = Puoi scrivere /say o /s per chattare solo con giocatori attorno a te. + .a3 = Puoi scrivere /region o /r per chattare solo con giocatori entro qualche centinaio di blocchi attorno a te. + .a4 = Gli Amministratori possono usare il comando /build per entrare in modalità costruzione. + .a5 = Puoi scrivere /group o /g per chattare solo con giocatori attualmente nel tuo gruppo. + .a6 = Per mandare messaggi privati scrivi /tell seguito dal nome di un giocatore e dal tuo messaggio. + .a7 = Fai attenzione al cibo, ai forzieri e ad altro bottino sparso per tutto il mondo! + .a8 = Inventario pieno di cibo? Prova a utilizzarlo per crearne di migiliore! + .a9 = Ti stai chiedendo cosa ci sia da fare? Prova uno dei dungeon segnati sulla mappa! + .a10 = Non dimenticare di sistemare la grafica secondo il tuo sistema. Premi '{ $gameinput-settings }' per aprire le impostazioni. + .a11 = Giocare con altri è divertente! Premi '{ $gameinput-social }' per vedere chi è online. + .a12 = Premi '{ $gameinput-dance }' per ballare. Festeggia! + .a13 = Premi '{ $gameinput-glide }' per aprire il tuo Aliante e conquistare i cieli. + .a14 = Veloren è ancora in Pre-Alpha. Facciamo del nostro meglio per migliorarlo ogni giorno! + .a15 = Se vuoi unirti al team di sviluppo o se vuoi solamente chattare con noi, unisciti al nostro server Discord. + .a16 = Puoi scegliere di mostrare la tua quantità di vita sulla barra della vita dalle impostazioni. + .a17 = Siedi vicino a un fuoco (col tasto '{ $gameinput-sit }') per riprenderti lentamente dalle lesioni. + .a18 = Hai bisogno di più borse o di armature migliori per continuare la tua avventura? Premi '{ $gameinput-crafting }' per aprire il menu di creazione! + .a19 = Premi '{ $gameinput-roll }' per rotolare. Il Rotolamento può essere usato per muoversi più velocemente ed evitare gli attacchi nemici. + .a20 = Ti stai chiedendo a cosa serve un certo oggetto? Cerca 'input:' nel crafting per vedere in quali ricette è usato. + .a21 = Hai trovato qualcosa di figo? Fanne uno screenshot con '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/main.ron b/assets/voxygen/i18n/it_IT/main.ron deleted file mode 100644 index c872b5555f..0000000000 --- a/assets/voxygen/i18n/it_IT/main.ron +++ /dev/null @@ -1,114 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - /// Start Main screen section - "main.username": "Nome Utente", - "main.server": "Server", - "main.password": "Password", - "main.connecting": "Connessione in corso", - "main.creating_world": "Creazione mondo", - "main.tip": "Consiglio:", - "main.unbound_key_tip": "Slega", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Benvenuto nella versione Alpha di Veloren! - -Prima di tuffarti nel divertimento, ti preghiamo di tenere a mente che: - -- Questa è un'Alpha molto prematura. Aspettati errori, gameplay non completo, meccaniche non rifinite, e funzioni mancanti. - -- Se hai critiche costruttive o errori da segnalare, ci puoi contattare tramite Reddit, GitLab, o il server Discord della nostra community. - -- Veloren è concesso in licenza con la licenza open-source GPL 3. Il che vuol dire che sei libero di giocare, modificare, e ridistribuire il gioco come - tu desideri (purché il lavoro che ne derivi sia sempre sotto licenza GPL 3). - -- Veloren è un progetto comunitario no-profit, e chiunque ci lavori sopra è un volontario. -Se ti piace ciò che vedi, sei il benvenuto ad unirti ai team di sviluppo e artistico! - -Grazie per aver dedicato del tempo a leggere questo avviso, speriamo che ti divertirai col gioco! - -~ Il team di sviluppo di Veloren"#, - - // Login process description - "main.login_process": r#"Informazioni sul processo di Login: - -Notare che hai bisogno di un account -per giocare su server con autenticazione abilitata. - -Puoi creare un account su - -https://veloren.net/account/."#, - "main.login.server_not_found": "Server non trovato", - "main.login.authentication_error": "Errore di autenticazione sul server", - "main.login.internal_error": "Errore interno al client (probabilmente, il personaggio è stato cancellato)", - "main.login.failed_auth_server_url_invalid": "Connessione al server di autenticazione fallita", - "main.login.insecure_auth_scheme": "Lo schema di autenticazione HTTP non è supportato. Non è sicuro! Per motivi di sviluppo, l'HTTP è permesso per 'localhost' o build di debug", - "main.login.server_full": "Il server è pieno", - "main.login.untrusted_auth_server": "Il server di autenticazione non è affidabile", - "main.login.outdated_client_or_server": "ServerWentMad: Probabilmente le versioni sono incompatibili, controlla per degli aggiornamenti.", - "main.login.timeout": "Timeout: Il server non ha risposto in tempo. (Sovraccaricato o problemi di rete).", - "main.login.server_shut_down": "Il server è stato chiuso", - "main.login.network_error": "Errore di rete", - "main.login.network_wrong_version": "Versioni di server e client non corrispondenti, per favore aggiorna il tuo client.", - "main.login.failed_sending_request": "La richiesta al server di Autenticazione è fallita", - "main.login.invalid_character": "Il personaggio selezionato è invalido", - "main.login.client_crashed": "Si è verificato un errore che ha terminato il client", - "main.login.not_on_whitelist": "Hai bisogno di essere inserito nella Whitelist da parte di un Amministratore per unirti", - "main.login.banned": "Sei stato bandito per la seguente ragione", - "main.login.kicked": "Sei stato rimosso per la seguente ragione", - "main.login.select_language": "Seleziona una lingua", - "main.login.client_version": "Versione Client", - "main.login.server_version": "Versione Server", - "main.login.client_init_failed": "Inizializzazione del Client fallita: {init_fail_reason}", - "main.login.username_bad_characters": "Il Nome Utente contiene caratteri non validi! (Sono permessi solo caratteri alfanumerici, '_' e '-')", - "main.login.username_too_long": "Il Nome Utente è troppo lungo! La lunghezza massima è: {max_len}", - "main.servers.select_server": "Seleziona un server", - "main.servers.singleplayer_error": "Connessione al server interno Fallita: {sp_error}", - "main.servers.network_error": "Errore network/socket del Server : {raw_error}", - "main.servers.participant_error": "Errore di disconnessione/protocollo del Partecipante: {raw_error}", - "main.servers.stream_error": "Errore di connessione/compressione/(de)serializzazione del Client: {raw_error}", - "main.servers.database_error": "Errore sul database del Server: {raw_error}", - "main.servers.persistence_error": "Errore di persistenza del Server (Probabilmente causato da Asset/Dati dei Personaggi): {raw_error}", - "main.servers.other_error": "Errore generale del Server: {raw_error}", - - // Credits screen - "main.credits": "Crediti", - "main.credits.created_by": "creato da", - "main.credits.music": "Musica", - "main.credits.fonts": "Font", - "main.credits.other_art": "Altra Arte", - "main.credits.contributors": "Collaboratori", - - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Premi '{gameinput.togglelantern}' per accendere la tua lanterna.", - "Premi '{gameinput.help}' per vedere tutte le combinazioni di tasti base.", - "Puoi scrivere /say o /s per chattare solo con giocatori attorno a te.", - "Puoi scrivere /region o /r per chattare solo con giocatori entro qualche centinaio di blocchi attorno a te.", - "Gli Amministratori possono usare il comando /build per entrare in modalità costruzione.", - "Puoi scrivere /group o /g per chattare solo con giocatori attualmente nel tuo gruppo.", - "Per mandare messaggi privati scrivi /tell seguito dal nome di un giocatore e dal tuo messaggio.", - "Fai attenzione al cibo, ai forzieri e ad altro bottino sparso per tutto il mondo!", - "Inventario pieno di cibo? Prova a utilizzarlo per crearne di migiliore!", - "Ti stai chiedendo cosa ci sia da fare? Prova uno dei dungeon segnati sulla mappa!", - "Non dimenticare di sistemare la grafica secondo il tuo sistema. Premi '{gameinput.settings}' per aprire le impostazioni.", - "Giocare con altri è divertente! Premi '{gameinput.social}' per vedere chi è online.", - "Premi '{gameinput.dance}' per ballare. Festeggia!", - "Premi '{gameinput.glide}' per aprire il tuo Aliante e conquistare i cieli.", - "Veloren è ancora in Pre-Alpha. Facciamo del nostro meglio per migliorarlo ogni giorno!", - "Se vuoi unirti al team di sviluppo o se vuoi solamente chattare con noi, unisciti al nostro server Discord.", - "Puoi scegliere di mostrare la tua quantità di vita sulla barra della vita dalle impostazioni.", - "Siedi vicino a un fuoco (col tasto '{gameinput.sit}') per riprenderti lentamente dalle lesioni.", - "Hai bisogno di più borse o di armature migliori per continuare la tua avventura? Premi '{gameinput.crafting}' per aprire il menu di creazione!", - "Premi '{gameinput.roll}' per rotolare. Il Rotolamento può essere usato per muoversi più velocemente ed evitare gli attacchi nemici.", - "Ti stai chiedendo a cosa serve un certo oggetto? Cerca 'input:' nel crafting per vedere in quali ricette è usato.", - "Hai trovato qualcosa di figo? Fanne uno screenshot con '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/it_IT/npc.ftl b/assets/voxygen/i18n/it_IT/npc.ftl new file mode 100644 index 0000000000..044646669d --- /dev/null +++ b/assets/voxygen/i18n/it_IT/npc.ftl @@ -0,0 +1,170 @@ +npc-speech-villager = + .a0 = Non è una così bella giornata? + .a1 = Come stai oggi? + .a2 = Il meglio della mattina a te! + .a3 = Mi chiedo cosa pensi il Catoblepas quando mangia l'erba. + .a4 = Cosa ne pensi di questo tempo? + .a5 = Pensare a quei dungeon mi spaventa. Spero che qualcuno li ripulisca. + .a6 = Mi piacerebbe andare a fare speleologia in una grotta quando sarò più forte. + .a7 = Hai visto il mio gatto? + .a8 = Hai mai sentito dei feroci Squali di Terra? Ho sentito dire che vivono nei deserti. + .a9 = Dicono che gemme luccicanti di tutti i tipi possono essere trovate nelle caverne. + .a10 = Vado semplicemente pazzo per il formaggio! + .a11 = Non vieni dentro? Stavamo per mangiare del formaggio! + .a12 = Dicono che i funghi fanno bene alla salute. Non li ho mai mangiati io. + .a13 = Non dimenticare i crackers! + .a14 = Semplicemente adoro il formaggio nanico. Mi piacerebbe poterlo fare. + .a15 = Mi chiedo cosa ci sia dall'altro lato delle montagne. + .a16 = Spero di potermi fare il mio aliante un giorno. + .a17 = Ti piacerebbe vedere il mio giardino? Okay, forse qualche altra volta. + .a18 = Una piacevole giornata per una passeggiata nel bosco! + .a19 = Essere, o non essere? Penso che sarò un contadino. + .a20 = Non pensi che il nostro villaggio sia il migliore? + .a21 = Cosa pensi che renda i Resti Splendenti splendenti? + .a22 = Penso che sia il momento per una seconda colazione! + .a23 = Hai mai catturato una lucciola? + .a24 = Proprio non capisco da dove continuino ad arrivare quei Sauroks. + .a25 = Spero che qualcuno tenga i lupi alla larga dal villaggio. + .a26 = Ho avuto un sogno meraviglio sul formaggio la scorsa notte. Cosa vorrà dire? + .a27 = Ho lasciato del formaggio con mio fratello. Ora non so se esista o meno. Io lo chiamo il formaggio di Schrödinger. + .a28 = Ho lasciato del formaggio con mio sorella. Ora non so se esista o meno. Io lo chiamo il formaggio di Schrödinger. + .a29 = Qualcuno dovrebbe fare qualcosa a proposito di quei cultisti. Preferibilmente non io. + .a30 = Spero che piova presto. Sarebbe buono per il raccolto. + .a31 = Amo il miele! E odio le api. + .a32 = Voglio vedere il mondo un giorno. Ci deve essere dell'altro nella vita oltre questo villaggio. +npc-speech-villager_decline_trade = + .a0 = Mi dispiace, non ho nulla da commerciare. + .a1 = Commerciare? Come se avessi qualcosa che potrebbe interessarti. + .a2 = La mia casa è mia, e non la scambierei per nulla. +npc-speech-merchant_advertisement = + .a0 = Posso interessarti in uno scambio? + .a1 = Vuoi commerciare con me? + .a2 = Ho molti beni, vuoi dare un'occhiata? +npc-speech-merchant_busy = + .a0 = Ehi, aspetta il tuo turno. + .a1 = Ti prego di aspettare, sono solo una persona. + .a2 = La vedi l'altra persona davanti a te? + .a3 = Solo un momento, lasciami finire. + .a4 = Non si salta la fila. + .a5 = Sono occupato, torna più tardi. +npc-speech-merchant_trade_successful = + .a0 = Grazie per aver fatto affari con me! + .a1 = Grazie a te! +npc-speech-merchant_trade_declined = + .a0 = Magari un'altra volta, abbi una buona giornata! + .a1 = Peccato, magari la prossima volta allora! +npc-speech-villager_cultist_alarm = + .a0 = Fai attenzione! C'è un cultista in giro! + .a1 = Alle armi! I cultisti stanno attaccando! + .a2 = Come osano i cultisti attaccare il nostro villaggio! + .a3 = Morte ai cultisti! + .a4 = I cultisti non saranno tollerati qui! + .a5 = Cultista assassino! + .a6 = Assaggia la lama della mia spada, sporco cultista! + .a7 = Nulla può pulire il sangue dalle tue mani, cultista! + .a8 = Per miliardi di cirripedi blu ricoperti di vesciche! Un cultista è tra noi! + .a9 = I mali di questo cultista stanno per finire! + .a10 = Questo cultista è mio! + .a11 = Preparati a incontrare il tuo creatore, schifoso cultista! + .a12 = Vedo un cultista! Prendeteli! + .a13 = Vedo un cultista! Attaccate! + .a14 = Vedo un cultista! Non lasciateli scappare! + .a15 = L'onorabile cultista gradirebbe della MORTE?! + .a16 = Mai perdonare! Mai dimenticare! Cultista, pentiti! + .a17 = Muori, cultista! + .a18 = Il tuo regno di terrore cesserà! + .a19 = Questo è per tutto quello che hai fatto! + .a20 = Non ci vanno a genio quelli come te qui in giro. + .a21 = Saresti dovuto rimanere nel sottosuolo! +npc-speech-villager_under_attack = + .a0 = Aiuto, Sono sotto attacco! + .a1 = Aiuto! Sono sotto attacco! + .a2 = Ouch! Sono sotto attacco! + .a3 = Ouch! Sono sotto attacco! Aiuto! + .a4 = Aiutatemi! Sono sotto attacco! + .a5 = Sono sotto attacco! Aiuto! + .a6 = Sono sotto attacco! Aiutatemi! + .a7 = Aiuto! + .a8 = Aiuto! Aiuto! + .a9 = Aiuto! Aiuto! Aiuto! + .a10 = Sono sotto attacco! + .a11 = AAAHHH! Sono sotto attacco! + .a12 = AAAHHH! Sono sotto attacco! Aiuto! + .a13 = Aiuto! Siamo sotto attacco! + .a14 = Aiuto! Assassino! + .a15 = Aiuto! C'è un assassino a piede libero! + .a16 = Aiuto! Stanno cercando di uccidermi + .a17 = Guardie, Sono sotto attacco! + .a18 = Guardie! Sono sotto attacco! + .a19 = Sono sotto attacco! Guardie! + .a20 = Aiuto! Guardie! Sono sotto attacco! + .a21 = Guardie! Venite veloci! + .a22 = Guardie! Guardie! + .a23 = Guardie! C'è un deliquente che mi sta attaccando! + .a24 = Guardie, uccidete questa schifosa canaglia! + .a25 = Guardie! C'è un assassino! + .a26 = Guardie! Aiuto! + .a27 = Non la farai franca! Guardie! + .a28 = Mostro! + .a29 = Aiuto! + .a30 = Aiuto! Per favore! + .a31 = Ouch! Guardie! Aiuto! + .a32 = Stanno venendo per me! + .a33 = Aiuto! Aiuto! Sto venendo represso! + .a34 = Ah, ora vediamo la violenza innata nel sistema. + .a35 = È solo un graffio! + .a36 = Smettila! + .a37 = Che ti ho mai fatto?! + .a38 = Per favore smettila di attaccarmi! + .a39 = Ehi! Stai attento a dove punti quella cosa! + .a40 = Odioso miserabile, finiscila! + .a41 = Smettila! Vai via! + .a42 = Ora mi stai facendo arrabbiare! + .a43 = Oi! Chi pensi di essere?! + .a44 = Avrò la tua testa per ciò! + .a45 = Smettila, per favore! Non porto nulla di valore! + .a46 = Ti metterò contro mio fratello, è più grande di me! + .a47 = Nooo, lo dico alla mamma! + .a48 = Maledetto! + .a49 = Per favore non farlo. + .a50 = Non è stato molto carino! + .a51 = La tua arma funziona, puoi metterla via ora! + .a52 = Risparmiami! + .a53 = Per favore, ho una famiglia! + .a54 = Sono troppo giovane per morire! + .a55 = Possiamo parlarne? + .a56 = La violenza non è mai la risposta! + .a57 = Oggi la giornata sta diventando brutta... + .a58 = Ehi, ha fatto male! + .a59 = Eek! + .a60 = Quanto rude! + .a61 = Fermati, ti prego! + .a62 = Che ti ammali! + .a63 = Non è divertente. + .a64 = Come ti permetti?! + .a65 = La pagherai! + .a66 = Continua così e te ne pentirai! + .a67 = Non mi costringere a farti del male! + .a68 = Deve esserci un qualche malinteso! + .a69 = Non hai bisogno di fare così! + .a70 = Scompari, mostro! + .a71 = Ha fatto molto male! + .a72 = Perché mai dovresti farlo? + .a73 = Per gli spiriti, finiscila! + .a74 = Devi avermi confuso con qualcun'altro! + .a75 = Non me lo merito! + .a76 = Per favore non lo fare di nuovo. + .a77 = Guardie, lanciate questo mostro nel lago! + .a78 = Sguinzaglierò il mio tarasqua su di te! + .a79 = Perché meeeeeee? +npc-speech-villager_enemy_killed = + .a0 = Ho distrutto il mio nemico! + .a1 = Finalmente in pace! + .a2 = ... ora, che cosa stavo facendo? +npc-speech-menacing = + .a0 = Ti sto avvertendo! + .a1 = Vieni più vicino e ti attacco! + .a2 = Tu non mi spaventi! + .a3 = Vattene via da qui! + .a4 = Vattene se vuoi vivere! + .a5 = Tu non sei il benvenuto qui! \ No newline at end of file diff --git a/assets/voxygen/i18n/it_IT/npc.ron b/assets/voxygen/i18n/it_IT/npc.ron deleted file mode 100644 index 4aa3f13d28..0000000000 --- a/assets/voxygen/i18n/it_IT/npc.ron +++ /dev/null @@ -1,190 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for italian -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Non è una così bella giornata?", - "Come stai oggi?", - "Il meglio della mattina a te!", - "Mi chiedo cosa pensi il Catoblepas quando mangia l'erba.", - "Cosa ne pensi di questo tempo?", - "Pensare a quei dungeon mi spaventa. Spero che qualcuno li ripulisca.", - "Mi piacerebbe andare a fare speleologia in una grotta quando sarò più forte.", - "Hai visto il mio gatto?", - "Hai mai sentito dei feroci Squali di Terra? Ho sentito dire che vivono nei deserti.", - "Dicono che gemme luccicanti di tutti i tipi possono essere trovate nelle caverne.", - "Vado semplicemente pazzo per il formaggio!", - "Non vieni dentro? Stavamo per mangiare del formaggio!", - "Dicono che i funghi fanno bene alla salute. Non li ho mai mangiati io.", - "Non dimenticare i crackers!", - "Semplicemente adoro il formaggio nanico. Mi piacerebbe poterlo fare.", - "Mi chiedo cosa ci sia dall'altro lato delle montagne.", - "Spero di potermi fare il mio aliante un giorno.", - "Ti piacerebbe vedere il mio giardino? Okay, forse qualche altra volta.", - "Una piacevole giornata per una passeggiata nel bosco!", - "Essere, o non essere? Penso che sarò un contadino.", - "Non pensi che il nostro villaggio sia il migliore?", - "Cosa pensi che renda i Resti Splendenti splendenti?", - "Penso che sia il momento per una seconda colazione!", - "Hai mai catturato una lucciola?", - "Proprio non capisco da dove continuino ad arrivare quei Sauroks.", - "Spero che qualcuno tenga i lupi alla larga dal villaggio.", - "Ho avuto un sogno meraviglio sul formaggio la scorsa notte. Cosa vorrà dire?", - "Ho lasciato del formaggio con mio fratello. Ora non so se esista o meno. Io lo chiamo il formaggio di Schrödinger.", - "Ho lasciato del formaggio con mio sorella. Ora non so se esista o meno. Io lo chiamo il formaggio di Schrödinger.", - "Qualcuno dovrebbe fare qualcosa a proposito di quei cultisti. Preferibilmente non io.", - "Spero che piova presto. Sarebbe buono per il raccolto.", - "Amo il miele! E odio le api.", - "Voglio vedere il mondo un giorno. Ci deve essere dell'altro nella vita oltre questo villaggio.", - ], - "npc.speech.villager_decline_trade": [ - "Mi dispiace, non ho nulla da commerciare.", - "Commerciare? Come se avessi qualcosa che potrebbe interessarti.", - "La mia casa è mia, e non la scambierei per nulla.", - ], - "npc.speech.merchant_advertisement": [ - "Posso interessarti in uno scambio?", - "Vuoi commerciare con me?", - "Ho molti beni, vuoi dare un'occhiata?" - ], - "npc.speech.merchant_busy": [ - "Ehi, aspetta il tuo turno.", - "Ti prego di aspettare, sono solo una persona.", - "La vedi l'altra persona davanti a te?", - "Solo un momento, lasciami finire.", - "Non si salta la fila.", - "Sono occupato, torna più tardi." - ], - "npc.speech.merchant_trade_successful": [ - "Grazie per aver fatto affari con me!", - "Grazie a te!", - ], - "npc.speech.merchant_trade_declined": [ - "Magari un'altra volta, abbi una buona giornata!", - "Peccato, magari la prossima volta allora!" - ], - "npc.speech.villager_cultist_alarm": [ - "Fai attenzione! C'è un cultista in giro!", - "Alle armi! I cultisti stanno attaccando!", - "Come osano i cultisti attaccare il nostro villaggio!", - "Morte ai cultisti!", - "I cultisti non saranno tollerati qui!", - "Cultista assassino!", - "Assaggia la lama della mia spada, sporco cultista!", - "Nulla può pulire il sangue dalle tue mani, cultista!", - "Per miliardi di cirripedi blu ricoperti di vesciche! Un cultista è tra noi!", - "I mali di questo cultista stanno per finire!", - "Questo cultista è mio!", - "Preparati a incontrare il tuo creatore, schifoso cultista!", - "Vedo un cultista! Prendeteli!", - "Vedo un cultista! Attaccate!", - "Vedo un cultista! Non lasciateli scappare!", - "L'onorabile cultista gradirebbe della MORTE?!", - "Mai perdonare! Mai dimenticare! Cultista, pentiti!", - "Muori, cultista!", - "Il tuo regno di terrore cesserà!", - "Questo è per tutto quello che hai fatto!", - "Non ci vanno a genio quelli come te qui in giro.", - "Saresti dovuto rimanere nel sottosuolo!", - ], - "npc.speech.villager_under_attack": [ - "Aiuto, Sono sotto attacco!", - "Aiuto! Sono sotto attacco!", - "Ouch! Sono sotto attacco!", - "Ouch! Sono sotto attacco! Aiuto!", - "Aiutatemi! Sono sotto attacco!", - "Sono sotto attacco! Aiuto!", - "Sono sotto attacco! Aiutatemi!", - "Aiuto!", - "Aiuto! Aiuto!", - "Aiuto! Aiuto! Aiuto!", - "Sono sotto attacco!", - "AAAHHH! Sono sotto attacco!", - "AAAHHH! Sono sotto attacco! Aiuto!", - "Aiuto! Siamo sotto attacco!", - "Aiuto! Assassino!", - "Aiuto! C'è un assassino a piede libero!", - "Aiuto! Stanno cercando di uccidermi", - "Guardie, Sono sotto attacco!", - "Guardie! Sono sotto attacco!", - "Sono sotto attacco! Guardie!", - "Aiuto! Guardie! Sono sotto attacco!", - "Guardie! Venite veloci!", - "Guardie! Guardie!", - "Guardie! C'è un deliquente che mi sta attaccando!", - "Guardie, uccidete questa schifosa canaglia!", - "Guardie! C'è un assassino!", - "Guardie! Aiuto!", - "Non la farai franca! Guardie!", - "Mostro!", - "Aiuto!", - "Aiuto! Per favore!", - "Ouch! Guardie! Aiuto!", - "Stanno venendo per me!", - "Aiuto! Aiuto! Sto venendo represso!", - "Ah, ora vediamo la violenza innata nel sistema.", - "È solo un graffio!", - "Smettila!", - "Che ti ho mai fatto?!", - "Per favore smettila di attaccarmi!", - "Ehi! Stai attento a dove punti quella cosa!", - "Odioso miserabile, finiscila!", - "Smettila! Vai via!", - "Ora mi stai facendo arrabbiare!", - "Oi! Chi pensi di essere?!", - "Avrò la tua testa per ciò!", - "Smettila, per favore! Non porto nulla di valore!", - "Ti metterò contro mio fratello, è più grande di me!", - "Nooo, lo dico alla mamma!", - "Maledetto!", - "Per favore non farlo.", - "Non è stato molto carino!", - "La tua arma funziona, puoi metterla via ora!", - "Risparmiami!", - "Per favore, ho una famiglia!", - "Sono troppo giovane per morire!", - "Possiamo parlarne?", - "La violenza non è mai la risposta!", - "Oggi la giornata sta diventando brutta...", - "Ehi, ha fatto male!", - "Eek!", - "Quanto rude!", - "Fermati, ti prego!", - "Che ti ammali!", - "Non è divertente.", - "Come ti permetti?!", - "La pagherai!", - "Continua così e te ne pentirai!", - "Non mi costringere a farti del male!", - "Deve esserci un qualche malinteso!", - "Non hai bisogno di fare così!", - "Scompari, mostro!", - "Ha fatto molto male!", - "Perché mai dovresti farlo?", - "Per gli spiriti, finiscila!", - "Devi avermi confuso con qualcun'altro!", - "Non me lo merito!", - "Per favore non lo fare di nuovo.", - "Guardie, lanciate questo mostro nel lago!", - "Sguinzaglierò il mio tarasqua su di te!", - "Perché meeeeeee?", - ], - "npc.speech.villager_enemy_killed": [ - "Ho distrutto il mio nemico!", - "Finalmente in pace!", - "... ora, che cosa stavo facendo?", - ], - "npc.speech.menacing": [ - "Ti sto avvertendo!", - "Vieni più vicino e ti attacco!", - "Tu non mi spaventi!", - "Vattene via da qui!", - "Vattene se vuoi vivere!", - "Tu non sei il benvenuto qui!", - ], - } -) diff --git a/assets/voxygen/i18n/ja_JP/buff.ftl b/assets/voxygen/i18n/ja_JP/buff.ftl new file mode 100644 index 0000000000..921445c539 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/buff.ftl @@ -0,0 +1,25 @@ +buff-remove = クリックして削除 +buff-title-missing = 題名がありません +buff-desc-missing = 説明がありません +buff-title-heal = ヒール +buff-desc-heal = 時間とともに体力を回復 +buff-title-potion = ポーション +buff-desc-potion = 飲むと… +buff-title-saturation = サチュレーション +buff-desc-saturation = アイテムを使って一定時間体力を増やす +buff-title-campfire_heal = キャンプファイヤー ヒール +buff-desc-campfire_heal = 焚き火のそばに座ると1秒毎に{ $rate }%体力回復 +buff-title-invulnerability = インバルネラビリティ +buff-desc-invulnerability = どんな攻撃のダメージも受けない +buff-title-protectingward = プロテクティング ワード +buff-desc-protectingward = 攻撃からある程度、守られる +buff-title-bleed = ブリーディング +buff-desc-bleed = 通常のダメージを与える。 +buff-title-cursed = カースド +buff-desc-cursed = あなたは呪われた。 +buff-stat-health = 体力を{ $str_total }回復 +buff-stat-increase_max_energy = スタミナ最大値を{ $strength }上げる +buff-stat-increase_max_health = 体力最大値を{ $strength }上げる +buff-stat-invulnerability = 不死身になる +buff-text-over_seconds = { $dur_secs }秒以上 +buff-text-for_seconds = { $dur_secs }秒間 \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/buff.ron b/assets/voxygen/i18n/ja_JP/buff.ron deleted file mode 100644 index 1cb53bbdd0..0000000000 --- a/assets/voxygen/i18n/ja_JP/buff.ron +++ /dev/null @@ -1,40 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // Buffs - "buff.remove": "クリックして削除", - "buff.title.missing": "題名がありません", - "buff.desc.missing": "説明がありません", - "buff.title.heal": "ヒール", - "buff.desc.heal": "時間とともに体力を回復", - "buff.title.potion": "ポーション", - "buff.desc.potion": "飲むと…", - "buff.title.saturation": "サチュレーション", - "buff.desc.saturation": "アイテムを使って一定時間体力を増やす", - "buff.title.campfire_heal": "キャンプファイヤー ヒール", - "buff.desc.campfire_heal": "焚き火のそばに座ると1秒毎に{rate}%体力回復", - "buff.title.invulnerability": "インバルネラビリティ", - "buff.desc.invulnerability": "どんな攻撃のダメージも受けない", - "buff.title.protectingward": "プロテクティング ワード", - "buff.desc.protectingward": "攻撃からある程度、守られる", - // Debuffs - "buff.title.bleed": "ブリーディング", - "buff.desc.bleed": "通常のダメージを与える。", - "buff.title.cursed": "カースド", - "buff.desc.cursed": "あなたは呪われた。", - // Buffs stats - "buff.stat.health": "体力を{str_total}回復", - "buff.stat.increase_max_energy": "スタミナ最大値を{strength}上げる", - "buff.stat.increase_max_health": "体力最大値を{strength}上げる", - "buff.stat.invulnerability": "不死身になる", - // Text - "buff.text.over_seconds": "{dur_secs}秒以上", - "buff.text.for_seconds": "{dur_secs}秒間", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/char_selection.ftl b/assets/voxygen/i18n/ja_JP/char_selection.ftl new file mode 100644 index 0000000000..240c99ab2b --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/char_selection.ftl @@ -0,0 +1,21 @@ +char_selection-loading_characters = キャラクターをロード中... +char_selection-delete_permanently = このキャラクターを永久に削除しますか? +char_selection-deleting_character = キャラクターを削除中... +char_selection-change_server = サーバーを変更 +char_selection-enter_world = 世界に入る +char_selection-logout = ログアウト +char_selection-create_new_character = 新しいキャラクターを作成 +char_selection-creating_character = キャラクターを作成中... +char_selection-character_creation = キャラクター作成 +char_selection-human_default = 人間 規定 +char_selection-level_fmt = レベル { $level_nb } +char_selection-uncanny_valley = Wilderness +char_selection-plains_of_uncertainty = Plains of Uncertainty +char_selection-beard = 髭 +char_selection-hair_style = 髪型 +char_selection-hair_color = 髪の色 +char_selection-eye_color = 瞳の色 +char_selection-skin = 肌 +char_selection-eyeshape = 目元 +char_selection-accessories = アクセサリー +char_selection-create_info_name = キャラクターには名前が必要です! \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/char_selection.ron b/assets/voxygen/i18n/ja_JP/char_selection.ron deleted file mode 100644 index 70e3cf16f8..0000000000 --- a/assets/voxygen/i18n/ja_JP/char_selection.ron +++ /dev/null @@ -1,31 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "char_selection.loading_characters": "キャラクターをロード中...", - "char_selection.delete_permanently": "このキャラクターを永久に削除しますか?", - "char_selection.deleting_character": "キャラクターを削除中...", - "char_selection.change_server": "サーバーを変更", - "char_selection.enter_world": "世界に入る", - "char_selection.logout": "ログアウト", - "char_selection.create_new_character": "新しいキャラクターを作成", - "char_selection.creating_character": "キャラクターを作成中...", - "char_selection.character_creation": "キャラクター作成", - "char_selection.human_default": "人間 規定", - "char_selection.level_fmt": "レベル {level_nb}", - "char_selection.uncanny_valley": "Wilderness", - "char_selection.plains_of_uncertainty": "Plains of Uncertainty", - "char_selection.beard": "髭", - "char_selection.hair_style": "髪型", - "char_selection.hair_color": "髪の色", - "char_selection.eye_color": "瞳の色", - "char_selection.skin": "肌", - "char_selection.eyeshape": "目元", - "char_selection.accessories": "アクセサリー", - "char_selection.create_info_name": "キャラクターには名前が必要です!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/common.ftl b/assets/voxygen/i18n/ja_JP/common.ftl new file mode 100644 index 0000000000..57559d3f86 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/common.ftl @@ -0,0 +1,86 @@ +common-username = ユーザー名 +common-singleplayer = シングルプレイ +common-multiplayer = マルチプレイ +common-servers = サーバー +common-quit = 終了 +common-settings = 設定 +common-languages = 言語 +common-interface = インターフェース +common-gameplay = ゲーム環境 +common-controls = 操作 +common-video = グラフィック +common-sound = サウンド +common-resume = 中断 +common-characters = キャラクター +common-close = 閉じる +common-yes = はい +common-no = いいえ +common-back = 戻る +common-create = 作成 +common-okay = OK +common-add = 追加 +common-accept = 承諾 +common-decline = 辞退 +common-disclaimer = 放棄 +common-cancel = キャンセル +common-none = なし +common-error = エラー +common-fatal_error = 致命的なエラー +common-you = あなた +common-automatic = 自動 +common-random = ランダム +common-empty = 空 +common-interface_settings = インターフェース設定 +common-gameplay_settings = ゲーム環境設定 +common-controls_settings = 操作設定 +common-video_settings = グラフィック設定 +common-sound_settings = サウンド設定 +common-language_settings = 言語設定 +common-connection_lost = + 接続が切断されました! + サーバーを再起動しましたか? + クライアントをアップデートしましたか? +common-species-orc = オーク +common-species-human = 人間 +common-species-dwarf = ドワーフ +common-species-elf = エルフ +common-species-draugr = アンデッド +common-species-danari = デナリ +common-weapons-axe = 斧 +common-weapons-sword = 剣 +common-weapons-staff = 杖 +common-weapons-bow = 弓矢 +common-weapons-hammer = ハンマー +common-weapons-general = 戦闘全般 +common-weapons-sceptre = セプター +common-weapons-shield = 盾 +common-weapons-spear = 槍 +common-weapons-hammer_simple = シンプルなハンマー +common-weapons-sword_simple = シンプルな剣 +common-weapons-staff_simple = シンプルな杖 +common-weapons-axe_simple = シンプルな斧 +common-weapons-bow_simple = シンプルな弓矢 +common-weapons-unique = ユニーク +common-tool-debug = デバッグ +common-tool-farming = 農機具 +common-tool-pick = つるはし +common-kind-modular_component = Modular Component +common-kind-glider = グライダー +common-kind-consumable = 消耗品 +common-kind-throwable = 投げられます +common-kind-utility = ユーティリティ +common-kind-ingredient = 材料 +common-kind-lantern = ランタン +common-hands-one = 片手持ち +common-hands-two = 両手持ち +common-rand_appearance = ランダムに見た目を選択 +common-rand_name = ランダムに名前を選ぶ +common-stats-dps = DPS +common-stats-power = Power +common-stats-speed = Speed +common-stats-poise = Poise +common-stats-crit_chance = Crit Chance +common-stats-crit_mult = Crit Mult +common-stats-armor = Armor +common-stats-poise_res = Poise res +common-stats-slots = Slots \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/common.ron b/assets/voxygen/i18n/ja_JP/common.ron deleted file mode 100644 index 42c6c4925a..0000000000 --- a/assets/voxygen/i18n/ja_JP/common.ron +++ /dev/null @@ -1,106 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "ユーザー名", - "common.singleplayer": "シングルプレイ", - "common.multiplayer": "マルチプレイ", - "common.servers": "サーバー", - "common.quit": "終了", - "common.settings": "設定", - "common.languages": "言語", - "common.interface": "インターフェース", - "common.gameplay": "ゲーム環境", - "common.controls": "操作", - "common.video": "グラフィック", - "common.sound": "サウンド", - "common.resume": "中断", - "common.characters": "キャラクター", - "common.close": "閉じる", - "common.yes": "はい", - "common.no": "いいえ", - "common.back": "戻る", - "common.create": "作成", - "common.okay": "OK", - "common.add": "追加", - "common.accept": "承諾", - "common.decline": "辞退", - "common.disclaimer": "放棄", - "common.cancel": "キャンセル", - "common.none": "なし", - "common.error": "エラー", - "common.fatal_error": "致命的なエラー", - "common.you": "あなた", - "common.automatic": "自動", - "common.random": "ランダム", - "common.empty": "空", - - // Settings Window title - "common.interface_settings": "インターフェース設定", - "common.gameplay_settings": "ゲーム環境設定", - "common.controls_settings": "操作設定", - "common.video_settings": "グラフィック設定", - "common.sound_settings": "サウンド設定", - "common.language_settings": "言語設定", - - // Message when connection to the server is lost - "common.connection_lost": r#"接続が切断されました! -サーバーを再起動しましたか? -クライアントをアップデートしましたか?"#, - - - "common.species.orc": "オーク", - "common.species.human": "人間", - "common.species.dwarf": "ドワーフ", - "common.species.elf": "エルフ", - "common.species.draugr": "アンデッド", - "common.species.danari": "デナリ", - - "common.weapons.axe": "斧", - "common.weapons.sword": "剣", - "common.weapons.staff": "杖", - "common.weapons.bow": "弓矢", - "common.weapons.hammer": "ハンマー", - "common.weapons.general": "戦闘全般", - "common.weapons.sceptre": "セプター", - "common.weapons.shield": "盾", - "common.weapons.spear": "槍", - "common.weapons.hammer_simple": "シンプルなハンマー", - "common.weapons.sword_simple": "シンプルな剣", - "common.weapons.staff_simple": "シンプルな杖", - "common.weapons.axe_simple": "シンプルな斧", - "common.weapons.bow_simple": "シンプルな弓矢", - "common.weapons.unique": "ユニーク", - "common.tool.debug": "デバッグ", - "common.tool.farming": "農機具", - "common.tool.pick": "つるはし", - "common.kind.modular_component": "Modular Component", - "common.kind.glider": "グライダー", - "common.kind.consumable": "消耗品", - "common.kind.throwable": "投げられます", - "common.kind.utility": "ユーティリティ", - "common.kind.ingredient": "材料", - "common.kind.lantern": "ランタン", - "common.hands.one": "片手持ち", - "common.hands.two": "両手持ち", - - "common.rand_appearance": "ランダムに見た目を選択", - "common.rand_name": "ランダムに名前を選ぶ", - - "common.stats.dps": "DPS", - "common.stats.power": "Power", - "common.stats.speed": "Speed", - "common.stats.poise": "Poise", - "common.stats.crit_chance": "Crit Chance", - "common.stats.crit_mult": "Crit Mult", - "common.stats.armor": "Armor", - "common.stats.poise_res": "Poise res", - "common.stats.slots": "Slots", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/esc_menu.ftl b/assets/voxygen/i18n/ja_JP/esc_menu.ftl new file mode 100644 index 0000000000..63138759c8 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = ログアウト +esc_menu-quit_game = ゲーム終了 \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/esc_menu.ron b/assets/voxygen/i18n/ja_JP/esc_menu.ron deleted file mode 100644 index 8990a88d6f..0000000000 --- a/assets/voxygen/i18n/ja_JP/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "esc_menu.logout": "ログアウト", - "esc_menu.quit_game": "ゲーム終了", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/gameinput.ftl b/assets/voxygen/i18n/ja_JP/gameinput.ftl new file mode 100644 index 0000000000..1a2c2d2ca4 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/gameinput.ftl @@ -0,0 +1,59 @@ +gameinput-primary = 基本攻撃 +gameinput-secondary = 第二攻撃/防御/狙う +gameinput-slot1 = ホットバー スロット1 +gameinput-slot2 = ホットバー スロット2 +gameinput-slot3 = ホットバー スロット3 +gameinput-slot4 = ホットバー スロット4 +gameinput-slot5 = ホットバー スロット5 +gameinput-slot6 = ホットバー スロット6 +gameinput-slot7 = ホットバー スロット7 +gameinput-slot8 = ホットバー スロット8 +gameinput-slot9 = ホットバー スロット9 +gameinput-slot10 = ホットバー スロット10 +gameinput-swaploadout = 武器切り替え +gameinput-togglecursor = カーソル切り替え +gameinput-help = ヘルプウィンドウ表示切り替え +gameinput-toggleinterface = インターフェース表示切り替え +gameinput-toggledebug = FPSとデバッグ情報表示切り替え +gameinput-screenshot = スクリーンショットを撮る +gameinput-toggleingameui = ネームタグ表示切り替え +gameinput-fullscreen = フルスクリーン表示切り替え +gameinput-moveforward = 前に移動 +gameinput-moveleft = 左に移動 +gameinput-moveright = 右に移動 +gameinput-moveback = 後に移動 +gameinput-jump = ジャンプ +gameinput-glide = グライダー開く +gameinput-roll = 前転 +gameinput-climb = よじ登る +gameinput-climbdown = よじ降りる +gameinput-wallleap = 障害乗り越え +gameinput-togglelantern = ランタン切り替え +gameinput-mount = マウント +gameinput-chat = チャット +gameinput-command = コマンド +gameinput-escape = メニューへ +gameinput-map = 地図 +gameinput-bag = バッグ +gameinput-trade = 取引 +gameinput-social = ソーシャル +gameinput-sit = 座る +gameinput-spellbook = 唱える +gameinput-settings = 設定 +gameinput-respawn = リスポーン +gameinput-charge = チャージ +gameinput-togglewield = 振り回し切り替え +gameinput-interact = アクション +gameinput-freelook = 見回す +gameinput-autowalk = 自動移動 +gameinput-cameraclamp = カメラ移動制限 +gameinput-dance = ダンス +gameinput-select = エンティティ選択 +gameinput-acceptgroupinvite = グループの招待承認 +gameinput-declinegroupinvite = グループの招待辞退 +gameinput-cyclecamera = カメラ切り替え +gameinput-crafting = クラフト +gameinput-fly = 飛ぶ +gameinput-sneak = スニーク +gameinput-swimdown = 下に泳ぐ +gameinput-swimup = 上に泳ぐ \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/gameinput.ron b/assets/voxygen/i18n/ja_JP/gameinput.ron deleted file mode 100644 index c891b012b3..0000000000 --- a/assets/voxygen/i18n/ja_JP/gameinput.ron +++ /dev/null @@ -1,70 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "gameinput.primary": "基本攻撃", - "gameinput.secondary": "第二攻撃/防御/狙う", - "gameinput.slot1": "ホットバー スロット1", - "gameinput.slot2": "ホットバー スロット2", - "gameinput.slot3": "ホットバー スロット3", - "gameinput.slot4": "ホットバー スロット4", - "gameinput.slot5": "ホットバー スロット5", - "gameinput.slot6": "ホットバー スロット6", - "gameinput.slot7": "ホットバー スロット7", - "gameinput.slot8": "ホットバー スロット8", - "gameinput.slot9": "ホットバー スロット9", - "gameinput.slot10": "ホットバー スロット10", - "gameinput.swaploadout": "武器切り替え", - "gameinput.togglecursor": "カーソル切り替え", - "gameinput.help": "ヘルプウィンドウ表示切り替え", - "gameinput.toggleinterface": "インターフェース表示切り替え", - "gameinput.toggledebug": "FPSとデバッグ情報表示切り替え", - "gameinput.screenshot": "スクリーンショットを撮る", - "gameinput.toggleingameui": "ネームタグ表示切り替え", - "gameinput.fullscreen": "フルスクリーン表示切り替え", - "gameinput.moveforward": "前に移動", - "gameinput.moveleft": "左に移動", - "gameinput.moveright": "右に移動", - "gameinput.moveback": "後に移動", - "gameinput.jump": "ジャンプ", - "gameinput.glide": "グライダー開く", - "gameinput.roll": "前転", - "gameinput.climb": "よじ登る", - "gameinput.climbdown": "よじ降りる", - "gameinput.wallleap": "障害乗り越え", - "gameinput.togglelantern": "ランタン切り替え", - "gameinput.mount": "マウント", - "gameinput.chat": "チャット", - "gameinput.command": "コマンド", - "gameinput.escape": "メニューへ", - "gameinput.map": "地図", - "gameinput.bag": "バッグ", - "gameinput.trade": "取引", - "gameinput.social": "ソーシャル", - "gameinput.sit": "座る", - "gameinput.spellbook": "唱える", - "gameinput.settings": "設定", - "gameinput.respawn": "リスポーン", - "gameinput.charge": "チャージ", - "gameinput.togglewield": "振り回し切り替え", - "gameinput.interact": "アクション", - "gameinput.freelook": "見回す", - "gameinput.autowalk": "自動移動", - "gameinput.cameraclamp": "カメラ移動制限", - "gameinput.dance": "ダンス", - "gameinput.select": "エンティティ選択", - "gameinput.acceptgroupinvite": "グループの招待承認", - "gameinput.declinegroupinvite": "グループの招待辞退", - "gameinput.cyclecamera": "カメラ切り替え", - "gameinput.crafting": "クラフト", - "gameinput.fly": "飛ぶ", - "gameinput.sneak": "スニーク", - "gameinput.swimdown": "下に泳ぐ", - "gameinput.swimup": "上に泳ぐ", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/bag.ftl b/assets/voxygen/i18n/ja_JP/hud/bag.ftl new file mode 100644 index 0000000000..ad4f390526 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/bag.ftl @@ -0,0 +1,28 @@ +hud-bag-inventory = { $playername }の持ち物 +hud-bag-stats_title = { $playername }の状態 +hud-bag-exp = Exp +hud-bag-armor = 鎧 +hud-bag-stats = 状態 +hud-bag-head = 頭 +hud-bag-neck = 首 +hud-bag-tabard = タバード +hud-bag-shoulders = 肩 +hud-bag-chest = 胸 +hud-bag-hands = 手 +hud-bag-lantern = ランタン +hud-bag-glider = グライダー +hud-bag-belt = ベルト +hud-bag-ring = 指輪 +hud-bag-back = 背中 +hud-bag-legs = 脚 +hud-bag-feet = 足 +hud-bag-mainhand = 利き手 +hud-bag-offhand = 非利き手 +hud-bag-bag = バッグ +hud-bag-health = 体力 +hud-bag-energy = スタミナ +hud-bag-combat_rating = 戦闘レート +hud-bag-protection = 防御力 +hud-bag-combat_rating_desc = + 装備と体力から + 計算されます \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/bag.ron b/assets/voxygen/i18n/ja_JP/hud/bag.ron deleted file mode 100644 index e25c97ff1c..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/bag.ron +++ /dev/null @@ -1,39 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}の持ち物", - "hud.bag.stats_title": "{playername}の状態", - "hud.bag.exp": "Exp", - "hud.bag.armor": "鎧", - "hud.bag.stats": "状態", - "hud.bag.head": "頭", - "hud.bag.neck": "首", - "hud.bag.tabard": "タバード", - "hud.bag.shoulders": "肩", - "hud.bag.chest": "胸", - "hud.bag.hands": "手", - "hud.bag.lantern": "ランタン", - "hud.bag.glider": "グライダー", - "hud.bag.belt": "ベルト", - "hud.bag.ring": "指輪", - "hud.bag.back": "背中", - "hud.bag.legs": "脚", - "hud.bag.feet": "足", - "hud.bag.mainhand": "利き手", - "hud.bag.offhand": "非利き手", - "hud.bag.bag": "バッグ", - "hud.bag.health": "体力", - "hud.bag.energy": "スタミナ", - "hud.bag.combat_rating": "戦闘レート", - "hud.bag.protection": "防御力", - "hud.bag.combat_rating_desc": "装備と体力から\n計算されます", - "hud.bag.protection": "Damage reduction through armor", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/char_window.ftl b/assets/voxygen/i18n/ja_JP/hud/char_window.ftl new file mode 100644 index 0000000000..c1da349f3a --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = キャラクター名 +character_window-character_stats = + 持久力 + + 適応性 + + 自制心 + + 防御性 \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/char_window.ron b/assets/voxygen/i18n/ja_JP/hud/char_window.ron deleted file mode 100644 index af9073620c..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "character_window.character_name": "キャラクター名", - // Character stats - "character_window.character_stats": r#"持久力 - -適応性 - -自制心 - -防御性 -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/chat.ftl b/assets/voxygen/i18n/ja_JP/hud/chat.ftl new file mode 100644 index 0000000000..c47aaf9f18 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/chat.ftl @@ -0,0 +1,22 @@ +hud-chat-online_msg = [{ $name }]がオンラインになりました +hud-chat-offline_msg = [{ $name }]がオフラインになりました +hud-chat-default_death_msg = [{ $name }]は死んでしまった +hud-chat-environmental_kill_msg = [{ $name }]は{ $environment }で死亡しました +hud-chat-fall_kill_msg = [{ $name }]は落下のダメージで死亡しました +hud-chat-suicide_msg = [{ $name }]は自傷行為により死亡しました +hud-chat-pvp_buff_kill_msg = [{ $victim }]は[{ $attacker }]による{ $buff }で死亡しました +hud-chat-pvp_melee_kill_msg = [{ $attacker }]は[{ $victim }]を倒した +hud-chat-pvp_ranged_kill_msg = [{ $attacker }]は[{ $victim }]を撃った +hud-chat-pvp_explosion_kill_msg = [{ $attacker }]は[{ $victim }]を爆破した +hud-chat-pvp_energy_kill_msg = [{ $attacker }]は魔法で[{ $victim }]を殺しました +hud-chat-nonexistent_buff_kill_msg = [{ $victim }]は{ $buff }により死亡しました +hud-chat-npc_buff_kill_msg = [{ $victim }]は{ $attacker }の{ $buff }により死亡しました +hud-chat-npc_melee_kill_msg = { $attacker }は[{ $victim }]を殺しました +hud-chat-npc_ranged_kill_msg = { $attacker }は[{ $victim }]を撃ちました +hud-chat-npc_explosion_kill_msg = { $attacker }は[{ $victim }]を爆破しました +hud-chat-npc_energy_kill_msg = { $attacker }は魔法で[{ $victim }]を殺しました +hud-chat-npc_other_kill_msg = { $attacker }は[{ $victim }]を殺しました +hud-chat-loot_msg = [{ $item }]を拾った +hud-chat-loot_fail = 持ち物がいっぱいです! +hud-chat-goodbye = さようなら! +hud-chat-connection_lost = 接続が切れました。キックされて{ $time }秒。 \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/chat.ron b/assets/voxygen/i18n/ja_JP/hud/chat.ron deleted file mode 100644 index 455eba1cba..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/chat.ron +++ /dev/null @@ -1,39 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // Chat outputs - "hud.chat.online_msg": "[{name}]がオンラインになりました", - "hud.chat.offline_msg": "[{name}]がオフラインになりました", - - "hud.chat.default_death_msg": "[{name}]は死んでしまった", - "hud.chat.environmental_kill_msg": "[{name}]は{environment}で死亡しました", - "hud.chat.fall_kill_msg": "[{name}]は落下のダメージで死亡しました", - "hud.chat.suicide_msg": "[{name}]は自傷行為により死亡しました", - - "hud.chat.pvp_buff_kill_msg": "[{victim}]は[{attacker}]による{buff}で死亡しました", - "hud.chat.pvp_melee_kill_msg": "[{attacker}]は[{victim}]を倒した", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}]は[{victim}]を撃った", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}]は[{victim}]を爆破した", - "hud.chat.pvp_energy_kill_msg": "[{attacker}]は魔法で[{victim}]を殺しました", - - "hud.chat.nonexistent_buff_kill_msg": "[{victim}]は{buff}により死亡しました", - - "hud.chat.npc_buff_kill_msg": "[{victim}]は{attacker}の{buff}により死亡しました", - "hud.chat.npc_melee_kill_msg": "{attacker}は[{victim}]を殺しました", - "hud.chat.npc_ranged_kill_msg": "{attacker}は[{victim}]を撃ちました", - "hud.chat.npc_explosion_kill_msg": "{attacker}は[{victim}]を爆破しました", - "hud.chat.npc_energy_kill_msg": "{attacker}は魔法で[{victim}]を殺しました", - "hud.chat.npc_other_kill_msg": "{attacker}は[{victim}]を殺しました", - - "hud.chat.loot_msg": "[{item}]を拾った", - "hud.chat.loot_fail": "持ち物がいっぱいです!", - "hud.chat.goodbye": "さようなら!", - "hud.chat.connection_lost": "接続が切れました。キックされて{time}秒。", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/crafting.ftl b/assets/voxygen/i18n/ja_JP/hud/crafting.ftl new file mode 100644 index 0000000000..480fb666c8 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/crafting.ftl @@ -0,0 +1,5 @@ +hud-crafting = クラフト +hud-crafting-recipes = レシピ +hud-crafting-ingredients = 材料: +hud-crafting-craft = クラフト +hud-crafting-tool_cata = 必要: \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/crafting.ron b/assets/voxygen/i18n/ja_JP/hud/crafting.ron deleted file mode 100644 index 81b8df46f5..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/crafting.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "hud.crafting": "クラフト", - "hud.crafting.recipes": "レシピ", - "hud.crafting.ingredients": "材料:", - "hud.crafting.craft": "クラフト", - "hud.crafting.tool_cata": "必要:", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/group.ftl b/assets/voxygen/i18n/ja_JP/hud/group.ftl new file mode 100644 index 0000000000..74d3d2bb74 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = グループ +hud-group-invite_to_join = [{ $name }]があなたをグループに招待しました! +hud-group-invite_to_trade = [{ $name }]があなたと取引を希望しています。 +hud-group-invite = 招待 +hud-group-kick = キック +hud-group-assign_leader = リーダーに設定 +hud-group-leave = グループを離れる +hud-group-dead = 死亡 +hud-group-out_of_range = 範囲外 +hud-group-add_friend = フレンドに追加 +hud-group-link_group = グループをリンク +hud-group-in_menu = メニュー内 +hud-group-members = グループメンバー \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/group.ron b/assets/voxygen/i18n/ja_JP/hud/group.ron deleted file mode 100644 index 70b12dc74f..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "hud.group": "グループ", - "hud.group.invite_to_join": "[{name}]があなたをグループに招待しました!", - "hud.group.invite_to_trade": "[{name}]があなたと取引を希望しています。", - "hud.group.invite": "招待", - "hud.group.kick": "キック", - "hud.group.assign_leader": "リーダーに設定", - "hud.group.leave": "グループを離れる", - "hud.group.dead" : "死亡", - "hud.group.out_of_range": "範囲外", - "hud.group.add_friend": "フレンドに追加", - "hud.group.link_group": "グループをリンク", - "hud.group.in_menu": "メニュー内", - "hud.group.members": "グループメンバー", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/map.ftl b/assets/voxygen/i18n/ja_JP/hud/map.ftl new file mode 100644 index 0000000000..04c2dbcdd3 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/map.ftl @@ -0,0 +1,20 @@ +hud-map-map_title = 地図 +hud-map-qlog_title = クエスト +hud-map-difficulty = 難所 +hud-map-towns = 街 +hud-map-castles = 城 +hud-map-dungeons = ダンジョン +hud-map-caves = 洞窟 +hud-map-cave = 洞窟 +hud-map-trees = 巨木 +hud-map-tree = 巨木 +hud-map-town = 街 +hud-map-castle = 城 +hud-map-dungeon = ダンジョン +hud-map-difficulty_dungeon = + ダンジョン + + 難易度: { $difficulty } +hud-map-drag = ドラッグ +hud-map-zoom = ズーム +hud-map-recenter = 中心に移動 \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/map.ron b/assets/voxygen/i18n/ja_JP/hud/map.ron deleted file mode 100644 index 9af02a1768..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/map.ron +++ /dev/null @@ -1,29 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // Map and Questlog - "hud.map.map_title": "地図", - "hud.map.qlog_title": "クエスト", - "hud.map.difficulty": "難所", - "hud.map.towns": "街", - "hud.map.castles": "城", - "hud.map.dungeons": "ダンジョン", - "hud.map.caves": "洞窟", - "hud.map.cave": "洞窟", - "hud.map.trees": "巨木", - "hud.map.tree": "巨木", - "hud.map.town": "街", - "hud.map.castle": "城", - "hud.map.dungeon": "ダンジョン", - "hud.map.difficulty_dungeon": "ダンジョン\n\n難易度: {difficulty}", - "hud.map.drag": "ドラッグ", - "hud.map.zoom": "ズーム", - "hud.map.recenter": "中心に移動", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/misc.ftl b/assets/voxygen/i18n/ja_JP/hud/misc.ftl new file mode 100644 index 0000000000..a7ad552712 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/misc.ftl @@ -0,0 +1,33 @@ +hud-do_not_show_on_startup = 起動時に表示しない +hud-show_tips = ヒント表示 +hud-quests = クエスト +hud-you_died = あなたは死にました +hud-waypoint_saved = 場所が記録されました +hud-sp_arrow_txt = SP +hud-press_key_to_show_keybindings_fmt = [{ $key }] キー設定 +hud-press_key_to_toggle_lantern_fmt = [{ $key }] ランタン +hud-press_key_to_show_debug_info_fmt = { $key }キーを押してデバッグ情報を表示 +hud-press_key_to_toggle_keybindings_fmt = { $key }キーを押してキー設定表示を切り替え +hud-press_key_to_toggle_debug_info_fmt = { $key }キーを押してデバッグ情報表示を切り替え +hud-press_key_to_respawn = { $key }を押すと最後に訪れた焚き火から再開します。 +hud-tutorial_btn = チュートリアル +hud-tutorial_click_here = [ { $key } ]キーを押してカーソルロックを解除して、こちらのボタンを押してください! +hud-tutorial_elements = クラフト +hud-temp_quest_headline = 旅人へのご挨拶 +hud-temp_quest_text = + 旅を始めるには、まず、この村を見て回って必要な物を集めるといいでしょう。 + + 旅に必要になるものは、何を持っていってもいいですよ! + + 画面右下には、バッグやクラフトメニュー、地図などが表示されています。 + + クラフトメニューでは、武器や防具、食料などが作れますよ! + + 町の周辺にいる野生動物は、危険な世界から身を守る物に必要な「革の切れっぱし」の供給源です。 + + 準備ができれば、地図に記された数々のクエストに挑戦して、さらに優れた装備を手に入れましょう! +hud-spell = 呪文 +hud-diary = 日記 +hud-free_look_indicator = 見回しています。{ $key }キーを押すと解除されます。 +hud-camera_clamp_indicator = カメラの垂直移動が無効になっています。{ $key }キーを押すと解除されます。 +hud-auto_walk_indicator = 自動移動が有効です \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/misc.ron b/assets/voxygen/i18n/ja_JP/hud/misc.ron deleted file mode 100644 index a608a39ae6..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/misc.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "hud.do_not_show_on_startup": "起動時に表示しない", - "hud.show_tips": "ヒント表示", - "hud.quests": "クエスト", - "hud.you_died": "あなたは死にました", - "hud.waypoint_saved": "場所が記録されました", - "hud.sp_arrow_txt": "SP", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] キー設定", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] ランタン", - "hud.press_key_to_show_debug_info_fmt": "{key}キーを押してデバッグ情報を表示", - "hud.press_key_to_toggle_keybindings_fmt": "{key}キーを押してキー設定表示を切り替え", - "hud.press_key_to_toggle_debug_info_fmt": "{key}キーを押してデバッグ情報表示を切り替え", - - // Respawn message - "hud.press_key_to_respawn": r#"{key}を押すと最後に訪れた焚き火から再開します。"#, - - // Tutorial Button - "hud.tutorial_btn": r#"チュートリアル"#, - "hud.tutorial_click_here": r#"[ {key} ]キーを押してカーソルロックを解除して、こちらのボタンを押してください!"#, - "hud.tutorial_elements": r#"クラフト"#, - -"hud.temp_quest_headline": r#"旅人へのご挨拶"#, -"hud.temp_quest_text": r#"旅を始めるには、まず、この村を見て回って必要な物を集めるといいでしょう。 - -旅に必要になるものは、何を持っていってもいいですよ! - -画面右下には、バッグやクラフトメニュー、地図などが表示されています。 - -クラフトメニューでは、武器や防具、食料などが作れますよ! - -町の周辺にいる野生動物は、危険な世界から身を守る物に必要な「革の切れっぱし」の供給源です。 - -準備ができれば、地図に記された数々のクエストに挑戦して、さらに優れた装備を手に入れましょう! -"#, - - "hud.spell": "呪文", - // Diary - "hud.diary": "日記", - - "hud.free_look_indicator": "見回しています。{key}キーを押すと解除されます。", - "hud.camera_clamp_indicator": "カメラの垂直移動が無効になっています。{key}キーを押すと解除されます。", - "hud.auto_walk_indicator": "自動移動が有効です", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/sct.ftl b/assets/voxygen/i18n/ja_JP/hud/sct.ftl new file mode 100644 index 0000000000..ac5d162a71 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = ブロック \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/sct.ron b/assets/voxygen/i18n/ja_JP/hud/sct.ron deleted file mode 100644 index d0a4b7cf34..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "ブロック", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/settings.ftl b/assets/voxygen/i18n/ja_JP/hud/settings.ftl new file mode 100644 index 0000000000..d8ace5c734 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/settings.ftl @@ -0,0 +1,88 @@ +hud-settings-general = 全般 +hud-settings-none = なし +hud-settings-press_behavior-toggle = トグル +hud-settings-press_behavior-hold = 固定 +hud-settings-help_window = ヘルプウィンドウ表示 +hud-settings-debug_info = デバッグ情報表示 +hud-settings-tips_on_startup = スタート時のヒント +hud-settings-ui_scale = UIスケール +hud-settings-relative_scaling = 相対的スケール +hud-settings-custom_scaling = カスタムスケール +hud-settings-crosshair = 十字線 +hud-settings-opacity = 透明度 +hud-settings-hotbar = ホットバー +hud-settings-toggle_shortcuts = ショートカット表示切り替え +hud-settings-buffs_skillbar = Buffs at Skillbar +hud-settings-buffs_mmap = Buffs at Minimap +hud-settings-toggle_bar_experience = 経験値バーの切り替え +hud-settings-scrolling_combat_text = 戦闘メッセージのスクロール +hud-settings-incoming_damage = Incoming Damage +hud-settings-speech_bubble = 吹き出し +hud-settings-speech_bubble_dark_mode = ダークモード吹き出し +hud-settings-speech_bubble_icon = アイコン吹き出し +hud-settings-energybar_numbers = 体力バー数値表示 +hud-settings-values = 数値 +hud-settings-percentages = パーセント +hud-settings-chat = チャット +hud-settings-background_opacity = 背景透明度 +hud-settings-chat_character_name = チャット内にキャラクター名表示 +hud-settings-loading_tips = ロード画面のヒント表示 +hud-settings-reset_interface = デフォルトに戻す +hud-settings-pan_sensitivity = パン感度 +hud-settings-zoom_sensitivity = ズーム感度 +hud-settings-camera_clamp_angle = カメラ移動制限モードの垂直角度 +hud-settings-invert_scroll_zoom = スクロールズーム反転 +hud-settings-invert_mouse_y_axis = マウスY軸反転 +hud-settings-invert_controller_y_axis = コントローラーY軸反転 +hud-settings-enable_mouse_smoothing = カメラ スムージング +hud-settings-free_look_behavior = 見回すの挙動 +hud-settings-auto_walk_behavior = 自動移動の挙動 +hud-settings-camera_clamp_behavior = カメラ移動制限の挙動 +hud-settings-stop_auto_walk_on_input = 移動すると自動移動を停止する +hud-settings-reset_gameplay = デフォルトに戻す +hud-settings-view_distance = ビュー距離 +hud-settings-sprites_view_distance = スプライトビュー距離 +hud-settings-figures_view_distance = エンティティビュー距離 +hud-settings-maximum_fps = FPS最大値 +hud-settings-fov = 視野(角度) +hud-settings-gamma = ガンマ +hud-settings-exposure = 露出 +hud-settings-ambiance = 周りの明るさ +hud-settings-antialiasing_mode = アンチエイリアス モード +hud-settings-upscale_factor = 内部解像度 +hud-settings-cloud_rendering_mode = 雲レンダリングモード +hud-settings-fluid_rendering_mode = 流体レンダリングモード +hud-settings-fluid_rendering_mode-cheap = チープ +hud-settings-fluid_rendering_mode-shiny = 光沢 +hud-settings-cloud_rendering_mode-minimal = 最低 +hud-settings-cloud_rendering_mode-low = 低い +hud-settings-cloud_rendering_mode-medium = 普通 +hud-settings-cloud_rendering_mode-high = 高い +hud-settings-cloud_rendering_mode-ultra = 最高 +hud-settings-fullscreen = フルスクリーン +hud-settings-fullscreen_mode = フルスクリーン モード +hud-settings-fullscreen_mode-exclusive = 排他的 +hud-settings-fullscreen_mode-borderless = ボーダーレス +hud-settings-particles = パーティクル +hud-settings-resolution = 解像度 +hud-settings-bit_depth = ビット深度 +hud-settings-refresh_rate = リフレッシュレート +hud-settings-lighting_rendering_mode = 光源レンダリングモード +hud-settings-lighting_rendering_mode-ashikhmin = Type A - 高い +hud-settings-lighting_rendering_mode-blinnphong = Type B - 普通 +hud-settings-lighting_rendering_mode-lambertian = Type L - チープ +hud-settings-shadow_rendering_mode = 影レンダリングモード +hud-settings-shadow_rendering_mode-none = なし +hud-settings-shadow_rendering_mode-cheap = チープ +hud-settings-shadow_rendering_mode-map = マップ +hud-settings-shadow_rendering_mode-map-resolution = 解像度 +hud-settings-lod_detail = LoDディテール +hud-settings-save_window_size = ウィンドウサイズ保存 +hud-settings-reset_graphics = デフォルトに戻す +hud-settings-music_volume = 音楽ボリューム +hud-settings-sound_effect_volume = 効果音ボリューム +hud-settings-audio_device = オーディオデバイス +hud-settings-reset_sound = デフォルトに戻す +hud-settings-awaitingkey = キーを押してください... +hud-settings-unbound = なし +hud-settings-reset_keybinds = デフォルトに戻す \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/settings.ron b/assets/voxygen/i18n/ja_JP/hud/settings.ron deleted file mode 100644 index fbd36a695f..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/settings.ron +++ /dev/null @@ -1,105 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - // Settings - "hud.settings.general": "全般", - "hud.settings.none": "なし", - "hud.settings.press_behavior.toggle": "トグル", - "hud.settings.press_behavior.hold": "固定", - "hud.settings.help_window": "ヘルプウィンドウ表示", - "hud.settings.debug_info": "デバッグ情報表示", - "hud.settings.tips_on_startup": "スタート時のヒント", - "hud.settings.ui_scale": "UIスケール", - "hud.settings.relative_scaling": "相対的スケール", - "hud.settings.custom_scaling": "カスタムスケール", - "hud.settings.crosshair": "十字線", - "hud.settings.opacity": "透明度", - "hud.settings.hotbar": "ホットバー", - "hud.settings.toggle_shortcuts": "ショートカット表示切り替え", - "hud.settings.buffs_skillbar": "Buffs at Skillbar", - "hud.settings.buffs_mmap": "Buffs at Minimap", - "hud.settings.toggle_bar_experience": "経験値バーの切り替え", - "hud.settings.scrolling_combat_text": "戦闘メッセージのスクロール", - "hud.settings.incoming_damage": "Incoming Damage", - "hud.settings.speech_bubble": "吹き出し", - "hud.settings.speech_bubble_dark_mode": "ダークモード吹き出し", - "hud.settings.speech_bubble_icon": "アイコン吹き出し", - "hud.settings.energybar_numbers": "体力バー数値表示", - "hud.settings.values": "数値", - "hud.settings.percentages": "パーセント", - "hud.settings.chat": "チャット", - "hud.settings.background_opacity": "背景透明度", - "hud.settings.chat_character_name": "チャット内にキャラクター名表示", - "hud.settings.loading_tips": "ロード画面のヒント表示", - "hud.settings.reset_interface": "デフォルトに戻す", - - "hud.settings.pan_sensitivity": "パン感度", - "hud.settings.zoom_sensitivity": "ズーム感度", - "hud.settings.camera_clamp_angle": "カメラ移動制限モードの垂直角度", - "hud.settings.invert_scroll_zoom": "スクロールズーム反転", - "hud.settings.invert_mouse_y_axis": "マウスY軸反転", - "hud.settings.invert_controller_y_axis": "コントローラーY軸反転", - "hud.settings.enable_mouse_smoothing": "カメラ スムージング", - "hud.settings.free_look_behavior": "見回すの挙動", - "hud.settings.auto_walk_behavior": "自動移動の挙動", - "hud.settings.camera_clamp_behavior": "カメラ移動制限の挙動", - "hud.settings.stop_auto_walk_on_input": "移動すると自動移動を停止する", - "hud.settings.reset_gameplay": "デフォルトに戻す", - - "hud.settings.view_distance": "ビュー距離", - "hud.settings.sprites_view_distance": "スプライトビュー距離", - "hud.settings.figures_view_distance": "エンティティビュー距離", - "hud.settings.maximum_fps": "FPS最大値", - "hud.settings.fov": "視野(角度)", - "hud.settings.gamma": "ガンマ", - "hud.settings.exposure": "露出", - "hud.settings.ambiance": "周りの明るさ", - "hud.settings.antialiasing_mode": "アンチエイリアス モード", - "hud.settings.upscale_factor": "内部解像度", - "hud.settings.cloud_rendering_mode": "雲レンダリングモード", - "hud.settings.fluid_rendering_mode": "流体レンダリングモード", - "hud.settings.fluid_rendering_mode.cheap": "チープ", - "hud.settings.fluid_rendering_mode.shiny": "光沢", - "hud.settings.cloud_rendering_mode.minimal": "最低", - "hud.settings.cloud_rendering_mode.low": "低い", - "hud.settings.cloud_rendering_mode.medium": "普通", - "hud.settings.cloud_rendering_mode.high": "高い", - "hud.settings.cloud_rendering_mode.ultra": "最高", - "hud.settings.fullscreen": "フルスクリーン", - "hud.settings.fullscreen_mode": "フルスクリーン モード", - "hud.settings.fullscreen_mode.exclusive": "排他的", - "hud.settings.fullscreen_mode.borderless": "ボーダーレス", - "hud.settings.particles": "パーティクル", - "hud.settings.resolution": "解像度", - "hud.settings.bit_depth": "ビット深度", - "hud.settings.refresh_rate": "リフレッシュレート", - "hud.settings.lighting_rendering_mode": "光源レンダリングモード", - "hud.settings.lighting_rendering_mode.ashikhmin": "Type A - 高い ", - "hud.settings.lighting_rendering_mode.blinnphong": "Type B - 普通", - "hud.settings.lighting_rendering_mode.lambertian": "Type L - チープ", - "hud.settings.shadow_rendering_mode": "影レンダリングモード", - "hud.settings.shadow_rendering_mode.none": "なし", - "hud.settings.shadow_rendering_mode.cheap": "チープ", - "hud.settings.shadow_rendering_mode.map": "マップ", - "hud.settings.shadow_rendering_mode.map.resolution": "解像度", - "hud.settings.lod_detail": "LoDディテール", - "hud.settings.save_window_size": "ウィンドウサイズ保存", - "hud.settings.reset_graphics": "デフォルトに戻す", - - - "hud.settings.music_volume": "音楽ボリューム", - "hud.settings.sound_effect_volume": "効果音ボリューム", - "hud.settings.audio_device": "オーディオデバイス", - "hud.settings.reset_sound": "デフォルトに戻す", - - "hud.settings.awaitingkey": "キーを押してください...", - "hud.settings.unbound": "なし", - "hud.settings.reset_keybinds": "デフォルトに戻す", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/skills.ftl b/assets/voxygen/i18n/ja_JP/hud/skills.ftl new file mode 100644 index 0000000000..ba8315f02f --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/skills.ftl @@ -0,0 +1,230 @@ +hud-rank_up = スキルポイント獲得 +hud-skill-sp_available = { $number } SP 利用可能 +hud-skill-not_unlocked = 解除されていません +hud-skill-req_sp ={"\u000A"} + + { $number }SP必要 +hud-skill-inc_health_title = 体力追加 +hud-skill-inc_health = 体力の最大値を{ $boost }増加 { $SP } +hud-skill-inc_energy_title = スタミナ追加 +hud-skill-inc_energy = スタミナ最大値を{ $boost }増加 { $SP } +hud-skill-unlck_sword_title = 剣解除 +hud-skill-unlck_sword = 剣のスキルツリーを解除 { $SP } +hud-skill-unlck_axe_title = 斧解除 +hud-skill-unlck_axe = 斧のスキルツリーを解除 { $SP } +hud-skill-unlck_hammer_title = ハンマー解除 +hud-skill-unlck_hammer = ハンマーのスキルツリーを解除 { $SP } +hud-skill-unlck_bow_title = 弓矢解除 +hud-skill-unlck_bow = 弓矢のスキルツリーを解除 { $SP } +hud-skill-unlck_staff_title = 杖解除 +hud-skill-unlck_staff = 杖のスキルツリーを解除 { $SP } +hud-skill-unlck_sceptre_title = セプター解除 +hud-skill-unlck_sceptre = セプターのスキルツリーを解除 { $SP } +hud-skill-dodge_title = 回避 +hud-skill-dodge = 近接攻撃を素早く避ける { $SP } +hud-skill-roll_energy_title = ローリング スタミナコスト +hud-skill-roll_energy = ローリングのスタミナ消費を{ $boost }%減少 { $SP } +hud-skill-roll_speed_title = ローリング 速度 +hud-skill-roll_speed = ローリングの速度を{ $boost }%加速 { $SP } +hud-skill-roll_dur_title = ローリング 時間 +hud-skill-roll_dur = ローリングの時間を{ $boost }%延長 { $SP } +hud-skill-climbing_title = よじ登り +hud-skill-climbing = より高く登ります +hud-skill-climbing_cost_title = よじ登り コスト +hud-skill-climbing_cost = よじ登りのスタミナ消費を{ $boost }%減少 { $SP } +hud-skill-climbing_speed_title = よじ登り 速度 +hud-skill-climbing_speed = よじ登り速度を{ $boost }%加速 { $SP } +hud-skill-swim_title = 泳ぎ +hud-skill-swim = 水中の移動 +hud-skill-swim_speed_title = 泳ぎ 速度 +hud-skill-swim_speed = 泳ぎの速度を{ $boost }%加速 { $SP } +hud-skill-sc_lifesteal_title = ライフスティール ビーム +hud-skill-sc_lifesteal = 敵の体力を奪う +hud-skill-sc_lifesteal_damage_title = ダメージ +hud-skill-sc_lifesteal_damage = ダメージを{ $boost }%多く与える { $SP } +hud-skill-sc_lifesteal_range_title = 範囲 +hud-skill-sc_lifesteal_range = ビームの距離を{ $boost }%増加 { $SP } +hud-skill-sc_lifesteal_lifesteal_title = ライフスティール +hud-skill-sc_lifesteal_lifesteal = 敵の体力を{ $boost }%増しで奪う { $SP } +hud-skill-sc_lifesteal_regen_title = スタミナ再生 +hud-skill-sc_lifesteal_regen = スタミナをさらに{ $boost }%回復 { $SP } +hud-skill-sc_heal_title = ヒーリング ビーム +hud-skill-sc_heal = 敵の血を使って仲間を回復する +hud-skill-sc_heal_heal_title = 回復 +hud-skill-sc_heal_heal = 体力の回復量を{ $boost }%増加 { $SP } +hud-skill-sc_heal_cost_title = スタミナ コスト +hud-skill-sc_heal_cost = 回復に必要なスタミナを{ $boost }%減少 { $SP } +hud-skill-sc_heal_range_title = 範囲 +hud-skill-sc_heal_range = ビームの距離を{ $boost }%増加 { $SP } +hud-skill-sc_wardaura_unlock_title = 結界オーラを解除 +hud-skill-sc_wardaura_unlock = 敵の攻撃を防ぐ結界が張れます { $SP } +hud-skill-sc_wardaura_strength_title = 強度 +hud-skill-sc_wardaura_strength = 結界の強度を{ $boost }%強化 { $SP } +hud-skill-sc_wardaura_duration_title = 効果 +hud-skill-sc_wardaura_duration = 結界の効果時間を{ $boost }%延長 { $SP } +hud-skill-sc_wardaura_range_title = 範囲 +hud-skill-sc_wardaura_range = 結界の範囲を{ $boost }%増加 { $SP } +hud-skill-sc_wardaura_cost_title = スタミナ コスト +hud-skill-sc_wardaura_cost = 結界に必要なエネルギー消費を{ $boost }%減少 { $SP } +hud-skill-st_shockwave_range_title = ショックウェーブ 範囲 +hud-skill-st_shockwave_range = 距離を{ $boost }%増加して手の届かない物も投げられる { $SP } +hud-skill-st_shockwave_cost_title = ショックウェーブ コスト +hud-skill-st_shockwave_cost = 無力な村人を投げるエネルギー消費を{ $boost }%減少 { $SP } +hud-skill-st_shockwave_knockback_title = ショックウェーブ ノックバック +hud-skill-st_shockwave_knockback = 投げる能力を{ $boost }%増加 { $SP } +hud-skill-st_shockwave_damage_title = ショックウェーブ ダメージ +hud-skill-st_shockwave_damage = 与えるダメージを{ $boost }%増加 { $SP } +hud-skill-st_shockwave_unlock_title = ショックウェーブ解除 +hud-skill-st_shockwave_unlock = 炎で敵を吹き飛ばす能力を解除 { $SP } +hud-skill-st_flamethrower_title = フレームスロワー +hud-skill-st_flamethrower = 火炎放射で丸焼きにします +hud-skill-st_flame_velocity_title = フレーム 速度 +hud-skill-st_flame_velocity = 炎の放射速度を{ $boost }%加速 { $SP } +hud-skill-st_flamethrower_range_title = フレームスロワー 範囲 +hud-skill-st_flamethrower_range = 炎が届かない場合に距離を{ $boost }%アップ { $SP } +hud-skill-st_energy_drain_title = エナジードレイン +hud-skill-st_energy_drain = エネルギー消費量を{ $boost }%減少 { $SP } +hud-skill-st_flamethrower_damage_title = フレームスロワー ダメージ +hud-skill-st_flamethrower_damage = ダメージを{ $boost }%増加 { $SP } +hud-skill-st_explosion_radius_title = エクスプロージョン 範囲 +hud-skill-st_explosion_radius = 大きいのはいいですよね。爆発半径を{ $boost }%増加 { $SP } +hud-skill-st_energy_regen_title = スタミナ 再生 +hud-skill-st_energy_regen = スタミナ獲得量を{ $boost }%増加 { $SP } +hud-skill-st_fireball_title = ファイアーボール +hud-skill-st_fireball = 敵と一緒に遊びましょう +hud-skill-st_damage_title = ダメージ +hud-skill-st_damage = ダメージを{ $boost }%増加 { $SP } +hud-skill-st_explosion_title = エクスプロージョン +hud-skill-st_explosion = 炎だけで足りないければ { $SP } +hud-skill-bow_projectile_speed_title = 発射 速度 +hud-skill-bow_projectile_speed = 矢の距離と速度を{ $boost }%アップ { $SP } +hud-skill-bow_arrow_count_title = アロー カウント +hud-skill-bow_arrow_count = ジャンプ時に追加で矢を撃つ { $SP } +hud-skill-bow_repeater_cost_title = リピーター コスト +hud-skill-bow_repeater_cost = 連射のエネルギー消費を{ $boost }%減少 { $SP } +hud-skill-bow_repeater_glide_title = リピーター グライド +hud-skill-bow_repeater_glide = Glide further while repeating{ $SP } +hud-skill-bow_repeater_damage_title = リピーター ダメージ +hud-skill-bow_repeater_damage = 与えるダメージを{ $boost }%増加 { $SP } +hud-skill-bow_repeater_unlock_title = リピーター解除 +hud-skill-bow_repeater_unlock = 中を舞うごとく矢を連射する能力を解除 { $SP } +hud-skill-bow_charged_title = チャージドシュート +hud-skill-bow_charged = 長く待ったので… +hud-skill-bow_charged_knockback_title = チャージド ノックバック +hud-skill-bow_charged_knockback = 後方の敵に{ $boost }%ダメージを与える { $SP } +hud-skill-bow_charged_move_speed_title = チャージド ムーブスピード +hud-skill-bow_charged_move_speed = Increases how fast you can shuffle while charging the attack by { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = チャージド スピード +hud-skill-bow_charged_speed = Increases the rate that you charge the attack by { $boost }%{ $SP } +hud-skill-bow_charged_projectile_speed_title = チャージド プロジェクタイルスピード +hud-skill-bow_charged_projectile_speed = Projectile speed increased by an additional { $boost }% while charging{ $SP } +hud-skill-bow_charged_drain_title = チャージド ドレイン +hud-skill-bow_charged_drain = Decreases the rate of stamina drain by { $boost }%{ $SP } +hud-skill-bow_charged_damage_title = チャージド ダメージ +hud-skill-bow_charged_damage = Increases damage by { $boost }%{ $SP } +hud-skill-bow_energy_regen_title = エナジー 再生 +hud-skill-bow_energy_regen = Increases stamina gain by { $boost }%{ $SP } +hud-skill-bow_title = アローシュート +hud-skill-bow = 無限の矢筒。ただし子供不可 +hud-skill-bow_damage_title = ダメージ +hud-skill-bow_damage = ダメージを{ $boost }%増加 { $SP } +hud-skill-hmr_leap_radius_title = リープ 範囲 +hud-skill-hmr_leap_radius = グランドスラムの攻撃半径を{ $boost }m増加 { $SP } +hud-skill-hmr_leap_distance_title = リープ 距離 +hud-skill-hmr_leap_distance = リープの距離を{ $boost }%増加 { $SP } +hud-skill-hmr_leap_cost_title = リープ コスト +hud-skill-hmr_leap_cost = リープのコストを{ $boost }%減少 { $SP } +hud-skill-hmr_leap_knockback_title = リープ ノックバック +hud-skill-hmr_leap_knockback = リープのノックバックを{ $boost }%増加 { $SP } +hud-skill-hmr_leap_damage_title = リープ ダメージ +hud-skill-hmr_leap_damage = リープのダメージを{ $boost }%増加 { $SP } +hud-skill-hmr_unlock_leap_title = リープ解除 +hud-skill-hmr_unlock_leap = リープを解除 { $SP } +hud-skill-hmr_charged_melee_title = チャージドメレー +hud-skill-hmr_charged_melee = チャージ付き乱闘 +hud-skill-hmr_charged_rate_title = チャージ レート +hud-skill-hmr_charged_rate = Increases the rate that you charge the swing by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = チャージドメレー エナジードレイン +hud-skill-hmr_charged_melee_nrg_drain = Decreases the rate energy drains when charging by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = チャージドメレー ダメージ +hud-skill-hmr_charged_melee_damage = Increases the damage of the charged swing by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = チャージドメレー ノックバック +hud-skill-hmr_charged_melee_knockback = Massively increases throw potential of swing by { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = シングルストライク +hud-skill-hmr_single_strike = As single as you are +hud-skill-hmr_single_strike_regen_title = シングルストライク 再生 +hud-skill-hmr_single_strike_regen = Increases stamina gain with each successive strike{ $SP } +hud-skill-hmr_single_strike_speed_title = シングルストライク スピード +hud-skill-hmr_single_strike_speed = Increases the attack speed with each successive strike{ $SP } +hud-skill-hmr_single_strike_damage_title = シングルストライク ダメージ +hud-skill-hmr_single_strike_damage = Increases the damage with each successive strike{ $SP } +hud-skill-hmr_single_strike_knockback_title = シングルストライク ノックバック +hud-skill-hmr_single_strike_knockback = スイングして投げる能力を{ $boost }%増加 { $SP } +hud-skill-sw_trip_str_title = トリプルストライク +hud-skill-sw_trip_str = 最大{ $boost }回までの連続攻撃 +hud-skill-sw_trip_str_combo_title = トリプルストライク コンボ +hud-skill-sw_trip_str_combo = 三連攻撃のコンボ回数を解除 { $SP } +hud-skill-sw_trip_str_dmg_title = トリプルストライク ダメージ +hud-skill-sw_trip_str_dmg = 連続攻撃のダメージを増加 { $SP } +hud-skill-sw_trip_str_sp_title = トリプルストライク 速度 +hud-skill-sw_trip_str_sp = 連続攻撃の速度を加速 { $SP } +hud-skill-sw_trip_str_reg_title = トリプルストライク スタミナ +hud-skill-sw_trip_str_reg = 連続攻撃のスタミナ獲得量を増加 { $SP } +hud-skill-sw_dash_title = ダッシュ +hud-skill-sw_dash = 敵を一撃で貫く +hud-skill-sw_dash_dmg_title = ダッシュ ダメージ +hud-skill-sw_dash_dmg = ダッシュ攻撃の初期ダメージを{ $boost }%増加 { $SP } +hud-skill-sw_dash_drain_title = ダッシュ ドレイン +hud-skill-sw_dash_drain = ダッシュ攻撃のエネルギー消費を{ $boost }%減少 { $SP } +hud-skill-sw_dash_cost_title = ダッシュ コスト +hud-skill-sw_dash_cost = ダッシュ攻撃の初期スタミナ消費を{ $boost }%減少 { $SP } +hud-skill-sw_dash_speed_title = ダッシュ 速度 +hud-skill-sw_dash_speed = ダッシュ攻撃の速度を{ $boost }%増加 { $SP } +hud-skill-sw_dash_inf_title = 無限ダッシュ攻撃 +hud-skill-sw_dash_inf = エネルギーの続く限りダッシュ攻撃する { $SP } +hud-skill-sw_dash_scale_title = ダッシュ ダメージ増量 +hud-skill-sw_dash_scale = ダッシュ攻撃のダメージ量を{ $boost }%増加 { $SP } +hud-skill-sw_spin_title = スピン解除 +hud-skill-sw_spin = 剣の回転攻撃を解除 { $SP } +hud-skill-sw_spin_dmg_title = スピン ダメージ +hud-skill-sw_spin_dmg = 与えるダメージを{ $boost }%増加 { $SP } +hud-skill-sw_spin_spd_title = スピン 速度 +hud-skill-sw_spin_spd = スピン攻撃の速度を{ $boost }%増加 { $SP } +hud-skill-sw_spin_cost_title = スピン コスト +hud-skill-sw_spin_cost = スピンごとに消費するエネルギーを{ $boost }%減少 { $SP } +hud-skill-sw_spin_spins_title = スピン 回転 +hud-skill-sw_spin_spins = スピン回数を増やします{ $SP } +hud-skill-sw_interrupt_title = 攻撃キャンセル +hud-skill-sw_interrupt = 別の攻撃のために攻撃を中断してキャンセルする { $SP } +hud-skill-axe_double_strike_title = ダブルストライク +hud-skill-axe_double_strike = 悪党をぶった切る +hud-skill-axe_double_strike_combo_title = ダブルストライク コンボ +hud-skill-axe_double_strike_combo = 第二波攻撃を解除 { $SP } +hud-skill-axe_double_strike_damage_title = ダブルストライク ダメージ +hud-skill-axe_double_strike_damage = 攻撃がヒットするたびにダメージが増加 { $SP } +hud-skill-axe_double_strike_speed_title = ダブルストライク 速度 +hud-skill-axe_double_strike_speed = 攻撃がヒットするたびに攻撃速度を加速 { $SP } +hud-skill-axe_double_strike_regen_title = ダブルストライク 再生 +hud-skill-axe_double_strike_regen = 連続攻撃がヒットするたびにスタミナ獲得量が増加 { $SP } +hud-skill-axe_spin_title = アックススピン +hud-skill-axe_spin = ぐるぐる回ります +hud-skill-axe_infinite_axe_spin_title = 無限アックススピン +hud-skill-axe_infinite_axe_spin = エネルギーが続く限り斧でスピン攻撃する { $SP } +hud-skill-axe_spin_damage_title = スピン ダメージ +hud-skill-axe_spin_damage = { $boost }回のスピンで与えるダメージを増加 { $SP } +hud-skill-axe_spin_helicopter_title = スピン ヘリコプター +hud-skill-axe_spin_helicopter = 回転している間はゆっくりと降下する { $SP } +hud-skill-axe_spin_speed_title = スピン 速度 +hud-skill-axe_spin_speed = スピン速度を{ $boost }%増加 { $SP } +hud-skill-axe_spin_cost_title = スピン コスト +hud-skill-axe_spin_cost = スピンのスタミナ消費量を{ $boost }%減少 { $SP } +hud-skill-axe_unlock_leap_title = リープ解除 +hud-skill-axe_unlock_leap = リープスピンを解除 { $SP } +hud-skill-axe_leap_damage_title = リープ ダメージ +hud-skill-axe_leap_damage = リープのダメージを{ $boost }%増加 { $SP } +hud-skill-axe_leap_knockback_title = リープ ノックバック +hud-skill-axe_leap_knockback = リープによるノックバックを{ $boost }%増加 { $SP } +hud-skill-axe_leap_cost_title = リープ コスト +hud-skill-axe_leap_cost = リープのコストを{ $boost }%ダウン { $SP } +hud-skill-axe_leap_distance_title = リープ 距離 +hud-skill-axe_leap_distance = リープの距離を{ $boost }%増加 { $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/skills.ron b/assets/voxygen/i18n/ja_JP/hud/skills.ron deleted file mode 100644 index 2e3dc865af..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/skills.ron +++ /dev/null @@ -1,247 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "hud.rank_up": "スキルポイント獲得", - "hud.skill.sp_available": "{number} SP 利用可能", - "hud.skill.not_unlocked": "解除されていません", - "hud.skill.req_sp": "\n\n{number}SP必要", - // Skills - // General - "hud.skill.inc_health_title": "体力追加", - "hud.skill.inc_health": "体力の最大値を{boost}増加 {SP}", - "hud.skill.inc_energy_title": "スタミナ追加", - "hud.skill.inc_energy": "スタミナ最大値を{boost}増加 {SP}", - "hud.skill.unlck_sword_title": "剣解除", - "hud.skill.unlck_sword": "剣のスキルツリーを解除 {SP}", - "hud.skill.unlck_axe_title": "斧解除", - "hud.skill.unlck_axe": "斧のスキルツリーを解除 {SP}", - "hud.skill.unlck_hammer_title": "ハンマー解除", - "hud.skill.unlck_hammer": "ハンマーのスキルツリーを解除 {SP}", - "hud.skill.unlck_bow_title": "弓矢解除", - "hud.skill.unlck_bow": "弓矢のスキルツリーを解除 {SP}", - "hud.skill.unlck_staff_title": "杖解除", - "hud.skill.unlck_staff": "杖のスキルツリーを解除 {SP}", - "hud.skill.unlck_sceptre_title": "セプター解除", - "hud.skill.unlck_sceptre": "セプターのスキルツリーを解除 {SP}", - "hud.skill.dodge_title": "回避", - "hud.skill.dodge": "近接攻撃を素早く避ける {SP}", - "hud.skill.roll_energy_title": "ローリング スタミナコスト", - "hud.skill.roll_energy": "ローリングのスタミナ消費を{boost}%減少 {SP}", - "hud.skill.roll_speed_title": "ローリング 速度", - "hud.skill.roll_speed": "ローリングの速度を{boost}%加速 {SP}", - "hud.skill.roll_dur_title": "ローリング 時間", - "hud.skill.roll_dur": "ローリングの時間を{boost}%延長 {SP}", - "hud.skill.climbing_title": "よじ登り", - "hud.skill.climbing": "より高く登ります", - "hud.skill.climbing_cost_title": "よじ登り コスト", - "hud.skill.climbing_cost": "よじ登りのスタミナ消費を{boost}%減少 {SP}", - "hud.skill.climbing_speed_title": "よじ登り 速度", - "hud.skill.climbing_speed": "よじ登り速度を{boost}%加速 {SP}", - "hud.skill.swim_title": "泳ぎ", - "hud.skill.swim": "水中の移動", - "hud.skill.swim_speed_title": "泳ぎ 速度", - "hud.skill.swim_speed": "泳ぎの速度を{boost}%加速 {SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "ライフスティール ビーム", - "hud.skill.sc_lifesteal": "敵の体力を奪う", - "hud.skill.sc_lifesteal_damage_title": "ダメージ", - "hud.skill.sc_lifesteal_damage": "ダメージを{boost}%多く与える {SP}", - "hud.skill.sc_lifesteal_range_title": "範囲", - "hud.skill.sc_lifesteal_range": "ビームの距離を{boost}%増加 {SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "ライフスティール", - "hud.skill.sc_lifesteal_lifesteal": "敵の体力を{boost}%増しで奪う {SP}", - "hud.skill.sc_lifesteal_regen_title": "スタミナ再生", - "hud.skill.sc_lifesteal_regen": "スタミナをさらに{boost}%回復 {SP}", - "hud.skill.sc_heal_title": "ヒーリング ビーム", - "hud.skill.sc_heal": "敵の血を使って仲間を回復する", - "hud.skill.sc_heal_heal_title": "回復", - "hud.skill.sc_heal_heal": "体力の回復量を{boost}%増加 {SP}", - "hud.skill.sc_heal_cost_title": "スタミナ コスト", - "hud.skill.sc_heal_cost": "回復に必要なスタミナを{boost}%減少 {SP}", - "hud.skill.sc_heal_range_title": "範囲", - "hud.skill.sc_heal_range": "ビームの距離を{boost}%増加 {SP}", - "hud.skill.sc_wardaura_unlock_title": "結界オーラを解除", - "hud.skill.sc_wardaura_unlock": "敵の攻撃を防ぐ結界が張れます {SP}", - "hud.skill.sc_wardaura_strength_title": "強度", - "hud.skill.sc_wardaura_strength": "結界の強度を{boost}%強化 {SP}", - "hud.skill.sc_wardaura_duration_title": "効果", - "hud.skill.sc_wardaura_duration": "結界の効果時間を{boost}%延長 {SP}", - "hud.skill.sc_wardaura_range_title": "範囲", - "hud.skill.sc_wardaura_range": "結界の範囲を{boost}%増加 {SP}", - "hud.skill.sc_wardaura_cost_title": "スタミナ コスト", - "hud.skill.sc_wardaura_cost": "結界に必要なエネルギー消費を{boost}%減少 {SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "ショックウェーブ 範囲", - "hud.skill.st_shockwave_range" : "距離を{boost}%増加して手の届かない物も投げられる {SP}", - "hud.skill.st_shockwave_cost_title" : "ショックウェーブ コスト", - "hud.skill.st_shockwave_cost" : "無力な村人を投げるエネルギー消費を{boost}%減少 {SP}", - "hud.skill.st_shockwave_knockback_title" : "ショックウェーブ ノックバック", - "hud.skill.st_shockwave_knockback" : "投げる能力を{boost}%増加 {SP}", - "hud.skill.st_shockwave_damage_title" : "ショックウェーブ ダメージ", - "hud.skill.st_shockwave_damage" : "与えるダメージを{boost}%増加 {SP}", - "hud.skill.st_shockwave_unlock_title" : "ショックウェーブ解除", - "hud.skill.st_shockwave_unlock" : "炎で敵を吹き飛ばす能力を解除 {SP}", - "hud.skill.st_flamethrower_title" : "フレームスロワー", - "hud.skill.st_flamethrower" : "火炎放射で丸焼きにします", - "hud.skill.st_flame_velocity_title" : "フレーム 速度", - "hud.skill.st_flame_velocity" : "炎の放射速度を{boost}%加速 {SP}", - "hud.skill.st_flamethrower_range_title" : "フレームスロワー 範囲", - "hud.skill.st_flamethrower_range" : "炎が届かない場合に距離を{boost}%アップ {SP}", - "hud.skill.st_energy_drain_title" : "エナジードレイン", - "hud.skill.st_energy_drain" : "エネルギー消費量を{boost}%減少 {SP}", - "hud.skill.st_flamethrower_damage_title" : "フレームスロワー ダメージ", - "hud.skill.st_flamethrower_damage" : "ダメージを{boost}%増加 {SP}", - "hud.skill.st_explosion_radius_title" : "エクスプロージョン 範囲", - "hud.skill.st_explosion_radius" : "大きいのはいいですよね。爆発半径を{boost}%増加 {SP}", - "hud.skill.st_energy_regen_title" : "スタミナ 再生", - "hud.skill.st_energy_regen" : "スタミナ獲得量を{boost}%増加 {SP}", - "hud.skill.st_fireball_title" : "ファイアーボール", - "hud.skill.st_fireball" : "敵と一緒に遊びましょう", - "hud.skill.st_damage_title" : "ダメージ", - "hud.skill.st_damage" : "ダメージを{boost}%増加 {SP}", - "hud.skill.st_explosion_title" : "エクスプロージョン", - "hud.skill.st_explosion" : "炎だけで足りないければ {SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "発射 速度", - "hud.skill.bow_projectile_speed" : "矢の距離と速度を{boost}%アップ {SP}", - "hud.skill.bow_arrow_count_title" : "アロー カウント", - "hud.skill.bow_arrow_count" : "ジャンプ時に追加で矢を撃つ {SP}", - "hud.skill.bow_repeater_cost_title" : "リピーター コスト", - "hud.skill.bow_repeater_cost" : "連射のエネルギー消費を{boost}%減少 {SP}", - "hud.skill.bow_repeater_glide_title" : "リピーター グライド", - "hud.skill.bow_repeater_glide" : "Glide further while repeating{SP}", - "hud.skill.bow_repeater_damage_title" : "リピーター ダメージ", - "hud.skill.bow_repeater_damage" : "与えるダメージを{boost}%増加 {SP}", - "hud.skill.bow_repeater_unlock_title" : "リピーター解除", - "hud.skill.bow_repeater_unlock" : "中を舞うごとく矢を連射する能力を解除 {SP}", - "hud.skill.bow_charged_title" : "チャージドシュート", - "hud.skill.bow_charged" : "長く待ったので…", - "hud.skill.bow_charged_knockback_title" : "チャージド ノックバック", - "hud.skill.bow_charged_knockback" : "後方の敵に{boost}%ダメージを与える {SP}", - "hud.skill.bow_charged_move_speed_title" : "チャージド ムーブスピード", - "hud.skill.bow_charged_move_speed" : "Increases how fast you can shuffle while charging the attack by {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "チャージド スピード", - "hud.skill.bow_charged_speed" : "Increases the rate that you charge the attack by {boost}%{SP}", - "hud.skill.bow_charged_projectile_speed_title" : "チャージド プロジェクタイルスピード", - "hud.skill.bow_charged_projectile_speed" : "Projectile speed increased by an additional {boost}% while charging{SP}", - "hud.skill.bow_charged_drain_title" : "チャージド ドレイン", - "hud.skill.bow_charged_drain" : "Decreases the rate of stamina drain by {boost}%{SP}", - "hud.skill.bow_charged_damage_title" : "チャージド ダメージ", - "hud.skill.bow_charged_damage" : "Increases damage by {boost}%{SP}", - "hud.skill.bow_energy_regen_title" : "エナジー 再生", - "hud.skill.bow_energy_regen" : "Increases stamina gain by {boost}%{SP}", - "hud.skill.bow_title" : "アローシュート", - "hud.skill.bow" : "無限の矢筒。ただし子供不可", - "hud.skill.bow_damage_title" : "ダメージ", - "hud.skill.bow_damage" : "ダメージを{boost}%増加 {SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "リープ 範囲", - "hud.skill.hmr_leap_radius" : "グランドスラムの攻撃半径を{boost}m増加 {SP}", - "hud.skill.hmr_leap_distance_title" : "リープ 距離", - "hud.skill.hmr_leap_distance" : "リープの距離を{boost}%増加 {SP}", - "hud.skill.hmr_leap_cost_title" : "リープ コスト", - "hud.skill.hmr_leap_cost" : "リープのコストを{boost}%減少 {SP}", - "hud.skill.hmr_leap_knockback_title" : "リープ ノックバック", - "hud.skill.hmr_leap_knockback" : "リープのノックバックを{boost}%増加 {SP}", - "hud.skill.hmr_leap_damage_title" : "リープ ダメージ", - "hud.skill.hmr_leap_damage" : "リープのダメージを{boost}%増加 {SP}", - "hud.skill.hmr_unlock_leap_title" : "リープ解除", - "hud.skill.hmr_unlock_leap" : "リープを解除 {SP}", - "hud.skill.hmr_charged_melee_title" : "チャージドメレー", - "hud.skill.hmr_charged_melee" : "チャージ付き乱闘", - "hud.skill.hmr_charged_rate_title" : "チャージ レート", - "hud.skill.hmr_charged_rate" : "Increases the rate that you charge the swing by {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "チャージドメレー エナジードレイン", - "hud.skill.hmr_charged_melee_nrg_drain" : "Decreases the rate energy drains when charging by {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "チャージドメレー ダメージ", - "hud.skill.hmr_charged_melee_damage" : "Increases the damage of the charged swing by {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "チャージドメレー ノックバック", - "hud.skill.hmr_charged_melee_knockback" : "Massively increases throw potential of swing by {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "シングルストライク", - "hud.skill.hmr_single_strike" : "As single as you are", - "hud.skill.hmr_single_strike_regen_title" : "シングルストライク 再生", - "hud.skill.hmr_single_strike_regen" : "Increases stamina gain with each successive strike{SP}", - "hud.skill.hmr_single_strike_speed_title" : "シングルストライク スピード", - "hud.skill.hmr_single_strike_speed" : "Increases the attack speed with each successive strike{SP}", - "hud.skill.hmr_single_strike_damage_title" : "シングルストライク ダメージ", - "hud.skill.hmr_single_strike_damage" : "Increases the damage with each successive strike{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "シングルストライク ノックバック", - "hud.skill.hmr_single_strike_knockback" : "スイングして投げる能力を{boost}%増加 {SP}", - // Sword - "hud.skill.sw_trip_str_title": "トリプルストライク", - "hud.skill.sw_trip_str": "最大{boost}回までの連続攻撃", - "hud.skill.sw_trip_str_combo_title": "トリプルストライク コンボ", - "hud.skill.sw_trip_str_combo": "三連攻撃のコンボ回数を解除 {SP}", - "hud.skill.sw_trip_str_dmg_title": "トリプルストライク ダメージ", - "hud.skill.sw_trip_str_dmg": "連続攻撃のダメージを増加 {SP}", - "hud.skill.sw_trip_str_sp_title": "トリプルストライク 速度", - "hud.skill.sw_trip_str_sp": "連続攻撃の速度を加速 {SP}", - "hud.skill.sw_trip_str_reg_title": "トリプルストライク スタミナ", - "hud.skill.sw_trip_str_reg": "連続攻撃のスタミナ獲得量を増加 {SP}", - "hud.skill.sw_dash_title": "ダッシュ", - "hud.skill.sw_dash": "敵を一撃で貫く", - "hud.skill.sw_dash_dmg_title": "ダッシュ ダメージ", - "hud.skill.sw_dash_dmg": "ダッシュ攻撃の初期ダメージを{boost}%増加 {SP}", - "hud.skill.sw_dash_drain_title": "ダッシュ ドレイン", - "hud.skill.sw_dash_drain": "ダッシュ攻撃のエネルギー消費を{boost}%減少 {SP}", - "hud.skill.sw_dash_cost_title": "ダッシュ コスト", - "hud.skill.sw_dash_cost": "ダッシュ攻撃の初期スタミナ消費を{boost}%減少 {SP}", - "hud.skill.sw_dash_speed_title": "ダッシュ 速度", - "hud.skill.sw_dash_speed": "ダッシュ攻撃の速度を{boost}%増加 {SP}", - "hud.skill.sw_dash_inf_title": "無限ダッシュ攻撃", - "hud.skill.sw_dash_inf": "エネルギーの続く限りダッシュ攻撃する {SP}", - "hud.skill.sw_dash_scale_title": "ダッシュ ダメージ増量", - "hud.skill.sw_dash_scale": "ダッシュ攻撃のダメージ量を{boost}%増加 {SP}", - "hud.skill.sw_spin_title": "スピン解除", - "hud.skill.sw_spin": "剣の回転攻撃を解除 {SP}", - "hud.skill.sw_spin_dmg_title": "スピン ダメージ", - "hud.skill.sw_spin_dmg": "与えるダメージを{boost}%増加 {SP}", - "hud.skill.sw_spin_spd_title": "スピン 速度", - "hud.skill.sw_spin_spd": "スピン攻撃の速度を{boost}%増加 {SP}", - "hud.skill.sw_spin_cost_title": "スピン コスト", - "hud.skill.sw_spin_cost": "スピンごとに消費するエネルギーを{boost}%減少 {SP}", - "hud.skill.sw_spin_spins_title": "スピン 回転", - "hud.skill.sw_spin_spins": "スピン回数を増やします{SP}", - "hud.skill.sw_interrupt_title": "攻撃キャンセル", - "hud.skill.sw_interrupt": "別の攻撃のために攻撃を中断してキャンセルする {SP}", - // Axe - "hud.skill.axe_double_strike_title": "ダブルストライク", - "hud.skill.axe_double_strike": "悪党をぶった切る", - "hud.skill.axe_double_strike_combo_title": "ダブルストライク コンボ", - "hud.skill.axe_double_strike_combo": "第二波攻撃を解除 {SP}", - "hud.skill.axe_double_strike_damage_title": "ダブルストライク ダメージ", - "hud.skill.axe_double_strike_damage": "攻撃がヒットするたびにダメージが増加 {SP}", - "hud.skill.axe_double_strike_speed_title": "ダブルストライク 速度", - "hud.skill.axe_double_strike_speed": "攻撃がヒットするたびに攻撃速度を加速 {SP}", - "hud.skill.axe_double_strike_regen_title": "ダブルストライク 再生", - "hud.skill.axe_double_strike_regen": "連続攻撃がヒットするたびにスタミナ獲得量が増加 {SP}", - "hud.skill.axe_spin_title": "アックススピン", - "hud.skill.axe_spin": "ぐるぐる回ります", - "hud.skill.axe_infinite_axe_spin_title": "無限アックススピン", - "hud.skill.axe_infinite_axe_spin": "エネルギーが続く限り斧でスピン攻撃する {SP}", - "hud.skill.axe_spin_damage_title": "スピン ダメージ", - "hud.skill.axe_spin_damage": "{boost}回のスピンで与えるダメージを増加 {SP}", - "hud.skill.axe_spin_helicopter_title": "スピン ヘリコプター", - "hud.skill.axe_spin_helicopter": "回転している間はゆっくりと降下する {SP}", - "hud.skill.axe_spin_speed_title": "スピン 速度", - "hud.skill.axe_spin_speed": "スピン速度を{boost}%増加 {SP}", - "hud.skill.axe_spin_cost_title": "スピン コスト", - "hud.skill.axe_spin_cost": "スピンのスタミナ消費量を{boost}%減少 {SP}", - "hud.skill.axe_unlock_leap_title": "リープ解除", - "hud.skill.axe_unlock_leap": "リープスピンを解除 {SP}", - "hud.skill.axe_leap_damage_title": "リープ ダメージ", - "hud.skill.axe_leap_damage": "リープのダメージを{boost}%増加 {SP}", - "hud.skill.axe_leap_knockback_title": "リープ ノックバック", - "hud.skill.axe_leap_knockback": "リープによるノックバックを{boost}%増加 {SP}", - "hud.skill.axe_leap_cost_title": "リープ コスト", - "hud.skill.axe_leap_cost": "リープのコストを{boost}%ダウン {SP}", - "hud.skill.axe_leap_distance_title": "リープ 距離", - "hud.skill.axe_leap_distance": "リープの距離を{boost}%増加 {SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ja_JP/hud/social.ftl b/assets/voxygen/i18n/ja_JP/hud/social.ftl new file mode 100644 index 0000000000..8a3efb1738 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = ほかのプレーヤー +hud-social-online = オンライン: +hud-social-friends = 友達 +hud-social-not_yet_available = 利用不可 +hud-social-faction = 陣営 +hud-social-play_online_fmt = { $nb_player }人がオンライン +hud-social-name = 名前 +hud-social-level = レベル +hud-social-zone = ゾーン +hud-social-account = アカウント \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/social.ron b/assets/voxygen/i18n/ja_JP/hud/social.ron deleted file mode 100644 index d3b989653d..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "hud.social": "ほかのプレーヤー", - "hud.social.online": "オンライン:", - "hud.social.friends": "友達", - "hud.social.not_yet_available": "利用不可", - "hud.social.faction": "陣営", - "hud.social.play_online_fmt": "{nb_player}人がオンライン", - "hud.social.name": "名前", - "hud.social.level": "レベル", - "hud.social.zone": "ゾーン", - "hud.social.account": "アカウント", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ja_JP/hud/trade.ftl b/assets/voxygen/i18n/ja_JP/hud/trade.ftl new file mode 100644 index 0000000000..19355bb9a1 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/hud/trade.ftl @@ -0,0 +1,21 @@ +hud-trade-trade_window = 取引ウィンドウ +hud-trade-phase1_description = + 取引するアイテムを + 所定の場所にドラッグしてください +hud-trade-phase2_description = + 取引はロックされています + まだ確認する時間はあります +hud-trade-phase3_description = 取引は進行中です +hud-trade-persons_offer = { $playername }の提示 +hud-trade-has_accepted = + { $playername } + は承諾しました +hud-trade-accept = 承諾 +hud-trade-decline = 辞退 +hud-trade-invite_sent = { $playername }に取引リクエストを送りました。 +hud-trade-result-completed = 取引は成立しました。 +hud-trade-result-declined = 取引は不成立でした。 +hud-trade-result-nospace = 取引を完了するためのスペースがありません。 +hud-trade-buy_price = 購入価格 +hud-trade-sell_price = 販売価格 +hud-trade-coin = コイン \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/hud/trade.ron b/assets/voxygen/i18n/ja_JP/hud/trade.ron deleted file mode 100644 index fc13fb626f..0000000000 --- a/assets/voxygen/i18n/ja_JP/hud/trade.ron +++ /dev/null @@ -1,28 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - "hud.trade.trade_window": "取引ウィンドウ", - "hud.trade.phase1_description": "取引するアイテムを\n所定の場所にドラッグしてください", - "hud.trade.phase2_description": "取引はロックされています\nまだ確認する時間はあります", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "取引は進行中です", - "hud.trade.persons_offer": "{playername}の提示", - "hud.trade.has_accepted": "{playername}\nは承諾しました", - "hud.trade.accept": "承諾", - "hud.trade.decline": "辞退", - "hud.trade.invite_sent": "{playername}に取引リクエストを送りました。", - "hud.trade.result.completed": "取引は成立しました。", - "hud.trade.result.declined": "取引は不成立でした。", - "hud.trade.result.nospace": "取引を完了するためのスペースがありません。", - "hud.trade.buy_price": "購入価格", - "hud.trade.sell_price": "販売価格", - "hud.trade.coin": "コイン", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ja_JP/main.ftl b/assets/voxygen/i18n/ja_JP/main.ftl new file mode 100644 index 0000000000..615031672f --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/main.ftl @@ -0,0 +1,72 @@ +main-username = ユーザー名 +main-server = サーバー +main-password = パスワード +main-connecting = 接続中 +main-creating_world = 世界を生成中 +main-tip = ヒント: +main-notice = + Velorenアルファ版へようこそ! + + 楽しいゲームへ飛び込む前に、いくつか注意事項があります。 + + - このゲームは、非常に開発初期状態のアルファ版ゲームです。バグ、極めて未完成なゲーム性、洗練されていない操作性、不足している機能が予想されます。 + + - あなたが建設的なフィードバックやバグ報告をしたいなら、Reddit、GitLab、コミュニティのDiscordサーバーから英語で私たちにご連絡ください。 + + - VelorenはGPL 3のオープンソースライセンスの下に提供されています。つまり、あなたはゲームを自由に遊んだり、改造したりコピーできます + (派生した作品もGPL 3の下ならばという条件でです) + + - Velorenは非営利のコミュニティプロジェクトで、作業をしている人も全員、無償のボランティアです。 + 気に入ったなら、開発チームやアートチームにぜひご参加ください。 + + このお知らせを読んでいただき、ありがとうございます。それではゲームを楽しんでください! + + ~ Veloren開発チームより +main-login_process = + ログインについてのご案内 + + 認証が必要なサーバーでプレイするには + アカウントが必要です。 + + アカウントは、以下のURLで作成できます。 + + https://veloren.net/account/ +main-login-server_not_found = サーバーが見つかりません +main-login-authentication_error = サーバーで認証エラーです +main-login-failed_auth_server_url_invalid = 認証サーバーへの接続に失敗しました +main-login-insecure_auth_scheme = HTTPの認証機構はサポートしていません。これは安全ではありません。HTTPは、開発目的向けにlocalhostまたはデバッグビルドだけに許可されています。 +main-login-server_full = サーバーがいっぱいです +main-login-untrusted_auth_server = 信頼できない認証サーバーです +main-login-outdated_client_or_server = サーバーがおかしいです: おそらく、このバージョンには互換性がありません。アップデートをチェックしてください。 +main-login-timeout = タイムアウト: サーバーは時間内に応答しませんでした。(サーバー過負荷かネットワークの問題の可能性) +main-login-server_shut_down = サーバーが起動していません +main-login-network_error = ネットワーク エラー +main-login-network_wrong_version = サーバーは、あなたのバージョンと異なるバージョンが使われています。バージョンの確認をして、ゲームをアップデートしてください。 +main-login-failed_sending_request = 認証サーバーへのリクエストが失敗しました +main-login-invalid_character = 選択したキャラクターは無効です +main-login-client_crashed = クライアントがクラッシュしました +main-login-not_on_whitelist = 参加するには管理者の許可リストへの登録が必要です +main-login-banned = あなたは以下の理由で利用停止されています +main-login-kicked = あなたは以下の理由で利用できません +main-login-select_language = 言語の選択 +main-servers-select_server = サーバーの選択 +loading-tips = + .a0 = { $gameinput-togglelantern }キーを押すとランタンが灯ります。 + .a1 = { $gameinput-help }キーを押すとすべてのデフォルトキー設定の確認できます。 + .a2 = /sayまたは/sと入力すると自分の周りのプレイヤーとだけチャットできます。 + .a3 = /regionまたは/rと入力すると自分の周辺、数百ブロックのプレーヤーとだけチャットできます。 + .a4 = 管理者は、/buildコマンドでビルドモードに入れます。 + .a5 = /groupまたは/gと入力すると現在所属しているグループのプレイヤーとだけチャットできます。 + .a6 = プライベートメッセージを送るには、/tellと入力したあと、プレイヤー名とメッセージを入力します。 + .a7 = 世界中に散らばっている食料やチェストに注目してみましょう! + .a8 = 持ち物が食料でいっぱいですか?それを使ってもっといい食料をクラフトしてみましょう! + .a9 = 何をしたらいいかわからないですか?地図にあるダンジョンに挑戦してみましょう! + .a10 = お使いのシステムに合わせてグラフィックの調整もお忘れなく。{ $gameinput-settings }キーを押すと設定が開きます。 + .a11 = 誰かと一緒に遊ぶのは楽しいですよね!{ $gameinput-social }キーを押すと誰がオンラインかわかります。 + .a12 = { $gameinput-dance }キーを押すとダンスします。パーティ! + .a13 = { $gameinput-glide }キーを押すとグライダーが開いて空を攻略できます。 + .a14 = Velorenは、まだアルファ版です。私たちは日々、改善のためにベストを尽くしています! + .a15 = 開発チームに参加したい方や私たちとチャットしたい方はDiscordサーバーに参加しましょう。 + .a16 = 体力バーに表示される体力量の表示は、設定で切り替えられます。 + .a17 = { $gameinput-sit }キーを押して焚き火のそばに座ると体力がゆっくり回復します + .a18 = 冒険のためにバッグやいい鎧が欲しいですか?Cキーを押すとクラフトメニューが開きます。 \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/main.ron b/assets/voxygen/i18n/ja_JP/main.ron deleted file mode 100644 index 069823018c..0000000000 --- a/assets/voxygen/i18n/ja_JP/main.ron +++ /dev/null @@ -1,89 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - /// メイン画面開始 - "main.username": "ユーザー名", - "main.server": "サーバー", - "main.password": "パスワード", - "main.connecting": "接続中", - "main.creating_world": "世界を生成中", - "main.tip": "ヒント:", - - // Velorenを初めて起動したときに表示されるウェルカムメッセージ - "main.notice": r#"Velorenアルファ版へようこそ! - -楽しいゲームへ飛び込む前に、いくつか注意事項があります。 - -- このゲームは、非常に開発初期状態のアルファ版ゲームです。バグ、極めて未完成なゲーム性、洗練されていない操作性、不足している機能が予想されます。 - -- あなたが建設的なフィードバックやバグ報告をしたいなら、Reddit、GitLab、コミュニティのDiscordサーバーから英語で私たちにご連絡ください。 - -- VelorenはGPL 3のオープンソースライセンスの下に提供されています。つまり、あなたはゲームを自由に遊んだり、改造したりコピーできます - (派生した作品もGPL 3の下ならばという条件でです) - -- Velorenは非営利のコミュニティプロジェクトで、作業をしている人も全員、無償のボランティアです。 -気に入ったなら、開発チームやアートチームにぜひご参加ください。 - -このお知らせを読んでいただき、ありがとうございます。それではゲームを楽しんでください! - -~ Veloren開発チームより"#, - - // ログインプロセスの説明 - "main.login_process": r#"ログインについてのご案内 - -認証が必要なサーバーでプレイするには -アカウントが必要です。 - -アカウントは、以下のURLで作成できます。 - -https://veloren.net/account/"#, - "main.login.server_not_found": "サーバーが見つかりません", - "main.login.authentication_error": "サーバーで認証エラーです", - "main.login.failed_auth_server_url_invalid": "認証サーバーへの接続に失敗しました", - "main.login.insecure_auth_scheme": "HTTPの認証機構はサポートしていません。これは安全ではありません。HTTPは、開発目的向けにlocalhostまたはデバッグビルドだけに許可されています。", - "main.login.server_full": "サーバーがいっぱいです", - "main.login.untrusted_auth_server": "信頼できない認証サーバーです", - "main.login.outdated_client_or_server": "サーバーがおかしいです: おそらく、このバージョンには互換性がありません。アップデートをチェックしてください。", - "main.login.timeout": "タイムアウト: サーバーは時間内に応答しませんでした。(サーバー過負荷かネットワークの問題の可能性)", - "main.login.server_shut_down": "サーバーが起動していません", - "main.login.network_error": "ネットワーク エラー", - "main.login.network_wrong_version": "サーバーは、あなたのバージョンと異なるバージョンが使われています。バージョンの確認をして、ゲームをアップデートしてください。", - "main.login.failed_sending_request": "認証サーバーへのリクエストが失敗しました", - "main.login.invalid_character": "選択したキャラクターは無効です", - "main.login.client_crashed": "クライアントがクラッシュしました", - "main.login.not_on_whitelist": "参加するには管理者の許可リストへの登録が必要です", - "main.login.banned": "あなたは以下の理由で利用停止されています", - "main.login.kicked": "あなたは以下の理由で利用できません", - "main.login.select_language": "言語の選択", - - "main.servers.select_server": "サーバーの選択", - /// メイン画面セクション終わり - }, - - - vector_map: { - "loading.tips": [ - "{gameinput.togglelantern}キーを押すとランタンが灯ります。", - "{gameinput.help}キーを押すとすべてのデフォルトキー設定の確認できます。", - "/sayまたは/sと入力すると自分の周りのプレイヤーとだけチャットできます。", - "/regionまたは/rと入力すると自分の周辺、数百ブロックのプレーヤーとだけチャットできます。", - "管理者は、/buildコマンドでビルドモードに入れます。", - "/groupまたは/gと入力すると現在所属しているグループのプレイヤーとだけチャットできます。", - "プライベートメッセージを送るには、/tellと入力したあと、プレイヤー名とメッセージを入力します。", - "世界中に散らばっている食料やチェストに注目してみましょう!", - "持ち物が食料でいっぱいですか?それを使ってもっといい食料をクラフトしてみましょう!", - "何をしたらいいかわからないですか?地図にあるダンジョンに挑戦してみましょう!", - "お使いのシステムに合わせてグラフィックの調整もお忘れなく。{gameinput.settings}キーを押すと設定が開きます。", - "誰かと一緒に遊ぶのは楽しいですよね!{gameinput.social}キーを押すと誰がオンラインかわかります。", - "{gameinput.dance}キーを押すとダンスします。パーティ!", - "{gameinput.glide}キーを押すとグライダーが開いて空を攻略できます。", - "Velorenは、まだアルファ版です。私たちは日々、改善のためにベストを尽くしています!", - "開発チームに参加したい方や私たちとチャットしたい方はDiscordサーバーに参加しましょう。", - "体力バーに表示される体力量の表示は、設定で切り替えられます。", - "{gameinput.sit}キーを押して焚き火のそばに座ると体力がゆっくり回復します", - "冒険のためにバッグやいい鎧が欲しいですか?Cキーを押すとクラフトメニューが開きます。", - ], - } -) diff --git a/assets/voxygen/i18n/ja_JP/npc.ftl b/assets/voxygen/i18n/ja_JP/npc.ftl new file mode 100644 index 0000000000..1ee0d94b85 --- /dev/null +++ b/assets/voxygen/i18n/ja_JP/npc.ftl @@ -0,0 +1,159 @@ +npc-speech-villager = + .a0 = こんな素敵な日があってもいいよね? + .a1 = ご機嫌いかが? + .a2 = 最高の朝を迎えましょう! + .a3 = カトブレパスは なにを考えて草を食べてるのだろう + .a4 = この天気についてどうお考えですか? + .a5 = あのダンジョンの事を考えると怖くなります。誰かがあそこをクリアしてくれないだろうか + .a6 = 強くなったら洞窟に探検に行きたいですね + .a7 = 私の猫チャンを見かけなかった? + .a8 = ランドシャークという獰猛なサメをご存知ですか?なんでも砂漠に住んでるらしいですよ + .a9 = 洞窟には さまざまな種類の光り輝く宝石が見つかるらしいですよ + .a10 = やっぱ チーズにはクラッカー! + .a11 = 寄っていきませんか?ちょうどチーズを食べようとしてたところなんです + .a12 = マッシュルームは健康に良いと言われてます。自分は食べないですけど + .a13 = クラッカーを忘れるな! + .a14 = 私はシンプルにドワーフチーズに憧れてます。作れたらなぁ + .a15 = 山の向こう側には何があるのだろう + .a16 = いつの日か 自分のグライダーを作ってみたいですね + .a17 = 私の庭を見ていかない?うん また今度ね + .a18 = 森を散歩するには なんて素敵な日なんだ! + .a19 = なるべきか ならざるべきか… 僕は農家にだけど + .a20 = 私たちの村が一番だと思わない? + .a21 = なんで光る死体は光っているんだろう? + .a22 = 二度目の朝ゴハンの時間だよ! + .a23 = ホタルを捕まえたことはある? + .a24 = あのサウロクたちが どこから来ているのか想像できませんね + .a25 = 誰か狼を村から遠ざけてくれればいいのに + .a26 = 昨晩 素敵なチーズの夢を見ました。それってどういう意味なの? + .a27 = 兄にチーズを残してきました。でも 今となってはそれが存在するのかわかりません。だから 私は「シュレディンガーのチーズ」と呼んでいます + .a28 = 妹にチーズを残してきました。でも 今となってはそれが存在するのかわかりません。だから 私は「シュレディンガーのチーズ」と呼んでいます + .a29 = 誰かが あのカルト教団をなんとかしないといけない。私は やりたくないけど + .a30 = 早く雨が降ってほしい。雨は作物にいいからね + .a31 = ハチミツ大好き! でも ハチは大嫌い! + .a32 = 私はいつか世界を見てみたい。この村よりももっと豊かな人生があるはずだから +npc-speech-villager_decline_trade = + .a0 = ごめんなさい、取引するものがありません。 + .a1 = 取引?あなたの興味のあるものを持ってきたら考えますよ。 + .a2 = この家は私の物です。この家に取引するものはありません。 +npc-speech-merchant_advertisement = + .a0 = 取引に興味はありますか? + .a1 = 私と取引しませんか? + .a2 = 商品がたくさんあるけど、ちょっと見ていきませんか? +npc-speech-merchant_busy = + .a0 = おい、順番を待ちな + .a1 = ちょっと待ってください。私の体は一つしかないんですよ + .a2 = 目の前にいる人を見て言ってますか? + .a3 = ちょっと待って。最後まで取引させて + .a4 = 割り込まないでください。 + .a5 = 忙しいから、また後で来てね。 +npc-speech-merchant_trade_successful = + .a0 = 取引をしてくれて、ありがとう! + .a1 = ありがとう! +npc-speech-merchant_trade_declined = + .a0 = また、機会があれば、よろしくお願いします + .a1 = 残念です。またの機会によろしく! +npc-speech-villager_cultist_alarm = + .a0 = 気をつけて!信者が逃げてるぞ! + .a1 = 武器を取れ!カルト信者が襲ってくるぞ! + .a2 = よくもまあ、私たちの村をカルトが襲うなんて! + .a3 = カルト信者に死を! + .a4 = ここではカルト信者でいることは許されません! + .a5 = 人殺しカルト教団! + .a6 = うす汚いカルト信者よ。俺の刃を味わえ! + .a7 = カルト信者よ、その手の血を拭うことはできないぞ! + .a8 = まばゆいばかりに光り輝く数十億の青いフジツボ!カルト信者が紛れ込んでいるぞ! + .a9 = この邪悪な信者はもうすぐ終わる! + .a10 = カルト信者は私のもの! + .a11 = 創造主に会う準備をしろ、このうす汚いカルト信者! + .a12 = 信者を見つけたぞ!捕まえろ! + .a13 = 信者を見つけたぞ!攻撃しろ! + .a14 = 信者を見つけたぞ!ヤツらを逃すな! + .a15 = 最も高潔なカルト信者は死を望むのか!? + .a16 = 忘れるな!忘れるな!カルト信者よ、悔改めよ! + .a17 = 死ね、カルト信者! + .a18 = 恐怖の支配が始まるぞ! + .a19 = これまでの活動に感謝します! + .a20 = ここではあなたのような方は歓迎されませんよ。 + .a21 = 地下にずっと潜ってりゃよかったのに! +npc-speech-villager_under_attack = + .a0 = 助けて、襲撃されてます! + .a1 = 助けて!襲われてます! + .a2 = ああっ!襲われてます! + .a3 = ああっ!襲撃されてます!助けて! + .a4 = 助けてください!襲われてます! + .a5 = 襲われています!助けて! + .a6 = 襲われています!助けてください! + .a7 = 助けて! + .a8 = 助けて!助けて! + .a9 = 助けて!助けて!助けて! + .a10 = 襲われています! + .a11 = あああああ!襲われてます! + .a12 = あああああ!襲撃されてます!助けて! + .a13 = 助けて!私たちは襲撃されてます! + .a14 = 助けて!人殺し! + .a15 = 助けて!人殺しが逃亡しています! + .a16 = 助けて!私を殺そうとしています! + .a17 = 衛兵さん、襲われています! + .a18 = 衛兵!襲われてます! + .a19 = 襲われています!衛兵! + .a20 = 助けて!衛兵!襲われてます! + .a21 = 衛兵!早く来て! + .a22 = 衛兵!衛兵! + .a23 = 衛兵!悪党に襲ってきた! + .a24 = 衛兵、うす汚い悪党を切って! + .a25 = 衛兵!人殺しがいる! + .a26 = 衛兵!助けてください! + .a27 = このままでは許さないぞ!衛兵! + .a28 = この、悪魔め! + .a29 = 助けてください! + .a30 = 助けて!お願い! + .a31 = ああっ!衛兵!助けて! + .a32 = 狙われてます! + .a33 = 助けて!助けて!私は抑圧されてる! + .a34 = ああ、システムに内在する暴力が見えてきた。 + .a35 = ただのかすり傷だ! + .a36 = 止めてくれ! + .a37 = お前に何をしたっていうんだよ! + .a38 = お願いですから、攻撃を止めてください! + .a39 = ヘイ!どこに向けてるんだ! + .a40 = 凶暴な奴らは消えてしまえ! + .a41 = 止まれ!出ていけ! + .a42 = 私は怒っている! + .a43 = おい!!お前は何様だと思ってるんだ! + .a44 = お前の首を取ってやるぜ! + .a45 = 止めて、お願い!金目のものは持ってないんだ! + .a46 = 兄貴を連れてくるぞ、俺よりデカいんだからな! + .a47 = ノー!母ちゃんにいいつけてやる! + .a48 = 呪ってやる! + .a49 = お願いだから止めてください。 + .a50 = ひでえな! + .a51 = 武器は使ったんだから、もうしまってくれよ! + .a52 = 惜しい! + .a53 = お願い、私には家族がいます! + .a54 = 私は死ぬには若すぎます! + .a55 = 話し合いませんか? + .a56 = 暴力は解決策ではないぞ! + .a57 = 今日は最悪の日だ… + .a58 = おい、痛いって! + .a59 = えっ! + .a60 = 失礼な! + .a61 = 止めてくださいよ! + .a62 = 毒を食わわば皿まで! + .a63 = それは楽しくないです。 + .a64 = よくもそんなことを! + .a65 = この代償は大きいぞ! + .a66 = そんな調子だと後悔するぞ! + .a67 = 痛い目に合わせないでくれよ! + .a68 = なにか勘違いしていないか! + .a69 = こんなことするなよ! + .a70 = 悪魔よ出ていけ! + .a71 = めっちゃ痛い! + .a72 = なぜこんなことをするの? + .a73 = 霊よ、静まれ! + .a74 = 誰かと勘違いしてるんじゃないか! + .a75 = 私にはもったいないです! + .a76 = 二度としないで。 + .a77 = 衛兵、この化け物を湖に沈めて! + .a78 = 俺のタラスクを送り込んでやるぜ! + .a79 = なぜ、わたしがー? \ No newline at end of file diff --git a/assets/voxygen/i18n/ja_JP/npc.ron b/assets/voxygen/i18n/ja_JP/npc.ron deleted file mode 100644 index d0b5e8da72..0000000000 --- a/assets/voxygen/i18n/ja_JP/npc.ron +++ /dev/null @@ -1,178 +0,0 @@ -/// 警告: ローカライズファイルは、UTF-8のBOM無しで保存する必要があります - -/// Localization for 日本語 Japanese -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "こんな素敵な日があってもいいよね?", - "ご機嫌いかが?", - "最高の朝を迎えましょう!", - "カトブレパスは なにを考えて草を食べてるのだろう", - "この天気についてどうお考えですか?", - "あのダンジョンの事を考えると怖くなります。誰かがあそこをクリアしてくれないだろうか", - "強くなったら洞窟に探検に行きたいですね", - "私の猫チャンを見かけなかった?", - "ランドシャークという獰猛なサメをご存知ですか?なんでも砂漠に住んでるらしいですよ", - "洞窟には さまざまな種類の光り輝く宝石が見つかるらしいですよ", - "やっぱ チーズにはクラッカー!", - "寄っていきませんか?ちょうどチーズを食べようとしてたところなんです", - "マッシュルームは健康に良いと言われてます。自分は食べないですけど", - "クラッカーを忘れるな!", - "私はシンプルにドワーフチーズに憧れてます。作れたらなぁ", - "山の向こう側には何があるのだろう", - "いつの日か 自分のグライダーを作ってみたいですね", - "私の庭を見ていかない?うん また今度ね", - "森を散歩するには なんて素敵な日なんだ!", - "なるべきか ならざるべきか… 僕は農家にだけど", - "私たちの村が一番だと思わない?", - "なんで光る死体は光っているんだろう?", - "二度目の朝ゴハンの時間だよ!", - "ホタルを捕まえたことはある?", - "あのサウロクたちが どこから来ているのか想像できませんね", - "誰か狼を村から遠ざけてくれればいいのに", - "昨晩 素敵なチーズの夢を見ました。それってどういう意味なの?", - "兄にチーズを残してきました。でも 今となってはそれが存在するのかわかりません。だから 私は「シュレディンガーのチーズ」と呼んでいます", - "妹にチーズを残してきました。でも 今となってはそれが存在するのかわかりません。だから 私は「シュレディンガーのチーズ」と呼んでいます", - "誰かが あのカルト教団をなんとかしないといけない。私は やりたくないけど", - "早く雨が降ってほしい。雨は作物にいいからね", - "ハチミツ大好き! でも ハチは大嫌い!", - "私はいつか世界を見てみたい。この村よりももっと豊かな人生があるはずだから", - ], - "npc.speech.villager_decline_trade": [ - "ごめんなさい、取引するものがありません。", - "取引?あなたの興味のあるものを持ってきたら考えますよ。", - "この家は私の物です。この家に取引するものはありません。", - ], - "npc.speech.merchant_advertisement": [ - "取引に興味はありますか?", - "私と取引しませんか?", - "商品がたくさんあるけど、ちょっと見ていきませんか?" - ], - "npc.speech.merchant_busy": [ - "おい、順番を待ちな", - "ちょっと待ってください。私の体は一つしかないんですよ", - "目の前にいる人を見て言ってますか?", - "ちょっと待って。最後まで取引させて", - "割り込まないでください。", - "忙しいから、また後で来てね。" - ], - "npc.speech.merchant_trade_successful": [ - "取引をしてくれて、ありがとう!", - "ありがとう!", - ], - "npc.speech.merchant_trade_declined": [ - "また、機会があれば、よろしくお願いします", - "残念です。またの機会によろしく!" - ], - "npc.speech.villager_cultist_alarm": [ - "気をつけて!信者が逃げてるぞ!", - "武器を取れ!カルト信者が襲ってくるぞ!", - "よくもまあ、私たちの村をカルトが襲うなんて!", - "カルト信者に死を!", - "ここではカルト信者でいることは許されません!", - "人殺しカルト教団!", - "うす汚いカルト信者よ。俺の刃を味わえ!", - "カルト信者よ、その手の血を拭うことはできないぞ!", - "まばゆいばかりに光り輝く数十億の青いフジツボ!カルト信者が紛れ込んでいるぞ!", - "この邪悪な信者はもうすぐ終わる!", - "カルト信者は私のもの!", - "創造主に会う準備をしろ、このうす汚いカルト信者!", - "信者を見つけたぞ!捕まえろ!", - "信者を見つけたぞ!攻撃しろ!", - "信者を見つけたぞ!ヤツらを逃すな!", - "最も高潔なカルト信者は死を望むのか!?", - "忘れるな!忘れるな!カルト信者よ、悔改めよ!", - "死ね、カルト信者!", - "恐怖の支配が始まるぞ!", - "これまでの活動に感謝します!", - "ここではあなたのような方は歓迎されませんよ。", - "地下にずっと潜ってりゃよかったのに!", - ], - "npc.speech.villager_under_attack": [ - "助けて、襲撃されてます!", - "助けて!襲われてます!", - "ああっ!襲われてます!", - "ああっ!襲撃されてます!助けて!", - "助けてください!襲われてます!", - "襲われています!助けて!", - "襲われています!助けてください!", - "助けて!", - "助けて!助けて!", - "助けて!助けて!助けて!", - "襲われています!", - "あああああ!襲われてます!", - "あああああ!襲撃されてます!助けて!", - "助けて!私たちは襲撃されてます!", - "助けて!人殺し!", - "助けて!人殺しが逃亡しています!", - "助けて!私を殺そうとしています!", - "衛兵さん、襲われています!", - "衛兵!襲われてます!", - "襲われています!衛兵!", - "助けて!衛兵!襲われてます!", - "衛兵!早く来て!", - "衛兵!衛兵!", - "衛兵!悪党に襲ってきた!", - "衛兵、うす汚い悪党を切って!", - "衛兵!人殺しがいる!", - "衛兵!助けてください!", - "このままでは許さないぞ!衛兵!", - "この、悪魔め!", - "助けてください!", - "助けて!お願い!", - "ああっ!衛兵!助けて!", - "狙われてます!", - "助けて!助けて!私は抑圧されてる!", - "ああ、システムに内在する暴力が見えてきた。", - "ただのかすり傷だ!", - "止めてくれ!", - "お前に何をしたっていうんだよ!", - "お願いですから、攻撃を止めてください!", - "ヘイ!どこに向けてるんだ!", - "凶暴な奴らは消えてしまえ!", - "止まれ!出ていけ!", - "私は怒っている!", - "おい!!お前は何様だと思ってるんだ!", - "お前の首を取ってやるぜ!", - "止めて、お願い!金目のものは持ってないんだ!", - "兄貴を連れてくるぞ、俺よりデカいんだからな!", - "ノー!母ちゃんにいいつけてやる!", - "呪ってやる!", - "お願いだから止めてください。", - "ひでえな!", - "武器は使ったんだから、もうしまってくれよ!", - "惜しい!", - "お願い、私には家族がいます!", - "私は死ぬには若すぎます!", - "話し合いませんか?", - "暴力は解決策ではないぞ!", - "今日は最悪の日だ…", - "おい、痛いって!", - "えっ!", - "失礼な!", - "止めてくださいよ!", - "毒を食わわば皿まで!", - "それは楽しくないです。", - "よくもそんなことを!", - "この代償は大きいぞ!", - "そんな調子だと後悔するぞ!", - "痛い目に合わせないでくれよ!", - "なにか勘違いしていないか!", - "こんなことするなよ!", - "悪魔よ出ていけ!", - "めっちゃ痛い!", - "なぜこんなことをするの?", - "霊よ、静まれ!", - "誰かと勘違いしてるんじゃないか!", - "私にはもったいないです!", - "二度としないで。", - "衛兵、この化け物を湖に沈めて!", - "俺のタラスクを送り込んでやるぜ!", - "なぜ、わたしがー?", - ], - } -) diff --git a/assets/voxygen/i18n/nl_NL/buff.ftl b/assets/voxygen/i18n/nl_NL/buff.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/nl_NL/buff.ron b/assets/voxygen/i18n/nl_NL/buff.ron deleted file mode 100644 index c782b41883..0000000000 --- a/assets/voxygen/i18n/nl_NL/buff.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/char_selection.ftl b/assets/voxygen/i18n/nl_NL/char_selection.ftl new file mode 100644 index 0000000000..4a934126d1 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/char_selection.ftl @@ -0,0 +1,21 @@ +char_selection-loading_characters = Karakters Worden Geladen... +char_selection-delete_permanently = Karakter Permanent Verwijderen? +char_selection-deleting_character = Karakter Wordt Verwijderen... +char_selection-change_server = Server Wisselen +char_selection-enter_world = Wereld Betreden +char_selection-logout = Uitloggen +char_selection-create_new_charater = Nieuw Karakter Maken +char_selection-creating_character = Karakter Wordt Aangemaakt... +char_selection-character_creation = Karaktercreatie +char_selection-human_default = Standaard Mens +char_selection-level_fmt = Level { $level_nb } +char_selection-uncanny_valley = Wildernis +char_selection-plains_of_uncertainty = Vlaktes van Onzekerheid +char_selection-beard = Baard +char_selection-hair_style = Haarstijl +char_selection-hair_color = Haarkleur +char_selection-eye_color = Oogkleur +char_selection-skin = Huid +char_selection-eyeshape = Oogdetails +char_selection-accessories = Accessoires +char_selection-create_info_name = Je karakter heeft een naam nodig! \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/char_selection.ron b/assets/voxygen/i18n/nl_NL/char_selection.ron deleted file mode 100644 index de347f01a9..0000000000 --- a/assets/voxygen/i18n/nl_NL/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "char_selection.loading_characters": "Karakters Worden Geladen...", - "char_selection.delete_permanently": "Karakter Permanent Verwijderen?", - "char_selection.deleting_character": "Karakter Wordt Verwijderen...", - "char_selection.change_server": "Server Wisselen", - "char_selection.enter_world": "Wereld Betreden", - "char_selection.logout": "Uitloggen", - "char_selection.create_new_charater": "Nieuw Karakter Maken", - "char_selection.creating_character": "Karakter Wordt Aangemaakt...", - "char_selection.character_creation": "Karaktercreatie", - - "char_selection.human_default": "Standaard Mens", - "char_selection.level_fmt": "Level {level_nb}", - "char_selection.uncanny_valley": "Wildernis", - "char_selection.plains_of_uncertainty": "Vlaktes van Onzekerheid", - "char_selection.beard": "Baard", - "char_selection.hair_style": "Haarstijl", - "char_selection.hair_color": "Haarkleur", - "char_selection.eye_color": "Oogkleur", - "char_selection.skin": "Huid", - "char_selection.eyeshape": "Oogdetails", - "char_selection.accessories": "Accessoires", - "char_selection.create_info_name": "Je karakter heeft een naam nodig!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/common.ftl b/assets/voxygen/i18n/nl_NL/common.ftl new file mode 100644 index 0000000000..0e66b5ea3f --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/common.ftl @@ -0,0 +1,53 @@ +common-username = Spelernaam +common-singleplayer = Alleen spelen +common-multiplayer = Samen spelen +common-servers = Servers +common-quit = Afsluiten +common-settings = Instellingen +common-languages = Talen +common-interface = Interface +common-gameplay = Gameplay +common-controls = Besturing +common-video = Grafische weergave +common-sound = Geluid +common-resume = Verder spelen +common-characters = Karakters +common-close = Sluiten +common-yes = Ja +common-no = Nee +common-back = Terug +common-create = Aanmaken +common-okay = Oké +common-accept = Aanvaarden +common-decline = Afwijzen +common-disclaimer = Disclaimer +common-cancel = Annuleren +common-none = Geen +common-error = Fout +common-fatal_error = Fatale fout +common-you = Jij +common-automatic = Auto +common-random = Willekeurig +common-interface_settings = Interface Instellingen +common-gameplay_settings = Gameplay Instellingen +common-controls_settings = Besturing Instellingen +common-video_settings = Grafische instellingen +common-sound_settings = Geluids instellingen +common-language_settings = Taal instellingen +common-connection_lost = + Verbinding verloren! + Is de server opniew opgestart? + Is je client nog up to date? +common-species-orc = Orc +common-species-human = Mens +common-species-dwarf = Dwerg +common-species-elf = Elf +common-species-draugr = Ondood +common-species-danari = Danari +common-weapons-axe = Bijl +common-weapons-sword = Zwaard +common-weapons-staff = Staf +common-weapons-bow = Boog +common-weapons-hammer = Hamer +common-weapons-sceptre = Genezende scepter +common-rand_appearance = Willekeurig uiterlijk en naam \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/common.ron b/assets/voxygen/i18n/nl_NL/common.ron deleted file mode 100644 index cbbe894bf4..0000000000 --- a/assets/voxygen/i18n/nl_NL/common.ron +++ /dev/null @@ -1,71 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Spelernaam", - "common.singleplayer": "Alleen spelen", - "common.multiplayer": "Samen spelen", - "common.servers": "Servers", - "common.quit": "Afsluiten", - "common.settings": "Instellingen", - "common.languages": "Talen", - "common.interface": "Interface", - "common.gameplay": "Gameplay", - "common.controls": "Besturing", - "common.video": "Grafische weergave", - "common.sound": "Geluid", - "common.languages": "Talen", - "common.resume": "Verder spelen", - "common.characters": "Karakters", - "common.close": "Sluiten", - "common.yes": "Ja", - "common.no": "Nee", - "common.back": "Terug", - "common.create": "Aanmaken", - "common.okay": "Oké", - "common.accept": "Aanvaarden", - "common.decline": "Afwijzen", - "common.disclaimer": "Disclaimer", - "common.cancel": "Annuleren", - "common.none": "Geen", - "common.error": "Fout", - "common.fatal_error": "Fatale fout", - "common.you": "Jij", - "common.automatic": "Auto", - "common.random": "Willekeurig", - // Settings Window title - "common.interface_settings": "Interface Instellingen", - "common.gameplay_settings": "Gameplay Instellingen", - "common.controls_settings": "Besturing Instellingen", - "common.video_settings": "Grafische instellingen", - "common.sound_settings": "Geluids instellingen", - "common.language_settings": "Taal instellingen", - - // Message when connection to the server is lost - "common.connection_lost": r#"Verbinding verloren! -Is de server opniew opgestart? -Is je client nog up to date?"#, - - - "common.species.orc": "Orc", - "common.species.human": "Mens", - "common.species.dwarf": "Dwerg", - "common.species.elf": "Elf", - "common.species.draugr": "Ondood", - "common.species.danari": "Danari", - - "common.weapons.axe": "Bijl", - "common.weapons.sword": "Zwaard", - "common.weapons.staff": "Staf", - "common.weapons.bow": "Boog", - "common.weapons.hammer": "Hamer", - "common.weapons.sceptre": "Genezende scepter", - "common.rand_appearance": "Willekeurig uiterlijk en naam", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/esc_menu.ftl b/assets/voxygen/i18n/nl_NL/esc_menu.ftl new file mode 100644 index 0000000000..aeb29701b6 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Uitloggen +esc_menu-quit_game = Spel Verlaten \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/esc_menu.ron b/assets/voxygen/i18n/nl_NL/esc_menu.ron deleted file mode 100644 index 68690cd821..0000000000 --- a/assets/voxygen/i18n/nl_NL/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "esc_menu.logout": "Uitloggen", - "esc_menu.quit_game": "Spel Verlaten", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/gameinput.ftl b/assets/voxygen/i18n/nl_NL/gameinput.ftl new file mode 100644 index 0000000000..fcde62d75b --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/gameinput.ftl @@ -0,0 +1,55 @@ +gameinput-primary = Gewone aanval +gameinput-secondary = Alternatieve Aanval/Block/Mikken +gameinput-slot1 = Hotbar Slot 1 +gameinput-slot2 = Hotbar Slot 2 +gameinput-slot3 = Hotbar Slot 3 +gameinput-slot4 = Hotbar Slot 4 +gameinput-slot5 = Hotbar Slot 5 +gameinput-slot6 = Hotbar Slot 6 +gameinput-slot7 = Hotbar Slot 7 +gameinput-slot8 = Hotbar Slot 8 +gameinput-slot9 = Hotbar Slot 9 +gameinput-slot10 = Hotbar Slot 10 +gameinput-swaploadout = Uitrusting Wisselen +gameinput-togglecursor = Cursor Aan/Uit +gameinput-help = Help Venster Aan/Uit +gameinput-toggleinterface = Interface Aan/Uit +gameinput-toggledebug = FPS en Debug Info Aan/Uit +gameinput-screenshot = Screenshot maken +gameinput-toggleingameui = Naamplaatjes Aan/Uit +gameinput-fullscreen = Volledig Scherm Aan/Uit +gameinput-moveforward = Voorwaards Bewegen +gameinput-moveleft = Links Bewegen +gameinput-moveright = Rechts Bewegen +gameinput-moveback = Achteruit Bewegen +gameinput-jump = Springen +gameinput-glide = Deltavlieger +gameinput-roll = Rollen +gameinput-climb = Klimmen +gameinput-climbdown = Naar Beneden Klimmen +gameinput-wallleap = Muursprong +gameinput-togglelantern = Lantaarn Aan/Uit +gameinput-mount = Berijden +gameinput-chat = Chat +gameinput-command = Commando +gameinput-escape = Sluiten +gameinput-map = Kaart +gameinput-bag = Rugzak +gameinput-social = Sociaal +gameinput-sit = Zit +gameinput-spellbook = Spreuken +gameinput-settings = Instellingen +gameinput-respawn = Respawn +gameinput-charge = Opladen +gameinput-togglewield = Wapen Vastnemen/Wegsteken +gameinput-interact = Gebruik +gameinput-freelook = Vrije Camera +gameinput-autowalk = Automatisch Wandelen +gameinput-dance = Dans +gameinput-select = Selecteer Entiteit +gameinput-acceptgroupinvite = Accepteer Groepsuitnodiging +gameinput-declinegroupinvite = Wijs Groepsuitnodiging Af +gameinput-crafting = Fabriceermenu +gameinput-sneak = Sluipen +gameinput-swimdown = Naar Beneden Zwemmen +gameinput-swimup = Naar Boven Zwemmen \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/gameinput.ron b/assets/voxygen/i18n/nl_NL/gameinput.ron deleted file mode 100644 index 4105707186..0000000000 --- a/assets/voxygen/i18n/nl_NL/gameinput.ron +++ /dev/null @@ -1,66 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "gameinput.primary": "Gewone aanval", - "gameinput.secondary": "Alternatieve Aanval/Block/Mikken", - "gameinput.slot1": "Hotbar Slot 1", - "gameinput.slot2": "Hotbar Slot 2", - "gameinput.slot3": "Hotbar Slot 3", - "gameinput.slot4": "Hotbar Slot 4", - "gameinput.slot5": "Hotbar Slot 5", - "gameinput.slot6": "Hotbar Slot 6", - "gameinput.slot7": "Hotbar Slot 7", - "gameinput.slot8": "Hotbar Slot 8", - "gameinput.slot9": "Hotbar Slot 9", - "gameinput.slot10": "Hotbar Slot 10", - "gameinput.swaploadout": "Uitrusting Wisselen", - "gameinput.togglecursor": "Cursor Aan/Uit", - "gameinput.help": "Help Venster Aan/Uit", - "gameinput.toggleinterface": "Interface Aan/Uit", - "gameinput.toggledebug": "FPS en Debug Info Aan/Uit", - "gameinput.screenshot": "Screenshot maken", - "gameinput.toggleingameui": "Naamplaatjes Aan/Uit", - "gameinput.fullscreen": "Volledig Scherm Aan/Uit", - "gameinput.moveforward": "Voorwaards Bewegen", - "gameinput.moveleft": "Links Bewegen", - "gameinput.moveright": "Rechts Bewegen", - "gameinput.moveback": "Achteruit Bewegen", - "gameinput.jump": "Springen", - "gameinput.glide": "Deltavlieger", - "gameinput.roll": "Rollen", - "gameinput.climb": "Klimmen", - "gameinput.climbdown": "Naar Beneden Klimmen", - "gameinput.wallleap": "Muursprong", - "gameinput.togglelantern": "Lantaarn Aan/Uit", - "gameinput.mount": "Berijden", - "gameinput.chat": "Chat", - "gameinput.command": "Commando", - "gameinput.escape": "Sluiten", - "gameinput.map": "Kaart", - "gameinput.bag": "Rugzak", - "gameinput.social": "Sociaal", - "gameinput.sit": "Zit", - "gameinput.spellbook": "Spreuken", - "gameinput.settings": "Instellingen", - "gameinput.respawn": "Respawn", - "gameinput.charge": "Opladen", - "gameinput.togglewield": "Wapen Vastnemen/Wegsteken", - "gameinput.interact": "Gebruik", - "gameinput.freelook": "Vrije Camera", - "gameinput.autowalk": "Automatisch Wandelen", - "gameinput.dance": "Dans", - "gameinput.select": "Selecteer Entiteit", - "gameinput.acceptgroupinvite": "Accepteer Groepsuitnodiging", - "gameinput.declinegroupinvite": "Wijs Groepsuitnodiging Af", - "gameinput.crafting": "Fabriceermenu", - "gameinput.sneak": "Sluipen", - "gameinput.swimdown": "Naar Beneden Zwemmen", - "gameinput.swimup": "Naar Boven Zwemmen", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/bag.ftl b/assets/voxygen/i18n/nl_NL/hud/bag.ftl new file mode 100644 index 0000000000..6b3c86fb89 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/bag.ftl @@ -0,0 +1,20 @@ +hud-bag-inventory = { $playername }'s Rugzak +hud-bag-stats_title = { $playername }'s Stats +hud-bag-exp = Exp +hud-bag-armor = Armor +hud-bag-stats = Stats +hud-bag-head = Hoofd +hud-bag-neck = Nek +hud-bag-tabard = Tabberd +hud-bag-shoulders = Schouders +hud-bag-chest = Borstkas +hud-bag-hands = Handen +hud-bag-lantern = Lantaarn +hud-bag-glider = Deltavlieger +hud-bag-belt = Riem +hud-bag-ring = Ring +hud-bag-back = Rug +hud-bag-legs = Benen +hud-bag-feet = Voeten +hud-bag-mainhand = Dominante hand +hud-bag-offhand = Tweede hand \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/bag.ron b/assets/voxygen/i18n/nl_NL/hud/bag.ron deleted file mode 100644 index 8b13457840..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/bag.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}'s Rugzak", - "hud.bag.stats_title": "{playername}'s Stats", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armor", - "hud.bag.stats": "Stats", - "hud.bag.head": "Hoofd", - "hud.bag.neck": "Nek", - "hud.bag.tabard": "Tabberd", - "hud.bag.shoulders": "Schouders", - "hud.bag.chest": "Borstkas", - "hud.bag.hands": "Handen", - "hud.bag.lantern": "Lantaarn", - "hud.bag.glider": "Deltavlieger", - "hud.bag.belt": "Riem", - "hud.bag.ring": "Ring", - "hud.bag.back": "Rug", - "hud.bag.legs": "Benen", - "hud.bag.feet": "Voeten", - "hud.bag.mainhand": "Dominante hand", - "hud.bag.offhand": "Tweede hand", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/char_window.ftl b/assets/voxygen/i18n/nl_NL/hud/char_window.ftl new file mode 100644 index 0000000000..7f25560167 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Karakter Naam +character_window-character_stats = + Uithouding + + Fitheid + + Willskracht + + Bescherming \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/char_window.ron b/assets/voxygen/i18n/nl_NL/hud/char_window.ron deleted file mode 100644 index 82ccbaa673..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "character_window.character_name": "Karakter Naam", - // Character stats - "character_window.character_stats": r#"Uithouding - -Fitheid - -Willskracht - -Bescherming -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/chat.ftl b/assets/voxygen/i18n/nl_NL/hud/chat.ftl new file mode 100644 index 0000000000..732c483156 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/chat.ftl @@ -0,0 +1,17 @@ +hud-chat-online_msg = [{ $name }] is nu online +hud-chat-offline_msg = [{ $name }] is offline gegaan +hud-chat-default_death_msg = [{ $name }] is gestorven +hud-chat-environmental_kill_msg = [{ $name }] is gestorven in { $environment } +hud-chat-fall_kill_msg = [{ $name }] is gestorven door te vallen +hud-chat-suicide_msg = [{ $name }] is gestorven door zelf toegebrachte verwondingen +hud-chat-pvp_melee_kill_msg = [{ $attacker }] versloeg [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] schoot [{ $victim }] neer +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] blies [{ $victim }] op +hud-chat-pvp_energy_kill_msg = [{ $attacker }] gebruikte magie om [{ $victim }] te vermoorden +hud-chat-npc_melee_kill_msg = { $attacker } dode [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } schoot [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } blies [{ $victim }] op +hud-chat-loot_msg = Je raapte [{ $item }] op +hud-chat-loot_fail = Jouw inventory is vol! +hud-chat-goodbye = Vaarwel! +hud-chat-connection_lost = Verbinding verloren. Je wordt in { $time } seconden gekicked. \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/chat.ron b/assets/voxygen/i18n/nl_NL/hud/chat.ron deleted file mode 100644 index 0db1871ffd..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/chat.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "hud.chat.online_msg": "[{name}] is nu online", - "hud.chat.offline_msg": "[{name}] is offline gegaan", - - "hud.chat.default_death_msg": "[{name}] is gestorven", - "hud.chat.environmental_kill_msg": "[{name}] is gestorven in {environment}", - "hud.chat.fall_kill_msg": "[{name}] is gestorven door te vallen", - "hud.chat.suicide_msg": "[{name}] is gestorven door zelf toegebrachte verwondingen", - - "hud.chat.pvp_melee_kill_msg": "[{attacker}] versloeg [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] schoot [{victim}] neer", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] blies [{victim}] op", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] gebruikte magie om [{victim}] te vermoorden", - - "hud.chat.npc_melee_kill_msg": "{attacker} dode [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} schoot [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} blies [{victim}] op", - - "hud.chat.loot_msg": "Je raapte [{item}] op", - "hud.chat.loot_fail": "Jouw inventory is vol!", - "hud.chat.goodbye": "Vaarwel!", - "hud.chat.connection_lost": "Verbinding verloren. Je wordt in {time} seconden gekicked.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/crafting.ftl b/assets/voxygen/i18n/nl_NL/hud/crafting.ftl new file mode 100644 index 0000000000..2fca5b9c31 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/crafting.ftl @@ -0,0 +1,5 @@ +hud-crafting = Fabriceren +hud-crafting-recipes = Recepten +hud-crafting-ingredients = Ingrediënten: +hud-crafting-craft = Maak +hud-crafting-tool_cata = Vereisten: \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/crafting.ron b/assets/voxygen/i18n/nl_NL/hud/crafting.ron deleted file mode 100644 index 551558ea69..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/crafting.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "hud.crafting": "Fabriceren", - "hud.crafting.recipes": "Recepten", - "hud.crafting.ingredients": "Ingrediënten:", - "hud.crafting.craft": "Maak", - "hud.crafting.tool_cata": "Vereisten:", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/group.ftl b/assets/voxygen/i18n/nl_NL/hud/group.ftl new file mode 100644 index 0000000000..6d638f053a --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/group.ftl @@ -0,0 +1,12 @@ +hud-group = Groep +hud-group-invite_to_join = [{ $name }] heeft je voor zijn/haar groep uitgenodigd! +hud-group-invite = Uitnodigen +hud-group-kick = Kick +hud-group-assign_leader = Maak Leider +hud-group-leave = Groep Verlaten +hud-group-dead = Dood +hud-group-out_of_range = Buiten Bereik +hud-group-add_friend = Aan Vrienden Toevoegen +hud-group-link_group = Link Groups +hud-group-in_menu = In Menu +hud-group-members = Groepsleden \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/group.ron b/assets/voxygen/i18n/nl_NL/hud/group.ron deleted file mode 100644 index 16be7c70b1..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/group.ron +++ /dev/null @@ -1,23 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "hud.group": "Groep", - "hud.group.invite_to_join": "[{name}] heeft je voor zijn/haar groep uitgenodigd!", - "hud.group.invite": "Uitnodigen", - "hud.group.kick": "Kick", - "hud.group.assign_leader": "Maak Leider", - "hud.group.leave": "Groep Verlaten", - "hud.group.dead" : "Dood", - "hud.group.out_of_range": "Buiten Bereik", - "hud.group.add_friend": "Aan Vrienden Toevoegen", - "hud.group.link_group": "Link Groups", - "hud.group.in_menu": "In Menu", - "hud.group.members": "Groepsleden", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/map.ftl b/assets/voxygen/i18n/nl_NL/hud/map.ftl new file mode 100644 index 0000000000..14a86caf56 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/map.ftl @@ -0,0 +1,2 @@ +hud-map-map_title = Kaart +hud-map-qlog_title = Quests \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/map.ron b/assets/voxygen/i18n/nl_NL/hud/map.ron deleted file mode 100644 index 48afb00453..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/map.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Kaart", - "hud.map.qlog_title": "Quests", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/misc.ftl b/assets/voxygen/i18n/nl_NL/hud/misc.ftl new file mode 100644 index 0000000000..e32fb53de5 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/misc.ftl @@ -0,0 +1,58 @@ +hud-do_not_show_on_startup = Niet meer bij opstarten tonen +hud-show_tips = Tips tonen +hud-quests = Quests +hud-you_died = Je bent gedood +hud-waypoint_saved = Waypoint Opgeslagen +hud-press_key_to_show_keybindings_fmt = [{ $key }] Besturing +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lantaarn +hud-press_key_to_show_debug_info_fmt = Druk op { $key } om debug info te tonen +hud-press_key_to_toggle_keybindings_fmt = Druk op { $key } om te de besturing aan/uit te zetten +hud-press_key_to_toggle_debug_info_fmt = Druk op { $key } om debug info aan/uit te zetten +hud-press_key_to_respawn = Druk op { $key } om te respawnen bij het laatste kampvuur dat je bezocht. +hud-welcome = + Welcome bij de Veloren Alpha! + + Wat tips voor je start: + + + Druk op F1 om de besturing te zien. + + Type /help in chat om de chat commando's te zien. + + + Er verschijnen kisten en andere objecten willekeurig in de wereld! + + Gebruik rechtermuisknop om ze te verzamelen! + + Om effectief hetgene dat je van de kisten krijgt te gebruiken, open je je inventory met 'B'. + + Dubbelklik op de voorwerpen in je rugzak om ze aan te doen of te gebruiken. + + Gooi dingen weg door ze eenmaal aan te klikken en dan buiten je rugzak te klikken. + + + Nachten kunnen vrij donker worden in Veloren. + + Gebruik je lantaarn door 'G' te drukken + + + Wil je je cursor gebruiken om dit venster te sluiten? Druk TAB! + + + Geniet van je verblijf in de wereld van Veloren. +hud-temp_quest_headline = Help ons alsjeblieft, reiziger! +hud-temp_quest_text = + Kerkers vol met kwaaraardige sektes + komen overal tevoorschijn rond onze vreedzame dorpen! + + + Verzamel wat gezelschap, vul je voedselrantsoenen aan + en versla hun kwaadaardige leiders en volgelingen. + + + Misschien kan je zelfs een van hun + Maybe you can even obtain one of their + met magie gevulde objecten bemachtigen? +hud-spell = Spreuken +hud-free_look_indicator = Vrij rondkijken aan. Druk { $key } om uit te zetten. +hud-auto_walk_indicator = Automatisch wandelen aan \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/misc.ron b/assets/voxygen/i18n/nl_NL/hud/misc.ron deleted file mode 100644 index e4e722d883..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/misc.ron +++ /dev/null @@ -1,78 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - /// Start HUD Section - "hud.do_not_show_on_startup": "Niet meer bij opstarten tonen", - "hud.show_tips": "Tips tonen", - "hud.quests": "Quests", - "hud.you_died": "Je bent gedood", - "hud.waypoint_saved": "Waypoint Opgeslagen", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Besturing", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lantaarn", - "hud.press_key_to_show_debug_info_fmt": "Druk op {key} om debug info te tonen", - "hud.press_key_to_toggle_keybindings_fmt": "Druk op {key} om te de besturing aan/uit te zetten", - "hud.press_key_to_toggle_debug_info_fmt": "Druk op {key} om debug info aan/uit te zetten", - - // Chat outputs - - // Respawn message - "hud.press_key_to_respawn": r#"Druk op {key} om te respawnen bij het laatste kampvuur dat je bezocht."#, - - // Welcome message - "hud.welcome": r#"Welcome bij de Veloren Alpha! - -Wat tips voor je start: - - -Druk op F1 om de besturing te zien. - -Type /help in chat om de chat commando's te zien. - - -Er verschijnen kisten en andere objecten willekeurig in de wereld! - -Gebruik rechtermuisknop om ze te verzamelen! - -Om effectief hetgene dat je van de kisten krijgt te gebruiken, open je je inventory met 'B'. - -Dubbelklik op de voorwerpen in je rugzak om ze aan te doen of te gebruiken. - -Gooi dingen weg door ze eenmaal aan te klikken en dan buiten je rugzak te klikken. - - -Nachten kunnen vrij donker worden in Veloren. - -Gebruik je lantaarn door 'G' te drukken - - -Wil je je cursor gebruiken om dit venster te sluiten? Druk TAB! - - -Geniet van je verblijf in de wereld van Veloren."#, - -"hud.temp_quest_headline": r#"Help ons alsjeblieft, reiziger!"#, -"hud.temp_quest_text": r#"Kerkers vol met kwaaraardige sektes -komen overal tevoorschijn rond onze vreedzame dorpen! - - -Verzamel wat gezelschap, vul je voedselrantsoenen aan -en versla hun kwaadaardige leiders en volgelingen. - - -Misschien kan je zelfs een van hun -Maybe you can even obtain one of their -met magie gevulde objecten bemachtigen?"#, - - "hud.spell": "Spreuken", - - "hud.free_look_indicator": "Vrij rondkijken aan. Druk {key} om uit te zetten.", - "hud.auto_walk_indicator": "Automatisch wandelen aan", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/sct.ftl b/assets/voxygen/i18n/nl_NL/hud/sct.ftl new file mode 100644 index 0000000000..63a89fd3a1 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = GEBLOCKED \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/sct.ron b/assets/voxygen/i18n/nl_NL/hud/sct.ron deleted file mode 100644 index d6b4b9ef17..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "GEBLOCKED", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/settings.ftl b/assets/voxygen/i18n/nl_NL/hud/settings.ftl new file mode 100644 index 0000000000..fc13143764 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/settings.ftl @@ -0,0 +1,77 @@ +hud-settings-general = Algemeen +hud-settings-none = Geen +hud-settings-press_behavior-toggle = Omschakelbaar +hud-settings-press_behavior-hold = Inhouden +hud-settings-help_window = Help Venster +hud-settings-debug_info = Debug Informatie +hud-settings-tips_on_startup = Tips-Bij-Opstarten +hud-settings-ui_scale = UI-Schaal +hud-settings-relative_scaling = Relatief Schalen +hud-settings-custom_scaling = Aangepast Schalen +hud-settings-crosshair = Richtkruis +hud-settings-opacity = Doorschijnbaarheid +hud-settings-hotbar = Hotbar +hud-settings-toggle_shortcuts = Toon Sneltoetsen +hud-settings-toggle_bar_experience = Toon Experience Balk +hud-settings-scrolling_combat_text = Pop-up Gevechtstext +hud-settings-incoming_damage = Inkomende Schade Getallen +hud-settings-speech_bubble = Spraakbubbel +hud-settings-speech_bubble_dark_mode = Donkere Modus +hud-settings-speech_bubble_icon = Spraakbubbel Icoon +hud-settings-energybar_numbers = Energiebalk Getallen +hud-settings-values = Waarden +hud-settings-percentages = Percentages +hud-settings-chat = Chat +hud-settings-background_opacity = Transparantie Achtergrond +hud-settings-chat_character_name = Karakternamen in de Chat +hud-settings-loading_tips = Laadscherm Tips +hud-settings-pan_sensitivity = Camera-gevoeligheid +hud-settings-zoom_sensitivity = Zoom-gevoeligheid +hud-settings-invert_scroll_zoom = Inverteer Zoom Scrollen +hud-settings-invert_mouse_y_axis = Inverteer muis Y As +hud-settings-enable_mouse_smoothing = Camerabeweging gelijkmaken +hud-settings-free_look_behavior = Vrije camera gedrag +hud-settings-auto_walk_behavior = Automatisch wandelgedrag +hud-settings-stop_auto_walk_on_input = + Stop automatisch + wandelen bij bewegen +hud-settings-view_distance = Kijkafstand +hud-settings-sprites_view_distance = Kijkafstand sprites +hud-settings-figures_view_distance = Kijkafstand entiteiten +hud-settings-maximum_fps = Maximum FPS +hud-settings-fov = Gezichtsveld (graden) +hud-settings-gamma = Gamma +hud-settings-ambiance = Omgevingshelderheid +hud-settings-antialiasing_mode = AntiAliasing Modus +hud-settings-cloud_rendering_mode = Wolk Rendering Modus +hud-settings-fluid_rendering_mode = Vloeistoffen Rendering Mode +hud-settings-fluid_rendering_mode-cheap = Goedkoop +hud-settings-fluid_rendering_mode-shiny = Schitterend +hud-settings-cloud_rendering_mode-regular = Gewoon +hud-settings-fullscreen = Volledig scherm +hud-settings-fullscreen_mode = Volledige scherm modus +hud-settings-fullscreen_mode-exclusive = Exclusief +hud-settings-fullscreen_mode-borderless = Randloos +hud-settings-particles = Deeltjes +hud-settings-resolution = Resolutie +hud-settings-bit_depth = Bit diepte +hud-settings-refresh_rate = Vernieuwingssnelheid +hud-settings-save_window_size = Venster grootte opslaan +hud-settings-lighting_rendering_mode = Licht Rendering Modus +hud-settings-lighting_rendering_mode-ashikhmin = Type A +hud-settings-lighting_rendering_mode-blinnphong = Type B +hud-settings-lighting_rendering_mode-lambertian = Type L +hud-settings-shadow_rendering_mode = Schaduw Rendering Mode +hud-settings-shadow_rendering_mode-none = Geen +hud-settings-shadow_rendering_mode-cheap = Goedkoop +hud-settings-shadow_rendering_mode-map = Kaart +hud-settings-shadow_rendering_mode-map-resolution = Resolutie +hud-settings-lod_detail = LoD Detail +hud-settings-music_volume = Muziek Volume +hud-settings-sound_effect_volume = Geluidseffecten Volume +hud-settings-audio_device = Audio Apparaat +hud-settings-awaitingkey = Druk op een toets... +hud-settings-unbound = Geen +hud-settings-reset_keybinds = + Standaardwaarden + herstellen \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/settings.ron b/assets/voxygen/i18n/nl_NL/hud/settings.ron deleted file mode 100644 index 52c6e16761..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/settings.ron +++ /dev/null @@ -1,93 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - // Settings - "hud.settings.general": "Algemeen", - "hud.settings.none": "Geen", - "hud.settings.press_behavior.toggle": "Omschakelbaar", - "hud.settings.press_behavior.hold": "Inhouden", - "hud.settings.help_window": "Help Venster", - "hud.settings.debug_info": "Debug Informatie", - "hud.settings.tips_on_startup": "Tips-Bij-Opstarten", - "hud.settings.ui_scale": "UI-Schaal", - "hud.settings.relative_scaling": "Relatief Schalen", - "hud.settings.custom_scaling": "Aangepast Schalen", - "hud.settings.crosshair": "Richtkruis", - "hud.settings.opacity": "Doorschijnbaarheid", - "hud.settings.hotbar": "Hotbar", - "hud.settings.toggle_shortcuts": "Toon Sneltoetsen", - "hud.settings.toggle_bar_experience": "Toon Experience Balk", - "hud.settings.scrolling_combat_text": "Pop-up Gevechtstext", - "hud.settings.incoming_damage": "Inkomende Schade Getallen", - "hud.settings.speech_bubble": "Spraakbubbel", - "hud.settings.speech_bubble_dark_mode": "Donkere Modus", - "hud.settings.speech_bubble_icon": "Spraakbubbel Icoon", - "hud.settings.energybar_numbers": "Energiebalk Getallen", - "hud.settings.values": "Waarden", - "hud.settings.percentages": "Percentages", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Transparantie Achtergrond", - "hud.settings.chat_character_name": "Karakternamen in de Chat", - "hud.settings.loading_tips": "Laadscherm Tips", - - "hud.settings.pan_sensitivity": "Camera-gevoeligheid", - "hud.settings.zoom_sensitivity": "Zoom-gevoeligheid", - "hud.settings.invert_scroll_zoom": "Inverteer Zoom Scrollen", - "hud.settings.invert_mouse_y_axis": "Inverteer muis Y As", - "hud.settings.enable_mouse_smoothing": "Camerabeweging gelijkmaken", - "hud.settings.free_look_behavior": "Vrije camera gedrag", - "hud.settings.auto_walk_behavior": "Automatisch wandelgedrag", - "hud.settings.stop_auto_walk_on_input": "Stop automatisch -wandelen bij bewegen", - - "hud.settings.view_distance": "Kijkafstand", - "hud.settings.sprites_view_distance": "Kijkafstand sprites", - "hud.settings.figures_view_distance": "Kijkafstand entiteiten", - "hud.settings.maximum_fps": "Maximum FPS", - "hud.settings.fov": "Gezichtsveld (graden)", - "hud.settings.gamma": "Gamma", - "hud.settings.ambiance": "Omgevingshelderheid", - "hud.settings.antialiasing_mode": "AntiAliasing Modus", - "hud.settings.cloud_rendering_mode": "Wolk Rendering Modus", - "hud.settings.fluid_rendering_mode": "Vloeistoffen Rendering Mode", - "hud.settings.fluid_rendering_mode.cheap": "Goedkoop", - "hud.settings.fluid_rendering_mode.shiny": "Schitterend", - "hud.settings.cloud_rendering_mode.regular": "Gewoon", - "hud.settings.fullscreen": "Volledig scherm", - "hud.settings.fullscreen_mode": "Volledige scherm modus", - "hud.settings.fullscreen_mode.exclusive": "Exclusief", - "hud.settings.fullscreen_mode.borderless": "Randloos", - "hud.settings.particles": "Deeltjes", - "hud.settings.resolution": "Resolutie", - "hud.settings.bit_depth": "Bit diepte", - "hud.settings.refresh_rate": "Vernieuwingssnelheid", - "hud.settings.save_window_size": "Venster grootte opslaan", - "hud.settings.lighting_rendering_mode": "Licht Rendering Modus", - "hud.settings.lighting_rendering_mode.ashikhmin": "Type A", - "hud.settings.lighting_rendering_mode.blinnphong": "Type B", - "hud.settings.lighting_rendering_mode.lambertian": "Type L", - "hud.settings.shadow_rendering_mode": "Schaduw Rendering Mode", - "hud.settings.shadow_rendering_mode.none": "Geen", - "hud.settings.shadow_rendering_mode.cheap": "Goedkoop", - "hud.settings.shadow_rendering_mode.map": "Kaart", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolutie", - "hud.settings.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Venster grootte opslaan", - - - "hud.settings.music_volume": "Muziek Volume", - "hud.settings.sound_effect_volume": "Geluidseffecten Volume", - "hud.settings.audio_device": "Audio Apparaat", - - "hud.settings.awaitingkey": "Druk op een toets...", - "hud.settings.unbound": "Geen", - "hud.settings.reset_keybinds": "Standaardwaarden -herstellen", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/skills.ftl b/assets/voxygen/i18n/nl_NL/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/nl_NL/hud/skills.ron b/assets/voxygen/i18n/nl_NL/hud/skills.ron deleted file mode 100644 index c782b41883..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/skills.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/nl_NL/hud/social.ftl b/assets/voxygen/i18n/nl_NL/hud/social.ftl new file mode 100644 index 0000000000..5e23e49d61 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Andere spelers +hud-social-online = Online: +hud-social-friends = Vrienden +hud-social-not_yet_available = Nog niet beschikbaar +hud-social-faction = Factie +hud-social-play_online_fmt = { $nb_player } speler(s) online +hud-social-name = Naam +hud-social-level = Level +hud-social-zone = Zone +hud-social-account = Account \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/hud/social.ron b/assets/voxygen/i18n/nl_NL/hud/social.ron deleted file mode 100644 index 0328b877d4..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "hud.social": "Andere spelers", - "hud.social.online": "Online:", - "hud.social.friends": "Vrienden", - "hud.social.not_yet_available": "Nog niet beschikbaar", - "hud.social.faction": "Factie", - "hud.social.play_online_fmt": "{nb_player} speler(s) online", - "hud.social.name": "Naam", - "hud.social.level": "Level", - "hud.social.zone": "Zone", - "hud.social.account": "Account", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/nl_NL/hud/trade.ftl b/assets/voxygen/i18n/nl_NL/hud/trade.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/nl_NL/hud/trade.ron b/assets/voxygen/i18n/nl_NL/hud/trade.ron deleted file mode 100644 index bac886e087..0000000000 --- a/assets/voxygen/i18n/nl_NL/hud/trade.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/nl_NL/main.ftl b/assets/voxygen/i18n/nl_NL/main.ftl new file mode 100644 index 0000000000..df8c16852d --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/main.ftl @@ -0,0 +1,66 @@ +main-connecting = Verbinden +main-creating_world = Wereld aan het maken +main-tip = Tip: +main-notice = + Welkom bij de Alpha versie van Veloren! + + Voordat de fun begint zijn hier enkele dingen om rekening mee te houden: + + - Dit is een hele vroege alpha. Verwacht bugs, extreem onafgemaakte gameplay, ruwe spelmechanics en missende functies. + + - Als je constructieve feedback hebt of bugs wil melden, kan je ons contacteren via Reddit, Gitlab of onze community Discord. + + - Veloren is onder de GPL 3 open-source licentie gelicensieerd. Dat betekent dat je vrij bent om het spel te spelen, bewerken en doorgeven op welke manier + je ook wil (zo lang afgeleide werken ook onder GPL 3 gelicensieerd zijn) + + - Veloren is een non-profit community project, en iedereen dat er aan meehelpt is een vrijwilliger. + Als je interesse hebt kan je je aansluiten bij onze ontwikkeling- of ontwerpteams! + + Bedankt voor de tijd te nemen om deze melding te lezen, we hopen dat je van het spel zult genieten! + Thanks for taking the time to read this notice, we hope you enjoy the game! + + ~ De Veloren ontwikkelaars +main-login_process = + Information over het loginproces: + + Hou er rekening mee dat je tegenwoordig een account nodig hebt + om op servers met authenticatie te spelen + + Je kan een account maken op + + https://veloren.net/account/. +main-login-server_not_found = Server nie gevonden +main-login-authentication_error = Authenticatie mislukt +main-login-server_full = Server zit vol +main-login-untrusted_auth_server = Onvertrouwde authenticatie server +main-login-outdated_client_or_server = Versieprobleem: De versie tussen de client en de server komen niet overeen. Check of er updates zijn/ +main-login-timeout = Timeout: De server deed er te lang over om te antwoorden. (Overblast of netwerk problemen). +main-login-server_shut_down = Server is afgesloten +main-login-network_error = Network problemen +main-login-failed_sending_request = Kon verzoek niet naar authenticatie server sturen +main-login-invalid_character = Het geselecteerde karakter is ongeldig +main-login-client_crashed = Client is gecrashed +main-login-not_on_whitelist = Je moet op de whitelist staan om deze wereld te joinen +main-login-banned = Je bent verbannen voor de volgende reden +main-login-kicked = Je bent gekicked voor de volgende reden +main-login-select_language = Kies een taal +loading-tips = + .a0 = Druk op '{ $gameinput-togglelantern }' om je lantaarn te doen schijnen. + .a1 = Druk op '{ $gameinput-help }' om alle standaardbesturingen te zien. + .a2 = Je kan /say of /s typen om enkel met spelers rondom je te praten. + .a3 = Je kan /region of /r typen om enkel met spelers binnen een hondertal blokken te praten. + .a4 = Je kan /group of /g typen om enkel met je groepsleden te praten. + .a5 = Om privéberichten te sturen gebruik je /tell gevolgd door de speler zijn naam en dan je bericht + .a6 = NPCs met hetzelfde level zijn niet per sé altijd even sterk. + .a7 = Hou je ogen open voor eten, kisten en andere buit verspreid over de wereld! + .a8 = Zit je Inventory vol met eten? Probeer beter eten er van te craften! + .a9 = Weet je niet wat te doen? Kerkers zijn met een bruine vlek op je kaart aangeduid! + .a10 = Vergeet je grafische instellingen niet aan te passen naar je systeem. Druk '{ $gameinput-settings }' om het instellingenmenu te openen. + .a11 = Met anderen spelen is plezanter! Druk op '{ $gameinput-social }' om te zien wie er nog online is! + .a12 = Een NPC met een doodshoofd onder zijn levensbalk is zeer sterk vergeleken met jezelf. + .a13 = Druk op '{ $gameinput-dance }' om te dansen. Feestje! + .a14 = Druk op '{ $gameinput-glide }' om je deltavlieger te openen en het luchtruim te veroveren. + .a15 = Veloren is nog steeds in Pre-Alpha. We doen ons best om het elke dag te verbeteren! + .a16 = Als je het ontwikkelingsteam wil versterken of gewoon een babbeltje wil doen met ons, kom dan langs op onze Discord-Server. + .a17 = Je kan numerieke waarden in de levensbalk aan of uit zetten in de instellingen. + .a18 = Om je stats te zien kan je op 'Stats' klikken in je Inventory. \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/main.ron b/assets/voxygen/i18n/nl_NL/main.ron deleted file mode 100644 index afbe1a2f04..0000000000 --- a/assets/voxygen/i18n/nl_NL/main.ron +++ /dev/null @@ -1,80 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - "main.connecting": "Verbinden", - "main.creating_world": "Wereld aan het maken", - "main.tip": "Tip:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Welkom bij de Alpha versie van Veloren! - -Voordat de fun begint zijn hier enkele dingen om rekening mee te houden: - -- Dit is een hele vroege alpha. Verwacht bugs, extreem onafgemaakte gameplay, ruwe spelmechanics en missende functies. - -- Als je constructieve feedback hebt of bugs wil melden, kan je ons contacteren via Reddit, Gitlab of onze community Discord. - -- Veloren is onder de GPL 3 open-source licentie gelicensieerd. Dat betekent dat je vrij bent om het spel te spelen, bewerken en doorgeven op welke manier -je ook wil (zo lang afgeleide werken ook onder GPL 3 gelicensieerd zijn) - -- Veloren is een non-profit community project, en iedereen dat er aan meehelpt is een vrijwilliger. -Als je interesse hebt kan je je aansluiten bij onze ontwikkeling- of ontwerpteams! - -Bedankt voor de tijd te nemen om deze melding te lezen, we hopen dat je van het spel zult genieten! -Thanks for taking the time to read this notice, we hope you enjoy the game! - -~ De Veloren ontwikkelaars"#, - - // Login process description - "main.login_process": r#"Information over het loginproces: - -Hou er rekening mee dat je tegenwoordig een account nodig hebt -om op servers met authenticatie te spelen - -Je kan een account maken op - -https://veloren.net/account/."#, - "main.login.server_not_found": "Server nie gevonden", - "main.login.authentication_error": "Authenticatie mislukt", - "main.login.server_full": "Server zit vol", - "main.login.untrusted_auth_server": "Onvertrouwde authenticatie server", - "main.login.outdated_client_or_server": "Versieprobleem: De versie tussen de client en de server komen niet overeen. Check of er updates zijn/", - "main.login.timeout": "Timeout: De server deed er te lang over om te antwoorden. (Overblast of netwerk problemen).", - "main.login.server_shut_down": "Server is afgesloten", - "main.login.network_error": "Network problemen", - "main.login.failed_sending_request": "Kon verzoek niet naar authenticatie server sturen", - "main.login.invalid_character": "Het geselecteerde karakter is ongeldig", - "main.login.client_crashed": "Client is gecrashed", - "main.login.not_on_whitelist": "Je moet op de whitelist staan om deze wereld te joinen", - "main.login.banned": "Je bent verbannen voor de volgende reden", - "main.login.kicked": "Je bent gekicked voor de volgende reden", - "main.login.select_language": "Kies een taal", - }, - - - vector_map: { - "loading.tips": [ - "Druk op '{gameinput.togglelantern}' om je lantaarn te doen schijnen.", - "Druk op '{gameinput.help}' om alle standaardbesturingen te zien.", - "Je kan /say of /s typen om enkel met spelers rondom je te praten.", - "Je kan /region of /r typen om enkel met spelers binnen een hondertal blokken te praten.", - "Je kan /group of /g typen om enkel met je groepsleden te praten.", - "Om privéberichten te sturen gebruik je /tell gevolgd door de speler zijn naam en dan je bericht", - "NPCs met hetzelfde level zijn niet per sé altijd even sterk.", - "Hou je ogen open voor eten, kisten en andere buit verspreid over de wereld!", - "Zit je Inventory vol met eten? Probeer beter eten er van te craften!", - "Weet je niet wat te doen? Kerkers zijn met een bruine vlek op je kaart aangeduid!", - "Vergeet je grafische instellingen niet aan te passen naar je systeem. Druk '{gameinput.settings}' om het instellingenmenu te openen.", - "Met anderen spelen is plezanter! Druk op '{gameinput.social}' om te zien wie er nog online is!", - "Een NPC met een doodshoofd onder zijn levensbalk is zeer sterk vergeleken met jezelf.", - "Druk op '{gameinput.dance}' om te dansen. Feestje!", - "Druk op '{gameinput.glide}' om je deltavlieger te openen en het luchtruim te veroveren.", - "Veloren is nog steeds in Pre-Alpha. We doen ons best om het elke dag te verbeteren!", - "Als je het ontwikkelingsteam wil versterken of gewoon een babbeltje wil doen met ons, kom dan langs op onze Discord-Server.", - "Je kan numerieke waarden in de levensbalk aan of uit zetten in de instellingen.", - "Om je stats te zien kan je op 'Stats' klikken in je Inventory.", - ], - } -) diff --git a/assets/voxygen/i18n/nl_NL/npc.ftl b/assets/voxygen/i18n/nl_NL/npc.ftl new file mode 100644 index 0000000000..8ab9495ff9 --- /dev/null +++ b/assets/voxygen/i18n/nl_NL/npc.ftl @@ -0,0 +1,81 @@ +npc-speech-villager_under_attack = + .a0 = Help, Ik word aangevallen! + .a1 = Help! Ik word aangevallen! + .a2 = Ow! Ik word aangevallen! + .a3 = Ow! Ik word aangevallen! Help! + .a4 = Help me! Ik word aangevallen! + .a5 = Ik word aangevallen! Help! + .a6 = Ik word aangevallen! Help me! + .a7 = Help! + .a8 = Help! Help! + .a9 = Help! Help! Help! + .a10 = Ik word aangevallen! + .a11 = AAAHHH! Ik word aangevallen! + .a12 = AAAHHH! Ik word aangevallen! Help! + .a13 = Help! We worden aangevallen! + .a14 = Help! Moordenaar! + .a15 = Help! Er loopt een moordenaar rond! + .a16 = Help! Ze proberen mij te vermoorden! + .a17 = Wachters, Ik word aangevallen! + .a18 = Wachters! Ik word aangevallen! + .a19 = Ik word aangevallen! Wachters! + .a20 = Help! Wachters! Ik word aangevallen! + .a21 = Wachters! Kom snel! + .a22 = Wachters! Wachters! + .a23 = Wachters! Er is een snodaard mij aan het aanvallen! + .a24 = Wachters, slacht deze kwaadaardige snodaard! + .a25 = Wachters! Er is een moordenaar! + .a26 = Wachters! Help me! + .a27 = Hier kom je niet mee weg! Wachters! + .a28 = Jij boosdoener! + .a29 = Help me! + .a30 = Help! Alsjeblieft! + .a31 = Ow! Wachters! Help! + .a32 = Ze zitten achter me aan! + .a33 = Help! Help! Ik word onderdrukt! + .a34 = Ah, nu zien we het geweld eigen aan het systeem. + .a35 = Het is maar een schrammetje! + .a36 = Stop daarmee! + .a37 = Wat heb ik jouw ooit aangedaan?! + .a38 = Alsjeblieft stop met aanvallen! + .a39 = Hey! Pas op waar je dat ding wijst! + .a40 = Gruwelijke ellendeling, wegwezen! + .a41 = Stop ermee! Wegwezen! + .a42 = Nu maak je me boos! + .a43 = Oi! Wie denk je wel niet dat je bent?! + .a44 = Hiervoor ga je boeten! + .a45 = Stop, Alsjeblieft! Ik heb niks waardevol! + .a46 = Ik stuur mijn broer op je af, hij is groter dan ik! + .a47 = Neeeee, ik ga het tegen je mama zeggen! + .a48 = Vervloek u! + .a49 = Alsjeblieft niet doen. + .a50 = Dat was niet erg vriendelijk! + .a51 = Je wapen werkt, je mag het nu wegsteken hoor! + .a52 = Genade! + .a53 = Ik smeek je, ik heb een familie! + .a54 = Ik ben te jong om te sterven! + .a55 = Ik ben te mooi om te sterven! + .a56 = Kunnen we erover praten? + .a57 = Geweld is nooit het antwoord! + .a58 = Vandaag zit vol met tegenslagen... + .a59 = Hey, dat doet pijn! + .a60 = Eek! + .a61 = Hoe onbeleefd! + .a62 = Stop, ik smeek je! + .a63 = Ik wens je de mazelen toe! + .a64 = Dit is niet plezant. + .a65 = Hoe durf je?! + .a66 = Ik zet het je betaald! + .a67 = Blijf zo doorgaan en je zult spijt krijgen! + .a68 = Zorg er niet voor dat ik je moet pijn doen! + .a69 = Er moet een soort van misverstand zijn! + .a70 = Je moet dit niet doen! + .a71 = Vertrek, duivel! + .a72 = Dat deed echt pijn! + .a73 = Waarom doe je dit? + .a74 = Bij alles dat heilig is, stop! + .a75 = Je verward mij met iemand anders! + .a76 = Ik verdien dit niet! + .a77 = Doe dat alsjeblieft niet meer. + .a78 = Wachters, gooi dit monster het meer in! + .a79 = Ik laat mijn Tarasque op je los! \ No newline at end of file diff --git a/assets/voxygen/i18n/nl_NL/npc.ron b/assets/voxygen/i18n/nl_NL/npc.ron deleted file mode 100644 index 7928da0392..0000000000 --- a/assets/voxygen/i18n/nl_NL/npc.ron +++ /dev/null @@ -1,93 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for netherlands Dutch -( - string_map: { - }, - - - vector_map: { - "npc.speech.villager_under_attack": [ - "Help, Ik word aangevallen!", - "Help! Ik word aangevallen!", - "Ow! Ik word aangevallen!", - "Ow! Ik word aangevallen! Help!", - "Help me! Ik word aangevallen!", - "Ik word aangevallen! Help!", - "Ik word aangevallen! Help me!", - "Help!", - "Help! Help!", - "Help! Help! Help!", - "Ik word aangevallen!", - "AAAHHH! Ik word aangevallen!", - "AAAHHH! Ik word aangevallen! Help!", - "Help! We worden aangevallen!", - "Help! Moordenaar!", - "Help! Er loopt een moordenaar rond!", - "Help! Ze proberen mij te vermoorden!", - "Wachters, Ik word aangevallen!", - "Wachters! Ik word aangevallen!", - "Ik word aangevallen! Wachters!", - "Help! Wachters! Ik word aangevallen!", - "Wachters! Kom snel!", - "Wachters! Wachters!", - "Wachters! Er is een snodaard mij aan het aanvallen!", - "Wachters, slacht deze kwaadaardige snodaard!", - "Wachters! Er is een moordenaar!", - "Wachters! Help me!", - "Hier kom je niet mee weg! Wachters!", - "Jij boosdoener!", - "Help me!", - "Help! Alsjeblieft!", - "Ow! Wachters! Help!", - "Ze zitten achter me aan!", - "Help! Help! Ik word onderdrukt!", - "Ah, nu zien we het geweld eigen aan het systeem.", - "Het is maar een schrammetje!", - "Stop daarmee!", - "Wat heb ik jouw ooit aangedaan?!", - "Alsjeblieft stop met aanvallen!", - "Hey! Pas op waar je dat ding wijst!", - "Gruwelijke ellendeling, wegwezen!", - "Stop ermee! Wegwezen!", - "Nu maak je me boos!", - "Oi! Wie denk je wel niet dat je bent?!", - "Hiervoor ga je boeten!", - "Stop, Alsjeblieft! Ik heb niks waardevol!", - "Ik stuur mijn broer op je af, hij is groter dan ik!", - "Neeeee, ik ga het tegen je mama zeggen!", - "Vervloek u!", - "Alsjeblieft niet doen.", - "Dat was niet erg vriendelijk!", - "Je wapen werkt, je mag het nu wegsteken hoor!", - "Genade!", - "Ik smeek je, ik heb een familie!", - "Ik ben te jong om te sterven!", - "Ik ben te mooi om te sterven!", - "Kunnen we erover praten?", - "Geweld is nooit het antwoord!", - "Vandaag zit vol met tegenslagen...", - "Hey, dat doet pijn!", - "Eek!", - "Hoe onbeleefd!", - "Stop, ik smeek je!", - "Ik wens je de mazelen toe!", - "Dit is niet plezant.", - "Hoe durf je?!", - "Ik zet het je betaald!", - "Blijf zo doorgaan en je zult spijt krijgen!", - "Zorg er niet voor dat ik je moet pijn doen!", - "Er moet een soort van misverstand zijn!", - "Je moet dit niet doen!", - "Vertrek, duivel!", - "Dat deed echt pijn!", - "Waarom doe je dit?", - "Bij alles dat heilig is, stop!", - "Je verward mij met iemand anders!", - "Ik verdien dit niet!", - "Doe dat alsjeblieft niet meer.", - "Wachters, gooi dit monster het meer in!", - "Ik laat mijn Tarasque op je los!", - ], - } -) diff --git a/assets/voxygen/i18n/no_NB/buff.ftl b/assets/voxygen/i18n/no_NB/buff.ftl new file mode 100644 index 0000000000..38d4c010cc --- /dev/null +++ b/assets/voxygen/i18n/no_NB/buff.ftl @@ -0,0 +1,11 @@ +buff-remove = Klikk for å fjerne +buff-title-missing = Mangler tittel +buff-desc-missing = Mangler beskrivelse +buff-title-heal = Helbred +buff-desc-heal = Helbred over tid. +buff-title-potion = Trylledrikk +buff-desc-potion = Drikker... +buff-title-saturation = Metning +buff-desc-saturation = Helbred over tid fra forbruksvarer. +buff-title-bleed = Blør +buff-desc-bleed = Påfører regelmessig skade. \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/buff.ron b/assets/voxygen/i18n/no_NB/buff.ron deleted file mode 100644 index 526893d919..0000000000 --- a/assets/voxygen/i18n/no_NB/buff.ron +++ /dev/null @@ -1,25 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - /// Buffs and Debuffs - "buff.remove": "Klikk for å fjerne", - "buff.title.missing": "Mangler tittel", - "buff.desc.missing": "Mangler beskrivelse", - // Buffs - "buff.title.heal": "Helbred", - "buff.desc.heal": "Helbred over tid.", - "buff.title.potion": "Trylledrikk", - "buff.desc.potion": "Drikker...", - "buff.title.saturation": "Metning", - "buff.desc.saturation": "Helbred over tid fra forbruksvarer.", - // Debuffs - "buff.title.bleed": "Blør", - "buff.desc.bleed": "Påfører regelmessig skade.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/char_selection.ftl b/assets/voxygen/i18n/no_NB/char_selection.ftl new file mode 100644 index 0000000000..8bbc3ce32d --- /dev/null +++ b/assets/voxygen/i18n/no_NB/char_selection.ftl @@ -0,0 +1,21 @@ +char_selection-loading_characters = Laster inn karakterer... +char_selection-delete_permanently = Slett denne karakteren permanent? +char_selection-deleting_character = Sletter karakter... +char_selection-change_server = Bytt server +char_selection-enter_world = Gå inn i verden +char_selection-logout = Logg ut +char_selection-create_new_character = Lag ny karakter +char_selection-creating_character = Skaper karakter... +char_selection-character_creation = Karakterskaping +char_selection-human_default = Menneskestandarder +char_selection-level_fmt = Nivå { $level_nb } +char_selection-uncanny_valley = Villmark +char_selection-plains_of_uncertainty = Usikkerhetssletter +char_selection-beard = Skjegg +char_selection-hair_style = Hårstil +char_selection-hair_color = Hårfarge +char_selection-eye_color = Øyenfarge +char_selection-skin = Hud +char_selection-eyeshape = Øyedetaljer +char_selection-accessories = Tilbehør +char_selection-create_info_name = Karakteren din trenger et navn! \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/char_selection.ron b/assets/voxygen/i18n/no_NB/char_selection.ron deleted file mode 100644 index bb049b1e7b..0000000000 --- a/assets/voxygen/i18n/no_NB/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "char_selection.loading_characters": "Laster inn karakterer...", - "char_selection.delete_permanently": "Slett denne karakteren permanent?", - "char_selection.deleting_character": "Sletter karakter...", - "char_selection.change_server": "Bytt server", - "char_selection.enter_world": "Gå inn i verden", - "char_selection.logout": "Logg ut", - "char_selection.create_new_character": "Lag ny karakter", - "char_selection.creating_character": "Skaper karakter...", - "char_selection.character_creation": "Karakterskaping", - - "char_selection.human_default": "Menneskestandarder", - "char_selection.level_fmt": "Nivå {level_nb}", - "char_selection.uncanny_valley": "Villmark", - "char_selection.plains_of_uncertainty": "Usikkerhetssletter", - "char_selection.beard": "Skjegg", - "char_selection.hair_style": "Hårstil", - "char_selection.hair_color": "Hårfarge", - "char_selection.eye_color": "Øyenfarge", - "char_selection.skin": "Hud", - "char_selection.eyeshape": "Øyedetaljer", - "char_selection.accessories": "Tilbehør", - "char_selection.create_info_name": "Karakteren din trenger et navn!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/common.ftl b/assets/voxygen/i18n/no_NB/common.ftl new file mode 100644 index 0000000000..dbcd35ef5b --- /dev/null +++ b/assets/voxygen/i18n/no_NB/common.ftl @@ -0,0 +1,54 @@ +common-username = Brukernavn +common-singleplayer = Enspiller +common-multiplayer = Flerspiller +common-servers = Servere +common-quit = Avslutt +common-settings = Innstillinger +common-languages = Språk +common-interface = Grensesnitt +common-gameplay = Spillbarhet +common-controls = Kontroller +common-video = Grafikk +common-sound = Lyd +common-resume = Fortsett +common-characters = Karakterer +common-close = Lukk +common-yes = Ja +common-no = Nei +common-back = Tilbake +common-create = Lag +common-okay = Ok +common-add = Legg til +common-accept = Aksepter +common-decline = Avslå +common-disclaimer = Bemerk +common-cancel = Avbryt +common-none = Ingen +common-error = Feil +common-fatal_error = Kritisk Feil +common-you = Du +common-automatic = Automatisk +common-random = Tilfeldig +common-interface_settings = Grensesnitt Instillinger +common-gameplay_settings = Spillbarhet Innstillinger +common-controls_settings = Kontroller Innstillinger +common-video_settings = Grafikk Innstillinger +common-sound_settings = Lyd Innstillinger +common-language_settings = Språk Innstillinger +common-connection_lost = + Mistet forbindelsen! + Har serveren startet på nytt? + Har det kommet nye oppdateringer? +common-species-orc = Ork +common-species-human = Menneske +common-species-dwarf = Dverg +common-species-elf = Alv +common-species-draugr = Udødelig +common-species-danari = Danari +common-weapons-axe = Øks +common-weapons-sword = Sverd +common-weapons-staff = Stav +common-weapons-bow = Bue +common-weapons-hammer = Hammer +common-weapons-sceptre = Helbredings Septer +common-rand_appearance = Tilfeldig utseende og navn \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/common.ron b/assets/voxygen/i18n/no_NB/common.ron deleted file mode 100644 index c8bfeffe64..0000000000 --- a/assets/voxygen/i18n/no_NB/common.ron +++ /dev/null @@ -1,71 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Brukernavn", - "common.singleplayer": "Enspiller", - "common.multiplayer": "Flerspiller", - "common.servers": "Servere", - "common.quit": "Avslutt", - "common.settings": "Innstillinger", - "common.languages": "Språk", - "common.interface": "Grensesnitt", - "common.gameplay": "Spillbarhet", - "common.controls": "Kontroller", - "common.video": "Grafikk", - "common.sound": "Lyd", - "common.resume": "Fortsett", - "common.characters": "Karakterer", - "common.close": "Lukk", - "common.yes": "Ja", - "common.no": "Nei", - "common.back": "Tilbake", - "common.create": "Lag", - "common.okay": "Ok", - "common.add": "Legg til", - "common.accept": "Aksepter", - "common.decline": "Avslå", - "common.disclaimer": "Bemerk", - "common.cancel": "Avbryt", - "common.none": "Ingen", - "common.error": "Feil", - "common.fatal_error": "Kritisk Feil", - "common.you": "Du", - "common.automatic": "Automatisk", - "common.random": "Tilfeldig", - // Settings Window title - "common.interface_settings": "Grensesnitt Instillinger", - "common.gameplay_settings": "Spillbarhet Innstillinger", - "common.controls_settings": "Kontroller Innstillinger", - "common.video_settings": "Grafikk Innstillinger", - "common.sound_settings": "Lyd Innstillinger", - "common.language_settings": "Språk Innstillinger", - - // Message when connection to the server is lost - "common.connection_lost": r#"Mistet forbindelsen! -Har serveren startet på nytt? -Har det kommet nye oppdateringer?"#, - - - "common.species.orc": "Ork", - "common.species.human": "Menneske", - "common.species.dwarf": "Dverg", - "common.species.elf": "Alv", - "common.species.draugr": "Udødelig", - "common.species.danari": "Danari", - - "common.weapons.axe": "Øks", - "common.weapons.sword": "Sverd", - "common.weapons.staff": "Stav", - "common.weapons.bow": "Bue", - "common.weapons.hammer": "Hammer", - "common.weapons.sceptre": "Helbredings Septer", - "common.rand_appearance": "Tilfeldig utseende og navn", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/esc_menu.ftl b/assets/voxygen/i18n/no_NB/esc_menu.ftl new file mode 100644 index 0000000000..8bd0a3422d --- /dev/null +++ b/assets/voxygen/i18n/no_NB/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Logg ut +esc_menu-quit_game = Avslutt spillet \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/esc_menu.ron b/assets/voxygen/i18n/no_NB/esc_menu.ron deleted file mode 100644 index 35f020c7e9..0000000000 --- a/assets/voxygen/i18n/no_NB/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "esc_menu.logout": "Logg ut", - "esc_menu.quit_game": "Avslutt spillet", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/gameinput.ftl b/assets/voxygen/i18n/no_NB/gameinput.ftl new file mode 100644 index 0000000000..7d317c32c8 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/gameinput.ftl @@ -0,0 +1,56 @@ +gameinput-primary = Primær Angrep +gameinput-secondary = Sekundær Angrep/Blokk/Sikt +gameinput-slot1 = Hurtigbar Luke 1 +gameinput-slot2 = Hurtigbar Luke 2 +gameinput-slot3 = Hurtigbar Luke 3 +gameinput-slot4 = Hurtigbar Luke 4 +gameinput-slot5 = Hurtigbar Luke 5 +gameinput-slot6 = Hurtigbar Luke 6 +gameinput-slot7 = Hurtigbar Luke 7 +gameinput-slot8 = Hurtigbar Luke 8 +gameinput-slot9 = Hurtigbar Luke 9 +gameinput-slot10 = Hurtigbar Luke 10 +gameinput-swaploadout = Bytt utlastning +gameinput-togglecursor = Veksle Musepeker +gameinput-help = Veksle hjelpevindu +gameinput-toggleinterface = Veksle Grensesnitt +gameinput-toggledebug = Veksle FPS og feilsøkingsinfo +gameinput-screenshot = Ta skjermbilde +gameinput-toggleingameui = Veksle Navneskilt +gameinput-fullscreen = Veksle fullskjerm +gameinput-moveforward = Beveg frem +gameinput-moveleft = Beveg venstre +gameinput-moveright = Beveg høyre +gameinput-moveback = Beveg bakover +gameinput-jump = Hopp +gameinput-glide = Glider +gameinput-roll = Rull +gameinput-climb = Klatre +gameinput-climbdown = Klatre ned +gameinput-wallleap = Veggsprang +gameinput-togglelantern = Veksle lykt +gameinput-mount = Monter +gameinput-chat = Chat +gameinput-command = Kommando +gameinput-escape = Røm +gameinput-map = Kart +gameinput-bag = Bag +gameinput-social = Sosial +gameinput-sit = Sitt +gameinput-spellbook = Trylleformler +gameinput-settings = Innstillinger +gameinput-respawn = Gjennopstå +gameinput-charge = Lad opp +gameinput-togglewield = Veksle Våpen +gameinput-interact = Interaksjon +gameinput-freelook = Frimodus +gameinput-autowalk = Autogåing +gameinput-dance = Dans +gameinput-select = Velg enhet +gameinput-acceptgroupinvite = Godta gruppeinvitasjon +gameinput-declinegroupinvite = Avvis gruppeinvitasjon +gameinput-crafting = Håndverk +gameinput-fly = Fly +gameinput-sneak = Snik +gameinput-swimdown = Svøm nedover +gameinput-swimup = Svøm oppover \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/gameinput.ron b/assets/voxygen/i18n/no_NB/gameinput.ron deleted file mode 100644 index 52be8f36fb..0000000000 --- a/assets/voxygen/i18n/no_NB/gameinput.ron +++ /dev/null @@ -1,67 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "gameinput.primary": "Primær Angrep", - "gameinput.secondary": "Sekundær Angrep/Blokk/Sikt", - "gameinput.slot1": "Hurtigbar Luke 1", - "gameinput.slot2": "Hurtigbar Luke 2", - "gameinput.slot3": "Hurtigbar Luke 3", - "gameinput.slot4": "Hurtigbar Luke 4", - "gameinput.slot5": "Hurtigbar Luke 5", - "gameinput.slot6": "Hurtigbar Luke 6", - "gameinput.slot7": "Hurtigbar Luke 7", - "gameinput.slot8": "Hurtigbar Luke 8", - "gameinput.slot9": "Hurtigbar Luke 9", - "gameinput.slot10": "Hurtigbar Luke 10", - "gameinput.swaploadout": "Bytt utlastning", - "gameinput.togglecursor": "Veksle Musepeker", - "gameinput.help": "Veksle hjelpevindu", - "gameinput.toggleinterface": "Veksle Grensesnitt", - "gameinput.toggledebug": "Veksle FPS og feilsøkingsinfo", - "gameinput.screenshot": "Ta skjermbilde", - "gameinput.toggleingameui": "Veksle Navneskilt", - "gameinput.fullscreen": "Veksle fullskjerm", - "gameinput.moveforward": "Beveg frem", - "gameinput.moveleft": "Beveg venstre", - "gameinput.moveright": "Beveg høyre", - "gameinput.moveback": "Beveg bakover", - "gameinput.jump": "Hopp", - "gameinput.glide": "Glider", - "gameinput.roll": "Rull", - "gameinput.climb": "Klatre", - "gameinput.climbdown": "Klatre ned", - "gameinput.wallleap": "Veggsprang", - "gameinput.togglelantern": "Veksle lykt", - "gameinput.mount": "Monter", - "gameinput.chat": "Chat", - "gameinput.command": "Kommando", - "gameinput.escape": "Røm", - "gameinput.map": "Kart", - "gameinput.bag": "Bag", - "gameinput.social": "Sosial", - "gameinput.sit": "Sitt", - "gameinput.spellbook": "Trylleformler", - "gameinput.settings": "Innstillinger", - "gameinput.respawn": "Gjennopstå", - "gameinput.charge": "Lad opp", - "gameinput.togglewield": "Veksle Våpen", - "gameinput.interact": "Interaksjon", - "gameinput.freelook": "Frimodus", - "gameinput.autowalk": "Autogåing", - "gameinput.dance": "Dans", - "gameinput.select": "Velg enhet", - "gameinput.acceptgroupinvite": "Godta gruppeinvitasjon", - "gameinput.declinegroupinvite": "Avvis gruppeinvitasjon", - "gameinput.crafting": "Håndverk", - "gameinput.fly": "Fly", - "gameinput.sneak": "Snik", - "gameinput.swimdown": "Svøm nedover", - "gameinput.swimup": "Svøm oppover", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/bag.ftl b/assets/voxygen/i18n/no_NB/hud/bag.ftl new file mode 100644 index 0000000000..3b5856c4e5 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/bag.ftl @@ -0,0 +1,20 @@ +hud-bag-inventory = { $playername }'s Inventar +hud-bag-stats_title = { $playername }'s Statistikk +hud-bag-exp = Exp +hud-bag-armor = Utrustning +hud-bag-stats = Statistikk +hud-bag-head = Hode +hud-bag-neck = Nakke +hud-bag-tabard = Tabard +hud-bag-shoulders = Skulder +hud-bag-chest = Bryst +hud-bag-hands = Hender +hud-bag-lantern = Lykt +hud-bag-glider = Glidefly +hud-bag-belt = Belte +hud-bag-ring = Ring +hud-bag-back = Rygg +hud-bag-legs = Ben +hud-bag-feet = Føtter +hud-bag-mainhand = Hovedhånd +hud-bag-offhand = Tillegshånd \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/bag.ron b/assets/voxygen/i18n/no_NB/hud/bag.ron deleted file mode 100644 index dc50db6beb..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/bag.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}'s Inventar", - "hud.bag.stats_title": "{playername}'s Statistikk", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Utrustning", - "hud.bag.stats": "Statistikk", - "hud.bag.head": "Hode", - "hud.bag.neck": "Nakke", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Skulder", - "hud.bag.chest": "Bryst", - "hud.bag.hands": "Hender", - "hud.bag.lantern": "Lykt", - "hud.bag.glider": "Glidefly", - "hud.bag.belt": "Belte", - "hud.bag.ring": "Ring", - "hud.bag.back": "Rygg", - "hud.bag.legs": "Ben", - "hud.bag.feet": "Føtter", - "hud.bag.mainhand": "Hovedhånd", - "hud.bag.offhand": "Tillegshånd", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/char_window.ftl b/assets/voxygen/i18n/no_NB/hud/char_window.ftl new file mode 100644 index 0000000000..75b96896d2 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Karakternavn +character_window-character_stats = + Utholdenhet + + Fitness + + Viljestyrke + + Beskyttelse \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/char_window.ron b/assets/voxygen/i18n/no_NB/hud/char_window.ron deleted file mode 100644 index 0d3e194674..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/char_window.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - /// Start character window section - "character_window.character_name": "Karakternavn", - // Character stats - "character_window.character_stats": r#"Utholdenhet - -Fitness - -Viljestyrke - -Beskyttelse -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/chat.ftl b/assets/voxygen/i18n/no_NB/hud/chat.ftl new file mode 100644 index 0000000000..2dbd7dc3dd --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/chat.ftl @@ -0,0 +1,20 @@ +hud-chat-online_msg = [{ $name }] logget på +hud-chat-offline_msg = [{ $name }] logget av +hud-chat-default_death_msg = [{ $name }] døde +hud-chat-environmental_kill_msg = [{ $name }] døde i { $environment } +hud-chat-fall_kill_msg = [{ $name }] døde av fallskade +hud-chat-suicide_msg = [{ $name }] døde av selvskader +hud-chat-pvp_melee_kill_msg = [{ $attacker }] drepte [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] skjøt [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] sprengte [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] drepte [{ $victim }] med magi +hud-chat-pvp_buff_kill_msg = [{ $attacker }] drepte [{ $victim }] +hud-chat-npc_melee_kill_msg = { $attacker } drepte [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } skjøt [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } sprengte [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } drepte [{ $victim }] med magi +hud-chat-npc_other_kill_msg = { $attacker } drepte [{ $victim }] +hud-chat-loot_msg = Du plukket opp [{ $item }] +hud-chat-loot_fail = Ditt inventar er fullt! +hud-chat-goodbye = Adjø! +hud-chat-connection_lost = Forbindelse mistet. Utkastet om { $time } sekunder. \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/chat.ron b/assets/voxygen/i18n/no_NB/hud/chat.ron deleted file mode 100644 index 605cbf9fe7..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/chat.ron +++ /dev/null @@ -1,37 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Chat outputs - "hud.chat.online_msg": "[{name}] logget på", - "hud.chat.offline_msg": "[{name}] logget av", - - "hud.chat.default_death_msg": "[{name}] døde", - "hud.chat.environmental_kill_msg": "[{name}] døde i {environment}", - "hud.chat.fall_kill_msg": "[{name}] døde av fallskade", - "hud.chat.suicide_msg": "[{name}] døde av selvskader", - - "hud.chat.pvp_melee_kill_msg": "[{attacker}] drepte [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] skjøt [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] sprengte [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] drepte [{victim}] med magi", - "hud.chat.pvp_buff_kill_msg": "[{attacker}] drepte [{victim}]", - - - "hud.chat.npc_melee_kill_msg": "{attacker} drepte [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} skjøt [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} sprengte [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} drepte [{victim}] med magi", - "hud.chat.npc_other_kill_msg": "{attacker} drepte [{victim}]", - - "hud.chat.loot_msg": "Du plukket opp [{item}]", - "hud.chat.loot_fail": "Ditt inventar er fullt!", - "hud.chat.goodbye": "Adjø!", - "hud.chat.connection_lost": "Forbindelse mistet. Utkastet om {time} sekunder.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/crafting.ftl b/assets/voxygen/i18n/no_NB/hud/crafting.ftl new file mode 100644 index 0000000000..986d5f3ebd --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/crafting.ftl @@ -0,0 +1,5 @@ +hud-crafting = Håndverk +hud-crafting-recipes = Oppskrifter +hud-crafting-ingredients = Ingredienser: +hud-crafting-craft = Lag +hud-crafting-tool_cata = Krever: \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/crafting.ron b/assets/voxygen/i18n/no_NB/hud/crafting.ron deleted file mode 100644 index 279f6042ee..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/crafting.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "hud.crafting": "Håndverk", - "hud.crafting.recipes": "Oppskrifter", - "hud.crafting.ingredients": "Ingredienser:", - "hud.crafting.craft": "Lag", - "hud.crafting.tool_cata": "Krever:", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/group.ftl b/assets/voxygen/i18n/no_NB/hud/group.ftl new file mode 100644 index 0000000000..849411cf86 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/group.ftl @@ -0,0 +1,12 @@ +hud-group = Gruppe +hud-group-invite_to_join = [{ $name }] inviterte deg til gruppen deres! +hud-group-invite = Inviter +hud-group-kick = Spark +hud-group-assign_leader = Tilordne leder +hud-group-leave = Forlat Gruppe +hud-group-dead = Død +hud-group-out_of_range = Ute av rekkevidde +hud-group-add_friend = Legg til i vennelisten +hud-group-link_group = Koble til grupper +hud-group-in_menu = I Meny +hud-group-members = Gruppemedlemmer \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/group.ron b/assets/voxygen/i18n/no_NB/hud/group.ron deleted file mode 100644 index 99159f78c6..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/group.ron +++ /dev/null @@ -1,23 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "hud.group": "Gruppe", - "hud.group.invite_to_join": "[{name}] inviterte deg til gruppen deres!", - "hud.group.invite": "Inviter", - "hud.group.kick": "Spark", - "hud.group.assign_leader": "Tilordne leder", - "hud.group.leave": "Forlat Gruppe", - "hud.group.dead" : "Død", - "hud.group.out_of_range": "Ute av rekkevidde", - "hud.group.add_friend": "Legg til i vennelisten", - "hud.group.link_group": "Koble til grupper", - "hud.group.in_menu": "I Meny", - "hud.group.members": "Gruppemedlemmer", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/map.ftl b/assets/voxygen/i18n/no_NB/hud/map.ftl new file mode 100644 index 0000000000..d688df0147 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/map.ftl @@ -0,0 +1,2 @@ +hud-map-map_title = Kart +hud-map-qlog_title = Oppdrag \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/map.ron b/assets/voxygen/i18n/no_NB/hud/map.ron deleted file mode 100644 index 07d5c8e761..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/map.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Kart", - "hud.map.qlog_title": "Oppdrag", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/misc.ftl b/assets/voxygen/i18n/no_NB/hud/misc.ftl new file mode 100644 index 0000000000..cf41a7d47e --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/misc.ftl @@ -0,0 +1,58 @@ +hud-do_not_show_on_startup = Ikke vis dette på oppstart +hud-show_tips = Vis tips +hud-quests = Oppdrag +hud-you_died = Du døde +hud-waypoint_saved = Veipunkt lagret +hud-press_key_to_show_keybindings_fmt = [{ $key }] Hurtigtaster +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lykt +hud-press_key_to_show_debug_info_fmt = Trykk { $key } for å vise feilsøkingsinfo +hud-press_key_to_toggle_keybindings_fmt = Trykk { $key } for å skru av/på hurtigtaster +hud-press_key_to_toggle_debug_info_fmt = Trykk { $key } for å skru av/på feilsøkingsinformasjon +hud-press_key_to_respawn = Trykk { $key } for å gjennopstå ved det siste bålet du besøkte. +hud-welcome = + Velkommen til Veloren Alfa! + + + Noen tips før du begynner: + + + Trykk på F1 for å se tilgjengelige hurtigtaster. + + Skriv /hjelp inn i chatten for å se chat-kommandoer + + + Det er kister og andre gjenstander som spawner tilfeldig i verden! + + Høyreklikk for å samle dem. + + For å brukte det du plyndrer fra disse kistene, åpne inventaret ditt med 'B'. + + Dobbeltklikk på varene i inventaret ditt for å bruke det eller ta det på. + + Kast dem ved å klikke og dra dem utenfor inventaret. + + + Nettene kan bli ganske mørke i Veloren. + + Tenn din lykt ved å trykke på 'G'. + + + Vil du frigjøre markøren for å lukke dette vinduet? Trykk på TAB! + + + Kos deg i verden av Veloren. +hud-temp_quest_headline = Vær så snill, Hjelp oss reisende! +hud-temp_quest_text = + Fangehull fylt med onde kultister + har dukket opp rundt våre fredelige byer! + + + Samle noe selskap, samle mat + og bekjemp deres dårlige ledere og akolytter. + + + Kanskje du til og med kan skaffe deg en av de + magisk infunderte gjenstandene? +hud-spell = Trylleformel +hud-free_look_indicator = Frimodus aktiv. Trykk { $key } for å skru av. +hud-auto_walk_indicator = Autogåing aktiv \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/misc.ron b/assets/voxygen/i18n/no_NB/hud/misc.ron deleted file mode 100644 index 7f2f16147f..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/misc.ron +++ /dev/null @@ -1,76 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - /// Start HUD Section - "hud.do_not_show_on_startup": "Ikke vis dette på oppstart", - "hud.show_tips": "Vis tips", - "hud.quests": "Oppdrag", - "hud.you_died": "Du døde", - "hud.waypoint_saved": "Veipunkt lagret", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Hurtigtaster", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lykt", - "hud.press_key_to_show_debug_info_fmt": "Trykk {key} for å vise feilsøkingsinfo", - "hud.press_key_to_toggle_keybindings_fmt": "Trykk {key} for å skru av/på hurtigtaster", - "hud.press_key_to_toggle_debug_info_fmt": "Trykk {key} for å skru av/på feilsøkingsinformasjon", - - // Respawn message - "hud.press_key_to_respawn": r#"Trykk {key} for å gjennopstå ved det siste bålet du besøkte."#, - - // Welcome message - "hud.welcome": r#"Velkommen til Veloren Alfa! - - -Noen tips før du begynner: - - -Trykk på F1 for å se tilgjengelige hurtigtaster. - -Skriv /hjelp inn i chatten for å se chat-kommandoer - - -Det er kister og andre gjenstander som spawner tilfeldig i verden! - -Høyreklikk for å samle dem. - -For å brukte det du plyndrer fra disse kistene, åpne inventaret ditt med 'B'. - -Dobbeltklikk på varene i inventaret ditt for å bruke det eller ta det på. - -Kast dem ved å klikke og dra dem utenfor inventaret. - - -Nettene kan bli ganske mørke i Veloren. - -Tenn din lykt ved å trykke på 'G'. - - -Vil du frigjøre markøren for å lukke dette vinduet? Trykk på TAB! - - -Kos deg i verden av Veloren."#, - -"hud.temp_quest_headline": r#"Vær så snill, Hjelp oss reisende!"#, -"hud.temp_quest_text": r#"Fangehull fylt med onde kultister -har dukket opp rundt våre fredelige byer! - - -Samle noe selskap, samle mat -og bekjemp deres dårlige ledere og akolytter. - - -Kanskje du til og med kan skaffe deg en av de -magisk infunderte gjenstandene?"#, - - "hud.spell": "Trylleformel", - - "hud.free_look_indicator": "Frimodus aktiv. Trykk {key} for å skru av.", - "hud.auto_walk_indicator": "Autogåing aktiv", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/sct.ftl b/assets/voxygen/i18n/no_NB/hud/sct.ftl new file mode 100644 index 0000000000..beda54f92b --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOKERT \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/sct.ron b/assets/voxygen/i18n/no_NB/hud/sct.ron deleted file mode 100644 index 63d45168e1..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOKERT", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/settings.ftl b/assets/voxygen/i18n/no_NB/hud/settings.ftl new file mode 100644 index 0000000000..b8e962b96a --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/settings.ftl @@ -0,0 +1,78 @@ +hud-settings-general = Generell +hud-settings-none = Ingen +hud-settings-press_behavior-toggle = Veksle +hud-settings-press_behavior-hold = Hold +hud-settings-help_window = Hjelpevindu +hud-settings-debug_info = Feilsøkingsinformasjon +hud-settings-tips_on_startup = Tips-På-Oppstart +hud-settings-ui_scale = UI-Skalering +hud-settings-relative_scaling = Relativ Skalering +hud-settings-custom_scaling = Tilpasset Skalering +hud-settings-crosshair = Retikkel +hud-settings-opacity = Gjennomsiktighet +hud-settings-hotbar = Hurtigknappsbar +hud-settings-toggle_shortcuts = Veksle Snarveier +hud-settings-buffs_skillbar = Ikoner på Ferdighetsbar +hud-settings-buffs_mmap = Ikoner på Minimap +hud-settings-toggle_bar_experience = Veksle erfaringsbar +hud-settings-scrolling_combat_text = Rullende kamptekst +hud-settings-incoming_damage = Innkommende skade +hud-settings-speech_bubble = Snakkeboble +hud-settings-speech_bubble_dark_mode = Mørk modus for snakkeboble +hud-settings-speech_bubble_icon = Snakkeboble ikon +hud-settings-energybar_numbers = Energibar tall +hud-settings-values = Verdier +hud-settings-percentages = Prosentandeler +hud-settings-chat = Chat +hud-settings-background_opacity = Bakgrunnsgjennomsiktighet +hud-settings-chat_character_name = Karakternavn i chat +hud-settings-loading_tips = Oppstartsskjerm Tips +hud-settings-pan_sensitivity = Panoreringssensitivitet +hud-settings-zoom_sensitivity = Zoomingssensitivitet +hud-settings-invert_scroll_zoom = Inverter skrollezoom +hud-settings-invert_mouse_y_axis = Inverter mus Y Aksen +hud-settings-enable_mouse_smoothing = Kamerautjevning +hud-settings-free_look_behavior = Frimodus oppførsel +hud-settings-auto_walk_behavior = Autogåing oppførsel +hud-settings-stop_auto_walk_on_input = Stopp autogåing på bevegelse +hud-settings-view_distance = Utsiktsavstand +hud-settings-sprites_view_distance = Sprites utsiktsavstand +hud-settings-figures_view_distance = Enhets utsiktsavstand +hud-settings-maximum_fps = Maksimum FPS +hud-settings-fov = Synsfelt (deg) +hud-settings-gamma = Gamma +hud-settings-ambiance = Stemning Brightness +hud-settings-antialiasing_mode = Kantutjevningsmodus +hud-settings-cloud_rendering_mode = Tegn-skyer-modus +hud-settings-fluid_rendering_mode = Tegn-væske-modus +hud-settings-fluid_rendering_mode-cheap = Billig +hud-settings-fluid_rendering_mode-shiny = Skinnende +hud-settings-cloud_rendering_mode-minimal = Minimal +hud-settings-cloud_rendering_mode-low = Lav +hud-settings-cloud_rendering_mode-medium = Medium +hud-settings-cloud_rendering_mode-high = Høy +hud-settings-fullscreen = Full skjerm +hud-settings-fullscreen_mode = Fullskjermsmodus +hud-settings-fullscreen_mode-exclusive = Eksklusiv +hud-settings-fullscreen_mode-borderless = Uten kanter +hud-settings-particles = Partikler +hud-settings-resolution = Resolusjon +hud-settings-bit_depth = Bit Dybde +hud-settings-refresh_rate = Oppdateringsfrekvens +hud-settings-save_window_size = Spar vindusstørrelse +hud-settings-lighting_rendering_mode = Tegn-belysning-modus +hud-settings-lighting_rendering_mode-ashikhmin = Type A - Høy +hud-settings-lighting_rendering_mode-blinnphong = Type B - Medium +hud-settings-lighting_rendering_mode-lambertian = Type L - Billing +hud-settings-shadow_rendering_mode = Tegn-skygger-modus +hud-settings-shadow_rendering_mode-none = Ingen +hud-settings-shadow_rendering_mode-cheap = Billig +hud-settings-shadow_rendering_mode-map = Kart +hud-settings-shadow_rendering_mode-map-resolution = Resolusjon +hud-settings-lod_detail = Nivå med detaljer +hud-settings-music_volume = Musikkvolum +hud-settings-sound_effect_volume = Lydeffektvolum +hud-settings-audio_device = Lydenhet +hud-settings-awaitingkey = Trykk på en tast... +hud-settings-unbound = Ingen +hud-settings-reset_keybinds = Tilbakestill til standardinnstillinger \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/settings.ron b/assets/voxygen/i18n/no_NB/hud/settings.ron deleted file mode 100644 index 3de4642315..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/settings.ron +++ /dev/null @@ -1,95 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "hud.settings.general": "Generell", - "hud.settings.none": "Ingen", - "hud.settings.press_behavior.toggle": "Veksle", - "hud.settings.press_behavior.hold": "Hold", - "hud.settings.help_window": "Hjelpevindu", - "hud.settings.debug_info": "Feilsøkingsinformasjon", - "hud.settings.tips_on_startup": "Tips-På-Oppstart", - "hud.settings.ui_scale": "UI-Skalering", - "hud.settings.relative_scaling": "Relativ Skalering", - "hud.settings.custom_scaling": "Tilpasset Skalering", - "hud.settings.crosshair": "Retikkel", - "hud.settings.opacity": "Gjennomsiktighet", - "hud.settings.hotbar": "Hurtigknappsbar", - "hud.settings.toggle_shortcuts": "Veksle Snarveier", - "hud.settings.buffs_skillbar": "Ikoner på Ferdighetsbar", - "hud.settings.buffs_mmap": "Ikoner på Minimap", - "hud.settings.toggle_bar_experience": "Veksle erfaringsbar", - "hud.settings.scrolling_combat_text": "Rullende kamptekst", - "hud.settings.incoming_damage": "Innkommende skade", - "hud.settings.speech_bubble": "Snakkeboble", - "hud.settings.speech_bubble_dark_mode": "Mørk modus for snakkeboble", - "hud.settings.speech_bubble_icon": "Snakkeboble ikon", - "hud.settings.energybar_numbers": "Energibar tall", - "hud.settings.values": "Verdier", - "hud.settings.percentages": "Prosentandeler", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Bakgrunnsgjennomsiktighet", - "hud.settings.chat_character_name": "Karakternavn i chat", - "hud.settings.loading_tips": "Oppstartsskjerm Tips", - - "hud.settings.pan_sensitivity": "Panoreringssensitivitet", - "hud.settings.zoom_sensitivity": "Zoomingssensitivitet", - "hud.settings.invert_scroll_zoom": "Inverter skrollezoom", - "hud.settings.invert_mouse_y_axis": "Inverter mus Y Aksen", - "hud.settings.enable_mouse_smoothing": "Kamerautjevning", - "hud.settings.free_look_behavior": "Frimodus oppførsel", - "hud.settings.auto_walk_behavior": "Autogåing oppførsel", - "hud.settings.stop_auto_walk_on_input": "Stopp autogåing på bevegelse", - - "hud.settings.view_distance": "Utsiktsavstand", - "hud.settings.sprites_view_distance": "Sprites utsiktsavstand", - "hud.settings.figures_view_distance": "Enhets utsiktsavstand", - "hud.settings.maximum_fps": "Maksimum FPS", - "hud.settings.fov": "Synsfelt (deg)", - "hud.settings.gamma": "Gamma", - "hud.settings.ambiance": "Stemning Brightness", - "hud.settings.antialiasing_mode": "Kantutjevningsmodus", - "hud.settings.cloud_rendering_mode": "Tegn-skyer-modus", - "hud.settings.fluid_rendering_mode": "Tegn-væske-modus", - "hud.settings.fluid_rendering_mode.cheap": "Billig", - "hud.settings.fluid_rendering_mode.shiny": "Skinnende", - "hud.settings.cloud_rendering_mode.minimal": "Minimal", - "hud.settings.cloud_rendering_mode.low": "Lav", - "hud.settings.cloud_rendering_mode.medium": "Medium", - "hud.settings.cloud_rendering_mode.high": "Høy", - "hud.settings.fullscreen": "Full skjerm", - "hud.settings.fullscreen_mode": "Fullskjermsmodus", - "hud.settings.fullscreen_mode.exclusive": "Eksklusiv", - "hud.settings.fullscreen_mode.borderless": "Uten kanter", - "hud.settings.particles": "Partikler", - "hud.settings.resolution": "Resolusjon", - "hud.settings.bit_depth": "Bit Dybde", - "hud.settings.refresh_rate": "Oppdateringsfrekvens", - "hud.settings.save_window_size": "Spar vindusstørrelse", - "hud.settings.lighting_rendering_mode": "Tegn-belysning-modus", - "hud.settings.lighting_rendering_mode.ashikhmin": "Type A - Høy ", - "hud.settings.lighting_rendering_mode.blinnphong": "Type B - Medium", - "hud.settings.lighting_rendering_mode.lambertian": "Type L - Billing", - "hud.settings.shadow_rendering_mode": "Tegn-skygger-modus", - "hud.settings.shadow_rendering_mode.none": "Ingen", - "hud.settings.shadow_rendering_mode.cheap": "Billig", - "hud.settings.shadow_rendering_mode.map": "Kart", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolusjon", - "hud.settings.lod_detail": "Nivå med detaljer", - "hud.settings.save_window_size": "Lagre vindusstørrelse", - - - "hud.settings.music_volume": "Musikkvolum", - "hud.settings.sound_effect_volume": "Lydeffektvolum", - "hud.settings.audio_device": "Lydenhet", - - "hud.settings.awaitingkey": "Trykk på en tast...", - "hud.settings.unbound": "Ingen", - "hud.settings.reset_keybinds": "Tilbakestill til standardinnstillinger", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/skills.ftl b/assets/voxygen/i18n/no_NB/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/no_NB/hud/skills.ron b/assets/voxygen/i18n/no_NB/hud/skills.ron deleted file mode 100644 index b50e50eea5..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/skills.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/no_NB/hud/social.ftl b/assets/voxygen/i18n/no_NB/hud/social.ftl new file mode 100644 index 0000000000..7fe620e497 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Andre spillere +hud-social-online = Tilstede: +hud-social-friends = Venner +hud-social-not_yet_available = Ikke tilgjengelig enda +hud-social-faction = Fraksjon +hud-social-play_online_fmt = { $nb_player } spiller(e) tilstede +hud-social-name = Navn +hud-social-level = Nivå +hud-social-zone = Sone +hud-social-account = Bruker \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/hud/social.ron b/assets/voxygen/i18n/no_NB/hud/social.ron deleted file mode 100644 index 6086ffd95a..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "hud.social": "Andre spillere", - "hud.social.online": "Tilstede:", - "hud.social.friends": "Venner", - "hud.social.not_yet_available": "Ikke tilgjengelig enda", - "hud.social.faction": "Fraksjon", - "hud.social.play_online_fmt": "{nb_player} spiller(e) tilstede", - "hud.social.name": "Navn", - "hud.social.level": "Nivå", - "hud.social.zone": "Sone", - "hud.social.account": "Bruker", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/no_NB/hud/trade.ftl b/assets/voxygen/i18n/no_NB/hud/trade.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/no_NB/hud/trade.ron b/assets/voxygen/i18n/no_NB/hud/trade.ron deleted file mode 100644 index f087a37a31..0000000000 --- a/assets/voxygen/i18n/no_NB/hud/trade.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/no_NB/main.ftl b/assets/voxygen/i18n/no_NB/main.ftl new file mode 100644 index 0000000000..b03413ca21 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/main.ftl @@ -0,0 +1,69 @@ +main-username = Brukernavn +main-server = Server +main-password = Passord +main-connecting = Kobler til +main-creating_world = Lager verden +main-tip = Tips: +main-notice = + Velkommen til alfaversjonen av Veloren! + + Før du dykker inn i moroa, vennligst hold et par ting i tankene: + + - Dette er en veldig tidlig alfa. Forvent feil, ekstremt uferdig spilling, upolert mekanikk og manglende funksjoner. + + - Hvis du har konstruktive tilbakemeldinger eller feilrapporter, kan du kontakte oss via Reddit, GitLab eller vår Discord-server. + + - Veloren er lisensiert under GPL 3 åpen kildekode-lisensen. Det betyr at du er fri til å spille, endre og distribuere spillet på nytt, akkurat + som du ønsker (så lenge arbeidet også er under GPL 3). + + - Veloren er et ikke-profitt basert samfunnsprosjekt, og alle som jobber på prosjektet er frivillige. + Hvis du liker det du ser, er du velkommen til å bli med i utviklings- eller kunstteamene! + + Takk for at du tar deg tid til å lese denne meldingen, vi håper at du liker spillet! + + - Veloren-utviklerne +main-login_process = + Informasjon om påloggingsprosessen: + + Vær oppmerksom på at du nå trenger en konto + for å spille på godkjennings-aktiverte servere. + + Du kan opprette en konto på + + https://veloren.net/account/. +main-login-server_not_found = Server ikke funnet +main-login-authentication_error = Innloggingsfeil på serveren +main-login-server_full = Serveren er full +main-login-untrusted_auth_server = Godkjenningsserver kan ikke stoles på +main-login-outdated_client_or_server = Sannsynligvis er versjoner inkompatible, se etter oppdateringer. +main-login-timeout = Serveren svarte ikke i tide. (Overbelastet eller nettverksproblemer). +main-login-server_shut_down = Serveren stoppet +main-login-network_error = Nettverksfeil +main-login-failed_sending_request = Forespørsel til godkjenningsserver mislyktes +main-login-invalid_character = Den valgte karakteren er ugyldig +main-login-client_crashed = Klienten krasjet +main-login-not_on_whitelist = Du trenger en hvitelisteoppføring av en administrator for å bli med +main-login-banned = Du har blitt utestengt av følgende grunn +main-login-kicked = Du har blitt sparket ut av følgende grunn +main-login-select_language = Velg språk +main-servers-select_server = Velg en server +loading-tips = + .a0 = Trykk '{ $gameinput-togglelantern }' for å tenne lykten. + .a1 = Trykk '{ $gameinput-help }' for å se alle standard tastebindinger. + .a2 = Du kan skrive /say eller /s for å bare chatte med spillere rett rundt deg. + .a3 = Du kan skrive /region eller /r for å bare chatte med spillere et par hundre blokker rundt deg. + .a4 = Du kan skrive /group eller /g for å bare chatte med spillere i din nåværende gruppe. + .a5 = For å sende private meldinger skriv /tell etterfulgt av et spillernavn og meldingen din. + .a6 = NPCer med samme nivå kan ha forskjellige problemer. + .a7 = Hold øye med mat, kister og andre godsaker spredt over hele verden! + .a8 = Inventar fylt med mat? Prøv å lage bedre mat med det! + .a9 = Lurer du på hva du kan gjøre? Fangehull er merket med brune flekker på kartet! + .a10 = Ikke glem å justere grafikken for systemet ditt. Trykk på '{ $gameinput-settings }' for å åpne innstillingene. + .a11 = Å spille med andre er gøy! Trykk '{ $gameinput-social }' for å se hvem som er online. + .a12 = En NPC med en hodeskalle under helsebaren er ganske kraftig sammenlignet med deg selv. + .a13 = Trykk '{ $gameinput-dance }' for å danse. Fest! + .a14 = Trykk '{ $gameinput-glide }' for å åpne Glider og erobre himmelen. + .a15 = Veloren er fortsatt i Pre-Alfa. Vi gjør vårt beste for å forbedre det hver dag! + .a16 = Hvis du vil bli med i Dev-teamet eller bare ta en prat med oss, bli med i Discord-Serveren. + .a17 = Du kan veksle for å vise mengden helse på helselinjen i innstillingene. + .a18 = For å se statistikken din, klikk på 'Statistikk' -knappen i beholdningen. \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/main.ron b/assets/voxygen/i18n/no_NB/main.ron deleted file mode 100644 index 3e444381c7..0000000000 --- a/assets/voxygen/i18n/no_NB/main.ron +++ /dev/null @@ -1,84 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for norsk bokmål -( - string_map: { - "main.username": "Brukernavn", - "main.server": "Server", - "main.password": "Passord", - "main.connecting": "Kobler til", - "main.creating_world": "Lager verden", - "main.tip": "Tips:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Velkommen til alfaversjonen av Veloren! - -Før du dykker inn i moroa, vennligst hold et par ting i tankene: - -- Dette er en veldig tidlig alfa. Forvent feil, ekstremt uferdig spilling, upolert mekanikk og manglende funksjoner. - -- Hvis du har konstruktive tilbakemeldinger eller feilrapporter, kan du kontakte oss via Reddit, GitLab eller vår Discord-server. - -- Veloren er lisensiert under GPL 3 åpen kildekode-lisensen. Det betyr at du er fri til å spille, endre og distribuere spillet på nytt, akkurat - som du ønsker (så lenge arbeidet også er under GPL 3). - -- Veloren er et ikke-profitt basert samfunnsprosjekt, og alle som jobber på prosjektet er frivillige. -Hvis du liker det du ser, er du velkommen til å bli med i utviklings- eller kunstteamene! - -Takk for at du tar deg tid til å lese denne meldingen, vi håper at du liker spillet! - -- Veloren-utviklerne"#, - - // Login process description - "main.login_process": r#"Informasjon om påloggingsprosessen: - -Vær oppmerksom på at du nå trenger en konto -for å spille på godkjennings-aktiverte servere. - -Du kan opprette en konto på - -https://veloren.net/account/."#, - "main.login.server_not_found": "Server ikke funnet", - "main.login.authentication_error": "Innloggingsfeil på serveren", - "main.login.server_full": "Serveren er full", - "main.login.untrusted_auth_server": "Godkjenningsserver kan ikke stoles på", - "main.login.outdated_client_or_server": "Sannsynligvis er versjoner inkompatible, se etter oppdateringer.", - "main.login.timeout": "Serveren svarte ikke i tide. (Overbelastet eller nettverksproblemer).", - "main.login.server_shut_down": "Serveren stoppet", - "main.login.network_error": "Nettverksfeil", - "main.login.failed_sending_request": "Forespørsel til godkjenningsserver mislyktes", - "main.login.invalid_character": "Den valgte karakteren er ugyldig", - "main.login.client_crashed": "Klienten krasjet", - "main.login.not_on_whitelist": "Du trenger en hvitelisteoppføring av en administrator for å bli med", - "main.login.banned": "Du har blitt utestengt av følgende grunn", - "main.login.kicked": "Du har blitt sparket ut av følgende grunn", - "main.login.select_language": "Velg språk", - - "main.servers.select_server": "Velg en server", - }, - - - vector_map: { - "loading.tips": [ - "Trykk '{gameinput.togglelantern}' for å tenne lykten.", - "Trykk '{gameinput.help}' for å se alle standard tastebindinger.", - "Du kan skrive /say eller /s for å bare chatte med spillere rett rundt deg.", - "Du kan skrive /region eller /r for å bare chatte med spillere et par hundre blokker rundt deg.", - "Du kan skrive /group eller /g for å bare chatte med spillere i din nåværende gruppe.", - "For å sende private meldinger skriv /tell etterfulgt av et spillernavn og meldingen din.", - "NPCer med samme nivå kan ha forskjellige problemer.", - "Hold øye med mat, kister og andre godsaker spredt over hele verden!", - "Inventar fylt med mat? Prøv å lage bedre mat med det!", - "Lurer du på hva du kan gjøre? Fangehull er merket med brune flekker på kartet!", - "Ikke glem å justere grafikken for systemet ditt. Trykk på '{gameinput.settings}' for å åpne innstillingene.", - "Å spille med andre er gøy! Trykk '{gameinput.social}' for å se hvem som er online.", - "En NPC med en hodeskalle under helsebaren er ganske kraftig sammenlignet med deg selv.", - "Trykk '{gameinput.dance}' for å danse. Fest!", - "Trykk '{gameinput.glide}' for å åpne Glider og erobre himmelen.", - "Veloren er fortsatt i Pre-Alfa. Vi gjør vårt beste for å forbedre det hver dag!", - "Hvis du vil bli med i Dev-teamet eller bare ta en prat med oss, bli med i Discord-Serveren.", - "Du kan veksle for å vise mengden helse på helselinjen i innstillingene.", - "For å se statistikken din, klikk på 'Statistikk' -knappen i beholdningen.", - ], - } -) diff --git a/assets/voxygen/i18n/no_NB/npc.ftl b/assets/voxygen/i18n/no_NB/npc.ftl new file mode 100644 index 0000000000..bfe2a3edb5 --- /dev/null +++ b/assets/voxygen/i18n/no_NB/npc.ftl @@ -0,0 +1,80 @@ +npc-speech-villager_under_attack = + .a0 = Hjelp, jeg er under angrep! + .a1 = Hjelp! Jeg er under angrep! + .a2 = Au! Jeg er under angrep! + .a3 = Au! Jeg er under angrep! Hjelp! + .a4 = Hjelp meg! Jeg er under angrep! + .a5 = Jeg er under angrep! Hjelp! + .a6 = Jeg er under angrep! Hjelp meg! + .a7 = Hjelp! + .a8 = Hjelp! Hjelp! + .a9 = Hjelp! Hjelp! Hjelp! + .a10 = Jeg er under angrep! + .a11 = AAAHHH! Jeg er under angrep! + .a12 = AAAHHH! Jeg er under angrep! Hjelp! + .a13 = Hjelp! Vi er under angrep! + .a14 = Hjelp! Morder! + .a15 = Hjelp! Det er en morder på frifot! + .a16 = Hjelp! De prøver å drepe meg! + .a17 = Vakter, jeg er under angrep! + .a18 = Vakter! Jeg er under angrep! + .a19 = Jeg er under angrep! Vakter! + .a20 = Hjelp! Vakter! Jeg er under angrep! + .a21 = Vakter! Kom raskt! + .a22 = Vakter! Vakter! + .a23 = Vakter! Det er en skurk som angriper meg! + .a24 = Vakter, drep denne onde skurken! + .a25 = Vakter! Det er en morder! + .a26 = Vakter! Hjelp meg! + .a27 = Du kommer ikke unna med dette! Vakter! + .a28 = Du fiende! + .a29 = Hjelp meg! + .a30 = Hjelp! Vœr så snill! + .a31 = Ouch! Vakter! Hjelp! + .a32 = De etterfølger etter meg! + .a33 = Hjelp! Hjelp! Jeg blir undertrykt! + .a34 = Ah, nå ser vi volden som er bygd inn i systemet. + .a35 = Det er bare en ripe! + .a36 = Slutt med det! + .a37 = Hva har jeg noensinne gjort mot deg?! + .a38 = Vær så snill slutt å angripe meg! + .a39 = Hei! Se for deg hvor du peker den tingen! + .a40 = Avskyelige krek, bort med deg! + .a41 = Stop det! Gå vekk! + .a42 = Nå gjør du meg sint! + .a43 = Oi! Hvem tror du at du er?! + .a44 = Jeg tar hodet ditt for det! + .a45 = Stop, vær så snill! Jeg har ingenting av verdi på meg! + .a46 = Jeg får broren min til å ta deg, han er større enn meg! + .a47 = Neiii, jeg sier det til mamma! + .a48 = Forbann deg! + .a49 = Vœr så snill ikke gjør det. + .a50 = Det var ikke veldig snilt! + .a51 = Våpnet ditt funker, du kan ta det vekk nå! + .a52 = Bespar meg! + .a53 = Vær så snill, jeg har familie! + .a54 = Jeg er for ung til å dø! + .a55 = Kan vi snakke om dette? + .a56 = Vold er aldri svaret! + .a57 = I dag ser ut til å være en dårlig dag... + .a58 = Hei, det kjente jeg! + .a59 = Eek! + .a60 = Hvor uhøflig! + .a61 = Stop, jeg ber deg! + .a62 = Smitte beslage deg! + .a63 = Dette er ikke gøy. + .a64 = Hvordan våger du?! + .a65 = Du kommer til å betale for dette! + .a66 = Fortsett med dette og du kommer til å be unnskyld! + .a67 = Ikke få meg til å banke deg! + .a68 = Dette må være en misforståelse! + .a69 = Du trenger ikke å gjøre dette! + .a70 = Gå vekk, skurk! + .a71 = Det gjorde vondt! + .a72 = Hvorfor gjorde du det? + .a73 = Etter åndene, forsvinn! + .a74 = Du må ha forvekslet meg med noen andre! + .a75 = Jeg fortjener ikke dette! + .a76 = Vær så snill ikke gjør dette igjen! + .a77 = Vakter, kast dette mennesket i havet! + .a78 = Jeg får min tarasque til å etterfølge deg! \ No newline at end of file diff --git a/assets/voxygen/i18n/no_NB/npc.ron b/assets/voxygen/i18n/no_NB/npc.ron deleted file mode 100644 index b4f0ae0622..0000000000 --- a/assets/voxygen/i18n/no_NB/npc.ron +++ /dev/null @@ -1,92 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Lokalisering for norsk bokmål -( - string_map: { - }, - - - vector_map: { - "npc.speech.villager_under_attack": [ - "Hjelp, jeg er under angrep!", - "Hjelp! Jeg er under angrep!", - "Au! Jeg er under angrep!", - "Au! Jeg er under angrep! Hjelp!", - "Hjelp meg! Jeg er under angrep!", - "Jeg er under angrep! Hjelp!", - "Jeg er under angrep! Hjelp meg!", - "Hjelp!", - "Hjelp! Hjelp!", - "Hjelp! Hjelp! Hjelp!", - "Jeg er under angrep!", - "AAAHHH! Jeg er under angrep!", - "AAAHHH! Jeg er under angrep! Hjelp!", - "Hjelp! Vi er under angrep!", - "Hjelp! Morder!", - "Hjelp! Det er en morder på frifot!", - "Hjelp! De prøver å drepe meg!", - "Vakter, jeg er under angrep!", - "Vakter! Jeg er under angrep!", - "Jeg er under angrep! Vakter!", - "Hjelp! Vakter! Jeg er under angrep!", - "Vakter! Kom raskt!", - "Vakter! Vakter!", - "Vakter! Det er en skurk som angriper meg!", - "Vakter, drep denne onde skurken!", - "Vakter! Det er en morder!", - "Vakter! Hjelp meg!", - "Du kommer ikke unna med dette! Vakter!", - "Du fiende!", - "Hjelp meg!", - "Hjelp! Vœr så snill!", - "Ouch! Vakter! Hjelp!", - "De etterfølger etter meg!", - "Hjelp! Hjelp! Jeg blir undertrykt!", - "Ah, nå ser vi volden som er bygd inn i systemet.", - "Det er bare en ripe!", - "Slutt med det!", - "Hva har jeg noensinne gjort mot deg?!", - "Vær så snill slutt å angripe meg!", - "Hei! Se for deg hvor du peker den tingen!", - "Avskyelige krek, bort med deg!", - "Stop det! Gå vekk!", - "Nå gjør du meg sint!", - "Oi! Hvem tror du at du er?!", - "Jeg tar hodet ditt for det!", - "Stop, vær så snill! Jeg har ingenting av verdi på meg!", - "Jeg får broren min til å ta deg, han er større enn meg!", - "Neiii, jeg sier det til mamma!", - "Forbann deg!", - "Vœr så snill ikke gjør det.", - "Det var ikke veldig snilt!", - "Våpnet ditt funker, du kan ta det vekk nå!", - "Bespar meg!", - "Vær så snill, jeg har familie!", - "Jeg er for ung til å dø!", - "Kan vi snakke om dette?", - "Vold er aldri svaret!", - "I dag ser ut til å være en dårlig dag...", - "Hei, det kjente jeg!", - "Eek!", - "Hvor uhøflig!", - "Stop, jeg ber deg!", - "Smitte beslage deg!", - "Dette er ikke gøy.", - "Hvordan våger du?!", - "Du kommer til å betale for dette!", - "Fortsett med dette og du kommer til å be unnskyld!", - "Ikke få meg til å banke deg!", - "Dette må være en misforståelse!", - "Du trenger ikke å gjøre dette!", - "Gå vekk, skurk!", - "Det gjorde vondt!", - "Hvorfor gjorde du det?", - "Etter åndene, forsvinn!", - "Du må ha forvekslet meg med noen andre!", - "Jeg fortjener ikke dette!", - "Vær så snill ikke gjør dette igjen!", - "Vakter, kast dette mennesket i havet!", - "Jeg får min tarasque til å etterfølge deg!", - ], - } -) diff --git a/assets/voxygen/i18n/pl_PL/buff.ftl b/assets/voxygen/i18n/pl_PL/buff.ftl new file mode 100644 index 0000000000..7b3fce6a63 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Kliknij aby usunąć +buff-title-missing = Brak tytułu +buff-desc-missing = Brak opisu +buff-title-heal = Uzdrowienie +buff-desc-heal = Regenerujesz zdrowie przez określony czas. +buff-title-potion = Mikstura +buff-desc-potion = Można ją wypić... +buff-title-saturation = Najedzenie +buff-desc-saturation = Możesz odzyskać zdrowie poprzez jedzenie. +buff-title-campfire_heal = Odpoczynek przy ognisku +buff-desc-campfire_heal = Odpoczywanie przy ognisku przywraca { $rate }% zdrowia na sekundę. +buff-title-invulnerability = Nietykalność +buff-desc-invulnerability = Nie można Cię zranić. +buff-title-protectingward = Totem ochronny +buff-desc-protectingward = Częściowa ochrona przed atakami. +buff-title-frenzied = Szał Walki +buff-desc-frenzied = Wypełnia cię nienaturalny szał walki, ignorujesz pomniejsze obrażenia i poruszasz się szybciej. +buff-title-hastened = Pośpiech +buff-desc-hastened = Twoje ruchy i ataki są szybsze. +buff-title-bleed = Krwawienie +buff-desc-bleed = Zadaje ciągłe obrażenia. +buff-title-cursed = Klątwa +buff-desc-cursed = Jesteś przeklęty. +buff-title-burn = Ogień +buff-desc-burn = Palisz się żywcem +buff-title-crippled = Okaleczenie +buff-desc-crippled = Czy noga powinna się wyginać w tę stronę? +buff-title-frozen = Odmrożenia +buff-desc-frozen = Twoje ruchy i ataki są spowolnione. +buff-title-wet = Przemoczenie +buff-desc-wet = Twoje nogi nie trzymają się podłogi. +buff-title-ensnared = Spętany +buff-desc-ensnared = Pnącza oplotły twoje nogi, utrudniając poruszanie się. +buff-stat-health = Odnawia { $str_total } Zdrowia +buff-stat-increase_max_energy = Podnosi Maksymalną Wytrzymałość o { $strength } +buff-stat-increase_max_health = Podnosi Maksymalne Zdrowie o { $strength } +buff-stat-invulnerability = Daje nietykalność +buff-text-over_seconds = przez { $dur_secs } sekund +buff-text-for_seconds = na { $dur_secs } sekund \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/buff.ron b/assets/voxygen/i18n/pl_PL/buff.ron deleted file mode 100644 index c5ad2a1665..0000000000 --- a/assets/voxygen/i18n/pl_PL/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // Buffs - "buff.remove": "Kliknij aby usunąć", - "buff.title.missing": "Brak tytułu", - "buff.desc.missing": "Brak opisu", - "buff.title.heal": "Uzdrowienie", - "buff.desc.heal": "Regenerujesz zdrowie przez określony czas.", - "buff.title.potion": "Mikstura", - "buff.desc.potion": "Można ją wypić...", - "buff.title.saturation": "Najedzenie", - "buff.desc.saturation": "Możesz odzyskać zdrowie poprzez jedzenie.", - "buff.title.campfire_heal": "Odpoczynek przy ognisku", - "buff.desc.campfire_heal": "Odpoczywanie przy ognisku przywraca {rate}% zdrowia na sekundę.", - "buff.title.invulnerability": "Nietykalność", - "buff.desc.invulnerability": "Nie można Cię zranić.", - "buff.title.protectingward": "Totem ochronny", - "buff.desc.protectingward": "Częściowa ochrona przed atakami.", - "buff.title.frenzied": "Szał Walki", - "buff.desc.frenzied": "Wypełnia cię nienaturalny szał walki, ignorujesz pomniejsze obrażenia i poruszasz się szybciej.", - "buff.title.hastened": "Pośpiech", - "buff.desc.hastened": "Twoje ruchy i ataki są szybsze.", - // Debuffs - "buff.title.bleed": "Krwawienie", - "buff.desc.bleed": "Zadaje ciągłe obrażenia.", - "buff.title.cursed": "Klątwa", - "buff.desc.cursed": "Jesteś przeklęty.", - "buff.title.burn": "Ogień", - "buff.desc.burn": "Palisz się żywcem", - "buff.title.crippled": "Okaleczenie", - "buff.desc.crippled": "Czy noga powinna się wyginać w tę stronę?", - "buff.title.frozen": "Odmrożenia", - "buff.desc.frozen": "Twoje ruchy i ataki są spowolnione.", - "buff.title.wet": "Przemoczenie", - "buff.desc.wet": "Twoje nogi nie trzymają się podłogi.", - "buff.title.ensnared": "Spętany", - "buff.desc.ensnared": "Pnącza oplotły twoje nogi, utrudniając poruszanie się.", - // Buffs stats - "buff.stat.health": "Odnawia {str_total} Zdrowia", - "buff.stat.increase_max_energy": "Podnosi Maksymalną Wytrzymałość o {strength}", - "buff.stat.increase_max_health": "Podnosi Maksymalne Zdrowie o {strength}", - "buff.stat.invulnerability": "Daje nietykalność", - // Text - "buff.text.over_seconds": "przez {dur_secs} sekund", - "buff.text.for_seconds": "na {dur_secs} sekund", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/char_selection.ftl b/assets/voxygen/i18n/pl_PL/char_selection.ftl new file mode 100644 index 0000000000..6c2f34dc42 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Ładowanie Postaci... +char_selection-delete_permanently = Czy na pewno chcesz usunąć tę Postać na zawsze? +char_selection-deleting_character = Usuwanie Postaci... +char_selection-change_server = Zmień Serwer +char_selection-enter_world = Dołącz do Świata +char_selection-logout = Wyloguj się +char_selection-create_new_character = Stwórz nową Postać +char_selection-creating_character = Tworzenie nowej Postaci... +char_selection-character_creation = Tworzenie Postaci +char_selection-human_default = Domyślny człowiek +char_selection-level_fmt = Poziom { $level_nb } +char_selection-uncanny_valley = Dzicz +char_selection-plains_of_uncertainty = Niepewne ziemie +char_selection-beard = Broda +char_selection-hair_style = Fryzura +char_selection-hair_color = Kolor włosów +char_selection-eye_color = Kolor oczu +char_selection-skin = Skóra +char_selection-eyeshape = Detale oczu +char_selection-accessories = Akcesoria +char_selection-create_info_name = Twoja Postać musi posiadać imię! +char_selection-version_mismatch = UWAGA! Ten serwer używa innej (potencjalnie niekompatybilnej) wersji gry. Zaktualizuj grę. \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/char_selection.ron b/assets/voxygen/i18n/pl_PL/char_selection.ron deleted file mode 100644 index 086c8903e4..0000000000 --- a/assets/voxygen/i18n/pl_PL/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "char_selection.loading_characters": "Ładowanie Postaci...", - "char_selection.delete_permanently": "Czy na pewno chcesz usunąć tę Postać na zawsze?", - "char_selection.deleting_character": "Usuwanie Postaci...", - "char_selection.change_server": "Zmień Serwer", - "char_selection.enter_world": "Dołącz do Świata", - "char_selection.logout": "Wyloguj się", - "char_selection.create_new_character": "Stwórz nową Postać", - "char_selection.creating_character": "Tworzenie nowej Postaci...", - "char_selection.character_creation": "Tworzenie Postaci", - "char_selection.human_default": "Domyślny człowiek", - "char_selection.level_fmt": "Poziom {level_nb}", - "char_selection.uncanny_valley": "Dzicz", - "char_selection.plains_of_uncertainty": "Niepewne ziemie", - "char_selection.beard": "Broda", - "char_selection.hair_style": "Fryzura", - "char_selection.hair_color": "Kolor włosów", - "char_selection.eye_color": "Kolor oczu", - "char_selection.skin": "Skóra", - "char_selection.eyeshape": "Detale oczu", - "char_selection.accessories": "Akcesoria", - "char_selection.create_info_name": "Twoja Postać musi posiadać imię!", - "char_selection.version_mismatch": "UWAGA! Ten serwer używa innej (potencjalnie niekompatybilnej) wersji gry. Zaktualizuj grę." - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/common.ftl b/assets/voxygen/i18n/pl_PL/common.ftl new file mode 100644 index 0000000000..875c86bec0 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/common.ftl @@ -0,0 +1,108 @@ +common-username = Nazwa Użytkownika +common-singleplayer = Tryb jednoosobowy +common-multiplayer = Tryb wieloosobowy +common-servers = Serwery +common-quit = Wyjdź +common-settings = Ustawienia +common-languages = Języki +common-interface = Interfejs +common-gameplay = Rozgrywka +common-controls = Sterowanie +common-video = Grafika +common-sound = Dźwięk +common-chat = Czat +common-resume = Kontynuuj +common-characters = Postacie +common-close = Zamknij +common-yes = Tak +common-no = Nie +common-back = Wstecz +common-create = Stwórz +common-okay = Okej +common-add = Dodaj +common-accept = Akceptuj +common-decline = Odrzuć +common-disclaimer = Uwaga +common-cancel = Anuluj +common-none = Brak +common-error = Błąd +common-fatal_error = Błąd krytyczny +common-you = Ty +common-automatic = Automatyczne +common-random = Losowo +common-empty = Pusty +common-confirm = Potwierdzam +common-delete_server = Usuń Serwer +common-interface_settings = Ustawienia interfejsu +common-gameplay_settings = Ustawienia rozgrywki +common-controls_settings = Ustawienia sterowania +common-video_settings = Ustawienia grafiki +common-sound_settings = Ustawienia dźwięku +common-language_settings = Ustawienia języka +common-chat_settings = Ustawienia czatu +common-connection_lost = + Stracono połączenie! + Czy serwer nie jest właśnie restartowany?. + Czy masz aktualną wersję gry? +common-species-orc = Ork +common-species-human = Człowiek +common-species-dwarf = Krasnolud +common-species-elf = Elf +common-species-draugr = Nieumarły +common-species-danari = Danari +common-weapons-axe = Siekiera +common-weapons-dagger = Sztylet +common-weapons-greatsword = Wielki Miecz +common-weapons-shortswords = Krótkie Miecze +common-weapons-sword = Miecz +common-weapons-staff = Płomienny Kostur +common-weapons-bow = Łuk +common-weapons-hammer = Młot +common-weapons-general = Ogólna Walka +common-weapons-sceptre = Berło Leczenia +common-weapons-shield = Tarcza +common-weapons-spear = Włócznia +common-weapons-hammer_simple = Prosty Młot +common-weapons-sword_simple = Prosty Miecz +common-weapons-staff_simple = Prosty Płomienny Kostur +common-weapons-axe_simple = Prosta Siekiera +common-weapons-bow_simple = Prosty Łuk +common-weapons-unique = Unikalny +common-tool-debug = Debug +common-tool-farming = Narzędzie Rolnicze +common-tool-pick = Kilof +common-tool-mining = Kopanie +common-kind-modular_component = Modularna część +common-kind-modular_component_partial = Część +common-kind-glider = Lotnia +common-kind-consumable = Jadalne +common-kind-throwable = Może być rzucone +common-kind-utility = Użytkowe +common-kind-ingredient = Składnik +common-kind-lantern = Latarnia +common-hands-one = Jednoręczne +common-hands-two = Dwuręczne +common-rand_appearance = Losowy wygląd +common-rand_name = Losowe imię +common-stats-combat_rating = CR +common-stats-power = Moc +common-stats-speed = Prędkość +common-stats-poise = Odporność +common-stats-range = Zasięg +common-stats-energy_efficiency = Efektywność Energii +common-stats-buff_strength = Siła Efektów Wzmacniających +common-stats-crit_chance = % na cios kryt. +common-stats-crit_mult = Mnożnik ciosu kryt. +common-stats-armor = Obrona +common-stats-poise_res = Odp. na ogłuszenie +common-stats-energy_max = Maksymalna energia +common-stats-energy_reward = Bonus energii +common-stats-crit_power = Moc ciosu kryt. +common-stats-stealth = Skradanie +common-stats-slots = Sloty +common-material-metal = Metal +common-material-wood = Drewno +common-material-stone = Kamień +common-material-cloth = Tkanina +common-material-hide = Skóra +common-sprite-chest = Skrzynia \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/common.ron b/assets/voxygen/i18n/pl_PL/common.ron deleted file mode 100644 index b611574466..0000000000 --- a/assets/voxygen/i18n/pl_PL/common.ron +++ /dev/null @@ -1,130 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Nazwa Użytkownika", - "common.singleplayer": "Tryb jednoosobowy", - "common.multiplayer": "Tryb wieloosobowy", - "common.servers": "Serwery", - "common.quit": "Wyjdź", - "common.settings": "Ustawienia", - "common.languages": "Języki", - "common.interface": "Interfejs", - "common.gameplay": "Rozgrywka", - "common.controls": "Sterowanie", - "common.video": "Grafika", - "common.sound": "Dźwięk", - "common.chat": "Czat", - "common.resume": "Kontynuuj", - "common.characters": "Postacie", - "common.close": "Zamknij", - "common.yes": "Tak", - "common.no": "Nie", - "common.back": "Wstecz", - "common.create": "Stwórz", - "common.okay": "Okej", - "common.add": "Dodaj", - "common.accept": "Akceptuj", - "common.decline": "Odrzuć", - "common.disclaimer": "Uwaga", - "common.cancel": "Anuluj", - "common.none": "Brak", - "common.error": "Błąd", - "common.fatal_error": "Błąd krytyczny", - "common.you": "Ty", - "common.automatic": "Automatyczne", - "common.random": "Losowo", - "common.empty": "Pusty", - "common.confirm": "Potwierdzam", - "common.delete_server": "Usuń Serwer", - - // Settings Window title - "common.interface_settings": "Ustawienia interfejsu", - "common.gameplay_settings": "Ustawienia rozgrywki", - "common.controls_settings": "Ustawienia sterowania", - "common.video_settings": "Ustawienia grafiki", - "common.sound_settings": "Ustawienia dźwięku", - "common.language_settings": "Ustawienia języka", - "common.chat_settings": "Ustawienia czatu", - - // Message when connection to the server is lost - "common.connection_lost": r#"Stracono połączenie! -Czy serwer nie jest właśnie restartowany?. -Czy masz aktualną wersję gry?"#, - - - "common.species.orc": "Ork", - "common.species.human": "Człowiek", - "common.species.dwarf": "Krasnolud", - "common.species.elf": "Elf", - "common.species.draugr": "Nieumarły", - "common.species.danari": "Danari", - - "common.weapons.axe": "Siekiera", - "common.weapons.dagger": "Sztylet", - "common.weapons.greatsword": "Wielki Miecz", - "common.weapons.shortswords": "Krótkie Miecze", - "common.weapons.sword": "Miecz", - "common.weapons.staff": "Płomienny Kostur", - "common.weapons.bow": "Łuk", - "common.weapons.hammer": "Młot", - "common.weapons.general": "Ogólna Walka", - "common.weapons.sceptre": "Berło Leczenia", - "common.weapons.shield": "Tarcza", - "common.weapons.spear": "Włócznia", - "common.weapons.hammer_simple": "Prosty Młot", - "common.weapons.sword_simple": "Prosty Miecz", - "common.weapons.staff_simple": "Prosty Płomienny Kostur", - "common.weapons.axe_simple": "Prosta Siekiera", - "common.weapons.bow_simple": "Prosty Łuk", - "common.weapons.unique": "Unikalny", - "common.tool.debug": "Debug", - "common.tool.farming": "Narzędzie Rolnicze", - "common.tool.pick": "Kilof", - "common.tool.mining": "Kopanie", // TODO: check what this is ingame - "common.kind.modular_component": "Modularna część", - "common.kind.modular_component_partial": "Część", - "common.kind.glider": "Lotnia", - "common.kind.consumable": "Jadalne", - "common.kind.throwable": "Może być rzucone", - "common.kind.utility": "Użytkowe", - "common.kind.ingredient": "Składnik", - "common.kind.lantern": "Latarnia", - "common.hands.one": "Jednoręczne", - "common.hands.two": "Dwuręczne", - - "common.rand_appearance": "Losowy wygląd", - "common.rand_name": "Losowe imię", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Moc", - "common.stats.speed": "Prędkość", - "common.stats.poise": "Odporność", - "common.stats.range": "Zasięg", - "common.stats.energy_efficiency": "Efektywność Energii", - "common.stats.buff_strength": "Siła Efektów Wzmacniających", - "common.stats.crit_chance": "% na cios kryt.", - "common.stats.crit_mult": "Mnożnik ciosu kryt.", - "common.stats.armor": "Obrona", - "common.stats.poise_res": "Odp. na ogłuszenie", - "common.stats.energy_max": "Maksymalna energia", - "common.stats.energy_reward": "Bonus energii", - "common.stats.crit_power": "Moc ciosu kryt.", - "common.stats.stealth": "Skradanie", - "common.stats.slots": "Sloty", - - "common.material.metal": "Metal", - "common.material.wood": "Drewno", - "common.material.stone": "Kamień", - "common.material.cloth": "Tkanina", - "common.material.hide": "Skóra", - - "common.sprite.chest": "Skrzynia", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/esc_menu.ftl b/assets/voxygen/i18n/pl_PL/esc_menu.ftl new file mode 100644 index 0000000000..60d5ab685f --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Wyloguj +esc_menu-quit_game = Wyjdź z gry \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/esc_menu.ron b/assets/voxygen/i18n/pl_PL/esc_menu.ron deleted file mode 100644 index 277c8f2672..0000000000 --- a/assets/voxygen/i18n/pl_PL/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "esc_menu.logout": "Wyloguj", - "esc_menu.quit_game": "Wyjdź z gry", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/gameinput.ftl b/assets/voxygen/i18n/pl_PL/gameinput.ftl new file mode 100644 index 0000000000..6d1283b0ca --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Prosty atak +gameinput-secondary = Atak alternatywny +gameinput-block = Blok +gameinput-slot1 = Skrót 1 +gameinput-slot2 = Skrót 2 +gameinput-slot3 = Skrót 3 +gameinput-slot4 = Skrót 4 +gameinput-slot5 = Skrót 5 +gameinput-slot6 = Skrót 6 +gameinput-slot7 = Skrót 7 +gameinput-slot8 = Skrót 8 +gameinput-slot9 = Skrót 9 +gameinput-slot10 = Skrót 10 +gameinput-swaploadout = Zamień wyposażenie +gameinput-togglecursor = Pokaż/schowaj kursor +gameinput-help = Pokaż/schowaj okno pomocy +gameinput-toggleinterface = Pokaż/schowaj interfejs +gameinput-toggledebug = Pokaż/schowaj FPS i debugowanie +gameinput-toggle_egui_debug = Pokaż/schowaj debugowanie EGUI +gameinput-togglechat = Pokaż/schowaj czat +gameinput-screenshot = Zrzut ekranu +gameinput-toggleingameui = Pokaż/schowaj imiona postaci +gameinput-fullscreen = Pełny ekran +gameinput-moveforward = Przód +gameinput-moveleft = Lewo +gameinput-moveright = Prawo +gameinput-moveback = Wstecz +gameinput-jump = Skok +gameinput-glide = Lotnia +gameinput-roll = Przewrót +gameinput-climb = Wspinaczka w górę +gameinput-climbdown = Wspinaczka w dół +gameinput-wallleap = Odskocz od ściany +gameinput-togglelantern = Zapal/zgaś latarnię +gameinput-mount = Dosiądź +gameinput-chat = Czat +gameinput-command = Komenda +gameinput-escape = Menu +gameinput-map = Mapa +gameinput-bag = Torba +gameinput-trade = Handel +gameinput-social = Społeczność +gameinput-sit = Usiądź +gameinput-spellbook = Czary +gameinput-settings = Ustawienia +gameinput-respawn = Odrodzenie +gameinput-charge = Szarża/Ładowanie +gameinput-togglewield = Przełącz broń +gameinput-interact = Interakcja +gameinput-freelook = Tryb wolnego widoku +gameinput-autowalk = Automatyczne chodzenie/pływanie +gameinput-cameraclamp = Blokada kamery +gameinput-dance = Tańcz +gameinput-select = Zaznacz Obiekt +gameinput-acceptgroupinvite = Akceptuj zaproszenie do grupy +gameinput-declinegroupinvite = Odrzuć zaproszenie do grupy +gameinput-cyclecamera = Przełącz tryb kamery +gameinput-crafting = Tworzenie +gameinput-fly = Lot +gameinput-sneak = Skradanie +gameinput-swimdown = Płyń w dół +gameinput-swimup = Płyń w górę +gameinput-mapzoomin = Przybliż mapę +gameinput-mapzoomout = Oddal mapę +gameinput-greet = Pozdrów +gameinput-map-locationmarkerbutton = Utwórz znacznik na mapie \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/gameinput.ron b/assets/voxygen/i18n/pl_PL/gameinput.ron deleted file mode 100644 index 85f7b46835..0000000000 --- a/assets/voxygen/i18n/pl_PL/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "gameinput.primary": "Prosty atak", - "gameinput.secondary": "Atak alternatywny", - "gameinput.block": "Blok", - "gameinput.slot1": "Skrót 1", - "gameinput.slot2": "Skrót 2", - "gameinput.slot3": "Skrót 3", - "gameinput.slot4": "Skrót 4", - "gameinput.slot5": "Skrót 5", - "gameinput.slot6": "Skrót 6", - "gameinput.slot7": "Skrót 7", - "gameinput.slot8": "Skrót 8", - "gameinput.slot9": "Skrót 9", - "gameinput.slot10": "Skrót 10", - "gameinput.swaploadout": "Zamień wyposażenie", - "gameinput.togglecursor": "Pokaż/schowaj kursor", - "gameinput.help": "Pokaż/schowaj okno pomocy", - "gameinput.toggleinterface": "Pokaż/schowaj interfejs", - "gameinput.toggledebug": "Pokaż/schowaj FPS i debugowanie", - "gameinput.toggle_egui_debug": "Pokaż/schowaj debugowanie EGUI", - "gameinput.togglechat": "Pokaż/schowaj czat", - "gameinput.screenshot": "Zrzut ekranu", - "gameinput.toggleingameui": "Pokaż/schowaj imiona postaci", - "gameinput.fullscreen": "Pełny ekran", - "gameinput.moveforward": "Przód", - "gameinput.moveleft": "Lewo", - "gameinput.moveright": "Prawo", - "gameinput.moveback": "Wstecz", - "gameinput.jump": "Skok", - "gameinput.glide": "Lotnia", - "gameinput.roll": "Przewrót", - "gameinput.climb": "Wspinaczka w górę", - "gameinput.climbdown": "Wspinaczka w dół", - "gameinput.wallleap": "Odskocz od ściany", - "gameinput.togglelantern": "Zapal/zgaś latarnię", - "gameinput.mount": "Dosiądź", - "gameinput.chat": "Czat", - "gameinput.command": "Komenda", - "gameinput.escape": "Menu", // TODO: czy nie da się lepiej? - "gameinput.map": "Mapa", - "gameinput.bag": "Torba", - "gameinput.trade": "Handel", - "gameinput.social": "Społeczność", - "gameinput.sit": "Usiądź", - "gameinput.spellbook": "Czary", - "gameinput.settings": "Ustawienia", - "gameinput.respawn": "Odrodzenie", - "gameinput.charge": "Szarża/Ładowanie", // TODO: sprawdź które to ma być - "gameinput.togglewield": "Przełącz broń", - "gameinput.interact": "Interakcja", - "gameinput.freelook": "Tryb wolnego widoku", - "gameinput.autowalk": "Automatyczne chodzenie/pływanie", - "gameinput.cameraclamp": "Blokada kamery", - "gameinput.dance": "Tańcz", - "gameinput.select": "Zaznacz Obiekt", - "gameinput.acceptgroupinvite": "Akceptuj zaproszenie do grupy", - "gameinput.declinegroupinvite": "Odrzuć zaproszenie do grupy", - "gameinput.cyclecamera": "Przełącz tryb kamery", - "gameinput.crafting": "Tworzenie", // TODO: check this - "gameinput.fly": "Lot", - "gameinput.sneak": "Skradanie", - "gameinput.swimdown": "Płyń w dół", - "gameinput.swimup": "Płyń w górę", - "gameinput.mapzoomin": "Przybliż mapę", - "gameinput.mapzoomout": "Oddal mapę", - "gameinput.greet": "Pozdrów", - "gameinput.map.locationmarkerbutton": "Utwórz znacznik na mapie" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/ability.ftl b/assets/voxygen/i18n/pl_PL/hud/ability.ftl new file mode 100644 index 0000000000..b4c6224b2b --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/ability.ftl @@ -0,0 +1,16 @@ +common-abilities-debug-possess-name = Strzała Opętania +common-abilities-debug-possess-desc = Pozwala przejąć kontrolę nad twoim celem. +common-abilities-sword-spin-name = Cyklon +common-abilities-sword-spin-desc = Poruszasz się do przodu kręcąc się z Twoim mieczem. +common-abilities-axe-leap-name = Skok Drwala +common-abilities-axe-leap-desc = Skaczesz w kierunku kursora, tnąc swoją siekierą. +common-abilities-hammer-leap-name = Uderzenie Zagłady +common-abilities-hammer-leap-desc = Atak obszarowy z odrzutem. Skaczesz w kierunku kursora, uderzając w ziemię swoim młotem. +common-abilities-bow-shotgun-name = Salwa +common-abilities-bow-shotgun-desc = Wystrzeliwujesz salwę strzał. +common-abilities-staff-fireshockwave-name = Pierścień Ognia +common-abilities-staff-fireshockwave-desc = Przywołujesz ognisty pierścień odrzucający przeciwników. +common-abilities-sceptre-wardingaura-name = Ochronna Aura +common-abilities-sceptre-wardingaura-desc = Chroni twoich sojuszników przed atakami. +common-abilities-unknown-name = Umiejętność bez nazwy +common-abilities-unknown-desc = Umiejętność bez opisu \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/ability.ron b/assets/voxygen/i18n/pl_PL/hud/ability.ron deleted file mode 100644 index 856c6a9392..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/ability.ron +++ /dev/null @@ -1,35 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // Debug stick - "common.abilities.debug.possess.name": "Strzała Opętania", - "common.abilities.debug.possess.desc": "Pozwala przejąć kontrolę nad twoim celem.", - // Sword - "common.abilities.sword.spin.name": "Cyklon", - "common.abilities.sword.spin.desc": "Poruszasz się do przodu kręcąc się z Twoim mieczem.", - // Axe - "common.abilities.axe.leap.name": "Skok Drwala", - "common.abilities.axe.leap.desc": "Skaczesz w kierunku kursora, tnąc swoją siekierą.", - // Hammer - "common.abilities.hammer.leap.name": "Uderzenie Zagłady", - "common.abilities.hammer.leap.desc": "Atak obszarowy z odrzutem. Skaczesz w kierunku kursora, uderzając w ziemię swoim młotem.", - // Bow - "common.abilities.bow.shotgun.name": "Salwa", - "common.abilities.bow.shotgun.desc": "Wystrzeliwujesz salwę strzał.", - // Staff - "common.abilities.staff.fireshockwave.name": "Pierścień Ognia", - "common.abilities.staff.fireshockwave.desc": "Przywołujesz ognisty pierścień odrzucający przeciwników.", - // Sceptre - "common.abilities.sceptre.wardingaura.name": "Ochronna Aura", - "common.abilities.sceptre.wardingaura.desc": "Chroni twoich sojuszników przed atakami.", - // Unknown - "common.abilities.unknown.name": "Umiejętność bez nazwy", - "common.abilities.unknown.desc": "Umiejętność bez opisu", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/bag.ftl b/assets/voxygen/i18n/pl_PL/hud/bag.ftl new file mode 100644 index 0000000000..ec664c6d51 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/bag.ftl @@ -0,0 +1,41 @@ +hud-bag-inventory = Ekwipunek { $playername } +hud-bag-stats_title = Statystyki { $playername } +hud-bag-exp = Doświadczenie +hud-bag-armor = Obrona +hud-bag-stats = Statystyki +hud-bag-head = Głowa +hud-bag-neck = Szyja +hud-bag-tabard = Płaszcz +hud-bag-shoulders = Ramiona +hud-bag-chest = Tors +hud-bag-hands = Dłonie +hud-bag-lantern = Latarnia +hud-bag-glider = Lotnia +hud-bag-belt = Pas +hud-bag-ring = Pierścień +hud-bag-back = Plecy +hud-bag-legs = Nogi +hud-bag-feet = Stopy +hud-bag-mainhand = Ręka główna +hud-bag-offhand = Ręka poboczna +hud-bag-inactive_mainhand = Nieaktywna ręka główna +hud-bag-inactive_offhand = Nieaktywna ręka poboczna +hud-bag-swap_equipped_weapons_title = Zamień założone bronie +hud-bag-swap_equipped_weapons_desc = Wciśnij { $key } +hud-bag-bag = Torba +hud-bag-health = Zdrowie +hud-bag-energy = Energia +hud-bag-combat_rating = Combat Rating (CR) +hud-bag-protection = Ochrona +hud-bag-stun_res = Odporność na ogłuszenie +hud-bag-stealth = Ukrywanie się +hud-bag-combat_rating_desc = + Liczone na postawie Twojego + ekwipunku i zdrowia. +hud-bag-protection_desc = Redukcja obrażeń dzięki pancerzowi +hud-bag-stun_res_desc = + Odporność na ogłuszenie spowodowane przyjmowaniem wielu ciosów. + Regeneruje się jak energia. +hud-bag-sort_by_name = Sortuj nazwami +hud-bag-sort_by_quality = Sortuj jakościami +hud-bag-sort_by_category = Sortuj kategoriami \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/bag.ron b/assets/voxygen/i18n/pl_PL/hud/bag.ron deleted file mode 100644 index 32794c1c19..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/bag.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // Inventory - "hud.bag.inventory": "Ekwipunek {playername}", - "hud.bag.stats_title": "Statystyki {playername}", - "hud.bag.exp": "Doświadczenie", - "hud.bag.armor": "Obrona", - "hud.bag.stats": "Statystyki", - "hud.bag.head": "Głowa", - "hud.bag.neck": "Szyja", - "hud.bag.tabard": "Płaszcz", - "hud.bag.shoulders": "Ramiona", - "hud.bag.chest": "Tors", - "hud.bag.hands": "Dłonie", - "hud.bag.lantern": "Latarnia", - "hud.bag.glider": "Lotnia", - "hud.bag.belt": "Pas", - "hud.bag.ring": "Pierścień", - "hud.bag.back": "Plecy", - "hud.bag.legs": "Nogi", - "hud.bag.feet": "Stopy", - "hud.bag.mainhand": "Ręka główna", - "hud.bag.offhand": "Ręka poboczna", - "hud.bag.inactive_mainhand": "Nieaktywna ręka główna", - "hud.bag.inactive_offhand": "Nieaktywna ręka poboczna", - "hud.bag.swap_equipped_weapons_title": "Zamień założone bronie", - "hud.bag.swap_equipped_weapons_desc": "Wciśnij {key}", - "hud.bag.bag": "Torba", - "hud.bag.health": "Zdrowie", - "hud.bag.energy": "Energia", - "hud.bag.combat_rating": "Combat Rating (CR)", - "hud.bag.protection": "Ochrona", - "hud.bag.stun_res": "Odporność na ogłuszenie", - "hud.bag.stealth": "Ukrywanie się", - "hud.bag.combat_rating_desc": "Liczone na postawie Twojego\nekwipunku i zdrowia.", - "hud.bag.protection_desc": "Redukcja obrażeń dzięki pancerzowi", - "hud.bag.stun_res_desc": "Odporność na ogłuszenie spowodowane przyjmowaniem wielu ciosów.\nRegeneruje się jak energia.", - "hud.bag.sort_by_name": "Sortuj nazwami", - "hud.bag.sort_by_quality": "Sortuj jakościami", - "hud.bag.sort_by_category": "Sortuj kategoriami", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/char_window.ftl b/assets/voxygen/i18n/pl_PL/hud/char_window.ftl new file mode 100644 index 0000000000..48481b208b --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Imię postaci +character_window-character_stats = + Wytrzymałość + + Kondycja + + Siła woli + + Obrona \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/char_window.ron b/assets/voxygen/i18n/pl_PL/hud/char_window.ron deleted file mode 100644 index 02a1f1b63d..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "character_window.character_name": "Imię postaci", - // Character stats - "character_window.character_stats": r#"Wytrzymałość - -Kondycja - -Siła woli - -Obrona -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/chat.ftl b/assets/voxygen/i18n/pl_PL/hud/chat.ftl new file mode 100644 index 0000000000..781d77e25e --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Wszystko +hud-chat-chat_tab_hover_tooltip = Kliknij prawym aby otworzyć ustawienia +hud-outcome-burning = zmarł od podpalenia +hud-outcome-curse = zmarł od klątwy +hud-outcome-bleeding = zmarł przez wykrwawienie +hud-outcome-crippled = zmarł od złamań +hud-outcome-frozen = zmarł z zimna +hud-chat-online_msg = [{ $name }] jest online +hud-chat-offline_msg = [{ $name }] jest offline +hud-chat-default_death_msg = [{ $name }] umiera +hud-chat-environmental_kill_msg = [{ $name }] umiera w { $environment } +hud-chat-fall_kill_msg = [{ $name }] spada z wysokości +hud-chat-suicide_msg = [{ $name }] umiera od własnych ran +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } nałożene przez [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] zwycięża nad [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] ustrzela [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] wysadza [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] zabija [{ $victim }] magią +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } nałożone przez { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } zabija [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } ustrzela [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } wysadza [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } zabija [{ $victim }] magią +hud-chat-npc_other_kill_msg = { $attacker } zabija [{ $victim }] +hud-chat-loot_msg = Podniesiono [{ $item }] +hud-chat-loot_fail = Twój ekwipunek jest pełen! +hud-chat-goodbye = Żegnaj! +hud-chat-connection_lost = Stracono połączenie. Wyrzucanie za { $time } sekund. \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/chat.ron b/assets/voxygen/i18n/pl_PL/hud/chat.ron deleted file mode 100644 index 2a308c47a4..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.chat.all": "Wszystko", - "hud.chat.chat_tab_hover_tooltip": "Kliknij prawym aby otworzyć ustawienia", - - // Debuff outcomes - "hud.outcome.burning": "zmarł od podpalenia", - "hud.outcome.curse": "zmarł od klątwy", - "hud.outcome.bleeding": "zmarł przez wykrwawienie", - "hud.outcome.crippled": "zmarł od złamań", - "hud.outcome.frozen": "zmarł z zimna", - - // Chat outputs - "hud.chat.online_msg": "[{name}] jest online", - "hud.chat.offline_msg": "[{name}] jest offline", - - "hud.chat.default_death_msg": "[{name}] umiera", - "hud.chat.environmental_kill_msg": "[{name}] umiera w {environment}", - "hud.chat.fall_kill_msg": "[{name}] spada z wysokości", - "hud.chat.suicide_msg": "[{name}] umiera od własnych ran", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} nałożene przez [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] zwycięża nad [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] ustrzela [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] wysadza [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] zabija [{victim}] magią", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} nałożone przez {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} zabija [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} ustrzela [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} wysadza [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} zabija [{victim}] magią", - "hud.chat.npc_other_kill_msg": "{attacker} zabija [{victim}]", - - "hud.chat.loot_msg": "Podniesiono [{item}]", - "hud.chat.loot_fail": "Twój ekwipunek jest pełen!", - "hud.chat.goodbye": "Żegnaj!", - "hud.chat.connection_lost": "Stracono połączenie. Wyrzucanie za {time} sekund.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/crafting.ftl b/assets/voxygen/i18n/pl_PL/hud/crafting.ftl new file mode 100644 index 0000000000..4bc1ca2eb7 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/crafting.ftl @@ -0,0 +1,44 @@ +hud-crafting = Tworzenie +hud-crafting-recipes = Receptury +hud-crafting-ingredients = Składniki: +hud-crafting-craft = Stwórz +hud-crafting-tool_cata = Wymaga: +hud-crafting-req_crafting_station = Wymaga: +hud-crafting-anvil = Kowadło +hud-crafting-cauldron = Kocioł +hud-crafting-cooking_pot = Gar +hud-crafting-crafting_bench = Stół rzemieślniczy +hud-crafting-forge = Piec +hud-crafting-loom = Krosno +hud-crafting-spinning_wheel = Kołowrotek +hud-crafting-tanning_rack = Stojak do garbowania +hud-crafting-salvaging_station = Stoisko odzyskiwania +hud-crafting-campfire = Ognisko +hud-crafting-tabs-all = Wszystko +hud-crafting-tabs-armor = Pancerz +hud-crafting-tabs-dismantle = Rozmontuj +hud-crafting-tabs-food = Żywność +hud-crafting-tabs-glider = Lotnie +hud-crafting-tabs-potion = Mikstury +hud-crafting-tabs-tool = Narzędzia +hud-crafting-tabs-utility = Użytkowe +hud-crafting-tabs-weapon = Bronie +hud-crafting-tabs-bag = Torby +hud-crafting-tabs-processed_material = Materiały +hud-crafting-dismantle_title = Rozmontowywanie +hud-crafting-dismantle_explanation = + Najedź na przedmioty w pleacaku aby + zobaczyć co możesz odzyskać. + + Kliknij podwójnie aby rozmontować. +hud-crafting-modular_desc = Przeciągnij części przedmiotu aby stworzyć broń +hud-crafting-mod_weap_prim_slot_title = Główna część broni +hud-crafting-mod_weap_prim_slot_desc = Połóż tutaj główną część broni (np. ostrze miecza, siekiery, lub kończyny łuku). +hud-crafting-mod_weap_sec_slot_title = Poboczna część broni +hud-crafting-mod_weap_sec_slot_desc = Połóż tutaj poboczną część bronii (np. rękojeść miecza, uchwyt łuku, lub rdzeń różdżki). +hud-crafting-mod_comp_metal_prim_slot_title = Sztabka metalu +hud-crafting-mod_comp_metal_prim_slot_desc = Połóż tutaj sztabkę metalu, tylko niektóre metale mogą być użyte do tworzenia broni. +hud-crafting-mod_comp_wood_prim_slot_title = Drewno +hud-crafting-mod_comp_wood_prim_slot_desc = Połóż tutaj drewno, tylko niektóre rodzaje drewna mogą być użyte do tworzenia broni. +hud-crafting-mod_comp_sec_slot_title = Materiał zwierzęcy +hud-crafting-mod_comp_sec_slot_desc = Opcjonalnie połóż tutaj zwierzęcy materiał do tworzenia przedmiotów, tylko niektóre materiały zwierzęce mogą zostać użyte do ulepszenia broni. \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/crafting.ron b/assets/voxygen/i18n/pl_PL/hud/crafting.ron deleted file mode 100644 index 3d09aa2921..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/crafting.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.crafting": "Tworzenie", - "hud.crafting.recipes": "Receptury", - "hud.crafting.ingredients": "Składniki:", - "hud.crafting.craft": "Stwórz", - "hud.crafting.tool_cata": "Wymaga:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Wymaga:", - "hud.crafting.anvil": "Kowadło", - "hud.crafting.cauldron": "Kocioł", - "hud.crafting.cooking_pot": "Gar", - "hud.crafting.crafting_bench": "Stół rzemieślniczy", - "hud.crafting.forge": "Piec", - "hud.crafting.loom": "Krosno", - "hud.crafting.spinning_wheel": "Kołowrotek", - "hud.crafting.tanning_rack": "Stojak do garbowania", - "hud.crafting.salvaging_station": "Stoisko odzyskiwania", - "hud.crafting.campfire": "Ognisko", - // Tabs - "hud.crafting.tabs.all": "Wszystko", - "hud.crafting.tabs.armor": "Pancerz", - "hud.crafting.tabs.dismantle": "Rozmontuj", - "hud.crafting.tabs.food": "Żywność", - "hud.crafting.tabs.glider": "Lotnie", - "hud.crafting.tabs.potion": "Mikstury", - "hud.crafting.tabs.tool": "Narzędzia", - "hud.crafting.tabs.utility": "Użytkowe", - "hud.crafting.tabs.weapon": "Bronie", - "hud.crafting.tabs.bag": "Torby", - "hud.crafting.tabs.processed_material": "Materiały", - "hud.crafting.dismantle_title": "Rozmontowywanie", - "hud.crafting.dismantle_explanation" : "Najedź na przedmioty w pleacaku aby\nzobaczyć co możesz odzyskać.\n\nKliknij podwójnie aby rozmontować.", - "hud.crafting.modular_desc": "Przeciągnij części przedmiotu aby stworzyć broń", - "hud.crafting.mod_weap_prim_slot_title": "Główna część broni", - "hud.crafting.mod_weap_prim_slot_desc": "Połóż tutaj główną część broni (np. ostrze miecza, siekiery, lub kończyny łuku).", - "hud.crafting.mod_weap_sec_slot_title": "Poboczna część broni", - "hud.crafting.mod_weap_sec_slot_desc": "Połóż tutaj poboczną część bronii (np. rękojeść miecza, uchwyt łuku, lub rdzeń różdżki).", // TODO: prawdopodobnie kostur zamiast różdżki - "hud.crafting.mod_comp_metal_prim_slot_title": "Sztabka metalu", - "hud.crafting.mod_comp_metal_prim_slot_desc": "Połóż tutaj sztabkę metalu, tylko niektóre metale mogą być użyte do tworzenia broni.", - "hud.crafting.mod_comp_wood_prim_slot_title": "Drewno", - "hud.crafting.mod_comp_wood_prim_slot_desc": "Połóż tutaj drewno, tylko niektóre rodzaje drewna mogą być użyte do tworzenia broni.", - "hud.crafting.mod_comp_sec_slot_title": "Materiał zwierzęcy", - "hud.crafting.mod_comp_sec_slot_desc": "Opcjonalnie połóż tutaj zwierzęcy materiał do tworzenia przedmiotów, tylko niektóre materiały zwierzęce mogą zostać użyte do ulepszenia broni.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/group.ftl b/assets/voxygen/i18n/pl_PL/hud/group.ftl new file mode 100644 index 0000000000..c9002fc971 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grupa +hud-group-invite_to_join = [{ $name }] zaprasza Cię do grupy! +hud-group-invite_to_trade = [{ $name }] zaprasza Cię do wymiany. +hud-group-invite = Zaproś +hud-group-kick = Wyrzuć +hud-group-assign_leader = Przypisz dowódcę +hud-group-leave = Opuść drużynę +hud-group-dead = Martwy +hud-group-out_of_range = Poza zasięgiem +hud-group-add_friend = Dodaj do znajomych +hud-group-link_group = Połącz grupy +hud-group-in_menu = W menu +hud-group-members = Członkowie grupy \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/group.ron b/assets/voxygen/i18n/pl_PL/hud/group.ron deleted file mode 100644 index 724048b176..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.group": "Grupa", - "hud.group.invite_to_join": "[{name}] zaprasza Cię do grupy!", - "hud.group.invite_to_trade": "[{name}] zaprasza Cię do wymiany.", - "hud.group.invite": "Zaproś", - "hud.group.kick": "Wyrzuć", - "hud.group.assign_leader": "Przypisz dowódcę", - "hud.group.leave": "Opuść drużynę", - "hud.group.dead" : "Martwy", /// forma - "hud.group.out_of_range": "Poza zasięgiem", - "hud.group.add_friend": "Dodaj do znajomych", - "hud.group.link_group": "Połącz grupy", - "hud.group.in_menu": "W menu", - "hud.group.members": "Członkowie grupy", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/map.ftl b/assets/voxygen/i18n/pl_PL/hud/map.ftl new file mode 100644 index 0000000000..5ea5aa0548 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/map.ftl @@ -0,0 +1,34 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Zadania +hud-map-topo_map = Widok topograficzny +hud-map-difficulty = Trudność +hud-map-towns = Miasta +hud-map-castles = Zamki +hud-map-dungeons = Lochy +hud-map-caves = Jaskinie +hud-map-cave = Jaskinia +hud-map-peaks = Góry +hud-map-biomes = Biomy +hud-map-voxel_map = Mapa wokselowa +hud-map-trees = Wielkie drzewa +hud-map-tree = Wielkie drzewo +hud-map-town = Miasto +hud-map-castle = Zamek +hud-map-dungeon = Loch +hud-map-difficulty_dungeon = + Loch + + Trudność: { $difficulty } +hud-map-drag = Przewiń +hud-map-zoom = Przybliż +hud-map-mid_click = Ustaw punkt orientacyjny +hud-map-recenter = Wycentruj +hud-map-marked_location = Oznaczona lokacja +hud-map-marked_location_remove = Kliknij aby usunąć +hud-map-change_map_mode = Zmień typ mapy +hud-map-toggle_minimap_voxel = Przełącz widok wokseli na minimapie +hud-map-zoom_minimap_explanation = + Przybliż minimapę aby zobaczyć + teren dookoła ciebie z większą dokładnością +hud-map-gnarling = Fortyfikacje Gnarlingów +hud-map-placed_by = Umiejscowione przez { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/map.ron b/assets/voxygen/i18n/pl_PL/hud/map.ron deleted file mode 100644 index e52d381959..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Zadania", - "hud.map.topo_map": "Widok topograficzny", - "hud.map.difficulty": "Trudność", - "hud.map.towns": "Miasta", - "hud.map.castles": "Zamki", - "hud.map.dungeons": "Lochy", - "hud.map.caves": "Jaskinie", - "hud.map.cave": "Jaskinia", - "hud.map.peaks": "Góry", - "hud.map.biomes": "Biomy", - "hud.map.voxel_map": "Mapa wokselowa", - "hud.map.trees": "Wielkie drzewa", - "hud.map.tree": "Wielkie drzewo", - "hud.map.town": "Miasto", - "hud.map.castle": "Zamek", - "hud.map.dungeon": "Loch", - "hud.map.difficulty_dungeon": "Loch\n\nTrudność: {difficulty}", - "hud.map.drag": "Przewiń", - "hud.map.zoom": "Przybliż", - "hud.map.mid_click": "Ustaw punkt orientacyjny", - "hud.map.recenter": "Wycentruj", - "hud.map.marked_location": "Oznaczona lokacja", - "hud.map.marked_location_remove": "Kliknij aby usunąć", - "hud.map.change_map_mode": "Zmień typ mapy", - "hud.map.toggle_minimap_voxel": "Przełącz widok wokseli na minimapie", - "hud.map.zoom_minimap_explanation": "Przybliż minimapę aby zobaczyć\nteren dookoła ciebie z większą dokładnością", - "hud.map.gnarling": "Fortyfikacje Gnarlingów", - "hud.map.placed_by": "Umiejscowione przez {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/misc.ftl b/assets/voxygen/i18n/pl_PL/hud/misc.ftl new file mode 100644 index 0000000000..e36939067a --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/misc.ftl @@ -0,0 +1,46 @@ +hud-do_not_show_on_startup = Nie pokazuj tego podczas startu +hud-show_tips = Pokaż porady +hud-quests = Zadania +hud-you_died = Zginąłeś +hud-waypoint_saved = Punkt orientacyjny zapisany +hud-sp_arrow_txt = PR +hud-inventory_full = Ekwipunek pełen +hud-someone_else = kogoś innego +hud-another_group = inną grupę +hud-owned_by_for_secs = Posiadane przez { $name } przez { $secs } sekund +hud-press_key_to_show_keybindings_fmt = [{ $key }] przypisania klawiszy +hud-press_key_to_toggle_lantern_fmt = [{ $key }] latarnia +hud-press_key_to_show_debug_info_fmt = Naciśnij { $key } by zobaczyć debug +hud-press_key_to_toggle_keybindings_fmt = Naciśnij { $key } by przełączyć przypisania klawiszy +hud-press_key_to_toggle_debug_info_fmt = Naciśnij { $key } by przełączyć debugowanie +hud-press_key_to_respawn = Naciśnij { $key } by odrodzić się przy ostatnio odwiedzonym ognisku. +hud-tutorial_btn = Samouczek +hud-tutorial_click_here = Naciśnij [ { $key } ] by przełączyć tryb przechwytywania myszy i naciśnij ten przycisk! +hud-tutorial_elements = Tworzenie +hud-temp_quest_headline = Witaj Przybyszu! +hud-temp_quest_text = + By zacząć swoją podróż zacznij od rozglądnięcia się i zebrania zapasów. + + Śmiało bierz cokolwiek będzie Ci potrzebne podczas Twojej wyprawy! + + Spójrz w prawy dolny róg ekranu by znaleźć różne rzeczy, takie jak Twoja torba, menu tworzenia oraz mapę. + + Menu tworzenia pozwala stworzyć pancerze, broń, żywność i wiele innych! + + Dzikie zwierzęta dookoła miast są świetnym źródłem Skrawków Skóry które możesz przetworzyć na ubrania zapewniające dobrą ochronę podczas podróżowania. + + Kiedy poczujesz się gotów, spróbuj zdobyć lepszy ekwipunek z wielu wyzwań rozrzuconych po całej mapie! +hud-spell = Czary +hud-diary = Dziennik +hud-free_look_indicator = Tryb rozglądania aktywny. Naciśnij { $key } by wyłączyć. +hud-camera_clamp_indicator = Pionowa blokada kamery aktywna. Naciśnij { $key } by wyłączyć. +hud-auto_walk_indicator = Automatyczne chodzenie/pływanie aktywne +hud-collect = Zbieraj +hud-pick_up = Podnieś +hud-open = Otwórz +hud-use = Użyj +hud-mine = Wykop +hud-talk = Rozmawiaj +hud-trade = Handluj +hud-mount = Dosiądź +hud-sit = Usiądź \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/misc.ron b/assets/voxygen/i18n/pl_PL/hud/misc.ron deleted file mode 100644 index 7dda45f6c4..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/misc.ron +++ /dev/null @@ -1,66 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.do_not_show_on_startup": "Nie pokazuj tego podczas startu", - "hud.show_tips": "Pokaż porady", - "hud.quests": "Zadania", - "hud.you_died": "Zginąłeś", // forma - "hud.waypoint_saved": "Punkt orientacyjny zapisany", - "hud.sp_arrow_txt": "PR", // punkty rozwoju - "hud.inventory_full": "Ekwipunek pełen", - "hud.someone_else": "kogoś innego", // TODO: forma (ktoś inny) - "hud.another_group": "inną grupę", // TODO: forma (inna grupa) - "hud.owned_by_for_secs": "Posiadane przez {name} przez {secs} sekund", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] przypisania klawiszy", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] latarnia", - "hud.press_key_to_show_debug_info_fmt": "Naciśnij {key} by zobaczyć debug", - "hud.press_key_to_toggle_keybindings_fmt": "Naciśnij {key} by przełączyć przypisania klawiszy", - "hud.press_key_to_toggle_debug_info_fmt": "Naciśnij {key} by przełączyć debugowanie", - - // Respawn message - "hud.press_key_to_respawn": r#"Naciśnij {key} by odrodzić się przy ostatnio odwiedzonym ognisku."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Samouczek"#, - "hud.tutorial_click_here": r#"Naciśnij [ {key} ] by przełączyć tryb przechwytywania myszy i naciśnij ten przycisk!"#, - "hud.tutorial_elements": r#"Tworzenie"#, - - "hud.temp_quest_headline": r#"Witaj Przybyszu!"#, - "hud.temp_quest_text": r#"By zacząć swoją podróż zacznij od rozglądnięcia się i zebrania zapasów. - -Śmiało bierz cokolwiek będzie Ci potrzebne podczas Twojej wyprawy! - -Spójrz w prawy dolny róg ekranu by znaleźć różne rzeczy, takie jak Twoja torba, menu tworzenia oraz mapę. - -Menu tworzenia pozwala stworzyć pancerze, broń, żywność i wiele innych! - -Dzikie zwierzęta dookoła miast są świetnym źródłem Skrawków Skóry które możesz przetworzyć na ubrania zapewniające dobrą ochronę podczas podróżowania. - -Kiedy poczujesz się gotów, spróbuj zdobyć lepszy ekwipunek z wielu wyzwań rozrzuconych po całej mapie! -"#, - - "hud.spell": "Czary", - // Diary - "hud.diary": "Dziennik", - - "hud.free_look_indicator": "Tryb rozglądania aktywny. Naciśnij {key} by wyłączyć.", - "hud.camera_clamp_indicator": "Pionowa blokada kamery aktywna. Naciśnij {key} by wyłączyć.", - "hud.auto_walk_indicator": "Automatyczne chodzenie/pływanie aktywne", - "hud.collect": "Zbieraj", - "hud.pick_up": "Podnieś", - "hud.open": "Otwórz", - "hud.use": "Użyj", - "hud.mine": "Wykop", - "hud.talk": "Rozmawiaj", - "hud.trade": "Handluj", - "hud.mount": "Dosiądź", - "hud.sit": "Usiądź", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/sct.ftl b/assets/voxygen/i18n/pl_PL/hud/sct.ftl new file mode 100644 index 0000000000..e8b85719fa --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } doświadczenia +hud-sct-block = ZABLOKOWANE \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/sct.ron b/assets/voxygen/i18n/pl_PL/hud/sct.ron deleted file mode 100644 index d24e3c3203..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/sct.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} doświadczenia", - "hud.sct.block": "ZABLOKOWANE", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/settings.ftl b/assets/voxygen/i18n/pl_PL/hud/settings.ftl new file mode 100644 index 0000000000..4d3ddb8a3a --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/settings.ftl @@ -0,0 +1,132 @@ +hud-settings-general = Ogólne +hud-settings-none = Brak +hud-settings-press_behavior-toggle = Przełącz +hud-settings-press_behavior-hold = Przytrzymaj +hud-settings-help_window = Okno pomocy +hud-settings-debug_info = Informacje debugowania +hud-settings-show_hitboxes = Pokaż hitboxy +hud-settings-show_chat = Pokaż czat +hud-settings-show_hotkey_hints = Pokaż klawisze skrótu +hud-settings-tips_on_startup = Porady startowe +hud-settings-ui_scale = Skala interfejsu +hud-settings-relative_scaling = Skalowanie relatywne +hud-settings-custom_scaling = Skalowanie niestandardowe +hud-settings-crosshair = Celownik +hud-settings-opacity = Przezroczystość +hud-settings-hotbar = Pasek skrótów +hud-settings-toggle_shortcuts = Przełącz skróty +hud-settings-buffs_skillbar = Wzmocnienia na pasku umiejętności +hud-settings-buffs_mmap = Wzmocnienia na minimapie +hud-settings-toggle_bar_experience = Przełącz pasek doświadczenia +hud-settings-scrolling_combat_text = Przewijanie tekstu podczas walki +hud-settings-damage_accumulation_duration = Czas akumulacji obrażeń +hud-settings-incoming_damage = Otrzymywane obrażenia +hud-settings-incoming_damage_accumulation_duration = Czas akumulacji otrzymywanych obrażeń +hud-settings-round_damage = Zaokrąglaj obrażenia +hud-settings-speech_bubble = Dymek rozmowy +hud-settings-speech_bubble_self = Pokazuj swój dymek rozmowy +hud-settings-speech_bubble_dark_mode = Dymek rozmowy w trybie ciemnym +hud-settings-speech_bubble_icon = Ikona dymka rozmowy +hud-settings-energybar_numbers = Liczby na pasku energii +hud-settings-always_show_bars = Zawsze pokazuj paski zdrowia i energii +hud-settings-experience_numbers = Ilość Doświadczenia +hud-settings-accumulate_experience = Kumuluj ilość doświadczenia +hud-settings-values = Wartości +hud-settings-percentages = Procenty +hud-settings-chat = Czat +hud-settings-background_opacity = Przezroczystość tła +hud-settings-chat_character_name = Imiona postaci na czacie +hud-settings-loading_tips = Porady na ekranie ładowania +hud-settings-reset_interface = Zresetuj ustawienia +hud-settings-pan_sensitivity = Czułość rozglądania +hud-settings-zoom_sensitivity = Czułość przybliżenia +hud-settings-camera_clamp_angle = Kąt kamery w osi pionowej w trybie zablokowanym +hud-settings-invert_scroll_zoom = Odwrócone przybliżanie kółkiem myszy +hud-settings-invert_mouse_y_axis = Odwróć oś Y myszy +hud-settings-invert_controller_y_axis = Odwróć oś Y kontrolera +hud-settings-enable_mouse_smoothing = Wygładzanie ruchu kamery +hud-settings-free_look_behavior = Zachowanie trybu rozglądania +hud-settings-auto_walk_behavior = Zachowanie trybu automatycznego chodu +hud-settings-camera_clamp_behavior = Zachowanie kamery w zablokowanym trybie +hud-settings-player_physics_behavior = Fizyka gracza (eksperymentalne) +hud-settings-stop_auto_walk_on_input = Przełącz automatyczny chód poruszaniem +hud-settings-auto_camera = Automatyczna kamera +hud-settings-bow_zoom = Przybliż widok podczas naciągania łuku +hud-settings-reset_gameplay = Zresetuj ustawienia +hud-settings-view_distance = Odległość renderowania +hud-settings-lod_distance = Odległość renderowania LoD (elementów uproszczonych) +hud-settings-sprites_view_distance = Odległość renderowania 2d +hud-settings-figures_view_distance = Odległość renderowania obiektów +hud-settings-maximum_fps = Limit klatek +hud-settings-background_fps = Limit klatek w tle +hud-settings-present_mode = Present Mode +hud-settings-present_mode-fifo = FIFO +hud-settings-present_mode-mailbox = MAILBOX +hud-settings-present_mode-immediate = Natychmiastowy +hud-settings-fov = Pole widzenia (stopnie) +hud-settings-gamma = Gamma +hud-settings-exposure = Ekspozycja +hud-settings-ambiance = Jasność atmosferyczna +hud-settings-antialiasing_mode = Tryb antyaliasingu +hud-settings-upscale_factor = Rozdzielczość wewnętrzna +hud-settings-cloud_rendering_mode = Tryb renderowania chmur +hud-settings-fluid_rendering_mode = Tryb renderowania płynów +hud-settings-fluid_rendering_mode-cheap = Szybki +hud-settings-fluid_rendering_mode-shiny = Połyskujący +hud-settings-cloud_rendering_mode-minimal = Minimalny +hud-settings-cloud_rendering_mode-low = Niski +hud-settings-cloud_rendering_mode-medium = Średni +hud-settings-cloud_rendering_mode-high = Wysoki +hud-settings-cloud_rendering_mode-ultra = Ultra (bez hairworksów) +hud-settings-fullscreen = Pełen ekran +hud-settings-fullscreen_mode = Tryb pełnego ekranu +hud-settings-fullscreen_mode-exclusive = Ekskluzywny (przejęcie) +hud-settings-fullscreen_mode-borderless = Okno bez ramek (łatwiejsze alt-tab'owanie) +hud-settings-gpu_profiler = Włącz taktowanie GPU (Nie zawsze wspierane) +hud-settings-particles = Cząsteczki +hud-settings-lossy_terrain_compression = Stratna kompresja terenu (dla wolnych połączeń) +hud-settings-weapon_trails = Smugi za bronią (efekt ataku) +hud-settings-resolution = Rozdzielczość +hud-settings-bit_depth = Głębia bitowa +hud-settings-refresh_rate = Częstotliwość odświeżania +hud-settings-lighting_rendering_mode = Tryb Renderowania Oświetlenia +hud-settings-lighting_rendering_mode-ashikhmin = Typ A - Wysokie +hud-settings-lighting_rendering_mode-blinnphong = Typ B - Średnie +hud-settings-lighting_rendering_mode-lambertian = Typ L - Lekkie +hud-settings-shadow_rendering_mode = Tryb renderowania cieni +hud-settings-shadow_rendering_mode-none = Brak +hud-settings-shadow_rendering_mode-cheap = Lekki +hud-settings-shadow_rendering_mode-map = Mapa +hud-settings-shadow_rendering_mode-map-resolution = Rozdzielczość +hud-settings-rain_occlusion-resolution = Wykrywanie Okluzji Deszczu +hud-settings-lod_detail = Jakość LoD +hud-settings-save_window_size = Zapisz wymiary okna +hud-settings-reset_graphics = Zresetuj ustawienia +hud-settings-bloom = Poświata (Bloom) +hud-settings-point_glow = Poświata punktowa +hud-settings-master_volume = Głośność Ogólna +hud-settings-inactive_master_volume_perc = Głośność Ogólna (nieaktywne okno) +hud-settings-music_volume = Głośność Muzyki +hud-settings-sound_effect_volume = Głośność Efektów Dźwiękowych +hud-settings-ambience_volume = Głośność Efektów Otoczenia +hud-settings-audio_device = Urządzenie dźwiękowe +hud-settings-reset_sound = Zresetuj ustawienia +hud-settings-english_fallback = Wyświetl angielskie napisy dla brakujących tłumaczeń +hud-settings-awaitingkey = Naciśnij klawisz... +hud-settings-unbound = Brak +hud-settings-reset_keybinds = Zresetuj ustawienia +hud-settings-chat_tabs = Chat Tabs +hud-settings-label = Etykieta: +hud-settings-delete = Usuń +hud-settings-show_all = Pokaż wszystko +hud-settings-messages = Wiadomości +hud-settings-activity = Aktywność +hud-settings-death = Śmierć +hud-settings-group = Grupa +hud-settings-faction = Segment +hud-settings-world = Świat +hud-settings-region = Region +hud-settings-say = Powiedz +hud-settings-all = Wszyscy +hud-settings-group_only = Tylko dla grupy +hud-settings-reset_chat = Zresetuj ustawienia \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/settings.ron b/assets/voxygen/i18n/pl_PL/hud/settings.ron deleted file mode 100644 index e47591d402..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/settings.ron +++ /dev/null @@ -1,151 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - // Settings - "hud.settings.general": "Ogólne", - "hud.settings.none": "Brak", - "hud.settings.press_behavior.toggle": "Przełącz", - "hud.settings.press_behavior.hold": "Przytrzymaj", - "hud.settings.help_window": "Okno pomocy", - "hud.settings.debug_info": "Informacje debugowania", - "hud.settings.show_hitboxes": "Pokaż hitboxy", - "hud.settings.show_chat": "Pokaż czat", - "hud.settings.show_hotkey_hints": "Pokaż klawisze skrótu", - "hud.settings.tips_on_startup": "Porady startowe", - "hud.settings.ui_scale": "Skala interfejsu", - "hud.settings.relative_scaling": "Skalowanie relatywne", - "hud.settings.custom_scaling": "Skalowanie niestandardowe", - "hud.settings.crosshair": "Celownik", - "hud.settings.opacity": "Przezroczystość", - "hud.settings.hotbar": "Pasek skrótów", - "hud.settings.toggle_shortcuts": "Przełącz skróty", - "hud.settings.buffs_skillbar": "Wzmocnienia na pasku umiejętności", - "hud.settings.buffs_mmap": "Wzmocnienia na minimapie", - "hud.settings.toggle_bar_experience": "Przełącz pasek doświadczenia", - "hud.settings.scrolling_combat_text": "Przewijanie tekstu podczas walki", - "hud.settings.damage_accumulation_duration": "Czas akumulacji obrażeń", - "hud.settings.incoming_damage": "Otrzymywane obrażenia", - "hud.settings.incoming_damage_accumulation_duration": "Czas akumulacji otrzymywanych obrażeń", - "hud.settings.round_damage": "Zaokrąglaj obrażenia", - "hud.settings.speech_bubble": "Dymek rozmowy", - "hud.settings.speech_bubble_self": "Pokazuj swój dymek rozmowy", - "hud.settings.speech_bubble_dark_mode": "Dymek rozmowy w trybie ciemnym", - "hud.settings.speech_bubble_icon": "Ikona dymka rozmowy", - "hud.settings.energybar_numbers": "Liczby na pasku energii", - "hud.settings.always_show_bars": "Zawsze pokazuj paski zdrowia i energii", - "hud.settings.experience_numbers": "Ilość Doświadczenia", - "hud.settings.accumulate_experience": "Kumuluj ilość doświadczenia", - "hud.settings.values": "Wartości", - "hud.settings.percentages": "Procenty", - "hud.settings.chat": "Czat", - "hud.settings.background_opacity": "Przezroczystość tła", - "hud.settings.chat_character_name": "Imiona postaci na czacie", - "hud.settings.loading_tips": "Porady na ekranie ładowania", - "hud.settings.reset_interface": "Zresetuj ustawienia", - - "hud.settings.pan_sensitivity": "Czułość rozglądania", - "hud.settings.zoom_sensitivity": "Czułość przybliżenia", - "hud.settings.camera_clamp_angle": "Kąt kamery w osi pionowej w trybie zablokowanym", - "hud.settings.invert_scroll_zoom": "Odwrócone przybliżanie kółkiem myszy", - "hud.settings.invert_mouse_y_axis": "Odwróć oś Y myszy", - "hud.settings.invert_controller_y_axis": "Odwróć oś Y kontrolera", - "hud.settings.enable_mouse_smoothing": "Wygładzanie ruchu kamery", - "hud.settings.free_look_behavior": "Zachowanie trybu rozglądania", - "hud.settings.auto_walk_behavior": "Zachowanie trybu automatycznego chodu", - "hud.settings.camera_clamp_behavior": "Zachowanie kamery w zablokowanym trybie", - "hud.settings.player_physics_behavior": "Fizyka gracza (eksperymentalne)", - "hud.settings.stop_auto_walk_on_input": "Przełącz automatyczny chód poruszaniem", - "hud.settings.auto_camera": "Automatyczna kamera", - "hud.settings.bow_zoom": "Przybliż widok podczas naciągania łuku", - "hud.settings.reset_gameplay": "Zresetuj ustawienia", - - "hud.settings.view_distance": "Odległość renderowania", - "hud.settings.lod_distance": "Odległość renderowania LoD (elementów uproszczonych)", - "hud.settings.sprites_view_distance": "Odległość renderowania 2d", - "hud.settings.figures_view_distance": "Odległość renderowania obiektów", - "hud.settings.maximum_fps": "Limit klatek", - "hud.settings.background_fps": "Limit klatek w tle", - "hud.settings.present_mode": "Present Mode", // TODO: ask what does this do - "hud.settings.present_mode.fifo": "FIFO", - "hud.settings.present_mode.mailbox": "MAILBOX", - "hud.settings.present_mode.immediate": "Natychmiastowy", - "hud.settings.fov": "Pole widzenia (stopnie)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Ekspozycja", - "hud.settings.ambiance": "Jasność atmosferyczna", - "hud.settings.antialiasing_mode": "Tryb antyaliasingu", - "hud.settings.upscale_factor": "Rozdzielczość wewnętrzna", - "hud.settings.cloud_rendering_mode": "Tryb renderowania chmur", - "hud.settings.fluid_rendering_mode": "Tryb renderowania płynów", - "hud.settings.fluid_rendering_mode.cheap": "Szybki", - "hud.settings.fluid_rendering_mode.shiny": "Połyskujący", - "hud.settings.cloud_rendering_mode.minimal": "Minimalny", - "hud.settings.cloud_rendering_mode.low": "Niski", - "hud.settings.cloud_rendering_mode.medium": "Średni", - "hud.settings.cloud_rendering_mode.high": "Wysoki", - "hud.settings.cloud_rendering_mode.ultra": "Ultra (bez hairworksów)", - "hud.settings.fullscreen": "Pełen ekran", - "hud.settings.fullscreen_mode": "Tryb pełnego ekranu", - "hud.settings.fullscreen_mode.exclusive": "Ekskluzywny (przejęcie)", - "hud.settings.fullscreen_mode.borderless": "Okno bez ramek (łatwiejsze alt-tab'owanie)", - "hud.settings.gpu_profiler": "Włącz taktowanie GPU (Nie zawsze wspierane)", // TODO ask what this does and improve translation - "hud.settings.particles": "Cząsteczki", - "hud.settings.lossy_terrain_compression": "Stratna kompresja terenu (dla wolnych połączeń)", - "hud.settings.weapon_trails": "Smugi za bronią (efekt ataku)", - "hud.settings.resolution": "Rozdzielczość", - "hud.settings.bit_depth": "Głębia bitowa", - "hud.settings.refresh_rate": "Częstotliwość odświeżania", - "hud.settings.lighting_rendering_mode": "Tryb Renderowania Oświetlenia", - "hud.settings.lighting_rendering_mode.ashikhmin": "Typ A - Wysokie", - "hud.settings.lighting_rendering_mode.blinnphong": "Typ B - Średnie", - "hud.settings.lighting_rendering_mode.lambertian": "Typ L - Lekkie", - "hud.settings.shadow_rendering_mode": "Tryb renderowania cieni", - "hud.settings.shadow_rendering_mode.none": "Brak", - "hud.settings.shadow_rendering_mode.cheap": "Lekki", - "hud.settings.shadow_rendering_mode.map": "Mapa", - "hud.settings.shadow_rendering_mode.map.resolution": "Rozdzielczość", - "hud.settings.rain_occlusion.resolution": "Wykrywanie Okluzji Deszczu", - "hud.settings.lod_detail": "Jakość LoD", - "hud.settings.save_window_size": "Zapisz wymiary okna", - "hud.settings.reset_graphics": "Zresetuj ustawienia", - "hud.settings.bloom": "Poświata (Bloom)", - "hud.settings.point_glow": "Poświata punktowa", - - "hud.settings.master_volume": "Głośność Ogólna", - "hud.settings.inactive_master_volume_perc": "Głośność Ogólna (nieaktywne okno)", - "hud.settings.music_volume": "Głośność Muzyki", - "hud.settings.sound_effect_volume": "Głośność Efektów Dźwiękowych", - "hud.settings.ambience_volume": "Głośność Efektów Otoczenia", - "hud.settings.audio_device": "Urządzenie dźwiękowe", - "hud.settings.reset_sound": "Zresetuj ustawienia", - - "hud.settings.english_fallback": "Wyświetl angielskie napisy dla brakujących tłumaczeń", - - "hud.settings.awaitingkey": "Naciśnij klawisz...", - "hud.settings.unbound": "Brak", - "hud.settings.reset_keybinds": "Zresetuj ustawienia", - - "hud.settings.chat_tabs": "Chat Tabs", - "hud.settings.label": "Etykieta:", - "hud.settings.delete": "Usuń", - "hud.settings.show_all": "Pokaż wszystko", - "hud.settings.messages": "Wiadomości", - "hud.settings.activity": "Aktywność", - "hud.settings.death": "Śmierć", - "hud.settings.group": "Grupa", - "hud.settings.faction": "Segment", - "hud.settings.world": "Świat", - "hud.settings.region": "Region", - "hud.settings.say": "Powiedz", - "hud.settings.all": "Wszyscy", - "hud.settings.group_only": "Tylko dla grupy", - "hud.settings.reset_chat" : "Zresetuj ustawienia", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/pl_PL/hud/skills.ftl b/assets/voxygen/i18n/pl_PL/hud/skills.ftl new file mode 100644 index 0000000000..d188940cef --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/skills.ftl @@ -0,0 +1,241 @@ +hud-rank_up = Nowy punkt rozwoju +hud-skill-sp_available = Masz { $number } punkt(ów) rozwoju +hud-skill-not_unlocked = Zablokowane +hud-skill-req_sp ={"\u000A"} + + Wymaga { $number } punktów rozwoju +hud-skill-inc_health_title = Zwiększ Zdrowie +hud-skill-inc_health = Zwiększa Maksymalne Zdrowie o { $boost }{ $SP } +hud-skill-inc_energy_title = Zwiększ Wytrzymałość +hud-skill-inc_energy = Zwiększ Maksymalną Wytrzymałość o { $boost }{ $SP } +hud-skill-unlck_sword_title = Odblokuj miecz +hud-skill-unlck_sword = Odblokowuje umiejętności powiązane z mieczem{ $SP } +hud-skill-unlck_axe_title = Odblokuj topór +hud-skill-unlck_axe = Odblokowuje umiejętności powiązane z toporem{ $SP } +hud-skill-unlck_hammer_title = Odblokuj młot +hud-skill-unlck_hammer = Odblokowuje umiejętności powiązane z młotem{ $SP } +hud-skill-unlck_bow_title = Odblokuj łuk +hud-skill-unlck_bow = Odblokowuje umiejętności powiązane z łukiem{ $SP } +hud-skill-unlck_staff_title = Odblokuj kostur +hud-skill-unlck_staff = Odblokowuje umiejętności powiązane z kosturem{ $SP } +hud-skill-unlck_sceptre_title = Odblokuj kostur druida +hud-skill-unlck_sceptre = Odblokowuje umiejętności powiązane z kosturem druida{ $SP } +hud-skill-dodge_title = Unik (przewrót) +hud-skill-dodge = Umożliwia unikanie ataków przeciwników (dodaje klatki nieśmiertelności){ $SP } +hud-skill-roll_energy_title = Przewrót - koszt +hud-skill-roll_energy = Przewrót kosztuje { $boost }% mniej wytrzymałości{ $SP } +hud-skill-roll_speed_title = Przewrót - prędkość +hud-skill-roll_speed = Przewrót jest { $boost }% szybszy{ $SP } +hud-skill-roll_dur_title = Przewrót - długość (czas) +hud-skill-roll_dur = Przewrót trwa { $boost }% dłużej{ $SP } +hud-skill-climbing_title = Wspinaczka +hud-skill-climbing = Wskakuj wyżej (?) +hud-skill-climbing_cost_title = Wspinaczka - koszt +hud-skill-climbing_cost = Wspinaczka zużywa { $boost }% mniej wytrzymałości{ $SP } +hud-skill-climbing_speed_title = Wspinaczka - prędkość +hud-skill-climbing_speed = Wspinaj się { $boost }% szybciej{ $SP } +hud-skill-swim_title = Pływanie +hud-skill-swim = Poruszanie się w mokrym środowisku +hud-skill-swim_speed_title = Pływanie - prędkość +hud-skill-swim_speed = Pływaj { $boost }% szybciej{ $SP } +hud-skill-sc_lifesteal_title = Promień wysysający życie +hud-skill-sc_lifesteal = Wysysaj życie z przeciwników +hud-skill-sc_lifesteal_damage_title = Obrażenia +hud-skill-sc_lifesteal_damage = Zadaj { $boost }% więcej obrażeń{ $SP } +hud-skill-sc_lifesteal_range_title = Zasięg +hud-skill-sc_lifesteal_range = Promień dociera { $boost }% dalej{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Kradzież zdrowia +hud-skill-sc_lifesteal_lifesteal = Przekształć dodatkowe { $boost }% obrażeń w zdrowie{ $SP } +hud-skill-sc_lifesteal_regen_title = Regeneracja Wytrzymałości +hud-skill-sc_lifesteal_regen = Odnów staminę o dodatkowe { $boost }%{ $SP } +hud-skill-sc_heal_title = Promień leczący +hud-skill-sc_heal = Lecz sojuszników używając krwi wrogów +hud-skill-sc_heal_heal_title = Leczenie +hud-skill-sc_heal_heal = Zwiększa leczenie innych o { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Koszt Wytrzymałości +hud-skill-sc_heal_cost = Leczenie innych kosztuje { $boost }% mniej Wytrzymałości{ $SP } +hud-skill-sc_heal_duration_title = Długość +hud-skill-sc_heal_duration = Efekt aury leczącej trwa { $boost }% dłużej{ $SP } +hud-skill-sc_heal_range_title = Zasięg +hud-skill-sc_heal_range = Promień dociera { $boost }% dalej{ $SP } +hud-skill-sc_wardaura_unlock_title = Sfera obronna +hud-skill-sc_wardaura_unlock = Umożliwia nałożenie efektów ochronnych na pobliskich sojuszników{ $SP } +hud-skill-sc_wardaura_strength_title = Siła ochrony +hud-skill-sc_wardaura_strength = Siła ochrony jest zwiększona o { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Długość +hud-skill-sc_wardaura_duration = Efekt ochrony trwa { $boost }% dłużej{ $SP } +hud-skill-sc_wardaura_range_title = Promień +hud-skill-sc_wardaura_range = Sfera ochrony dociera { $boost }% dalej{ $SP } +hud-skill-sc_wardaura_cost_title = Koszt Wytrzymałości +hud-skill-sc_wardaura_cost = Tworzenie sfery ochrony kosztuje { $boost }% mniej energii{ $SP } +hud-skill-st_shockwave_range_title = Fala uderzeniowa - zasięg +hud-skill-st_shockwave_range = Zasięg odrzucenia zwiększony o { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Fala uderzeniowa - koszt +hud-skill-st_shockwave_cost = Zmniejsza koszt Energii fali uderzeniowej o { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Fala uderzeniowa - wybicie +hud-skill-st_shockwave_knockback = Potencjał odrzucenia zwiększony o { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Fala uderzeniowa - obrażenia +hud-skill-st_shockwave_damage = Zwiększa obrażenia zadane przez falę uderzeniową o { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Fala uderzeniowa +hud-skill-st_shockwave_unlock = Daje możliwość odrzucania przeciwników używając ognia{ $SP } +hud-skill-st_flamethrower_title = Miotacz ognia +hud-skill-st_flamethrower = Zamień się w beztłuszczową frytkownicę +hud-skill-st_flame_velocity_title = Miotacz ognia - prędkość +hud-skill-st_flame_velocity = Ogień rozprzestrzenia się o { $boost }% szybciej{ $SP } +hud-skill-st_flamethrower_range_title = Miotacz ognia - zasięg +hud-skill-st_flamethrower_range = Zwiększa zasięg ognia o { $boost }%{ $SP } +hud-skill-st_energy_drain_title = Miotacz ognia - koszt +hud-skill-st_energy_drain = Zmniejsza koszt Energii zużywanej przez miotacz ognia o { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Miotacz ognia - obrażenia +hud-skill-st_flamethrower_damage = Zwiększa obrażenia o { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Eksplozja - rozmiar +hud-skill-st_explosion_radius = + Rozmiar ma znaczenie, szczególnie gdy walczysz z wieloma przeciwnikami, + zwiększa wielkość eksplozji o { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Regeneracja Wytrzymałości +hud-skill-st_energy_regen = Zwiększa regenerację Wytrzymałości o { $boost }%{ $SP } +hud-skill-st_fireball_title = Kula ognia +hud-skill-st_fireball = Walisz z różdżki wybuchającymi fajerbolami +hud-skill-st_damage_title = Obrażenia +hud-skill-st_damage = Zwiększa obrażenia o { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Prędkość strzały +hud-skill-bow_projectile_speed = Pozwala wypuszczać strzały szybsze i lecące dalej { $boost }%{ $SP } +hud-skill-bow_charged_title = Mocny Strzał +hud-skill-bow_charged = Naciągasz łuk mocniej niż zwykle. +hud-skill-bow_charged_damage_title = Mocny Strzał - obrażnia +hud-skill-bow_charged_damage = Zwiększa obrażenia o { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Mocny Strzał - odnawiana energia +hud-skill-bow_charged_energy_regen = Zwiększa odnawianą energię o { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Mocny Strzał - odrzut +hud-skill-bow_charged_knockback = Odrzuć przeciwników dalej o { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = Mocny Strzał - szybkość +hud-skill-bow_charged_speed = Zwiększa prędkość ładownia strzału o { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Mocny Strzał - poruszanie +hud-skill-bow_charged_move = Zwiększa jak szybko możesz się poruszać podczas ładowania strzału o { $boost }%{ $SP } +hud-skill-bow_repeater_title = Zwykły Strzał +hud-skill-bow_repeater = Nieskończony kołczan gratis, trzymać zdala od dzieci. Szybkość strzelania zwiększa się z czasem. +hud-skill-bow_repeater_damage_title = Zwykły Strzał - obrażenia +hud-skill-bow_repeater_damage = Zwiększa obrażenia o { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Zwykły Strzał - koszt +hud-skill-bow_repeater_cost = Zmniejsza koszt Wytrzymałości wielostrzału o { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Zwykły Strzał - szybkość +hud-skill-bow_repeater_speed = Zwiększa szybkość strzelania o { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Odblokowuje Wielostrzał +hud-skill-bow_shotgun_unlock = Pozwala strzelać kilkoma strzałami na raz. +hud-skill-bow_shotgun_damage_title = Wielostrzał - Obrażenia +hud-skill-bow_shotgun_damage = Zwiększa obrażenia wielostrzału o { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Koszt wielostrzału +hud-skill-bow_shotgun_cost = Zmniejsza koszt wielostrzału o { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Wielostrzał - Ilość Strzał +hud-skill-bow_shotgun_arrow_count = Zwiększa ilość strzał wystrzelonych na raz o { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Wielostrzał - Celność +hud-skill-bow_shotgun_spread = Zmniejsza rozrzut strzał o { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Tąpnięcie - zasięg +hud-skill-hmr_leap_radius = Zwiększa zasięg o { $boost } metr{ $SP } +hud-skill-hmr_leap_distance_title = Tąpnięcie - doskok +hud-skill-hmr_leap_distance = Zwiększa doskok o { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Tąpnięcie - koszt +hud-skill-hmr_leap_cost = Zmniejsza koszt tąpnięcia o { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Tąpnięcie - odrzut +hud-skill-hmr_leap_knockback = Odrzucenie przeciwników zwiększone o { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Tąpnięcie - obrażenia +hud-skill-hmr_leap_damage = Zwiększa obrażenia o { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Tąpnięcie +hud-skill-hmr_unlock_leap = Odblokowuje tąpnięcie{ $SP } +hud-skill-hmr_charged_melee_title = Miażdżenie +hud-skill-hmr_charged_melee = Ładowany atak młotem +hud-skill-hmr_charged_rate_title = Miażdżenie - ładowanie +hud-skill-hmr_charged_rate = Zwiększa prędkość ładowania o { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Miażdżenie - męczenie +hud-skill-hmr_charged_melee_nrg_drain = Zmniejsza prędkość męczenia miażdżeniem o { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Miażdżenie - obrażenia +hud-skill-hmr_charged_melee_damage = Zwiększa obrażenia miażdżenia o { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Miażdżenie - odrzut +hud-skill-hmr_charged_melee_knockback = Zwiększa odrzucenie przeciwników o { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Trafienie +hud-skill-hmr_single_strike = Pojedyncze, jedno, porządne +hud-skill-hmr_single_strike_regen_title = Regeneracja Energii +hud-skill-hmr_single_strike_regen = Zwiększa regenerację Energii za każde trafienie{ $SP } +hud-skill-hmr_single_strike_speed_title = Trafienie - szybkość +hud-skill-hmr_single_strike_speed = Zwiększa prędkość ataku za każde trafienie{ $SP } +hud-skill-hmr_single_strike_damage_title = Trafienie - obrażenia +hud-skill-hmr_single_strike_damage = Zwiększa obrażenia za każde trafienie{ $SP } +hud-skill-hmr_single_strike_knockback_title = Trafienie - odrzut +hud-skill-hmr_single_strike_knockback = Zwiększa odrzut o { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Potrójne cięcie +hud-skill-sw_trip_str = Trzy szybkie cięcia +hud-skill-sw_trip_str_combo_title = Potrójne cięcie - combo +hud-skill-sw_trip_str_combo = Odblokowuje skalowanie combo używając potrójnego cięcia{ $SP } +hud-skill-sw_trip_str_dmg_title = Potrójne cięcie - obrażenia +hud-skill-sw_trip_str_dmg = Zwiększa obrażenia od każdego kolejnego trafienia{ $SP } +hud-skill-sw_trip_str_sp_title = Potrójne cięcie - szybkość +hud-skill-sw_trip_str_sp = Zwiększa prędkość ataku od każdego kolejnego trafienia{ $SP } +hud-skill-sw_trip_str_reg_title = Potrójne cięcie - regeneracja +hud-skill-sw_trip_str_reg = Zwiększa regeneracje energii od każdego kolejnego trafienia{ $SP } +hud-skill-sw_dash_title = Szarża +hud-skill-sw_dash = Zrób z przeciwników szaszłyka +hud-skill-sw_dash_dmg_title = Szarża - obrażenia +hud-skill-sw_dash_dmg = Zwiększa podstawowe obrażenia szerży o { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Szarża - zmęczenie +hud-skill-sw_dash_drain = Zmniejsza koszt trwającej szarży o { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Szarża - koszt +hud-skill-sw_dash_cost = Zmniejsza koszt zaczęcia szarży o { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Szarża - szybkość +hud-skill-sw_dash_speed = Zwiększa prędkość poruszania podczas szarży o { $boost }%{ $SP } +hud-skill-sw_dash_scale_title = Szarża - skalowanie +hud-skill-sw_dash_scale = Zwiększa skalowanie obrażeń od szarży o { $boost }%{ $SP } +hud-skill-sw_spin_title = Wir +hud-skill-sw_spin = Odblokowuje wirowanie{ $SP } +hud-skill-sw_spin_dmg_title = Wir - obrażenia +hud-skill-sw_spin_dmg = Zwiększa obrażenia wiru o { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Wir - szybkość +hud-skill-sw_spin_spd = Zwiększa szybkość wirowania o { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Wir - koszt +hud-skill-sw_spin_cost = Zmniejsza koszt wirowania o { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Wir - obroty +hud-skill-sw_spin_spins = Zwiększa ilość obrotów{ $SP } +hud-skill-sw_interrupt_title = Markowany atak +hud-skill-sw_interrupt = Pozwala anulować atak innym atakiem{ $SP } +hud-skill-sw_dash_charge_through_title = Przebijająca szarża +hud-skill-sw_dash_charge_through = Nie przerywa szarży po pierwszym trafieniu{ $SP } +hud-skill-axe_double_strike_title = Podwójne trafienie +hud-skill-axe_double_strike = Wytnij tych nikczemników +hud-skill-axe_double_strike_combo_title = Podwójne trafienie - combo +hud-skill-axe_double_strike_combo = Odblokowuje skalowanie podwójnego trafienia{ $SP } +hud-skill-axe_double_strike_damage_title = Podwójne trafienie - obrażenia +hud-skill-axe_double_strike_damage = Zwiększa obrażenia od każdego kolejnego trafienia{ $SP } +hud-skill-axe_double_strike_speed_title = Podwójne trafienie - szybkość +hud-skill-axe_double_strike_speed = Zwiększa prędkość ataku od każdego kolejnego trafienia{ $SP } +hud-skill-axe_double_strike_regen_title = Podwójne trafienie - regeneracja +hud-skill-axe_double_strike_regen = Zwiększa regenerację energii od każdego kolejnego trafienia{ $SP } +hud-skill-axe_spin_title = Wir +hud-skill-axe_spin = You spin it right round ... +hud-skill-axe_infinite_axe_spin_title = Nieskończony wir +hud-skill-axe_infinite_axe_spin = Wiruj tak długo, aż masz na to energię{ $SP } +hud-skill-axe_spin_damage_title = Wir - obrażenia +hud-skill-axe_spin_damage = Zwiększa obrażenia każdego kolejnego obrotu o { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Helikopter +hud-skill-axe_spin_helicopter = Spadasz wolniej, gdy wirujesz{ $SP } +hud-skill-axe_spin_speed_title = Wir - szybkość +hud-skill-axe_spin_speed = Zwiększa szybkość obrotów o { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Wir - koszt +hud-skill-axe_spin_cost = Zmniejsza koszt wirowania o { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Doskok +hud-skill-axe_unlock_leap = Odblokowuje doskok z wirowaniem{ $SP } +hud-skill-axe_leap_damage_title = Doskok - obrażenia +hud-skill-axe_leap_damage = Zwiększa obrażenia doskoku o { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Doskok - odrzut +hud-skill-axe_leap_knockback = Zwiększa odrzucenie przeciwników o { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Doskok - koszt +hud-skill-axe_leap_cost = Zmniejsza koszt doskoku o { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Doskok - dystans +hud-skill-axe_leap_distance = Zwiększa dystans doskoku o { $boost }%{ $SP } +hud-skill-mining_title = Górnictwo +hud-skill-pick_strike_title = Wykorzystanie kilofa +hud-skill-pick_strike = Niszcz skały kilofem zby zdobywać rudy, kryształy i doświadczenie +hud-skill-pick_strike_speed_title = Szybkość uderzania kilofem +hud-skill-pick_strike_speed = Kop szybciej{ $SP } +hud-skill-pick_strike_oregain_title = Wydajność kopania rud +hud-skill-pick_strike_oregain = Szansa na zdobycie dodatkowej rudy ({ $boost }% per level){ $SP } +hud-skill-pick_strike_gemgain_title = Wydajność kopania kryształów +hud-skill-pick_strike_gemgain = Szansa na zdobycie dodadkowego kryształu ({ $boost }% per level){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/skills.ron b/assets/voxygen/i18n/pl_PL/hud/skills.ron deleted file mode 100644 index 59ac5dad13..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.rank_up": "Nowy punkt rozwoju", - "hud.skill.sp_available": "Masz {number} punkt(ów) rozwoju", - "hud.skill.not_unlocked": "Zablokowane", - "hud.skill.req_sp": "\n\nWymaga {number} punktów rozwoju", - // Skills - // General - "hud.skill.inc_health_title": "Zwiększ Zdrowie", - "hud.skill.inc_health": "Zwiększa Maksymalne Zdrowie o {boost}{SP}", - "hud.skill.inc_energy_title": "Zwiększ Wytrzymałość", - "hud.skill.inc_energy": "Zwiększ Maksymalną Wytrzymałość o {boost}{SP}", - "hud.skill.unlck_sword_title": "Odblokuj miecz", - "hud.skill.unlck_sword": "Odblokowuje umiejętności powiązane z mieczem{SP}", - "hud.skill.unlck_axe_title": "Odblokuj topór", - "hud.skill.unlck_axe": "Odblokowuje umiejętności powiązane z toporem{SP}", - "hud.skill.unlck_hammer_title": "Odblokuj młot", - "hud.skill.unlck_hammer": "Odblokowuje umiejętności powiązane z młotem{SP}", - "hud.skill.unlck_bow_title": "Odblokuj łuk", - "hud.skill.unlck_bow": "Odblokowuje umiejętności powiązane z łukiem{SP}", - "hud.skill.unlck_staff_title": "Odblokuj kostur", - "hud.skill.unlck_staff": "Odblokowuje umiejętności powiązane z kosturem{SP}", - "hud.skill.unlck_sceptre_title": "Odblokuj kostur druida", - "hud.skill.unlck_sceptre": "Odblokowuje umiejętności powiązane z kosturem druida{SP}", - "hud.skill.dodge_title": "Unik (przewrót)", - "hud.skill.dodge": "Umożliwia unikanie ataków przeciwników (dodaje klatki nieśmiertelności){SP}", - "hud.skill.roll_energy_title": "Przewrót - koszt", - "hud.skill.roll_energy": "Przewrót kosztuje {boost}% mniej wytrzymałości{SP}", - "hud.skill.roll_speed_title": "Przewrót - prędkość", - "hud.skill.roll_speed": "Przewrót jest {boost}% szybszy{SP}", - "hud.skill.roll_dur_title": "Przewrót - długość (czas)", - "hud.skill.roll_dur": "Przewrót trwa {boost}% dłużej{SP}", - "hud.skill.climbing_title": "Wspinaczka", - "hud.skill.climbing": "Wskakuj wyżej (?)", - "hud.skill.climbing_cost_title": "Wspinaczka - koszt", - "hud.skill.climbing_cost": "Wspinaczka zużywa {boost}% mniej wytrzymałości{SP}", - "hud.skill.climbing_speed_title": "Wspinaczka - prędkość", - "hud.skill.climbing_speed": "Wspinaj się {boost}% szybciej{SP}", - "hud.skill.swim_title": "Pływanie", - "hud.skill.swim": "Poruszanie się w mokrym środowisku", - "hud.skill.swim_speed_title": "Pływanie - prędkość", - "hud.skill.swim_speed": "Pływaj {boost}% szybciej{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Promień wysysający życie", - "hud.skill.sc_lifesteal": "Wysysaj życie z przeciwników", - "hud.skill.sc_lifesteal_damage_title": "Obrażenia", - "hud.skill.sc_lifesteal_damage": "Zadaj {boost}% więcej obrażeń{SP}", - "hud.skill.sc_lifesteal_range_title": "Zasięg", - "hud.skill.sc_lifesteal_range": "Promień dociera {boost}% dalej{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Kradzież zdrowia", - "hud.skill.sc_lifesteal_lifesteal": "Przekształć dodatkowe {boost}% obrażeń w zdrowie{SP}", - "hud.skill.sc_lifesteal_regen_title": "Regeneracja Wytrzymałości", - "hud.skill.sc_lifesteal_regen": "Odnów staminę o dodatkowe {boost}%{SP}", - "hud.skill.sc_heal_title": "Promień leczący", - "hud.skill.sc_heal": "Lecz sojuszników używając krwi wrogów", - "hud.skill.sc_heal_heal_title": "Leczenie", - "hud.skill.sc_heal_heal": "Zwiększa leczenie innych o {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Koszt Wytrzymałości", - "hud.skill.sc_heal_cost": "Leczenie innych kosztuje {boost}% mniej Wytrzymałości{SP}", - "hud.skill.sc_heal_duration_title": "Długość", - "hud.skill.sc_heal_duration": "Efekt aury leczącej trwa {boost}% dłużej{SP}", - "hud.skill.sc_heal_range_title": "Zasięg", - "hud.skill.sc_heal_range": "Promień dociera {boost}% dalej{SP}", - "hud.skill.sc_wardaura_unlock_title": "Sfera obronna", - "hud.skill.sc_wardaura_unlock": "Umożliwia nałożenie efektów ochronnych na pobliskich sojuszników{SP}", - "hud.skill.sc_wardaura_strength_title": "Siła ochrony", - "hud.skill.sc_wardaura_strength": "Siła ochrony jest zwiększona o {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Długość", - "hud.skill.sc_wardaura_duration": "Efekt ochrony trwa {boost}% dłużej{SP}", - "hud.skill.sc_wardaura_range_title": "Promień", - "hud.skill.sc_wardaura_range": "Sfera ochrony dociera {boost}% dalej{SP}", - "hud.skill.sc_wardaura_cost_title": "Koszt Wytrzymałości", - "hud.skill.sc_wardaura_cost": "Tworzenie sfery ochrony kosztuje {boost}% mniej energii{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Fala uderzeniowa - zasięg", - "hud.skill.st_shockwave_range" : "Zasięg odrzucenia zwiększony o {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Fala uderzeniowa - koszt", - "hud.skill.st_shockwave_cost" : "Zmniejsza koszt Energii fali uderzeniowej o {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Fala uderzeniowa - wybicie", - "hud.skill.st_shockwave_knockback" : "Potencjał odrzucenia zwiększony o {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Fala uderzeniowa - obrażenia", - "hud.skill.st_shockwave_damage" : "Zwiększa obrażenia zadane przez falę uderzeniową o {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Fala uderzeniowa", - "hud.skill.st_shockwave_unlock" : "Daje możliwość odrzucania przeciwników używając ognia{SP}", - "hud.skill.st_flamethrower_title" : "Miotacz ognia", - "hud.skill.st_flamethrower" : "Zamień się w beztłuszczową frytkownicę", - "hud.skill.st_flame_velocity_title" : "Miotacz ognia - prędkość", - "hud.skill.st_flame_velocity" : "Ogień rozprzestrzenia się o {boost}% szybciej{SP}", - "hud.skill.st_flamethrower_range_title" : "Miotacz ognia - zasięg", - "hud.skill.st_flamethrower_range" : "Zwiększa zasięg ognia o {boost}%{SP}", - "hud.skill.st_energy_drain_title" : "Miotacz ognia - koszt", - "hud.skill.st_energy_drain" : "Zmniejsza koszt Energii zużywanej przez miotacz ognia o {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Miotacz ognia - obrażenia", - "hud.skill.st_flamethrower_damage" : "Zwiększa obrażenia o {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Eksplozja - rozmiar", - "hud.skill.st_explosion_radius" : "Rozmiar ma znaczenie, szczególnie gdy walczysz z wieloma przeciwnikami,\nzwiększa wielkość eksplozji o {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Regeneracja Wytrzymałości", - "hud.skill.st_energy_regen" : "Zwiększa regenerację Wytrzymałości o {boost}%{SP}", - "hud.skill.st_fireball_title" : "Kula ognia", - "hud.skill.st_fireball" : "Walisz z różdżki wybuchającymi fajerbolami", - "hud.skill.st_damage_title" : "Obrażenia", - "hud.skill.st_damage" : "Zwiększa obrażenia o {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Prędkość strzały", - "hud.skill.bow_projectile_speed" : "Pozwala wypuszczać strzały szybsze i lecące dalej {boost}%{SP}", - "hud.skill.bow_charged_title" : "Mocny Strzał", - "hud.skill.bow_charged" : "Naciągasz łuk mocniej niż zwykle.", - "hud.skill.bow_charged_damage_title" : "Mocny Strzał - obrażnia", - "hud.skill.bow_charged_damage" : "Zwiększa obrażenia o {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Mocny Strzał - odnawiana energia", - "hud.skill.bow_charged_energy_regen" : "Zwiększa odnawianą energię o {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Mocny Strzał - odrzut", - "hud.skill.bow_charged_knockback" : "Odrzuć przeciwników dalej o {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "Mocny Strzał - szybkość", - "hud.skill.bow_charged_speed" : "Zwiększa prędkość ładownia strzału o {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Mocny Strzał - poruszanie", - "hud.skill.bow_charged_move" : "Zwiększa jak szybko możesz się poruszać podczas ładowania strzału o {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Zwykły Strzał", - "hud.skill.bow_repeater" : "Nieskończony kołczan gratis, trzymać zdala od dzieci. Szybkość strzelania zwiększa się z czasem.", - "hud.skill.bow_repeater_damage_title" : "Zwykły Strzał - obrażenia", - "hud.skill.bow_repeater_damage" : "Zwiększa obrażenia o {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Zwykły Strzał - koszt", - "hud.skill.bow_repeater_cost" : "Zmniejsza koszt Wytrzymałości wielostrzału o {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Zwykły Strzał - szybkość", - "hud.skill.bow_repeater_speed" : "Zwiększa szybkość strzelania o {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Odblokowuje Wielostrzał", - "hud.skill.bow_shotgun_unlock" : "Pozwala strzelać kilkoma strzałami na raz.", - "hud.skill.bow_shotgun_damage_title" : "Wielostrzał - Obrażenia", - "hud.skill.bow_shotgun_damage" : "Zwiększa obrażenia wielostrzału o {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Koszt wielostrzału", - "hud.skill.bow_shotgun_cost" : "Zmniejsza koszt wielostrzału o {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Wielostrzał - Ilość Strzał", - "hud.skill.bow_shotgun_arrow_count" : "Zwiększa ilość strzał wystrzelonych na raz o {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Wielostrzał - Celność", - "hud.skill.bow_shotgun_spread" : "Zmniejsza rozrzut strzał o {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Tąpnięcie - zasięg", - "hud.skill.hmr_leap_radius" : "Zwiększa zasięg o {boost} metr{SP}", - "hud.skill.hmr_leap_distance_title" : "Tąpnięcie - doskok", - "hud.skill.hmr_leap_distance" : "Zwiększa doskok o {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Tąpnięcie - koszt", - "hud.skill.hmr_leap_cost" : "Zmniejsza koszt tąpnięcia o {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Tąpnięcie - odrzut", - "hud.skill.hmr_leap_knockback" : "Odrzucenie przeciwników zwiększone o {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Tąpnięcie - obrażenia", - "hud.skill.hmr_leap_damage" : "Zwiększa obrażenia o {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Tąpnięcie", - "hud.skill.hmr_unlock_leap" : "Odblokowuje tąpnięcie{SP}", - "hud.skill.hmr_charged_melee_title" : "Miażdżenie", - "hud.skill.hmr_charged_melee" : "Ładowany atak młotem", - "hud.skill.hmr_charged_rate_title" : "Miażdżenie - ładowanie", - "hud.skill.hmr_charged_rate" : "Zwiększa prędkość ładowania o {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Miażdżenie - męczenie", - "hud.skill.hmr_charged_melee_nrg_drain" : "Zmniejsza prędkość męczenia miażdżeniem o {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Miażdżenie - obrażenia", - "hud.skill.hmr_charged_melee_damage" : "Zwiększa obrażenia miażdżenia o {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Miażdżenie - odrzut", - "hud.skill.hmr_charged_melee_knockback" : "Zwiększa odrzucenie przeciwników o {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Trafienie", - "hud.skill.hmr_single_strike" : "Pojedyncze, jedno, porządne", - "hud.skill.hmr_single_strike_regen_title" : "Regeneracja Energii", - "hud.skill.hmr_single_strike_regen" : "Zwiększa regenerację Energii za każde trafienie{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Trafienie - szybkość", - "hud.skill.hmr_single_strike_speed" : "Zwiększa prędkość ataku za każde trafienie{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Trafienie - obrażenia", - "hud.skill.hmr_single_strike_damage" : "Zwiększa obrażenia za każde trafienie{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Trafienie - odrzut", - "hud.skill.hmr_single_strike_knockback" : "Zwiększa odrzut o {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Potrójne cięcie", - "hud.skill.sw_trip_str": "Trzy szybkie cięcia", - "hud.skill.sw_trip_str_combo_title": "Potrójne cięcie - combo", - "hud.skill.sw_trip_str_combo": "Odblokowuje skalowanie combo używając potrójnego cięcia{SP}", - "hud.skill.sw_trip_str_dmg_title": "Potrójne cięcie - obrażenia", - "hud.skill.sw_trip_str_dmg": "Zwiększa obrażenia od każdego kolejnego trafienia{SP}", - "hud.skill.sw_trip_str_sp_title": "Potrójne cięcie - szybkość", - "hud.skill.sw_trip_str_sp": "Zwiększa prędkość ataku od każdego kolejnego trafienia{SP}", - "hud.skill.sw_trip_str_reg_title": "Potrójne cięcie - regeneracja", - "hud.skill.sw_trip_str_reg": "Zwiększa regeneracje energii od każdego kolejnego trafienia{SP}", - "hud.skill.sw_dash_title": "Szarża", - "hud.skill.sw_dash": "Zrób z przeciwników szaszłyka", - "hud.skill.sw_dash_dmg_title": "Szarża - obrażenia", - "hud.skill.sw_dash_dmg": "Zwiększa podstawowe obrażenia szerży o {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Szarża - zmęczenie", - "hud.skill.sw_dash_drain": "Zmniejsza koszt trwającej szarży o {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Szarża - koszt", - "hud.skill.sw_dash_cost": "Zmniejsza koszt zaczęcia szarży o {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Szarża - szybkość", - "hud.skill.sw_dash_speed": "Zwiększa prędkość poruszania podczas szarży o {boost}%{SP}", - "hud.skill.sw_dash_scale_title": "Szarża - skalowanie", - "hud.skill.sw_dash_scale": "Zwiększa skalowanie obrażeń od szarży o {boost}%{SP}", - "hud.skill.sw_spin_title": "Wir", - "hud.skill.sw_spin": "Odblokowuje wirowanie{SP}", - "hud.skill.sw_spin_dmg_title": "Wir - obrażenia", - "hud.skill.sw_spin_dmg": "Zwiększa obrażenia wiru o {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Wir - szybkość", - "hud.skill.sw_spin_spd": "Zwiększa szybkość wirowania o {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Wir - koszt", - "hud.skill.sw_spin_cost": "Zmniejsza koszt wirowania o {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Wir - obroty", - "hud.skill.sw_spin_spins": "Zwiększa ilość obrotów{SP}", - "hud.skill.sw_interrupt_title": "Markowany atak", - "hud.skill.sw_interrupt": "Pozwala anulować atak innym atakiem{SP}", - "hud.skill.sw_dash_charge_through_title": "Przebijająca szarża", - "hud.skill.sw_dash_charge_through": "Nie przerywa szarży po pierwszym trafieniu{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Podwójne trafienie", - "hud.skill.axe_double_strike": "Wytnij tych nikczemników", - "hud.skill.axe_double_strike_combo_title": "Podwójne trafienie - combo", - "hud.skill.axe_double_strike_combo": "Odblokowuje skalowanie podwójnego trafienia{SP}", - "hud.skill.axe_double_strike_damage_title": "Podwójne trafienie - obrażenia", - "hud.skill.axe_double_strike_damage": "Zwiększa obrażenia od każdego kolejnego trafienia{SP}", - "hud.skill.axe_double_strike_speed_title": "Podwójne trafienie - szybkość", - "hud.skill.axe_double_strike_speed": "Zwiększa prędkość ataku od każdego kolejnego trafienia{SP}", - "hud.skill.axe_double_strike_regen_title": "Podwójne trafienie - regeneracja", - "hud.skill.axe_double_strike_regen": "Zwiększa regenerację energii od każdego kolejnego trafienia{SP}", - "hud.skill.axe_spin_title": "Wir", - "hud.skill.axe_spin": "You spin it right round ...", - "hud.skill.axe_infinite_axe_spin_title": "Nieskończony wir", - "hud.skill.axe_infinite_axe_spin": "Wiruj tak długo, aż masz na to energię{SP}", - "hud.skill.axe_spin_damage_title": "Wir - obrażenia", - "hud.skill.axe_spin_damage": "Zwiększa obrażenia każdego kolejnego obrotu o {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Helikopter", - "hud.skill.axe_spin_helicopter": "Spadasz wolniej, gdy wirujesz{SP}", - "hud.skill.axe_spin_speed_title": "Wir - szybkość", - "hud.skill.axe_spin_speed": "Zwiększa szybkość obrotów o {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Wir - koszt", - "hud.skill.axe_spin_cost": "Zmniejsza koszt wirowania o {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Doskok", - "hud.skill.axe_unlock_leap": "Odblokowuje doskok z wirowaniem{SP}", - "hud.skill.axe_leap_damage_title": "Doskok - obrażenia", - "hud.skill.axe_leap_damage": "Zwiększa obrażenia doskoku o {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Doskok - odrzut", - "hud.skill.axe_leap_knockback": "Zwiększa odrzucenie przeciwników o {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Doskok - koszt", - "hud.skill.axe_leap_cost": "Zmniejsza koszt doskoku o {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Doskok - dystans", - "hud.skill.axe_leap_distance": "Zwiększa dystans doskoku o {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Górnictwo", - "hud.skill.pick_strike_title": "Wykorzystanie kilofa", - "hud.skill.pick_strike": "Niszcz skały kilofem zby zdobywać rudy, kryształy i doświadczenie", - "hud.skill.pick_strike_speed_title": "Szybkość uderzania kilofem", - "hud.skill.pick_strike_speed": "Kop szybciej{SP}", - "hud.skill.pick_strike_oregain_title": "Wydajność kopania rud", - "hud.skill.pick_strike_oregain": "Szansa na zdobycie dodatkowej rudy ({boost}% per level){SP}", - "hud.skill.pick_strike_gemgain_title": "Wydajność kopania kryształów", - "hud.skill.pick_strike_gemgain": "Szansa na zdobycie dodadkowego kryształu ({boost}% per level){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/hud/social.ftl b/assets/voxygen/i18n/pl_PL/hud/social.ftl new file mode 100644 index 0000000000..53f71eb580 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Inni gracze +hud-social-online = Zalogowani: +hud-social-friends = Przyjaciele +hud-social-not_yet_available = Jeszcze niedostępne +hud-social-faction = Frakcja +hud-social-play_online_fmt = { $nb_player } gracz(y) online +hud-social-name = Imię +hud-social-level = Poziom +hud-social-zone = Strefa +hud-social-account = Konto \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/social.ron b/assets/voxygen/i18n/pl_PL/hud/social.ron deleted file mode 100644 index dc7fd626eb..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/social.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.social": "Inni gracze", - "hud.social.online": "Zalogowani:", - "hud.social.friends": "Przyjaciele", - "hud.social.not_yet_available": "Jeszcze niedostępne", - "hud.social.faction": "Frakcja", - "hud.social.play_online_fmt": "{nb_player} gracz(y) online", - "hud.social.name": "Imię", - "hud.social.level": "Poziom", - "hud.social.zone": "Strefa", - "hud.social.account": "Konto", - }, - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/pl_PL/hud/trade.ftl b/assets/voxygen/i18n/pl_PL/hud/trade.ftl new file mode 100644 index 0000000000..3eba75bf1d --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Okno handlu +hud-trade-phase1_description = + Przeciągnij przedmioty, które chcesz wymienić + na swoją część okna wymiany. +hud-trade-phase2_description = + Wymiana została zatrzymana by dać Ci + czas by sprawdzić czy wszystko się zgadza. +hud-trade-phase3_description = Przetwarzanie wymiany. +hud-trade-persons_offer = Oferta { $playername } +hud-trade-has_accepted = + { $playername } + zaakceptowano +hud-trade-accept = Akceptuj +hud-trade-decline = Odrzuć +hud-trade-invite_sent = Zaproszenie do wymiany wysłane do { $playername }. +hud-trade-result-completed = Wymiana zakończona pomyślnie. +hud-trade-result-declined = Wymiana została zerwana. +hud-trade-result-nospace = Brak miejsca by dokonać wymiany. +hud-trade-buy_price = Cena kupna +hud-trade-sell_price = Cena sprzedaży +hud-trade-coin = monet(y) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Twoja oferta +hud-trade-their_offer = Jego oferta +hud-trade-amount_input = Wybierz przedmiot \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/hud/trade.ron b/assets/voxygen/i18n/pl_PL/hud/trade.ron deleted file mode 100644 index 42f515fb80..0000000000 --- a/assets/voxygen/i18n/pl_PL/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - "hud.trade.trade_window": "Okno handlu", - "hud.trade.phase1_description": "Przeciągnij przedmioty, które chcesz wymienić\n na swoją część okna wymiany.", - "hud.trade.phase2_description": "Wymiana została zatrzymana by dać Ci\n czas by sprawdzić czy wszystko się zgadza.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Przetwarzanie wymiany.", - "hud.trade.persons_offer": "Oferta {playername}", - "hud.trade.has_accepted": "{playername}\nzaakceptowano", - "hud.trade.accept": "Akceptuj", - "hud.trade.decline": "Odrzuć", - "hud.trade.invite_sent": "Zaproszenie do wymiany wysłane do {playername}.", - "hud.trade.result.completed": "Wymiana zakończona pomyślnie.", - "hud.trade.result.declined": "Wymiana została zerwana.", - "hud.trade.result.nospace": "Brak miejsca by dokonać wymiany.", - "hud.trade.buy_price": "Cena kupna", - "hud.trade.sell_price": "Cena sprzedaży", - "hud.trade.coin": "monet(y)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Twoja oferta", - "hud.trade.their_offer": "Jego oferta", - "hud.trade.amount_input": "Wybierz przedmiot", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pl_PL/main.ftl b/assets/voxygen/i18n/pl_PL/main.ftl new file mode 100644 index 0000000000..6c1047184a --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/main.ftl @@ -0,0 +1,95 @@ +main-username = Nazwa użytkownika +main-server = Serwer +main-password = Hasło +main-connecting = Łączenie +main-creating_world = Tworzenie świata +main-tip = Porada: +main-unbound_key_tip = nieprzypisany +main-notice = + Witaj w wersji alfa Veloren! + + Zanim zanurzysz się w tym świecie, prosimy pamiętać o kilku rzeczach: + + - Jest to bardzo wczesna alfa. Spodziewaj się błędów, bardzo niedokończonej rozgrywki, niedokończonych mechanik i brakujących funkcji. + + - Jeśli chcesz podzielić się konstruktywną krytyką lub zgłosić błędy, możesz skontakować się z nami na Reddicie, Gitlabie lub Discordzie. + + - Veloren jest objęte licencją typu open-source 'GNU GPLv3'. + Oznacza to że gra jest darmowa, oraz że możesz ją modyfikować i udostępniać na zasadach określonych w licencji (zmodyfikowane wersje muszą również używać licencji GNU GPLv3). + + - Veloren jest projektem non-profit, w całości tworzonym przez wolontariuszy w wolnym czasie. + Jeśli polubisz Veloren, zapraszamy cię do dołączenia do naszego zespołu! Nowi programiści, artyści, tłumacze i inni są zawsze mile widziani! + + Dziękujemy za przeczytanie tej notki i życzymy miłej gry! + + ~ Zespół Twórców Veloren +main-login_process = + Informacje o procesie logowania: + + Aby grać na większości serwerów, + musisz stworzyć darmowe konto. + + Możesz to zrobić na stronie: + + https://veloren.net/account/. +main-login-server_not_found = Serwer nie został znaleziony +main-login-authentication_error = Błąd autoryzacji na serwerze +main-login-internal_error = Wewnętrzny błąd klienta (najprawdopodobniej postać gracza została usunięta) +main-login-failed_auth_server_url_invalid = Błąd w łączeniu się z serwerem kont +main-login-insecure_auth_scheme = Schemat autoryzacji HTTP NIE JEST wspierany. Jest niezabezpieczony! W celach programistycznych, jest dozwolony dla adresu 'localhost' oraz wersji deweloperskich. +main-login-server_full = Serwer jest pełny +main-login-untrusted_auth_server = Serwer autoryzacji nie jest zaufany +main-login-outdated_client_or_server = Serwer odrzucił połączenie: prawdopodobnie masz inną wersję gry niż serwer - spróbuj zaaktualizować grę. +main-login-timeout = Przekroczenie czasu oczekiwania: serwer nie odpowiedział na czas (Przeciążenie lub problemy z połączeniem). +main-login-server_shut_down = Serwer został wyłączony +main-login-network_error = Błąd sieci +main-login-network_wrong_version = Serwer jest na innej wersji gry niż Ty, sprawdź czy są dostępne aktualizacje. +main-login-failed_sending_request = Błąd z wysysłaniem próby logowania +main-login-invalid_character = Wybrano nieprawidłową postać +main-login-client_crashed = Klient się wysypał +main-login-not_on_whitelist = Musisz poprosić o dopisanie na listę dozwolonych graczy +main-login-banned = Konto zostało zbanowane z powodu: +main-login-kicked = Sesja została zamknięta z powodu: +main-login-select_language = Wybierz język +main-login-client_version = Wersja klienta +main-login-server_version = Wersja serwera +main-login-client_init_failed = Błąd inicjalizacji klienta: { $init_fail_reason } +main-login-username_bad_characters = Nazwa użytkownika zawiera nieprawidłowe znaki! (Dozwolone są tylko: znaki alfanumeryczne, '_' i '-') +main-login-username_too_long = Nazwa użytkownika jest zbyt długa! Maksymalna długość: { $max_len } +main-servers-select_server = Wybierz serwer +main-servers-singleplayer_error = Błąd połączenia z serwerem wewnętrznym: { $sp_error } +main-servers-network_error = Błąd sieci: { $raw_error } +main-servers-participant_error = Uczestnik rozłączony/błąd protokołu: { $raw_error } +main-servers-stream_error = Błąd kompresji/połączenia/(de)serializacji klienta: { $raw_error } +main-servers-database_error = Błąd bazy danych serwera: { $raw_error } +main-servers-persistence_error = Błąd systemu przechowywania danych serwera (Prawdopodobnie związany z zasobami lub danymi postaci): { $raw_error } +main-servers-other_error = Ogólny błąd serwera: { $raw_error } +main-credits = Podziękowania +main-credits-created_by = utworzone przez +main-credits-music = Muzyka +main-credits-fonts = Czcionki +main-credits-other_art = Inna Sztuka +main-credits-contributors = Współtwórcy +loading-tips = + .a0 = Naciśnij '{ $gameinput-togglelantern }' by zapalić latarnię. + .a1 = Naciśnij '{ $gameinput-help }' by zobaczyć podstawową klawiszologię. + .a2 = Wpisz /say lub /s by rozmawiać tylko z pobliskimi graczami. + .a3 = Wpisz /region lub /r by ograniczyć zasięg wiadomości do kilkuset bloków od Ciebie. + .a4 = Administratorzy mogą używać komendy /build by wejść w tryb budowania. + .a5 = Możesz użyć /group lub /g by rozmawiać z graczami w grupie. + .a6 = Aby wysłać wiadomość prywatną, użyj /tell po czym dodaj nazwę docelowego gracza i wiadomość. + .a7 = Rozglądaj się za jedzeniem, skrzyniami oraz skarbami - są one rozrzucone po całym świecie! + .a8 = Ekwipunek zapełniony jedzeniem? Ugotuj z tego lepsze jedzenie! + .a9 = Zastanawiasz się nad kolejnym wypadem? Spróbuj któryś z wielu lochów na mapie! + .a10 = Nie zapomnij o dostosowaniu ustawień graficznych. Wciśnij '{ $gameinput-settings }' by otworzyć ustawienia. + .a11 = Gra jest lepsza z innymi! Wciśnij '{ $gameinput-social }' by sprawdzić kto jest zalogowany. + .a12 = Użyj '{ $gameinput-dance }' by zatańczyć :) + .a13 = Użyj '{ $gameinput-glide }' by wyciągnąć lotnię! Spokojnie, nie jest lepiona woskiem. + .a14 = Veloren dalej jest w fazie Pre-Alpha. Staramy się ulepszać go dzień w dzień! + .a15 = Jeśli chcesz pomóc w rozwijaniu projektu, albo porozmawiać z nami - wpadnij na naszego Discorda [EN] + .a16 = Możesz przełączać typ paska zdrowia w opcjach. + .a17 = Usiądź obok ogniska (używając '{ $gameinput-sit }') by powoli wyleczyć się z obrażeń. + .a18 = Potrzebujesz więcej slotów w ekwipunku, albo nowego uzbrojenia? Wciśnij '{ $gameinput-crafting }' aby otworzyć menu tworzenia! + .a19 = Wciśnij '{ $gameinput-roll }' aby się przeturlać. Turlanie może zostać użyte do szybszego poruszania się lub unikania wrogich ataków. + .a20 = Zastanawiasz się do czego służy dany przedmiot? Wyszukaj 'input:' w polu wytwarzania aby zobaczyć w jakich recepturach jest on wykorzystywany. + .a21 = Znalazłeś coś fajnego? Zrób temu zdjęcie wciskając '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/main.ron b/assets/voxygen/i18n/pl_PL/main.ron deleted file mode 100644 index ce59f4e2ef..0000000000 --- a/assets/voxygen/i18n/pl_PL/main.ron +++ /dev/null @@ -1,116 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -( - string_map: { - /// Start Main screen section - "main.username": "Nazwa użytkownika", - "main.server": "Serwer", - "main.password": "Hasło", - "main.connecting": "Łączenie", - "main.creating_world": "Tworzenie świata", - "main.tip": "Porada:", - "main.unbound_key_tip": "nieprzypisany", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Witaj w wersji alfa Veloren! - -Zanim zanurzysz się w tym świecie, prosimy pamiętać o kilku rzeczach: - -- Jest to bardzo wczesna alfa. Spodziewaj się błędów, bardzo niedokończonej rozgrywki, niedokończonych mechanik i brakujących funkcji. - -- Jeśli chcesz podzielić się konstruktywną krytyką lub zgłosić błędy, możesz skontakować się z nami na Reddicie, Gitlabie lub Discordzie. - -- Veloren jest objęte licencją typu open-source 'GNU GPLv3'. -Oznacza to że gra jest darmowa, oraz że możesz ją modyfikować i udostępniać na zasadach określonych w licencji (zmodyfikowane wersje muszą również używać licencji GNU GPLv3). - -- Veloren jest projektem non-profit, w całości tworzonym przez wolontariuszy w wolnym czasie. -Jeśli polubisz Veloren, zapraszamy cię do dołączenia do naszego zespołu! Nowi programiści, artyści, tłumacze i inni są zawsze mile widziani! - -Dziękujemy za przeczytanie tej notki i życzymy miłej gry! - -~ Zespół Twórców Veloren"#, - - // Login process description - "main.login_process": r#"Informacje o procesie logowania: - -Aby grać na większości serwerów, -musisz stworzyć darmowe konto. - -Możesz to zrobić na stronie: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Serwer nie został znaleziony", - "main.login.authentication_error": "Błąd autoryzacji na serwerze", - "main.login.internal_error": "Wewnętrzny błąd klienta (najprawdopodobniej postać gracza została usunięta)", - "main.login.failed_auth_server_url_invalid": "Błąd w łączeniu się z serwerem kont", - "main.login.insecure_auth_scheme": "Schemat autoryzacji HTTP NIE JEST wspierany. Jest niezabezpieczony! W celach programistycznych, jest dozwolony dla adresu 'localhost' oraz wersji deweloperskich.", - "main.login.server_full": "Serwer jest pełny", - "main.login.untrusted_auth_server": "Serwer autoryzacji nie jest zaufany", - "main.login.outdated_client_or_server": "Serwer odrzucił połączenie: prawdopodobnie masz inną wersję gry niż serwer - spróbuj zaaktualizować grę.", - "main.login.timeout": "Przekroczenie czasu oczekiwania: serwer nie odpowiedział na czas (Przeciążenie lub problemy z połączeniem).", - "main.login.server_shut_down": "Serwer został wyłączony", - "main.login.network_error": "Błąd sieci", - "main.login.network_wrong_version": "Serwer jest na innej wersji gry niż Ty, sprawdź czy są dostępne aktualizacje.", - "main.login.failed_sending_request": "Błąd z wysysłaniem próby logowania", - "main.login.invalid_character": "Wybrano nieprawidłową postać", - "main.login.client_crashed": "Klient się wysypał", - "main.login.not_on_whitelist": "Musisz poprosić o dopisanie na listę dozwolonych graczy", - "main.login.banned": "Konto zostało zbanowane z powodu:", - "main.login.kicked": "Sesja została zamknięta z powodu:", - "main.login.select_language": "Wybierz język", - "main.login.client_version": "Wersja klienta", - "main.login.server_version": "Wersja serwera", - "main.login.client_init_failed": "Błąd inicjalizacji klienta: {init_fail_reason}", - "main.login.username_bad_characters": "Nazwa użytkownika zawiera nieprawidłowe znaki! (Dozwolone są tylko: znaki alfanumeryczne, '_' i '-')", - "main.login.username_too_long": "Nazwa użytkownika jest zbyt długa! Maksymalna długość: {max_len}", - "main.servers.select_server": "Wybierz serwer", - "main.servers.singleplayer_error": "Błąd połączenia z serwerem wewnętrznym: {sp_error}", - "main.servers.network_error": "Błąd sieci: {raw_error}", - "main.servers.participant_error": "Uczestnik rozłączony/błąd protokołu: {raw_error}", - "main.servers.stream_error": "Błąd kompresji/połączenia/(de)serializacji klienta: {raw_error}", - "main.servers.database_error": "Błąd bazy danych serwera: {raw_error}", - "main.servers.persistence_error": "Błąd systemu przechowywania danych serwera (Prawdopodobnie związany z zasobami lub danymi postaci): {raw_error}", - "main.servers.other_error": "Ogólny błąd serwera: {raw_error}", - - // Credits screen - "main.credits": "Podziękowania", - "main.credits.created_by": "utworzone przez", - "main.credits.music": "Muzyka", - "main.credits.fonts": "Czcionki", - "main.credits.other_art": "Inna Sztuka", - "main.credits.contributors": "Współtwórcy", - - /// End Main screen section - }, - - - // TODO: Check this whole thing - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "Naciśnij '{gameinput.togglelantern}' by zapalić latarnię.", - "Naciśnij '{gameinput.help}' by zobaczyć podstawową klawiszologię.", - "Wpisz /say lub /s by rozmawiać tylko z pobliskimi graczami.", - "Wpisz /region lub /r by ograniczyć zasięg wiadomości do kilkuset bloków od Ciebie.", - "Administratorzy mogą używać komendy /build by wejść w tryb budowania.", - "Możesz użyć /group lub /g by rozmawiać z graczami w grupie.", - "Aby wysłać wiadomość prywatną, użyj /tell po czym dodaj nazwę docelowego gracza i wiadomość.", - "Rozglądaj się za jedzeniem, skrzyniami oraz skarbami - są one rozrzucone po całym świecie!", - "Ekwipunek zapełniony jedzeniem? Ugotuj z tego lepsze jedzenie!", - "Zastanawiasz się nad kolejnym wypadem? Spróbuj któryś z wielu lochów na mapie!", - "Nie zapomnij o dostosowaniu ustawień graficznych. Wciśnij '{gameinput.settings}' by otworzyć ustawienia.", - "Gra jest lepsza z innymi! Wciśnij '{gameinput.social}' by sprawdzić kto jest zalogowany.", - "Użyj '{gameinput.dance}' by zatańczyć :)", - "Użyj '{gameinput.glide}' by wyciągnąć lotnię! Spokojnie, nie jest lepiona woskiem.", - "Veloren dalej jest w fazie Pre-Alpha. Staramy się ulepszać go dzień w dzień!", - "Jeśli chcesz pomóc w rozwijaniu projektu, albo porozmawiać z nami - wpadnij na naszego Discorda [EN]", - "Możesz przełączać typ paska zdrowia w opcjach.", - "Usiądź obok ogniska (używając '{gameinput.sit}') by powoli wyleczyć się z obrażeń.", - "Potrzebujesz więcej slotów w ekwipunku, albo nowego uzbrojenia? Wciśnij '{gameinput.crafting}' aby otworzyć menu tworzenia!", - "Wciśnij '{gameinput.roll}' aby się przeturlać. Turlanie może zostać użyte do szybszego poruszania się lub unikania wrogich ataków.", - "Zastanawiasz się do czego służy dany przedmiot? Wyszukaj 'input:' w polu wytwarzania aby zobaczyć w jakich recepturach jest on wykorzystywany.", - "Znalazłeś coś fajnego? Zrób temu zdjęcie wciskając '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/pl_PL/npc.ftl b/assets/voxygen/i18n/pl_PL/npc.ftl new file mode 100644 index 0000000000..234f9a93b0 --- /dev/null +++ b/assets/voxygen/i18n/pl_PL/npc.ftl @@ -0,0 +1,154 @@ +npc-speech-villager = + .a0 = Co za piękny dzień! + .a1 = Jak się masz? + .a2 = Udanego poranka! + .a3 = ... + .a4 = Co myślisz o pogodzie? + .a5 = Boję się na samą myśl o lochach. Mam nadzieję, że ktoś je wyczyści. + .a6 = Chciałbym zapuścić się do jaskinii, gdy stanę się silniejszy. + .a7 = Widziałeś mojego kota? + .a8 = Słyszałeś kiedyś o zażartych rekinach ziemnych? Słyszałem że żyją na pustyni! + .a9 = Mówi się, że cenne klejnoty można znaleźć w jaskiniach. + .a10 = Fascynuje mnie ser... + .a11 = Chciałbyś wpaść? Właśnie szykujemy ser! + .a12 = Mówią, że grzyby są zdrowe... Nigdy nie miałem okazji ich spróbować. + .a13 = Nie zapomnij o krakersach! + .a14 = Uwielbiam krasnoludzki ser. Chciałbym umieć go zrobić + .a15 = Ciekawe co jest za górami... + .a16 = Marzę by zrobić kiedyś swoją lotnię. + .a17 = Chcesz zobaczyć mój ogród? Dobra, może innym razem... + .a18 = Cudowny dzień na przechadzkę po lesie. + .a19 = Być albo nie być, oto jest pytanie... Myślę, że będę farmerem. + .a20 = Czy też uważasz, że nasze miasteczko jest najlepsze? + .a21 = Wiesz może dlaczego Świecące Resztki (Glowing Remains) świecą? + .a22 = Myślę, że czas na drugie śniadanie! + .a23 = Złapałeś kiedyś ważkę? + .a24 = Nie mogę zrozumieć skąd przychodzą te Sauroki (Sauroks). + .a25 = Chciałbym by ktoś przeganiał wilki. + .a26 = Miałem cudowny sen ostatniej nocy. Ciekawe co oznaczał? + .a27 = Zostawiłem trochę sera z moim bratem. Teraz nie wiem czy ser dalej istnieje czy nie. Nazywam to serem Schrödingera. + .a28 = Zostawiłem trochę sera z moją siostrą. Teraz nie wiem czy ser dalej istnieje czy nie. Nazywam to serem Schrödingera. + .a29 = Ktoś powinien coś zrobić z tymi kultystami. + .a30 = Fajnie by było jakby zaczęło padać. + .a31 = Kocham miód! Ale pszczoły już nie bardzo. + .a32 = Chciałbym zwiedzić kiedyś świat! +npc-speech-villager_decline_trade = + .a0 = Wybacz, nie mam niczego do wymiany. + .a1 = Handel? Sugerujesz, że mam coś co Cię zainteresuje? + .a2 = Mój dom nie jest na sprzedaż! +npc-speech-merchant_advertisement = + .a0 = Pokazać Ci swoje towary? + .a1 = Masz ochotę na mały handelek? + .a2 = Mam wiele produktów, chcesz rzucić okiem? +npc-speech-merchant_busy = + .a0 = Zaczekaj na swoją kolej. + .a1 = Proszę czekać, nie rozdwoję się. + .a2 = Nie widzisz kolejki? + .a3 = Jeszcze chwila, już kończę... + .a4 = Nie wpychać się do kolejki. + .a5 = Jestem zajęty, wpadnij później. +npc-speech-merchant_trade_successful = + .a0 = Dziękuję. Wpadnij ponownie! + .a1 = Interesy z Tobą to czysta przyjemność! +npc-speech-merchant_trade_declined = + .a0 = Może innym razem, trzymaj się! + .a1 = Ehh, wpadnij kiedy indziej! +npc-speech-villager_cultist_alarm = + .a0 = Uwaga! Kultyści w pobliżu! + .a1 = Do broni! Kultyści atakują! + .a2 = Jak mogli zaatakować nas?! + .a3 = Śmierć kultystom! + .a4 = Kultyści nie są tutaj tolerowani! + .a5 = Morderca! + .a6 = Posmakuj mojego ostrza brudny kultysto! + .a7 = Nic nie zmaże krwi z twoich rąk kultysto! + .a8 = W dupę jeża! Kultysta! + .a9 = Zbrodniarz! + .a10 = Ten kultysta jest mój! + .a11 = Przygotuj się na spotkanie ze stwórcą kultysto! + .a12 = Kultysta! Brać go! + .a13 = Giń kultysto! + .a14 = Za wszystko co zrobiłeś! + .a15 = Nie jesteś tutaj mile widziany. Won! + .a16 = Powinieneś zostać pod ziemią! +npc-speech-villager_under_attack = + .a0 = Pomocy, jestem atakowany! + .a1 = Pomocy! Jestem atakowany! + .a2 = Pomocy! + .a3 = Pomocy! Pomocy! + .a4 = Pomocy! Pomocy! Pomocy! + .a5 = Atakują mnie! + .a6 = Pomocy! Morderca! + .a7 = Pomocy! Morderca na wolności! + .a8 = Pomocy! Próbują mnie zabić! + .a9 = Straże, jestem atakowany! + .a10 = Straże! Jestem atakowany! + .a11 = Straże! Szybko! + .a12 = Straże! Straże! + .a13 = Straże! Złoczyńca! + .a14 = Straże! Tu jest morderca! + .a15 = Straże! Pomocy! + .a16 = Nie ujdzie Ci to płazem! Straże! + .a17 = Idą po mnie! + .a18 = To tylko zadrapanie! + .a19 = Przestań! + .a20 = Co Ci zrobiłem?! + .a21 = Przestań mnie atakować! + .a22 = Hej! Patrz jak to trzymasz! + .a23 = Przepadnij łajdaku! + .a24 = Przestań! Odwal się! + .a25 = Wkurzasz mnie! + .a26 = *Ugh* Za kogo się uważasz?! + .a27 = Zapłacisz za to głową! + .a28 = Przestań proszę, nie mam nic wartościowego! + .a29 = Naślę na ciebie starszego brata! + .a30 = Poskarżę się mamie! + .a31 = Bądź przeklęty! + .a32 = Przestań proszę. + .a33 = To nie było miłe! + .a34 = Twoja broń działa, teraz mnie zostaw! + .a35 = Oszczędź mnie! + .a36 = Proszę, mam rodzinę! + .a37 = Jestem zbyt młody by umierać! + .a38 = Możemy o tym pogadać? + .a39 = Przemoc nigdy nie jest odpowiedzią! + .a40 = Dzisiaj jest bardzo zły dzień... + .a41 = Hej! To bolało! + .a42 = Agh! + .a43 = Niegrzecznie! + .a44 = Przestań, proszę! + .a45 = Niech cię diabli! + .a46 = To nie jest śmieszne! + .a47 = Jak mogłeś?! + .a48 = Zapłacisz za to! + .a49 = Jeśli nie przestaniesz to pożałujesz! + .a50 = Nie zmuszaj mnie bym cię skrzywdził! + .a51 = To nieporozumienie! + .a52 = Nie musisz tego robic! + .a53 = Spadaj śmieciu! + .a54 = To boli! + .a55 = Czemu to robisz? + .a56 = Na wielkie nieba, przepadnij! + .a57 = Musiałeś mnie pomylić z kimś innym! + .a58 = Nie zasługuję na to! + .a59 = Nie rób tego ponownie. + .a60 = Straże, wrzućcie tego potwora do jeziora! + .a61 = Poszczuję tarasqa (tarasque) na ciebie! + .a62 = Dlaczego ja? +npc-speech-villager_enemy_killed = + .a0 = Zniszczyłem swojego przeciwnika! + .a1 = Nareszcie spokój! + .a2 = ... więc, co robiłem? +npc-speech-menacing = + .a0 = Ostrzegam Cię! + .a1 = Podejdź bliżej a zaatakuję! + .a2 = Nie boję się Ciebie! + .a3 = Lepiej szybko stąd uciekaj! + .a4 = Krok w tył, jeśli Ci życie miłe! + .a5 = Nie jesteś tu mile widziany! +npc-speech-cultist_low_health_fleeing = + .a0 = Taktyczny odwrót! + .a1 = Odwrót! + .a2 = Przeklinam Cię! + .a3 = Muszę odpocząć! + .a4 = Są zbyt potężni! \ No newline at end of file diff --git a/assets/voxygen/i18n/pl_PL/npc.ron b/assets/voxygen/i18n/pl_PL/npc.ron deleted file mode 100644 index 564da936c5..0000000000 --- a/assets/voxygen/i18n/pl_PL/npc.ron +++ /dev/null @@ -1,199 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Polish -// TODO: Check this whole file -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Co za piękny dzień!", - "Jak się masz?", - "Udanego poranka!", - "...", /// "I wonder what the Catoblepas thinks when it eats grass.", - "Co myślisz o pogodzie?", - "Boję się na samą myśl o lochach. Mam nadzieję, że ktoś je wyczyści.", - "Chciałbym zapuścić się do jaskinii, gdy stanę się silniejszy.", /// forma - "Widziałeś mojego kota?", /// forma - "Słyszałeś kiedyś o zażartych rekinach ziemnych? Słyszałem że żyją na pustyni!", /// forma - "Mówi się, że cenne klejnoty można znaleźć w jaskiniach.", - "Fascynuje mnie ser...", - "Chciałbyś wpaść? Właśnie szykujemy ser!", - "Mówią, że grzyby są zdrowe... Nigdy nie miałem okazji ich spróbować.", /// forma - "Nie zapomnij o krakersach!", - "Uwielbiam krasnoludzki ser. Chciałbym umieć go zrobić", /// forma - "Ciekawe co jest za górami...", - "Marzę by zrobić kiedyś swoją lotnię.", - "Chcesz zobaczyć mój ogród? Dobra, może innym razem...", - "Cudowny dzień na przechadzkę po lesie.", - "Być albo nie być, oto jest pytanie... Myślę, że będę farmerem.", /// forma - "Czy też uważasz, że nasze miasteczko jest najlepsze?", - "Wiesz może dlaczego Świecące Resztki (Glowing Remains) świecą?", - "Myślę, że czas na drugie śniadanie!", - "Złapałeś kiedyś ważkę?", // forma - "Nie mogę zrozumieć skąd przychodzą te Sauroki (Sauroks).", - "Chciałbym by ktoś przeganiał wilki.", /// forma - "Miałem cudowny sen ostatniej nocy. Ciekawe co oznaczał?", /// forma - "Zostawiłem trochę sera z moim bratem. Teraz nie wiem czy ser dalej istnieje czy nie. Nazywam to serem Schrödingera.", /// forma - "Zostawiłem trochę sera z moją siostrą. Teraz nie wiem czy ser dalej istnieje czy nie. Nazywam to serem Schrödingera.", /// forma - "Ktoś powinien coś zrobić z tymi kultystami.", - "Fajnie by było jakby zaczęło padać.", - "Kocham miód! Ale pszczoły już nie bardzo.", - "Chciałbym zwiedzić kiedyś świat!", /// forma - ], - "npc.speech.villager_decline_trade": [ - "Wybacz, nie mam niczego do wymiany.", - "Handel? Sugerujesz, że mam coś co Cię zainteresuje?", - "Mój dom nie jest na sprzedaż!", - ], - "npc.speech.merchant_advertisement": [ - "Pokazać Ci swoje towary?", - "Masz ochotę na mały handelek?", - "Mam wiele produktów, chcesz rzucić okiem?" - ], - "npc.speech.merchant_busy": [ - "Zaczekaj na swoją kolej.", - "Proszę czekać, nie rozdwoję się.", - "Nie widzisz kolejki?", - "Jeszcze chwila, już kończę...", - "Nie wpychać się do kolejki.", - "Jestem zajęty, wpadnij później." /// forma - ], - "npc.speech.merchant_trade_successful": [ - "Dziękuję. Wpadnij ponownie!", - "Interesy z Tobą to czysta przyjemność!", - ], - "npc.speech.merchant_trade_declined": [ - "Może innym razem, trzymaj się!", - "Ehh, wpadnij kiedy indziej!" - ], - "npc.speech.villager_cultist_alarm": [ - "Uwaga! Kultyści w pobliżu!", - "Do broni! Kultyści atakują!", - "Jak mogli zaatakować nas?!", - "Śmierć kultystom!", - "Kultyści nie są tutaj tolerowani!", - "Morderca!", - "Posmakuj mojego ostrza brudny kultysto!", - "Nic nie zmaże krwi z twoich rąk kultysto!", - "W dupę jeża! Kultysta!", - "Zbrodniarz!", - "Ten kultysta jest mój!", - "Przygotuj się na spotkanie ze stwórcą kultysto!", - "Kultysta! Brać go!", /// forma - /// "I see a cultist! Attack!", - /// "I see a cultist! Don't let them escape!", - /// "Would the most honorable cultist care for some DEATH?!", - /// "Never forgive! Never forget! Cultist, regret!", - "Giń kultysto!", - /// "Your reign of terror will seize!", - "Za wszystko co zrobiłeś!", /// forma - "Nie jesteś tutaj mile widziany. Won!", - "Powinieneś zostać pod ziemią!", /// forma - ], - "npc.speech.villager_under_attack": [ - "Pomocy, jestem atakowany!", /// forma - "Pomocy! Jestem atakowany!", /// forma - /// "Ouch! I'm under attack!", - /// "Ouch! I'm under attack! Help!", - /// "Help me! I'm under attack!", - /// "I'm under attack! Help!", - /// "I'm under attack! Help me!", - "Pomocy!", - "Pomocy! Pomocy!", - "Pomocy! Pomocy! Pomocy!", - "Atakują mnie!", - /// "AAAHHH! I'm under attack!", - /// "AAAHHH! I'm under attack! Help!", - /// "Help! We're under attack!", - "Pomocy! Morderca!", - "Pomocy! Morderca na wolności!", - "Pomocy! Próbują mnie zabić!", - "Straże, jestem atakowany!", - "Straże! Jestem atakowany!", - /// "I'm under attack! Guards!", - /// "Help! Guards! I'm under attack!", - "Straże! Szybko!", - "Straże! Straże!", - "Straże! Złoczyńca!", - /// "Guards, slay this foul villain!", - "Straże! Tu jest morderca!", - "Straże! Pomocy!", - "Nie ujdzie Ci to płazem! Straże!", - /// "You fiend!", - /// "Help me!", - /// "Help! Please!", - /// "Ouch! Guards! Help!", - "Idą po mnie!", - /// "Help! Help! I'm being repressed!", - /// "Ah, now we see the violence inherent in the system.", - "To tylko zadrapanie!", - "Przestań!", - "Co Ci zrobiłem?!", - "Przestań mnie atakować!", - "Hej! Patrz jak to trzymasz!", - "Przepadnij łajdaku!", - "Przestań! Odwal się!", - "Wkurzasz mnie!", - "*Ugh* Za kogo się uważasz?!", - "Zapłacisz za to głową!", - "Przestań proszę, nie mam nic wartościowego!", - "Naślę na ciebie starszego brata!", - "Poskarżę się mamie!", - "Bądź przeklęty!", - "Przestań proszę.", - "To nie było miłe!", - "Twoja broń działa, teraz mnie zostaw!", - "Oszczędź mnie!", - "Proszę, mam rodzinę!", - "Jestem zbyt młody by umierać!", - "Możemy o tym pogadać?", - "Przemoc nigdy nie jest odpowiedzią!", - "Dzisiaj jest bardzo zły dzień...", - "Hej! To bolało!", - "Agh!", - "Niegrzecznie!", - "Przestań, proszę!", - "Niech cię diabli!", - "To nie jest śmieszne!", - "Jak mogłeś?!", - "Zapłacisz za to!", - "Jeśli nie przestaniesz to pożałujesz!", - "Nie zmuszaj mnie bym cię skrzywdził!", - "To nieporozumienie!", - "Nie musisz tego robic!", - "Spadaj śmieciu!", - "To boli!", - "Czemu to robisz?", - "Na wielkie nieba, przepadnij!", - "Musiałeś mnie pomylić z kimś innym!", /// forma - "Nie zasługuję na to!", - "Nie rób tego ponownie.", - "Straże, wrzućcie tego potwora do jeziora!", - "Poszczuję tarasqa (tarasque) na ciebie!", - "Dlaczego ja?", - ], - "npc.speech.villager_enemy_killed": [ - "Zniszczyłem swojego przeciwnika!", - "Nareszcie spokój!", - "... więc, co robiłem?", - ], - "npc.speech.menacing": [ - "Ostrzegam Cię!", - "Podejdź bliżej a zaatakuję!", - "Nie boję się Ciebie!", - "Lepiej szybko stąd uciekaj!", - "Krok w tył, jeśli Ci życie miłe!", - "Nie jesteś tu mile widziany!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Taktyczny odwrót!", - "Odwrót!", - "Przeklinam Cię!", - ///"I will curse you in the afterlife!", - "Muszę odpocząć!", - "Są zbyt potężni!", - ] - }, -) diff --git a/assets/voxygen/i18n/pt_BR/buff.ftl b/assets/voxygen/i18n/pt_BR/buff.ftl new file mode 100644 index 0000000000..741d31eee2 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Clique Para Remover +buff-title-missing = Título Ausente +buff-desc-missing = Descrição Ausente +buff-title-heal = Cura +buff-desc-heal = Ganha vida no decorrer do tempo. +buff-title-potion = Poção +buff-desc-potion = Tomando... +buff-title-saturation = Saturação +buff-desc-saturation = Ganha vida no decorrer do tempo através de consumíveis. +buff-title-campfire_heal = Cura de Acampamento +buff-desc-campfire_heal = Descansar próximo a uma fogueira de acampamento cura { $rate }% de vida por segundo. +buff-title-invulnerability = Invulnerabilidade +buff-desc-invulnerability = Você não receberá dano de nenhum ataque. +buff-title-protectingward = Guardião Protetor +buff-desc-protectingward = Você está protegido, de alguma forma, de ataques. +buff-title-frenzied = Frenético +buff-desc-frenzied = Você é imbuído de um deslocamento descomunal e ignora pequenas lesões. +buff-title-hastened = Aceleração +buff-desc-hastened = Seus movimentos e ataques são mais rápidos. +buff-title-bleed = Sangramento +buff-desc-bleed = Inflige Dano contínuo. +buff-title-cursed = Maldição +buff-desc-cursed = Você está amaldiçoado. +buff-title-burn = Em Chamas +buff-desc-burn = Você está queimando vivo +buff-title-crippled = Manco +buff-desc-crippled = Seu movimento está reduzido pois suas pernas estão severamente feridas. +buff-title-frozen = Congelado +buff-desc-frozen = Seus movimentos e ataques estão mais lentos. +buff-title-wet = Molhado +buff-desc-wet = O chão desliza em sob seus pés, ficando difícil parar. +buff-title-ensnared = Enredado +buff-desc-ensnared = Trepadeiras agarram suas pernas, impedindo seus movimentos. +buff-stat-health = Restaura { $str_total } de Vida +buff-stat-increase_max_energy = Aumenta a Stamina Máxima em { $strength } +buff-stat-increase_max_health = Aumenta a Vida Máxima em { $strength } +buff-stat-invulnerability = Concede invulnerabilidade +buff-text-over_seconds = durante { $dur_secs } segundos +buff-text-for_seconds = durante { $dur_secs } segundos \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/buff.ron b/assets/voxygen/i18n/pt_BR/buff.ron deleted file mode 100644 index 8822fa0095..0000000000 --- a/assets/voxygen/i18n/pt_BR/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - // Buffs - "buff.remove": "Clique Para Remover", - "buff.title.missing": "Título Ausente", - "buff.desc.missing": "Descrição Ausente", - "buff.title.heal": "Cura", - "buff.desc.heal": "Ganha vida no decorrer do tempo.", - "buff.title.potion": "Poção", - "buff.desc.potion": "Tomando...", - "buff.title.saturation": "Saturação", - "buff.desc.saturation": "Ganha vida no decorrer do tempo através de consumíveis.", - "buff.title.campfire_heal": "Cura de Acampamento", - "buff.desc.campfire_heal": "Descansar próximo a uma fogueira de acampamento cura {rate}% de vida por segundo.", - "buff.title.invulnerability": "Invulnerabilidade", - "buff.desc.invulnerability": "Você não receberá dano de nenhum ataque.", - "buff.title.protectingward": "Guardião Protetor", - "buff.desc.protectingward": "Você está protegido, de alguma forma, de ataques.", - "buff.title.frenzied": "Frenético", - "buff.desc.frenzied": "Você é imbuído de um deslocamento descomunal e ignora pequenas lesões.", - "buff.title.hastened": "Aceleração", - "buff.desc.hastened": "Seus movimentos e ataques são mais rápidos.", - // Debuffs - "buff.title.bleed": "Sangramento", - "buff.desc.bleed": "Inflige Dano contínuo.", - "buff.title.cursed": "Maldição", - "buff.desc.cursed": "Você está amaldiçoado.", - "buff.title.burn": "Em Chamas", - "buff.desc.burn": "Você está queimando vivo", - "buff.title.crippled": "Manco", - "buff.desc.crippled": "Seu movimento está reduzido pois suas pernas estão severamente feridas.", - "buff.title.frozen": "Congelado", - "buff.desc.frozen": "Seus movimentos e ataques estão mais lentos.", - "buff.title.wet": "Molhado", - "buff.desc.wet": "O chão desliza em sob seus pés, ficando difícil parar.", - "buff.title.ensnared": "Enredado", - "buff.desc.ensnared": "Trepadeiras agarram suas pernas, impedindo seus movimentos.", - // Buffs stats - "buff.stat.health": "Restaura {str_total} de Vida", - "buff.stat.increase_max_energy": "Aumenta a Stamina Máxima em {strength}", - "buff.stat.increase_max_health": "Aumenta a Vida Máxima em {strength}", - "buff.stat.invulnerability": "Concede invulnerabilidade", - // Text - "buff.text.over_seconds": "durante {dur_secs} segundos", - "buff.text.for_seconds": "durante {dur_secs} segundos", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/char_selection.ftl b/assets/voxygen/i18n/pt_BR/char_selection.ftl new file mode 100644 index 0000000000..d8000a8c00 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Carregando Personagens... +char_selection-delete_permanently = Excluir permanentemente este Personagem? +char_selection-deleting_character = Excluindo Personagem... +char_selection-change_server = Alterar Servidor +char_selection-enter_world = Entrar no Mundo +char_selection-logout = Deslogar +char_selection-create_new_character = Criar Personagem +char_selection-creating_character = Criando Personagem... +char_selection-character_creation = Criação de Personagem +char_selection-human_default = Humano Padrão +char_selection-level_fmt = Nível { $level_nb } +char_selection-uncanny_valley = Região Selvagem +char_selection-plains_of_uncertainty = Planícies da Incerteza +char_selection-beard = Barba +char_selection-hair_style = Estilo dos Cabelos +char_selection-hair_color = Cor dos Cabelos +char_selection-eye_color = Cor dos Olhos +char_selection-skin = Pele +char_selection-eyeshape = Detalhe dos Olhos +char_selection-accessories = Acessórios +char_selection-create_info_name = Seu personagem precisa de um nome! +char_selection-version_mismatch = AVISO! Este servidor está executando uma versão diferente e possivelmente incompatível do jogo. Por favor, atualize o seu jogo. \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/char_selection.ron b/assets/voxygen/i18n/pt_BR/char_selection.ron deleted file mode 100644 index 378b5ebd83..0000000000 --- a/assets/voxygen/i18n/pt_BR/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "char_selection.loading_characters": "Carregando Personagens...", - "char_selection.delete_permanently": "Excluir permanentemente este Personagem?", - "char_selection.deleting_character": "Excluindo Personagem...", - "char_selection.change_server": "Alterar Servidor", - "char_selection.enter_world": "Entrar no Mundo", - "char_selection.logout": "Deslogar", - "char_selection.create_new_character": "Criar Personagem", - "char_selection.creating_character": "Criando Personagem...", - "char_selection.character_creation": "Criação de Personagem", - "char_selection.human_default": "Humano Padrão", - "char_selection.level_fmt": "Nível {level_nb}", - "char_selection.uncanny_valley": "Região Selvagem", - "char_selection.plains_of_uncertainty": "Planícies da Incerteza", - "char_selection.beard": "Barba", - "char_selection.hair_style": "Estilo dos Cabelos", - "char_selection.hair_color": "Cor dos Cabelos", - "char_selection.eye_color": "Cor dos Olhos", - "char_selection.skin": "Pele", - "char_selection.eyeshape": "Detalhe dos Olhos", - "char_selection.accessories": "Acessórios", - "char_selection.create_info_name": "Seu personagem precisa de um nome!", - "char_selection.version_mismatch": "AVISO! Este servidor está executando uma versão diferente e possivelmente incompatível do jogo. Por favor, atualize o seu jogo.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/common.ftl b/assets/voxygen/i18n/pt_BR/common.ftl new file mode 100644 index 0000000000..69fa8b6e30 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/common.ftl @@ -0,0 +1,108 @@ +common-username = Nome de usuário +common-singleplayer = Um Jogador +common-multiplayer = Multijogador +common-servers = Servidores +common-quit = Sair +common-settings = Configurações +common-languages = Idiomas +common-interface = Interface +common-gameplay = Jogabilidade +common-controls = Controles +common-video = Vídeo +common-sound = Som +common-chat = Chat +common-resume = Continuar +common-characters = Personagens +common-close = Fechar +common-yes = Sim +common-no = Não +common-back = Voltar +common-create = Criar +common-okay = Okay +common-add = Adicionar +common-accept = Aceitar +common-decline = Recusar +common-disclaimer = Aviso +common-cancel = Cancelar +common-none = Nenhum +common-error = Erro +common-fatal_error = Erro Fatal +common-you = Você +common-automatic = Auto +common-random = Aleatório +common-empty = Vazio +common-confirm = Confirmar +common-delete_server = Deletar Servidor +common-interface_settings = Configurações de Interface +common-gameplay_settings = Configurações de Gameplay +common-controls_settings = Configurações de Controles +common-video_settings = Configurações Gráficas +common-sound_settings = Configurações de Som +common-language_settings = Configurações de Idioma +common-chat_settings = Configurações de Chat +common-connection_lost = + Conexão Perdida! + Será que o servidor reiniciou? + O cliente está atualizado? +common-species-orc = Orc +common-species-human = Humano +common-species-dwarf = Anão +common-species-elf = Elfo +common-species-draugr = Morto-vivo +common-species-danari = Danari +common-weapons-axe = Machado +common-weapons-dagger = Adaga +common-weapons-greatsword = Espada Larga +common-weapons-shortswords = Espada Curta +common-weapons-sword = Espada +common-weapons-staff = Cajado de Fogo +common-weapons-bow = Arco +common-weapons-hammer = Martelo +common-weapons-general = Combate Geral +common-weapons-sceptre = Cetro de Cura +common-weapons-shield = Escudo +common-weapons-spear = Lança +common-weapons-hammer_simple = Martelo Simples +common-weapons-sword_simple = Espada Simples +common-weapons-staff_simple = Cajado Simples +common-weapons-axe_simple = Machado Simples +common-weapons-bow_simple = Arco Simples +common-weapons-unique = Único +common-tool-debug = Depuração +common-tool-farming = Ferramenta Agrícola +common-tool-pick = Picareta +common-tool-mining = Mineração +common-kind-modular_component = Componente Modular +common-kind-modular_component_partial = Componente +common-kind-glider = Planador +common-kind-consumable = Consumível +common-kind-throwable = Arremessável +common-kind-utility = Utilitário +common-kind-ingredient = Ingrediente +common-kind-lantern = Lanterna +common-hands-one = Uma mão +common-hands-two = Duas mãos +common-rand_appearance = Aparência aleatória +common-rand_name = Nome Aleatório +common-stats-combat_rating = Nivel de Combate +common-stats-power = Poder +common-stats-speed = Velocidade +common-stats-poise = Veneno +common-stats-range = Alcance +common-stats-energy_efficiency = Eficiência Energética +common-stats-buff_strength = Buff/Debuff de força +common-stats-crit_chance = Chance de Crítico +common-stats-crit_mult = Multiplicador de Crítico +common-stats-armor = Armadura +common-stats-poise_res = Resistência a Atordoamento +common-stats-energy_max = Energia Máxima +common-stats-energy_reward = Recompensa de Energia +common-stats-crit_power = Poder Crítico +common-stats-stealth = Furtividade +common-stats-slots = Espaços +common-material-metal = Metal +common-material-wood = Madeira +common-material-stone = Pedra +common-material-cloth = Tecido +common-material-hide = Couro +common-sprite-chest = Baú \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/common.ron b/assets/voxygen/i18n/pt_BR/common.ron deleted file mode 100644 index 24f153f9e3..0000000000 --- a/assets/voxygen/i18n/pt_BR/common.ron +++ /dev/null @@ -1,130 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - // Textos utilizados em múltiplas traduções seguindo o mesmo formato - "common.username": "Nome de usuário", - "common.singleplayer": "Um Jogador", - "common.multiplayer": "Multijogador", - "common.servers": "Servidores", - "common.quit": "Sair", - "common.settings": "Configurações", - "common.languages": "Idiomas", - "common.interface": "Interface", - "common.gameplay": "Jogabilidade", - "common.controls": "Controles", - "common.video": "Vídeo", - "common.sound": "Som", - "common.chat": "Chat", - "common.resume": "Continuar", - "common.characters": "Personagens", - "common.close": "Fechar", - "common.yes": "Sim", - "common.no": "Não", - "common.back": "Voltar", - "common.create": "Criar", - "common.okay": "Okay", - "common.add": "Adicionar", - "common.accept": "Aceitar", - "common.decline": "Recusar", - "common.disclaimer": "Aviso", - "common.cancel": "Cancelar", - "common.none": "Nenhum", - "common.error": "Erro", - "common.fatal_error": "Erro Fatal", - "common.you": "Você", - "common.automatic": "Auto", - "common.random": "Aleatório", - "common.empty": "Vazio", - "common.confirm": "Confirmar", - "common.delete_server": "Deletar Servidor", - - // Títulos da Janela de Configurações - "common.interface_settings": "Configurações de Interface", - "common.gameplay_settings": "Configurações de Gameplay", - "common.controls_settings": "Configurações de Controles", - "common.video_settings": "Configurações Gráficas", - "common.sound_settings": "Configurações de Som", - "common.language_settings": "Configurações de Idioma", - "common.chat_settings": "Configurações de Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"Conexão Perdida! -Será que o servidor reiniciou? -O cliente está atualizado?"#, - - - "common.species.orc": "Orc", - "common.species.human": "Humano", - "common.species.dwarf": "Anão", - "common.species.elf": "Elfo", - "common.species.draugr": "Morto-vivo", - "common.species.danari": "Danari", - - "common.weapons.axe": "Machado", - "common.weapons.dagger": "Adaga", - "common.weapons.greatsword": "Espada Larga", - "common.weapons.shortswords": "Espada Curta", - "common.weapons.sword": "Espada", - "common.weapons.staff": "Cajado de Fogo", - "common.weapons.bow": "Arco", - "common.weapons.hammer": "Martelo", - "common.weapons.general": "Combate Geral", - "common.weapons.sceptre": "Cetro de Cura", - "common.weapons.shield": "Escudo", - "common.weapons.spear": "Lança", - "common.weapons.hammer_simple": "Martelo Simples", - "common.weapons.sword_simple": "Espada Simples", - "common.weapons.staff_simple": "Cajado Simples", - "common.weapons.axe_simple": "Machado Simples", - "common.weapons.bow_simple": "Arco Simples", - "common.weapons.unique": "Único", - "common.tool.debug": "Depuração", - "common.tool.farming": "Ferramenta Agrícola", - "common.tool.pick": "Picareta", - "common.tool.mining": "Mineração", - "common.kind.modular_component": "Componente Modular", - "common.kind.modular_component_partial": "Componente", - "common.kind.glider": "Planador", - "common.kind.consumable": "Consumível", - "common.kind.throwable": "Arremessável", - "common.kind.utility": "Utilitário", - "common.kind.ingredient": "Ingrediente", - "common.kind.lantern": "Lanterna", - "common.hands.one": "Uma mão", - "common.hands.two": "Duas mãos", - - "common.rand_appearance": "Aparência aleatória", - "common.rand_name": "Nome Aleatório", - - "common.stats.combat_rating": "Nivel de Combate", - "common.stats.power": "Poder", - "common.stats.speed": "Velocidade", - "common.stats.poise": "Veneno", - "common.stats.range": "Alcance", - "common.stats.energy_efficiency": "Eficiência Energética", - "common.stats.buff_strength": "Buff/Debuff de força", - "common.stats.crit_chance": "Chance de Crítico", - "common.stats.crit_mult": "Multiplicador de Crítico", - "common.stats.armor": "Armadura", - "common.stats.poise_res":"Resistência a Atordoamento", - "common.stats.energy_max": "Energia Máxima", - "common.stats.energy_reward": "Recompensa de Energia", - "common.stats.crit_power": "Poder Crítico", - "common.stats.stealth": "Furtividade", - "common.stats.slots": "Espaços", - - "common.material.metal": "Metal", - "common.material.wood": "Madeira", - "common.material.stone": "Pedra", - "common.material.cloth": "Tecido", - "common.material.hide": "Couro", - - "common.sprite.chest": "Baú", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/esc_menu.ftl b/assets/voxygen/i18n/pt_BR/esc_menu.ftl new file mode 100644 index 0000000000..543ff2b8b1 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Deslogar +esc_menu-quit_game = Sair do Jogo \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/esc_menu.ron b/assets/voxygen/i18n/pt_BR/esc_menu.ron deleted file mode 100644 index 75ce07a510..0000000000 --- a/assets/voxygen/i18n/pt_BR/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "esc_menu.logout": "Deslogar", - "esc_menu.quit_game": "Sair do Jogo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/gameinput.ftl b/assets/voxygen/i18n/pt_BR/gameinput.ftl new file mode 100644 index 0000000000..04c23d51e3 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Ataque Básico +gameinput-secondary = Ataque Secundário +gameinput-block = Bloquear +gameinput-slot1 = Hotbar Slot 1 +gameinput-slot2 = Hotbar Slot 2 +gameinput-slot3 = Hotbar Slot 3 +gameinput-slot4 = Hotbar Slot 4 +gameinput-slot5 = Hotbar Slot 5 +gameinput-slot6 = Hotbar Slot 6 +gameinput-slot7 = Hotbar Slot 7 +gameinput-slot8 = Hotbar Slot 8 +gameinput-slot9 = Hotbar Slot 9 +gameinput-slot10 = Hotbar Slot 10 +gameinput-swaploadout = Alterar Carga +gameinput-togglecursor = Alternar Cursor +gameinput-help = Mostar/Ocultar Janela de Ajuda +gameinput-toggleinterface = Mostar/Ocultar Interface +gameinput-toggledebug = Mostar/Ocultar informações de depuração e FPS +gameinput-toggle_egui_debug = Mostrar/Ocultar informações de depuração EGUI +gameinput-togglechat = Mostrar/Ocultar Chat +gameinput-screenshot = Capturar Tela +gameinput-toggleingameui = Mostar/Ocultar Nametags +gameinput-fullscreen = Alternar Tela Cheia +gameinput-moveforward = Mover para Frente +gameinput-moveleft = Mover para a Esquerda +gameinput-moveright = Mover para a Direita +gameinput-moveback = Mover para trás +gameinput-jump = Pular +gameinput-glide = Planador +gameinput-roll = Rolar +gameinput-climb = Escalar +gameinput-climbdown = Descer +gameinput-wallleap = Pular na Parede +gameinput-togglelantern = Ligar/Desligar Lamparina +gameinput-mount = Montar +gameinput-chat = Chat +gameinput-command = Comandos +gameinput-escape = Esc +gameinput-map = Mapa +gameinput-bag = Mochila +gameinput-trade = Troca +gameinput-social = Social +gameinput-sit = Sentar +gameinput-spellbook = Magias +gameinput-settings = Configurações +gameinput-respawn = Renascer +gameinput-charge = Carregar +gameinput-togglewield = Alternar Empunhadura +gameinput-interact = Interagir +gameinput-freelook = Câmera Livre +gameinput-autowalk = Caminhar/Nadar Automáticamente +gameinput-cameraclamp = Trava de câmera vertical +gameinput-dance = Dançar +gameinput-select = Escolher +gameinput-acceptgroupinvite = Aceitar Convite de Grupo +gameinput-declinegroupinvite = Negar Convite de Grupo +gameinput-cyclecamera = Mudar a câmera +gameinput-crafting = Criação +gameinput-fly = Voar +gameinput-sneak = Furtividade +gameinput-swimdown = Mergulhar +gameinput-swimup = Emergir +gameinput-mapzoomin = Aumentar zoom do mapa +gameinput-mapzoomout = Reduzir zoom do mapa +gameinput-greet = Saudação +gameinput-map-locationmarkerbutton = Insere um marcador no Mapa \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/gameinput.ron b/assets/voxygen/i18n/pt_BR/gameinput.ron deleted file mode 100644 index c604ead70e..0000000000 --- a/assets/voxygen/i18n/pt_BR/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "gameinput.primary": "Ataque Básico", - "gameinput.secondary": "Ataque Secundário", - "gameinput.block": "Bloquear", - "gameinput.slot1": "Hotbar Slot 1", - "gameinput.slot2": "Hotbar Slot 2", - "gameinput.slot3": "Hotbar Slot 3", - "gameinput.slot4": "Hotbar Slot 4", - "gameinput.slot5": "Hotbar Slot 5", - "gameinput.slot6": "Hotbar Slot 6", - "gameinput.slot7": "Hotbar Slot 7", - "gameinput.slot8": "Hotbar Slot 8", - "gameinput.slot9": "Hotbar Slot 9", - "gameinput.slot10": "Hotbar Slot 10", - "gameinput.swaploadout": "Alterar Carga", - "gameinput.togglecursor": "Alternar Cursor", - "gameinput.help": "Mostar/Ocultar Janela de Ajuda", - "gameinput.toggleinterface": "Mostar/Ocultar Interface", - "gameinput.toggledebug": "Mostar/Ocultar informações de depuração e FPS", - "gameinput.toggle_egui_debug": "Mostrar/Ocultar informações de depuração EGUI", - "gameinput.togglechat": "Mostrar/Ocultar Chat", - "gameinput.screenshot": "Capturar Tela", - "gameinput.toggleingameui": "Mostar/Ocultar Nametags", - "gameinput.fullscreen": "Alternar Tela Cheia", - "gameinput.moveforward": "Mover para Frente", - "gameinput.moveleft": "Mover para a Esquerda", - "gameinput.moveright": "Mover para a Direita", - "gameinput.moveback": "Mover para trás", - "gameinput.jump": "Pular", - "gameinput.glide": "Planador", - "gameinput.roll": "Rolar", - "gameinput.climb": "Escalar", - "gameinput.climbdown": "Descer", - "gameinput.wallleap": "Pular na Parede", - "gameinput.togglelantern": "Ligar/Desligar Lamparina", - "gameinput.mount": "Montar", - "gameinput.chat": "Chat", - "gameinput.command": "Comandos", - "gameinput.escape": "Esc", - "gameinput.map": "Mapa", - "gameinput.bag": "Mochila", - "gameinput.trade": "Troca", - "gameinput.social": "Social", - "gameinput.sit": "Sentar", - "gameinput.spellbook": "Magias", - "gameinput.settings": "Configurações", - "gameinput.respawn": "Renascer", - "gameinput.charge": "Carregar", - "gameinput.togglewield": "Alternar Empunhadura", - "gameinput.interact": "Interagir", - "gameinput.freelook": "Câmera Livre", - "gameinput.autowalk": "Caminhar/Nadar Automáticamente", - "gameinput.cameraclamp": "Trava de câmera vertical", - "gameinput.dance": "Dançar", - "gameinput.select": "Escolher", - "gameinput.acceptgroupinvite": "Aceitar Convite de Grupo", - "gameinput.declinegroupinvite": "Negar Convite de Grupo", - "gameinput.cyclecamera": "Mudar a câmera", - "gameinput.crafting": "Criação", - "gameinput.fly": "Voar", - "gameinput.sneak": "Furtividade", - "gameinput.swimdown": "Mergulhar", - "gameinput.swimup": "Emergir", - "gameinput.mapzoomin": "Aumentar zoom do mapa", - "gameinput.mapzoomout": "Reduzir zoom do mapa", - "gameinput.greet": "Saudação", - "gameinput.map.locationmarkerbutton": "Insere um marcador no Mapa" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/ability.ftl b/assets/voxygen/i18n/pt_BR/hud/ability.ftl new file mode 100644 index 0000000000..6b53f9ec3f --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/ability.ftl @@ -0,0 +1,16 @@ +common-abilities-debug-possess-name = Flecha Marionete +common-abilities-debug-possess-desc = Atira uma flecha venenosa que deixa você controlar seu alvo. +common-abilities-sword-spin-name = Redemoinho +common-abilities-sword-spin-desc = Movimento frontal girando com sua espada. +common-abilities-axe-leap-name = Machadada Pulante +common-abilities-axe-leap-desc = Um pulo cortante na direção do cursor do mouse. +common-abilities-hammer-leap-name = Golpe da Ruína +common-abilities-hammer-leap-desc = Um Ataque em Área que inflige Empurrão. Salta na direção do cursor do mouse. +common-abilities-bow-shotgun-name = Estrondo +common-abilities-bow-shotgun-desc = Atira uma sequência de flechas +common-abilities-staff-fireshockwave-name = Anel de Fogo +common-abilities-staff-fireshockwave-desc = Incendeia o chão com uma onda de chamas. +common-abilities-sceptre-wardingaura-name = Aura Protetora +common-abilities-sceptre-wardingaura-desc = Protege seus aliados contra ataques inimigos. +common-abilities-unknown-name = Habilidade sem título +common-abilities-unknown-desc = Habilidade sem descrição \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/ability.ron b/assets/voxygen/i18n/pt_BR/hud/ability.ron deleted file mode 100644 index ea5bc4b199..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/ability.ron +++ /dev/null @@ -1,35 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese -( - string_map: { - // Bastão de debug - "common.abilities.debug.possess.name": "Flecha Marionete", - "common.abilities.debug.possess.desc": "Atira uma flecha venenosa que deixa você controlar seu alvo.", - // Sword - "common.abilities.sword.spin.name": "Redemoinho", - "common.abilities.sword.spin.desc": "Movimento frontal girando com sua espada.", - // Machado - "common.abilities.axe.leap.name": "Machadada Pulante", - "common.abilities.axe.leap.desc": "Um pulo cortante na direção do cursor do mouse.", - // Martelo - "common.abilities.hammer.leap.name": "Golpe da Ruína", - "common.abilities.hammer.leap.desc": "Um Ataque em Área que inflige Empurrão. Salta na direção do cursor do mouse.", - // Arco - "common.abilities.bow.shotgun.name": "Estrondo", - "common.abilities.bow.shotgun.desc": "Atira uma sequência de flechas", - // Cajado - "common.abilities.staff.fireshockwave.name": "Anel de Fogo", - "common.abilities.staff.fireshockwave.desc": "Incendeia o chão com uma onda de chamas.", - // Cetro - "common.abilities.sceptre.wardingaura.name": "Aura Protetora", - "common.abilities.sceptre.wardingaura.desc": "Protege seus aliados contra ataques inimigos.", - // Desconhecido - "common.abilities.unknown.name": "Habilidade sem título", - "common.abilities.unknown.desc": "Habilidade sem descrição", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/bag.ftl b/assets/voxygen/i18n/pt_BR/hud/bag.ftl new file mode 100644 index 0000000000..ceda797979 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/bag.ftl @@ -0,0 +1,41 @@ +hud-bag-inventory = Inventário de { $playername } +hud-bag-stats_title = Estatísticas de { $playername } +hud-bag-exp = Exp +hud-bag-armor = Armadura +hud-bag-stats = Estatísticas +hud-bag-head = Cabeça +hud-bag-neck = Pescoço +hud-bag-tabard = Tabardo +hud-bag-shoulders = Ombros +hud-bag-chest = Peito +hud-bag-hands = Mãos +hud-bag-lantern = Lamparina +hud-bag-glider = Planador +hud-bag-belt = Cinto +hud-bag-ring = Anel +hud-bag-back = Costas +hud-bag-legs = Pernas +hud-bag-feet = Pés +hud-bag-mainhand = Mão hábil +hud-bag-offhand = Mão inábil +hud-bag-inactive_mainhand = Mão hábil inativa +hud-bag-inactive_offhand = Mão inábil inativa +hud-bag-swap_equipped_weapons_title = Trocar armas equipadas +hud-bag-swap_equipped_weapons_desc = Pressione { $key } +hud-bag-bag = Mochila +hud-bag-health = Vida +hud-bag-energy = Stamina +hud-bag-combat_rating = Pontuação de Combate +hud-bag-protection = Proteção +hud-bag-stun_res = Resistência à paralisia +hud-bag-stealth = Furtividade +hud-bag-combat_rating_desc = + Calculado por seu + equipamento e vida. +hud-bag-protection_desc = Redução de dano por armadura +hud-bag-stun_res_desc = + Resistência à paralisia provocada por golpes consecutivos. + Regenera como Stamina. +hud-bag-sort_by_name = Ordenar por Nome +hud-bag-sort_by_quality = Ordenar por Qualidade +hud-bag-sort_by_category = Ordenar por Categoria \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/bag.ron b/assets/voxygen/i18n/pt_BR/hud/bag.ron deleted file mode 100644 index 1acf77ee9e..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/bag.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - // Inventory - "hud.bag.inventory": "Inventário de {playername}", - "hud.bag.stats_title": "Estatísticas de {playername}", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armadura", - "hud.bag.stats": "Estatísticas", - "hud.bag.head": "Cabeça", - "hud.bag.neck": "Pescoço", - "hud.bag.tabard": "Tabardo", - "hud.bag.shoulders": "Ombros", - "hud.bag.chest": "Peito", - "hud.bag.hands": "Mãos", - "hud.bag.lantern": "Lamparina", - "hud.bag.glider": "Planador", - "hud.bag.belt": "Cinto", - "hud.bag.ring": "Anel", - "hud.bag.back": "Costas", - "hud.bag.legs": "Pernas", - "hud.bag.feet": "Pés", - "hud.bag.mainhand": "Mão hábil", - "hud.bag.offhand": "Mão inábil", - "hud.bag.inactive_mainhand": "Mão hábil inativa", - "hud.bag.inactive_offhand": "Mão inábil inativa", - "hud.bag.swap_equipped_weapons_title": "Trocar armas equipadas", - "hud.bag.swap_equipped_weapons_desc": "Pressione {key}", - "hud.bag.bag": "Mochila", - "hud.bag.health": "Vida", - "hud.bag.energy": "Stamina", - "hud.bag.combat_rating": "Pontuação de Combate", - "hud.bag.protection": "Proteção", - "hud.bag.stun_res": "Resistência à paralisia", - "hud.bag.stealth": "Furtividade", - "hud.bag.combat_rating_desc": "Calculado por seu\nequipamento e vida.", - "hud.bag.protection_desc": "Redução de dano por armadura", - "hud.bag.stun_res_desc": "Resistência à paralisia provocada por golpes consecutivos.\nRegenera como Stamina.", - "hud.bag.sort_by_name": "Ordenar por Nome", - "hud.bag.sort_by_quality": "Ordenar por Qualidade", - "hud.bag.sort_by_category": "Ordenar por Categoria", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/char_window.ftl b/assets/voxygen/i18n/pt_BR/hud/char_window.ftl new file mode 100644 index 0000000000..730c1d5083 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Nome do Personagem +character_window-character_stats = + Vigor + + Aptidão + + Força de Vontade + + Proteção \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/char_window.ron b/assets/voxygen/i18n/pt_BR/hud/char_window.ron deleted file mode 100644 index 0369ba68e2..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "character_window.character_name": "Nome do Personagem", - // Character stats - "character_window.character_stats": r#"Vigor - -Aptidão - -Força de Vontade - -Proteção -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/chat.ftl b/assets/voxygen/i18n/pt_BR/hud/chat.ftl new file mode 100644 index 0000000000..0035ab6490 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Todos +hud-chat-chat_tab_hover_tooltip = Clique direito para configurar +hud-outcome-burning = morreu de: queimadura +hud-outcome-curse = morreu de: maldição +hud-outcome-bleeding = morreu de: sangramento +hud-outcome-crippled = morreu de: aleijamento +hud-outcome-frozen = morreu de: congelamento +hud-chat-online_msg = [{ $name }] está online. +hud-chat-offline_msg = { $name } está offline +hud-chat-default_death_msg = [{ $name }] morreu +hud-chat-environmental_kill_msg = [{ $name }] morreu de { $environment } +hud-chat-fall_kill_msg = [{ $name }] morreu de dano de queda +hud-chat-suicide_msg = [{ $name }] morreu de dano autoinflingido +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } causado por [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] derrotou [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] atirou em [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] explodiu [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] matou [{ $victim }] com magia +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } causado por { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } matou [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } atirou em [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } explodiu [{ $victim }] +hud-chat-npc_energy_kill_msg = [{ $attacker }] matou [{ $victim }] com magia +hud-chat-npc_other_kill_msg = [{ $attacker }] matou [{ $victim }] +hud-chat-loot_msg = Você pegou [{ $item }] +hud-chat-loot_fail = Seu Inventário está cheio! +hud-chat-goodbye = Até Logo! +hud-chat-connection_lost = Conexão perdida. Expulsando em { $time } segundos. \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/chat.ron b/assets/voxygen/i18n/pt_BR/hud/chat.ron deleted file mode 100644 index 6ac5af2e3a..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.chat.all": "Todos", - "hud.chat.chat_tab_hover_tooltip": "Clique direito para configurar", - - // Debuff outcomes - "hud.outcome.burning": "morreu de: queimadura", - "hud.outcome.curse": "morreu de: maldição", - "hud.outcome.bleeding": "morreu de: sangramento", - "hud.outcome.crippled": "morreu de: aleijamento", - "hud.outcome.frozen": "morreu de: congelamento", - - // Chat outputs - "hud.chat.online_msg": "[{name}] está online.", - "hud.chat.offline_msg": "{name} está offline", - - "hud.chat.default_death_msg": "[{name}] morreu", - "hud.chat.environmental_kill_msg": "[{name}] morreu de {environment}", - "hud.chat.fall_kill_msg": "[{name}] morreu de dano de queda", - "hud.chat.suicide_msg": "[{name}] morreu de dano autoinflingido", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} causado por [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] derrotou [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] atirou em [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] explodiu [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] matou [{victim}] com magia", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} causado por {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} matou [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} atirou em [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} explodiu [{victim}]", - "hud.chat.npc_energy_kill_msg": "[{attacker}] matou [{victim}] com magia", - "hud.chat.npc_other_kill_msg": "[{attacker}] matou [{victim}]", - - "hud.chat.loot_msg": "Você pegou [{item}]", - "hud.chat.loot_fail": "Seu Inventário está cheio!", - "hud.chat.goodbye": "Até Logo!", - "hud.chat.connection_lost": "Conexão perdida. Expulsando em {time} segundos.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/crafting.ftl b/assets/voxygen/i18n/pt_BR/hud/crafting.ftl new file mode 100644 index 0000000000..0f63973ac5 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/crafting.ftl @@ -0,0 +1,44 @@ +hud-crafting = Criação +hud-crafting-recipes = Receitas +hud-crafting-ingredients = Ingredientes: +hud-crafting-craft = Criar +hud-crafting-tool_cata = Requer: +hud-crafting-req_crafting_station = Requer: +hud-crafting-anvil = Bigorna +hud-crafting-cauldron = Caldeirão +hud-crafting-cooking_pot = Panela +hud-crafting-crafting_bench = Bancada de Criação +hud-crafting-forge = Forja +hud-crafting-loom = Tear +hud-crafting-spinning_wheel = Roca +hud-crafting-tanning_rack = Curtidor de couro +hud-crafting-salvaging_station = Mesa de Restituição +hud-crafting-campfire = Fogueira +hud-crafting-tabs-all = Tudo +hud-crafting-tabs-armor = Armadura +hud-crafting-tabs-dismantle = Desmontar +hud-crafting-tabs-food = Comida +hud-crafting-tabs-glider = Planadores +hud-crafting-tabs-potion = Poções +hud-crafting-tabs-tool = Ferramentas +hud-crafting-tabs-utility = Utilitários +hud-crafting-tabs-weapon = Armas +hud-crafting-tabs-bag = Mochilas +hud-crafting-tabs-processed_material = Materiais +hud-crafting-dismantle_title = Desmontagem +hud-crafting-dismantle_explanation = + Passe o cursor nos itens da sua mochila para ver o que + você pode desmantelar. + + Dê clique duplo neles para iniciar a desmontagem. +hud-crafting-modular_desc = Arraste partes de arma aqui para criar uma arma +hud-crafting-mod_weap_prim_slot_title = Componente Primário de Arma +hud-crafting-mod_weap_prim_slot_desc = Arraste um componente primário de arma aqui (e.g. uma lâmina de espada, cabeça de machado, ou armação de arco). +hud-crafting-mod_weap_sec_slot_title = Componente Secundário de Arma +hud-crafting-mod_weap_sec_slot_desc = Arraste um componente secundário de arma aqui (e.g. um punho de espada, uma empunhadura de arco, ou núcleo de cajado). +hud-crafting-mod_comp_metal_prim_slot_title = Lingote de Metal +hud-crafting-mod_comp_metal_prim_slot_desc = Arraste um lingote de metal aqui, apenas certos metais podem ser usados para criar armas. +hud-crafting-mod_comp_wood_prim_slot_title = Madeira +hud-crafting-mod_comp_wood_prim_slot_desc = Arraste um tipo de madeira aqui, apenas certas madeiras podem ser usadas para criar armas. +hud-crafting-mod_comp_sec_slot_title = Material Animal +hud-crafting-mod_comp_sec_slot_desc = Opcionalmente coloque um ingrediente de origem animal, apenas certos ingredientes podem ser usados para criar armas. \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/crafting.ron b/assets/voxygen/i18n/pt_BR/hud/crafting.ron deleted file mode 100644 index 9c0b573d03..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/crafting.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.crafting": "Criação", - "hud.crafting.recipes": "Receitas", - "hud.crafting.ingredients": "Ingredientes:", - "hud.crafting.craft": "Criar", - "hud.crafting.tool_cata": "Requer:", - // Crafting Stations (Estações de Criação) - "hud.crafting.req_crafting_station": "Requer:", - "hud.crafting.anvil": "Bigorna", - "hud.crafting.cauldron": "Caldeirão", - "hud.crafting.cooking_pot": "Panela", - "hud.crafting.crafting_bench": "Bancada de Criação", - "hud.crafting.forge": "Forja", - "hud.crafting.loom": "Tear", - "hud.crafting.spinning_wheel": "Roca", - "hud.crafting.tanning_rack": "Curtidor de couro", - "hud.crafting.salvaging_station": "Mesa de Restituição", - "hud.crafting.campfire": "Fogueira", - // Tabs (Abas) - "hud.crafting.tabs.all": "Tudo", - "hud.crafting.tabs.armor": "Armadura", - "hud.crafting.tabs.dismantle": "Desmontar", - "hud.crafting.tabs.food": "Comida", - "hud.crafting.tabs.glider": "Planadores", - "hud.crafting.tabs.potion": "Poções", - "hud.crafting.tabs.tool": "Ferramentas", - "hud.crafting.tabs.utility": "Utilitários", - "hud.crafting.tabs.weapon": "Armas", - "hud.crafting.tabs.bag": "Mochilas", - "hud.crafting.tabs.processed_material": "Materiais", - "hud.crafting.dismantle_title": "Desmontagem", - "hud.crafting.dismantle_explanation" : "Passe o cursor nos itens da sua mochila para ver o que\nvocê pode desmantelar.\n\nDê clique duplo neles para iniciar a desmontagem.", - "hud.crafting.modular_desc": "Arraste partes de arma aqui para criar uma arma", - "hud.crafting.mod_weap_prim_slot_title": "Componente Primário de Arma", - "hud.crafting.mod_weap_prim_slot_desc": "Arraste um componente primário de arma aqui (e.g. uma lâmina de espada, cabeça de machado, ou armação de arco).", - "hud.crafting.mod_weap_sec_slot_title": "Componente Secundário de Arma", - "hud.crafting.mod_weap_sec_slot_desc": "Arraste um componente secundário de arma aqui (e.g. um punho de espada, uma empunhadura de arco, ou núcleo de cajado).", - "hud.crafting.mod_comp_metal_prim_slot_title": "Lingote de Metal", - "hud.crafting.mod_comp_metal_prim_slot_desc": "Arraste um lingote de metal aqui, apenas certos metais podem ser usados para criar armas.", - "hud.crafting.mod_comp_wood_prim_slot_title": "Madeira", - "hud.crafting.mod_comp_wood_prim_slot_desc": "Arraste um tipo de madeira aqui, apenas certas madeiras podem ser usadas para criar armas.", - "hud.crafting.mod_comp_sec_slot_title": "Material Animal", - "hud.crafting.mod_comp_sec_slot_desc": "Opcionalmente coloque um ingrediente de origem animal, apenas certos ingredientes podem ser usados para criar armas.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/group.ftl b/assets/voxygen/i18n/pt_BR/hud/group.ftl new file mode 100644 index 0000000000..216a0aef97 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grupo +hud-group-invite_to_join = { $name } convidou você para o grupo! +hud-group-invite_to_trade = { $name } convidou você para trocar itens! +hud-group-invite = Convidar +hud-group-kick = Expulsar +hud-group-assign_leader = Atribuír Líder +hud-group-leave = Sair do Grupo +hud-group-dead = Morto +hud-group-out_of_range = Fora de alcance +hud-group-add_friend = Adicionar aos Amigos +hud-group-link_group = Unir Grupos +hud-group-in_menu = No Menu +hud-group-members = Membros do Grupo \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/group.ron b/assets/voxygen/i18n/pt_BR/hud/group.ron deleted file mode 100644 index b7c412cd3f..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.group": "Grupo", - "hud.group.invite_to_join": "{name} convidou você para o grupo!", - "hud.group.invite_to_trade": "{name} convidou você para trocar itens!", - "hud.group.invite": "Convidar", - "hud.group.kick": "Expulsar", - "hud.group.assign_leader": "Atribuír Líder", - "hud.group.leave": "Sair do Grupo", - "hud.group.dead" : "Morto", - "hud.group.out_of_range": "Fora de alcance", - "hud.group.add_friend": "Adicionar aos Amigos", - "hud.group.link_group": "Unir Grupos", - "hud.group.in_menu": "No Menu", - "hud.group.members": "Membros do Grupo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/map.ftl b/assets/voxygen/i18n/pt_BR/hud/map.ftl new file mode 100644 index 0000000000..149a532e68 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/map.ftl @@ -0,0 +1,34 @@ +hud-map-map_title = Mapa +hud-map-qlog_title = Missões +hud-map-topo_map = Topografia +hud-map-difficulty = Dificuldade +hud-map-towns = Cidades +hud-map-castles = Castelos +hud-map-dungeons = Masmorras +hud-map-caves = Cavernas +hud-map-cave = Caverna +hud-map-peaks = Montanhas +hud-map-biomes = Biomas +hud-map-voxel_map = Mapa Voxel +hud-map-trees = Árvores Gigantes +hud-map-tree = Árvore Gigante +hud-map-town = Cidade +hud-map-castle = Castelo +hud-map-dungeon = Masmorra +hud-map-difficulty_dungeon = + Dificuldade da + + Masmorra: { $difficulty } +hud-map-drag = Arrastar +hud-map-zoom = Zoom +hud-map-mid_click = Adicionar marcador +hud-map-recenter = Recentralizar +hud-map-marked_location = Localização Marcada +hud-map-marked_location_remove = Clique para remover +hud-map-change_map_mode = Alterar modo do mapa +hud-map-toggle_minimap_voxel = Alternar Modo Voxel no Minimapa +hud-map-zoom_minimap_explanation = + Dê zoom no minimapa para ver + sua área em maior detalhes +hud-map-gnarling = Fortificação Retorcida +hud-map-placed_by = Marcado por { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/map.ron b/assets/voxygen/i18n/pt_BR/hud/map.ron deleted file mode 100644 index ee7ef84dda..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - // Mapa e Missões - "hud.map.map_title": "Mapa", - "hud.map.qlog_title": "Missões", - "hud.map.topo_map": "Topografia", - "hud.map.difficulty": "Dificuldade", - "hud.map.towns": "Cidades", - "hud.map.castles": "Castelos", - "hud.map.dungeons": "Masmorras", - "hud.map.caves": "Cavernas", - "hud.map.cave": "Caverna", - "hud.map.peaks": "Montanhas", - "hud.map.biomes": "Biomas", - "hud.map.voxel_map": "Mapa Voxel", - "hud.map.trees": "Árvores Gigantes", - "hud.map.tree": "Árvore Gigante", - "hud.map.town": "Cidade", - "hud.map.castle": "Castelo", - "hud.map.dungeon": "Masmorra", - "hud.map.difficulty_dungeon": "Dificuldade da\n\nMasmorra: {difficulty}", - "hud.map.drag": "Arrastar", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Adicionar marcador", - "hud.map.recenter": "Recentralizar", - "hud.map.marked_location": "Localização Marcada", - "hud.map.marked_location_remove": "Clique para remover", - "hud.map.change_map_mode": "Alterar modo do mapa", - "hud.map.toggle_minimap_voxel": "Alternar Modo Voxel no Minimapa", - "hud.map.zoom_minimap_explanation": "Dê zoom no minimapa para ver\nsua área em maior detalhes", - "hud.map.gnarling": "Fortificação Retorcida", - "hud.map.placed_by": "Marcado por {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/misc.ftl b/assets/voxygen/i18n/pt_BR/hud/misc.ftl new file mode 100644 index 0000000000..fcad1e476f --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/misc.ftl @@ -0,0 +1,46 @@ +hud-do_not_show_on_startup = Não exibir isto no início +hud-show_tips = Mostrar Dicas +hud-quests = Missões +hud-you_died = Você Morreu +hud-waypoint_saved = Marcador Salvo +hud-sp_arrow_txt = PHs +hud-inventory_full = Inventário Cheio +hud-someone_else = outro alguém +hud-another_group = outro grupo +hud-owned_by_for_secs = Pertence a { $name } por { $secs } segundos +hud-press_key_to_show_keybindings_fmt = [{ $key }] mapeamento de teclas +hud-press_key_to_toggle_lantern_fmt = [{ $key }] lamparina +hud-press_key_to_show_debug_info_fmt = Pressione { $key } para mostrar informações de depuração +hud-press_key_to_toggle_keybindings_fmt = Pressione { $key } para mostrar/ocultar teclas mapeadas +hud-press_key_to_toggle_debug_info_fmt = Pressione { $key } para mostrar/ocultar informações de depuração +hud-press_key_to_respawn = Pressione { $key } para renascer na última fogueira visitada. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Pressione [ { $key } ] para liberar o cursor e clique neste botão! +hud-tutorial_elements = Criação +hud-temp_quest_headline = Olá viajante! +hud-temp_quest_text = + Para o início de sua jornada, você pode começar buscando suprimentos nesta cidade. + + Você é bem-vindo para pegar o que for necessário para sua jornada! + + Olhe no canto inferior direito de sua tela para encontrar diversas coisas como sua mochila, o menu de criação e o mapa. + + A criação te permite constuir armadoras, armas, fazer alimentos e muto mais! + + Os animais selvagens ao redor da cidade são uma boa fonte de Retalhos de Couro(Leather Scraps) para que você crie uma certa proteção contra as intempéries do mundo. + + Assim que você se sentir pronto, tente adquirir equipamentos melhores dos desafios marcados para você no mapa! +hud-spell = Magias +hud-diary = Diário +hud-free_look_indicator = Câmera livre ativada. Pressione { $key } para desabilitar. +hud-camera_clamp_indicator = Trava vertical de câmera ativada. Pressione { $key } para desabilitar. +hud-auto_walk_indicator = Caminhar/Nadar automático ativado +hud-collect = Coletar +hud-pick_up = Pegar +hud-open = Abrir +hud-use = Usar +hud-mine = Minerar +hud-talk = Falar +hud-trade = Negociar +hud-mount = Montar +hud-sit = Sentar \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/misc.ron b/assets/voxygen/i18n/pt_BR/hud/misc.ron deleted file mode 100644 index 955ace09ae..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/misc.ron +++ /dev/null @@ -1,66 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.do_not_show_on_startup": "Não exibir isto no início", - "hud.show_tips": "Mostrar Dicas", - "hud.quests": "Missões", - "hud.you_died": "Você Morreu", - "hud.waypoint_saved": "Marcador Salvo", - "hud.sp_arrow_txt": "PHs", - "hud.inventory_full": "Inventário Cheio", - "hud.someone_else": "outro alguém", - "hud.another_group": "outro grupo", - "hud.owned_by_for_secs": "Pertence a {name} por {secs} segundos", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] mapeamento de teclas", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] lamparina", - "hud.press_key_to_show_debug_info_fmt": "Pressione {key} para mostrar informações de depuração", - "hud.press_key_to_toggle_keybindings_fmt": "Pressione {key} para mostrar/ocultar teclas mapeadas", - "hud.press_key_to_toggle_debug_info_fmt": "Pressione {key} para mostrar/ocultar informações de depuração", - - // Mensagens de Renascimento - "hud.press_key_to_respawn": r#"Pressione {key} para renascer na última fogueira visitada."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Pressione [ {key} ] para liberar o cursor e clique neste botão!"#, - "hud.tutorial_elements": r#"Criação"#, - -"hud.temp_quest_headline": r#"Olá viajante!"#, -"hud.temp_quest_text": r#"Para o início de sua jornada, você pode começar buscando suprimentos nesta cidade. - -Você é bem-vindo para pegar o que for necessário para sua jornada! - -Olhe no canto inferior direito de sua tela para encontrar diversas coisas como sua mochila, o menu de criação e o mapa. - -A criação te permite constuir armadoras, armas, fazer alimentos e muto mais! - -Os animais selvagens ao redor da cidade são uma boa fonte de Retalhos de Couro(Leather Scraps) para que você crie uma certa proteção contra as intempéries do mundo. - -Assim que você se sentir pronto, tente adquirir equipamentos melhores dos desafios marcados para você no mapa! -"#, - - "hud.spell": "Magias", - // Diary - "hud.diary": "Diário", - - "hud.free_look_indicator": "Câmera livre ativada. Pressione {key} para desabilitar.", - "hud.camera_clamp_indicator": "Trava vertical de câmera ativada. Pressione {key} para desabilitar.", - "hud.auto_walk_indicator": "Caminhar/Nadar automático ativado", - "hud.collect": "Coletar", - "hud.pick_up": "Pegar", - "hud.open": "Abrir", - "hud.use": "Usar", - "hud.mine": "Minerar", - "hud.talk": "Falar", - "hud.trade": "Negociar", - "hud.mount": "Montar", - "hud.sit": "Sentar", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/sct.ftl b/assets/voxygen/i18n/pt_BR/hud/sct.ftl new file mode 100644 index 0000000000..c3a3934ae6 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOQUEADO \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/sct.ron b/assets/voxygen/i18n/pt_BR/hud/sct.ron deleted file mode 100644 index 69f8550133..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOQUEADO", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/settings.ftl b/assets/voxygen/i18n/pt_BR/hud/settings.ftl new file mode 100644 index 0000000000..c43a9bae28 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/settings.ftl @@ -0,0 +1,132 @@ +hud-settings-general = Geral +hud-settings-none = Nenhum +hud-settings-press_behavior-toggle = Alternar +hud-settings-press_behavior-hold = Segurar +hud-settings-help_window = Janela de Ajuda +hud-settings-debug_info = Informações de Depuração +hud-settings-show_hitboxes = Mostrar hitboxes +hud-settings-show_chat = Mostrar chat +hud-settings-show_hotkey_hints = Mostrar atalhos +hud-settings-tips_on_startup = Dicas ao Iniciar +hud-settings-ui_scale = Escala da Interface +hud-settings-relative_scaling = Escala Relativa +hud-settings-custom_scaling = Escala Customizada +hud-settings-crosshair = Mira +hud-settings-opacity = Transparência +hud-settings-hotbar = Hotbar +hud-settings-toggle_shortcuts = Mostar/Ocultar atalhos +hud-settings-buffs_skillbar = Buffs na Barra de Habilidades +hud-settings-buffs_mmap = Buffs no Minimapa +hud-settings-toggle_bar_experience = Mostar/Ocultar Barra de Experiência +hud-settings-scrolling_combat_text = Texto de Combate Deslizante +hud-settings-damage_accumulation_duration = Duração da Acumulação de Dano +hud-settings-incoming_damage = Dano Recebido +hud-settings-incoming_damage_accumulation_duration = Duração da Acumulação de Dano Recebido +hud-settings-round_damage = Arredondar Dano +hud-settings-speech_bubble = Balão de Fala +hud-settings-speech_bubble_self = Mostrar Próprios Balões de Fala +hud-settings-speech_bubble_dark_mode = Balão de Fala Modo Escuro +hud-settings-speech_bubble_icon = Ícone do Balão de Fala +hud-settings-energybar_numbers = Números da Barra de Energia +hud-settings-always_show_bars = Sempre exibir Barra de Energia +hud-settings-experience_numbers = Números de Experiência +hud-settings-accumulate_experience = Acumular Números de Experiência +hud-settings-values = Valores +hud-settings-percentages = Porcentagens +hud-settings-chat = Chat +hud-settings-background_opacity = Transparência de Fundo +hud-settings-chat_character_name = Nomes de Personagem no chat +hud-settings-loading_tips = Dicas na Tela de Carregamento +hud-settings-reset_interface = Restaurar Padrões +hud-settings-pan_sensitivity = Sensibilidade de Rotação +hud-settings-zoom_sensitivity = Sensibilidade do Zoom +hud-settings-camera_clamp_angle = Ângulo para modo de bloqueio da câmera +hud-settings-invert_scroll_zoom = Inverter Rolagem do Zoom +hud-settings-invert_mouse_y_axis = Inverter Eixo Y do Mouse +hud-settings-invert_controller_y_axis = Inverter Controle do Eixo Y +hud-settings-enable_mouse_smoothing = Suavização da Câmera +hud-settings-free_look_behavior = Comportamento da Câmera livre +hud-settings-auto_walk_behavior = Comportamento do caminhar automático +hud-settings-camera_clamp_behavior = Comportamento de bloqueio da câmera +hud-settings-player_physics_behavior = Física do Jogador (experimental) +hud-settings-stop_auto_walk_on_input = Parar caminhar automático em caso de movimento +hud-settings-auto_camera = Câmera automática +hud-settings-bow_zoom = Dar zoom durante o carregamento do arco +hud-settings-reset_gameplay = Restaurar Padrões +hud-settings-view_distance = Alcance de Visão +hud-settings-lod_distance = Distância do Nível de Detalhe (LoD) +hud-settings-sprites_view_distance = Distância de visão dos Sprites +hud-settings-figures_view_distance = Distância de visão das Entidades +hud-settings-maximum_fps = FPS máximo +hud-settings-background_fps = FPS de segundo plano +hud-settings-present_mode = Modo Presente +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Correio +hud-settings-present_mode-immediate = Imediato +hud-settings-fov = Campo de visão (graus) +hud-settings-gamma = Gama +hud-settings-exposure = Exposição +hud-settings-ambiance = Brilho do Ambiente +hud-settings-antialiasing_mode = Modo de AntiAliasing +hud-settings-upscale_factor = Fator de Melhoria +hud-settings-cloud_rendering_mode = Modo de Renderização das Nuvens +hud-settings-fluid_rendering_mode = Modo de Renderização dos Fluidos +hud-settings-fluid_rendering_mode-cheap = Simples +hud-settings-fluid_rendering_mode-shiny = Brilhante +hud-settings-cloud_rendering_mode-minimal = Mínimo +hud-settings-cloud_rendering_mode-low = Baixo +hud-settings-cloud_rendering_mode-medium = Médio +hud-settings-cloud_rendering_mode-high = Alto +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Tela Cheia +hud-settings-fullscreen_mode = Modos de tela cheia +hud-settings-fullscreen_mode-exclusive = Dedicado +hud-settings-fullscreen_mode-borderless = Sem bordas +hud-settings-gpu_profiler = Habilitar temporização de GPU (não suportado globalmente) +hud-settings-particles = Partículas +hud-settings-lossy_terrain_compression = Compressão de terreno com perdas +hud-settings-weapon_trails = Trilhas de Armas +hud-settings-resolution = Resolução +hud-settings-bit_depth = Profundidade de bit +hud-settings-refresh_rate = Taxa de Atualização +hud-settings-lighting_rendering_mode = Modo de Renderização de luzes +hud-settings-lighting_rendering_mode-ashikhmin = Tipo A - Alta +hud-settings-lighting_rendering_mode-blinnphong = Tipo B - Média +hud-settings-lighting_rendering_mode-lambertian = Tipo L - Simples +hud-settings-shadow_rendering_mode = Modo de Renderização de Sombras +hud-settings-shadow_rendering_mode-none = Nenhum +hud-settings-shadow_rendering_mode-cheap = Simples +hud-settings-shadow_rendering_mode-map = Mapa +hud-settings-shadow_rendering_mode-map-resolution = Resolução +hud-settings-rain_occlusion-resolution = Resolução da Obstrução da Chuva +hud-settings-lod_detail = Detalhes +hud-settings-save_window_size = Salvar Dim. da Janela +hud-settings-reset_graphics = Restaurar Padrões +hud-settings-bloom = Bloom +hud-settings-point_glow = Brilho de Ponto +hud-settings-master_volume = Volume Principal +hud-settings-inactive_master_volume_perc = Volume Principal (janela inativa) +hud-settings-music_volume = Volume da Música +hud-settings-sound_effect_volume = Volume dos Efeitos +hud-settings-ambience_volume = Volume Ambiente +hud-settings-audio_device = Dispositivo de Áudio +hud-settings-reset_sound = Restaurar Padrões +hud-settings-english_fallback = Inglês será exibido na falta de traduções +hud-settings-awaitingkey = Pressione uma tecla... +hud-settings-unbound = Nenhum +hud-settings-reset_keybinds = Restaurar Padrões +hud-settings-chat_tabs = Abas de Chat +hud-settings-label = Rótulo: +hud-settings-delete = Deletar +hud-settings-show_all = Exibir Todas +hud-settings-messages = Mensagens +hud-settings-activity = Atividade +hud-settings-death = Morte +hud-settings-group = Grupo +hud-settings-faction = Facção +hud-settings-world = Mundo +hud-settings-region = Região +hud-settings-say = Fala +hud-settings-all = Todos +hud-settings-group_only = Grupo apenas +hud-settings-reset_chat = Restaurar Padrões \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/settings.ron b/assets/voxygen/i18n/pt_BR/hud/settings.ron deleted file mode 100644 index bf53542751..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/settings.ron +++ /dev/null @@ -1,150 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - // Settings - "hud.settings.general": "Geral", - "hud.settings.none": "Nenhum", - "hud.settings.press_behavior.toggle": "Alternar", - "hud.settings.press_behavior.hold": "Segurar", - "hud.settings.help_window": "Janela de Ajuda", - "hud.settings.debug_info": "Informações de Depuração", - "hud.settings.show_hitboxes": "Mostrar hitboxes", - "hud.settings.show_chat": "Mostrar chat", - "hud.settings.show_hotkey_hints": "Mostrar atalhos", - "hud.settings.tips_on_startup": "Dicas ao Iniciar", - "hud.settings.ui_scale": "Escala da Interface", - "hud.settings.relative_scaling": "Escala Relativa", - "hud.settings.custom_scaling": "Escala Customizada", - "hud.settings.crosshair": "Mira", - "hud.settings.opacity": "Transparência", - "hud.settings.hotbar": "Hotbar", - "hud.settings.toggle_shortcuts": "Mostar/Ocultar atalhos", - "hud.settings.buffs_skillbar": "Buffs na Barra de Habilidades", - "hud.settings.buffs_mmap": "Buffs no Minimapa", - "hud.settings.toggle_bar_experience": "Mostar/Ocultar Barra de Experiência", - "hud.settings.scrolling_combat_text": "Texto de Combate Deslizante", - "hud.settings.damage_accumulation_duration": "Duração da Acumulação de Dano", - "hud.settings.incoming_damage": "Dano Recebido", - "hud.settings.incoming_damage_accumulation_duration": "Duração da Acumulação de Dano Recebido", - "hud.settings.round_damage": "Arredondar Dano", - "hud.settings.speech_bubble": "Balão de Fala", - "hud.settings.speech_bubble_self": "Mostrar Próprios Balões de Fala", - "hud.settings.speech_bubble_dark_mode": "Balão de Fala Modo Escuro", - "hud.settings.speech_bubble_icon": "Ícone do Balão de Fala", - "hud.settings.energybar_numbers": "Números da Barra de Energia", - "hud.settings.always_show_bars": "Sempre exibir Barra de Energia", - "hud.settings.experience_numbers": "Números de Experiência", - "hud.settings.accumulate_experience": "Acumular Números de Experiência", - "hud.settings.values": "Valores", - "hud.settings.percentages": "Porcentagens", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Transparência de Fundo", - "hud.settings.chat_character_name": "Nomes de Personagem no chat", - "hud.settings.loading_tips": "Dicas na Tela de Carregamento", - "hud.settings.reset_interface": "Restaurar Padrões", - - "hud.settings.pan_sensitivity": "Sensibilidade de Rotação", - "hud.settings.zoom_sensitivity": "Sensibilidade do Zoom", - "hud.settings.camera_clamp_angle": "Ângulo para modo de bloqueio da câmera", - "hud.settings.invert_scroll_zoom": "Inverter Rolagem do Zoom", - "hud.settings.invert_mouse_y_axis": "Inverter Eixo Y do Mouse", - "hud.settings.invert_controller_y_axis": "Inverter Controle do Eixo Y", - "hud.settings.enable_mouse_smoothing": "Suavização da Câmera", - "hud.settings.free_look_behavior": "Comportamento da Câmera livre", - "hud.settings.auto_walk_behavior": "Comportamento do caminhar automático", - "hud.settings.camera_clamp_behavior": "Comportamento de bloqueio da câmera", - "hud.settings.player_physics_behavior": "Física do Jogador (experimental)", - "hud.settings.stop_auto_walk_on_input": "Parar caminhar automático em caso de movimento", - "hud.settings.auto_camera": "Câmera automática", - "hud.settings.bow_zoom": "Dar zoom durante o carregamento do arco", - "hud.settings.reset_gameplay": "Restaurar Padrões", - - "hud.settings.view_distance": "Alcance de Visão", - "hud.settings.lod_distance": "Distância do Nível de Detalhe (LoD)", - "hud.settings.sprites_view_distance": "Distância de visão dos Sprites", - "hud.settings.figures_view_distance": "Distância de visão das Entidades", - "hud.settings.maximum_fps": "FPS máximo", - "hud.settings.background_fps": "FPS de segundo plano", - "hud.settings.present_mode": "Modo Presente", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Correio", - "hud.settings.present_mode.immediate": "Imediato", - "hud.settings.fov": "Campo de visão (graus)", - "hud.settings.gamma": "Gama", - "hud.settings.exposure": "Exposição", - "hud.settings.ambiance": "Brilho do Ambiente", - "hud.settings.antialiasing_mode": "Modo de AntiAliasing", - "hud.settings.upscale_factor": "Fator de Melhoria", - "hud.settings.cloud_rendering_mode": "Modo de Renderização das Nuvens", - "hud.settings.fluid_rendering_mode": "Modo de Renderização dos Fluidos", - "hud.settings.fluid_rendering_mode.cheap": "Simples", - "hud.settings.fluid_rendering_mode.shiny": "Brilhante", - "hud.settings.cloud_rendering_mode.minimal": "Mínimo", - "hud.settings.cloud_rendering_mode.low": "Baixo", - "hud.settings.cloud_rendering_mode.medium": "Médio", - "hud.settings.cloud_rendering_mode.high": "Alto", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Tela Cheia", - "hud.settings.fullscreen_mode": "Modos de tela cheia", - "hud.settings.fullscreen_mode.exclusive": "Dedicado", - "hud.settings.fullscreen_mode.borderless": "Sem bordas", - "hud.settings.gpu_profiler": "Habilitar temporização de GPU (não suportado globalmente)", - "hud.settings.particles": "Partículas", - "hud.settings.lossy_terrain_compression": "Compressão de terreno com perdas", - "hud.settings.weapon_trails": "Trilhas de Armas", - "hud.settings.resolution": "Resolução", - "hud.settings.bit_depth": "Profundidade de bit", - "hud.settings.refresh_rate": "Taxa de Atualização", - "hud.settings.lighting_rendering_mode": "Modo de Renderização de luzes", - "hud.settings.lighting_rendering_mode.ashikhmin": "Tipo A - Alta ", - "hud.settings.lighting_rendering_mode.blinnphong": "Tipo B - Média ", - "hud.settings.lighting_rendering_mode.lambertian": "Tipo L - Simples", - "hud.settings.shadow_rendering_mode": "Modo de Renderização de Sombras", - "hud.settings.shadow_rendering_mode.none": "Nenhum", - "hud.settings.shadow_rendering_mode.cheap": "Simples", - "hud.settings.shadow_rendering_mode.map": "Mapa", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolução", - "hud.settings.rain_occlusion.resolution": "Resolução da Obstrução da Chuva", - "hud.settings.lod_detail": "Detalhes", - "hud.settings.save_window_size": "Salvar Dim. da Janela", - "hud.settings.reset_graphics": "Restaurar Padrões", - "hud.settings.bloom": "Bloom", - "hud.settings.point_glow": "Brilho de Ponto", - - "hud.settings.master_volume": "Volume Principal", - "hud.settings.inactive_master_volume_perc": "Volume Principal (janela inativa)", - "hud.settings.music_volume": "Volume da Música", - "hud.settings.sound_effect_volume": "Volume dos Efeitos", - "hud.settings.ambience_volume": "Volume Ambiente", - "hud.settings.audio_device": "Dispositivo de Áudio", - "hud.settings.reset_sound": "Restaurar Padrões", - - "hud.settings.english_fallback": "Inglês será exibido na falta de traduções", - - "hud.settings.awaitingkey": "Pressione uma tecla...", - "hud.settings.unbound": "Nenhum", - "hud.settings.reset_keybinds": "Restaurar Padrões", - - "hud.settings.chat_tabs": "Abas de Chat", - "hud.settings.label": "Rótulo:", - "hud.settings.delete": "Deletar", - "hud.settings.show_all": "Exibir Todas", - "hud.settings.messages": "Mensagens", - "hud.settings.activity": "Atividade", - "hud.settings.death": "Morte", - "hud.settings.group": "Grupo", - "hud.settings.faction": "Facção", - "hud.settings.world": "Mundo", - "hud.settings.region": "Região", - "hud.settings.say": "Fala", - "hud.settings.all": "Todos", - "hud.settings.group_only": "Grupo apenas", - "hud.settings.reset_chat" : "Restaurar Padrões", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/skills.ftl b/assets/voxygen/i18n/pt_BR/hud/skills.ftl new file mode 100644 index 0000000000..dfdd3f0a91 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Novo Ponto de Habilidade +hud-skill-sp_available = { $number } PHs disponíveis +hud-skill-not_unlocked = Não desbloqueado +hud-skill-req_sp ={"\u000A"} + + Requer { $number } PHs +hud-skill-inc_health_title = Aumentar Saúde +hud-skill-inc_health = Aumentar saúde máxima por { $boost }{ $SP } +hud-skill-inc_energy_title = Aumentar Stamina +hud-skill-inc_energy = Aumentar stamina máxima por { $boost }{ $SP } +hud-skill-unlck_sword_title = Desbloquear Espada +hud-skill-unlck_sword = Desbloquear habilidades de espada{ $SP } +hud-skill-unlck_axe_title = Desbloquear Machado +hud-skill-unlck_axe = Desbloquear habilidades de Machado{ $SP } +hud-skill-unlck_hammer_title = Desbloquear Martelo +hud-skill-unlck_hammer = Desbloquear Habilidades de Martelo{ $SP } +hud-skill-unlck_bow_title = Desbloquear Arco +hud-skill-unlck_bow = Desbloquear Habilidades de Arco{ $SP } +hud-skill-unlck_staff_title = Desbloquear Cajado +hud-skill-unlck_staff = Desbloquear Habilidades de Cajado{ $SP } +hud-skill-unlck_sceptre_title = Desbloquear Cetro +hud-skill-unlck_sceptre = Desbloquear Habilidades de Cetro{ $SP } +hud-skill-dodge_title = Esquiva +hud-skill-dodge = Rolagens de esquiva são ativadas com o clique do meio, garantindo imunidade temporária a ataques corpo a corpo quando rolando +hud-skill-roll_energy_title = Custo de Stamina da Rolagem +hud-skill-roll_energy = Rolar usa { $boost }% menos de stamina{ $SP } +hud-skill-roll_speed_title = Velocidade da Rolagem +hud-skill-roll_speed = Rola { $boost }% mais rápido{ $SP } +hud-skill-roll_dur_title = Duração da Rolagem +hud-skill-roll_dur = Rolagem dura { $boost }% mais tempo{ $SP } +hud-skill-climbing_title = Escalada +hud-skill-climbing = Pular mais alto +hud-skill-climbing_cost_title = Custo da Escalada +hud-skill-climbing_cost = Escalar usa { $boost }% menos stamina{ $SP } +hud-skill-climbing_speed_title = Velocidade da Escalada +hud-skill-climbing_speed = Escalar { $boost }% mais rápido{ $SP } +hud-skill-swim_title = Natação +hud-skill-swim = Permite Nadar +hud-skill-swim_speed_title = Velocidade ao nadar +hud-skill-swim_speed = Nadar { $boost }% mais rápido{ $SP } +hud-skill-sc_lifesteal_title = Raio de Roubo Vital +hud-skill-sc_lifesteal = Drena a vida de seus inimigos +hud-skill-sc_lifesteal_damage_title = Dano +hud-skill-sc_lifesteal_damage = Causa { $boost }% mais dano{ $SP } +hud-skill-sc_lifesteal_range_title = Alcance +hud-skill-sc_lifesteal_range = Seu feixe alcança { $boost }% mais longe{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Drenar vida +hud-skill-sc_lifesteal_lifesteal = Converta mais { $boost }% de seu dano em vida{ $SP } +hud-skill-sc_lifesteal_regen_title = Regeneração de Stamina +hud-skill-sc_lifesteal_regen = Reabasteça sua stamina em mais { $boost }%{ $SP } +hud-skill-sc_heal_title = Aura de Cura +hud-skill-sc_heal = Cura seus aliados usando o sangue dos inimigos, requer combo para ativar +hud-skill-sc_heal_heal_title = Cura +hud-skill-sc_heal_heal = Aumenta a quantidade de cura a outros em { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Custo da Cura +hud-skill-sc_heal_cost = Utiliza { $boost }% a menos de energia durante curas{ $SP } +hud-skill-sc_heal_duration_title = Duração +hud-skill-sc_heal_duration = Os efeitos da aura de cura duram { $boost }% a mais{ $SP } +hud-skill-sc_heal_range_title = Alcance +hud-skill-sc_heal_range = Seu raio alcança { $boost }% mais longe{ $SP } +hud-skill-sc_wardaura_unlock_title = Desbloquear Aura Protetora +hud-skill-sc_wardaura_unlock = Permite que você proteja seus aliados contra ataques inimigos{ $SP } +hud-skill-sc_wardaura_strength_title = Força +hud-skill-sc_wardaura_strength = A força da sua proteção aumenta em { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Duração +hud-skill-sc_wardaura_duration = Os efeitos da sua proteção duram { $boost }% a mais{ $SP } +hud-skill-sc_wardaura_range_title = Alcance +hud-skill-sc_wardaura_range = Sua Aura Protetora alcança { $boost }% mais longe{ $SP } +hud-skill-sc_wardaura_cost_title = Custo da Aura Protetora +hud-skill-sc_wardaura_cost = A utilização da Aura Protetora requer { $boost }% menos energia{ $SP } +hud-skill-st_shockwave_range_title = Alcance da Onda de Choque +hud-skill-st_shockwave_range = Arremessa coisas que antes estavam fora de alcance, aumentando-o em { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Custo da Onda de Choque +hud-skill-st_shockwave_cost = Reduz custo de energia ao arremessar aldeões indefesos em { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Empurrão da Onda de Choque +hud-skill-st_shockwave_knockback = Aumenta potencial do empurrão em { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Dano da Onda de Choque +hud-skill-st_shockwave_damage = Aumenta o dano em { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Desbloqueio da Onda de Choque +hud-skill-st_shockwave_unlock = Libera habilidade de empurrar adversários longe utilizando fogo{ $SP } +hud-skill-st_flamethrower_title = Lança-chamas +hud-skill-st_flamethrower = Joga labaredas, e cozinha todos eles +hud-skill-st_flame_velocity_title = Velocidade do Fogo +hud-skill-st_flame_velocity = Fogo mais rápido, { $boost }% mais rápido{ $SP } +hud-skill-st_flamethrower_range_title = Alcance do Lança Chamas +hud-skill-st_flamethrower_range = Quando parecem que não vão alcançar, as chamas avançam { $boost }% a mais{ $SP } +hud-skill-st_energy_drain_title = Gasto de Energia +hud-skill-st_energy_drain = Reduz a taxa de gasto de energia em { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Dano do Lança Chamas +hud-skill-st_flamethrower_damage = Aumenta o dano em { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Raio da Explosão +hud-skill-st_explosion_radius = Quanto maior melhor, e o raio da explosão é aumentado em { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Regeneração de stamina +hud-skill-st_energy_regen = Aumenta o ganho de stamina em { $boost }%{ $SP } +hud-skill-st_fireball_title = Bola de fogo +hud-skill-st_fireball = Brinque de perseguir seus inimigos +hud-skill-st_damage_title = Dano +hud-skill-st_damage = Aumenta o dano em { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Velocidade do Projétil +hud-skill-bow_projectile_speed = Permite atirar mais flechas, com velocidade aumentada em { $boost }%{ $SP } +hud-skill-bow_charged_title = Disparo carregado +hud-skill-bow_charged = Porque você esperou mais +hud-skill-bow_charged_damage_title = Dano da Carga +hud-skill-bow_charged_damage = Aumenta o Dano em { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Regeneração Carregada +hud-skill-bow_charged_energy_regen = Aumenta recuperação de energia em { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Empurrão Aprimorado +hud-skill-bow_charged_knockback = Empurra inimigos { $boost }% mais longe{ $SP } +hud-skill-bow_charged_speed_title = Velocidade da Carga +hud-skill-bow_charged_speed = Aumenta a velocidade de carga dos ataques em { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Velocidade de Movimentação em Carga +hud-skill-bow_charged_move = Aumenta a velocidade de movimentação durante o carregamento do ataque em { $boost }%{ $SP } +hud-skill-bow_repeater_title = Repetidor +hud-skill-bow_repeater = Atira mais rápido quanto mais você continuar atirando +hud-skill-bow_repeater_damage_title = Dano do Repetidor +hud-skill-bow_repeater_damage = Aumenta o dano em { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Custo do Repetidor +hud-skill-bow_repeater_cost = Reduz o custo de energia da repetição em { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Velocidade do Repetidor +hud-skill-bow_repeater_speed = Aumenta a taxa na qual você atira flechas em { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Desbloquear Shotgun +hud-skill-bow_shotgun_unlock = Desbloqueia a habilidade de atirar múltiplas flechas ve uma vez{ $SP } +hud-skill-bow_shotgun_damage_title = Dano da Shotgun +hud-skill-bow_shotgun_damage = Aumenta o dano infligido em { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Custo da Shotgun +hud-skill-bow_shotgun_cost = Diminui o custo da shotgun em { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Flechas da Shotgun +hud-skill-bow_shotgun_arrow_count = Aumenta o número de flechas na sequência em { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Espalhamento da Shotgun +hud-skill-bow_shotgun_spread = Diminui quanto as flechas se espalham em { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Raio do Salto +hud-skill-hmr_leap_radius = Aumenta o raio da pancada no chão em { $boost } metro{ $SP } +hud-skill-hmr_leap_distance_title = Distância do Salto +hud-skill-hmr_leap_distance = Aumenta a Distância do Salto em { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Custo do Salto +hud-skill-hmr_leap_cost = Reduz custo do salto em { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Empurrão do Salto +hud-skill-hmr_leap_knockback = Aumenta empurrão do salto em { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Dano do Salto +hud-skill-hmr_leap_damage = Aumenta dano do salto em { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Desbloquear Salto +hud-skill-hmr_unlock_leap = Desbloqueia o salto{ $SP } +hud-skill-hmr_charged_melee_title = Carga Corpo a Corpo +hud-skill-hmr_charged_melee = Ataque de martelo com carga +hud-skill-hmr_charged_rate_title = Taxa de Carga +hud-skill-hmr_charged_rate = Aumenta a taxa de carga em { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Dreno de Ataque Corpo a Corpo Carregado +hud-skill-hmr_charged_melee_nrg_drain = Reduz dreno de energia em { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Dano de Ataque Corpo a Corpo Carregado +hud-skill-hmr_charged_melee_damage = Aumenta dano de ataque carregado em { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Empurrão em Ataque Carregado +hud-skill-hmr_charged_melee_knockback = Aumenta massivamente o potencial de um empurrão em { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Ataque único +hud-skill-hmr_single_strike = Único como você é +hud-skill-hmr_single_strike_regen_title = Regeneração em Ataque Único +hud-skill-hmr_single_strike_regen = Aumenta stamina a cada ataque contínuo{ $SP } +hud-skill-hmr_single_strike_speed_title = Velocidade de Ataque Único +hud-skill-hmr_single_strike_speed = Aumenta a velocidade de cada ataque contínuo{ $SP } +hud-skill-hmr_single_strike_damage_title = Dano de Ataque Único +hud-skill-hmr_single_strike_damage = Aumenta o dano de cada ataque contínuo{ $SP } +hud-skill-hmr_single_strike_knockback_title = Empurrão em Ataque Único +hud-skill-hmr_single_strike_knockback = Aumenta o potencial de empurrar em { $boost }% durante ataques contínuo{ $SP } +hud-skill-sw_trip_str_title = Ataque triplo +hud-skill-sw_trip_str = Ataque até três vezes consecutivas +hud-skill-sw_trip_str_combo_title = Combo Ataque Triplo +hud-skill-sw_trip_str_combo = Desbloqueia combos durante ataque triplo{ $SP } +hud-skill-sw_trip_str_dmg_title = Dano do Ataque Triplo +hud-skill-sw_trip_str_dmg = Aumenta o dano em cada ataque sucessivo{ $SP } +hud-skill-sw_trip_str_sp_title = Velocidade do Ataque Triplo +hud-skill-sw_trip_str_sp = Aumenta a velocidade em cada ataque sucessivo{ $SP } +hud-skill-sw_trip_str_reg_title = Regeneração do Ataque Triplo +hud-skill-sw_trip_str_reg = Aumenta a regeneração de stamina em cada ataque sucessivo{ $SP } +hud-skill-sw_dash_title = Esquiva +hud-skill-sw_dash = Atravessa os seus inimigos +hud-skill-sw_dash_dmg_title = Dano da Investida +hud-skill-sw_dash_dmg = Aumenta o dano inicial da investida em { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Dreno da Investida +hud-skill-sw_dash_drain = Reduz dreno de energia da investida em { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Custo da Investida +hud-skill-sw_dash_cost = Reduz custo inicial da investida em { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Velocidade de Investida +hud-skill-sw_dash_speed = Aumenta a velocidade durante a investida em { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Intestida Trespassada +hud-skill-sw_dash_charge_through = Permite que você atravésse os primeiros inimigos que você atinge{ $SP } +hud-skill-sw_dash_scale_title = Investida Acumulada +hud-skill-sw_dash_scale = Aumenta o acumulo de dano da investida em { $boost }%{ $SP } +hud-skill-sw_spin_title = Liberar Rodopio +hud-skill-sw_spin = Libera rodopio de espada{ $SP } +hud-skill-sw_spin_dmg_title = Dano do Rodopio +hud-skill-sw_spin_dmg = Aumenta o dano do rodopio em { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Velocidade do Rodopio +hud-skill-sw_spin_spd = Auenta a velocidade dos giros em { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Custo do Rodopio +hud-skill-sw_spin_cost = Reduz o custo de energia de cada giro em { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Roda Roda Roda... +hud-skill-sw_spin_spins = Aumenta o número de vezes que você consegue girar{ $SP } +hud-skill-sw_interrupt_title = Interrompendo Ataques +hud-skill-sw_interrupt = Permite que você cancele imediatamente um ataque executando outro ataque{ $SP } +hud-skill-axe_double_strike_title = Ataque duplo +hud-skill-axe_double_strike = Destrua os vilões +hud-skill-axe_double_strike_combo_title = Combo Ataque Duplo +hud-skill-axe_double_strike_combo = Desbloqueia um ataque duplo{ $SP } +hud-skill-axe_double_strike_damage_title = Dano do Ataque Duplo +hud-skill-axe_double_strike_damage = Aumenta o dano em cada ataque sucessivo{ $SP } +hud-skill-axe_double_strike_speed_title = Velocidade do Ataque Duplo +hud-skill-axe_double_strike_speed = Aumenta a velocidade em cada ataque sucessivo{ $SP } +hud-skill-axe_double_strike_regen_title = Regeneração do Ataque Duplo +hud-skill-axe_double_strike_regen = Aumenta a regeneração de stamina em cada ataque sucessivo{ $SP } +hud-skill-axe_spin_title = Rodopio do Machado +hud-skill-axe_spin = Você gira o machado ... +hud-skill-axe_infinite_axe_spin_title = Rodopio de Machado Infinito +hud-skill-axe_infinite_axe_spin = Rodopia infinitamente contanto que possua energia para tal{ $SP } +hud-skill-axe_spin_damage_title = Dano do Rodopio +hud-skill-axe_spin_damage = Aumenta o dano do rodopio em { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Rodopio Helicóptero +hud-skill-axe_spin_helicopter = Adiciona queda lenta aos rodopios e você cai mais devagar{ $SP } +hud-skill-axe_spin_speed_title = Velocidade do Rodopio +hud-skill-axe_spin_speed = Aumenta a velocidade do rodopio em { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Custo do Rodopio +hud-skill-axe_spin_cost = Reduz custo de stamina do rodopio em { $boost }% +hud-skill-axe_unlock_leap_title = Desbloquear Salto +hud-skill-axe_unlock_leap = Desbloqueia salto com rodopio{ $SP } +hud-skill-axe_leap_damage_title = Dano do Salto +hud-skill-axe_leap_damage = Aumenta dano do salto em { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Empurrão do Salto +hud-skill-axe_leap_knockback = Aumenta o empurrão do salto em { $boost }% +hud-skill-axe_leap_cost_title = Custo do Salto +hud-skill-axe_leap_cost = Reduz custo do salto em { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Distancia do Salto +hud-skill-axe_leap_distance = Aumenta a distância do salto em { $boost }%{ $SP } +hud-skill-mining_title = Mineração +hud-skill-pick_strike_title = Golpe de Picareta +hud-skill-pick_strike = Acerta rochas com a picareta para retirar minérios, gemas e experiência +hud-skill-pick_strike_speed_title = Velocidade do Golpe de Picareta +hud-skill-pick_strike_speed = Minera mais rápido{ $SP } +hud-skill-pick_strike_oregain_title = Rendimento de Minério com a Picareta +hud-skill-pick_strike_oregain = Change de ganhar minérios extras ({ $boost }% por nível){ $SP } +hud-skill-pick_strike_gemgain_title = Rendimento de Gemas com a Picareta +hud-skill-pick_strike_gemgain = Change de ganhar gemas extras ({ $boost }% por nível){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/skills.ron b/assets/voxygen/i18n/pt_BR/hud/skills.ron deleted file mode 100644 index a2fca13367..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.rank_up": "Novo Ponto de Habilidade", - "hud.skill.sp_available": "{number} PHs disponíveis", - "hud.skill.not_unlocked": "Não desbloqueado", - "hud.skill.req_sp": "\n\nRequer {number} PHs", - // Habilidades - // Geral - "hud.skill.inc_health_title": "Aumentar Saúde", - "hud.skill.inc_health": "Aumentar saúde máxima por {boost}{SP}", - "hud.skill.inc_energy_title": "Aumentar Stamina", - "hud.skill.inc_energy": "Aumentar stamina máxima por {boost}{SP}", - "hud.skill.unlck_sword_title": "Desbloquear Espada", - "hud.skill.unlck_sword": "Desbloquear habilidades de espada{SP}", - "hud.skill.unlck_axe_title": "Desbloquear Machado", - "hud.skill.unlck_axe": "Desbloquear habilidades de Machado{SP}", - "hud.skill.unlck_hammer_title": "Desbloquear Martelo", - "hud.skill.unlck_hammer": "Desbloquear Habilidades de Martelo{SP}", - "hud.skill.unlck_bow_title": "Desbloquear Arco", - "hud.skill.unlck_bow": "Desbloquear Habilidades de Arco{SP}", - "hud.skill.unlck_staff_title": "Desbloquear Cajado", - "hud.skill.unlck_staff": "Desbloquear Habilidades de Cajado{SP}", - "hud.skill.unlck_sceptre_title": "Desbloquear Cetro", - "hud.skill.unlck_sceptre": "Desbloquear Habilidades de Cetro{SP}", - "hud.skill.dodge_title": "Esquiva", - "hud.skill.dodge": "Rolagens de esquiva são ativadas com o clique do meio, garantindo imunidade temporária a ataques corpo a corpo quando rolando", - "hud.skill.roll_energy_title": "Custo de Stamina da Rolagem", - "hud.skill.roll_energy": "Rolar usa {boost}% menos de stamina{SP}", - "hud.skill.roll_speed_title": "Velocidade da Rolagem", - "hud.skill.roll_speed": "Rola {boost}% mais rápido{SP}", - "hud.skill.roll_dur_title": "Duração da Rolagem", - "hud.skill.roll_dur": "Rolagem dura {boost}% mais tempo{SP}", - "hud.skill.climbing_title": "Escalada", - "hud.skill.climbing": "Pular mais alto", - "hud.skill.climbing_cost_title": "Custo da Escalada", - "hud.skill.climbing_cost": "Escalar usa {boost}% menos stamina{SP}", - "hud.skill.climbing_speed_title": "Velocidade da Escalada", - "hud.skill.climbing_speed": "Escalar {boost}% mais rápido{SP}", - "hud.skill.swim_title": "Natação", - "hud.skill.swim": "Permite Nadar", - "hud.skill.swim_speed_title": "Velocidade ao nadar", - "hud.skill.swim_speed": "Nadar {boost}% mais rápido{SP}", - // Cetro - "hud.skill.sc_lifesteal_title": "Raio de Roubo Vital", - "hud.skill.sc_lifesteal": "Drena a vida de seus inimigos ", - "hud.skill.sc_lifesteal_damage_title": "Dano", - "hud.skill.sc_lifesteal_damage": "Causa {boost}% mais dano{SP}", - "hud.skill.sc_lifesteal_range_title": "Alcance", - "hud.skill.sc_lifesteal_range": "Seu feixe alcança {boost}% mais longe{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Drenar vida", - "hud.skill.sc_lifesteal_lifesteal": "Converta mais {boost}% de seu dano em vida{SP}", - "hud.skill.sc_lifesteal_regen_title": "Regeneração de Stamina", - "hud.skill.sc_lifesteal_regen": "Reabasteça sua stamina em mais {boost}%{SP}", - "hud.skill.sc_heal_title": "Aura de Cura", - "hud.skill.sc_heal": "Cura seus aliados usando o sangue dos inimigos, requer combo para ativar", - "hud.skill.sc_heal_heal_title": "Cura", - "hud.skill.sc_heal_heal": "Aumenta a quantidade de cura a outros em {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Custo da Cura", - "hud.skill.sc_heal_cost": "Utiliza {boost}% a menos de energia durante curas{SP}", - "hud.skill.sc_heal_duration_title": "Duração", - "hud.skill.sc_heal_duration": "Os efeitos da aura de cura duram {boost}% a mais{SP}", - "hud.skill.sc_heal_range_title": "Alcance", - "hud.skill.sc_heal_range": "Seu raio alcança {boost}% mais longe{SP}", - "hud.skill.sc_wardaura_unlock_title": "Desbloquear Aura Protetora", - "hud.skill.sc_wardaura_unlock": "Permite que você proteja seus aliados contra ataques inimigos{SP}", - "hud.skill.sc_wardaura_strength_title": "Força", - "hud.skill.sc_wardaura_strength": "A força da sua proteção aumenta em {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Duração", - "hud.skill.sc_wardaura_duration": "Os efeitos da sua proteção duram {boost}% a mais{SP}", - "hud.skill.sc_wardaura_range_title": "Alcance", - "hud.skill.sc_wardaura_range": "Sua Aura Protetora alcança {boost}% mais longe{SP}", - "hud.skill.sc_wardaura_cost_title": "Custo da Aura Protetora", - "hud.skill.sc_wardaura_cost": "A utilização da Aura Protetora requer {boost}% menos energia{SP}", - // Cajado - "hud.skill.st_shockwave_range_title" : "Alcance da Onda de Choque", - "hud.skill.st_shockwave_range" : "Arremessa coisas que antes estavam fora de alcance, aumentando-o em {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Custo da Onda de Choque", - "hud.skill.st_shockwave_cost" : "Reduz custo de energia ao arremessar aldeões indefesos em {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Empurrão da Onda de Choque", - "hud.skill.st_shockwave_knockback" : "Aumenta potencial do empurrão em {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Dano da Onda de Choque", - "hud.skill.st_shockwave_damage" : "Aumenta o dano em {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Desbloqueio da Onda de Choque", - "hud.skill.st_shockwave_unlock" : "Libera habilidade de empurrar adversários longe utilizando fogo{SP}", - "hud.skill.st_flamethrower_title" : "Lança-chamas", - "hud.skill.st_flamethrower" : "Joga labaredas, e cozinha todos eles", - "hud.skill.st_flame_velocity_title" : "Velocidade do Fogo", - "hud.skill.st_flame_velocity" : "Fogo mais rápido, {boost}% mais rápido{SP}", - "hud.skill.st_flamethrower_range_title" : "Alcance do Lança Chamas", - "hud.skill.st_flamethrower_range" : "Quando parecem que não vão alcançar, as chamas avançam {boost}% a mais{SP}", - "hud.skill.st_energy_drain_title" : "Gasto de Energia", - "hud.skill.st_energy_drain" : "Reduz a taxa de gasto de energia em {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Dano do Lança Chamas", - "hud.skill.st_flamethrower_damage" : "Aumenta o dano em {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Raio da Explosão", - "hud.skill.st_explosion_radius" : "Quanto maior melhor, e o raio da explosão é aumentado em {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Regeneração de stamina", - "hud.skill.st_energy_regen" : "Aumenta o ganho de stamina em {boost}%{SP}", - "hud.skill.st_fireball_title" : "Bola de fogo", - "hud.skill.st_fireball" : "Brinque de perseguir seus inimigos", - "hud.skill.st_damage_title" : "Dano", - "hud.skill.st_damage" : "Aumenta o dano em {boost}%{SP}", - // Arco - "hud.skill.bow_projectile_speed_title" : "Velocidade do Projétil", - "hud.skill.bow_projectile_speed" : "Permite atirar mais flechas, com velocidade aumentada em {boost}%{SP}", - "hud.skill.bow_charged_title" : "Disparo carregado", - "hud.skill.bow_charged" : "Porque você esperou mais", - "hud.skill.bow_charged_damage_title" : "Dano da Carga", - "hud.skill.bow_charged_damage" : "Aumenta o Dano em {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Regeneração Carregada", - "hud.skill.bow_charged_energy_regen" : "Aumenta recuperação de energia em {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Empurrão Aprimorado", - "hud.skill.bow_charged_knockback" : "Empurra inimigos {boost}% mais longe{SP}", - "hud.skill.bow_charged_speed_title" : "Velocidade da Carga", - "hud.skill.bow_charged_speed" : "Aumenta a velocidade de carga dos ataques em {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Velocidade de Movimentação em Carga", - "hud.skill.bow_charged_move" : "Aumenta a velocidade de movimentação durante o carregamento do ataque em {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Repetidor", - "hud.skill.bow_repeater" : "Atira mais rápido quanto mais você continuar atirando", - "hud.skill.bow_repeater_damage_title" : "Dano do Repetidor", - "hud.skill.bow_repeater_damage" : "Aumenta o dano em {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Custo do Repetidor", - "hud.skill.bow_repeater_cost" : "Reduz o custo de energia da repetição em {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Velocidade do Repetidor", - "hud.skill.bow_repeater_speed" : "Aumenta a taxa na qual você atira flechas em {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Desbloquear Shotgun", - "hud.skill.bow_shotgun_unlock" : "Desbloqueia a habilidade de atirar múltiplas flechas ve uma vez{SP}", - "hud.skill.bow_shotgun_damage_title" : "Dano da Shotgun", - "hud.skill.bow_shotgun_damage" : "Aumenta o dano infligido em {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Custo da Shotgun", - "hud.skill.bow_shotgun_cost" : "Diminui o custo da shotgun em {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Flechas da Shotgun", - "hud.skill.bow_shotgun_arrow_count" : "Aumenta o número de flechas na sequência em {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Espalhamento da Shotgun", - "hud.skill.bow_shotgun_spread" : "Diminui quanto as flechas se espalham em {boost}%{SP}", - // Martelo - "hud.skill.hmr_leap_radius_title" : "Raio do Salto", - "hud.skill.hmr_leap_radius" : "Aumenta o raio da pancada no chão em {boost} metro{SP}", - "hud.skill.hmr_leap_distance_title" : "Distância do Salto", - "hud.skill.hmr_leap_distance" : "Aumenta a Distância do Salto em {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Custo do Salto", - "hud.skill.hmr_leap_cost" : "Reduz custo do salto em {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Empurrão do Salto", - "hud.skill.hmr_leap_knockback" : "Aumenta empurrão do salto em {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Dano do Salto", - "hud.skill.hmr_leap_damage" : "Aumenta dano do salto em {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Desbloquear Salto", - "hud.skill.hmr_unlock_leap" : "Desbloqueia o salto{SP}", - "hud.skill.hmr_charged_melee_title" : "Carga Corpo a Corpo", - "hud.skill.hmr_charged_melee" : "Ataque de martelo com carga", - "hud.skill.hmr_charged_rate_title" : "Taxa de Carga", - "hud.skill.hmr_charged_rate" : "Aumenta a taxa de carga em {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Dreno de Ataque Corpo a Corpo Carregado", - "hud.skill.hmr_charged_melee_nrg_drain" : "Reduz dreno de energia em {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Dano de Ataque Corpo a Corpo Carregado", - "hud.skill.hmr_charged_melee_damage" : "Aumenta dano de ataque carregado em {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Empurrão em Ataque Carregado", - "hud.skill.hmr_charged_melee_knockback" : "Aumenta massivamente o potencial de um empurrão em {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Ataque único", - "hud.skill.hmr_single_strike" : "Único como você é", - "hud.skill.hmr_single_strike_regen_title" : "Regeneração em Ataque Único", - "hud.skill.hmr_single_strike_regen" : "Aumenta stamina a cada ataque contínuo{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Velocidade de Ataque Único", - "hud.skill.hmr_single_strike_speed" : "Aumenta a velocidade de cada ataque contínuo{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Dano de Ataque Único", - "hud.skill.hmr_single_strike_damage" : "Aumenta o dano de cada ataque contínuo{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Empurrão em Ataque Único", - "hud.skill.hmr_single_strike_knockback" : "Aumenta o potencial de empurrar em {boost}% durante ataques contínuo{SP}", - // Espada - "hud.skill.sw_trip_str_title": "Ataque triplo", - "hud.skill.sw_trip_str": "Ataque até três vezes consecutivas", - "hud.skill.sw_trip_str_combo_title": "Combo Ataque Triplo", - "hud.skill.sw_trip_str_combo": "Desbloqueia combos durante ataque triplo{SP}", - "hud.skill.sw_trip_str_dmg_title": "Dano do Ataque Triplo", - "hud.skill.sw_trip_str_dmg": "Aumenta o dano em cada ataque sucessivo{SP}", - "hud.skill.sw_trip_str_sp_title": "Velocidade do Ataque Triplo", - "hud.skill.sw_trip_str_sp": "Aumenta a velocidade em cada ataque sucessivo{SP}", - "hud.skill.sw_trip_str_reg_title": "Regeneração do Ataque Triplo", - "hud.skill.sw_trip_str_reg": "Aumenta a regeneração de stamina em cada ataque sucessivo{SP}", - "hud.skill.sw_dash_title": "Esquiva", - "hud.skill.sw_dash": "Atravessa os seus inimigos", - "hud.skill.sw_dash_dmg_title": "Dano da Investida", - "hud.skill.sw_dash_dmg": "Aumenta o dano inicial da investida em {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Dreno da Investida", - "hud.skill.sw_dash_drain": "Reduz dreno de energia da investida em {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Custo da Investida", - "hud.skill.sw_dash_cost": "Reduz custo inicial da investida em {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Velocidade de Investida", - "hud.skill.sw_dash_speed": "Aumenta a velocidade durante a investida em {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Intestida Trespassada", - "hud.skill.sw_dash_charge_through": "Permite que você atravésse os primeiros inimigos que você atinge{SP}", - "hud.skill.sw_dash_scale_title": "Investida Acumulada", - "hud.skill.sw_dash_scale": "Aumenta o acumulo de dano da investida em {boost}%{SP}", - "hud.skill.sw_spin_title": "Liberar Rodopio", - "hud.skill.sw_spin": "Libera rodopio de espada{SP}", - "hud.skill.sw_spin_dmg_title": "Dano do Rodopio", - "hud.skill.sw_spin_dmg": "Aumenta o dano do rodopio em {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Velocidade do Rodopio", - "hud.skill.sw_spin_spd": "Auenta a velocidade dos giros em {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Custo do Rodopio", - "hud.skill.sw_spin_cost": "Reduz o custo de energia de cada giro em {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Roda Roda Roda...", - "hud.skill.sw_spin_spins": "Aumenta o número de vezes que você consegue girar{SP}", - "hud.skill.sw_interrupt_title": "Interrompendo Ataques", - "hud.skill.sw_interrupt": "Permite que você cancele imediatamente um ataque executando outro ataque{SP}", - //Machado - "hud.skill.axe_double_strike_title": "Ataque duplo", - "hud.skill.axe_double_strike": "Destrua os vilões", - "hud.skill.axe_double_strike_combo_title": "Combo Ataque Duplo", - "hud.skill.axe_double_strike_combo": "Desbloqueia um ataque duplo{SP}", - "hud.skill.axe_double_strike_damage_title": "Dano do Ataque Duplo", - "hud.skill.axe_double_strike_damage": "Aumenta o dano em cada ataque sucessivo{SP}", - "hud.skill.axe_double_strike_speed_title": "Velocidade do Ataque Duplo", - "hud.skill.axe_double_strike_speed": "Aumenta a velocidade em cada ataque sucessivo{SP}", - "hud.skill.axe_double_strike_regen_title": "Regeneração do Ataque Duplo", - "hud.skill.axe_double_strike_regen": "Aumenta a regeneração de stamina em cada ataque sucessivo{SP}", - "hud.skill.axe_spin_title": "Rodopio do Machado", - "hud.skill.axe_spin": "Você gira o machado ...", - "hud.skill.axe_infinite_axe_spin_title": "Rodopio de Machado Infinito", - "hud.skill.axe_infinite_axe_spin": "Rodopia infinitamente contanto que possua energia para tal{SP}", - "hud.skill.axe_spin_damage_title": "Dano do Rodopio", - "hud.skill.axe_spin_damage": "Aumenta o dano do rodopio em {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Rodopio Helicóptero", - "hud.skill.axe_spin_helicopter": "Adiciona queda lenta aos rodopios e você cai mais devagar{SP}", - "hud.skill.axe_spin_speed_title": "Velocidade do Rodopio", - "hud.skill.axe_spin_speed": "Aumenta a velocidade do rodopio em {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Custo do Rodopio", - "hud.skill.axe_spin_cost": "Reduz custo de stamina do rodopio em {boost}%", - "hud.skill.axe_unlock_leap_title": "Desbloquear Salto", - "hud.skill.axe_unlock_leap": "Desbloqueia salto com rodopio{SP}", - "hud.skill.axe_leap_damage_title": "Dano do Salto", - "hud.skill.axe_leap_damage": "Aumenta dano do salto em {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Empurrão do Salto", - "hud.skill.axe_leap_knockback": "Aumenta o empurrão do salto em {boost}%", - "hud.skill.axe_leap_cost_title": "Custo do Salto", - "hud.skill.axe_leap_cost": "Reduz custo do salto em {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Distancia do Salto", - "hud.skill.axe_leap_distance": "Aumenta a distância do salto em {boost}%{SP}", - // Mineração - "hud.skill.mining_title": "Mineração", - "hud.skill.pick_strike_title": "Golpe de Picareta", - "hud.skill.pick_strike": "Acerta rochas com a picareta para retirar minérios, gemas e experiência", - "hud.skill.pick_strike_speed_title": "Velocidade do Golpe de Picareta", - "hud.skill.pick_strike_speed": "Minera mais rápido{SP}", - "hud.skill.pick_strike_oregain_title": "Rendimento de Minério com a Picareta", - "hud.skill.pick_strike_oregain": "Change de ganhar minérios extras ({boost}% por nível){SP}", - "hud.skill.pick_strike_gemgain_title": "Rendimento de Gemas com a Picareta", - "hud.skill.pick_strike_gemgain": "Change de ganhar gemas extras ({boost}% por nível){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/social.ftl b/assets/voxygen/i18n/pt_BR/hud/social.ftl new file mode 100644 index 0000000000..ba85ef96d6 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Outros Jogadores +hud-social-online = Online: +hud-social-friends = Amigos +hud-social-not_yet_available = Indisponível +hud-social-faction = Facção +hud-social-play_online_fmt = { $nb_player } jogador(es) online +hud-social-name = Nome +hud-social-level = Nível +hud-social-zone = Zona +hud-social-account = Conta \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/social.ron b/assets/voxygen/i18n/pt_BR/hud/social.ron deleted file mode 100644 index b6cf5a10e5..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/social.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.social": "Outros Jogadores", - "hud.social.online": "Online:", - "hud.social.friends": "Amigos", - "hud.social.not_yet_available": "Indisponível", - "hud.social.faction": "Facção", - "hud.social.play_online_fmt": "{nb_player} jogador(es) online", - "hud.social.name": "Nome", - "hud.social.level": "Nível", - "hud.social.zone": "Zona", - "hud.social.account": "Conta", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_BR/hud/trade.ftl b/assets/voxygen/i18n/pt_BR/hud/trade.ftl new file mode 100644 index 0000000000..d96b8ed476 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Janela de Troca +hud-trade-phase1_description = + Arraste os itens que deseja trocar + para a sua área. +hud-trade-phase2_description = + Troca travada para que você tenha + tempo para revisar. +hud-trade-phase3_description = Troca em processamento. +hud-trade-persons_offer = Oferta de { $playername } +hud-trade-has_accepted = + { $playername } + aceitou +hud-trade-accept = Aceitar +hud-trade-decline = Recusar +hud-trade-invite_sent = Pedido de troca enviado para { $playername }. +hud-trade-result-completed = Troca concluída com sucesso. +hud-trade-result-declined = Troca cancelada. +hud-trade-result-nospace = Espaço insuficiente para completar a troca. +hud-trade-buy_price = Preço de compra +hud-trade-sell_price = Preço de venda +hud-trade-coin = moeda(s) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Sua oferta +hud-trade-their_offer = Oferta do outro +hud-trade-amount_input = Selecione um item \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/hud/trade.ron b/assets/voxygen/i18n/pt_BR/hud/trade.ron deleted file mode 100644 index aeba6ce421..0000000000 --- a/assets/voxygen/i18n/pt_BR/hud/trade.ron +++ /dev/null @@ -1,33 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - "hud.trade.trade_window": "Janela de Troca", - "hud.trade.phase1_description": "Arraste os itens que deseja trocar\n para a sua área.", - "hud.trade.phase2_description": "Troca travada para que você tenha\n tempo para revisar.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Troca em processamento.", - "hud.trade.persons_offer": "Oferta de {playername}", - "hud.trade.has_accepted": "{playername}\naceitou", - "hud.trade.accept": "Aceitar", - "hud.trade.decline": "Recusar", - "hud.trade.invite_sent": "Pedido de troca enviado para {playername}.", - "hud.trade.result.completed": "Troca concluída com sucesso.", - "hud.trade.result.declined": "Troca cancelada.", - "hud.trade.result.nospace": "Espaço insuficiente para completar a troca.", - "hud.trade.buy_price": "Preço de compra", - "hud.trade.sell_price": "Preço de venda", - "hud.trade.coin": "moeda(s)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Sua oferta", - "hud.trade.their_offer": "Oferta do outro", - "hud.trade.amount_input": "Selecione um item" - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/pt_BR/main.ftl b/assets/voxygen/i18n/pt_BR/main.ftl new file mode 100644 index 0000000000..c2928f4d09 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/main.ftl @@ -0,0 +1,93 @@ +main-username = Nome de Usuário +main-server = Servidor +main-password = Senha +main-connecting = Conectando +main-creating_world = Criando Mundo +main-tip = Dica: +main-unbound_key_tip = não vinculado +main-notice = + Bem-vindo a versão alfa de Veloren! + + Antes de iniciar a diversão, tenha algumas coisinhas em mente: + + - Esta é uma versão muito experimental. Prepare-se para defeitos(bugs), jogabilidade bem inacabada, mecânicas por finalizar e funcionalidades ausentes. + + - Caso você possua comentários construtivos para tecer ou defeitos a serem reportados, você pode nos contactar através do Reddit, Gitlab ou servidor Discord da comunidade. + + - Veloren está licenciado sob a licença de código aberto GPLv3. Isto significa que é livre para jogar, modificar e redistribuir + como quiser (desde que o trabalho derivado siga a mesma licença GPL 3). + + - Veloren é um projeto comunitário sem fins lucrativos, e todos que trabalham nele são voluntários. + Se você gosta do que viu, sinta-se a vontade para ingressar nos times de desenvolvimento e artes! + + Obrigado pelo seu tempo gasto lendo este aviso, esperamos que você goste do jogo! + + ~ A Equipe Veloren +main-login_process = + Informações sobre o login: + + Note que é necessário uma conta + para jogar em servidores com autenticação. + + Para criar uma conta acesse + + https://veloren.net/account/. +main-login-server_not_found = Servidor não encontrado +main-login-authentication_error = Erro de autenticação +main-login-internal_error = Erro interno no cliente (provavelmente o personagem do jogador foi deletado) +main-login-failed_auth_server_url_invalid = Falha na conexão com o servidor de autenticação +main-login-insecure_auth_scheme = A autenticação através do esquema HTTP NÃO é suportada. É inseguro! A propósito de desenvolvimento, o HTTP é permitido no 'localhost' ou em builds no modo debug +main-login-server_full = Servidor lotado +main-login-untrusted_auth_server = Servidor de autenticação não confiado +main-login-outdated_client_or_server = Servidor enlouqueceu: Provavelmente as versões são incompatíveis. Verifique se há atualizações. +main-login-timeout = Tempo esgotado: Servidor não respondeu a tempo. (Sobrecarregado ou com problemas de rede). +main-login-server_shut_down = Servidor encerrou ou desligou +main-login-network_error = Erro de Rede +main-login-network_wrong_version = O servidor está executando uma versão diferente da sua. Verifique a sua versão e atualize seu jogo. +main-login-failed_sending_request = Requisição ao servidor de autenticação falhou +main-login-invalid_character = O personagem selecionado é inválido +main-login-client_crashed = Cliente abortou +main-login-not_on_whitelist = Você precisa ser permitido(Whitelist) por um Admin para ingressar +main-login-banned = Você foi banido pelo seguinte motivo +main-login-kicked = Você foi expulso pelo seguinte motivo +main-login-select_language = Escolha um Idioma +main-login-client_version = Versão do Cliente +main-login-server_version = Versão do Servidor +main-login-client_init_failed = Cliente falhou ao inicializar: { $init_fail_reason } +main-login-username_bad_characters = Nome de usuário contém caracteres inválidos! (Apenas alfanuméricos, '_' e '-' são perimtidos) +main-login-username_too_long = Nome de usuário muito longo! Tamanho máximo: { $max_len } +main-servers-select_server = Escolha um servidor +main-servers-singleplayer_error = Falha ao conetar no servidor interno: { $sp_error } +main-servers-network_error = Erro de socket/rede: { $raw_error } +main-servers-participant_error = Erro de rede/protocolo do participante: { $raw_error } +main-servers-stream_error = Erro de conexão/compressão/(de)serialização do cliente: { $raw_error } +main-servers-database_error = Erro de Base da dados do Servidor: { $raw_error } +main-servers-persistence_error = Erro de persistência do servidor (Possivelmente relacionado a Asset/Personagens): { $raw_error } +main-servers-other_error = Erro geral de servidor: { $raw_error } +main-credits = Créditos +main-credits-created_by = criado por +main-credits-music = Música +main-credits-fonts = Fontes +main-credits-other_art = Outras Artes +main-credits-contributors = Contribuidores +loading-tips = + .a0 = Pressione '{ $gameinput-togglelantern }' para acender sua lâmpada. + .a1 = Pressione '{ $gameinput-help }' para visualizar suas teclas de atalho. + .a2 = Você pode digitar /say ou /s para conversar apenas com jogadores próximos a você. + .a3 = Você pode digitar /region ou /r para conversar apenas com jogadores a poucas centenas de blocos de você. + .a4 = Admins podem usar o comando /build para entrar no modo construção. + .a5 = Você pode digitar /group ou /g para conversar apenas com jogadores do seu grupo. + .a6 = Para enviar mensagens privadas digite /tell seguido do nome do jogador desejado. + .a7 = Busque sempre comida, baús e outros espólios espalhados pelo mundo! + .a8 = Inventário cheio de comidas? Tente criar alimentos melhores com elas! + .a9 = Imaginando o que há pra fazer? Cavernas estão marcadas com pontos marrons no mapa! + .a10 = Não esqueça de ajustar as configurações gráficas. Pressione '{ $gameinput-settings }' para abrir as configurações. + .a11 = Jogar com outros é divertido! Pressione '{ $gameinput-social }' para ver quem está online. + .a12 = Pressione '{ $gameinput-dance }' para dançar. Hora da festa! + .a13 = Pressione '{ $gameinput-glide }' para abrir o Planador e conquistar os céus. + .a14 = Veloren ainda está no Pre-Alpha. Estamos nos empenhando ao máximo para melhorar a cada dia! + .a15 = Se quiser ingressar no time de Desenvolvedores ou apenas conversar conosco, acesse o nosso servidor do Discord. + .a16 = Você pode exibir sua saúde em sua barra de vida nas opções. + .a17 = Sente ao redor de uma fogueira (usando a tecla '{ $gameinput-sit }') para lentamente se recuperar de lesões. + .a18 = Precisa de uma mochila maior para sua jornada? Pressione '{ $gameinput-crafting }' para abrir o menu de criação! + .a19 = Tente pular ao rolar através de criaturas. \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/main.ron b/assets/voxygen/i18n/pt_BR/main.ron deleted file mode 100644 index 0d4dffff93..0000000000 --- a/assets/voxygen/i18n/pt_BR/main.ron +++ /dev/null @@ -1,112 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - /// Start Main screen section - "main.username": "Nome de Usuário", - "main.server": "Servidor", - "main.password": "Senha", - "main.connecting": "Conectando", - "main.creating_world": "Criando Mundo", - "main.tip": "Dica:", - "main.unbound_key_tip": "não vinculado", - - // Mensagem de boas vindas que é exibida assim que o Veloren é iniciado - "main.notice": r#"Bem-vindo a versão alfa de Veloren! - -Antes de iniciar a diversão, tenha algumas coisinhas em mente: - -- Esta é uma versão muito experimental. Prepare-se para defeitos(bugs), jogabilidade bem inacabada, mecânicas por finalizar e funcionalidades ausentes. - -- Caso você possua comentários construtivos para tecer ou defeitos a serem reportados, você pode nos contactar através do Reddit, Gitlab ou servidor Discord da comunidade. - -- Veloren está licenciado sob a licença de código aberto GPLv3. Isto significa que é livre para jogar, modificar e redistribuir -como quiser (desde que o trabalho derivado siga a mesma licença GPL 3). - -- Veloren é um projeto comunitário sem fins lucrativos, e todos que trabalham nele são voluntários. -Se você gosta do que viu, sinta-se a vontade para ingressar nos times de desenvolvimento e artes! - -Obrigado pelo seu tempo gasto lendo este aviso, esperamos que você goste do jogo! - -~ A Equipe Veloren"#, - - // Login process description - "main.login_process": r#"Informações sobre o login: - -Note que é necessário uma conta -para jogar em servidores com autenticação. - -Para criar uma conta acesse - -https://veloren.net/account/."#, - "main.login.server_not_found": "Servidor não encontrado", - "main.login.authentication_error": "Erro de autenticação", - "main.login.internal_error": "Erro interno no cliente (provavelmente o personagem do jogador foi deletado)", - "main.login.failed_auth_server_url_invalid": "Falha na conexão com o servidor de autenticação", - "main.login.insecure_auth_scheme": "A autenticação através do esquema HTTP NÃO é suportada. É inseguro! A propósito de desenvolvimento, o HTTP é permitido no 'localhost' ou em builds no modo debug", - "main.login.server_full": "Servidor lotado", - "main.login.untrusted_auth_server": "Servidor de autenticação não confiado", - "main.login.outdated_client_or_server": "Servidor enlouqueceu: Provavelmente as versões são incompatíveis. Verifique se há atualizações.", - "main.login.timeout": "Tempo esgotado: Servidor não respondeu a tempo. (Sobrecarregado ou com problemas de rede).", - "main.login.server_shut_down": "Servidor encerrou ou desligou", - "main.login.network_error": "Erro de Rede", - "main.login.network_wrong_version": "O servidor está executando uma versão diferente da sua. Verifique a sua versão e atualize seu jogo.", - "main.login.failed_sending_request": "Requisição ao servidor de autenticação falhou", - "main.login.invalid_character": "O personagem selecionado é inválido", - "main.login.client_crashed": "Cliente abortou", - "main.login.not_on_whitelist": "Você precisa ser permitido(Whitelist) por um Admin para ingressar", - "main.login.banned": "Você foi banido pelo seguinte motivo", - "main.login.kicked": "Você foi expulso pelo seguinte motivo", - "main.login.select_language": "Escolha um Idioma", - "main.login.client_version": "Versão do Cliente", - "main.login.server_version": "Versão do Servidor", - "main.login.client_init_failed": "Cliente falhou ao inicializar: {init_fail_reason}", - "main.login.username_bad_characters": "Nome de usuário contém caracteres inválidos! (Apenas alfanuméricos, '_' e '-' são perimtidos)", - "main.login.username_too_long": "Nome de usuário muito longo! Tamanho máximo: {max_len}", - "main.servers.select_server": "Escolha um servidor", - "main.servers.singleplayer_error": "Falha ao conetar no servidor interno: {sp_error}", - "main.servers.network_error": "Erro de socket/rede: {raw_error}", - "main.servers.participant_error": "Erro de rede/protocolo do participante: {raw_error}", - "main.servers.stream_error": "Erro de conexão/compressão/(de)serialização do cliente: {raw_error}", - "main.servers.database_error": "Erro de Base da dados do Servidor: {raw_error}", - "main.servers.persistence_error": "Erro de persistência do servidor (Possivelmente relacionado a Asset/Personagens): {raw_error}", - "main.servers.other_error": "Erro geral de servidor: {raw_error}", - - // Tela de créditos - "main.credits": "Créditos", - "main.credits.created_by": "criado por", - "main.credits.music": "Música", - "main.credits.fonts": "Fontes", - "main.credits.other_art": "Outras Artes", - "main.credits.contributors": "Contribuidores", - - /// Fim da seção Main - }, - - - vector_map: { - "loading.tips": [ - "Pressione '{gameinput.togglelantern}' para acender sua lâmpada.", - "Pressione '{gameinput.help}' para visualizar suas teclas de atalho.", - "Você pode digitar /say ou /s para conversar apenas com jogadores próximos a você.", - "Você pode digitar /region ou /r para conversar apenas com jogadores a poucas centenas de blocos de você.", - "Admins podem usar o comando /build para entrar no modo construção.", - "Você pode digitar /group ou /g para conversar apenas com jogadores do seu grupo.", - "Para enviar mensagens privadas digite /tell seguido do nome do jogador desejado.", - "Busque sempre comida, baús e outros espólios espalhados pelo mundo!", - "Inventário cheio de comidas? Tente criar alimentos melhores com elas!", - "Imaginando o que há pra fazer? Cavernas estão marcadas com pontos marrons no mapa!", - "Não esqueça de ajustar as configurações gráficas. Pressione '{gameinput.settings}' para abrir as configurações.", - "Jogar com outros é divertido! Pressione '{gameinput.social}' para ver quem está online.", - "Pressione '{gameinput.dance}' para dançar. Hora da festa!", - "Pressione '{gameinput.glide}' para abrir o Planador e conquistar os céus.", - "Veloren ainda está no Pre-Alpha. Estamos nos empenhando ao máximo para melhorar a cada dia!", - "Se quiser ingressar no time de Desenvolvedores ou apenas conversar conosco, acesse o nosso servidor do Discord.", - "Você pode exibir sua saúde em sua barra de vida nas opções.", - "Sente ao redor de uma fogueira (usando a tecla '{gameinput.sit}') para lentamente se recuperar de lesões.", - "Precisa de uma mochila maior para sua jornada? Pressione '{gameinput.crafting}' para abrir o menu de criação!", - "Tente pular ao rolar através de criaturas.", - ], - } -) diff --git a/assets/voxygen/i18n/pt_BR/npc.ftl b/assets/voxygen/i18n/pt_BR/npc.ftl new file mode 100644 index 0000000000..7156ad0ce1 --- /dev/null +++ b/assets/voxygen/i18n/pt_BR/npc.ftl @@ -0,0 +1,169 @@ +npc-speech-villager = + .a0 = Não é um dia tão lindo? + .a1 = Como você está? + .a2 = Uma ótima manhã para você! + .a3 = Fico imaginando o que um Catobelpas pensa enquanto come grama. + .a4 = O que você está achando do clima? + .a5 = Só de imaginar o que há em todas as masmorras me dá arrepios. Espero que alguém as limpe. + .a6 = Adoraria explorar algumas cavernas assim que eu ficar mais forte. + .a7 = Você viu meu gato? + .a8 = Já ouviu falar dos ferozes Land Sharks? Ouvi dizer que eles vivem nos desertos. + .a9 = Dizem que diversos tipos de gemas brilhantes podem ser encontradas nas cavernas. + .a10 = Sou viciado em queijo! + .a11 = Quer entrar? Venha, vamos comer um queijo! + .a12 = Dizem que cogumelos são bons para saude. Nunca comi. + .a13 = Não esqueça dos biscoitos! + .a14 = Eu adoro queijo anão(dwarven cheese). Gostaria de saber fazer. + .a15 = Fico imaginando o que há depois das montanhas. + .a16 = Espero um dia conseguir fazer meu planador. + .a17 = Gostaria de ver o meu jardim? Tá bom, talvez outro dia então. + .a18 = Um dia adoravel para um passeio na floresta! + .a19 = Ser ou não ser? Acho que serei um fazendeiro. + .a20 = Nossa aldeia é a melhor, não acha?. + .a21 = O que você acha que faz os Restos Brilhantes(Glowing Remains) brilharem?. + .a22 = Acho que está na hora dum segundo café da manhã! + .a23 = Já capturou uma libélula(firefly)? + .a24 = Gostaria que alguém conseguisse espantar os lobos da aldeia. + .a25 = Tive um sonho magnífico sobre queijo ontem. O que será que significa? + .a26 = Deixei um pouco de queijo com meu irmão. Agora não sei se existe ou não. Eu chamo de queijo de Schrödinger. + .a27 = Deixei um pouco de queijo com minha irmã. Agora não sei se existe ou não. Eu chamo de queijo de Schrödinger. + .a28 = Alguém deveria fazer algo sobre esses cultistas. De preferência, não eu. + .a29 = Espero que chova logo. Seria bom para as colheitas. + .a30 = Eu amo mel! E eu odeio abelhas. + .a31 = Eu quero viajar no mundo um dia. Deve haver mais vida do que nesta aldeia. +npc-speech-villager_decline_trade = + .a0 = Desculpe, não tenho nada para trocar. + .a1 = Troca? Como se eu tivesse algo que pode interessar a você. + .a2 = Minha casa é minha, não vou trocá-la por nada. +npc-speech-merchant_advertisement = + .a0 = Está interessado em fazer uma troca comigo? + .a1 = Você quer negociar comigo? + .a2 = Eu tenho muitos produtos, você quer dar uma olhada? +npc-speech-merchant_busy = + .a0 = Ei, espere sua vez. + .a1 = Espere, por favor. Sou apenas uma pessoa. + .a2 = Você vê a outra pessoa na sua frente? + .a3 = Só um momento, deixe-me terminar. + .a4 = Não fure a fila. + .a5 = Estou ocupado, volte mais tarde. +npc-speech-merchant_trade_successful = + .a0 = Obrigado por negociar comigo! + .a1 = Obrigado! +npc-speech-merchant_trade_declined = + .a0 = Talvez outra hora, tenha um bom dia! + .a1 = Que pena, talvez da próxima vez, então! +npc-speech-villager_cultist_alarm = + .a0 = Olhe! Há um cultista à solta! + .a1 = Às armas! Os cultistas estão atacando! + .a2 = Como ousam os cultistas atacar nossa aldeia! + .a3 = Morte aos cultistas! + .a4 = Cultistas não serão tolerados aqui! + .a5 = Cultista assassino! + .a6 = Prove o gume da minha espada, seu cultista sujo! + .a7 = Nada pode limpar o sangue de suas mãos, cultista! + .a8 = Com mil milhões de macacos e raios e coriscos! Um cultista entre nós! + .a9 = Os males deste cultista estão prestes a acabar! + .a10 = Este cultista é meu! + .a11 = Prepare-se para encontrar o seu criador, oh sórdido cultista! + .a12 = Vejo um cultista! Pegue eles! + .a13 = Vejo um cultista! Atacar! + .a14 = Vejo um cultista! Não o deixe escapar! + .a15 = O mais honrado cultista se importaria com alguma MORTE?! + .a16 = Nunca perdoe! Nunca se esqueça! Morra, cultista! + .a17 = Morra, cultista! + .a18 = Seu reinado de terror chegará ao fim! + .a19 = Você pagará por tudo que fez! + .a20 = Não aceitamos bem seus tipos por aqui. + .a21 = Você deveria ter ficado no subsolo! +npc-speech-villager_under_attack = + .a0 = Ajuda, Estou sendo atacado! + .a1 = Ajuda! Estou sendo atacado! + .a2 = Ouch! Estou sendo atacado! + .a3 = Ouch! Estou sendo atacado! Ajuda! + .a4 = Me ajude! Estou sendo atacado! + .a5 = Estou sendo atacado! Ajuda! + .a6 = Estou sendo atacado! Me ajude! + .a7 = Ajuda! + .a8 = Ajuda! Ajuda! + .a9 = Ajuda! Ajuda! Ajuda! + .a10 = Estou sendo atacado! + .a11 = AAAHHH! Estou sendo atacado! + .a12 = AAAHHH! Estou sendo atacado! Ajuda! + .a13 = Ajuda! Estamos sendo atacado! + .a14 = Ajuda! Assassino! + .a15 = Ajuda! Há um assassinado em andamento! + .a16 = Ajuda! Estão tentando me matar! + .a17 = Guardas, Estou sendo atacado! + .a18 = Guardas! Estou sendo atacado! + .a19 = Estou sendo atacado! Guardas! + .a20 = Ajuda! Guardas! Estou sendo atacado! + .a21 = Guardas! Depressa! + .a22 = Guardas! Guardas! + .a23 = Guardas! Um vilão está me atacando! + .a24 = Guardas, acabem com este maldito vilão! + .a25 = Guardas! Um assasino a solta! + .a26 = Guardas! Me ajude! + .a27 = Você não vai se safar dessa! Guardas! + .a28 = Maldito Vilão! + .a29 = Me ajude! + .a30 = Ajuda! Por favor! + .a31 = Ouch! Guardas! Ajuda! + .a32 = Estão atrás de mim! + .a33 = Ajuda! Ajuda! Estou sendo repreendido + .a34 = Ah, agora vemos a violência inerente ao sistema. + .a35 = Só um arranhão! + .a36 = Pare com isso! + .a37 = O que eu fiz para você?! + .a38 = Por favor, pare de me atacar! + .a39 = Hey! Cuida pra onde você aponta essa coisa! + .a40 = Desgraçado hediondo, vou acabar com você! + .a41 = Pare com isso! Vá embora! + .a42 = Você está me deixando louco! + .a43 = Ow! Quem você pensa que é?! + .a44 = Arrancarei sua cabeça por isso! + .a45 = Pare, por favor! Não levo nada de valor! + .a46 = Vou mandar meu irmão em você, ele é maior que eu! + .a47 = Nãooo, Vou contar pra minha mãe! + .a48 = Te amaldiçoo! + .a49 = Por favor não faça isso. + .a50 = Isso não foi muito legal! + .a51 = Sua arma funciona, pode guardar ela agora! + .a52 = Me poupe! + .a53 = Por favor, tenho uma família! + .a54 = Sou muito jovem para morrer! + .a55 = Podemos conversar sobre isso? + .a56 = Violência nunca é a resposta! + .a57 = Hoje foi um péssimo dia... + .a58 = Ei, isso dói! + .a59 = Eek! + .a60 = Que rude! + .a61 = Pare, eu imploro! + .a62 = Que você adoeça! + .a63 = Isso não é engraçado. + .a64 = Como ousa?! + .a65 = Você pagará por isso! + .a66 = Continue assim e irá se arrepender! + .a67 = Não me faça te machucar! + .a68 = Deve haver algum engano! + .a69 = Não precisa fazer isso! + .a70 = Morre, Diabo! + .a71 = Isso Dói! + .a72 = Porque você faria isso? + .a73 = Pelos espíritos, Pare! + .a74 = Você deve ter me confundido com alguém! + .a75 = Eu não mereço isso! + .a76 = Por favor, não faça isso novamente. + .a77 = Guardas, joguem este monstro no lago! + .a78 = Vou mandar meu tarrasque em você! + .a79 = Porque eeeeeeeeeeeeeu? +npc-speech-villager_enemy_killed = + .a0 = Destruí meu inimigo! + .a1 = Finalmente em paz! + .a2 = ... agora, o que eu estava fazendo? +npc-speech-menacing = + .a0 = Estou te avisando! + .a1 = Se chegar mais perto eu ataco! + .a2 = Não tenho medo de você! + .a3 = Se manda daqui! + .a4 = Vaza daqui se deseja viver! + .a5 = Você não é bem-vindo aqui! \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_BR/npc.ron b/assets/voxygen/i18n/pt_BR/npc.ron deleted file mode 100644 index 2ddb22ea2d..0000000000 --- a/assets/voxygen/i18n/pt_BR/npc.ron +++ /dev/null @@ -1,190 +0,0 @@ -/// CUIDADO: Arquivos de tradução devem ser criados no formato UTF-8 sem Marca de Ordem de byte - BOM(https://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte) - -/// Localization for Portuguese (Brazil) -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "Não é um dia tão lindo?", - "Como você está?", - "Uma ótima manhã para você!", - "Fico imaginando o que um Catobelpas pensa enquanto come grama.", - "O que você está achando do clima?", - "Só de imaginar o que há em todas as masmorras me dá arrepios. Espero que alguém as limpe.", - "Adoraria explorar algumas cavernas assim que eu ficar mais forte.", - "Você viu meu gato?", - "Já ouviu falar dos ferozes Land Sharks? Ouvi dizer que eles vivem nos desertos.", - "Dizem que diversos tipos de gemas brilhantes podem ser encontradas nas cavernas.", - "Sou viciado em queijo!", - "Quer entrar? Venha, vamos comer um queijo!", - "Dizem que cogumelos são bons para saude. Nunca comi.", - "Não esqueça dos biscoitos!", - "Eu adoro queijo anão(dwarven cheese). Gostaria de saber fazer.", - "Fico imaginando o que há depois das montanhas.", - "Espero um dia conseguir fazer meu planador.", - "Gostaria de ver o meu jardim? Tá bom, talvez outro dia então.", - "Um dia adoravel para um passeio na floresta!", - "Ser ou não ser? Acho que serei um fazendeiro.", - "Nossa aldeia é a melhor, não acha?.", - "O que você acha que faz os Restos Brilhantes(Glowing Remains) brilharem?.", - "Acho que está na hora dum segundo café da manhã!", - "Já capturou uma libélula(firefly)?", - "Gostaria que alguém conseguisse espantar os lobos da aldeia.", - "Tive um sonho magnífico sobre queijo ontem. O que será que significa?", - "Deixei um pouco de queijo com meu irmão. Agora não sei se existe ou não. Eu chamo de queijo de Schrödinger.", - "Deixei um pouco de queijo com minha irmã. Agora não sei se existe ou não. Eu chamo de queijo de Schrödinger.", - "Alguém deveria fazer algo sobre esses cultistas. De preferência, não eu.", - "Espero que chova logo. Seria bom para as colheitas.", - "Eu amo mel! E eu odeio abelhas. ", - "Eu quero viajar no mundo um dia. Deve haver mais vida do que nesta aldeia. ", - ], - "npc.speech.villager_decline_trade": [ - "Desculpe, não tenho nada para trocar.", - "Troca? Como se eu tivesse algo que pode interessar a você.", - "Minha casa é minha, não vou trocá-la por nada.", - ], - "npc.speech.merchant_advertisement": [ - "Está interessado em fazer uma troca comigo?", - "Você quer negociar comigo?", - "Eu tenho muitos produtos, você quer dar uma olhada?" - ], - "npc.speech.merchant_busy": [ - "Ei, espere sua vez.", - "Espere, por favor. Sou apenas uma pessoa.", - "Você vê a outra pessoa na sua frente?", - "Só um momento, deixe-me terminar.", - "Não fure a fila.", - "Estou ocupado, volte mais tarde." - ], - "npc.speech.merchant_trade_successful": [ - "Obrigado por negociar comigo!", - "Obrigado!", - ], - "npc.speech.merchant_trade_declined": [ - "Talvez outra hora, tenha um bom dia!", - "Que pena, talvez da próxima vez, então! " - ], - "npc.speech.villager_cultist_alarm": [ - "Olhe! Há um cultista à solta!", - "Às armas! Os cultistas estão atacando!", - "Como ousam os cultistas atacar nossa aldeia!", - "Morte aos cultistas!", - "Cultistas não serão tolerados aqui!", - "Cultista assassino!", - "Prove o gume da minha espada, seu cultista sujo!", - "Nada pode limpar o sangue de suas mãos, cultista!", - "Com mil milhões de macacos e raios e coriscos! Um cultista entre nós!", - "Os males deste cultista estão prestes a acabar!", - "Este cultista é meu!", - "Prepare-se para encontrar o seu criador, oh sórdido cultista!", - "Vejo um cultista! Pegue eles!", - "Vejo um cultista! Atacar!", - "Vejo um cultista! Não o deixe escapar!", - "O mais honrado cultista se importaria com alguma MORTE?!", - "Nunca perdoe! Nunca se esqueça! Morra, cultista!", - "Morra, cultista!", - "Seu reinado de terror chegará ao fim!", - "Você pagará por tudo que fez!", - "Não aceitamos bem seus tipos por aqui.", - "Você deveria ter ficado no subsolo!", - ], - "npc.speech.villager_under_attack": [ - "Ajuda, Estou sendo atacado!", - "Ajuda! Estou sendo atacado!", - "Ouch! Estou sendo atacado!", - "Ouch! Estou sendo atacado! Ajuda!", - "Me ajude! Estou sendo atacado!", - "Estou sendo atacado! Ajuda!", - "Estou sendo atacado! Me ajude!", - "Ajuda!", - "Ajuda! Ajuda!", - "Ajuda! Ajuda! Ajuda!", - "Estou sendo atacado!", - "AAAHHH! Estou sendo atacado!", - "AAAHHH! Estou sendo atacado! Ajuda!", - "Ajuda! Estamos sendo atacado!", - "Ajuda! Assassino!", - "Ajuda! Há um assassinado em andamento!", - "Ajuda! Estão tentando me matar!", - "Guardas, Estou sendo atacado!", - "Guardas! Estou sendo atacado!", - "Estou sendo atacado! Guardas!", - "Ajuda! Guardas! Estou sendo atacado!", - "Guardas! Depressa!", - "Guardas! Guardas!", - "Guardas! Um vilão está me atacando!", - "Guardas, acabem com este maldito vilão!", - "Guardas! Um assasino a solta!", - "Guardas! Me ajude!", - "Você não vai se safar dessa! Guardas!", - "Maldito Vilão!", - "Me ajude!", - "Ajuda! Por favor!", - "Ouch! Guardas! Ajuda!", - "Estão atrás de mim!", - "Ajuda! Ajuda! Estou sendo repreendido", - "Ah, agora vemos a violência inerente ao sistema.", - "Só um arranhão!", - "Pare com isso!", - "O que eu fiz para você?!", - "Por favor, pare de me atacar!", - "Hey! Cuida pra onde você aponta essa coisa!", - "Desgraçado hediondo, vou acabar com você!", - "Pare com isso! Vá embora!", - "Você está me deixando louco!", - "Ow! Quem você pensa que é?!", - "Arrancarei sua cabeça por isso!", - "Pare, por favor! Não levo nada de valor!", - "Vou mandar meu irmão em você, ele é maior que eu!", - "Nãooo, Vou contar pra minha mãe!", - "Te amaldiçoo!", - "Por favor não faça isso.", - "Isso não foi muito legal!", - "Sua arma funciona, pode guardar ela agora!", - "Me poupe!", - "Por favor, tenho uma família!", - "Sou muito jovem para morrer!", - "Podemos conversar sobre isso?", - "Violência nunca é a resposta!", - "Hoje foi um péssimo dia...", - "Ei, isso dói!", - "Eek!", - "Que rude!", - "Pare, eu imploro!", - "Que você adoeça!", - "Isso não é engraçado.", - "Como ousa?!", - "Você pagará por isso!", - "Continue assim e irá se arrepender!", - "Não me faça te machucar!", - "Deve haver algum engano!", - "Não precisa fazer isso!", - "Morre, Diabo!", - "Isso Dói!", - "Porque você faria isso?", - "Pelos espíritos, Pare!", - "Você deve ter me confundido com alguém!", - "Eu não mereço isso!", - "Por favor, não faça isso novamente.", - "Guardas, joguem este monstro no lago!", - "Vou mandar meu tarrasque em você!", - "Porque eeeeeeeeeeeeeu?", - ], - "npc.speech.villager_enemy_killed": [ - "Destruí meu inimigo!", - "Finalmente em paz!", - "... agora, o que eu estava fazendo?", - ], - "npc.speech.menacing": [ - "Estou te avisando!", - "Se chegar mais perto eu ataco!", - "Não tenho medo de você!", - "Se manda daqui!", - "Vaza daqui se deseja viver!", - "Você não é bem-vindo aqui!", - ], - } -) diff --git a/assets/voxygen/i18n/pt_PT/buff.ftl b/assets/voxygen/i18n/pt_PT/buff.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/buff.ron b/assets/voxygen/i18n/pt_PT/buff.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/buff.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/char_selection.ftl b/assets/voxygen/i18n/pt_PT/char_selection.ftl new file mode 100644 index 0000000000..4aef29f69e --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/char_selection.ftl @@ -0,0 +1,18 @@ +char_selection-delete_permanently = Deletar esta personagem permanentemente? +char_selection-change_server = Mudar de servidor +char_selection-enter_world = Entrar no mundo +char_selection-logout = Desconectar +char_selection-create_new_character = Criar nova personagem +char_selection-character_creation = Criação de personagem +char_selection-human_default = Humano padrão +char_selection-level_fmt = Nível { $level_nb } +char_selection-uncanny_valley = Vale da estranheza +char_selection-plains_of_uncertainty = Planícies da incerteza +char_selection-beard = Barba +char_selection-hair_style = Estilo do cabelo +char_selection-hair_color = Cor do cabelo +char_selection-chest_color = Cor do peitoral +char_selection-eye_color = Cor dos olhos +char_selection-skin = Cor da pele +char_selection-eyebrows = Pestanas +char_selection-accessories = Acessórios \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/char_selection.ron b/assets/voxygen/i18n/pt_PT/char_selection.ron deleted file mode 100644 index 849ac64ecf..0000000000 --- a/assets/voxygen/i18n/pt_PT/char_selection.ron +++ /dev/null @@ -1,29 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "char_selection.delete_permanently": "Deletar esta personagem permanentemente?", - "char_selection.change_server": "Mudar de servidor", - "char_selection.enter_world": "Entrar no mundo", - "char_selection.logout": "Desconectar", - "char_selection.create_new_character": "Criar nova personagem", - "char_selection.character_creation": "Criação de personagem", - - "char_selection.human_default": "Humano padrão", - "char_selection.level_fmt": "Nível {level_nb}", - "char_selection.uncanny_valley": "Vale da estranheza", - "char_selection.plains_of_uncertainty": "Planícies da incerteza", - "char_selection.beard": "Barba", - "char_selection.hair_style": "Estilo do cabelo", - "char_selection.hair_color": "Cor do cabelo", - "char_selection.chest_color": "Cor do peitoral", - "char_selection.eye_color": "Cor dos olhos", - "char_selection.skin": "Cor da pele", - "char_selection.eyebrows": "Pestanas", - "char_selection.accessories": "Acessórios", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/common.ftl b/assets/voxygen/i18n/pt_PT/common.ftl new file mode 100644 index 0000000000..2c97caf777 --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/common.ftl @@ -0,0 +1,41 @@ +common-username = nome de utilizador +common-singleplayer = Um jogador +common-multiplayer = Multijogador +common-servers = Servidores +common-quit = Sair +common-settings = Definições +common-languages = Linguagens +common-interface = Interface +common-gameplay = Jogabilidade +common-controls = Controlos +common-video = Video +common-sound = Som +common-resume = Resumir +common-characters = Personagens +common-close = Fechar +common-yes = Sim +common-no = Não +common-back = Voltar +common-create = Criar +common-okay = Okay +common-accept = Aceitar +common-disclaimer = Aviso +common-cancel = Cancelar +common-none = Nenhum +common-error = Erro +common-fatal_error = Erro fatal +common-connection_lost = + Conexâo perdida! + Será que o server reiniciou? + O cliente está atualizado? +common-species-orc = Ogre +common-species-human = Humano +common-species-dwarf = Anão +common-species-elf = Elfo +common-species-draugr = Morto-vivo +common-species-danari = Danari +common-weapons-axe = Machado +common-weapons-sword = Espada +common-weapons-staff = Cajado +common-weapons-bow = Arco +common-weapons-hammer = Martelo \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/common.ron b/assets/voxygen/i18n/pt_PT/common.ron deleted file mode 100644 index e20033a113..0000000000 --- a/assets/voxygen/i18n/pt_PT/common.ron +++ /dev/null @@ -1,57 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "nome de utilizador", - "common.singleplayer": "Um jogador", - "common.multiplayer": "Multijogador", - "common.servers": "Servidores", - "common.quit": "Sair", - "common.settings": "Definições", - "common.languages": "Linguagens", - "common.interface": "Interface", - "common.gameplay": "Jogabilidade", - "common.controls": "Controlos", - "common.video": "Video", - "common.sound": "Som", - "common.resume": "Resumir", - "common.characters": "Personagens", - "common.close": "Fechar", - "common.yes": "Sim", - "common.no": "Não", - "common.back": "Voltar", - "common.create": "Criar", - "common.okay": "Okay", - "common.accept": "Aceitar", - "common.disclaimer": "Aviso", - "common.cancel": "Cancelar", - "common.none": "Nenhum", - "common.error": "Erro", - "common.fatal_error": "Erro fatal", - - // Message when connection to the server is lost - "common.connection_lost": r#"Conexâo perdida! -Será que o server reiniciou? -O cliente está atualizado?"#, - - - "common.species.orc": "Ogre", - "common.species.human": "Humano", - "common.species.dwarf": "Anão", - "common.species.elf": "Elfo", - "common.species.draugr": "Morto-vivo", - "common.species.danari": "Danari", - - "common.weapons.axe": "Machado", - "common.weapons.sword": "Espada", - "common.weapons.staff": "Cajado", - "common.weapons.bow": "Arco", - "common.weapons.hammer": "Martelo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/esc_menu.ftl b/assets/voxygen/i18n/pt_PT/esc_menu.ftl new file mode 100644 index 0000000000..6e4bfd0b2e --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Desconectar +esc_menu-quit_game = Sair do jogo \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/esc_menu.ron b/assets/voxygen/i18n/pt_PT/esc_menu.ron deleted file mode 100644 index 51a99240b7..0000000000 --- a/assets/voxygen/i18n/pt_PT/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "esc_menu.logout": "Desconectar", - "esc_menu.quit_game": "Sair do jogo", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/gameinput.ftl b/assets/voxygen/i18n/pt_PT/gameinput.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/gameinput.ron b/assets/voxygen/i18n/pt_PT/gameinput.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/gameinput.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/bag.ftl b/assets/voxygen/i18n/pt_PT/hud/bag.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/bag.ron b/assets/voxygen/i18n/pt_PT/hud/bag.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/bag.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/char_window.ftl b/assets/voxygen/i18n/pt_PT/hud/char_window.ftl new file mode 100644 index 0000000000..1aad4b8db7 --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/hud/char_window.ftl @@ -0,0 +1,7 @@ +character_window-character_name = Nome da personagem +character_window-character_stats = + Resistência + + Aptidão fisíca + + Força de vontade \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/hud/char_window.ron b/assets/voxygen/i18n/pt_PT/hud/char_window.ron deleted file mode 100644 index 62bfce266c..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/char_window.ron +++ /dev/null @@ -1,19 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "character_window.character_name": "Nome da personagem", - // Charater stats - "character_window.character_stats": r#"Resistência - -Aptidão fisíca - -Força de vontade -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/chat.ftl b/assets/voxygen/i18n/pt_PT/hud/chat.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/chat.ron b/assets/voxygen/i18n/pt_PT/hud/chat.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/chat.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/crafting.ftl b/assets/voxygen/i18n/pt_PT/hud/crafting.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/crafting.ron b/assets/voxygen/i18n/pt_PT/hud/crafting.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/crafting.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/group.ftl b/assets/voxygen/i18n/pt_PT/hud/group.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/group.ron b/assets/voxygen/i18n/pt_PT/hud/group.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/group.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/map.ftl b/assets/voxygen/i18n/pt_PT/hud/map.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/map.ron b/assets/voxygen/i18n/pt_PT/hud/map.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/map.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/misc.ftl b/assets/voxygen/i18n/pt_PT/hud/misc.ftl new file mode 100644 index 0000000000..b2edf71820 --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/hud/misc.ftl @@ -0,0 +1,60 @@ +hud-do_not_show_on_startup = Não mostre no início +hud-show_tips = Mostrar dicas +hud-quests = Missões +hud-you_died = Você Morreu +hud-press_key_to_show_keybindings_fmt = Clique em { $key } para mostrar as teclas mapeadas +hud-press_key_to_show_debug_info_fmt = Clique em { $key } para mostrar a informação de depuração +hud-press_key_to_toggle_keybindings_fmt = Clique em { $key } para mostrar/ocultar as teclas mapeadas +hud-press_key_to_toggle_debug_info_fmt = Clique em { $key } para mostrar/ocultar a informação de depuração +hud-press_key_to_respawn = Clique em { $key } para renascer na última fogueira visitada. +hud-welcome = + Bem vindo a Alpha do Veloren!, + + + Algumas dicas antes de começar: + + + MAIS IMPORTANTE: Para definir o seu local de renascimento escreva /waypoint no chat. + + Isto também pode ser realizado depois de morto! + + + Clique em F1 para ver as teclas mapeadas. + + Escreva /help no chat para ver os comandos de chat + + + A muitos baús e outros objetos a aperecer no mundo aleatoriamente! + + Pressione o botão direito do mouse pare coletá-los. + + Para usar o que coletou basta abrir o inventário pressionando a tecla 'B'. + + Faça duplo clique nos items para usá-los ou equipá-los. + + Deite-os fora cliquando uma vez neles e depois outra fora do inventário. + + + As noites podem ser bastante escuras. + + Acenda a lanterna escrevendo /lantern no chat. + + + Quer libertar o mouse para fechar esta janela? Clique em TAB! + + + Aprecie a sua estadia no mundo de Veloren. +hud-temp_quest_headline = Please, help us Traveller! +hud-temp_quest_text = + Dungeons filled with evil cultists + have emerged all around our peaceful towns! + + + Gather some company, stack up on food + and defeat their vile leaders and acolytes. + + + Maybe you can even obtain one of their + magically infused items? +hud-spell = Feitiço +hud-free_look_indicator = Rotação livre ativada \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/hud/misc.ron b/assets/voxygen/i18n/pt_PT/hud/misc.ron deleted file mode 100644 index 29609b4545..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/misc.ron +++ /dev/null @@ -1,76 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "hud.do_not_show_on_startup": "Não mostre no início", - "hud.show_tips": "Mostrar dicas", - "hud.quests": "Missões", - "hud.you_died": "Você Morreu", - - "hud.press_key_to_show_keybindings_fmt": "Clique em {key} para mostrar as teclas mapeadas", - "hud.press_key_to_show_debug_info_fmt": "Clique em {key} para mostrar a informação de depuração", - "hud.press_key_to_toggle_keybindings_fmt": "Clique em {key} para mostrar/ocultar as teclas mapeadas", - "hud.press_key_to_toggle_debug_info_fmt": "Clique em {key} para mostrar/ocultar a informação de depuração", - - // Respawn message - "hud.press_key_to_respawn": r#"Clique em {key} para renascer na última fogueira visitada."#, - - // Welcome message - "hud.welcome": r#"Bem vindo a Alpha do Veloren!, - - -Algumas dicas antes de começar: - - -MAIS IMPORTANTE: Para definir o seu local de renascimento escreva /waypoint no chat. - -Isto também pode ser realizado depois de morto! - - -Clique em F1 para ver as teclas mapeadas. - -Escreva /help no chat para ver os comandos de chat - - -A muitos baús e outros objetos a aperecer no mundo aleatoriamente! - -Pressione o botão direito do mouse pare coletá-los. - -Para usar o que coletou basta abrir o inventário pressionando a tecla 'B'. - -Faça duplo clique nos items para usá-los ou equipá-los. - -Deite-os fora cliquando uma vez neles e depois outra fora do inventário. - - -As noites podem ser bastante escuras. - -Acenda a lanterna escrevendo /lantern no chat. - - -Quer libertar o mouse para fechar esta janela? Clique em TAB! - - -Aprecie a sua estadia no mundo de Veloren."#, - -"hud.temp_quest_headline": r#"Please, help us Traveller!"#, -"hud.temp_quest_text": r#"Dungeons filled with evil cultists -have emerged all around our peaceful towns! - - -Gather some company, stack up on food -and defeat their vile leaders and acolytes. - - -Maybe you can even obtain one of their -magically infused items?"#, - "hud.spell": "Feitiço", - - "hud.free_look_indicator": "Rotação livre ativada", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/sct.ftl b/assets/voxygen/i18n/pt_PT/hud/sct.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/sct.ron b/assets/voxygen/i18n/pt_PT/hud/sct.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/sct.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/settings.ftl b/assets/voxygen/i18n/pt_PT/hud/settings.ftl new file mode 100644 index 0000000000..e3bdeafe04 --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/hud/settings.ftl @@ -0,0 +1,123 @@ +hud-settings-general = Geral +hud-settings-none = Nenhum +hud-settings-press_behavior-toggle = Alternar +hud-settings-press_behavior-hold = Segurar +hud-settings-help_window = Janela de ajuda +hud-settings-debug_info = Informação de depuração +hud-settings-tips_on_startup = Dicas no início +hud-settings-ui_scale = Escala da interface +hud-settings-relative_scaling = Escala relativa +hud-settings-custom_scaling = Escala customizada +hud-settings-crosshair = Crosshair +hud-settings-opacity = Transparência +hud-settings-hotbar = Hotbar +hud-settings-toggle_shortcuts = Mostar/Ocultar atalhos +hud-settings-toggle_bar_experience = Mostar/Ocultar barra de experiência +hud-settings-scrolling_combat_text = Texto de combate deslizante +hud-settings-incoming_damage = Dano recebido +hud-settings-energybar_numbers = Números da barra de energia +hud-settings-values = Valores +hud-settings-percentages = Percentagens +hud-settings-chat = Chat +hud-settings-background_opacity = Transparência do fundo +hud-settings-pan_sensitivity = Sensibilidade de rotação +hud-settings-zoom_sensitivity = Sensibilidade de zoom +hud-settings-invert_scroll_zoom = Inverter scroll zoom +hud-settings-invert_mouse_y_axis = Inverter o eixo Y do mouse +hud-settings-free_look_behavior = Ativação de rotação livre +hud-settings-view_distance = Alcance de visão +hud-settings-maximum_fps = FPS máximo +hud-settings-fov = Campo de visão(graus) +hud-settings-gamma = Luminosidade +hud-settings-antialiasing_mode = Modo de antialiasing +hud-settings-cloud_rendering_mode = Modo de representação de nuvens +hud-settings-fluid_rendering_mode = Modo de representação de fluídos +hud-settings-fluid_rendering_mode-cheap = Barato +hud-settings-fluid_rendering_mode-shiny = Brilhante +hud-settings-cloud_rendering_mode-regular = Normal +hud-settings-fullscreen = Tela cheia +hud-settings-save_window_size = Gravar dimensões +hud-settings-music_volume = Volume da música +hud-settings-sound_effect_volume = Volume dos efeitos sonoros +hud-settings-audio_device = Dispositivo de aúdio +hud-settings-control_names = + Libertar mouse + Mostar/Ocultar janela de ajuda + Mostar/Ocultar interface + Mostar/Ocultar FPS e informação de depuração + Gravar captura de ecrã + Mostar/Ocultar nomes + Mostar/Ocultar tela cheia + + + Mover para frente + Mover para a esquerda + Mover para a direita + Mover para trás + + Saltar + + Planador + + Desviar + + Rolar + + Trepar + + Descer + + Auto caminhar + + Embainhar/sacar armas + + Equipar/remover capacete + + Sentar + + Montar + + Interagir + + + Ataque básico + Ataque/bloquear/apontar secundário + + + Habilidade 1 + Habilidade 2 + Habilidade 3 + Habilidade 4 + Habilidade 5 + Habilidade 6 + Habilidade 7 + Habilidade 8 + Habilidade 9 + Habilidade 10 + + + Menu de pausa + Definições + Social + Mapa + Livro de feitiços + Personagem + Registo de missões + Inventário + + + + Enviar mensagem de chat + Scroll chat + + + Comandos de chat: + + /alias [nome] - Mudar o seu nome de chat + /tp [nome] - Teletransporta-te para outro player + /jump - Deslocar a posição + /goto - Teletransporta-te para a posição + /kill - Suicidar + /pig - Invocar NPC de porco + /wolf - Invocar NPC do lobo + /help - Mostrar comandos de chat \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/hud/settings.ron b/assets/voxygen/i18n/pt_PT/hud/settings.ron deleted file mode 100644 index cffb2f665d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/settings.ron +++ /dev/null @@ -1,138 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "hud.settings.general": "Geral", - "hud.settings.none": "Nenhum", - "hud.settings.press_behavior.toggle": "Alternar", - "hud.settings.press_behavior.hold": "Segurar", - "hud.settings.help_window": "Janela de ajuda", - "hud.settings.debug_info": "Informação de depuração", - "hud.settings.tips_on_startup": "Dicas no início", - "hud.settings.ui_scale": "Escala da interface", - "hud.settings.relative_scaling": "Escala relativa", - "hud.settings.custom_scaling": "Escala customizada", - "hud.settings.crosshair": "Crosshair", - "hud.settings.opacity": "Transparência", - "hud.settings.hotbar": "Hotbar", - "hud.settings.toggle_shortcuts": "Mostar/Ocultar atalhos", - "hud.settings.toggle_bar_experience": "Mostar/Ocultar barra de experiência", - "hud.settings.scrolling_combat_text": "Texto de combate deslizante", - "hud.settings.incoming_damage": "Dano recebido", - "hud.settings.energybar_numbers": "Números da barra de energia", - "hud.settings.values": "Valores", - "hud.settings.percentages": "Percentagens", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Transparência do fundo", - - "hud.settings.pan_sensitivity": "Sensibilidade de rotação", - "hud.settings.zoom_sensitivity": "Sensibilidade de zoom", - "hud.settings.invert_scroll_zoom": "Inverter scroll zoom", - "hud.settings.invert_mouse_y_axis": "Inverter o eixo Y do mouse", - "hud.settings.free_look_behavior": "Ativação de rotação livre", - - "hud.settings.view_distance": "Alcance de visão", - "hud.settings.maximum_fps": "FPS máximo", - "hud.settings.fov": "Campo de visão(graus)", - "hud.settings.gamma": "Luminosidade", - "hud.settings.antialiasing_mode": "Modo de antialiasing", - "hud.settings.cloud_rendering_mode": "Modo de representação de nuvens", - "hud.settings.fluid_rendering_mode": "Modo de representação de fluídos", - "hud.settings.fluid_rendering_mode.cheap": "Barato", - "hud.settings.fluid_rendering_mode.shiny": "Brilhante", - "hud.settings.cloud_rendering_mode.regular": "Normal", - "hud.settings.fullscreen": "Tela cheia", - "hud.settings.save_window_size": "Gravar dimensões", - - "hud.settings.music_volume": "Volume da música", - "hud.settings.sound_effect_volume": "Volume dos efeitos sonoros", - "hud.settings.audio_device": "Dispositivo de aúdio", - - // Control list - "hud.settings.control_names": r#"Libertar mouse -Mostar/Ocultar janela de ajuda -Mostar/Ocultar interface -Mostar/Ocultar FPS e informação de depuração -Gravar captura de ecrã -Mostar/Ocultar nomes -Mostar/Ocultar tela cheia - - -Mover para frente -Mover para a esquerda -Mover para a direita -Mover para trás - -Saltar - -Planador - -Desviar - -Rolar - -Trepar - -Descer - -Auto caminhar - -Embainhar/sacar armas - -Equipar/remover capacete - -Sentar - -Montar - -Interagir - - -Ataque básico -Ataque/bloquear/apontar secundário - - -Habilidade 1 -Habilidade 2 -Habilidade 3 -Habilidade 4 -Habilidade 5 -Habilidade 6 -Habilidade 7 -Habilidade 8 -Habilidade 9 -Habilidade 10 - - -Menu de pausa -Definições -Social -Mapa -Livro de feitiços -Personagem -Registo de missões -Inventário - - - -Enviar mensagem de chat -Scroll chat - - -Comandos de chat: - -/alias [nome] - Mudar o seu nome de chat -/tp [nome] - Teletransporta-te para outro player -/jump - Deslocar a posição -/goto - Teletransporta-te para a posição -/kill - Suicidar -/pig - Invocar NPC de porco -/wolf - Invocar NPC do lobo -/help - Mostrar comandos de chat"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/skills.ftl b/assets/voxygen/i18n/pt_PT/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/skills.ron b/assets/voxygen/i18n/pt_PT/hud/skills.ron deleted file mode 100644 index 960b221c7d..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/skills.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/hud/social.ftl b/assets/voxygen/i18n/pt_PT/hud/social.ftl new file mode 100644 index 0000000000..cc2f3d77ce --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/hud/social.ftl @@ -0,0 +1,6 @@ +hud-social = Social +hud-social-online = Online +hud-social-friends = Amigos +hud-social-not_yet_available = Indisponível de momento +hud-social-faction = Facção +hud-social-play_online_fmt = { $nb_player } jogador(es) online \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/hud/social.ron b/assets/voxygen/i18n/pt_PT/hud/social.ron deleted file mode 100644 index 19cbd644cb..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/social.ron +++ /dev/null @@ -1,18 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "hud.social": "Social", - "hud.social.online": "Online", - "hud.social.friends": "Amigos", - "hud.social.not_yet_available": "Indisponível de momento", - "hud.social.faction": "Facção", - "hud.social.play_online_fmt": "{nb_player} jogador(es) online", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/pt_PT/hud/trade.ftl b/assets/voxygen/i18n/pt_PT/hud/trade.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/hud/trade.ron b/assets/voxygen/i18n/pt_PT/hud/trade.ron deleted file mode 100644 index 3439af4b30..0000000000 --- a/assets/voxygen/i18n/pt_PT/hud/trade.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/pt_PT/main.ftl b/assets/voxygen/i18n/pt_PT/main.ftl new file mode 100644 index 0000000000..e1b0a71b2b --- /dev/null +++ b/assets/voxygen/i18n/pt_PT/main.ftl @@ -0,0 +1,45 @@ +main-connecting = Conectando +main-creating_world = Criando o mundo +main-notice = + Bem vindo a versão alpha de Veloren! + + Antes de começar a jogar, por favor tenha em mente que: + + - Isto é uma versão muito experimental. Prepare-se para defeitos, jogabilidade muito inacabada, mecanismos por polir e funcionalidades por + adicionar. + - Se tiver comentários construtivos ou defeitos para reportar, pode contactar-nos através do Reddit, GitLab ou o nosso servidor comunitário de + Discord. + - Veloren está licenciado sob a licensa código aberto GPL 3. Isto significa que pode jogar, modificar e redistribuir como quiser + (Contanto que o trabalho derivado seja também GPL 3). + - Veloren é um projeto comunitário sem lucro, e toda a gente que trabalha nele é um voluntário. Se gostar do que ve, considere juntar-se a equipa + de desenvolvimento ou a de artes! + - 'Voxel RPG' é um género em si mesmo. First-person shooters costumavam ser chamados de clones do DOOM. + + Tal como eles, nós estamos a tentar construir um género. Este jogo não é um clone e o seu desenvolvimento vai divergir de jogos existentes no + futuro. + + Obrigado por ler este aviso, nós esperamos que goste do jogo! + + ~ A equipa do Veloren +main-login_process = + Informação sobre o processo de Login: + + Se tiver problemas a logar: + + Tenha em atenção que é necessário uma conta + para jogar em servidores com autenticação. + + Para criar uma conta navegue até + + https://veloren.net/account/. +main-login-server_not_found = Servidor não encontrado +main-login-authentication_error = Erro de autenticação +main-login-server_full = Servidor está cheio +main-login-untrusted_auth_server = Server de autenticação não confiado +main-login-outdated_client_or_server = Servidor endoideceu: Provavelmente as versões são incompativéis, verifique se há versões mais recentes. +main-login-timeout = Tempo esgotado: O servidor não respondeu a tempo. (Sobrecarregado ou problemas de rede). +main-login-server_shut_down = O servidor encerrou +main-login-network_error = Error de rede +main-login-failed_sending_request = Pedido ao servidor de autenticação falhou +main-login-client_crashed = O cliente crashou +main-login-select_language = Seleccione uma língua \ No newline at end of file diff --git a/assets/voxygen/i18n/pt_PT/main.ron b/assets/voxygen/i18n/pt_PT/main.ron deleted file mode 100644 index 2cb5ed45d4..0000000000 --- a/assets/voxygen/i18n/pt_PT/main.ron +++ /dev/null @@ -1,58 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - "main.connecting": "Conectando", - "main.creating_world": "Criando o mundo", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Bem vindo a versão alpha de Veloren! - -Antes de começar a jogar, por favor tenha em mente que: - -- Isto é uma versão muito experimental. Prepare-se para defeitos, jogabilidade muito inacabada, mecanismos por polir e funcionalidades por -adicionar. -- Se tiver comentários construtivos ou defeitos para reportar, pode contactar-nos através do Reddit, GitLab ou o nosso servidor comunitário de -Discord. -- Veloren está licenciado sob a licensa código aberto GPL 3. Isto significa que pode jogar, modificar e redistribuir como quiser - (Contanto que o trabalho derivado seja também GPL 3). -- Veloren é um projeto comunitário sem lucro, e toda a gente que trabalha nele é um voluntário. Se gostar do que ve, considere juntar-se a equipa -de desenvolvimento ou a de artes! -- 'Voxel RPG' é um género em si mesmo. First-person shooters costumavam ser chamados de clones do DOOM. - -Tal como eles, nós estamos a tentar construir um género. Este jogo não é um clone e o seu desenvolvimento vai divergir de jogos existentes no -futuro. - -Obrigado por ler este aviso, nós esperamos que goste do jogo! - -~ A equipa do Veloren"#, - - // Login process description - "main.login_process": r#"Informação sobre o processo de Login: - -Se tiver problemas a logar: - -Tenha em atenção que é necessário uma conta -para jogar em servidores com autenticação. - -Para criar uma conta navegue até - -https://veloren.net/account/."#, - "main.login.server_not_found": "Servidor não encontrado", - "main.login.authentication_error": "Erro de autenticação", - "main.login.server_full": "Servidor está cheio", - "main.login.untrusted_auth_server": "Server de autenticação não confiado", - "main.login.outdated_client_or_server": "Servidor endoideceu: Provavelmente as versões são incompativéis, verifique se há versões mais recentes.", - "main.login.timeout": "Tempo esgotado: O servidor não respondeu a tempo. (Sobrecarregado ou problemas de rede).", - "main.login.server_shut_down": "O servidor encerrou", - "main.login.network_error": "Error de rede", - "main.login.failed_sending_request": "Pedido ao servidor de autenticação falhou", - "main.login.client_crashed": "O cliente crashou", - "main.login.select_language": "Seleccione uma língua", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/pt_PT/npc.ftl b/assets/voxygen/i18n/pt_PT/npc.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/pt_PT/npc.ron b/assets/voxygen/i18n/pt_PT/npc.ron deleted file mode 100644 index d2679ab63c..0000000000 --- a/assets/voxygen/i18n/pt_PT/npc.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for portuguese (Portugal) -( - string_map: { - - }, - - vector_map: { - - } -) diff --git a/assets/voxygen/i18n/ru_RU/buff.ftl b/assets/voxygen/i18n/ru_RU/buff.ftl new file mode 100644 index 0000000000..6ccd69a740 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Нажмите, чтобы удалить +buff-title-missing = Отсутствует название +buff-desc-missing = Отсутствует описание +buff-title-heal = Лечение +buff-desc-heal = Постепенное восстонавление здоровья +buff-title-potion = Зелье +buff-desc-potion = Питье... +buff-title-saturation = Насыщение +buff-desc-saturation = Восстонавление здоровья за счет расходных материалов. +buff-title-campfire_heal = Исцеление у костра +buff-desc-campfire_heal = Отдых у костра лечит { $rate }% в секунду. +buff-title-invulnerability = Неуязвимость +buff-desc-invulnerability = Вы не можете получить урон от атак. +buff-title-protectingward = Защитная Аура +buff-desc-protectingward = Вы в некоторой степени защищены от нападений. +buff-title-frenzied = Бешенство +buff-desc-frenzied = Кровь течёт быстрее, ускоряя ваше движение и понемногу исцеляя вас. +buff-title-hastened = Скорость +buff-desc-hastened = Скорость передвижения и атак повышена +buff-title-bleed = Кровотечение +buff-desc-bleed = Наносит регулярный урон. +buff-title-cursed = Проклятие +buff-desc-cursed = Вас прокляли. +buff-title-burn = В огне +buff-desc-burn = Вы горите живьём +buff-title-crippled = Увечье +buff-desc-crippled = Ваше движение затруднено, так как ваши ноги сильно травмированы. +buff-title-frozen = Обморожение +buff-desc-frozen = Скорость движения и атак снижена. +buff-title-wet = Мокрый +buff-desc-wet = Земля запутывает ваши ноги мешая хотьбе. +buff-title-ensnared = Ловушка +buff-desc-ensnared = Лоза опутывает ваши ноги затрудняя движение. +buff-stat-health = Восстанавливает { $str_total } здоровья +buff-stat-increase_max_energy = Повышает максимум энергии на { $strength } +buff-stat-increase_max_health = Повышает максимальное здоровье на { $strength } +buff-stat-invulnerability = Дарует неуязвимость +buff-text-over_seconds = более { $dur_secs } секунд(ы) +buff-text-for_seconds = на { $dur_secs } секунды \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/buff.ron b/assets/voxygen/i18n/ru_RU/buff.ron deleted file mode 100644 index d4abe8d8d3..0000000000 --- a/assets/voxygen/i18n/ru_RU/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - // Buffs - "buff.remove": "Нажмите, чтобы удалить", - "buff.title.missing": "Отсутствует название", - "buff.desc.missing": "Отсутствует описание", - "buff.title.heal": "Лечение", - "buff.desc.heal": "Постепенное восстонавление здоровья", - "buff.title.potion": "Зелье", - "buff.desc.potion": "Питье...", - "buff.title.saturation": "Насыщение", - "buff.desc.saturation": "Восстонавление здоровья за счет расходных материалов.", - "buff.title.campfire_heal": "Исцеление у костра", - "buff.desc.campfire_heal": "Отдых у костра лечит {rate}% в секунду.", - "buff.title.invulnerability": "Неуязвимость", - "buff.desc.invulnerability": "Вы не можете получить урон от атак.", - "buff.title.protectingward": "Защитная Аура", - "buff.desc.protectingward": "Вы в некоторой степени защищены от нападений.", - "buff.title.frenzied": "Бешенство", - "buff.desc.frenzied": "Кровь течёт быстрее, ускоряя ваше движение и понемногу исцеляя вас.", - "buff.title.hastened": "Скорость", - "buff.desc.hastened": "Скорость передвижения и атак повышена", - // Debuffs - "buff.title.bleed": "Кровотечение", - "buff.desc.bleed": "Наносит регулярный урон.", - "buff.title.cursed": "Проклятие", - "buff.desc.cursed": "Вас прокляли.", - "buff.title.burn": "В огне", - "buff.desc.burn": "Вы горите живьём", - "buff.title.crippled": "Увечье", - "buff.desc.crippled": "Ваше движение затруднено, так как ваши ноги сильно травмированы.", - "buff.title.frozen": "Обморожение", - "buff.desc.frozen": "Скорость движения и атак снижена.", - "buff.title.wet": "Мокрый", - "buff.desc.wet": "Земля запутывает ваши ноги мешая хотьбе.", - "buff.title.ensnared": "Ловушка", - "buff.desc.ensnared": "Лоза опутывает ваши ноги затрудняя движение.", - // Buffs stats - "buff.stat.health": "Восстанавливает {str_total} здоровья", - "buff.stat.increase_max_energy": "Повышает максимум энергии на {strength}", - "buff.stat.increase_max_health": "Повышает максимальное здоровье на {strength}", - "buff.stat.invulnerability": "Дарует неуязвимость", - // Text - "buff.text.over_seconds": "более {dur_secs} секунд(ы)", - "buff.text.for_seconds": "на {dur_secs} секунды", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/char_selection.ftl b/assets/voxygen/i18n/ru_RU/char_selection.ftl new file mode 100644 index 0000000000..f9b4400d5d --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Загрузка персонажей... +char_selection-delete_permanently = Навсегда удалить этого персонажа? +char_selection-deleting_character = Удаление Персонажа... +char_selection-change_server = Сменить сервер +char_selection-enter_world = Войти в мир +char_selection-logout = Выход +char_selection-create_new_character = Создать нового персонажа +char_selection-creating_character = Создание персонажа... +char_selection-character_creation = Персонаж создан +char_selection-human_default = Стандартный человек +char_selection-level_fmt = Уровень { $level_nb } +char_selection-uncanny_valley = Дикие Земли +char_selection-plains_of_uncertainty = Plains of Uncertainty +char_selection-beard = Борода +char_selection-hair_style = Прическа +char_selection-hair_color = Цвет волос +char_selection-eye_color = Цвет глаз +char_selection-skin = Цвет кожи +char_selection-eyeshape = Глаза +char_selection-accessories = Аксессуары +char_selection-create_info_name = Вашему персонажу нужно имя! +char_selection-version_mismatch = ПРЕДУПРЕЖДЕНИЕ! На этом сервере работает другая, возможно, несовместимая версия игры. Пожалуйста, обновите свою игру. \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/char_selection.ron b/assets/voxygen/i18n/ru_RU/char_selection.ron deleted file mode 100644 index 06bd38c101..0000000000 --- a/assets/voxygen/i18n/ru_RU/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "char_selection.loading_characters": "Загрузка персонажей...", - "char_selection.delete_permanently": "Навсегда удалить этого персонажа?", - "char_selection.deleting_character": "Удаление Персонажа...", - "char_selection.change_server": "Сменить сервер", - "char_selection.enter_world": "Войти в мир", - "char_selection.logout": "Выход", - "char_selection.create_new_character": "Создать нового персонажа", - "char_selection.creating_character": "Создание персонажа...", - "char_selection.character_creation": "Персонаж создан", - "char_selection.human_default": "Стандартный человек", - "char_selection.level_fmt": "Уровень {level_nb}", - "char_selection.uncanny_valley": "Дикие Земли", - "char_selection.plains_of_uncertainty": "Plains of Uncertainty", - "char_selection.beard": "Борода", - "char_selection.hair_style": "Прическа", - "char_selection.hair_color": "Цвет волос", - "char_selection.eye_color": "Цвет глаз", - "char_selection.skin": "Цвет кожи", - "char_selection.eyeshape": "Глаза", - "char_selection.accessories": "Аксессуары", - "char_selection.create_info_name": "Вашему персонажу нужно имя!", - "char_selection.version_mismatch": "ПРЕДУПРЕЖДЕНИЕ! На этом сервере работает другая, возможно, несовместимая версия игры. Пожалуйста, обновите свою игру.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/common.ftl b/assets/voxygen/i18n/ru_RU/common.ftl new file mode 100644 index 0000000000..17c3bc9c17 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/common.ftl @@ -0,0 +1,108 @@ +common-username = Никнейм +common-singleplayer = Одиночная игра +common-multiplayer = Мультиплеер +common-servers = Сервера +common-quit = Выход +common-settings = Настройки +common-languages = Язык +common-interface = Интерфейс +common-gameplay = Геймплей +common-controls = Управление +common-video = Графика +common-sound = Звук +common-chat = Чат +common-resume = Продолжить +common-characters = Персонажи +common-close = Закрыть +common-yes = Да +common-no = Нет +common-back = Назад +common-create = Создание +common-okay = Окей +common-add = Добавить +common-accept = Принять +common-decline = Отказаться +common-disclaimer = Предупреждение +common-cancel = Отменить +common-none = Отключено +common-error = Ошибка +common-fatal_error = Фатальная ошибка +common-you = Вы +common-automatic = Авто +common-random = Случайно +common-empty = Пустой +common-confirm = Подтврдить +common-delete_server = Удалить сервер +common-interface_settings = Настройки интерфейса +common-gameplay_settings = Настройки геймплея +common-controls_settings = Настройки управления +common-video_settings = Графические настройки +common-sound_settings = Настройки звука +common-language_settings = Настройки языка +common-chat_settings = Настройки чата +common-connection_lost = + Связь потеряна! + Сервер перезапущен? + Клиент обновлен до версии сервера? +common-species-orc = Орк +common-species-human = Человек +common-species-dwarf = Дворф +common-species-elf = Эльф +common-species-draugr = Нежить +common-species-danari = Данари +common-weapons-axe = Топор +common-weapons-dagger = Кинжал +common-weapons-greatsword = Двуручный меч +common-weapons-shortswords = Короткие мечи +common-weapons-sword = Меч +common-weapons-staff = Огненный посох +common-weapons-bow = Лук +common-weapons-hammer = Молот +common-weapons-general = Общий бой +common-weapons-sceptre = Скипетр лечения +common-weapons-shield = Защита +common-weapons-spear = Копье +common-weapons-hammer_simple = Простой молот +common-weapons-sword_simple = Простой меч +common-weapons-staff_simple = Простой посох +common-weapons-axe_simple = Простой топор +common-weapons-bow_simple = Простой лук +common-weapons-unique = Уникальный +common-tool-debug = Дебаг +common-tool-farming = Инструмент +common-tool-pick = Кирка +common-tool-mining = Инструмент добычи +common-kind-modular_component = Модульный компонент +common-kind-modular_component_partial = Компонент +common-kind-glider = Дельтаплан +common-kind-consumable = Расходуемый +common-kind-throwable = Можно бросить +common-kind-utility = Полезность +common-kind-ingredient = Ингредиент +common-kind-lantern = Фонарь +common-hands-one = Одноручное +common-hands-two = Двуручное +common-rand_appearance = Случайная внешность +common-rand_name = Случайное имя +common-stats-combat_rating = CR +common-stats-power = Сила +common-stats-speed = Скорость +common-stats-poise = Равновесие +common-stats-range = Дистанция +common-stats-energy_efficiency = Энергоэффективность +common-stats-buff_strength = Увеличение силы +common-stats-crit_chance = Крит шанс +common-stats-crit_mult = Множитель крита +common-stats-armor = Броня +common-stats-poise_res = Оглушение +common-stats-energy_max = Максимальная энергия +common-stats-energy_reward = Востановление энергии +common-stats-crit_power = Сила крита +common-stats-stealth = Скрытность +common-stats-slots = Слоты +common-material-metal = Металл +common-material-wood = Дерево +common-material-stone = Камень +common-material-cloth = Ткань +common-material-hide = Кожа +common-sprite-chest = Сундук \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/common.ron b/assets/voxygen/i18n/ru_RU/common.ron deleted file mode 100644 index 501cb5c674..0000000000 --- a/assets/voxygen/i18n/ru_RU/common.ron +++ /dev/null @@ -1,130 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Никнейм", - "common.singleplayer": "Одиночная игра", - "common.multiplayer": "Мультиплеер", - "common.servers": "Сервера", - "common.quit": "Выход", - "common.settings": "Настройки", - "common.languages": "Язык", - "common.interface": "Интерфейс", - "common.gameplay": "Геймплей", - "common.controls": "Управление", - "common.video": "Графика", - "common.sound": "Звук", - "common.chat": "Чат", - "common.resume": "Продолжить", - "common.characters": "Персонажи", - "common.close": "Закрыть", - "common.yes": "Да", - "common.no": "Нет", - "common.back": "Назад", - "common.create": "Создание", - "common.okay": "Окей", - "common.add": "Добавить", - "common.accept": "Принять", - "common.decline": "Отказаться", - "common.disclaimer": "Предупреждение", - "common.cancel": "Отменить", - "common.none": "Отключено", - "common.error": "Ошибка", - "common.fatal_error": "Фатальная ошибка", - "common.you": "Вы", - "common.automatic": "Авто", - "common.random": "Случайно", - "common.empty": "Пустой", - "common.confirm": "Подтврдить", - "common.delete_server": "Удалить сервер", - - // Settings Window title - "common.interface_settings": "Настройки интерфейса", - "common.gameplay_settings": "Настройки геймплея", - "common.controls_settings": "Настройки управления", - "common.video_settings": "Графические настройки", - "common.sound_settings": "Настройки звука", - "common.language_settings": "Настройки языка", - "common.chat_settings": "Настройки чата", - - // Message when connection to the server is lost - "common.connection_lost": r#"Связь потеряна! -Сервер перезапущен? -Клиент обновлен до версии сервера?"#, - - - "common.species.orc": "Орк", - "common.species.human": "Человек", - "common.species.dwarf": "Дворф", - "common.species.elf": "Эльф", - "common.species.draugr": "Нежить", - "common.species.danari": "Данари", - - "common.weapons.axe": "Топор", - "common.weapons.dagger": "Кинжал", - "common.weapons.greatsword": "Двуручный меч", - "common.weapons.shortswords": "Короткие мечи", - "common.weapons.sword": "Меч", - "common.weapons.staff": "Огненный посох", - "common.weapons.bow": "Лук", - "common.weapons.hammer": "Молот", - "common.weapons.general": "Общий бой", - "common.weapons.sceptre": "Скипетр лечения", - "common.weapons.shield": "Защита", - "common.weapons.spear": "Копье", - "common.weapons.hammer_simple": "Простой молот", - "common.weapons.sword_simple": "Простой меч", - "common.weapons.staff_simple": "Простой посох", - "common.weapons.axe_simple": "Простой топор", - "common.weapons.bow_simple": "Простой лук", - "common.weapons.unique": "Уникальный", - "common.tool.debug": "Дебаг", - "common.tool.farming": "Инструмент", - "common.tool.pick": "Кирка", - "common.tool.mining": "Инструмент добычи", - "common.kind.modular_component": "Модульный компонент", - "common.kind.modular_component_partial": "Компонент", - "common.kind.glider": "Дельтаплан", - "common.kind.consumable": "Расходуемый", - "common.kind.throwable": "Можно бросить", - "common.kind.utility": "Полезность", - "common.kind.ingredient": "Ингредиент", - "common.kind.lantern": "Фонарь", - "common.hands.one": "Одноручное", - "common.hands.two": "Двуручное", - - "common.rand_appearance": "Случайная внешность", - "common.rand_name": "Случайное имя", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Сила", - "common.stats.speed": "Скорость", - "common.stats.poise": "Равновесие", - "common.stats.range": "Дистанция", - "common.stats.energy_efficiency": "Энергоэффективность", - "common.stats.buff_strength": "Увеличение силы", - "common.stats.crit_chance": "Крит шанс", - "common.stats.crit_mult": "Множитель крита", - "common.stats.armor": "Броня", - "common.stats.poise_res":"Оглушение", - "common.stats.energy_max": "Максимальная энергия", - "common.stats.energy_reward": "Востановление энергии", - "common.stats.crit_power": "Сила крита", - "common.stats.stealth": "Скрытность", - "common.stats.slots": "Слоты", - - "common.material.metal": "Металл", - "common.material.wood": "Дерево", - "common.material.stone": "Камень", - "common.material.cloth": "Ткань", - "common.material.hide": "Кожа", - - "common.sprite.chest": "Сундук", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/esc_menu.ftl b/assets/voxygen/i18n/ru_RU/esc_menu.ftl new file mode 100644 index 0000000000..3b55a3859f --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Выйти в меню +esc_menu-quit_game = Выйти из игры \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/esc_menu.ron b/assets/voxygen/i18n/ru_RU/esc_menu.ron deleted file mode 100644 index 48066287f6..0000000000 --- a/assets/voxygen/i18n/ru_RU/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "esc_menu.logout": "Выйти в меню", - "esc_menu.quit_game": "Выйти из игры", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/gameinput.ftl b/assets/voxygen/i18n/ru_RU/gameinput.ftl new file mode 100644 index 0000000000..4e43bb44f7 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Основная атака +gameinput-secondary = Вторичная атака +gameinput-block = Блок +gameinput-slot1 = Горячая клавиша 1 +gameinput-slot2 = Горячая клавиша 2 +gameinput-slot3 = Горячая клавиша 3 +gameinput-slot4 = Горячая клавиша 4 +gameinput-slot5 = Горячая клавиша 5 +gameinput-slot6 = Горячая клавиша 6 +gameinput-slot7 = Горячая клавиша 7 +gameinput-slot8 = Горячая клавиша 8 +gameinput-slot9 = Горячая клавиша 9 +gameinput-slot10 = Горячая клавиша 10 +gameinput-swaploadout = Сменить снаряжение +gameinput-togglecursor = ВКЛ/ВЫКЛ курсор +gameinput-help = ВКЛ/ВЫКЛ окно помощи +gameinput-toggleinterface = ВКЛ/ВЫКЛ интерфейс +gameinput-toggledebug = ВКЛ/ВЫКЛ FPS и отладочную информацию +gameinput-toggle_egui_debug = Показать информацию для отладки EGUI +gameinput-togglechat = Переключить чат +gameinput-screenshot = Сделать скриншот +gameinput-toggleingameui = ВЫКЛ/ВЫКЛ никнеймы и имена +gameinput-fullscreen = ВКЛ/ВЫКЛ полноэкранный режим +gameinput-moveforward = Двигаться вперед +gameinput-moveleft = Двигаться влево +gameinput-moveright = Двигаться вправо +gameinput-moveback = Двигаться назад +gameinput-jump = Прыжок +gameinput-glide = Дельтаплан +gameinput-roll = Перекат +gameinput-climb = Взбираться +gameinput-climbdown = Спускаться +gameinput-wallleap = Прыжок от стены +gameinput-togglelantern = ВКЛ/ВЫКЛ фонарь +gameinput-mount = Оседлать +gameinput-chat = Чат +gameinput-command = Команда +gameinput-escape = Назад +gameinput-map = Карта +gameinput-bag = Рюкзак +gameinput-trade = Обмен +gameinput-social = Список игроков +gameinput-sit = Сидеть +gameinput-spellbook = Навыки +gameinput-settings = Настройки +gameinput-respawn = Возродиться +gameinput-charge = Зарядить +gameinput-togglewield = Переключить Управление +gameinput-interact = Взаимодействовать +gameinput-freelook = Свободная камера +gameinput-autowalk = Автодвижение +gameinput-cameraclamp = Фиксирование камеры +gameinput-dance = Танцевать +gameinput-select = Выбор объекта +gameinput-acceptgroupinvite = Принять приглашение в группу +gameinput-declinegroupinvite = Отвергнуть приглашение в группу +gameinput-cyclecamera = Переключение камеры +gameinput-crafting = Крафт +gameinput-fly = Полет +gameinput-sneak = Красться +gameinput-swimdown = Погружение (в воду) +gameinput-swimup = Всплыть +gameinput-mapzoomin = Увеличение масштаба карты +gameinput-mapzoomout = Уменьшение масштаба карты +gameinput-greet = Поприветствовать +gameinput-map-locationmarkerbutton = Поставить точку на карте \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/gameinput.ron b/assets/voxygen/i18n/ru_RU/gameinput.ron deleted file mode 100644 index 746fdf4f87..0000000000 --- a/assets/voxygen/i18n/ru_RU/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "gameinput.primary": "Основная атака", - "gameinput.secondary": "Вторичная атака", - "gameinput.block": "Блок", - "gameinput.slot1": "Горячая клавиша 1", - "gameinput.slot2": "Горячая клавиша 2", - "gameinput.slot3": "Горячая клавиша 3", - "gameinput.slot4": "Горячая клавиша 4", - "gameinput.slot5": "Горячая клавиша 5", - "gameinput.slot6": "Горячая клавиша 6", - "gameinput.slot7": "Горячая клавиша 7", - "gameinput.slot8": "Горячая клавиша 8", - "gameinput.slot9": "Горячая клавиша 9", - "gameinput.slot10": "Горячая клавиша 10", - "gameinput.swaploadout": "Сменить снаряжение", - "gameinput.togglecursor": "ВКЛ/ВЫКЛ курсор", - "gameinput.help": "ВКЛ/ВЫКЛ окно помощи", - "gameinput.toggleinterface": "ВКЛ/ВЫКЛ интерфейс", - "gameinput.toggledebug": "ВКЛ/ВЫКЛ FPS и отладочную информацию", - "gameinput.toggle_egui_debug": "Показать информацию для отладки EGUI", - "gameinput.togglechat": "Переключить чат", - "gameinput.screenshot": "Сделать скриншот", - "gameinput.toggleingameui": "ВЫКЛ/ВЫКЛ никнеймы и имена", - "gameinput.fullscreen": "ВКЛ/ВЫКЛ полноэкранный режим", - "gameinput.moveforward": "Двигаться вперед", - "gameinput.moveleft": "Двигаться влево", - "gameinput.moveright": "Двигаться вправо", - "gameinput.moveback": "Двигаться назад", - "gameinput.jump": "Прыжок", - "gameinput.glide": "Дельтаплан", - "gameinput.roll": "Перекат", - "gameinput.climb": "Взбираться", - "gameinput.climbdown": "Спускаться", - "gameinput.wallleap": "Прыжок от стены", - "gameinput.togglelantern": "ВКЛ/ВЫКЛ фонарь", - "gameinput.mount": "Оседлать", - "gameinput.chat": "Чат", - "gameinput.command": "Команда", - "gameinput.escape": "Назад", - "gameinput.map": "Карта", - "gameinput.bag": "Рюкзак", - "gameinput.trade": "Обмен", - "gameinput.social": "Список игроков", - "gameinput.sit": "Сидеть", - "gameinput.spellbook": "Навыки", - "gameinput.settings": "Настройки", - "gameinput.respawn": "Возродиться", - "gameinput.charge": "Зарядить", - "gameinput.togglewield": "Переключить Управление", - "gameinput.interact": "Взаимодействовать", - "gameinput.freelook": "Свободная камера", - "gameinput.autowalk": "Автодвижение", - "gameinput.cameraclamp": "Фиксирование камеры", - "gameinput.dance": "Танцевать", - "gameinput.select": "Выбор объекта", - "gameinput.acceptgroupinvite": "Принять приглашение в группу", - "gameinput.declinegroupinvite": "Отвергнуть приглашение в группу", - "gameinput.cyclecamera": "Переключение камеры", - "gameinput.crafting": "Крафт", - "gameinput.fly": "Полет", - "gameinput.sneak": "Красться", - "gameinput.swimdown": "Погружение (в воду)", - "gameinput.swimup": "Всплыть", - "gameinput.mapzoomin": "Увеличение масштаба карты", - "gameinput.mapzoomout": "Уменьшение масштаба карты", - "gameinput.greet": "Поприветствовать", - "gameinput.map.locationmarkerbutton": "Поставить точку на карте" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/bag.ftl b/assets/voxygen/i18n/ru_RU/hud/bag.ftl new file mode 100644 index 0000000000..b39f9e1f5d --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/bag.ftl @@ -0,0 +1,41 @@ +hud-bag-inventory = Инвентарь { $playername } +hud-bag-stats_title = Характеристики { $playername } +hud-bag-exp = Опыт +hud-bag-armor = Броня +hud-bag-stats = Характеристики +hud-bag-head = Голова +hud-bag-neck = Шея +hud-bag-tabard = Плащ +hud-bag-shoulders = Плечи +hud-bag-chest = Грудь +hud-bag-hands = Руки +hud-bag-lantern = Фонарь +hud-bag-glider = Дельтаплан +hud-bag-belt = Пояс +hud-bag-ring = Кольцо +hud-bag-back = Спина +hud-bag-legs = Ноги +hud-bag-feet = Ступни +hud-bag-mainhand = Правая рука +hud-bag-offhand = Левая рука +hud-bag-inactive_mainhand = Правая рука +hud-bag-inactive_offhand = Левая рука +hud-bag-swap_equipped_weapons_title = Поменять местами экипированное оружие +hud-bag-swap_equipped_weapons_desc = Нажмите { $key } +hud-bag-bag = Рюкзак +hud-bag-health = Здоровье +hud-bag-energy = Энергия +hud-bag-combat_rating = Боевой рейтинг +hud-bag-protection = Защита +hud-bag-stun_res = Устойчивость к оглушению +hud-bag-stealth = Стелс +hud-bag-combat_rating_desc = + Рассчитано с учетом вашего + оборудования и здоровья. +hud-bag-protection_desc = Снижение урона за счет брони +hud-bag-stun_res_desc = + Устойчивость к оглушению от последовательных ударов. + Восстанавливается как энергия. +hud-bag-sort_by_name = Сортировать по имени +hud-bag-sort_by_quality = Сортировать по качеству +hud-bag-sort_by_category = Сортировать по категории \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/bag.ron b/assets/voxygen/i18n/ru_RU/hud/bag.ron deleted file mode 100644 index d1251d25ec..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/bag.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - // Inventory - "hud.bag.inventory": "Инвентарь {playername}", - "hud.bag.stats_title": "Характеристики {playername}", - "hud.bag.exp": "Опыт", - "hud.bag.armor": "Броня", - "hud.bag.stats": "Характеристики", - "hud.bag.head": "Голова", - "hud.bag.neck": "Шея", - "hud.bag.tabard": "Плащ", - "hud.bag.shoulders": "Плечи", - "hud.bag.chest": "Грудь", - "hud.bag.hands": "Руки", - "hud.bag.lantern": "Фонарь", - "hud.bag.glider": "Дельтаплан", - "hud.bag.belt": "Пояс", - "hud.bag.ring": "Кольцо", - "hud.bag.back": "Спина", - "hud.bag.legs": "Ноги", - "hud.bag.feet": "Ступни", - "hud.bag.mainhand": "Правая рука", - "hud.bag.offhand": "Левая рука", - "hud.bag.inactive_mainhand": "Правая рука", - "hud.bag.inactive_offhand": "Левая рука", - "hud.bag.swap_equipped_weapons_title": "Поменять местами экипированное оружие", - "hud.bag.swap_equipped_weapons_desc": "Нажмите {key}", - "hud.bag.bag": "Рюкзак", - "hud.bag.health": "Здоровье", - "hud.bag.energy": "Энергия", - "hud.bag.combat_rating": "Боевой рейтинг", - "hud.bag.protection": "Защита", - "hud.bag.stun_res": "Устойчивость к оглушению", - "hud.bag.stealth": "Стелс", - "hud.bag.combat_rating_desc": "Рассчитано с учетом вашего\nоборудования и здоровья.", - "hud.bag.protection_desc": "Снижение урона за счет брони", - "hud.bag.stun_res_desc": "Устойчивость к оглушению от последовательных ударов.\nВосстанавливается как энергия.", - "hud.bag.sort_by_name": "Сортировать по имени", // force update - "hud.bag.sort_by_quality": "Сортировать по качеству", - "hud.bag.sort_by_category": "Сортировать по категории", // force update - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/char_window.ftl b/assets/voxygen/i18n/ru_RU/hud/char_window.ftl new file mode 100644 index 0000000000..44ff7d20a4 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Имя персонажа +character_window-character_stats = + Выносливость + + Ловкость + + Мудрость + + Защита \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/char_window.ron b/assets/voxygen/i18n/ru_RU/hud/char_window.ron deleted file mode 100644 index 4167c51140..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "character_window.character_name": "Имя персонажа", - // Character stats - "character_window.character_stats": r#"Выносливость - -Ловкость - -Мудрость - -Защита -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/chat.ftl b/assets/voxygen/i18n/ru_RU/hud/chat.ftl new file mode 100644 index 0000000000..f310eaf83b --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Все +hud-chat-chat_tab_hover_tooltip = ПКМ для настроек +hud-outcome-burning = Сгорел +hud-outcome-curse = Умер от проклятия +hud-outcome-bleeding = Умер от кровотечения +hud-outcome-crippled = Умер от множества травм +hud-outcome-frozen = Замёрз насмерть +hud-chat-online_msg = [{ $name }] сейчас в сети +hud-chat-offline_msg = [{ $name }] вышел из сети +hud-chat-default_death_msg = [{ $name }] умер +hud-chat-environmental_kill_msg = [{ $name }] умер в { $environment } +hud-chat-fall_kill_msg = [{ $name }] умер от падения +hud-chat-suicide_msg = [{ $name }] умер от ран, нанесенных самому себе +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } вызванного [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] победил [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] застрелил [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] взорвал [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] убил [{ $victim }] магией +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } вызванного { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } убил [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } застрелил [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } взорвал [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } убил [{ $victim }] магией +hud-chat-npc_other_kill_msg = { $attacker } убил [{ $victim }] +hud-chat-loot_msg = Вы подобрали [{ $item }] +hud-chat-loot_fail = Ваш инвернарь полон! +hud-chat-goodbye = До свидания! +hud-chat-connection_lost = Соединение потеряно.Выход через { $time } секунд. \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/chat.ron b/assets/voxygen/i18n/ru_RU/hud/chat.ron deleted file mode 100644 index 7992d1fb79..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.chat.all": "Все", - "hud.chat.chat_tab_hover_tooltip": "ПКМ для настроек", - - // Debuff outcomes - "hud.outcome.burning": "Сгорел", - "hud.outcome.curse": "Умер от проклятия", - "hud.outcome.bleeding": "Умер от кровотечения", - "hud.outcome.crippled": "Умер от множества травм", - "hud.outcome.frozen": "Замёрз насмерть", - - // Chat outputs - "hud.chat.online_msg": "[{name}] сейчас в сети", - "hud.chat.offline_msg": "[{name}] вышел из сети", - - "hud.chat.default_death_msg": "[{name}] умер", - "hud.chat.environmental_kill_msg": "[{name}] умер в {environment}", - "hud.chat.fall_kill_msg": "[{name}] умер от падения", - "hud.chat.suicide_msg": "[{name}] умер от ран, нанесенных самому себе", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} вызванного [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] победил [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] застрелил [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] взорвал [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] убил [{victim}] магией", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} вызванного {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} убил [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} застрелил [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} взорвал [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} убил [{victim}] магией", - "hud.chat.npc_other_kill_msg": "{attacker} убил [{victim}]", - - "hud.chat.loot_msg": "Вы подобрали [{item}]", - "hud.chat.loot_fail": "Ваш инвернарь полон!", - "hud.chat.goodbye": "До свидания!", - "hud.chat.connection_lost": "Соединение потеряно.Выход через {time} секунд.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/crafting.ftl b/assets/voxygen/i18n/ru_RU/hud/crafting.ftl new file mode 100644 index 0000000000..a9761f16a7 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/crafting.ftl @@ -0,0 +1,44 @@ +hud-crafting = Крафт +hud-crafting-recipes = Рецепты +hud-crafting-ingredients = Ингредиенты: +hud-crafting-craft = Создать +hud-crafting-tool_cata = Необходимо: +hud-crafting-req_crafting_station = Необходимо: +hud-crafting-anvil = Наковальня +hud-crafting-cauldron = Зельеварочный котёл +hud-crafting-cooking_pot = Котелок +hud-crafting-crafting_bench = Верстак +hud-crafting-forge = Кузница +hud-crafting-loom = Ткацкий станок +hud-crafting-spinning_wheel = Прялка +hud-crafting-tanning_rack = Стойка для дубления кожи +hud-crafting-salvaging_station = Станция разборки +hud-crafting-campfire = Костёр +hud-crafting-tabs-all = Все +hud-crafting-tabs-armor = Броня +hud-crafting-tabs-dismantle = Разобрать +hud-crafting-tabs-food = Еда +hud-crafting-tabs-glider = Дельтапланы +hud-crafting-tabs-potion = Зелья +hud-crafting-tabs-tool = Инструменты +hud-crafting-tabs-utility = Утилиты +hud-crafting-tabs-weapon = Оружие +hud-crafting-tabs-bag = Рюкзаки +hud-crafting-tabs-processed_material = Материалы +hud-crafting-dismantle_title = Разборка +hud-crafting-dismantle_explanation = + Наведите курсор на предмет что бы увидеть + что вы можете получить. + + Двойное нажатие для начала разборки. +hud-crafting-modular_desc = Перетащите сюда часть предметов, чтобы создать оружие. +hud-crafting-mod_weap_prim_slot_title = Основной компонент оружия +hud-crafting-mod_weap_prim_slot_desc = Поместите сюда основной компонент оружия (например клинок меча, топорище, или плечо лука). +hud-crafting-mod_weap_sec_slot_title = Вторичный компонент оружия +hud-crafting-mod_weap_sec_slot_desc = Поместите сюда вторичный компонент оружи (например рукоять меча, рукоять лука или сердцевину посоха). +hud-crafting-mod_comp_metal_prim_slot_title = Металлический слиток +hud-crafting-mod_comp_metal_prim_slot_desc = Положите сюда металлический слиток, только определенные металлы можно использовать для изготовления оружия. +hud-crafting-mod_comp_wood_prim_slot_title = Дерево +hud-crafting-mod_comp_wood_prim_slot_desc = Положите сюда дерево, только определенное дерево можно использовать для изготовления оружия. +hud-crafting-mod_comp_sec_slot_title = Животный материал +hud-crafting-mod_comp_sec_slot_desc = При желании поместите сюда животный материал, только определенные ингредиенты можно использовать для улучшения оружия. \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/crafting.ron b/assets/voxygen/i18n/ru_RU/hud/crafting.ron deleted file mode 100644 index ac1d8a6528..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/crafting.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.crafting": "Крафт ", - "hud.crafting.recipes": "Рецепты", - "hud.crafting.ingredients": "Ингредиенты:", - "hud.crafting.craft": "Создать", - "hud.crafting.tool_cata": "Необходимо:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Необходимо:", - "hud.crafting.anvil": "Наковальня", - "hud.crafting.cauldron": "Зельеварочный котёл", - "hud.crafting.cooking_pot": "Котелок", - "hud.crafting.crafting_bench": "Верстак", - "hud.crafting.forge": "Кузница", - "hud.crafting.loom": "Ткацкий станок", - "hud.crafting.spinning_wheel": "Прялка", - "hud.crafting.tanning_rack": "Стойка для дубления кожи", - "hud.crafting.salvaging_station": "Станция разборки", - "hud.crafting.campfire": "Костёр", - // Tabs - "hud.crafting.tabs.all": "Все", - "hud.crafting.tabs.armor": "Броня", - "hud.crafting.tabs.dismantle": "Разобрать", - "hud.crafting.tabs.food": "Еда", - "hud.crafting.tabs.glider": "Дельтапланы", - "hud.crafting.tabs.potion": "Зелья", - "hud.crafting.tabs.tool": "Инструменты", - "hud.crafting.tabs.utility": "Утилиты", - "hud.crafting.tabs.weapon": "Оружие", - "hud.crafting.tabs.bag": "Рюкзаки", - "hud.crafting.tabs.processed_material": "Материалы", - "hud.crafting.dismantle_title": "Разборка", - "hud.crafting.dismantle_explanation" : "Наведите курсор на предмет что бы увидеть\nчто вы можете получить.\n\nДвойное нажатие для начала разборки.", - "hud.crafting.modular_desc": "Перетащите сюда часть предметов, чтобы создать оружие.", - "hud.crafting.mod_weap_prim_slot_title": "Основной компонент оружия", - "hud.crafting.mod_weap_prim_slot_desc": "Поместите сюда основной компонент оружия (например клинок меча, топорище, или плечо лука).", - "hud.crafting.mod_weap_sec_slot_title": "Вторичный компонент оружия", - "hud.crafting.mod_weap_sec_slot_desc": "Поместите сюда вторичный компонент оружи (например рукоять меча, рукоять лука или сердцевину посоха).", - "hud.crafting.mod_comp_metal_prim_slot_title": "Металлический слиток", - "hud.crafting.mod_comp_metal_prim_slot_desc": "Положите сюда металлический слиток, только определенные металлы можно использовать для изготовления оружия.", - "hud.crafting.mod_comp_wood_prim_slot_title": "Дерево", - "hud.crafting.mod_comp_wood_prim_slot_desc": "Положите сюда дерево, только определенное дерево можно использовать для изготовления оружия.", - "hud.crafting.mod_comp_sec_slot_title": "Животный материал", - "hud.crafting.mod_comp_sec_slot_desc": "При желании поместите сюда животный материал, только определенные ингредиенты можно использовать для улучшения оружия.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/group.ftl b/assets/voxygen/i18n/ru_RU/hud/group.ftl new file mode 100644 index 0000000000..285b2b87cb --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Группа +hud-group-invite_to_join = [{ $name }] пригласил вас в свою группу! +hud-group-invite_to_trade = [{ $name }] предлогает вам поторговать. +hud-group-invite = Приглашение +hud-group-kick = Выгнать +hud-group-assign_leader = Назначить лидером +hud-group-leave = Покинуть группу +hud-group-dead = Мёртвый +hud-group-out_of_range = Вне досягаемости +hud-group-add_friend = Добавить в друзъя +hud-group-link_group = Объединить группы +hud-group-in_menu = В меню +hud-group-members = Члены группы \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/group.ron b/assets/voxygen/i18n/ru_RU/hud/group.ron deleted file mode 100644 index ac5373ca7a..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.group": "Группа", - "hud.group.invite_to_join": "[{name}] пригласил вас в свою группу!", - "hud.group.invite_to_trade": "[{name}] предлогает вам поторговать.", - "hud.group.invite": "Приглашение", - "hud.group.kick": "Выгнать", - "hud.group.assign_leader": "Назначить лидером", - "hud.group.leave": "Покинуть группу", - "hud.group.dead" : "Мёртвый", - "hud.group.out_of_range": "Вне досягаемости", - "hud.group.add_friend": "Добавить в друзъя", - "hud.group.link_group": "Объединить группы", - "hud.group.in_menu": "В меню", - "hud.group.members": "Члены группы", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/map.ftl b/assets/voxygen/i18n/ru_RU/hud/map.ftl new file mode 100644 index 0000000000..a632274e16 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/map.ftl @@ -0,0 +1,38 @@ +hud-map-map_title = Карта +hud-map-qlog_title = Задания +hud-map-topo_map = Топографическая карта +hud-map-difficulty = Сложность +hud-map-towns = Города +hud-map-castles = Замки +hud-map-dungeons = Подземелья +hud-map-caves = Пещеры +hud-map-cave = Пещера +hud-map-peaks = Горы +hud-map-biomes = Биомы +hud-map-voxel_map = Воксельная карта +hud-map-trees = + Гигантские + деревья +hud-map-tree = + Гигантское + дерево +hud-map-town = Город +hud-map-castle = Замок +hud-map-dungeon = Подземелье +hud-map-difficulty_dungeon = + Подземелье + + Сложность: { $difficulty } +hud-map-drag = Переместить +hud-map-zoom = Увеличить +hud-map-mid_click = + Установить + отметку +hud-map-recenter = По центру +hud-map-marked_location = Отмеченное место +hud-map-marked_location_remove = Нажмите, чтобы удалить +hud-map-change_map_mode = Изменить режим карты +hud-map-toggle_minimap_voxel = Подробная миникарта +hud-map-zoom_minimap_explanation = Увеличьте миникарту, чтобы более детально рассмотреть область вокруг вас. +hud-map-gnarling = Форт Гнарлингов +hud-map-placed_by = Метка установлена { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/map.ron b/assets/voxygen/i18n/ru_RU/hud/map.ron deleted file mode 100644 index 9ff2a3b2f7..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Карта", - "hud.map.qlog_title": "Задания", - "hud.map.topo_map": "Топографическая карта", - "hud.map.difficulty": "Сложность", - "hud.map.towns": "Города", - "hud.map.castles": "Замки", - "hud.map.dungeons": "Подземелья", - "hud.map.caves": "Пещеры", - "hud.map.cave": "Пещера", - "hud.map.peaks": "Горы", - "hud.map.biomes": "Биомы", - "hud.map.voxel_map": "Воксельная карта", - "hud.map.trees": "Гигантские\nдеревья", - "hud.map.tree": "Гигантское\nдерево", - "hud.map.town": "Город", - "hud.map.castle": "Замок", - "hud.map.dungeon": "Подземелье", - "hud.map.difficulty_dungeon": "Подземелье\n\nСложность: {difficulty}", - "hud.map.drag": "Переместить", - "hud.map.zoom": "Увеличить", - "hud.map.mid_click": "Установить\nотметку", - "hud.map.recenter": "По центру", - "hud.map.marked_location": "Отмеченное место", - "hud.map.marked_location_remove": "Нажмите, чтобы удалить", - "hud.map.change_map_mode": "Изменить режим карты", - "hud.map.toggle_minimap_voxel": "Подробная миникарта", - "hud.map.zoom_minimap_explanation": "Увеличьте миникарту, чтобы более детально рассмотреть область вокруг вас.", - "hud.map.gnarling": "Форт Гнарлингов", - "hud.map.placed_by": "Метка установлена {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/misc.ftl b/assets/voxygen/i18n/ru_RU/hud/misc.ftl new file mode 100644 index 0000000000..19231d1f08 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/misc.ftl @@ -0,0 +1,45 @@ +hud-do_not_show_on_startup = Не показывать это при запуске +hud-show_tips = Показать советы +hud-quests = Задания +hud-you_died = Вы умерли +hud-waypoint_saved = Путевая точка сохранена +hud-sp_arrow_txt = SP +hud-inventory_full = Инвентарь полон +hud-someone_else = Кто-нибудь другой +hud-owned_by_for_secs = Принадлежит { $name } в течение { $secs } сек. +hud-press_key_to_show_keybindings_fmt = [{ $key }] Сочетания клавиш +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Фонарь +hud-press_key_to_show_debug_info_fmt = Нажмите { $key }, чтобы показать отладочную информацию +hud-press_key_to_toggle_keybindings_fmt = Нажмите { $key }, чтобы переключить сочетания клавиш +hud-press_key_to_toggle_debug_info_fmt = Нажмите { $key }, чтобы переключить отладочную информацию +hud-press_key_to_respawn = Нажмите { $key }, чтобы возродиться у последнего костра. +hud-tutorial_btn = Руководство +hud-tutorial_click_here = Нажмите [ { $key } ], чтобы включить курсор и нажмите эту кнопку! +hud-tutorial_elements = Крафт +hud-temp_quest_headline = Привет путешественник! +hud-temp_quest_text = + Для начала, вы можете осматреть эту деревню и собрать немного припасов. // force update + + Вы можете взять с собой в путешествие все, что вам нужно! + + Посмотрите в правый нижний угол экрана, чтобы найти различные вещи, такие как ваша сумка, меню крафта и карта. + + Станки для крафта позволяют создавать доспехи, оружие, еду и многое другое! + + Дикие животные по всему городу - отличный источник шкуры животных, из которой вы можете сделать защиту от опасностей этого мира. + + Когда почувствуете себя готовым, постарайтесь получить еще лучшее снаряжение из множества испытаний, отмеченных на вашей карте! +hud-spell = Способности +hud-diary = Дневник +hud-free_look_indicator = Активирован свободный вид. Чтобы отключить, нажмите { $key }. +hud-camera_clamp_indicator = Активирован вертикальный фиксатор камеры. Чтобы отключить, нажмите { $key }. +hud-auto_walk_indicator = Активирована автоматическая ходьба/плавание +hud-collect = Собрать +hud-pick_up = Подобрать +hud-open = Открыть +hud-use = Использовать +hud-mine = Добыть +hud-talk = Говорить +hud-trade = Торговать +hud-mount = Оседлать +hud-sit = Сесть \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/misc.ron b/assets/voxygen/i18n/ru_RU/hud/misc.ron deleted file mode 100644 index a62de56bdd..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/misc.ron +++ /dev/null @@ -1,65 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.do_not_show_on_startup": "Не показывать это при запуске", - "hud.show_tips": "Показать советы", - "hud.quests": "Задания", - "hud.you_died": "Вы умерли", - "hud.waypoint_saved": "Путевая точка сохранена", - "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Инвентарь полон", - "hud.someone_else": "Кто-нибудь другой", - "hud.owned_by_for_secs": "Принадлежит {name} в течение {secs} сек.", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Сочетания клавиш", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Фонарь", - "hud.press_key_to_show_debug_info_fmt": "Нажмите {key}, чтобы показать отладочную информацию", - "hud.press_key_to_toggle_keybindings_fmt": "Нажмите {key}, чтобы переключить сочетания клавиш", - "hud.press_key_to_toggle_debug_info_fmt": "Нажмите {key}, чтобы переключить отладочную информацию", - - // Respawn message - "hud.press_key_to_respawn": r#"Нажмите {key}, чтобы возродиться у последнего костра."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Руководство"#, - "hud.tutorial_click_here": r#"Нажмите [ {key} ], чтобы включить курсор и нажмите эту кнопку!"#, - "hud.tutorial_elements": r#"Крафт"#, - -"hud.temp_quest_headline": r#"Привет путешественник!"#, -"hud.temp_quest_text": r#"Для начала, вы можете осматреть эту деревню и собрать немного припасов. // force update - -Вы можете взять с собой в путешествие все, что вам нужно! - -Посмотрите в правый нижний угол экрана, чтобы найти различные вещи, такие как ваша сумка, меню крафта и карта. - -Станки для крафта позволяют создавать доспехи, оружие, еду и многое другое! - -Дикие животные по всему городу - отличный источник шкуры животных, из которой вы можете сделать защиту от опасностей этого мира. - -Когда почувствуете себя готовым, постарайтесь получить еще лучшее снаряжение из множества испытаний, отмеченных на вашей карте! -"#, - - "hud.spell": "Способности", - // Diary - "hud.diary": "Дневник", - - "hud.free_look_indicator": "Активирован свободный вид. Чтобы отключить, нажмите {key}.", - "hud.camera_clamp_indicator": "Активирован вертикальный фиксатор камеры. Чтобы отключить, нажмите {key}.", - "hud.auto_walk_indicator": "Активирована автоматическая ходьба/плавание", - "hud.collect": "Собрать", - "hud.pick_up": "Подобрать", - "hud.open": "Открыть", - "hud.use": "Использовать", - "hud.mine": "Добыть", - "hud.talk": "Говорить", - "hud.trade": "Торговать", - "hud.mount": "Оседлать", - "hud.sit": "Сесть", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/sct.ftl b/assets/voxygen/i18n/ru_RU/hud/sct.ftl new file mode 100644 index 0000000000..b15219232d --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Опыта +hud-sct-block = БЛОК \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/sct.ron b/assets/voxygen/i18n/ru_RU/hud/sct.ron deleted file mode 100644 index 381a1416c2..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Опыта", - "hud.sct.block": "БЛОК", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/settings.ftl b/assets/voxygen/i18n/ru_RU/hud/settings.ftl new file mode 100644 index 0000000000..8cf9f0186e --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/settings.ftl @@ -0,0 +1,131 @@ +hud-settings-general = Общие +hud-settings-none = Нет +hud-settings-press_behavior-toggle = Вкл/Выкл +hud-settings-press_behavior-hold = Удержание +hud-settings-help_window = Окно помощи +hud-settings-debug_info = Отладочная информация +hud-settings-show_hitboxes = Отображать хитбоксы +hud-settings-show_chat = Отображать чат +hud-settings-show_hotkey_hints = Показывать подсказки клавиш +hud-settings-tips_on_startup = Советы при запуске +hud-settings-ui_scale = Масштаб пользовательского интерфейса +hud-settings-relative_scaling = Стандартное масштабирование +hud-settings-custom_scaling = Настраиваемое масштабирование +hud-settings-crosshair = Перекрестие +hud-settings-opacity = Прозрачность +hud-settings-hotbar = Панель быстрого доступа +hud-settings-toggle_shortcuts = Отображать горячие клавиши +hud-settings-buffs_skillbar = Баффы на панели навыков +hud-settings-buffs_mmap = Баффы возле миникарте +hud-settings-toggle_bar_experience = Переключить панель опыта +hud-settings-scrolling_combat_text = Отображение урона/исцеления +hud-settings-incoming_damage = Отдельно полученный +hud-settings-speech_bubble = Диалоговое окно +hud-settings-speech_bubble_self = Показывать каждое отдельное окно +hud-settings-speech_bubble_dark_mode = Диалоговое окно (тёмная тема) +hud-settings-speech_bubble_icon = Иконка диалогового окна +hud-settings-energybar_numbers = Значения на панели энергии +hud-settings-always_show_bars = Всегда показывать панели энергии +hud-settings-values = Цифры +hud-settings-percentages = Проценты +hud-settings-chat = Чат +hud-settings-background_opacity = Прозрачность фона +hud-settings-chat_character_name = Имена персонажей в чате +hud-settings-loading_tips = Советы при загрузке +hud-settings-reset_interface = По умолчанию +hud-settings-pan_sensitivity = Чувствительность мыши +hud-settings-zoom_sensitivity = Чувствительность масштабирования +hud-settings-camera_clamp_angle = Угол для режима вертикального фиксатора камеры +hud-settings-invert_scroll_zoom = Инвертировать масштаб прокрутки +hud-settings-invert_mouse_y_axis = Инвертировать ось Y мыши +hud-settings-invert_controller_y_axis = Инвертировать ось Y контроллера +hud-settings-enable_mouse_smoothing = Сглаживание камеры +hud-settings-free_look_behavior = Свободное поведение +hud-settings-auto_walk_behavior = Поведение при автоматической ходьбе +hud-settings-camera_clamp_behavior = Поведение вертикального фиксатора камеры +hud-settings-player_physics_behavior = Физика игрока (экспериментальная) +hud-settings-stop_auto_walk_on_input = Остановить автоходьбу при движении +hud-settings-auto_camera = Авто-камера +hud-settings-bow_zoom = Приближение при натягивании тетивы +hud-settings-reset_gameplay = По умолчанию +hud-settings-view_distance = + Дальность + видимости +hud-settings-lod_distance = Дистанция LoD +hud-settings-sprites_view_distance = + Дальность + видимости спрайтов +hud-settings-figures_view_distance = + Дальность + видимости объектов +hud-settings-maximum_fps = Максимальный FPS +hud-settings-background_fps = FPS в фоновом режиме +hud-settings-present_mode = Режим показа +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = Угол обзора (град.) +hud-settings-gamma = Гамма +hud-settings-exposure = Экспозиция +hud-settings-ambiance = Яркость окружения +hud-settings-antialiasing_mode = Режим сглаживания +hud-settings-upscale_factor = Внутреннее разрешение +hud-settings-cloud_rendering_mode = Качество облаков +hud-settings-fluid_rendering_mode = Качество воды +hud-settings-fluid_rendering_mode-cheap = Низкое +hud-settings-fluid_rendering_mode-shiny = Высокое +hud-settings-cloud_rendering_mode-minimal = Минимальное +hud-settings-cloud_rendering_mode-low = Низкое +hud-settings-cloud_rendering_mode-medium = Среднее +hud-settings-cloud_rendering_mode-high = Высокое +hud-settings-cloud_rendering_mode-ultra = Ультра +hud-settings-fullscreen = Полноэкранный +hud-settings-fullscreen_mode = Полноэкранный режим +hud-settings-fullscreen_mode-exclusive = Полноэкранный режим +hud-settings-fullscreen_mode-borderless = Окно без рамок +hud-settings-gpu_profiler = Замеры GPU (не везде поддерживается) +hud-settings-particles = Частицы +hud-settings-lossy_terrain_compression = Сжатие рельефа с потерями +hud-settings-weapon_trails = Эффект оружия +hud-settings-resolution = Разрешение +hud-settings-bit_depth = Битовая глубина +hud-settings-refresh_rate = Частота обновления +hud-settings-lighting_rendering_mode = Качество освещения +hud-settings-lighting_rendering_mode-ashikhmin = Высокое +hud-settings-lighting_rendering_mode-blinnphong = Среднее +hud-settings-lighting_rendering_mode-lambertian = Низкое +hud-settings-shadow_rendering_mode = Качество тени +hud-settings-shadow_rendering_mode-none = Отключено +hud-settings-shadow_rendering_mode-cheap = Низкое +hud-settings-shadow_rendering_mode-map = Высокое +hud-settings-shadow_rendering_mode-map-resolution = Разрешение +hud-settings-lod_detail = Уровень детализации +hud-settings-save_window_size = Сохранить размер окна +hud-settings-reset_graphics = По умолчанию +hud-settings-bloom = Свечение +hud-settings-point_glow = Источники света +hud-settings-master_volume = Общая громкость +hud-settings-inactive_master_volume_perc = Громкость неактивного окна +hud-settings-music_volume = Громкость музыки +hud-settings-sound_effect_volume = Громкость эффектов +hud-settings-audio_device = Аудио-устройство +hud-settings-reset_sound = По умолчанию +hud-settings-english_fallback = Отображать английский для отсутствующих переводов +hud-settings-awaitingkey = Нажмите клавишу... +hud-settings-unbound = Отсутствует +hud-settings-reset_keybinds = По умолчанию +hud-settings-chat_tabs = Вкладки чата +hud-settings-label = Ярлык: +hud-settings-delete = Удалить +hud-settings-show_all = Отображать все +hud-settings-messages = Сообщения +hud-settings-activity = Активность +hud-settings-death = Смерть +hud-settings-group = Группа +hud-settings-faction = Фракция +hud-settings-world = Мир +hud-settings-region = Регион +hud-settings-say = Сказать +hud-settings-all = Все +hud-settings-group_only = Только группа +hud-settings-reset_chat = По умолчанию \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/settings.ron b/assets/voxygen/i18n/ru_RU/hud/settings.ron deleted file mode 100644 index 64c6ffc193..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/settings.ron +++ /dev/null @@ -1,143 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - // Settings - "hud.settings.general": "Общие", - "hud.settings.none": "Нет", - "hud.settings.press_behavior.toggle": "Вкл/Выкл", - "hud.settings.press_behavior.hold": "Удержание", - "hud.settings.help_window": "Окно помощи", - "hud.settings.debug_info": "Отладочная информация", - "hud.settings.show_hitboxes": "Отображать хитбоксы", - "hud.settings.show_chat": "Отображать чат", - "hud.settings.show_hotkey_hints": "Показывать подсказки клавиш", - "hud.settings.tips_on_startup": "Советы при запуске", - "hud.settings.ui_scale": "Масштаб пользовательского интерфейса", - "hud.settings.relative_scaling": "Стандартное масштабирование", - "hud.settings.custom_scaling": "Настраиваемое масштабирование", - "hud.settings.crosshair": "Перекрестие", - "hud.settings.opacity": "Прозрачность", - "hud.settings.hotbar": "Панель быстрого доступа", - "hud.settings.toggle_shortcuts": "Отображать горячие клавиши", - "hud.settings.buffs_skillbar": "Баффы на панели навыков", - "hud.settings.buffs_mmap": "Баффы возле миникарте", - "hud.settings.toggle_bar_experience": "Переключить панель опыта", - "hud.settings.scrolling_combat_text": "Отображение урона/исцеления", - "hud.settings.incoming_damage": "Отдельно полученный", - "hud.settings.speech_bubble": "Диалоговое окно", - "hud.settings.speech_bubble_self": "Показывать каждое отдельное окно", - "hud.settings.speech_bubble_dark_mode": "Диалоговое окно (тёмная тема)", - "hud.settings.speech_bubble_icon": "Иконка диалогового окна", - "hud.settings.energybar_numbers": "Значения на панели энергии", - "hud.settings.always_show_bars": "Всегда показывать панели энергии", - "hud.settings.values": "Цифры", - "hud.settings.percentages": "Проценты", - "hud.settings.chat": "Чат", - "hud.settings.background_opacity": "Прозрачность фона", - "hud.settings.chat_character_name": "Имена персонажей в чате", // force update - "hud.settings.loading_tips": "Советы при загрузке", - "hud.settings.reset_interface": "По умолчанию", - - "hud.settings.pan_sensitivity": "Чувствительность мыши", - "hud.settings.zoom_sensitivity": "Чувствительность масштабирования", - "hud.settings.camera_clamp_angle": "Угол для режима вертикального фиксатора камеры", - "hud.settings.invert_scroll_zoom": "Инвертировать масштаб прокрутки", - "hud.settings.invert_mouse_y_axis": "Инвертировать ось Y мыши", - "hud.settings.invert_controller_y_axis": "Инвертировать ось Y контроллера", - "hud.settings.enable_mouse_smoothing": "Сглаживание камеры", - "hud.settings.free_look_behavior": "Свободное поведение", - "hud.settings.auto_walk_behavior": "Поведение при автоматической ходьбе", - "hud.settings.camera_clamp_behavior": "Поведение вертикального фиксатора камеры", - "hud.settings.player_physics_behavior": "Физика игрока (экспериментальная)", - "hud.settings.stop_auto_walk_on_input": "Остановить автоходьбу при движении", - "hud.settings.auto_camera": "Авто-камера", - "hud.settings.bow_zoom": "Приближение при натягивании тетивы", - "hud.settings.reset_gameplay": "По умолчанию", - - "hud.settings.view_distance": "Дальность\nвидимости", - "hud.settings.lod_distance": "Дистанция LoD", - "hud.settings.sprites_view_distance": "Дальность\nвидимости спрайтов", - "hud.settings.figures_view_distance": "Дальность\nвидимости объектов", - "hud.settings.maximum_fps": "Максимальный FPS", - "hud.settings.background_fps": "FPS в фоновом режиме", - "hud.settings.present_mode": "Режим показа", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "Угол обзора (град.)", - "hud.settings.gamma": "Гамма", - "hud.settings.exposure": "Экспозиция", - "hud.settings.ambiance": "Яркость окружения", - "hud.settings.antialiasing_mode": "Режим сглаживания", - "hud.settings.upscale_factor": "Внутреннее разрешение", - "hud.settings.cloud_rendering_mode": "Качество облаков", - "hud.settings.fluid_rendering_mode": "Качество воды", - "hud.settings.fluid_rendering_mode.cheap": "Низкое", - "hud.settings.fluid_rendering_mode.shiny": "Высокое", - "hud.settings.cloud_rendering_mode.minimal": "Минимальное", - "hud.settings.cloud_rendering_mode.low": "Низкое", - "hud.settings.cloud_rendering_mode.medium": "Среднее", - "hud.settings.cloud_rendering_mode.high": "Высокое", - "hud.settings.cloud_rendering_mode.ultra": "Ультра", - "hud.settings.fullscreen": "Полноэкранный", - "hud.settings.fullscreen_mode": "Полноэкранный режим", - "hud.settings.fullscreen_mode.exclusive": "Полноэкранный режим", - "hud.settings.fullscreen_mode.borderless": "Окно без рамок", - "hud.settings.gpu_profiler": "Замеры GPU (не везде поддерживается)", - "hud.settings.particles": "Частицы", - "hud.settings.lossy_terrain_compression": "Сжатие рельефа с потерями", - "hud.settings.weapon_trails": "Эффект оружия", - "hud.settings.resolution": "Разрешение", - "hud.settings.bit_depth": "Битовая глубина", - "hud.settings.refresh_rate": "Частота обновления", - "hud.settings.lighting_rendering_mode": "Качество освещения", - "hud.settings.lighting_rendering_mode.ashikhmin": "Высокое", - "hud.settings.lighting_rendering_mode.blinnphong": "Среднее", - "hud.settings.lighting_rendering_mode.lambertian": "Низкое", - "hud.settings.shadow_rendering_mode": "Качество тени", - "hud.settings.shadow_rendering_mode.none": "Отключено", - "hud.settings.shadow_rendering_mode.cheap": "Низкое", - "hud.settings.shadow_rendering_mode.map": "Высокое", - "hud.settings.shadow_rendering_mode.map.resolution": "Разрешение", - "hud.settings.lod_detail": "Уровень детализации", - "hud.settings.save_window_size": "Сохранить размер окна", - "hud.settings.reset_graphics": "По умолчанию", - "hud.settings.bloom": "Свечение", - "hud.settings.point_glow": "Источники света", - - "hud.settings.master_volume": "Общая громкость", - "hud.settings.inactive_master_volume_perc": "Громкость неактивного окна", - "hud.settings.music_volume": "Громкость музыки", - "hud.settings.sound_effect_volume": "Громкость эффектов", - "hud.settings.audio_device": "Аудио-устройство", - "hud.settings.reset_sound": "По умолчанию", - - "hud.settings.english_fallback": "Отображать английский для отсутствующих переводов", - - "hud.settings.awaitingkey": "Нажмите клавишу...", - "hud.settings.unbound": "Отсутствует", - "hud.settings.reset_keybinds": "По умолчанию", - - "hud.settings.chat_tabs": "Вкладки чата", - "hud.settings.label": "Ярлык:", - "hud.settings.delete": "Удалить", - "hud.settings.show_all": "Отображать все", - "hud.settings.messages": "Сообщения", - "hud.settings.activity": "Активность", - "hud.settings.death": "Смерть", - "hud.settings.group": "Группа", - "hud.settings.faction": "Фракция", - "hud.settings.world": "Мир", - "hud.settings.region": "Регион", - "hud.settings.say": "Сказать", - "hud.settings.all": "Все", - "hud.settings.group_only": "Только группа", - "hud.settings.reset_chat" : "По умолчанию", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/skills.ftl b/assets/voxygen/i18n/ru_RU/hud/skills.ftl new file mode 100644 index 0000000000..7a1f8f3823 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Новый SP +hud-skill-sp_available = { $number } SP доступны +hud-skill-not_unlocked = Еще не разблокирован +hud-skill-req_sp ={"\u000A"} + + Необходимо { $number } SP +hud-skill-inc_health_title = Повышение здоровья +hud-skill-inc_health = Увеличивает максимальное здоровье на { $boost }{ $SP } +hud-skill-inc_energy_title = Повышение энергии +hud-skill-inc_energy = Увеличивает максимальную энергию на { $boost }{ $SP } +hud-skill-unlck_sword_title = Разблокировать меч +hud-skill-unlck_sword = Разблокировать древо навыков владения мечом{ $SP } +hud-skill-unlck_axe_title = Разблокировать топор +hud-skill-unlck_axe = Разблокировать древо навыков владения топором{ $SP } +hud-skill-unlck_hammer_title = Разблокировать молот +hud-skill-unlck_hammer = Разблокировать древо навыков владения молотом{ $SP } +hud-skill-unlck_bow_title = Разблокировать лук +hud-skill-unlck_bow = Разблокировать древо навыков владения луком{ $SP } +hud-skill-unlck_staff_title = Разблокировать посох +hud-skill-unlck_staff = Разблокировать древо навыков владения посохом{ $SP } +hud-skill-unlck_sceptre_title = Разблокировать скипетр +hud-skill-unlck_sceptre = Разблокировать древо навыков владения скипетром{ $SP } +hud-skill-dodge_title = Перекат +hud-skill-dodge = Во время переката вы игнорируете урон почти от всех атак ближнего боя. +hud-skill-roll_energy_title = Расход энергии +hud-skill-roll_energy = Перекат использует на { $boost }% меньше энергии{ $SP } +hud-skill-roll_speed_title = Скорость +hud-skill-roll_speed = Перекат на { $boost }% быстрее{ $SP } +hud-skill-roll_dur_title = Продолжительность переката +hud-skill-roll_dur = Перекат на { $boost }% дольше{ $SP } +hud-skill-climbing_title = Скалолазание +hud-skill-climbing = Высота прыжка на вершине подъема +hud-skill-climbing_cost_title = Расход энергии +hud-skill-climbing_cost = Скалолазание использует на { $boost }% меньше энергии{ $SP } +hud-skill-climbing_speed_title = Скорость +hud-skill-climbing_speed = Вы поднимаетесь на { $boost }% быстрее{ $SP } +hud-skill-swim_title = Плавание +hud-skill-swim = Перемещение в воде +hud-skill-swim_speed_title = Скорость +hud-skill-swim_speed = Плавание на { $boost }% быстрее{ $SP } +hud-skill-sc_lifesteal_title = Вампирский луч +hud-skill-sc_lifesteal = Высосите жизнь из ваших врагов +hud-skill-sc_lifesteal_damage_title = Урон +hud-skill-sc_lifesteal_damage = Наносит на { $boost }% больше урона{ $SP } +hud-skill-sc_lifesteal_range_title = Дальность +hud-skill-sc_lifesteal_range = Ваш луч на { $boost }% дальше{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Вампиризм +hud-skill-sc_lifesteal_lifesteal = Преобразуйте дополнительные { $boost }% урона в здоровье{ $SP } +hud-skill-sc_lifesteal_regen_title = Восстановление энергии +hud-skill-sc_lifesteal_regen = Востановите свою энергию на { $boost }%{ $SP } +hud-skill-sc_heal_title = Луч жизни +hud-skill-sc_heal = Исцелите союзников, используя кровь своих врагов. Требует комбо для активации +hud-skill-sc_heal_heal_title = Лечение +hud-skill-sc_heal_heal = Увеличивает эффективность исцеления союзников на { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Расход энергии +hud-skill-sc_heal_cost = Исцеление требует на { $boost }% меньше энергии{ $SP } +hud-skill-sc_heal_duration_title = Длительность эффекта +hud-skill-sc_heal_duration = Эффекты ауры исцеления длятся на { $boost }% дольше longer{ $SP } +hud-skill-sc_heal_range_title = Дальность +hud-skill-sc_heal_range = Ваш луч на { $boost }% дальше{ $SP } +hud-skill-sc_wardaura_unlock_title = Аура защиты +hud-skill-sc_wardaura_unlock = Позволяет вам повысить защиту своих союзников (и себя){ $SP } +hud-skill-sc_wardaura_strength_title = Сила +hud-skill-sc_wardaura_strength = Сила вашей брони увеличивается на { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Продолжительность +hud-skill-sc_wardaura_duration = Эффект длится на { $boost }% дольше{ $SP } +hud-skill-sc_wardaura_range_title = Радиус +hud-skill-sc_wardaura_range = Радиус на { $boost }% больше{ $SP } +hud-skill-sc_wardaura_cost_title = Расход энергии +hud-skill-sc_wardaura_cost = Создание ауры потребует на { $boost }% меньше энергии{ $SP } +hud-skill-st_shockwave_range_title = Радиус кольца +hud-skill-st_shockwave_range = Радиус больше на { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Расход энергии +hud-skill-st_shockwave_cost = Затраты энергии ниже на { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Отбрасывание волны +hud-skill-st_shockwave_knockback = Увеличивает потенциал отбрасывания на { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Урон +hud-skill-st_shockwave_damage = Увеличивает урон кольца огня на { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Кольцо огня +hud-skill-st_shockwave_unlock = Открывает возможность отбрасывать врагов с помощью огня{ $SP } +hud-skill-st_flamethrower_title = Поток пламени +hud-skill-st_flamethrower = Испускает плотный поток пламени из вашего посоха +hud-skill-st_flame_velocity_title = Скорость +hud-skill-st_flame_velocity = Скорость создания пламени выше на { $boost }%{ $SP } +hud-skill-st_flamethrower_range_title = Дальность действия +hud-skill-st_flamethrower_range = Дальность действия на { $boost }% выше{ $SP } +hud-skill-st_energy_drain_title = Экономия энергии +hud-skill-st_energy_drain = Уменьшает скорость траты энергии на { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Урон +hud-skill-st_flamethrower_damage = Урон от потока пламени увеличивается на { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Радиус взрыва +hud-skill-st_explosion_radius = Радиус взрыва больше на { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Востановление энергии +hud-skill-st_energy_regen = Увеличивает прирост энергии на { $boost }%{ $SP } +hud-skill-st_fireball_title = Огненый шар +hud-skill-st_fireball = Стреляет огненным шаром, который взрывается при ударе +hud-skill-st_damage_title = Урон +hud-skill-st_damage = Увеличивает урон на { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Скорость снаряда +hud-skill-bow_projectile_speed = Стрелы летят дальше и быстрее на { $boost }%{ $SP } +hud-skill-bow_charged_title = Прицельный выстрел +hud-skill-bow_charged = Вы натягиваете тетиву сильнее, увеливая мощность выстрела +hud-skill-bow_charged_damage_title = Урон +hud-skill-bow_charged_damage = Урон увеличен на { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Востановление энергии +hud-skill-bow_charged_energy_regen = Повышает востановление энергии на { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Отбрасывание выстрела +hud-skill-bow_charged_knockback = Отбрасывание стрел сильнее на { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = Скорость +hud-skill-bow_charged_speed = Увеличивает скорость атаки на { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Скорость перемещения +hud-skill-bow_charged_move = Увеличивает скорость перемещения при прицеливании на { $boost }%{ $SP } +hud-skill-bow_repeater_title = Скорострел +hud-skill-bow_repeater = Скорострельность увеличивается с каждым выстрелом +hud-skill-bow_repeater_damage_title = Урон +hud-skill-bow_repeater_damage = Увеличивает наносимый урон на { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Расход энергии +hud-skill-bow_repeater_cost = Снижает затраты энергии на { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Скорость +hud-skill-bow_repeater_speed = Увеличивает скорость стрельбы на { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Мультивыстрел +hud-skill-bow_shotgun_unlock = Возможность стрелять несколькими стрелами одновременно{ $SP } +hud-skill-bow_shotgun_damage_title = Урон +hud-skill-bow_shotgun_damage = Увеличивает наносимый урон на { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Расход энергии +hud-skill-bow_shotgun_cost = Снижает затраты энергии на { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Увеличенный колчан +hud-skill-bow_shotgun_arrow_count = Увеличивает количество стрел в серии выстрелов на { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Прицельный выстрел +hud-skill-bow_shotgun_spread = Уменьшает разброс стрел на { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Радиус удара скачка +hud-skill-hmr_leap_radius = Увеличивает радиус атаки при ударе об землю на { $boost } метров{ $SP } +hud-skill-hmr_leap_distance_title = Расстояние скачка +hud-skill-hmr_leap_distance = Увеличивает расстояние скачка на { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Расход энергии +hud-skill-hmr_leap_cost = Снижает затраты энергии на { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Отбрасывание скачком +hud-skill-hmr_leap_knockback = Увеличивает отбрасивание от скачка на { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Урон +hud-skill-hmr_leap_damage = Увеличивает урон скачка на { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Разблокировать скачок +hud-skill-hmr_unlock_leap = Разблокирует скачок{ $SP } +hud-skill-hmr_charged_melee_title = Силовая атака +hud-skill-hmr_charged_melee = ПКМ совершает оглушающий удар. Зажатие ПКМ накапливает силу и оглушает врага отбрасывая его +hud-skill-hmr_charged_rate_title = Скорость +hud-skill-hmr_charged_rate = Увеличивает скорость с которой вы накапливаете силу удара на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Расход энергии +hud-skill-hmr_charged_melee_nrg_drain = Уменьшает затраты энергии на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Урон +hud-skill-hmr_charged_melee_damage = Увеличивает урон на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Оглушение силовой атакой +hud-skill-hmr_charged_melee_knockback = Увеличивает отбрасывание { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Одиночный удар +hud-skill-hmr_single_strike = Обычный удар +hud-skill-hmr_single_strike_regen_title = Востановление энергии +hud-skill-hmr_single_strike_regen = Увеличивает прирост энергии с каждым последующим ударом{ $SP } +hud-skill-hmr_single_strike_speed_title = Скорость +hud-skill-hmr_single_strike_speed = Увеличивает скорость атаки с каждым последующим ударом{ $SP } +hud-skill-hmr_single_strike_damage_title = Урон +hud-skill-hmr_single_strike_damage = Увеличивает урон с каждым последующим ударом{ $SP } +hud-skill-hmr_single_strike_knockback_title = Отбрасывание +hud-skill-hmr_single_strike_knockback = Увеличивает потенциал отбрасывания на { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Тройной удар +hud-skill-sw_trip_str = Атака из трёх ударов в комбо +hud-skill-sw_trip_str_combo_title = Тройной удар: Комбо +hud-skill-sw_trip_str_combo = Разблокирует комбо для тройного удара{ $SP } +hud-skill-sw_trip_str_dmg_title = Урон +hud-skill-sw_trip_str_dmg = Увеличивает урон, наносимый каждым последующим ударом{ $SP } +hud-skill-sw_trip_str_sp_title = Скорость +hud-skill-sw_trip_str_sp = Увеличивает скорость атаки, при каждом последующем ударе{ $SP } +hud-skill-sw_trip_str_reg_title = Восстановление +hud-skill-sw_trip_str_reg = Увеличивает получение энергии с каждым удачным ударом{ $SP } +hud-skill-sw_dash_title = Рывок +hud-skill-sw_dash = Прорвись сквозь врагов +hud-skill-sw_dash_dmg_title = Урон +hud-skill-sw_dash_dmg = Увеличивает начальный урок рывка на { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Расход энергии +hud-skill-sw_dash_drain = Уменьшает затраты энергии во время рывка на { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Затраты энергии на рывок +hud-skill-sw_dash_cost = Уменьшает начальную цену рывка на { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Скорость +hud-skill-sw_dash_speed = Увеличивает скорость бега во время рывка на { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Рывок: Прорыв +hud-skill-sw_dash_charge_through = Позволяет прорываться сквозь первых врагов{ $SP } +hud-skill-sw_dash_scale_title = Увеличение мощи рывка +hud-skill-sw_dash_scale = Увеличивает повышение урона от скорости на { $boost }%{ $SP } +hud-skill-sw_spin_title = Круговая атака +hud-skill-sw_spin = Открывает круговую атаку{ $SP } +hud-skill-sw_spin_dmg_title = Урон +hud-skill-sw_spin_dmg = Увеличивает урок на { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Скорость +hud-skill-sw_spin_spd = Увеличивает скорость кручения { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Расход энергии +hud-skill-sw_spin_cost = Уменьшает энергию, затрачиваемую на каждое вращение на { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Круговая атака: Прокрутка +hud-skill-sw_spin_spins = Увеличивает максимальное количество вращений{ $SP } +hud-skill-sw_interrupt_title = Прерывание атак +hud-skill-sw_interrupt = Позволяет моментально прервать атаку другой атакой{ $SP } +hud-skill-axe_double_strike_title = Двойной удар +hud-skill-axe_double_strike = Разруби этих врагов +hud-skill-axe_double_strike_combo_title = Двойной удар: Комбо +hud-skill-axe_double_strike_combo = Открывает второй удар{ $SP } +hud-skill-axe_double_strike_damage_title = Урон +hud-skill-axe_double_strike_damage = Увеличивает урон с каждым удачным ударом{ $SP } +hud-skill-axe_double_strike_speed_title = Скорость +hud-skill-axe_double_strike_speed = Увеличивает скорость атаки с каждым удачным ударом{ $SP } +hud-skill-axe_double_strike_regen_title = Регенерация энергии двойным ударом +hud-skill-axe_double_strike_regen = Увеличивает получение энергии с каждым удачным ударом{ $SP } +hud-skill-axe_spin_title = Кручение с топором +hud-skill-axe_spin = You spin it right round ... +hud-skill-axe_infinite_axe_spin_title = Бесконечное кручение +hud-skill-axe_infinite_axe_spin = Крутись пока не кончится энергия{ $SP } +hud-skill-axe_spin_damage_title = Урон +hud-skill-axe_spin_damage = Увеличивает урон каждого вращения на { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Вертолётик +hud-skill-axe_spin_helicopter = Ты падаешь немного медленнее во время кручения{ $SP } +hud-skill-axe_spin_speed_title = Скорость +hud-skill-axe_spin_speed = Увеличивает скорость кручения на { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Расход энергии +hud-skill-axe_spin_cost = Уменьшает затраты энергии на кручение{ $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Скачок +hud-skill-axe_unlock_leap = Открывает скачок с кручением{ $SP } +hud-skill-axe_leap_damage_title = Урон +hud-skill-axe_leap_damage = Увеличивает урон скачка на { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Отбрасывание скачка +hud-skill-axe_leap_knockback = Увеличение отбрасывания от скачка на { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Расход энергии +hud-skill-axe_leap_cost = Уменьшает затраты энергии на скачок { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Дистанция скачка +hud-skill-axe_leap_distance = Увеличивает дистанцию скачка на { $boost }%{ $SP } +hud-skill-mining_title = Добыча +hud-skill-pick_strike_title = Удар киркой +hud-skill-pick_strike = Разбивай камни киркой что бы получить руду, самоцветы и опыт +hud-skill-pick_strike_speed_title = Скорость кирки +hud-skill-pick_strike_speed = Добывай быстрее{ $SP } +hud-skill-pick_strike_oregain_title = Больше руды +hud-skill-pick_strike_oregain = Шанс на получение бонусной руды ({ $boost }% за каждый уровень){ $SP } +hud-skill-pick_strike_gemgain_title = Больше самоцветов +hud-skill-pick_strike_gemgain = Шанс на получение бонусных самоцветов ({ $boost }% за каждый уровень){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/skills.ron b/assets/voxygen/i18n/ru_RU/hud/skills.ron deleted file mode 100644 index 47b38b4a88..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.rank_up": "Новый SP", - "hud.skill.sp_available": "{number} SP доступны", - "hud.skill.not_unlocked": "Еще не разблокирован", - "hud.skill.req_sp": "\n\nНеобходимо {number} SP", - // Skills - // General - "hud.skill.inc_health_title": "Повышение здоровья", - "hud.skill.inc_health": "Увеличивает максимальное здоровье на {boost}{SP}", - "hud.skill.inc_energy_title": "Повышение энергии", - "hud.skill.inc_energy": "Увеличивает максимальную энергию на {boost}{SP}", - "hud.skill.unlck_sword_title": "Разблокировать меч", - "hud.skill.unlck_sword": "Разблокировать древо навыков владения мечом{SP}", - "hud.skill.unlck_axe_title": "Разблокировать топор", - "hud.skill.unlck_axe": "Разблокировать древо навыков владения топором{SP}", - "hud.skill.unlck_hammer_title": "Разблокировать молот", - "hud.skill.unlck_hammer": "Разблокировать древо навыков владения молотом{SP}", - "hud.skill.unlck_bow_title": "Разблокировать лук", - "hud.skill.unlck_bow": "Разблокировать древо навыков владения луком{SP}", - "hud.skill.unlck_staff_title": "Разблокировать посох", - "hud.skill.unlck_staff": "Разблокировать древо навыков владения посохом{SP}", - "hud.skill.unlck_sceptre_title": "Разблокировать скипетр", - "hud.skill.unlck_sceptre": "Разблокировать древо навыков владения скипетром{SP}", - "hud.skill.dodge_title": "Перекат", - "hud.skill.dodge": "Во время переката вы игнорируете урон почти от всех атак ближнего боя.", - "hud.skill.roll_energy_title": "Расход энергии", - "hud.skill.roll_energy": "Перекат использует на {boost}% меньше энергии{SP}", - "hud.skill.roll_speed_title": "Скорость", - "hud.skill.roll_speed": "Перекат на {boost}% быстрее{SP}", - "hud.skill.roll_dur_title": "Продолжительность переката", - "hud.skill.roll_dur": "Перекат на {boost}% дольше{SP}", - "hud.skill.climbing_title": "Скалолазание", - "hud.skill.climbing": "Высота прыжка на вершине подъема", - "hud.skill.climbing_cost_title": "Расход энергии", - "hud.skill.climbing_cost": "Скалолазание использует на {boost}% меньше энергии{SP}", - "hud.skill.climbing_speed_title": "Скорость", - "hud.skill.climbing_speed": "Вы поднимаетесь на {boost}% быстрее{SP}", - "hud.skill.swim_title": "Плавание", - "hud.skill.swim": "Перемещение в воде", - "hud.skill.swim_speed_title": "Скорость", - "hud.skill.swim_speed": "Плавание на {boost}% быстрее{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Вампирский луч", - "hud.skill.sc_lifesteal": "Высосите жизнь из ваших врагов", - "hud.skill.sc_lifesteal_damage_title": "Урон", - "hud.skill.sc_lifesteal_damage": "Наносит на {boost}% больше урона{SP}", - "hud.skill.sc_lifesteal_range_title": "Дальность", - "hud.skill.sc_lifesteal_range": "Ваш луч на {boost}% дальше{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Вампиризм", - "hud.skill.sc_lifesteal_lifesteal": "Преобразуйте дополнительные {boost}% урона в здоровье{SP}", - "hud.skill.sc_lifesteal_regen_title": "Восстановление энергии", - "hud.skill.sc_lifesteal_regen": "Востановите свою энергию на {boost}%{SP}", - "hud.skill.sc_heal_title": "Луч жизни", - "hud.skill.sc_heal": "Исцелите союзников, используя кровь своих врагов. Требует комбо для активации", - "hud.skill.sc_heal_heal_title": "Лечение", - "hud.skill.sc_heal_heal": "Увеличивает эффективность исцеления союзников на {boost}%{SP}", // force update - "hud.skill.sc_heal_cost_title": "Расход энергии", - "hud.skill.sc_heal_cost": "Исцеление требует на {boost}% меньше энергии{SP}", - "hud.skill.sc_heal_duration_title": "Длительность эффекта", - "hud.skill.sc_heal_duration": "Эффекты ауры исцеления длятся на {boost}% дольше longer{SP}", - "hud.skill.sc_heal_range_title": "Дальность", - "hud.skill.sc_heal_range": "Ваш луч на {boost}% дальше{SP}", // force update - "hud.skill.sc_wardaura_unlock_title": "Аура защиты", - "hud.skill.sc_wardaura_unlock": "Позволяет вам повысить защиту своих союзников (и себя){SP}", - "hud.skill.sc_wardaura_strength_title": "Сила", - "hud.skill.sc_wardaura_strength": "Сила вашей брони увеличивается на {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Продолжительность", - "hud.skill.sc_wardaura_duration": "Эффект длится на {boost}% дольше{SP}", - "hud.skill.sc_wardaura_range_title": "Радиус", - "hud.skill.sc_wardaura_range": "Радиус на {boost}% больше{SP}", - "hud.skill.sc_wardaura_cost_title": "Расход энергии", - "hud.skill.sc_wardaura_cost": "Создание ауры потребует на {boost}% меньше энергии{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Радиус кольца", - "hud.skill.st_shockwave_range" : "Радиус больше на {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Расход энергии", - "hud.skill.st_shockwave_cost" : "Затраты энергии ниже на {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Отбрасывание волны", - "hud.skill.st_shockwave_knockback" : "Увеличивает потенциал отбрасывания на {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Урон", - "hud.skill.st_shockwave_damage" : "Увеличивает урон кольца огня на {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Кольцо огня", - "hud.skill.st_shockwave_unlock" : "Открывает возможность отбрасывать врагов с помощью огня{SP}", - "hud.skill.st_flamethrower_title" : "Поток пламени", - "hud.skill.st_flamethrower" : "Испускает плотный поток пламени из вашего посоха", - "hud.skill.st_flame_velocity_title" : "Скорость", - "hud.skill.st_flame_velocity" : "Скорость создания пламени выше на {boost}%{SP}", - "hud.skill.st_flamethrower_range_title" : "Дальность действия", - "hud.skill.st_flamethrower_range" : "Дальность действия на {boost}% выше{SP}", - "hud.skill.st_energy_drain_title" : "Экономия энергии", - "hud.skill.st_energy_drain" : "Уменьшает скорость траты энергии на {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Урон", - "hud.skill.st_flamethrower_damage" : "Урон от потока пламени увеличивается на {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Радиус взрыва", - "hud.skill.st_explosion_radius" : "Радиус взрыва больше на {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Востановление энергии", - "hud.skill.st_energy_regen" : "Увеличивает прирост энергии на {boost}%{SP}", - "hud.skill.st_fireball_title" : "Огненый шар", - "hud.skill.st_fireball" : "Стреляет огненным шаром, который взрывается при ударе", - "hud.skill.st_damage_title" : "Урон", - "hud.skill.st_damage" : "Увеличивает урон на {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Скорость снаряда", - "hud.skill.bow_projectile_speed" : "Стрелы летят дальше и быстрее на {boost}%{SP}", - "hud.skill.bow_charged_title" : "Прицельный выстрел", - "hud.skill.bow_charged" : "Вы натягиваете тетиву сильнее, увеливая мощность выстрела", - "hud.skill.bow_charged_damage_title" : "Урон", - "hud.skill.bow_charged_damage" : "Урон увеличен на {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Востановление энергии", - "hud.skill.bow_charged_energy_regen" : "Повышает востановление энергии на {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Отбрасывание выстрела", - "hud.skill.bow_charged_knockback" : "Отбрасывание стрел сильнее на {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "Скорость", - "hud.skill.bow_charged_speed" : "Увеличивает скорость атаки на {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Скорость перемещения", - "hud.skill.bow_charged_move" : "Увеличивает скорость перемещения при прицеливании на {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Скорострел", - "hud.skill.bow_repeater" : "Скорострельность увеличивается с каждым выстрелом", - "hud.skill.bow_repeater_damage_title" : "Урон", - "hud.skill.bow_repeater_damage" : "Увеличивает наносимый урон на {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Расход энергии", - "hud.skill.bow_repeater_cost" : "Снижает затраты энергии на {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Скорость", - "hud.skill.bow_repeater_speed" : "Увеличивает скорость стрельбы на {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Мультивыстрел", - "hud.skill.bow_shotgun_unlock" : "Возможность стрелять несколькими стрелами одновременно{SP}", - "hud.skill.bow_shotgun_damage_title" : "Урон", - "hud.skill.bow_shotgun_damage" : "Увеличивает наносимый урон на {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Расход энергии", - "hud.skill.bow_shotgun_cost" : "Снижает затраты энергии на {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Увеличенный колчан", - "hud.skill.bow_shotgun_arrow_count" : "Увеличивает количество стрел в серии выстрелов на {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Прицельный выстрел", - "hud.skill.bow_shotgun_spread" : "Уменьшает разброс стрел на {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Радиус удара скачка", - "hud.skill.hmr_leap_radius" : "Увеличивает радиус атаки при ударе об землю на {boost} метров{SP}", - "hud.skill.hmr_leap_distance_title" : "Расстояние скачка", - "hud.skill.hmr_leap_distance" : "Увеличивает расстояние скачка на {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Расход энергии", - "hud.skill.hmr_leap_cost" : "Снижает затраты энергии на {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Отбрасывание скачком", - "hud.skill.hmr_leap_knockback" : "Увеличивает отбрасивание от скачка на {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Урон", - "hud.skill.hmr_leap_damage" : "Увеличивает урон скачка на {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Разблокировать скачок", - "hud.skill.hmr_unlock_leap" : "Разблокирует скачок{SP}", - "hud.skill.hmr_charged_melee_title" : "Силовая атака", - "hud.skill.hmr_charged_melee" : "ПКМ совершает оглушающий удар. Зажатие ПКМ накапливает силу и оглушает врага отбрасывая его", - "hud.skill.hmr_charged_rate_title" : "Скорость", - "hud.skill.hmr_charged_rate" : "Увеличивает скорость с которой вы накапливаете силу удара на {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Расход энергии", - "hud.skill.hmr_charged_melee_nrg_drain" : "Уменьшает затраты энергии на {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Урон", - "hud.skill.hmr_charged_melee_damage" : "Увеличивает урон на {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Оглушение силовой атакой", - "hud.skill.hmr_charged_melee_knockback" : "Увеличивает отбрасывание {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Одиночный удар", - "hud.skill.hmr_single_strike" : "Обычный удар", - "hud.skill.hmr_single_strike_regen_title" : "Востановление энергии", - "hud.skill.hmr_single_strike_regen" : "Увеличивает прирост энергии с каждым последующим ударом{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Скорость", - "hud.skill.hmr_single_strike_speed" : "Увеличивает скорость атаки с каждым последующим ударом{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Урон", - "hud.skill.hmr_single_strike_damage" : "Увеличивает урон с каждым последующим ударом{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Отбрасывание", - "hud.skill.hmr_single_strike_knockback" : "Увеличивает потенциал отбрасывания на {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Тройной удар", - "hud.skill.sw_trip_str": "Атака из трёх ударов в комбо", - "hud.skill.sw_trip_str_combo_title": "Тройной удар: Комбо", - "hud.skill.sw_trip_str_combo": "Разблокирует комбо для тройного удара{SP}", - "hud.skill.sw_trip_str_dmg_title": "Урон", - "hud.skill.sw_trip_str_dmg": "Увеличивает урон, наносимый каждым последующим ударом{SP}", - "hud.skill.sw_trip_str_sp_title": "Скорость", - "hud.skill.sw_trip_str_sp": "Увеличивает скорость атаки, при каждом последующем ударе{SP}", - "hud.skill.sw_trip_str_reg_title": "Восстановление", - "hud.skill.sw_trip_str_reg": "Увеличивает получение энергии с каждым удачным ударом{SP}", - "hud.skill.sw_dash_title": "Рывок", - "hud.skill.sw_dash": "Прорвись сквозь врагов", - "hud.skill.sw_dash_dmg_title": "Урон", - "hud.skill.sw_dash_dmg": "Увеличивает начальный урок рывка на {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Расход энергии", - "hud.skill.sw_dash_drain": "Уменьшает затраты энергии во время рывка на {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Затраты энергии на рывок", - "hud.skill.sw_dash_cost": "Уменьшает начальную цену рывка на {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Скорость", - "hud.skill.sw_dash_speed": "Увеличивает скорость бега во время рывка на {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Рывок: Прорыв", - "hud.skill.sw_dash_charge_through": "Позволяет прорываться сквозь первых врагов{SP}", - "hud.skill.sw_dash_scale_title": "Увеличение мощи рывка", - "hud.skill.sw_dash_scale": "Увеличивает повышение урона от скорости на {boost}%{SP}", - "hud.skill.sw_spin_title": "Круговая атака", - "hud.skill.sw_spin": "Открывает круговую атаку{SP}", - "hud.skill.sw_spin_dmg_title": "Урон", - "hud.skill.sw_spin_dmg": "Увеличивает урок на {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Скорость", - "hud.skill.sw_spin_spd": "Увеличивает скорость кручения {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Расход энергии", - "hud.skill.sw_spin_cost": "Уменьшает энергию, затрачиваемую на каждое вращение на {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Круговая атака: Прокрутка", - "hud.skill.sw_spin_spins": "Увеличивает максимальное количество вращений{SP}", - "hud.skill.sw_interrupt_title": "Прерывание атак", - "hud.skill.sw_interrupt": "Позволяет моментально прервать атаку другой атакой{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Двойной удар", - "hud.skill.axe_double_strike": "Разруби этих врагов", - "hud.skill.axe_double_strike_combo_title": "Двойной удар: Комбо", - "hud.skill.axe_double_strike_combo": "Открывает второй удар{SP}", - "hud.skill.axe_double_strike_damage_title": "Урон", - "hud.skill.axe_double_strike_damage": "Увеличивает урон с каждым удачным ударом{SP}", - "hud.skill.axe_double_strike_speed_title": "Скорость", - "hud.skill.axe_double_strike_speed": "Увеличивает скорость атаки с каждым удачным ударом{SP}", - "hud.skill.axe_double_strike_regen_title": "Регенерация энергии двойным ударом", - "hud.skill.axe_double_strike_regen": "Увеличивает получение энергии с каждым удачным ударом{SP}", - "hud.skill.axe_spin_title": "Кручение с топором", - "hud.skill.axe_spin": "You spin it right round ...", - "hud.skill.axe_infinite_axe_spin_title": "Бесконечное кручение", - "hud.skill.axe_infinite_axe_spin": "Крутись пока не кончится энергия{SP}", - "hud.skill.axe_spin_damage_title": "Урон", - "hud.skill.axe_spin_damage": "Увеличивает урон каждого вращения на {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Вертолётик", - "hud.skill.axe_spin_helicopter": "Ты падаешь немного медленнее во время кручения{SP}", - "hud.skill.axe_spin_speed_title": "Скорость", - "hud.skill.axe_spin_speed": "Увеличивает скорость кручения на {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Расход энергии", - "hud.skill.axe_spin_cost": "Уменьшает затраты энергии на кручение{boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Скачок", - "hud.skill.axe_unlock_leap": "Открывает скачок с кручением{SP}", - "hud.skill.axe_leap_damage_title": "Урон", - "hud.skill.axe_leap_damage": "Увеличивает урон скачка на {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Отбрасывание скачка", - "hud.skill.axe_leap_knockback": "Увеличение отбрасывания от скачка на {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Расход энергии", - "hud.skill.axe_leap_cost": "Уменьшает затраты энергии на скачок {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Дистанция скачка", - "hud.skill.axe_leap_distance": "Увеличивает дистанцию скачка на {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Добыча", - "hud.skill.pick_strike_title": "Удар киркой", - "hud.skill.pick_strike": "Разбивай камни киркой что бы получить руду, самоцветы и опыт", - "hud.skill.pick_strike_speed_title": "Скорость кирки", - "hud.skill.pick_strike_speed": "Добывай быстрее{SP}", - "hud.skill.pick_strike_oregain_title": "Больше руды", - "hud.skill.pick_strike_oregain": "Шанс на получение бонусной руды ({boost}% за каждый уровень){SP}", - "hud.skill.pick_strike_gemgain_title": "Больше самоцветов", - "hud.skill.pick_strike_gemgain": "Шанс на получение бонусных самоцветов ({boost}% за каждый уровень){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/hud/social.ftl b/assets/voxygen/i18n/ru_RU/hud/social.ftl new file mode 100644 index 0000000000..4c4161ff8d --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Другие игроки +hud-social-online = В сети: +hud-social-friends = Друзья +hud-social-not_yet_available = Пока недоступно +hud-social-faction = Фракция +hud-social-play_online_fmt = Игроков в сети: { $nb_player } +hud-social-name = Имя +hud-social-level = Уровень +hud-social-zone = Зона +hud-social-account = Учетная запись \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/social.ron b/assets/voxygen/i18n/ru_RU/hud/social.ron deleted file mode 100644 index 7daa9e8147..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.social": "Другие игроки", - "hud.social.online": "В сети:", - "hud.social.friends": "Друзья", - "hud.social.not_yet_available": "Пока недоступно", - "hud.social.faction": "Фракция", - "hud.social.play_online_fmt": "Игроков в сети: {nb_player}", - "hud.social.name": "Имя", - "hud.social.level": "Уровень", - "hud.social.zone": "Зона", - "hud.social.account": "Учетная запись", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ru_RU/hud/trade.ftl b/assets/voxygen/i18n/ru_RU/hud/trade.ftl new file mode 100644 index 0000000000..d72423cfa0 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Торговля +hud-trade-phase1_description = + Перетащите предметы, которые вы хотите обменять + в соответствующую область. +hud-trade-phase2_description = + Сделка теперь заблокирована, чтобы у вас было время + её просмотреть. +hud-trade-phase3_description = Сделка обрабатывается. +hud-trade-persons_offer = Предложение от { $playername } +hud-trade-has_accepted = + { $playername } + принял +hud-trade-accept = Принять +hud-trade-decline = Отклонить +hud-trade-invite_sent = Запрос на обмен отправлен { $playername }. +hud-trade-result-completed = Сделка успешно завершена. +hud-trade-result-declined = Сделка отклонена. +hud-trade-result-nospace = Недостаточно места для завершения сделки. +hud-trade-buy_price = Цена покупки +hud-trade-sell_price = Цена продажи +hud-trade-coin = Монеты +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Ваше предложение +hud-trade-their_offer = Предложение скупщика +hud-trade-amount_input = Выберете предмет \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/trade.ron b/assets/voxygen/i18n/ru_RU/hud/trade.ron deleted file mode 100644 index 74b519bf2a..0000000000 --- a/assets/voxygen/i18n/ru_RU/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - "hud.trade.trade_window": "Торговля", - "hud.trade.phase1_description": "Перетащите предметы, которые вы хотите обменять\nв соответствующую область.", - "hud.trade.phase2_description": "Сделка теперь заблокирована, чтобы у вас было время\nеё просмотреть.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Сделка обрабатывается.", - "hud.trade.persons_offer": "Предложение от {playername}", - "hud.trade.has_accepted": "{playername}\nпринял", - "hud.trade.accept": "Принять", - "hud.trade.decline": "Отклонить", - "hud.trade.invite_sent": "Запрос на обмен отправлен {playername}.", - "hud.trade.result.completed": "Сделка успешно завершена.", - "hud.trade.result.declined": "Сделка отклонена.", - "hud.trade.result.nospace": "Недостаточно места для завершения сделки.", - "hud.trade.buy_price": "Цена покупки", // force update - "hud.trade.sell_price": "Цена продажи", - "hud.trade.coin": "Монеты", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Ваше предложение", - "hud.trade.their_offer": "Предложение скупщика", - "hud.trade.amount_input": "Выберете предмет" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ru_RU/main.ftl b/assets/voxygen/i18n/ru_RU/main.ftl new file mode 100644 index 0000000000..8a2deef354 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/main.ftl @@ -0,0 +1,91 @@ +main-username = Никнейм +main-server = Сервер +main-password = Пароль +main-connecting = Соединение +main-creating_world = Создание мира +main-tip = Совет: +main-unbound_key_tip = Нет +main-notice = + Добро пожаловать в альфа версию Veloren! + + Прежде чем погрузиться в веселье, пожалуйста, имейте в виду несколько вещей: + + - Это очень ранняя альфа. Ожидайте ошибок, крайне незавершенного геймплея, неполированной механики и отсутствующих функций. + + - Если у вас есть конструктивные отзывы или сообщения об ошибках, вы можете связаться с нами через Reddit, GitLab или наш сервер Discord. + + - Veloren лицензирован по лицензии GPL 3 с открытым исходным кодом. Это означает, что вы можете играть, изменять и распространять игру + по своему усмотрению (при условии, что производная работа также находится в рамках GPL 3). + + - Велорен-это некоммерческий общественный проект, и все, кто работает над ним, являются добровольцами. + Если вам нравится то, что вы видите, вы можете присоединиться к командам разработчиков или художников! + + Спасибо, что нашли время прочитать это уведомление, мы надеемся, что вам понравится игра! + + ~ Разработчики Велорена +main-login_process = + Информация о процессе входа в систему: + + Обратите внимание, что вам нужна учетная + запись для игры на серверах с поддержкой аутентификации. + + Вы можете создать учетную запись по адресу + https://veloren.net/account/. +main-login-server_not_found = Сервер не найден +main-login-authentication_error = Ошибка аутентификации на сервере +main-login-internal_error = Внутренняя ошибка на клиенте (скорее всего, персонаж игрока был удален) +main-login-failed_auth_server_url_invalid = Не удалось подключиться к серверу аутентификации +main-login-insecure_auth_scheme = Схема аутентификации HTTP не поддерживается. Это небезопасно! В целях разработки, HTTP разрешен для 'локального хоста' или отладочных сборок +main-login-server_full = Сервер заполнен +main-login-untrusted_auth_server = Сервер аутентификации не является доверенным +main-login-outdated_client_or_server = ServerWentMad: Возможно, версии несовместимы, проверьте наличие обновлений. +main-login-timeout = Time-out: Сервер не ответил вовремя. (Перегрузка или проблемы с сетью). +main-login-server_shut_down = Сервер выключен +main-login-network_error = Ошибка сети +main-login-network_wrong_version = Несоответствие версии сервера и клиента, пожалуйста, обновите свой игровой клиент. +main-login-failed_sending_request = Не удалось выполнить запрос на сервер аутентификации +main-login-invalid_character = Выбранный символ недопустим +main-login-client_crashed = Клиент крашнулся +main-login-not_on_whitelist = Вам нужна запись в Белом списке от администратора, чтобы присоединиться +main-login-banned = Вы были забанены по следующей причине +main-login-kicked = Вас выгнали по следующей причине +main-login-select_language = Выберите язык +main-login-client_version = Версия клиента +main-login-server_version = Версия сервера +main-login-client_init_failed = Ошибка запуса клиента: { $init_fail_reason } +main-login-username_bad_characters = Неподдерживаемые символы в имени! (Используйте только буквы, цифры, '_' и '-') +main-login-username_too_long = Слишком длинное имя! Максимальная длинна: { $max_len } +main-servers-select_server = Выбор сервера +main-servers-singleplayer_error = Ошибка подключения к внутреннему серверу: { $sp_error } +main-servers-network_error = Ошибка сокета сети серверов: { $raw_error } +main-servers-participant_error = Отключение участника/ошибка протокола: { $raw_error } +main-servers-stream_error = Ошибка данных клиента во время подключения: { $raw_error } +main-servers-database_error = Ошибка данных сервера: { $raw_error } +main-servers-persistence_error = Ошибка постоянства сервера (Возможно связано с ресурсами игры или данными о персонаже): { $raw_error } +main-servers-other_error = Ошибка сервера: { $raw_error } +main-credits = Благодарности +main-credits-created_by = сделано +main-credits-music = Музыка +main-credits-fonts = Шрифты +main-credits-other_art = Другие работы +main-credits-contributors = Авторы +loading-tips = + .a0 = Нажмите '{ $gameinput-togglelantern }', чтобы зажечь фонарь. + .a1 = Нажмите '{ $gameinput-help }', чтобы просмотреть все клавиши по умолчанию. + .a2 = Вы можете ввести /tell или /s, чтобы общаться только с игроками непосредственно вокруг вас. + .a3 = Вы можете ввести /region или /r, чтобы общаться только с игроками в паре сотен блоков вокруг вас. + .a4 = Администраторы могут использовать команду /build для входа в режим постройки. + .a5 = Вы можете ввести /group или /g, чтобы общаться только с игроками в вашей текущей группе. + .a6 = Чтобы отправить личные сообщения, введите /tell, а затем имя игрока и ваше сообщение. + .a7 = Смотрите внимательно чтобы найти еду, сундуки и другие предметы, разбросанные по всему миру! + .a8 = Инвентарь заполнен едой? Попробуйте приготовить из нее еду получше! + .a9 = Интересно чем можно заняться? Попробуйте пройти одно из подземелий, отмеченных на карте! + .a10 = Не забудьте настроить графику для вашей системы. Нажмите '{ $gameinput-settings }', чтобы открыть настройки. + .a11 = Играть с другими-это весело! Нажмите '{ $gameinput-social }', чтобы узнать, кто находится в сети. + .a12 = Нажмите '{ $gameinput-dance }', чтобы танцевать. Вечеринка! + .a13 = Нажмите '{ $gameinput-glide }', чтобы открыть свой дельтаплан и покорить небо. + .a14 = Veloren все еще находится в Пре-Альфе. Мы делаем все возможное, чтобы улучшать его каждый день! + .a15 = Если вы хотите присоединиться к команде разработчиков или просто пообщаться с нами, присоединяйтесь к нашему серверу Discord. + .a16 = Вы можете переключить отображение количества здоровья на панели здоровья в настройках. + .a17 = Сядьте у костра (с помощью клавиши '{ $gameinput-sit }'), чтобы залечить свои раны. + .a18 = Вам нужно больше сумок или лучшая броня, чтобы продолжить свое путешествие? Нажмите '{ $gameinput-crafting }', чтобы открыть меню крафта! \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/main.ron b/assets/voxygen/i18n/ru_RU/main.ron deleted file mode 100644 index 41003d72fa..0000000000 --- a/assets/voxygen/i18n/ru_RU/main.ron +++ /dev/null @@ -1,109 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - /// Start Main screen section - "main.username": "Никнейм", - "main.server": "Сервер", - "main.password": "Пароль", - "main.connecting": "Соединение", - "main.creating_world": "Создание мира", - "main.tip": "Совет:", - "main.unbound_key_tip": "Нет", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Добро пожаловать в альфа версию Veloren! - -Прежде чем погрузиться в веселье, пожалуйста, имейте в виду несколько вещей: - -- Это очень ранняя альфа. Ожидайте ошибок, крайне незавершенного геймплея, неполированной механики и отсутствующих функций. - -- Если у вас есть конструктивные отзывы или сообщения об ошибках, вы можете связаться с нами через Reddit, GitLab или наш сервер Discord. - -- Veloren лицензирован по лицензии GPL 3 с открытым исходным кодом. Это означает, что вы можете играть, изменять и распространять игру -по своему усмотрению (при условии, что производная работа также находится в рамках GPL 3). - -- Велорен-это некоммерческий общественный проект, и все, кто работает над ним, являются добровольцами. -Если вам нравится то, что вы видите, вы можете присоединиться к командам разработчиков или художников! - -Спасибо, что нашли время прочитать это уведомление, мы надеемся, что вам понравится игра! - -~ Разработчики Велорена"#, - - // Login process description - "main.login_process": r#"Информация о процессе входа в систему: - -Обратите внимание, что вам нужна учетная -запись для игры на серверах с поддержкой аутентификации. - -Вы можете создать учетную запись по адресу -https://veloren.net/account/."#, - "main.login.server_not_found": "Сервер не найден", - "main.login.authentication_error": "Ошибка аутентификации на сервере", - "main.login.internal_error": "Внутренняя ошибка на клиенте (скорее всего, персонаж игрока был удален)", - "main.login.failed_auth_server_url_invalid": "Не удалось подключиться к серверу аутентификации", - "main.login.insecure_auth_scheme": "Схема аутентификации HTTP не поддерживается. Это небезопасно! В целях разработки, HTTP разрешен для 'локального хоста' или отладочных сборок", - "main.login.server_full": "Сервер заполнен", - "main.login.untrusted_auth_server": "Сервер аутентификации не является доверенным", - "main.login.outdated_client_or_server": "ServerWentMad: Возможно, версии несовместимы, проверьте наличие обновлений.", - "main.login.timeout": "Time-out: Сервер не ответил вовремя. (Перегрузка или проблемы с сетью).", - "main.login.server_shut_down": "Сервер выключен", - "main.login.network_error": "Ошибка сети", - "main.login.network_wrong_version": "Несоответствие версии сервера и клиента, пожалуйста, обновите свой игровой клиент.", - "main.login.failed_sending_request": "Не удалось выполнить запрос на сервер аутентификации", - "main.login.invalid_character": "Выбранный символ недопустим", - "main.login.client_crashed": "Клиент крашнулся", - "main.login.not_on_whitelist": "Вам нужна запись в Белом списке от администратора, чтобы присоединиться", - "main.login.banned": "Вы были забанены по следующей причине", - "main.login.kicked": "Вас выгнали по следующей причине", - "main.login.select_language": "Выберите язык", - "main.login.client_version": "Версия клиента", - "main.login.server_version": "Версия сервера", - "main.login.client_init_failed": "Ошибка запуса клиента: {init_fail_reason}", - "main.login.username_bad_characters": "Неподдерживаемые символы в имени! (Используйте только буквы, цифры, '_' и '-')", - "main.login.username_too_long": "Слишком длинное имя! Максимальная длинна: {max_len}", - "main.servers.select_server": "Выбор сервера", - "main.servers.singleplayer_error": "Ошибка подключения к внутреннему серверу: {sp_error}", - "main.servers.network_error": "Ошибка сокета сети серверов: {raw_error}", - "main.servers.participant_error": "Отключение участника/ошибка протокола: {raw_error}", - "main.servers.stream_error": "Ошибка данных клиента во время подключения: {raw_error}", - "main.servers.database_error": "Ошибка данных сервера: {raw_error}", - "main.servers.persistence_error": "Ошибка постоянства сервера (Возможно связано с ресурсами игры или данными о персонаже): {raw_error}", - "main.servers.other_error": "Ошибка сервера: {raw_error}", - // Credits screen - "main.credits": "Благодарности", - "main.credits.created_by": "сделано", - "main.credits.music": "Музыка", - "main.credits.fonts": "Шрифты", - "main.credits.other_art": "Другие работы", - "main.credits.contributors": "Авторы", - - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Нажмите '{gameinput.togglelantern}', чтобы зажечь фонарь.", - "Нажмите '{gameinput.help}', чтобы просмотреть все клавиши по умолчанию.", - "Вы можете ввести /tell или /s, чтобы общаться только с игроками непосредственно вокруг вас.", - "Вы можете ввести /region или /r, чтобы общаться только с игроками в паре сотен блоков вокруг вас.", - "Администраторы могут использовать команду /build для входа в режим постройки.", - "Вы можете ввести /group или /g, чтобы общаться только с игроками в вашей текущей группе.", - "Чтобы отправить личные сообщения, введите /tell, а затем имя игрока и ваше сообщение.", - "Смотрите внимательно чтобы найти еду, сундуки и другие предметы, разбросанные по всему миру!", - "Инвентарь заполнен едой? Попробуйте приготовить из нее еду получше!", - "Интересно чем можно заняться? Попробуйте пройти одно из подземелий, отмеченных на карте!", - "Не забудьте настроить графику для вашей системы. Нажмите '{gameinput.settings}', чтобы открыть настройки.", - "Играть с другими-это весело! Нажмите '{gameinput.social}', чтобы узнать, кто находится в сети.", - "Нажмите '{gameinput.dance}', чтобы танцевать. Вечеринка!", - "Нажмите '{gameinput.glide}', чтобы открыть свой дельтаплан и покорить небо.", - "Veloren все еще находится в Пре-Альфе. Мы делаем все возможное, чтобы улучшать его каждый день!", - "Если вы хотите присоединиться к команде разработчиков или просто пообщаться с нами, присоединяйтесь к нашему серверу Discord.", - "Вы можете переключить отображение количества здоровья на панели здоровья в настройках.", - "Сядьте у костра (с помощью клавиши '{gameinput.sit}'), чтобы залечить свои раны.", - "Вам нужно больше сумок или лучшая броня, чтобы продолжить свое путешествие? Нажмите '{gameinput.crafting}', чтобы открыть меню крафта!", - ], - } -) diff --git a/assets/voxygen/i18n/ru_RU/npc.ftl b/assets/voxygen/i18n/ru_RU/npc.ftl new file mode 100644 index 0000000000..92976ab123 --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/npc.ftl @@ -0,0 +1,211 @@ +npc-speech-villager = + .a0 = Я люблю сыр. +npc-speech-villager_open = + .a0 = Интересно, что думает Catoblepas когда ест траву. + .a1 = Как ты думаешь, что заставляет Glowing Remains светься? + .a2 = Ты когда-нибудь слышал о свирепых Land Sharks? Я слышал, они живут в пустынях. + .a3 = Интересно, что там по ту сторону гор. + .a4 = Я оставил немного сыра у родни. Теперь я не знаю, съеден сыр или нет. Я называю его сыром Шредингера. + .a5 = Ты когда-нибудь ловил светлячков? + .a6 = Ходит тут один, то ли креветка, то ли кетка. Не видел такого? + .a7 = Говорят, в пещерах можно найти блестящие драгоценные камни всех видов. + .a8 = Я не могу понять, откуда приходят эти Sauroks. +npc-speech-villager_adventurous = + .a0 = Я надеюсь, что однажды смогу собрать свой собственный дельтаплан. + .a1 = Я бы хотел исследовать пещеры, когда стану сильнее. +npc-speech-villager_closed = + .a0 = Ты не из местных, не так ли? + .a1 = Ты не думаешь что наша деревня лучшая? + .a2 = Говорят грибы полезный для здоровья. Никогда не ел их. + .a3 = Быть или не быть? Я думаю, что буду фермером. +npc-speech-villager_conscientious = + .a0 = Я все время занят. Всегда найду чем заняться. + .a1 = Надеюсь скоро пойдет дождь. Это было бы здорово для урожая. +npc-speech-villager_busybody = + .a0 = Людям надо меньше болтать и больше работать. +npc-speech-villager_unconscientious = + .a0 = Я думаю сейчас время для второго завтрака! + .a1 = Я бы хотел чтобы в моём доме небыло беспорядка. Но мне для этого надо было бы прибраться! Ха-ха! + .a2 = Где же я ее оставил... +npc-speech-villager_extroverted = + .a0 = Ты не поверишь, что я делал в эти выходные! + .a1 = Доброго утра тебе! + .a2 = Как вам погода? + .a3 = Я просто помешан на сыре! + .a4 = Не забудь про печенье! + .a5 = Я просто обожаю сыр дворфов. Я бы хотел научиться его готовить. + .a6 = Мне приснился чудесный сон о сыре прошлой ночью. Что бы это значило? + .a7 = Я люблю мёд! И ненавижу пчёл. +npc-speech-villager_sociable = + .a0 = Не хочешь заглянуть? Мы как раз собирались покушать сыра! + .a1 = Не хочешь глянуть на мой сад? Окей, в другой раз. +npc-speech-villager_introverted = + .a0 = Привет. + .a1 = А, я? Да я тут так. +npc-speech-villager_agreeable = + .a0 = Как твои дела сегодня? + .a1 = Если тебе что-то надо, просто скажи. + .a2 = Не видел моего кота? +npc-speech-villager_worried = + .a0 = Будь осторожен, хорошо? Вокруг много опасностей. +npc-speech-villager_disagreeable = + .a0 = Я говорю напрямую. Если людям это не нравится, очень плохо. + .a1 = Люди очень обидчивые. +npc-speech-villager_neurotic = + .a0 = Мысли об этих подземельях пугают меня. Надеюсь их кто-нибудь зачистит. + .a1 = Кто-то должен что-то сделать с этими культистами. Желательно не я. + .a2 = Я чувствую, что произойдет что-то плохое. + .a3 = Я бы хотел чтобы кто-нибудь отогнал волков подальше от деревни. +npc-speech-villager_sad_loner = + .a0 = Я так одинок. + .a1 = ... Извини за это неловкое молчание. Мне не по душе компания. +npc-speech-villager_seeker = + .a0 = Я хочу когда-нибудь увидеть весь мир. В жизни должно быть что-то большее, чем эта деревня. +npc-speech-villager_stable = + .a0 = Разве этот день не прекрасен? + .a1 = Жизнь не так уж и плоха. + .a2 = Прекрасный день для прогулки по лесу! +npc-speech-villager_decline_trade = + .a0 = Извини, мне нечем с тобой торговать. + .a1 = Торговля? Как будто у меня есть что-то, что может тебя заинтересовать. + .a2 = Мой дом - моя собственность, я не хочу продавать его. +npc-speech-merchant_advertisement = + .a0 = Могу ли я заинтересовать вас сделкой? + .a1 = Ты хочешь со мной поторговать? + .a2 = У меня много товаров, не хочешь взглянуть? +npc-speech-merchant_busy = + .a0 = Пожалуйста подожди, я здесь один на всех. + .a1 = Минутку, дай мне закончить. + .a2 = Я занят, зайди попозже. +npc-speech-merchant_busy_rude = + .a0 = Эй, жди своей очереди. + .a1 = Ты не видишь другого человека перед собой? + .a2 = Не лезь вне очереди. +npc-speech-merchant_trade_successful = + .a0 = Спасибо, что торгуешь со мной! + .a1 = Спасибо тебе! +npc-speech-merchant_trade_declined = + .a0 = Может в другой раз, хорошего дня! + .a1 = Жаль, тогда, может быть, в следующий раз! +npc-speech-villager_cultist_alarm = + .a0 = Берегись! На свободе разгуливает культист! + .a1 = К оружию! Культисты атакуют! + .a2 = Как посмели культисты напасть на нашу деревню! + .a3 = Смерть культистам! + .a4 = Культистов здесь не потерпят! + .a5 = Кровожадный культист! + .a6 = Попробуй на вкус острие моего меча, грязный культист! + .a7 = Ничего не сможет смыть кровь с твоих рук, культист! + .a8 = Миллиарды пузырящихся синих ракушек! Культист среди нас! + .a9 = Зло этого культиста вот-вот закончится! + .a10 = Этот культист мой! + .a11 = Приготовься встретить своего создателя, грязный культист! + .a12 = Я вижу культиста! Схватите его! + .a13 = Я вижу культиста! В атаку! + .a14 = Я вижу культиста! Не дайте им сбежать! + .a15 = Будет ли самый почтенный культист заботиться о какой-то СМЕРТИ?! + .a16 = Никогда не прощу! Никогда не забуду! Культист, сожалею! + .a17 = Умри, культист! + .a18 = Ваше царство террора захвачено! + .a19 = Вот тебе за все, что ты сделал! + .a20 = Мы не очень хорошо относимся к вашим людям здесь. + .a21 = Тебе следовало оставаться под землей! +npc-speech-villager_under_attack = + .a0 = Помогите, Меня атакуют! + .a1 = Помогите! Меня атакуют! + .a2 = Оуч, Меня атакуют! + .a3 = Оуч, Меня атакуют! Помогите! + .a4 = Помоги мне! Меня атакуют! + .a5 = Меня атакуют! Помогите! + .a6 = Меня атакуют! Помогите мне! + .a7 = Помогите! + .a8 = Помогите! Помогите! + .a9 = Помогите! Помогите! Помогите! + .a10 = Меня атакуют! + .a11 = АААААА! Меня атакуют! + .a12 = АААААА! Меня атакуют! Помогите! + .a13 = Помогите! Мы атакованны! + .a14 = Помогите! Убийца! + .a15 = Помогите! Убийца на свободе! + .a16 = Помогите! Они пытаются меня убить! + .a17 = Стража, Меня атакуют! + .a18 = Стража! Меня атакуют! + .a19 = Меня атакуют! Стража! + .a20 = Помогите! Стража! Меня атакуют! + .a21 = Стража! Скорее! + .a22 = Стража! Стража! + .a23 = Стража! Этот злодей бьёт меня! + .a24 = Стража, Схватите этого негодяя! + .a25 = Стража! Здесь убийца! + .a26 = Стража! Помогите мне! + .a27 = Тебе это не сойдет с рук! Стража! + .a28 = Ты изверг! + .a29 = Помогите мне! + .a30 = Помогите! Пожалуйста! + .a31 = Ой! Стража! Помогите! + .a32 = Они идут за мной! + .a33 = Помогите! Помогите! Меня постигла расплата! + .a34 = Ах, теперь мы видим насилие, присущее системе. + .a35 = Это всего лишь царапина! + .a36 = Остановитесь! + .a37 = Что я тебе сделал?! + .a38 = Пожалуйста, не бей! + .a39 = Эй! Смотри, куда направляешь эту штуку + .a40 = Гнусный негодяй, проваливай отсюда! + .a41 = Прекрати! Уходи! + .a42 = Ты уже достал! + .a43 = Эй! Что ты возомнил о себе?! + .a44 = Я тебе башку оторву! + .a45 = Остановись пожалуйста. У меня ничего нет! + .a46 = Я позову брата, он больше меня + .a47 = Нет! Я расскажу маме! + .a48 = Будь ты проклят! + .a49 = Пожалуйста, не делай этого. + .a50 = Это не приятно! + .a51 = Ваше оружие работает, вы можете убрать его прямо сейчас! + .a52 = Пощади! + .a53 = Пожалуйста, у меня семья! + .a54 = Я слишком молод чтобы умереть! + .a55 = Может договоримся? + .a56 = Насилие не выход! + .a57 = Сегодня выдался плохой день... + .a58 = Эй, это больно! + .a59 = Ик! + .a60 = Как грубо! + .a61 = Остановись, прошу тебя! + .a62 = Чтоб ты сдох! + .a63 = Это не смешно. + .a64 = Как ты смеешь?! + .a65 = Ты заплатишь за это! + .a66 = Ты об этом пожалеешь! + .a67 = Не заставляй меня делать тебе больно! + .a68 = Произошла какая то ошибка! + .a69 = Не делай этого! + .a70 = Изыди, дьявол + .a71 = Это очень больно! + .a72 = Зачем ты это сделал? + .a73 = Ради всего святого, прекрати! + .a74 = Ты меня перепутал с кем то + .a75 = Я не заслуживаю этого! + .a76 = Пожалуйста, больше так не делай. + .a77 = Стража, утопите этого монстра в озере! + .a78 = Я натравлю своего tarasque на тебя! + .a79 = Почему я? +npc-speech-villager_enemy_killed = + .a0 = Я уничтожил врага! + .a1 = Наконец-то мир! + .a2 = ... что же я наделал? +npc-speech-menacing = + .a0 = Я предупреждаю тебя! + .a1 = Ещё шаг и я атакую! + .a2 = Ты не пугаешь меня! + .a3 = Уходи отсюда! + .a4 = Разворачивайся, если хочешь жить! + .a5 = Тебе тут не рады! +npc-speech-cultist_low_health_fleeing = + .a0 = Не бегство - а отступление! + .a1 = Отступаем! + .a2 = Проклинаю тебя! + .a3 = Я прокляну тебя в следующей жизни! + .a4 = Я должен передохнуть! + .a5 = Они слишком сильны! \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/npc.ron b/assets/voxygen/i18n/ru_RU/npc.ron deleted file mode 100644 index fd25244d23..0000000000 --- a/assets/voxygen/i18n/ru_RU/npc.ron +++ /dev/null @@ -1,249 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for RUS -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Я люблю сыр.", - ], - "npc.speech.villager_open": [ - "Интересно, что думает Catoblepas когда ест траву.", - "Как ты думаешь, что заставляет Glowing Remains светься?", - "Ты когда-нибудь слышал о свирепых Land Sharks? Я слышал, они живут в пустынях.", - "Интересно, что там по ту сторону гор.", - "Я оставил немного сыра у родни. Теперь я не знаю, съеден сыр или нет. Я называю его сыром Шредингера.", - "Ты когда-нибудь ловил светлячков?", - "Ходит тут один, то ли креветка, то ли кетка. Не видел такого?", - "Говорят, в пещерах можно найти блестящие драгоценные камни всех видов.", - "Я не могу понять, откуда приходят эти Sauroks.", - ], - "npc.speech.villager_adventurous": [ - "Я надеюсь, что однажды смогу собрать свой собственный дельтаплан.", - "Я бы хотел исследовать пещеры, когда стану сильнее.", - ], - "npc.speech.villager_closed": [ - "Ты не из местных, не так ли?", - "Ты не думаешь что наша деревня лучшая?", - "Говорят грибы полезный для здоровья. Никогда не ел их.", - "Быть или не быть? Я думаю, что буду фермером.", - ], - "npc.speech.villager_conscientious": [ - "Я все время занят. Всегда найду чем заняться.", - "Надеюсь скоро пойдет дождь. Это было бы здорово для урожая.", - ], - "npc.speech.villager_busybody": [ - "Людям надо меньше болтать и больше работать.", - ], - "npc.speech.villager_unconscientious": [ - "Я думаю сейчас время для второго завтрака!", - "Я бы хотел чтобы в моём доме небыло беспорядка. Но мне для этого надо было бы прибраться! Ха-ха!", - "Где же я ее оставил...", - ], - "npc.speech.villager_extroverted": [ - "Ты не поверишь, что я делал в эти выходные!", - "Доброго утра тебе!", - "Как вам погода?", - "Я просто помешан на сыре!", - "Не забудь про печенье!", - "Я просто обожаю сыр дворфов. Я бы хотел научиться его готовить.", - "Мне приснился чудесный сон о сыре прошлой ночью. Что бы это значило?", - "Я люблю мёд! И ненавижу пчёл.", - ], - "npc.speech.villager_sociable": [ - "Не хочешь заглянуть? Мы как раз собирались покушать сыра!", - "Не хочешь глянуть на мой сад? Окей, в другой раз.", - ], - "npc.speech.villager_introverted": [ - "Привет.", - "А, я? Да я тут так.", - ], - "npc.speech.villager_agreeable": [ - "Как твои дела сегодня?", - "Если тебе что-то надо, просто скажи.", - "Не видел моего кота?", - ], - "npc.speech.villager_worried": [ - "Будь осторожен, хорошо? Вокруг много опасностей.", - ], - "npc.speech.villager_disagreeable": [ - "Я говорю напрямую. Если людям это не нравится, очень плохо.", - "Люди очень обидчивые.", - ], - "npc.speech.villager_neurotic": [ - "Мысли об этих подземельях пугают меня. Надеюсь их кто-нибудь зачистит.", - "Кто-то должен что-то сделать с этими культистами. Желательно не я.", - "Я чувствую, что произойдет что-то плохое.", - "Я бы хотел чтобы кто-нибудь отогнал волков подальше от деревни.", - ], - "npc.speech.villager_sad_loner": [ - "Я так одинок.", - "... Извини за это неловкое молчание. Мне не по душе компания.", - ], - "npc.speech.villager_seeker": [ - "Я хочу когда-нибудь увидеть весь мир. В жизни должно быть что-то большее, чем эта деревня.", - ], - "npc.speech.villager_stable": [ - "Разве этот день не прекрасен?", - "Жизнь не так уж и плоха.", - "Прекрасный день для прогулки по лесу!", - ], - "npc.speech.villager_decline_trade": [ - "Извини, мне нечем с тобой торговать.", - "Торговля? Как будто у меня есть что-то, что может тебя заинтересовать.", - "Мой дом - моя собственность, я не хочу продавать его.", - ], - "npc.speech.merchant_advertisement": [ - "Могу ли я заинтересовать вас сделкой?", - "Ты хочешь со мной поторговать?", - "У меня много товаров, не хочешь взглянуть?" - ], - "npc.speech.merchant_busy": [ - "Пожалуйста подожди, я здесь один на всех.", - "Минутку, дай мне закончить.", - "Я занят, зайди попозже." - ], - "npc.speech.merchant_busy_rude": [ - "Эй, жди своей очереди.", - "Ты не видишь другого человека перед собой?", - "Не лезь вне очереди.", - ], - "npc.speech.merchant_trade_successful": [ - "Спасибо, что торгуешь со мной!", - "Спасибо тебе!", - ], - "npc.speech.merchant_trade_declined": [ - "Может в другой раз, хорошего дня!", - "Жаль, тогда, может быть, в следующий раз!" - ], - "npc.speech.villager_cultist_alarm": [ - "Берегись! На свободе разгуливает культист!", - "К оружию! Культисты атакуют!", - "Как посмели культисты напасть на нашу деревню!", - "Смерть культистам!", - "Культистов здесь не потерпят!", - "Кровожадный культист!", - "Попробуй на вкус острие моего меча, грязный культист!", - "Ничего не сможет смыть кровь с твоих рук, культист!", - "Миллиарды пузырящихся синих ракушек! Культист среди нас!", - "Зло этого культиста вот-вот закончится!", - "Этот культист мой!", - "Приготовься встретить своего создателя, грязный культист!", - "Я вижу культиста! Схватите его!", - "Я вижу культиста! В атаку!", - "Я вижу культиста! Не дайте им сбежать!", - "Будет ли самый почтенный культист заботиться о какой-то СМЕРТИ?!", - "Никогда не прощу! Никогда не забуду! Культист, сожалею!", - "Умри, культист!", - "Ваше царство террора захвачено!", - "Вот тебе за все, что ты сделал!", - "Мы не очень хорошо относимся к вашим людям здесь.", - "Тебе следовало оставаться под землей!", - ], - "npc.speech.villager_under_attack": [ - "Помогите, Меня атакуют!", - "Помогите! Меня атакуют!", - "Оуч, Меня атакуют!", - "Оуч, Меня атакуют! Помогите!", - "Помоги мне! Меня атакуют!", - "Меня атакуют! Помогите!", - "Меня атакуют! Помогите мне!", - "Помогите!", - "Помогите! Помогите!", - "Помогите! Помогите! Помогите!", - "Меня атакуют!", - "АААААА! Меня атакуют!", - "АААААА! Меня атакуют! Помогите!", - "Помогите! Мы атакованны!", - "Помогите! Убийца!", - "Помогите! Убийца на свободе!", - "Помогите! Они пытаются меня убить!", - "Стража, Меня атакуют!", - "Стража! Меня атакуют!", - "Меня атакуют! Стража!", - "Помогите! Стража! Меня атакуют!", - "Стража! Скорее!", - "Стража! Стража!", - "Стража! Этот злодей бьёт меня!", - "Стража, Схватите этого негодяя!", - "Стража! Здесь убийца!", - "Стража! Помогите мне!", - "Тебе это не сойдет с рук! Стража!", - "Ты изверг!", - "Помогите мне!", - "Помогите! Пожалуйста!", - "Ой! Стража! Помогите!", - "Они идут за мной!", - "Помогите! Помогите! Меня постигла расплата!", - "Ах, теперь мы видим насилие, присущее системе.", - "Это всего лишь царапина!", - "Остановитесь!", - "Что я тебе сделал?!", - "Пожалуйста, не бей!", - "Эй! Смотри, куда направляешь эту штуку", - "Гнусный негодяй, проваливай отсюда!", - "Прекрати! Уходи!", - "Ты уже достал!", - "Эй! Что ты возомнил о себе?!", - "Я тебе башку оторву!", - "Остановись пожалуйста. У меня ничего нет!", - "Я позову брата, он больше меня", - "Нет! Я расскажу маме!", - "Будь ты проклят!", - "Пожалуйста, не делай этого.", - "Это не приятно!", - "Ваше оружие работает, вы можете убрать его прямо сейчас!", - "Пощади!", - "Пожалуйста, у меня семья!", - "Я слишком молод чтобы умереть!", - "Может договоримся?", - "Насилие не выход!", - "Сегодня выдался плохой день...", - "Эй, это больно!", - "Ик!", - "Как грубо!", - "Остановись, прошу тебя!", - "Чтоб ты сдох!", - "Это не смешно.", - "Как ты смеешь?!", - "Ты заплатишь за это!", - "Ты об этом пожалеешь!", - "Не заставляй меня делать тебе больно!", - "Произошла какая то ошибка!", - "Не делай этого!", - "Изыди, дьявол", - "Это очень больно!", - "Зачем ты это сделал?", - "Ради всего святого, прекрати!", - "Ты меня перепутал с кем то", - "Я не заслуживаю этого!", - "Пожалуйста, больше так не делай.", - "Стража, утопите этого монстра в озере!", - "Я натравлю своего tarasque на тебя!", - "Почему я?", - ], - "npc.speech.villager_enemy_killed": [ - "Я уничтожил врага!", - "Наконец-то мир!", - "... что же я наделал?", - ], - "npc.speech.menacing": [ - "Я предупреждаю тебя!", - "Ещё шаг и я атакую!", - "Ты не пугаешь меня!", - "Уходи отсюда!", - "Разворачивайся, если хочешь жить!", - "Тебе тут не рады!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Не бегство - а отступление!", - "Отступаем!", - "Проклинаю тебя!", - "Я прокляну тебя в следующей жизни!", - "Я должен передохнуть!", - "Они слишком сильны!", - ] - } -) diff --git a/assets/voxygen/i18n/sr_SR/buff.ftl b/assets/voxygen/i18n/sr_SR/buff.ftl new file mode 100644 index 0000000000..5788b44ea5 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Кликни да уклониш +buff-title-missing = Недостаје Наслов +buff-desc-missing = Недостаје Опис +buff-title-heal = Лечење +buff-desc-heal = Обнавља здравње током времена. +buff-title-potion = Напитак +buff-desc-potion = Испијање... +buff-title-saturation = Засићење +buff-desc-saturation = Обнавља здравње током времена једењем. +buff-title-campfire_heal = Лечење поред ватре +buff-desc-campfire_heal = Одмарање поред ватре лечи { $rate }% у секунди. +buff-title-invulnerability = Нерањивост +buff-desc-invulnerability = Напад те не може ранити. +buff-title-protectingward = Одбрамбени Штит +buff-desc-protectingward = Имаш заштиту, донекле, од напада. +buff-title-frenzied = Помахнитао +buff-desc-frenzied = Прожет/а си надприродном брзином и можеш игнорисати ситне повреде. +buff-title-bleed = Крварење +buff-desc-bleed = Наноси обичне ране. +buff-title-cursed = Проклет/а +buff-desc-cursed = Проклет/а си. +buff-title-burn = У Пламену +buff-desc-burn = Жив/а гориш +buff-title-crippled = Обогаљен/а +buff-desc-crippled = Обогољен/а си док су твоје ноге тешко рањене. +buff-title-frozen = Залеђен/а +buff-desc-frozen = Твоји покрети и напади су успорени. +buff-title-wet = Мокар/а +buff-desc-wet = Подлога одбија твоја стопала, отежавајући заустављање. +buff-title-ensnared = Заробљен/а +buff-desc-ensnared = Ноге се уплићу у лозу, отежавајући ти кретање. +buff-stat-health = Обнавља { $str_total } Здравље +buff-stat-increase_max_stamina = Подиже Максималну Снагу за { $strength } +buff-stat-increase_max_health = Подиже Максимално Здравље за { $strength } +buff-stat-invulnerability = Додељује Нерањивост +buff-text-over_seconds = током { $dur_secs } секунди +buff-text-for_seconds = за { $dur_secs } секудни \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/buff.ron b/assets/voxygen/i18n/sr_SR/buff.ron deleted file mode 100644 index 209eb01f8f..0000000000 --- a/assets/voxygen/i18n/sr_SR/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - // Buffs - "buff.remove": "Кликни да уклониш", - "buff.title.missing": "Недостаје Наслов", - "buff.desc.missing": "Недостаје Опис", - "buff.title.heal": "Лечење", - "buff.desc.heal": "Обнавља здравње током времена.", - "buff.title.potion": "Напитак", - "buff.desc.potion": "Испијање...", - "buff.title.saturation": "Засићење", - "buff.desc.saturation": "Обнавља здравње током времена једењем.", - "buff.title.campfire_heal": "Лечење поред ватре", - "buff.desc.campfire_heal": "Одмарање поред ватре лечи {rate}% у секунди.", - "buff.title.invulnerability": "Нерањивост", - "buff.desc.invulnerability": "Напад те не може ранити.", - "buff.title.protectingward": "Одбрамбени Штит", - "buff.desc.protectingward": "Имаш заштиту, донекле, од напада.", - "buff.title.frenzied": "Помахнитао", - "buff.desc.frenzied": "Прожет/а си надприродном брзином и можеш игнорисати ситне повреде.", - // Debuffs - "buff.title.bleed": "Крварење", - "buff.desc.bleed": "Наноси обичне ране.", - "buff.title.cursed": "Проклет/а", - "buff.desc.cursed": "Проклет/а си.", - "buff.title.burn": "У Пламену", - "buff.desc.burn": "Жив/а гориш", - "buff.title.crippled": "Обогаљен/а", - "buff.desc.crippled": "Обогољен/а си док су твоје ноге тешко рањене.", - "buff.title.frozen": "Залеђен/а", - "buff.desc.frozen": "Твоји покрети и напади су успорени.", - "buff.title.wet": "Мокар/а", - "buff.desc.wet": "Подлога одбија твоја стопала, отежавајући заустављање.", - "buff.title.ensnared": "Заробљен/а", - "buff.desc.ensnared": "Ноге се уплићу у лозу, отежавајући ти кретање.", - // Buffs stats - "buff.stat.health": "Обнавља {str_total} Здравље", - "buff.stat.increase_max_stamina": "Подиже Максималну Снагу за {strength}", - "buff.stat.increase_max_health": "Подиже Максимално Здравље за {strength}", - "buff.stat.invulnerability": "Додељује Нерањивост", - // Text - "buff.text.over_seconds": "током {dur_secs} секунди", - "buff.text.for_seconds": "за {dur_secs} секудни", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/char_selection.ftl b/assets/voxygen/i18n/sr_SR/char_selection.ftl new file mode 100644 index 0000000000..f202f3f04c --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Учитавање ликова... +char_selection-delete_permanently = Заувек обриши Лик? +char_selection-deleting_character = Обриши Лик... +char_selection-change_server = Промени Сервер +char_selection-enter_world = Уђи у Свет +char_selection-logout = Одјави се +char_selection-create_new_character = Направи Нови Лик +char_selection-creating_character = Направи Лик... +char_selection-character_creation = Прављење Лика +char_selection-human_default = Човек Подразумевано +char_selection-level_fmt = Ниво { $level_nb } +char_selection-uncanny_valley = Дивљина +char_selection-plains_of_uncertainty = Равнице Неизвесности +char_selection-beard = Брада +char_selection-hair_style = Стил Косе +char_selection-hair_color = Боја Косе +char_selection-eye_color = Боја Очију +char_selection-skin = Кожа +char_selection-eyeshape = Детаљи Очију +char_selection-accessories = Прибор +char_selection-create_info_name = Твом Лику је потребно име! +char_selection-version_mismatch = Упозорење! Овај сервер користи другачију, вероватно неподржану верзију игре. Молимо ажурирајте игру. \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/char_selection.ron b/assets/voxygen/i18n/sr_SR/char_selection.ron deleted file mode 100644 index f5f06b40d7..0000000000 --- a/assets/voxygen/i18n/sr_SR/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "char_selection.loading_characters": "Учитавање ликова...", - "char_selection.delete_permanently": "Заувек обриши Лик?", - "char_selection.deleting_character": "Обриши Лик...", - "char_selection.change_server": "Промени Сервер", - "char_selection.enter_world": "Уђи у Свет", - "char_selection.logout": "Одјави се", - "char_selection.create_new_character": "Направи Нови Лик", - "char_selection.creating_character": "Направи Лик...", - "char_selection.character_creation": "Прављење Лика", - "char_selection.human_default": "Човек Подразумевано", - "char_selection.level_fmt": "Ниво {level_nb}", - "char_selection.uncanny_valley": "Дивљина", - "char_selection.plains_of_uncertainty": "Равнице Неизвесности", - "char_selection.beard": "Брада", - "char_selection.hair_style": "Стил Косе", - "char_selection.hair_color": "Боја Косе", - "char_selection.eye_color": "Боја Очију", - "char_selection.skin": "Кожа", - "char_selection.eyeshape": "Детаљи Очију", - "char_selection.accessories": "Прибор", - "char_selection.create_info_name": "Твом Лику је потребно име!", - "char_selection.version_mismatch": "Упозорење! Овај сервер користи другачију, вероватно неподржану верзију игре. Молимо ажурирајте игру.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/common.ftl b/assets/voxygen/i18n/sr_SR/common.ftl new file mode 100644 index 0000000000..1287bb4a68 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/common.ftl @@ -0,0 +1,100 @@ +common-username = корничко име +common-singleplayer = Играј сам +common-multiplayer = Играј на мреж +common-servers = Сервери +common-quit = Изађи +common-settings = Подешавања +common-languages = Језици +common-interface = Интерфејс +common-gameplay = Игра +common-controls = Контроле +common-video = Графика +common-sound = Звук +common-chat = Причаоница +common-resume = Настави +common-characters = Ликови +common-close = Затвори +common-yes = Да +common-no = Не +common-back = Назад +common-create = Направи +common-okay = Океј +common-add = Додај +common-accept = Прихвати +common-decline = Одбаци +common-disclaimer = Одрицање одговорности +common-cancel = Откажи +common-none = Ништа +common-error = Грешка +common-fatal_error = Фатална Грешка +common-you = Ти +common-automatic = Ауто +common-random = Насумично +common-empty = Празно +common-interface_settings = Подешавања Интерфејса +common-gameplay_settings = Подешавања Игре +common-controls_settings = Подешавања Контрола +common-video_settings = Подешавања Графике +common-sound_settings = Подешавања Звука +common-language_settings = Подешавања Језика +common-chat_settings = Подешавања Причаонице +common-connection_lost = + Конекција изгубљена! + Да ли је сервер рестартован? + Да ли је клијент ажуриран? +common-species-orc = Орк +common-species-human = Човек +common-species-dwarf = патуљак +common-species-elf = Вилењак +common-species-draugr = Мртвац +common-species-danari = Данари +common-weapons-axe = Секира +common-weapons-greatsword = Велики Мач +common-weapons-shortswords = Кратки Мач +common-weapons-sword = Мач +common-weapons-staff = Ватрени Штап +common-weapons-bow = Лук +common-weapons-hammer = Чекић +common-weapons-general = Основне Вештине +common-weapons-sceptre = Лечеће Жезло +common-weapons-shield = Штит +common-weapons-spear = Копље +common-weapons-hammer_simple = Обичан Чекић +common-weapons-sword_simple = Обичан Мач +common-weapons-staff_simple = Обичан Штап +common-weapons-axe_simple = Обична Секира +common-weapons-bow_simple = Обичан Лук +common-weapons-unique = Јединствен +common-tool-debug = Дебаг +common-tool-farming = Ратарски Алат +common-tool-pick = Крамп +common-tool-mining = Рударење +common-kind-modular_component = Модуларна Компонента +common-kind-glider = Једрењак +common-kind-consumable = Јестиво +common-kind-throwable = Може се Бацити +common-kind-utility = Корисна Справа +common-kind-ingredient = Састојак +common-kind-lantern = Лампа +common-hands-one = Једноручни +common-hands-two = Дворучни +common-rand_appearance = Насумичан изглед +common-rand_name = Насумично име +common-stats-combat_rating = CR +common-stats-power = Снага +common-stats-speed = Брзина +common-stats-poise = Прибраност +common-stats-crit_chance = Крит Шанса +common-stats-crit_mult = Мулти Крит +common-stats-armor = Оклоп +common-stats-poise_res = Отпорност на Омаму +common-stats-energy_max = Макс Здравље +common-stats-energy_reward = Здравље Награда +common-stats-crit_power = Крит Снага +common-stats-stealth = Невидљивост +common-stats-slots = Места +common-material-metal = Метал +common-material-wood = Дрво +common-material-stone = Камен +common-material-cloth = Тканина +common-material-hide = Кожа \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/common.ron b/assets/voxygen/i18n/sr_SR/common.ron deleted file mode 100644 index 9ad9ce5bed..0000000000 --- a/assets/voxygen/i18n/sr_SR/common.ron +++ /dev/null @@ -1,121 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "корничко име", - "common.singleplayer": "Играј сам", - "common.multiplayer": "Играј на мреж", - "common.servers": "Сервери", - "common.quit": "Изађи", - "common.settings": "Подешавања", - "common.languages": "Језици", - "common.interface": "Интерфејс", - "common.gameplay": "Игра", - "common.controls": "Контроле", - "common.video": "Графика", - "common.sound": "Звук", - "common.chat": "Причаоница", - "common.resume": "Настави", - "common.characters": "Ликови", - "common.close": "Затвори", - "common.yes": "Да", - "common.no": "Не", - "common.back": "Назад", - "common.create": "Направи", - "common.okay": "Океј", - "common.add": "Додај", - "common.accept": "Прихвати", - "common.decline": "Одбаци", - "common.disclaimer": "Одрицање одговорности", - "common.cancel": "Откажи", - "common.none": "Ништа", - "common.error": "Грешка", - "common.fatal_error": "Фатална Грешка", - "common.you": "Ти", - "common.automatic": "Ауто", - "common.random": "Насумично", - "common.empty": "Празно", - - // Settings Window title - "common.interface_settings": "Подешавања Интерфејса", - "common.gameplay_settings": "Подешавања Игре", - "common.controls_settings": "Подешавања Контрола", - "common.video_settings": "Подешавања Графике", - "common.sound_settings": "Подешавања Звука", - "common.language_settings": "Подешавања Језика", - "common.chat_settings": "Подешавања Причаонице", - - // Message when connection to the server is lost - "common.connection_lost": r#"Конекција изгубљена! -Да ли је сервер рестартован? -Да ли је клијент ажуриран?"#, - - - "common.species.orc": "Орк", - "common.species.human": "Човек", - "common.species.dwarf": "патуљак", - "common.species.elf": "Вилењак", - "common.species.draugr": "Мртвац", - "common.species.danari": "Данари", - - "common.weapons.axe": "Секира", - "common.weapons.greatsword": "Велики Мач", - "common.weapons.shortswords": "Кратки Мач", - "common.weapons.sword": "Мач", - "common.weapons.staff": "Ватрени Штап", - "common.weapons.bow": "Лук", - "common.weapons.hammer": "Чекић", - "common.weapons.general": "Основне Вештине", - "common.weapons.sceptre": "Лечеће Жезло", - "common.weapons.shield": "Штит", - "common.weapons.spear": "Копље", - "common.weapons.hammer_simple": "Обичан Чекић", - "common.weapons.sword_simple": "Обичан Мач", - "common.weapons.staff_simple": "Обичан Штап", - "common.weapons.axe_simple": "Обична Секира", - "common.weapons.bow_simple": "Обичан Лук", - "common.weapons.unique": "Јединствен", - "common.tool.debug": "Дебаг", - "common.tool.farming": "Ратарски Алат", - "common.tool.pick": "Крамп", - "common.tool.mining": "Рударење", - "common.kind.modular_component": "Модуларна Компонента", - "common.kind.glider": "Једрењак", - "common.kind.consumable": "Јестиво", - "common.kind.throwable": "Може се Бацити", - "common.kind.utility": "Корисна Справа", - "common.kind.ingredient": "Састојак", - "common.kind.lantern": "Лампа", - "common.hands.one": "Једноручни", - "common.hands.two": "Дворучни", - - "common.rand_appearance": "Насумичан изглед", - "common.rand_name": "Насумично име", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Снага", - "common.stats.speed": "Брзина", - "common.stats.poise": "Прибраност", - "common.stats.crit_chance": "Крит Шанса", - "common.stats.crit_mult": "Мулти Крит", - "common.stats.armor": "Оклоп", - "common.stats.poise_res":"Отпорност на Омаму", - "common.stats.energy_max": "Макс Здравље", - "common.stats.energy_reward": "Здравље Награда", - "common.stats.crit_power": "Крит Снага", - "common.stats.stealth": "Невидљивост", - "common.stats.slots": "Места", - - "common.material.metal": "Метал", - "common.material.wood": "Дрво", - "common.material.stone": "Камен", - "common.material.cloth": "Тканина", - "common.material.hide": "Кожа", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/esc_menu.ftl b/assets/voxygen/i18n/sr_SR/esc_menu.ftl new file mode 100644 index 0000000000..40d50869d7 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Одјави се +esc_menu-quit_game = Напусти Игру \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/esc_menu.ron b/assets/voxygen/i18n/sr_SR/esc_menu.ron deleted file mode 100644 index 5fdb012fa2..0000000000 --- a/assets/voxygen/i18n/sr_SR/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "esc_menu.logout": "Одјави се", - "esc_menu.quit_game": "Напусти Игру", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/gameinput.ftl b/assets/voxygen/i18n/sr_SR/gameinput.ftl new file mode 100644 index 0000000000..cd5d75164a --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/gameinput.ftl @@ -0,0 +1,65 @@ +gameinput-primary = Основни Напад +gameinput-secondary = Споредни Напад +gameinput-block = Блок +gameinput-slot1 = Пречица Место 1 +gameinput-slot2 = Пречица Место 2 +gameinput-slot3 = Пречица Место 3 +gameinput-slot4 = Пречица Место 4 +gameinput-slot5 = Пречица Место 5 +gameinput-slot6 = Пречица Место 6 +gameinput-slot7 = Пречица Место 7 +gameinput-slot8 = Пречица Место 8 +gameinput-slot9 = Пречица Место 9 +gameinput-slot10 = Пречица Место 10 +gameinput-swaploadout = Замени Опрему +gameinput-togglecursor = Ис/Укључи Курсор +gameinput-help = Пребаци Помоћ +gameinput-toggleinterface = Ис/Укључи Интерфејс +gameinput-toggledebug = Ис/Укључи FPS и Debug Инфо +gameinput-toggle_egui_debug = Ис/Укључи EGUI Debug Инфо +gameinput-togglechat = Ис/Укључи Причаоницу +gameinput-screenshot = Сними Слику +gameinput-toggleingameui = Ис/Укључи Имена +gameinput-fullscreen = Укључи Пун-Екран +gameinput-moveforward = Иди Напред +gameinput-moveleft = Иди Лево +gameinput-moveright = Иди Десно +gameinput-moveback = Иди Назад +gameinput-jump = Скочи +gameinput-glide = Једрење +gameinput-roll = Котрљање +gameinput-climb = Пењање +gameinput-climbdown = Спуштање +gameinput-wallleap = Скок са Зида +gameinput-togglelantern = Ис/Укључи Лампу +gameinput-mount = Узјаши +gameinput-chat = Причаоница +gameinput-command = Команда +gameinput-escape = Откажи +gameinput-map = Мапа +gameinput-bag = Ранац +gameinput-trade = Трампа +gameinput-social = Социјала +gameinput-sit = Седни +gameinput-spellbook = Магије +gameinput-settings = Подешавања +gameinput-respawn = Препород +gameinput-charge = Напад +gameinput-togglewield = Ис/Укључи Руку +gameinput-interact = Интеракција +gameinput-freelook = Слободан Поглед +gameinput-autowalk = Ауто Корачај/Пливај +gameinput-cameraclamp = Притегни Камеру +gameinput-dance = Играње +gameinput-select = Одабери Ентитет +gameinput-acceptgroupinvite = Прихвати Позив у Групу +gameinput-declinegroupinvite = Одбаци Позив у Групу +gameinput-cyclecamera = Кружна Камера +gameinput-crafting = Прављење +gameinput-fly = Летење +gameinput-sneak = Шуњање +gameinput-swimdown = Зарањање +gameinput-swimup = Израњање +gameinput-mapzoomin = Увеличај мапу +gameinput-mapzoomout = Умањи мапу +gameinput-greet = Поздрав \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/gameinput.ron b/assets/voxygen/i18n/sr_SR/gameinput.ron deleted file mode 100644 index 30eaf91762..0000000000 --- a/assets/voxygen/i18n/sr_SR/gameinput.ron +++ /dev/null @@ -1,76 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "gameinput.primary": "Основни Напад", - "gameinput.secondary": "Споредни Напад", - "gameinput.block": "Блок", - "gameinput.slot1": "Пречица Место 1", - "gameinput.slot2": "Пречица Место 2", - "gameinput.slot3": "Пречица Место 3", - "gameinput.slot4": "Пречица Место 4", - "gameinput.slot5": "Пречица Место 5", - "gameinput.slot6": "Пречица Место 6", - "gameinput.slot7": "Пречица Место 7", - "gameinput.slot8": "Пречица Место 8", - "gameinput.slot9": "Пречица Место 9", - "gameinput.slot10": "Пречица Место 10", - "gameinput.swaploadout": "Замени Опрему", - "gameinput.togglecursor": "Ис/Укључи Курсор", - "gameinput.help": "Пребаци Помоћ", - "gameinput.toggleinterface": "Ис/Укључи Интерфејс", - "gameinput.toggledebug": "Ис/Укључи FPS и Debug Инфо", - "gameinput.toggle_egui_debug": "Ис/Укључи EGUI Debug Инфо", - "gameinput.togglechat": "Ис/Укључи Причаоницу", - "gameinput.screenshot": "Сними Слику", - "gameinput.toggleingameui": "Ис/Укључи Имена", - "gameinput.fullscreen": "Укључи Пун-Екран", - "gameinput.moveforward": "Иди Напред", - "gameinput.moveleft": "Иди Лево", - "gameinput.moveright": "Иди Десно", - "gameinput.moveback": "Иди Назад", - "gameinput.jump": "Скочи", - "gameinput.glide": "Једрење", - "gameinput.roll": "Котрљање", - "gameinput.climb": "Пењање", - "gameinput.climbdown": "Спуштање", - "gameinput.wallleap": "Скок са Зида", - "gameinput.togglelantern": "Ис/Укључи Лампу", - "gameinput.mount": "Узјаши", - "gameinput.chat": "Причаоница", - "gameinput.command": "Команда", - "gameinput.escape": "Откажи", - "gameinput.map": "Мапа", - "gameinput.bag": "Ранац", - "gameinput.trade": "Трампа", - "gameinput.social": "Социјала", - "gameinput.sit": "Седни", - "gameinput.spellbook": "Магије", - "gameinput.settings": "Подешавања", - "gameinput.respawn": "Препород", - "gameinput.charge": "Напад", - "gameinput.togglewield": "Ис/Укључи Руку", - "gameinput.interact": "Интеракција", - "gameinput.freelook": "Слободан Поглед", - "gameinput.autowalk": "Ауто Корачај/Пливај", - "gameinput.cameraclamp": "Притегни Камеру", - "gameinput.dance": "Играње", - "gameinput.select": "Одабери Ентитет", - "gameinput.acceptgroupinvite": "Прихвати Позив у Групу", - "gameinput.declinegroupinvite": "Одбаци Позив у Групу", - "gameinput.cyclecamera": "Кружна Камера", - "gameinput.crafting": "Прављење", - "gameinput.fly": "Летење", - "gameinput.sneak": "Шуњање", - "gameinput.swimdown": "Зарањање", - "gameinput.swimup": "Израњање", - "gameinput.mapzoomin": "Увеличај мапу", - "gameinput.mapzoomout": "Умањи мапу", - "gameinput.greet": "Поздрав", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/bag.ftl b/assets/voxygen/i18n/sr_SR/hud/bag.ftl new file mode 100644 index 0000000000..3afc67149a --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = { $playername } Инвентар +hud-bag-stats_title = { $playername } Статистика +hud-bag-exp = Иск +hud-bag-armor = Оклоп +hud-bag-stats = Статистика +hud-bag-head = Глава +hud-bag-neck = Врат +hud-bag-tabard = Капут +hud-bag-shoulders = Рамена +hud-bag-chest = Груди +hud-bag-hands = Руке +hud-bag-lantern = Лампа +hud-bag-glider = Једрењак +hud-bag-belt = Појас +hud-bag-ring = Прстен +hud-bag-back = Леђа +hud-bag-legs = Ноге +hud-bag-feet = Стопала +hud-bag-mainhand = Рука +hud-bag-offhand = Штит +hud-bag-inactive_mainhand = Неактивна Рука +hud-bag-inactive_offhand = Неактиван Штит +hud-bag-swap_equipped_weapons_title = Замени оружје +hud-bag-swap_equipped_weapons_desc = Стисни { $key } +hud-bag-bag = Торба +hud-bag-health = Здравље +hud-bag-stamina = Снага +hud-bag-combat_rating = Борбеност +hud-bag-protection = Заштита +hud-bag-stun_res = Отпорност на Омамљивање +hud-bag-combat_rating_desc = + Прорачунато на бази + опреме и здравља. +hud-bag-protection_desc = Упијање штете преко оклопа +hud-bag-stun_res_desc = + Отпорност на узастопно омамљивање. + Обнавља се као и снага. +hud-bag-sort_by_name = Поређај по Називу +hud-bag-sort_by_quality = Поређај по Квалитету +hud-bag-sort_by_category = Поређај по Категорији \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/bag.ron b/assets/voxygen/i18n/sr_SR/hud/bag.ron deleted file mode 100644 index 7cb99cbb87..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername} Инвентар", - "hud.bag.stats_title": "{playername} Статистика", - "hud.bag.exp": "Иск", - "hud.bag.armor": "Оклоп", - "hud.bag.stats": "Статистика", - "hud.bag.head": "Глава", - "hud.bag.neck": "Врат", - "hud.bag.tabard": "Капут", - "hud.bag.shoulders": "Рамена", - "hud.bag.chest": "Груди", - "hud.bag.hands": "Руке", - "hud.bag.lantern": "Лампа", - "hud.bag.glider": "Једрењак", - "hud.bag.belt": "Појас", - "hud.bag.ring": "Прстен", - "hud.bag.back": "Леђа", - "hud.bag.legs": "Ноге", - "hud.bag.feet": "Стопала", - "hud.bag.mainhand": "Рука", - "hud.bag.offhand": "Штит", - "hud.bag.inactive_mainhand": "Неактивна Рука", - "hud.bag.inactive_offhand": "Неактиван Штит", - "hud.bag.swap_equipped_weapons_title": "Замени оружје", - "hud.bag.swap_equipped_weapons_desc": "Стисни {key}", - "hud.bag.bag": "Торба", - "hud.bag.health": "Здравље", - "hud.bag.stamina": "Снага", - "hud.bag.combat_rating": "Борбеност", - "hud.bag.protection": "Заштита", - "hud.bag.stun_res": "Отпорност на Омамљивање", - "hud.bag.combat_rating_desc": "Прорачунато на бази\nопреме и здравља.", - "hud.bag.protection_desc": "Упијање штете преко оклопа", - "hud.bag.stun_res_desc": "Отпорност на узастопно омамљивање.\nОбнавља се као и снага.", - "hud.bag.sort_by_name": "Поређај по Називу", - "hud.bag.sort_by_quality": "Поређај по Квалитету", - "hud.bag.sort_by_category": "Поређај по Категорији", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/char_window.ftl b/assets/voxygen/i18n/sr_SR/hud/char_window.ftl new file mode 100644 index 0000000000..78e7b358af --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Име Лика +character_window-character_stats = + Иждржљивост + + Спремност + + Снага ума + + Заштита \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/char_window.ron b/assets/voxygen/i18n/sr_SR/hud/char_window.ron deleted file mode 100644 index c7cf241e04..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "character_window.character_name": "Име Лика", - // Character stats - "character_window.character_stats": r#"Иждржљивост - -Спремност - -Снага ума - -Заштита -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/chat.ftl b/assets/voxygen/i18n/sr_SR/hud/chat.ftl new file mode 100644 index 0000000000..e407930e6c --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Све +hud-chat-chat_tab_hover_tooltip = Десни клик за подешавања +hud-outcome-burning = умро/ла од: горења +hud-outcome-curse = умро/ла од: клетве +hud-outcome-bleeding = умро/ла од: крварења +hud-outcome-crippled = умро/ла од: парализе +hud-outcome-frozen = умро/ла од: смрзавања +hud-chat-online_msg = [{ $name }] се повезао/ла +hud-chat-offline_msg = [{ $name }] се одјавио/ла +hud-chat-default_death_msg = [{ $name }] умро/ла +hud-chat-environmental_kill_msg = [{ $name }] је умро/ла у { $environment } +hud-chat-fall_kill_msg = [{ $name }] је умро/ла од пада са висине +hud-chat-suicide_msg = [{ $name }] је умро/ла од само-нанетих рана +hud-chat-died_of_pvp_buff_msg = [{ $victim }] је { $died_of_buff } изазвано од [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] је поразио/ла [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] је упуцао/ла [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] је разнео/ла [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] је убио/ла [{ $victim }] магијом +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } изазвано од { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } је убио/ла [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } је упуца/ла [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } је разнео/ла [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } је убио/ла [{ $victim }] магијомc +hud-chat-npc_other_kill_msg = { $attacker } је убио/ла [{ $victim }] +hud-chat-loot_msg = Покупио/ла си [{ $item }] +hud-chat-loot_fail = Твој инвентар је пун! +hud-chat-goodbye = Збогом! +hud-chat-connection_lost = Веза се прекинула. Бићеш избачен/а за { $time } секунди. \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/chat.ron b/assets/voxygen/i18n/sr_SR/hud/chat.ron deleted file mode 100644 index 2a28c52e05..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.chat.all": "Све", - "hud.chat.chat_tab_hover_tooltip": "Десни клик за подешавања", - - // Debuff outcomes - "hud.outcome.burning": "умро/ла од: горења", - "hud.outcome.curse": "умро/ла од: клетве", - "hud.outcome.bleeding": "умро/ла од: крварења", - "hud.outcome.crippled": "умро/ла од: парализе", - "hud.outcome.frozen": "умро/ла од: смрзавања", - - // Chat outputs - "hud.chat.online_msg": "[{name}] се повезао/ла", - "hud.chat.offline_msg": "[{name}] се одјавио/ла", - - "hud.chat.default_death_msg": "[{name}] умро/ла", - "hud.chat.environmental_kill_msg": "[{name}] је умро/ла у {environment}", - "hud.chat.fall_kill_msg": "[{name}] је умро/ла од пада са висине", - "hud.chat.suicide_msg": "[{name}] је умро/ла од само-нанетих рана", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] је {died_of_buff} изазвано од [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] је поразио/ла [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] је упуцао/ла [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] је разнео/ла [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] је убио/ла [{victim}] магијом", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} изазвано од {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} је убио/ла [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} је упуца/ла [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} је разнео/ла [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} је убио/ла [{victim}] магијомc", - "hud.chat.npc_other_kill_msg": "{attacker} је убио/ла [{victim}]", - - "hud.chat.loot_msg": "Покупио/ла си [{item}]", - "hud.chat.loot_fail": "Твој инвентар је пун!", - "hud.chat.goodbye": "Збогом!", - "hud.chat.connection_lost": "Веза се прекинула. Бићеш избачен/а за {time} секунди.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/crafting.ftl b/assets/voxygen/i18n/sr_SR/hud/crafting.ftl new file mode 100644 index 0000000000..ca69a6c66b --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/crafting.ftl @@ -0,0 +1,25 @@ +hud-crafting = Прављење +hud-crafting-recipes = Рецепти +hud-crafting-ingredients = Састојци: +hud-crafting-craft = Направи +hud-crafting-tool_cata = Захтева: +hud-crafting-req_crafting_station = Захтева: +hud-crafting-anvil = Наковањ +hud-crafting-cauldron = Казан +hud-crafting-cooking_pot = Лонац за Кување +hud-crafting-crafting_bench = Радни Сто +hud-crafting-forge = Ковачница +hud-crafting-loom = Разбој +hud-crafting-spinning_wheel = Предионица +hud-crafting-tanning_rack = Кожара +hud-crafting-tabs-all = Све +hud-crafting-tabs-armor = Оклоп +hud-crafting-tabs-dismantle = Растави +hud-crafting-tabs-food = Храна +hud-crafting-tabs-glider = Једрењаци +hud-crafting-tabs-potion = Напитци +hud-crafting-tabs-tool = Алати +hud-crafting-tabs-utility = Корисне Справе +hud-crafting-tabs-weapon = Оружје +hud-crafting-tabs-bag = Торбе +hud-crafting-tabs-processed_material = Материјали \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/crafting.ron b/assets/voxygen/i18n/sr_SR/hud/crafting.ron deleted file mode 100644 index 0927ae4999..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/crafting.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.crafting": "Прављење", - "hud.crafting.recipes": "Рецепти", - "hud.crafting.ingredients": "Састојци:", - "hud.crafting.craft": "Направи", - "hud.crafting.tool_cata": "Захтева:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Захтева:", - "hud.crafting.anvil": "Наковањ", - "hud.crafting.cauldron": "Казан", - "hud.crafting.cooking_pot": "Лонац за Кување", - "hud.crafting.crafting_bench": "Радни Сто", - "hud.crafting.forge": "Ковачница", - "hud.crafting.loom": "Разбој", - "hud.crafting.spinning_wheel": "Предионица", - "hud.crafting.tanning_rack": "Кожара", - // Tabs - "hud.crafting.tabs.all": "Све", - "hud.crafting.tabs.armor": "Оклоп", - "hud.crafting.tabs.dismantle": "Растави", - "hud.crafting.tabs.food": "Храна", - "hud.crafting.tabs.glider": "Једрењаци", - "hud.crafting.tabs.potion": "Напитци", - "hud.crafting.tabs.tool": "Алати", - "hud.crafting.tabs.utility": "Корисне Справе", - "hud.crafting.tabs.weapon": "Оружје", - "hud.crafting.tabs.bag": "Торбе", - "hud.crafting.tabs.processed_material": "Материјали", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/group.ftl b/assets/voxygen/i18n/sr_SR/hud/group.ftl new file mode 100644 index 0000000000..2f27c55dd3 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Група +hud-group-invite_to_join = [{ $name }] те је позвао/ла у групу! +hud-group-invite_to_trade = [{ $name }] жели да се трампи са тобом. +hud-group-invite = Позови +hud-group-kick = Избаци +hud-group-assign_leader = Постави за Вођу +hud-group-leave = Напусти Групу +hud-group-dead = Мртав +hud-group-out_of_range = Ван домета +hud-group-add_friend = Додај у Пријатеље +hud-group-link_group = Повежи Групе +hud-group-in_menu = У Менију +hud-group-members = Чланови Групе \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/group.ron b/assets/voxygen/i18n/sr_SR/hud/group.ron deleted file mode 100644 index 6bef98e15d..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.group": "Група", - "hud.group.invite_to_join": "[{name}] те је позвао/ла у групу!", - "hud.group.invite_to_trade": "[{name}] жели да се трампи са тобом.", - "hud.group.invite": "Позови", - "hud.group.kick": "Избаци", - "hud.group.assign_leader": "Постави за Вођу", - "hud.group.leave": "Напусти Групу", - "hud.group.dead" : "Мртав", - "hud.group.out_of_range": "Ван домета", - "hud.group.add_friend": "Додај у Пријатеље", - "hud.group.link_group": "Повежи Групе", - "hud.group.in_menu": "У Менију", - "hud.group.members": "Чланови Групе", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/map.ftl b/assets/voxygen/i18n/sr_SR/hud/map.ftl new file mode 100644 index 0000000000..f3b224041c --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/map.ftl @@ -0,0 +1,31 @@ +hud-map-map_title = Мапа +hud-map-qlog_title = Мисија +hud-map-topo_map = Топографски +hud-map-difficulty = Тежина +hud-map-towns = Градови +hud-map-castles = Замкови +hud-map-dungeons = Тамнице +hud-map-caves = Пећине +hud-map-cave = Пећина +hud-map-peaks = Планине +hud-map-voxel_map = Воксел Мапа +hud-map-trees = Огромно Дрвеће +hud-map-tree = Велико Дрво +hud-map-town = Град +hud-map-castle = Замак +hud-map-dungeon = Тамница +hud-map-difficulty_dungeon = + Тамница + + Тежина: { $difficulty } +hud-map-drag = Превуци +hud-map-zoom = Увеличај +hud-map-mid_click = Остави Ознаку +hud-map-recenter = Нацентрирај +hud-map-marked_location = Означено Место +hud-map-marked_location_remove = Стисни да Уклониш +hud-map-change_map_mode = Промени приказ мапе +hud-map-toggle_minimap_voxel = Ис/Укључи Воксел Поглед на Мапици +hud-map-zoom_minimap_explanation = + Увеличај Мапицу да видиш + околину у виже детаља \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/map.ron b/assets/voxygen/i18n/sr_SR/hud/map.ron deleted file mode 100644 index 67fe315ae4..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Мапа", - "hud.map.qlog_title": "Мисија", - "hud.map.topo_map": "Топографски", - "hud.map.difficulty": "Тежина", - "hud.map.towns": "Градови", - "hud.map.castles": "Замкови", - "hud.map.dungeons": "Тамнице", - "hud.map.caves": "Пећине", - "hud.map.cave": "Пећина", - "hud.map.peaks": "Планине", - "hud.map.voxel_map": "Воксел Мапа", - "hud.map.trees": "Огромно Дрвеће", - "hud.map.tree": "Велико Дрво", - "hud.map.town": "Град", - "hud.map.castle": "Замак", - "hud.map.dungeon": "Тамница", - "hud.map.difficulty_dungeon": "Тамница\n\nТежина: {difficulty}", - "hud.map.drag": "Превуци", - "hud.map.zoom": "Увеличај", - "hud.map.mid_click": "Остави Ознаку", - "hud.map.recenter": "Нацентрирај", - "hud.map.marked_location": "Означено Место", - "hud.map.marked_location_remove": "Стисни да Уклониш", - "hud.map.change_map_mode": "Промени приказ мапе", - "hud.map.toggle_minimap_voxel": "Ис/Укључи Воксел Поглед на Мапици", - "hud.map.zoom_minimap_explanation": "Увеличај Мапицу да видиш\nоколину у виже детаља", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/misc.ftl b/assets/voxygen/i18n/sr_SR/hud/misc.ftl new file mode 100644 index 0000000000..716b72d608 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/misc.ftl @@ -0,0 +1,34 @@ +hud-do_not_show_on_startup = Не приказуј ово при покретању +hud-show_tips = Прикажи Савете +hud-quests = Мисије +hud-you_died = Погино/ла си +hud-waypoint_saved = Место упамћено +hud-sp_arrow_txt = ВП +hud-inventory_full = Инвентар Пун +hud-press_key_to_show_keybindings_fmt = [{ $key }] Тастери +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Лампа +hud-press_key_to_show_debug_info_fmt = Стисни { $key } да видиш додатне информације +hud-press_key_to_toggle_keybindings_fmt = Стисни { $key } да видиш увезане тастере +hud-press_key_to_toggle_debug_info_fmt = Стисни { $key } да видиш додатне информације +hud-press_key_to_respawn = Стисни { $key } да се поново створиш поред задње ватре. +hud-tutorial_btn = Упутство +hud-tutorial_click_here = Стисни [ { $key } ] да притиснеш ово дугме и ослободиш миша! +hud-tutorial_elements = Прављење +hud-temp_quest_headline = Поздрав Путниче! +hud-temp_quest_text = + За почетак авантуре прошврљај овим селом и сакупи неке залиха. + + Слободан/на си да узмеш шта год зажелиш! + + У доњем десном угалу екрана се налази твоја торба, мени за прављење и мапа. + + Станица за Прављење ти омогућава да направиш оклопе, оружја, храну и што шта друго! + + Дивље животиње свуда око града су одличан извор Коже од које можеш направити заштиту од дивљине. + + Кад код мислиш да си спреман/на, пробај да направиш бољу опрему у изазовима означеним на мапи! +hud-spell = Магије +hud-diary = Дневник +hud-free_look_indicator = Слободни поглед активан. Стисни { $key } да га искључиш. +hud-camera_clamp_indicator = Вертикално ограничавање камере активно. Стисни { $key } да га искључиш. +hud-auto_walk_indicator = Ауто кретање/пливање активно \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/misc.ron b/assets/voxygen/i18n/sr_SR/hud/misc.ron deleted file mode 100644 index 5feba74109..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/misc.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.do_not_show_on_startup": "Не приказуј ово при покретању", - "hud.show_tips": "Прикажи Савете", - "hud.quests": "Мисије", - "hud.you_died": "Погино/ла си", - "hud.waypoint_saved": "Место упамћено", - "hud.sp_arrow_txt": "ВП", - "hud.inventory_full": "Инвентар Пун", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Тастери", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Лампа", - "hud.press_key_to_show_debug_info_fmt": "Стисни {key} да видиш додатне информације", - "hud.press_key_to_toggle_keybindings_fmt": "Стисни {key} да видиш увезане тастере", - "hud.press_key_to_toggle_debug_info_fmt": "Стисни {key} да видиш додатне информације", - - // Respawn message - "hud.press_key_to_respawn": r#"Стисни {key} да се поново створиш поред задње ватре."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Упутство"#, - "hud.tutorial_click_here": r#"Стисни [ {key} ] да притиснеш ово дугме и ослободиш миша!"#, - "hud.tutorial_elements": r#"Прављење"#, - -"hud.temp_quest_headline": r#"Поздрав Путниче!"#, -"hud.temp_quest_text": r#"За почетак авантуре прошврљај овим селом и сакупи неке залиха. - -Слободан/на си да узмеш шта год зажелиш! - -У доњем десном угалу екрана се налази твоја торба, мени за прављење и мапа. - -Станица за Прављење ти омогућава да направиш оклопе, оружја, храну и што шта друго! - -Дивље животиње свуда око града су одличан извор Коже од које можеш направити заштиту од дивљине. - -Кад код мислиш да си спреман/на, пробај да направиш бољу опрему у изазовима означеним на мапи! -"#, - - "hud.spell": "Магије", - // Diary - "hud.diary": "Дневник", - - "hud.free_look_indicator": "Слободни поглед активан. Стисни {key} да га искључиш.", - "hud.camera_clamp_indicator": "Вертикално ограничавање камере активно. Стисни {key} да га искључиш.", - "hud.auto_walk_indicator": "Ауто кретање/пливање активно", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/sct.ftl b/assets/voxygen/i18n/sr_SR/hud/sct.ftl new file mode 100644 index 0000000000..ebfa6b97ba --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } ИСК +hud-sct-block = БЛОКИРАНО \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/sct.ron b/assets/voxygen/i18n/sr_SR/hud/sct.ron deleted file mode 100644 index fbc51f6413..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} ИСК", - "hud.sct.block": "БЛОКИРАНО", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/settings.ftl b/assets/voxygen/i18n/sr_SR/hud/settings.ftl new file mode 100644 index 0000000000..073dc5afc5 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/settings.ftl @@ -0,0 +1,116 @@ +hud-settings-general = Општа +hud-settings-none = Ништа +hud-settings-press_behavior-toggle = Ис/Укључи +hud-settings-press_behavior-hold = Држи +hud-settings-help_window = Прозор за Помоћ +hud-settings-debug_info = Дебаг Инфо +hud-settings-show_hitboxes = Прикажи сударне облике +hud-settings-show_chat = Прикажи Причаоницу +hud-settings-tips_on_startup = Савети при покретању +hud-settings-ui_scale = UI-Величина +hud-settings-relative_scaling = Релативно Увећање +hud-settings-custom_scaling = Произвољно Увећање +hud-settings-crosshair = Крстић +hud-settings-transparency = Провидност +hud-settings-hotbar = Пречице-трака +hud-settings-toggle_shortcuts = Ис/Укључи Пречице +hud-settings-buffs_skillbar = Бафови на Траци Вештина +hud-settings-buffs_mmap = Бафови на Мапици +hud-settings-toggle_bar_experience = Ис/Укључи Траку са Искуством +hud-settings-scrolling_combat_text = Померајући Борбени Текст +hud-settings-incoming_damage = Долазне Ране +hud-settings-speech_bubble = Говорни Облачић +hud-settings-speech_bubble_dark_mode = Тамни Говорни Облачић +hud-settings-speech_bubble_icon = Иконица Говорног Облачића +hud-settings-energybar_numbers = Здравље у Бројевима +hud-settings-values = Вредности +hud-settings-percentages = Проценти +hud-settings-chat = Причаоница +hud-settings-background_transparency = Провидност Позадине +hud-settings-chat_character_name = Име Ликова у Причаоници +hud-settings-loading_tips = Савети при Учитавању +hud-settings-reset_interface = Подразумевано +hud-settings-pan_sensitivity = Осетљивост Курсора +hud-settings-zoom_sensitivity = Осетљивост Увеличавања +hud-settings-camera_clamp_angle = Угао ограничења вертикалне камере +hud-settings-invert_scroll_zoom = Обрнуто Скрол Зумирање +hud-settings-invert_mouse_y_axis = Обрнута y оса миша +hud-settings-invert_controller_y_axis = Обрнута y оса управљача +hud-settings-enable_mouse_smoothing = Фино Померање Камере +hud-settings-free_look_behavior = Слободни Поглед +hud-settings-auto_walk_behavior = Аутоматско Кретање +hud-settings-camera_clamp_behavior = Затезање Камере +hud-settings-player_physics_behavior = Физика Играча (пробно) +hud-settings-stop_auto_walk_on_input = Заустави Ауто Кретање при Покрету +hud-settings-auto_camera = Ауто Камера +hud-settings-reset_gameplay = Подразумевано +hud-settings-view_distance = Видљивост +hud-settings-sprites_view_distance = Видљивост Спрајтова +hud-settings-figures_view_distance = Видљивост Ентитета +hud-settings-maximum_fps = Максимални FPS +hud-settings-present_mode = Припремљен Режим +hud-settings-present_mode-fifo = Први у, Први ван +hud-settings-present_mode-mailbox = Поштанско сандуче +hud-settings-present_mode-immediate = Непосредан +hud-settings-fov = Видно Поље (степени) +hud-settings-gamma = Гама +hud-settings-exposure = Изложеност +hud-settings-ambiance = Светлина Атмосфере +hud-settings-antialiasing_mode = Режим Изглађивања +hud-settings-upscale_factor = Фактор Увећања +hud-settings-cloud_rendering_mode = Режим Исцртавања Облака +hud-settings-fluid_rendering_mode = Режим Исцртавања Течности +hud-settings-fluid_rendering_mode-cheap = Јефтин +hud-settings-fluid_rendering_mode-shiny = Богат +hud-settings-cloud_rendering_mode-minimal = Минимални +hud-settings-cloud_rendering_mode-low = Ниско +hud-settings-cloud_rendering_mode-medium = Средње +hud-settings-cloud_rendering_mode-high = Високо +hud-settings-cloud_rendering_mode-ultra = Веома Високо +hud-settings-fullscreen = Пун-Екран +hud-settings-fullscreen_mode = Пун-Екран Режим +hud-settings-fullscreen_mode-exclusive = Искључив +hud-settings-fullscreen_mode-borderless = Без-ивица +hud-settings-gpu_profiler = Омогући GPU прорачун времена (није свуда подржано) +hud-settings-particles = Честице +hud-settings-lossy_terrain_compression = Lossy компресија терена +hud-settings-resolution = Резолуција +hud-settings-bit_depth = Бит Дубина +hud-settings-refresh_rate = Брзина Освежавања +hud-settings-lighting_rendering_mode = Режим Исцртавања Осветљења +hud-settings-lighting_rendering_mode-ashikhmin = Врста A - Високо +hud-settings-lighting_rendering_mode-blinnphong = Врста B - Средње +hud-settings-lighting_rendering_mode-lambertian = Врста L - Јефтино +hud-settings-shadow_rendering_mode = Режим Исцртавања Сенки +hud-settings-shadow_rendering_mode-none = Ништа +hud-settings-shadow_rendering_mode-cheap = Јефтино +hud-settings-shadow_rendering_mode-map = Мапа +hud-settings-shadow_rendering_mode-map-resolution = Резолуција +hud-settings-lod_detail = LoD Детаљи +hud-settings-save_window_size = Упамти величину +hud-settings-reset_graphics = Подразумевано +hud-settings-master_volume = Главни Звук Јачина +hud-settings-inactive_master_volume_perc = Јачина Звука Некативног Прозора +hud-settings-music_volume = Јачина Музике +hud-settings-sound_effect_volume = Јачина Звучних Ефеката +hud-settings-audio_device = Аудио Уређаја +hud-settings-reset_sound = Подразумевано +hud-settings-english_fallback = Ако недостаје превод прилажи Енглески +hud-settings-awaitingkey = Стисни Тастер... +hud-settings-unbound = Ништа +hud-settings-reset_keybinds = Подразумевано +hud-settings-chat_tabs = Картице Причаонице +hud-settings-label = Називи: +hud-settings-delete = Обриши +hud-settings-show_all = Прикажи Све +hud-settings-messages = Поруке +hud-settings-activity = Активност +hud-settings-death = Смрт +hud-settings-group = Група +hud-settings-faction = Фракција +hud-settings-world = Свет +hud-settings-region = Регијон +hud-settings-say = Близу +hud-settings-all = Све +hud-settings-group_only = Само Група +hud-settings-reset_chat = Подразумевано \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/settings.ron b/assets/voxygen/i18n/sr_SR/hud/settings.ron deleted file mode 100644 index 5ecf1da4dd..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/settings.ron +++ /dev/null @@ -1,134 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - // Settings - "hud.settings.general": "Општа", - "hud.settings.none": "Ништа", - "hud.settings.press_behavior.toggle": "Ис/Укључи", - "hud.settings.press_behavior.hold": "Држи", - "hud.settings.help_window": "Прозор за Помоћ", - "hud.settings.debug_info": "Дебаг Инфо", - "hud.settings.show_hitboxes": "Прикажи сударне облике", - "hud.settings.show_chat": "Прикажи Причаоницу", - "hud.settings.tips_on_startup": "Савети при покретању", - "hud.settings.ui_scale": "UI-Величина", - "hud.settings.relative_scaling": "Релативно Увећање", - "hud.settings.custom_scaling": "Произвољно Увећање", - "hud.settings.crosshair": "Крстић", - "hud.settings.transparency": "Провидност", - "hud.settings.hotbar": "Пречице-трака", - "hud.settings.toggle_shortcuts": "Ис/Укључи Пречице", - "hud.settings.buffs_skillbar": "Бафови на Траци Вештина", - "hud.settings.buffs_mmap": "Бафови на Мапици", - "hud.settings.toggle_bar_experience": "Ис/Укључи Траку са Искуством", - "hud.settings.scrolling_combat_text": "Померајући Борбени Текст ", - "hud.settings.incoming_damage": "Долазне Ране", - "hud.settings.speech_bubble": "Говорни Облачић", - "hud.settings.speech_bubble_dark_mode": "Тамни Говорни Облачић", - "hud.settings.speech_bubble_icon": "Иконица Говорног Облачића", - "hud.settings.energybar_numbers": "Здравље у Бројевима", - "hud.settings.values": "Вредности", - "hud.settings.percentages": "Проценти", - "hud.settings.chat": "Причаоница", - "hud.settings.background_transparency": "Провидност Позадине", - "hud.settings.chat_character_name": "Име Ликова у Причаоници", - "hud.settings.loading_tips": "Савети при Учитавању", - "hud.settings.reset_interface": "Подразумевано", - - "hud.settings.pan_sensitivity": "Осетљивост Курсора", - "hud.settings.zoom_sensitivity": "Осетљивост Увеличавања", - "hud.settings.camera_clamp_angle": "Угао ограничења вертикалне камере", - "hud.settings.invert_scroll_zoom": "Обрнуто Скрол Зумирање", - "hud.settings.invert_mouse_y_axis": "Обрнута y оса миша", - "hud.settings.invert_controller_y_axis": "Обрнута y оса управљача", - "hud.settings.enable_mouse_smoothing": "Фино Померање Камере", - "hud.settings.free_look_behavior": "Слободни Поглед", - "hud.settings.auto_walk_behavior": "Аутоматско Кретање", - "hud.settings.camera_clamp_behavior": "Затезање Камере", - "hud.settings.player_physics_behavior": "Физика Играча (пробно)", - "hud.settings.stop_auto_walk_on_input": "Заустави Ауто Кретање при Покрету", - "hud.settings.auto_camera": "Ауто Камера", - "hud.settings.reset_gameplay": "Подразумевано", - - "hud.settings.view_distance": "Видљивост", - "hud.settings.sprites_view_distance": "Видљивост Спрајтова", - "hud.settings.figures_view_distance": "Видљивост Ентитета", - "hud.settings.maximum_fps": "Максимални FPS", - "hud.settings.present_mode": "Припремљен Режим", - "hud.settings.present_mode.fifo": "Први у, Први ван", - "hud.settings.present_mode.mailbox": "Поштанско сандуче ", - "hud.settings.present_mode.immediate": "Непосредан", - "hud.settings.fov": "Видно Поље (степени)", - "hud.settings.gamma": "Гама", - "hud.settings.exposure": "Изложеност ", - "hud.settings.ambiance": "Светлина Атмосфере", - "hud.settings.antialiasing_mode": "Режим Изглађивања", - "hud.settings.upscale_factor": "Фактор Увећања", - "hud.settings.cloud_rendering_mode": "Режим Исцртавања Облака", - "hud.settings.fluid_rendering_mode": "Режим Исцртавања Течности", - "hud.settings.fluid_rendering_mode.cheap": "Јефтин", - "hud.settings.fluid_rendering_mode.shiny": "Богат", - "hud.settings.cloud_rendering_mode.minimal": "Минимални", - "hud.settings.cloud_rendering_mode.low": "Ниско", - "hud.settings.cloud_rendering_mode.medium": "Средње", - "hud.settings.cloud_rendering_mode.high": "Високо", - "hud.settings.cloud_rendering_mode.ultra": "Веома Високо", - "hud.settings.fullscreen": "Пун-Екран", - "hud.settings.fullscreen_mode": "Пун-Екран Режим", - "hud.settings.fullscreen_mode.exclusive": "Искључив", - "hud.settings.fullscreen_mode.borderless": "Без-ивица", - "hud.settings.gpu_profiler": "Омогући GPU прорачун времена (није свуда подржано)", - "hud.settings.particles": "Честице", - "hud.settings.lossy_terrain_compression": "Lossy компресија терена", - "hud.settings.resolution": "Резолуција", - "hud.settings.bit_depth": "Бит Дубина", - "hud.settings.refresh_rate": "Брзина Освежавања", - "hud.settings.lighting_rendering_mode": "Режим Исцртавања Осветљења", - "hud.settings.lighting_rendering_mode.ashikhmin": "Врста A - Високо ", - "hud.settings.lighting_rendering_mode.blinnphong": "Врста B - Средње", - "hud.settings.lighting_rendering_mode.lambertian": "Врста L - Јефтино", - "hud.settings.shadow_rendering_mode": "Режим Исцртавања Сенки", - "hud.settings.shadow_rendering_mode.none": "Ништа", - "hud.settings.shadow_rendering_mode.cheap": "Јефтино", - "hud.settings.shadow_rendering_mode.map": "Мапа", - "hud.settings.shadow_rendering_mode.map.resolution": "Резолуција", - "hud.settings.lod_detail": "LoD Детаљи", - "hud.settings.save_window_size": "Упамти величину", - "hud.settings.reset_graphics": "Подразумевано", - - "hud.settings.master_volume": "Главни Звук Јачина", - "hud.settings.inactive_master_volume_perc": "Јачина Звука Некативног Прозора", - "hud.settings.music_volume": "Јачина Музике", - "hud.settings.sound_effect_volume": "Јачина Звучних Ефеката", - "hud.settings.audio_device": "Аудио Уређаја", - "hud.settings.reset_sound": "Подразумевано", - - "hud.settings.english_fallback": "Ако недостаје превод прилажи Енглески", - - "hud.settings.awaitingkey": "Стисни Тастер...", - "hud.settings.unbound": "Ништа", - "hud.settings.reset_keybinds": "Подразумевано", - - "hud.settings.chat_tabs": "Картице Причаонице", - "hud.settings.label": "Називи:", - "hud.settings.delete": "Обриши", - "hud.settings.show_all": "Прикажи Све", - "hud.settings.messages": "Поруке", - "hud.settings.activity": "Активност", - "hud.settings.death": "Смрт", - "hud.settings.group": "Група", - "hud.settings.faction": "Фракција", - "hud.settings.world": "Свет", - "hud.settings.region": "Регијон", - "hud.settings.say": "Близу", - "hud.settings.all": "Све", - "hud.settings.group_only": "Само Група", - "hud.settings.reset_chat" : "Подразумевано", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/skills.ftl b/assets/voxygen/i18n/sr_SR/hud/skills.ftl new file mode 100644 index 0000000000..d31868ac5f --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Нови Вештина Поен +hud-skill-sp_available = { $number } ВП доступан +hud-skill-not_unlocked = Није откључано +hud-skill-req_sp ={"\u000A"} + + Потребно { $number } ВП +hud-skill-inc_health_title = Повећање Здравља +hud-skill-inc_health = Повећава максимално здравље за { $boost }{ $SP } +hud-skill-inc_stam_title = Повећање Снаге +hud-skill-inc_stam = Повећава максималну снагу за { $boost }{ $SP } +hud-skill-unlck_sword_title = Откључај Мач +hud-skill-unlck_sword = Откључава стабло мач вештина{ $SP } +hud-skill-unlck_axe_title = Откључај Секиру +hud-skill-unlck_axe = Откључава стабло секира вештина{ $SP } +hud-skill-unlck_hammer_title = Откључај Чекић +hud-skill-unlck_hammer = Откључава стабло чекић вештина{ $SP } +hud-skill-unlck_bow_title = Откључај Лук +hud-skill-unlck_bow = Откључава стабло лук вештина{ $SP } +hud-skill-unlck_staff_title = Откључај Штап +hud-skill-unlck_staff = Откључава стабло штап вештина{ $SP } +hud-skill-unlck_sceptre_title = Откључај Жезло +hud-skill-unlck_sceptre = Откључава стабло жезло вештина{ $SP } +hud-skill-dodge_title = Котрљање +hud-skill-dodge = Котрљање се активира средњим кликом, и омогућава привремени имунитет на нападе (iframes) док се котрљаш. +hud-skill-roll_stamina_title = Котрљајућа Снага +hud-skill-roll_stamina = Котрљање користи { $boost }% мање снаге{ $SP } +hud-skill-roll_speed_title = Брзина Котрљања +hud-skill-roll_speed = Котрљање је { $boost }% брже{ $SP } +hud-skill-roll_dur_title = Трајање Котрљања +hud-skill-roll_dur = Котрљање траје { $boost }% дуже{ $SP } +hud-skill-climbing_title = Пењање +hud-skill-climbing = Већи Скок +hud-skill-climbing_cost_title = Цена Пењања +hud-skill-climbing_cost = Пењање користи { $boost }% мање снаге{ $SP } +hud-skill-climbing_speed_title = Брзина Пењања +hud-skill-climbing_speed = Пењање је { $boost }% брже{ $SP } +hud-skill-swim_title = Пливање +hud-skill-swim = Кретање у мокром окружењу +hud-skill-swim_speed_title = Брзина Пливања +hud-skill-swim_speed = Пливање је { $boost }% брже{ $SP } +hud-skill-sc_lifesteal_title = Зрак крађе живота +hud-skill-sc_lifesteal = Исисава живот из непријатеља +hud-skill-sc_lifesteal_damage_title = Рањавање +hud-skill-sc_lifesteal_damage = Наноси { $boost }% више рана{ $SP } +hud-skill-sc_lifesteal_range_title = Домет +hud-skill-sc_lifesteal_range = Твој зрак досеже { $boost }% даље{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Крађа живота +hud-skill-sc_lifesteal_lifesteal = Претвара додатни { $boost }% нанетих рана у здравље{ $SP } +hud-skill-sc_lifesteal_regen_title = Обнова Снаге +hud-skill-sc_lifesteal_regen = Допуни своју снаге за { $boost }%{ $SP } +hud-skill-sc_heal_title = Лечећа Аура +hud-skill-sc_heal = Лечи своје савезнике крвљу непријатеља, потребан комбо за активирање +hud-skill-sc_heal_heal_title = Лечење +hud-skill-sc_heal_heal = Побољшава лечење за { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Цена Снаге +hud-skill-sc_heal_cost = Лечење захтева { $boost }% мање снаге{ $SP } +hud-skill-sc_heal_duration_title = Трајање +hud-skill-sc_heal_duration = Ефекат лечеће ауре траје { $boost }% дуже{ $SP } +hud-skill-sc_heal_range_title = Домет +hud-skill-sc_heal_range = Твоја лечећа аура досеже { $boost }% даље{ $SP } +hud-skill-sc_wardaura_unlock_title = Откључај Заштитну Ауру +hud-skill-sc_wardaura_unlock = Омогућава ти да заштитиш своје савезнике од непријатеља{ $SP } +hud-skill-sc_wardaura_strength_title = Снага +hud-skill-sc_wardaura_strength = Повећава снагу заштите за { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Трајање +hud-skill-sc_wardaura_duration = Ефекат твоје заштите траје { $boost }% дуже{ $SP } +hud-skill-sc_wardaura_range_title = Домет +hud-skill-sc_wardaura_range = Твоја заштита досеже { $boost }% даље{ $SP } +hud-skill-sc_wardaura_cost_title = Цена Снаге +hud-skill-sc_wardaura_cost = За стварање заштите је потребно { $boost }% мање снаге{ $SP } +hud-skill-st_shockwave_range_title = Опсег Ватреног Таласа +hud-skill-st_shockwave_range = повећава домет за { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Цена Ватреног Таласа +hud-skill-st_shockwave_cost = Смањује снагу потребну за одбацивање беспомоћних сељака за { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Снага Одбацивања +hud-skill-st_shockwave_knockback = Повећава снагу одбацивања за { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Рањавање Ватреним Таласом +hud-skill-st_shockwave_damage = Повећава нанете ране за { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Откључај Ватрени Талас +hud-skill-st_shockwave_unlock = Откључава способност да одбацивања непријатеља ветреним таласом{ $SP } +hud-skill-st_flamethrower_title = Бацач Пламена +hud-skill-st_flamethrower = Избацује ватру, и све их пржи +hud-skill-st_flame_velocity_title = Брзина Ватре +hud-skill-st_flame_velocity = Ватра стиже брже, за { $boost }%{ $SP } +hud-skill-st_flamethrower_range_title = Домет Бацача Пламена +hud-skill-st_flamethrower_range = Када пламен једноставно не допире, досеже { $boost }% даље{ $SP } +hud-skill-st_energy_drain_title = Штедња Снаге +hud-skill-st_energy_drain = Смањује потрошњу снаге за { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Рањавање Бацачем Пламена +hud-skill-st_flamethrower_damage = Повећава рањавање за { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Домет Експлозије +hud-skill-st_explosion_radius = Већ је бољи, повећава домет експлозије за { $boost }%{ $SP } +hud-skill-st_stamina_regen_title = Обнављање Снаге +hud-skill-st_stamina_regen = Повећава обнављање снаге за { $boost }%{ $SP } +hud-skill-st_fireball_title = Ватрена Кугла +hud-skill-st_fireball = Испаљује ватрену куглу која екслодира при судару +hud-skill-st_damage_title = Рањавање +hud-skill-st_damage = Повећава рањавање за { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Брзина Пројектила +hud-skill-bow_projectile_speed = Стреле добацују даље и брже за { $boost }%{ $SP } +hud-skill-bow_charged_title = Запета Стрела +hud-skill-bow_charged = Зато што чекаш дуже +hud-skill-bow_charged_damage_title = Рањавање Запетом Стрелом +hud-skill-bow_charged_damage = Повећава рањавање за { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Обнављање Снаге +hud-skill-bow_charged_energy_regen = Повећава обнављање стамине за { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Одбациваље Запетом Стрелом +hud-skill-bow_charged_knockback = Одбацује непријатеља даље за { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = Брзина Запете Стреле +hud-skill-bow_charged_speed = Повећава брзину напада за { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Брзина Кретања При Пуњењу +hud-skill-bow_charged_move = Повећава брзину пуњења при нападу за { $boost }%{ $SP } +hud-skill-bow_repeater_title = Понављач +hud-skill-bow_repeater = Брзо испањивање стрела +hud-skill-bow_repeater_damage_title = Рањавање Понављачем +hud-skill-bow_repeater_damage = Повећава нанете ране за { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Цена Понављача +hud-skill-bow_repeater_cost = Смаљује коришћење снаге понављача за { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Брзина Понављача +hud-skill-bow_repeater_speed = Повећава брзину испаљиваља стрела за { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Откључај Сачмару +hud-skill-bow_shotgun_unlock = Откључава способност испаљивања више стрела у исто време{ $SP } +hud-skill-bow_shotgun_damage_title = Рањавање Сачмаром +hud-skill-bow_shotgun_damage = Повећава нанете ране за{ $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Цена Сачмаре +hud-skill-bow_shotgun_cost = Смањује цену сачмаре за { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Стрелна Сачмара +hud-skill-bow_shotgun_arrow_count = Повећава број испаљених стрела одједном за { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Обухват Сачмаре +hud-skill-bow_shotgun_spread = Смањује ширину обухвата стрелама за { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Домет Наскока +hud-skill-hmr_leap_radius = Повећава домет напада земљаног удара за { $boost } метра{ $SP } +hud-skill-hmr_leap_distance_title = Даљина Наскока +hud-skill-hmr_leap_distance = Повећава даљину наскока за { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Цена Наскока +hud-skill-hmr_leap_cost = Смањује цену наскока за { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Скок Одбацивање +hud-skill-hmr_leap_knockback = Повећава одбацивање при наскоку за { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Рањавање Наскоком +hud-skill-hmr_leap_damage = Повећава нанете ране при наскоку за { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Откључај Наскок +hud-skill-hmr_unlock_leap = Откључава наскок{ $SP } +hud-skill-hmr_charged_melee_title = Јуришна Блиска Борба +hud-skill-hmr_charged_melee = Блиска борба са јуришом +hud-skill-hmr_charged_rate_title = Брзина Јуриша +hud-skill-hmr_charged_rate = Повећава брзину замаха при јуришу за { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Енергетско Црпљење Јуришне Борбе +hud-skill-hmr_charged_melee_nrg_drain = Смаљује брзину црпљења снаге при јуришу за { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Рањавање Јуришном Борбом +hud-skill-hmr_charged_melee_damage = Повећава ране нанете јуришним замахом за { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Одбацивање при Јуришној Борби +hud-skill-hmr_charged_melee_knockback = Повећава одбацивање при замаху за { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Једноструки Ударац +hud-skill-hmr_single_strike = Усамљен као и ти +hud-skill-hmr_single_strike_regen_title = Једноструки Ударац Обнова +hud-skill-hmr_single_strike_regen = Повећава обнову снаге после сваког успешног ударца{ $SP } +hud-skill-hmr_single_strike_speed_title = Брзина Једноструког Ударца +hud-skill-hmr_single_strike_speed = Повећава брзину напада после сваког успешног ударца{ $SP } +hud-skill-hmr_single_strike_damage_title = Рањавање Једноструким Ударацем +hud-skill-hmr_single_strike_damage = Повећава рањавање при сваком успешном ударцу{ $SP } +hud-skill-hmr_single_strike_knockback_title = Једноструки Ударац Одбацивање +hud-skill-hmr_single_strike_knockback = Повећава потенцијал одбацивања за { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Троструки Ударац +hud-skill-sw_trip_str = Ударац, до три пута +hud-skill-sw_trip_str_combo_title = Троструки Ударац Комбо +hud-skill-sw_trip_str_combo = Омогућава пењање комбоа на три ударца{ $SP } +hud-skill-sw_trip_str_dmg_title = Рањавање Троструким Ударацем +hud-skill-sw_trip_str_dmg = Повећава рањавање након сваког успешног ударца{ $SP } +hud-skill-sw_trip_str_sp_title = Брзина Троструког Ударца +hud-skill-sw_trip_str_sp = Повећава брзину напада за сваки успешни ударац{ $SP } +hud-skill-sw_trip_str_reg_title = Троструки Ударац Снага +hud-skill-sw_trip_str_reg = Повећава обнову снаге при сваком успешном ударцу{ $SP } +hud-skill-sw_dash_title = Прескок +hud-skill-sw_dash = Провуци се кроз непријатеље +hud-skill-sw_dash_dmg_title = Рањавање Прескоком +hud-skill-sw_dash_dmg = Повећава почетне ране нанете прескоком за { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Прескок Црпљење +hud-skill-sw_dash_drain = Смањје брзину црпљења снаге током прескока за { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Цена Прескока +hud-skill-sw_dash_cost = Смањује почетну цену прескока за { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Брзина Прескока +hud-skill-sw_dash_speed = Повећава брзину кретања током прескока за { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Јуриш Кроз +hud-skill-sw_dash_charge_through = Дозвољава ти да пролетиш кроз првог непријатеља на кога налетиш{ $SP } +hud-skill-sw_dash_scale_title = Повећавање Рањавање Прескоком +hud-skill-sw_dash_scale = Повећава повећавање рањавање при прескоку за { $boost }%{ $SP } +hud-skill-sw_spin_title = Откључај Вртешку +hud-skill-sw_spin = Откључава мач вртешку{ $SP } +hud-skill-sw_spin_dmg_title = Рањавање Вртешком +hud-skill-sw_spin_dmg = Повећава нанете ране за { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Брзина Вртешке +hud-skill-sw_spin_spd = Повећава брзину вртења за { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Цена Вртешке +hud-skill-sw_spin_cost = Смањује трошење снаге током вртешке за { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Вртећа Вртешка +hud-skill-sw_spin_spins = Повећава број окрета током вртешке{ $SP } +hud-skill-sw_interrupt_title = Пректид Напада +hud-skill-sw_interrupt = Дозвољава ти да истовремено прекинеш напад следећим нападом{ $SP } +hud-skill-axe_double_strike_title = Двоструки Ударац +hud-skill-axe_double_strike = Исецкај непријатеља на делове +hud-skill-axe_double_strike_combo_title = Двоструки Ударац Комбо +hud-skill-axe_double_strike_combo = Откључава други удар{ $SP } +hud-skill-axe_double_strike_damage_title = Рањавање Двоструким Ударцем +hud-skill-axe_double_strike_damage = Повећава нанете ране сваким успешним ударцем{ $SP } +hud-skill-axe_double_strike_speed_title = Брзина Двоструког Ударца +hud-skill-axe_double_strike_speed = Повећава брзину напада сваким успешним ударцем{ $SP } +hud-skill-axe_double_strike_regen_title = Обнављање Двоструким Ударцем +hud-skill-axe_double_strike_regen = Повећава обнављање снаге сваким успешним ударцем{ $SP } +hud-skill-axe_spin_title = Секира Вртешка +hud-skill-axe_spin = Окрећеш се у круг ... +hud-skill-axe_infinite_axe_spin_title = Бесконачна Вртешка Секиром +hud-skill-axe_infinite_axe_spin = Врти се све док имаш снаге{ $SP } +hud-skill-axe_spin_damage_title = Рањавање Вртешком +hud-skill-axe_spin_damage = Повећава нанете ране окретом за { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Хеликоптер Вртешка +hud-skill-axe_spin_helicopter = Успораваш пад док се окрећеш{ $SP } +hud-skill-axe_spin_speed_title = Брзина Вртешке +hud-skill-axe_spin_speed = Повечава брзину окретања за { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Цена Вртешке +hud-skill-axe_spin_cost = Смањује трошење снаге током вртешке за { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Откључај Наскок +hud-skill-axe_unlock_leap = Откључва наскок вртешку{ $SP } +hud-skill-axe_leap_damage_title = Рањавање Наскоком +hud-skill-axe_leap_damage = Повећава рањавање наскоком за { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Наскок Одбацивање +hud-skill-axe_leap_knockback = Повећава одбацивање при наскоку за { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Цена Наскока +hud-skill-axe_leap_cost = Смањује цену наскока за { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Домет Наскока +hud-skill-axe_leap_distance = Повећава домет наскока за { $boost }%{ $SP } +hud-skill-mining_title = Рударење +hud-skill-pick_strike_title = Ударац Крамп +hud-skill-pick_strike = Удари камен крампом да добијеш руду, драгуље и искуство +hud-skill-pick_strike_speed_title = Брзина Замаха Крмапом +hud-skill-pick_strike_speed = Брже рударење{ $SP } +hud-skill-pick_strike_oregain_title = Принос Руда +hud-skill-pick_strike_oregain = Шанса за добијање додатне руде ({ $boost }% по новоу){ $SP } +hud-skill-pick_strike_gemgain_title = Принос Драгуља +hud-skill-pick_strike_gemgain = Шанса за добијање додатних драгуља ({ $boost }% по новоу){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/skills.ron b/assets/voxygen/i18n/sr_SR/hud/skills.ron deleted file mode 100644 index 9ed70eac67..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.rank_up": "Нови Вештина Поен", - "hud.skill.sp_available": "{number} ВП доступан", - "hud.skill.not_unlocked": "Није откључано", - "hud.skill.req_sp": "\n\nПотребно {number} ВП", - // Skills - // General - "hud.skill.inc_health_title": "Повећање Здравља", - "hud.skill.inc_health": "Повећава максимално здравље за {boost}{SP}", - "hud.skill.inc_stam_title": "Повећање Снаге", - "hud.skill.inc_stam": "Повећава максималну снагу за {boost}{SP}", - "hud.skill.unlck_sword_title": "Откључај Мач", - "hud.skill.unlck_sword": "Откључава стабло мач вештина{SP}", - "hud.skill.unlck_axe_title": "Откључај Секиру", - "hud.skill.unlck_axe": "Откључава стабло секира вештина{SP}", - "hud.skill.unlck_hammer_title": "Откључај Чекић", - "hud.skill.unlck_hammer": "Откључава стабло чекић вештина{SP}", - "hud.skill.unlck_bow_title": "Откључај Лук", - "hud.skill.unlck_bow": "Откључава стабло лук вештина{SP}", - "hud.skill.unlck_staff_title": "Откључај Штап", - "hud.skill.unlck_staff": "Откључава стабло штап вештина{SP}", - "hud.skill.unlck_sceptre_title": "Откључај Жезло", - "hud.skill.unlck_sceptre": "Откључава стабло жезло вештина{SP}", - "hud.skill.dodge_title": "Котрљање", - "hud.skill.dodge": "Котрљање се активира средњим кликом, и омогућава привремени имунитет на нападе (iframes) док се котрљаш.", - "hud.skill.roll_stamina_title": "Котрљајућа Снага", - "hud.skill.roll_stamina": "Котрљање користи {boost}% мање снаге{SP}", - "hud.skill.roll_speed_title": "Брзина Котрљања", - "hud.skill.roll_speed": "Котрљање је {boost}% брже{SP}", - "hud.skill.roll_dur_title": "Трајање Котрљања", - "hud.skill.roll_dur": "Котрљање траје {boost}% дуже{SP}", - "hud.skill.climbing_title": "Пењање", - "hud.skill.climbing": "Већи Скок", - "hud.skill.climbing_cost_title": "Цена Пењања", - "hud.skill.climbing_cost": "Пењање користи {boost}% мање снаге{SP}", - "hud.skill.climbing_speed_title": "Брзина Пењања", - "hud.skill.climbing_speed": "Пењање је {boost}% брже{SP}", - "hud.skill.swim_title": "Пливање", - "hud.skill.swim": "Кретање у мокром окружењу", - "hud.skill.swim_speed_title": "Брзина Пливања", - "hud.skill.swim_speed": "Пливање је {boost}% брже{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Зрак крађе живота", - "hud.skill.sc_lifesteal": "Исисава живот из непријатеља", - "hud.skill.sc_lifesteal_damage_title": "Рањавање", - "hud.skill.sc_lifesteal_damage": "Наноси {boost}% више рана{SP}", - "hud.skill.sc_lifesteal_range_title": "Домет", - "hud.skill.sc_lifesteal_range": "Твој зрак досеже {boost}% даље{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Крађа живота", - "hud.skill.sc_lifesteal_lifesteal": "Претвара додатни {boost}% нанетих рана у здравље{SP}", - "hud.skill.sc_lifesteal_regen_title": "Обнова Снаге", - "hud.skill.sc_lifesteal_regen": "Допуни своју снаге за {boost}%{SP}", - "hud.skill.sc_heal_title": "Лечећа Аура", - "hud.skill.sc_heal": "Лечи своје савезнике крвљу непријатеља, потребан комбо за активирање", - "hud.skill.sc_heal_heal_title": "Лечење", - "hud.skill.sc_heal_heal": "Побољшава лечење за {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Цена Снаге", - "hud.skill.sc_heal_cost": "Лечење захтева {boost}% мање снаге{SP}", - "hud.skill.sc_heal_duration_title": "Трајање", - "hud.skill.sc_heal_duration": "Ефекат лечеће ауре траје {boost}% дуже{SP}", - "hud.skill.sc_heal_range_title": "Домет", - "hud.skill.sc_heal_range": "Твоја лечећа аура досеже {boost}% даље{SP}", - "hud.skill.sc_wardaura_unlock_title": "Откључај Заштитну Ауру", - "hud.skill.sc_wardaura_unlock": "Омогућава ти да заштитиш своје савезнике од непријатеља{SP}", - "hud.skill.sc_wardaura_strength_title": "Снага", - "hud.skill.sc_wardaura_strength": "Повећава снагу заштите за {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Трајање", - "hud.skill.sc_wardaura_duration": "Ефекат твоје заштите траје {boost}% дуже{SP}", - "hud.skill.sc_wardaura_range_title": "Домет", - "hud.skill.sc_wardaura_range": "Твоја заштита досеже {boost}% даље{SP}", - "hud.skill.sc_wardaura_cost_title": "Цена Снаге", - "hud.skill.sc_wardaura_cost": "За стварање заштите је потребно {boost}% мање снаге{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Опсег Ватреног Таласа", - "hud.skill.st_shockwave_range" : "повећава домет за {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Цена Ватреног Таласа", - "hud.skill.st_shockwave_cost" : "Смањује снагу потребну за одбацивање беспомоћних сељака за {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Снага Одбацивања", - "hud.skill.st_shockwave_knockback" : "Повећава снагу одбацивања за {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Рањавање Ватреним Таласом", - "hud.skill.st_shockwave_damage" : "Повећава нанете ране за {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Откључај Ватрени Талас", - "hud.skill.st_shockwave_unlock" : "Откључава способност да одбацивања непријатеља ветреним таласом{SP}", - "hud.skill.st_flamethrower_title" : "Бацач Пламена", - "hud.skill.st_flamethrower" : "Избацује ватру, и све их пржи", - "hud.skill.st_flame_velocity_title" : "Брзина Ватре", - "hud.skill.st_flame_velocity" : "Ватра стиже брже, за {boost}%{SP}", - "hud.skill.st_flamethrower_range_title" : "Домет Бацача Пламена", - "hud.skill.st_flamethrower_range" : "Када пламен једноставно не допире, досеже {boost}% даље{SP}", - "hud.skill.st_energy_drain_title" : "Штедња Снаге", - "hud.skill.st_energy_drain" : "Смањује потрошњу снаге за {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Рањавање Бацачем Пламена", - "hud.skill.st_flamethrower_damage" : "Повећава рањавање за {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Домет Експлозије", - "hud.skill.st_explosion_radius" : "Већ је бољи, повећава домет експлозије за {boost}%{SP}", - "hud.skill.st_stamina_regen_title" : "Обнављање Снаге", - "hud.skill.st_stamina_regen" : "Повећава обнављање снаге за {boost}%{SP}", - "hud.skill.st_fireball_title" : "Ватрена Кугла", - "hud.skill.st_fireball" : "Испаљује ватрену куглу која екслодира при судару", - "hud.skill.st_damage_title" : "Рањавање", - "hud.skill.st_damage" : "Повећава рањавање за {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Брзина Пројектила", - "hud.skill.bow_projectile_speed" : "Стреле добацују даље и брже за {boost}%{SP}", - "hud.skill.bow_charged_title" : "Запета Стрела", - "hud.skill.bow_charged" : "Зато што чекаш дуже", - "hud.skill.bow_charged_damage_title" : "Рањавање Запетом Стрелом", - "hud.skill.bow_charged_damage" : "Повећава рањавање за {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Обнављање Снаге", - "hud.skill.bow_charged_energy_regen" : "Повећава обнављање стамине за {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Одбациваље Запетом Стрелом", - "hud.skill.bow_charged_knockback" : "Одбацује непријатеља даље за {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "Брзина Запете Стреле", - "hud.skill.bow_charged_speed" : "Повећава брзину напада за {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Брзина Кретања При Пуњењу", - "hud.skill.bow_charged_move" : "Повећава брзину пуњења при нападу за {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Понављач", - "hud.skill.bow_repeater" : "Брзо испањивање стрела", - "hud.skill.bow_repeater_damage_title" : "Рањавање Понављачем", - "hud.skill.bow_repeater_damage" : "Повећава нанете ране за {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Цена Понављача", - "hud.skill.bow_repeater_cost" : "Смаљује коришћење снаге понављача за {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Брзина Понављача", - "hud.skill.bow_repeater_speed" : "Повећава брзину испаљиваља стрела за {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Откључај Сачмару", - "hud.skill.bow_shotgun_unlock" : "Откључава способност испаљивања више стрела у исто време{SP}", - "hud.skill.bow_shotgun_damage_title" : "Рањавање Сачмаром", - "hud.skill.bow_shotgun_damage" : "Повећава нанете ране за{boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Цена Сачмаре", - "hud.skill.bow_shotgun_cost" : "Смањује цену сачмаре за {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Стрелна Сачмара", - "hud.skill.bow_shotgun_arrow_count" : "Повећава број испаљених стрела одједном за {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Обухват Сачмаре", - "hud.skill.bow_shotgun_spread" : "Смањује ширину обухвата стрелама за {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Домет Наскока", - "hud.skill.hmr_leap_radius" : "Повећава домет напада земљаног удара за {boost} метра{SP}", - "hud.skill.hmr_leap_distance_title" : "Даљина Наскока", - "hud.skill.hmr_leap_distance" : "Повећава даљину наскока за {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Цена Наскока", - "hud.skill.hmr_leap_cost" : "Смањује цену наскока за {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Скок Одбацивање", - "hud.skill.hmr_leap_knockback" : "Повећава одбацивање при наскоку за {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Рањавање Наскоком", - "hud.skill.hmr_leap_damage" : "Повећава нанете ране при наскоку за {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Откључај Наскок", - "hud.skill.hmr_unlock_leap" : "Откључава наскок{SP}", - "hud.skill.hmr_charged_melee_title" : "Јуришна Блиска Борба", - "hud.skill.hmr_charged_melee" : "Блиска борба са јуришом", - "hud.skill.hmr_charged_rate_title" : "Брзина Јуриша", - "hud.skill.hmr_charged_rate" : "Повећава брзину замаха при јуришу за {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Енергетско Црпљење Јуришне Борбе", - "hud.skill.hmr_charged_melee_nrg_drain" : "Смаљује брзину црпљења снаге при јуришу за {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Рањавање Јуришном Борбом", - "hud.skill.hmr_charged_melee_damage" : "Повећава ране нанете јуришним замахом за {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Одбацивање при Јуришној Борби", - "hud.skill.hmr_charged_melee_knockback" : "Повећава одбацивање при замаху за {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Једноструки Ударац", - "hud.skill.hmr_single_strike" : "Усамљен као и ти", - "hud.skill.hmr_single_strike_regen_title" : "Једноструки Ударац Обнова", - "hud.skill.hmr_single_strike_regen" : "Повећава обнову снаге после сваког успешног ударца{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Брзина Једноструког Ударца", - "hud.skill.hmr_single_strike_speed" : "Повећава брзину напада после сваког успешног ударца{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Рањавање Једноструким Ударацем", - "hud.skill.hmr_single_strike_damage" : "Повећава рањавање при сваком успешном ударцу{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Једноструки Ударац Одбацивање", - "hud.skill.hmr_single_strike_knockback" : "Повећава потенцијал одбацивања за {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Троструки Ударац", - "hud.skill.sw_trip_str": "Ударац, до три пута", - "hud.skill.sw_trip_str_combo_title": "Троструки Ударац Комбо", - "hud.skill.sw_trip_str_combo": "Омогућава пењање комбоа на три ударца{SP}", - "hud.skill.sw_trip_str_dmg_title": "Рањавање Троструким Ударацем", - "hud.skill.sw_trip_str_dmg": "Повећава рањавање након сваког успешног ударца{SP}", - "hud.skill.sw_trip_str_sp_title": "Брзина Троструког Ударца", - "hud.skill.sw_trip_str_sp": "Повећава брзину напада за сваки успешни ударац{SP}", - "hud.skill.sw_trip_str_reg_title": "Троструки Ударац Снага", - "hud.skill.sw_trip_str_reg": "Повећава обнову снаге при сваком успешном ударцу{SP}", - "hud.skill.sw_dash_title": "Прескок", - "hud.skill.sw_dash": "Провуци се кроз непријатеље", - "hud.skill.sw_dash_dmg_title": "Рањавање Прескоком", - "hud.skill.sw_dash_dmg": "Повећава почетне ране нанете прескоком за {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Прескок Црпљење", - "hud.skill.sw_dash_drain": "Смањје брзину црпљења снаге током прескока за {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Цена Прескока", - "hud.skill.sw_dash_cost": "Смањује почетну цену прескока за {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Брзина Прескока", - "hud.skill.sw_dash_speed": "Повећава брзину кретања током прескока за {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Јуриш Кроз", - "hud.skill.sw_dash_charge_through": "Дозвољава ти да пролетиш кроз првог непријатеља на кога налетиш{SP}", - "hud.skill.sw_dash_scale_title": "Повећавање Рањавање Прескоком", - "hud.skill.sw_dash_scale": "Повећава повећавање рањавање при прескоку за {boost}%{SP}", - "hud.skill.sw_spin_title": "Откључај Вртешку", - "hud.skill.sw_spin": "Откључава мач вртешку{SP}", - "hud.skill.sw_spin_dmg_title": "Рањавање Вртешком", - "hud.skill.sw_spin_dmg": "Повећава нанете ране за {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Брзина Вртешке", - "hud.skill.sw_spin_spd": "Повећава брзину вртења за {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Цена Вртешке", - "hud.skill.sw_spin_cost": "Смањује трошење снаге током вртешке за {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Вртећа Вртешка", - "hud.skill.sw_spin_spins": "Повећава број окрета током вртешке{SP}", - "hud.skill.sw_interrupt_title": "Пректид Напада", - "hud.skill.sw_interrupt": "Дозвољава ти да истовремено прекинеш напад следећим нападом{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Двоструки Ударац", - "hud.skill.axe_double_strike": "Исецкај непријатеља на делове", - "hud.skill.axe_double_strike_combo_title": "Двоструки Ударац Комбо", - "hud.skill.axe_double_strike_combo": "Откључава други удар{SP}", - "hud.skill.axe_double_strike_damage_title": "Рањавање Двоструким Ударцем", - "hud.skill.axe_double_strike_damage": "Повећава нанете ране сваким успешним ударцем{SP}", - "hud.skill.axe_double_strike_speed_title": "Брзина Двоструког Ударца", - "hud.skill.axe_double_strike_speed": "Повећава брзину напада сваким успешним ударцем{SP}", - "hud.skill.axe_double_strike_regen_title": "Обнављање Двоструким Ударцем", - "hud.skill.axe_double_strike_regen": "Повећава обнављање снаге сваким успешним ударцем{SP}", - "hud.skill.axe_spin_title": "Секира Вртешка", - "hud.skill.axe_spin": "Окрећеш се у круг ...", - "hud.skill.axe_infinite_axe_spin_title": "Бесконачна Вртешка Секиром", - "hud.skill.axe_infinite_axe_spin": "Врти се све док имаш снаге{SP}", - "hud.skill.axe_spin_damage_title": "Рањавање Вртешком", - "hud.skill.axe_spin_damage": "Повећава нанете ране окретом за {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Хеликоптер Вртешка", - "hud.skill.axe_spin_helicopter": "Успораваш пад док се окрећеш{SP}", - "hud.skill.axe_spin_speed_title": "Брзина Вртешке", - "hud.skill.axe_spin_speed": "Повечава брзину окретања за {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Цена Вртешке", - "hud.skill.axe_spin_cost": "Смањује трошење снаге током вртешке за {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Откључај Наскок", - "hud.skill.axe_unlock_leap": "Откључва наскок вртешку{SP}", - "hud.skill.axe_leap_damage_title": "Рањавање Наскоком", - "hud.skill.axe_leap_damage": "Повећава рањавање наскоком за {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Наскок Одбацивање", - "hud.skill.axe_leap_knockback": "Повећава одбацивање при наскоку за {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Цена Наскока", - "hud.skill.axe_leap_cost": "Смањује цену наскока за {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Домет Наскока", - "hud.skill.axe_leap_distance": "Повећава домет наскока за {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Рударење", - "hud.skill.pick_strike_title": "Ударац Крамп", - "hud.skill.pick_strike": "Удари камен крампом да добијеш руду, драгуље и искуство", - "hud.skill.pick_strike_speed_title": "Брзина Замаха Крмапом", - "hud.skill.pick_strike_speed": "Брже рударење{SP}", - "hud.skill.pick_strike_oregain_title": "Принос Руда", - "hud.skill.pick_strike_oregain": "Шанса за добијање додатне руде ({boost}% по новоу){SP}", - "hud.skill.pick_strike_gemgain_title": "Принос Драгуља", - "hud.skill.pick_strike_gemgain": "Шанса за добијање додатних драгуља ({boost}% по новоу){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/social.ftl b/assets/voxygen/i18n/sr_SR/hud/social.ftl new file mode 100644 index 0000000000..bfc6472bc5 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Остали Играчи +hud-social-online = На-мрежи: +hud-social-friends = Пријатељи +hud-social-not_yet_available = Није још Доступно +hud-social-faction = Фракција +hud-social-play_online_fmt = { $nb_player } играча на-мрежи +hud-social-name = Име +hud-social-level = Ниво +hud-social-zone = Зона +hud-social-account = Рачун \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/social.ron b/assets/voxygen/i18n/sr_SR/hud/social.ron deleted file mode 100644 index 9d11349081..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/social.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.social": "Остали Играчи", - "hud.social.online": "На-мрежи:", - "hud.social.friends": "Пријатељи", - "hud.social.not_yet_available": "Није још Доступно", - "hud.social.faction": "Фракција", - "hud.social.play_online_fmt": "{nb_player} играча на-мрежи", - "hud.social.name": "Име", - "hud.social.level": "Ниво", - "hud.social.zone": "Зона", - "hud.social.account": "Рачун", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/hud/trade.ftl b/assets/voxygen/i18n/sr_SR/hud/trade.ftl new file mode 100644 index 0000000000..bcac217b97 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/hud/trade.ftl @@ -0,0 +1,23 @@ +hud-trade-trade_window = Трампа +hud-trade-phase1_description = Превуци итеме које желиш да трампиш. +hud-trade-phase2_description = + Трампа је сада закључана да ти пружи + времена да прегледаш. +hud-trade-phase3_description = Трампа се обрађује. +hud-trade-persons_offer = { $playername } понуда +hud-trade-has_accepted = + { $playername } + је прихватио/ла +hud-trade-accept = Прихвати +hud-trade-decline = Одбаци +hud-trade-invite_sent = Захтев за трампу послат { $playername }. +hud-trade-result-completed = Успешна трампа. +hud-trade-result-declined = Трампа одбачена. +hud-trade-result-nospace = Нема довољно простора за трампу. +hud-trade-buy_price = Куповна Цена +hud-trade-sell_price = Платна Цена +hud-trade-coin = новчића +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Твоја понуда +hud-trade-their_offer = Њихова понуда \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/hud/trade.ron b/assets/voxygen/i18n/sr_SR/hud/trade.ron deleted file mode 100644 index e18a8d4885..0000000000 --- a/assets/voxygen/i18n/sr_SR/hud/trade.ron +++ /dev/null @@ -1,31 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - "hud.trade.trade_window": "Трампа", - "hud.trade.phase1_description": "Превуци итеме које желиш да трампиш.", - "hud.trade.phase2_description": "Трампа је сада закључана да ти пружи\n времена да прегледаш.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Трампа се обрађује.", - "hud.trade.persons_offer": "{playername} понуда", - "hud.trade.has_accepted": "{playername}\nје прихватио/ла", - "hud.trade.accept": "Прихвати", - "hud.trade.decline": "Одбаци", - "hud.trade.invite_sent": "Захтев за трампу послат {playername}.", - "hud.trade.result.completed": "Успешна трампа.", - "hud.trade.result.declined": "Трампа одбачена.", - "hud.trade.result.nospace": "Нема довољно простора за трампу.", - "hud.trade.buy_price": "Куповна Цена", - "hud.trade.sell_price": "Платна Цена", - "hud.trade.coin": "новчића", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Твоја понуда", - "hud.trade.their_offer": "Њихова понуда", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sr_SR/main.ftl b/assets/voxygen/i18n/sr_SR/main.ftl new file mode 100644 index 0000000000..5bbe1dbe64 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/main.ftl @@ -0,0 +1,75 @@ +main-username = Корисничко Име +main-server = Сервер +main-password = Лозинка +main-connecting = Позвезивање +main-creating_world = Прављење Света +main-tip = Савет: +main-notice = + Добродошао/ла у алфа верзију Veloren-а! + + Пре него почнеш забаву, молимо да обратиш пажњу на следеће: + + - Ово је веома рана алфа верзија. Очекуј грешке, изузетно недовршену игру, неугланцану механику, и недостајуће функције. + + - Ако имаш конструктивну подршку или извештај о грешци, можеш нас контактирати преко Reddit-а, GitLab-а, или нашег Discord сервера. + + - Veloren је лиценциран под GPL 3 лиценцом отвореног кода. Што значи да можеш да играш, мењаш, и раздељујеш игру како код пожелиш (ако је изведена дорада такође под GPL 3 лиценцом). + + - Veloren је не профитни пројекат заједнице, и сви који раде на њему су добровољци. + Ако ти се свића што видиш, добродошао/ла си да се придружиш развојном или уметничком тиму! + + Хвала за одвојено време да прочиташ ово обавештење, надамо се да ћеш уживати у игри! + + ~ Veloren Екипа +main-login_process = + Информација о пријављивању: + + Молимо обратите пажњу да вам је потребан рачун + да играте на потврда-омогућеним серверима. + + Рачун можете направити на сајту + + https://veloren.net/account/. +main-login-server_not_found = Сервер није нађен +main-login-authentication_error = Грешка при потврди сервера +main-login-internal_error = Унутрашња грешка у клијенту (вероватно, лик играча је обрисан) +main-login-failed_auth_server_url_invalid = Грешка при повезивању са потврдним сервером +main-login-insecure_auth_scheme = HTTP потврдна шема НИЈЕ подржана. Несигурна је! Из развојних потреба, HTTP је дозвољен за 'localhost' или тест изградњама +main-login-server_full = Сервер је пун +main-login-untrusted_auth_server = Потврдни сервер није пуздан +main-login-outdated_client_or_server = Полудели Сервер: Вероватно верзија није подударна, провери ажурирања. +main-login-timeout = Истекло време: Сервер није одговоријо на време. (Преоптерећење или грешка на мрежи). +main-login-server_shut_down = Сервер искључен +main-login-network_error = Грешка на мрежи +main-login-network_wrong_version = Неподударне сервер и клијент верзија, молимо ажурирајте игру. +main-login-failed_sending_request = Захтев ка потврдном серверу није прошао +main-login-invalid_character = Одабрани лик је неважећи +main-login-client_crashed = Клијент се срушио +main-login-not_on_whitelist = Потребно је да вас Админ дода не белу-листу да би ушли +main-login-banned = Забрањен вам је улаз из следећег разлога +main-login-kicked = Одбијен вам је улаз из следеће разлога +main-login-select_language = Одабери језик +main-login-client_version = Верзија Клијнта +main-login-server_version = Верзија Сервера +main-servers-select_server = Одабери Сервер +loading-tips = + .a0 = Стисни '{ $gameinput-togglelantern }' да укључиш лампу. + .a1 = Стисни '{ $gameinput-help }' да видиш подразумеване тастере. + .a2 = Можеш да укуцаш /say или /s да разговараш са играчима који су близу тебе. + .a3 = Можеш да укуцаш /region или /r да разговараш са играчима који су пар стотина блокова удаљени. + .a4 = Админи могу да користе /build команду да активирају мод градње. + .a5 = Можеш да укуцаш /group or /g да разговараш са играчима који се налазе у твојој групи. + .a6 = Да пошаљеш приватну поруку укуцај /tell затим име играча и твоју поруку. + .a7 = Обрати пажњу на храну, сандуке и остали плен раштркан по свету! + .a8 = Инвентар пун свеже хране? Покушај да направиш бољу храну од њега! + .a9 = Питаш се шта да радиш? Пробај једну од тамница означених на мапи! + .a10 = Не заборави да подесиш графику за свој систем. Стисни '{ $gameinput-settings }' да отвориш подешавања. + .a11 = Играње са другима је забавно! Стисни '{ $gameinput-social }' да видиш ко је још присутан. + .a12 = Стисни '{ $gameinput-dance }' да заиграш. Журка! + .a13 = Стисни '{ $gameinput-glide }' да отвориш Једрењак и освојиш небо. + .a14 = Veloren је и даље Пре-Алфа. Сваким даном се трудимо да га побољшамо! + .a15 = Ако желиш да се прикључиш развојном тиму или да ступиш у контакт са нама, придружи се нашем Discord серверу. + .a16 = Можеш да укључиш приказ здравственог стања на бару за здравље у подешавањима. + .a17 = Седи поред ватре (помоћу '{ $gameinput-sit }' тастера) да се полако опоравиш од повреда. + .a18 = Треба ти више торби или бољи оклоп да наставиш путовање? Стисни '{ $gameinput-crafting }' да отвориш мени за прављење! + .a19 = Покушај да скочиш док се котрљаш кроз створења. \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/main.ron b/assets/voxygen/i18n/sr_SR/main.ron deleted file mode 100644 index a86eda99e1..0000000000 --- a/assets/voxygen/i18n/sr_SR/main.ron +++ /dev/null @@ -1,91 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - /// Start Main screen section - "main.username": "Корисничко Име", - "main.server": "Сервер", - "main.password": "Лозинка", - "main.connecting": "Позвезивање", - "main.creating_world": "Прављење Света", - "main.tip": "Савет:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Добродошао/ла у алфа верзију Veloren-а! - -Пре него почнеш забаву, молимо да обратиш пажњу на следеће: - -- Ово је веома рана алфа верзија. Очекуј грешке, изузетно недовршену игру, неугланцану механику, и недостајуће функције. - -- Ако имаш конструктивну подршку или извештај о грешци, можеш нас контактирати преко Reddit-а, GitLab-а, или нашег Discord сервера. - -- Veloren је лиценциран под GPL 3 лиценцом отвореног кода. Што значи да можеш да играш, мењаш, и раздељујеш игру како код пожелиш (ако је изведена дорада такође под GPL 3 лиценцом). - -- Veloren је не профитни пројекат заједнице, и сви који раде на њему су добровољци. -Ако ти се свића што видиш, добродошао/ла си да се придружиш развојном или уметничком тиму! - -Хвала за одвојено време да прочиташ ово обавештење, надамо се да ћеш уживати у игри! - -~ Veloren Екипа"#, - - // Login process description - "main.login_process": r#"Информација о пријављивању: - -Молимо обратите пажњу да вам је потребан рачун -да играте на потврда-омогућеним серверима. - -Рачун можете направити на сајту - -https://veloren.net/account/."#, - "main.login.server_not_found": "Сервер није нађен", - "main.login.authentication_error": "Грешка при потврди сервера", - "main.login.internal_error": "Унутрашња грешка у клијенту (вероватно, лик играча је обрисан)", - "main.login.failed_auth_server_url_invalid": "Грешка при повезивању са потврдним сервером", - "main.login.insecure_auth_scheme": "HTTP потврдна шема НИЈЕ подржана. Несигурна је! Из развојних потреба, HTTP је дозвољен за 'localhost' или тест изградњама", - "main.login.server_full": "Сервер је пун", - "main.login.untrusted_auth_server": "Потврдни сервер није пуздан", - "main.login.outdated_client_or_server": "Полудели Сервер: Вероватно верзија није подударна, провери ажурирања.", - "main.login.timeout": "Истекло време: Сервер није одговоријо на време. (Преоптерећење или грешка на мрежи).", - "main.login.server_shut_down": "Сервер искључен", - "main.login.network_error": "Грешка на мрежи", - "main.login.network_wrong_version": "Неподударне сервер и клијент верзија, молимо ажурирајте игру.", - "main.login.failed_sending_request": "Захтев ка потврдном серверу није прошао", - "main.login.invalid_character": "Одабрани лик је неважећи", - "main.login.client_crashed": "Клијент се срушио", - "main.login.not_on_whitelist": "Потребно је да вас Админ дода не белу-листу да би ушли", - "main.login.banned": "Забрањен вам је улаз из следећег разлога", - "main.login.kicked": "Одбијен вам је улаз из следеће разлога", - "main.login.select_language": "Одабери језик", - "main.login.client_version": "Верзија Клијнта", - "main.login.server_version": "Верзија Сервера", - "main.servers.select_server": "Одабери Сервер", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Стисни '{gameinput.togglelantern}' да укључиш лампу.", - "Стисни '{gameinput.help}' да видиш подразумеване тастере.", - "Можеш да укуцаш /say или /s да разговараш са играчима који су близу тебе.", - "Можеш да укуцаш /region или /r да разговараш са играчима који су пар стотина блокова удаљени.", - "Админи могу да користе /build команду да активирају мод градње.", - "Можеш да укуцаш /group or /g да разговараш са играчима који се налазе у твојој групи.", - "Да пошаљеш приватну поруку укуцај /tell затим име играча и твоју поруку.", - "Обрати пажњу на храну, сандуке и остали плен раштркан по свету!", - "Инвентар пун свеже хране? Покушај да направиш бољу храну од њега!", - "Питаш се шта да радиш? Пробај једну од тамница означених на мапи!", - "Не заборави да подесиш графику за свој систем. Стисни '{gameinput.settings}' да отвориш подешавања.", - "Играње са другима је забавно! Стисни '{gameinput.social}' да видиш ко је још присутан.", - "Стисни '{gameinput.dance}' да заиграш. Журка!", - "Стисни '{gameinput.glide}' да отвориш Једрењак и освојиш небо.", - "Veloren је и даље Пре-Алфа. Сваким даном се трудимо да га побољшамо!", - "Ако желиш да се прикључиш развојном тиму или да ступиш у контакт са нама, придружи се нашем Discord серверу.", - "Можеш да укључиш приказ здравственог стања на бару за здравље у подешавањима.", - "Седи поред ватре (помоћу '{gameinput.sit}' тастера) да се полако опоравиш од повреда.", - "Треба ти више торби или бољи оклоп да наставиш путовање? Стисни '{gameinput.crafting}' да отвориш мени за прављење!", - "Покушај да скочиш док се котрљаш кроз створења.", - ], - } -) diff --git a/assets/voxygen/i18n/sr_SR/npc.ftl b/assets/voxygen/i18n/sr_SR/npc.ftl new file mode 100644 index 0000000000..b14cb7f2d3 --- /dev/null +++ b/assets/voxygen/i18n/sr_SR/npc.ftl @@ -0,0 +1,170 @@ +npc-speech-villager = + .a0 = Није ли предиван дан? + .a1 = Како си ти данас? + .a2 = Добро јутро ти желим! + .a3 = Питам се шта Catoblepas мисли када једе траву. + .a4 = Шта мислиш о овом времену? + .a5 = Сама мисао на тамнице ме уплаши. Надам се да ће их неко почистити. + .a6 = Имам жељу да се бавим спелеологијом у пећинама кад ојачам. + .a7 = Да ниси видео/ла моју мачку? + .a8 = Јеси ли икада чуо/ла за неустрашиву Копнену Ајкулу? Чујем да живе у пустињама. + .a9 = Кажу да се у пећинама могу наћи сјајни драгуљи свих врста. + .a10 = Само са опседнут сиром! + .a11 = Зар нећеш ући? Само што нисмо почели са сиром! + .a12 = Кажу да су печурке добре за здравље. Ја лично их никад не једем. + .a13 = Не заборави крекере! + .a14 = Просто обожавам Сир Патуљака. Их кад бих знао како да га направим. + .a15 = Питам се шта ли је са друге стране планина. + .a16 = Надам се да ћу да направим мој лични једрењак једног дана. + .a17 = Желиш ли да видиш моју башту? Важи, можда неки други пут. + .a18 = Предиван да за шетњу у шуми! + .a19 = Бити, или не бити? Мислим да ћу бити фармер. + .a20 = Зар не мислиш да је наше село најбоље? + .a21 = Шта мислиш да Сјајне Остатке чини тако сјајним? + .a22 = Мислим да је време за други доручак! + .a23 = Јеси ли икад ухватио/ла свитца? + .a24 = Просто не разумем одакле ови Sauroks-и настављају да долазе. + .a25 = Волео бих да неко држи вукове даље од села. + .a26 = Имао/ла сам предиван сан о сиру синоћ. Да ли то нешто значи? + .a27 = Оставио/ла сам мало сира код брата. Сад не знам да ли постоји или не. Зовем га Шредингер сир. + .a28 = Оставио/ла сам мало сира код сестре. Сад не знам да ли постоји или не. Зовем га Шредингер сир. + .a29 = Неко би требало да предузме нешто по питању ових култиста. По могућности не ја. + .a30 = Надам се да ће киша ускоро. Било би добро за усеве. + .a31 = Обожавам мед! И мрзим пчеле. + .a32 = Жело/ла бих да видим свет једног дана. У животу мора бити више од овог села. +npc-speech-villager_decline_trade = + .a0 = Извини, Немам ништа за продају. + .a1 = Трампа? Као да ја имам нешто што би тебе интересовало. + .a2 = Моја кућа је моја, нећу је продати низашта. +npc-speech-merchant_advertisement = + .a0 = Могу ли те заинтересовати за трампу? + .a1 = Желиш ли да се трампиш са мном? + .a2 = Имам гомилу робе, Желиш ли да погледаш? +npc-speech-merchant_busy = + .a0 = Ало, Сачекај свој ред. + .a1 = Молим те сачекај, ја сам само једна особа. + .a2 = Зар не видиш особу испред себе? + .a3 = Само моменат, да завршим. + .a4 = Нема прескакања реда. + .a5 = Заузет/а сам, дођи касније. +npc-speech-merchant_trade_successful = + .a0 = Хвала што си пазарио/ла код мене! + .a1 = Хвала лепо! +npc-speech-merchant_trade_declined = + .a0 = Можда следећи пут, пријатан дан желим! + .a1 = Штета, можда следећи пут! +npc-speech-villager_cultist_alarm = + .a0 = Пази! Култист је пуштен са ланца! + .a1 = На оружје! Култисти нападају! + .a2 = Како ли се само култисти усуде да нападну село! + .a3 = Смрт култистима!!! + .a4 = Култисти овде неће бити толерисани! + .a5 = Култист убица! + .a6 = Окуси оштрицу мог мача , ти прљави култисто! + .a7 = Ништа не може опрати твоје крваве руке, култисто! + .a8 = Милијарде блиставих плавих шкољки! Култисти су међу нама! + .a9 = Ускоро долази крај злу овог култисте! + .a10 = Овај култиста је мој! + .a11 = Припреми се да упознаш свог творца, прљави култисто! + .a12 = Видим култисте! За њима! + .a13 = Видим култисте! Напад! + .a14 = Видим култисте! Не дајте им да побегну! + .a15 = Да ли би најчаснији култиста желео једну СМРТ?! + .a16 = Никад опрости! Никад заборави! Култисти, зажалите! + .a17 = Умри, култисто! + .a18 = Твом терору је дошао крај! + .a19 = Ово ти је казна за сва злодела! + .a20 = Овде не волимо типове као што си ти. + .a21 = Боље да си остао под земљом! +npc-speech-villager_under_attack = + .a0 = Упомоћ, нападнут/а сам! + .a1 = Упомоћ, нападнут/а сам! + .a2 = Јој! нападнут/а сам! + .a3 = Јаој! нападнут/а сам! Упомоћ! + .a4 = Помозите ми! Нападнут/а сам! + .a5 = Нападнут/а сам! Упомоћ! + .a6 = Нападнут/а сам! Помозите ми! + .a7 = Упомоћ! + .a8 = Упомоћ! Упомоћ! + .a9 = Упомоћ! Упомоћ! Упомоћ! + .a10 = Нападнут/а сам! + .a11 = АЈАОЈ! Нападнут/а сам! + .a12 = АЈАОЈ! Нападнут/а сам! Упомоћ! + .a13 = Упомоћ! Нападнути смо! + .a14 = Упомоћ! Убица! + .a15 = Упомоћ! Убица је пуштен с' ланца! + .a16 = Упомоћ! Покушавају да ме убију! + .a17 = Стража, Нападнут/а сам! + .a18 = Стража! Нападнут/а сам! + .a19 = Нападнут/а сам! Стража! + .a20 = Упомоћ! Стража! Нападнут/а сам! + .a21 = Стража! Пожурите! + .a22 = Стража! Стража! + .a23 = Стража! Напада ме негативац! + .a24 = Стража, убијте овог прљавог злочинца! + .a25 = Стража! Ено га убица! + .a26 = Стража! Помозите ми! + .a27 = Нећеш се извући са овим! Стража! + .a28 = Ти ђаволе! + .a29 = Помозите ми! + .a30 = Помагајте! Молим вас! + .a31 = Јој! Стража! Упомоћ! + .a32 = Долазе по мене! + .a33 = Упомоћ! Упомоћ! Бивам потиснут/а! + .a34 = Ах, сада видимо насиље својствено систему . + .a35 = Само огреботина! + .a36 = Еј Прекини! + .a37 = Шта сам ти ја скривио?! + .a38 = Молим те престани да ме нападаш! + .a39 = Еј! Пази где упиреш са тим! + .a40 = Одвратни бедниче, нестани одавде! + .a41 = Престани! Одлази одавде! + .a42 = Сада си ме разљутио! + .a43 = Еј! Шта си ти умислио да си?! + .a44 = За то ћу ти одсећи главу! + .a45 = Престани, молим те! Са собом немам ништа вредно! + .a46 = Пустићу мога брата на тебе, он је већи него што сам ја! + .a47 = Неее, Све ћу рећи мајци! + .a48 = Проклет/а да си! + .a49 = Молим те престани са тим. + .a50 = То није лепо од тебе! + .a51 = Твоје оружје ради, сада можеш да га одложиш! + .a52 = Поштеди ме! + .a53 = Молим те, Ја имам фамилију! + .a54 = Премлад/а сам да умрем! + .a55 = Можемо ли да се нагодимо? + .a56 = Насиље није никад одговор! + .a57 = Данас имам веома лош дан... + .a58 = Еј, то боли! + .a59 = ЕЈЈЈ! + .a60 = Веома безобразно! + .a61 = Престани, молим те! + .a62 = Осип те напао! + .a63 = Ово није забавно. + .a64 = Како се усуђујеш?! + .a65 = Платићеш за ово! + .a66 = Наставиш ли овако зажалићеш! + .a67 = Не терај ме да те повредим! + .a68 = Мора да је дошло до неспоразума! + .a69 = Не мораш ово да радиш! + .a70 = Нестани, бедниче! + .a71 = То стварно боли! + .a72 = Зашто то радиш? + .a73 = За име духова, престани! + .a74 = Мора да си ме помешао/ла са неким другим! + .a75 = Ја ово нисам заслужио/ла! + .a76 = Молим те, немој то поново радити. + .a77 = Стража, баците ово чудовиште у језеро! + .a78 = Пустићу мог tarasque на тебе! + .a79 = Зашто јааааа? +npc-speech-villager_enemy_killed = + .a0 = Уништио/ла сам свог противника! + .a1 = Коначно у миру! + .a2 = ... где сам оно стао? +npc-speech-menacing = + .a0 = Упозоравам те! + .a1 = Приђеш ли корак ближе нападам! + .a2 = Не плашиш ме! + .a3 = Губи се одавде! + .a4 = Ако ти је живот мио окрени се и одлази! + .a5 = Овде ниси добродошао! \ No newline at end of file diff --git a/assets/voxygen/i18n/sr_SR/npc.ron b/assets/voxygen/i18n/sr_SR/npc.ron deleted file mode 100644 index 1524648f28..0000000000 --- a/assets/voxygen/i18n/sr_SR/npc.ron +++ /dev/null @@ -1,190 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Није ли предиван дан?", - "Како си ти данас?", - "Добро јутро ти желим!", - "Питам се шта Catoblepas мисли када једе траву.", - "Шта мислиш о овом времену?", - "Сама мисао на тамнице ме уплаши. Надам се да ће их неко почистити.", - "Имам жељу да се бавим спелеологијом у пећинама кад ојачам.", - "Да ниси видео/ла моју мачку?", - "Јеси ли икада чуо/ла за неустрашиву Копнену Ајкулу? Чујем да живе у пустињама.", - "Кажу да се у пећинама могу наћи сјајни драгуљи свих врста.", - "Само са опседнут сиром!", - "Зар нећеш ући? Само што нисмо почели са сиром!", - "Кажу да су печурке добре за здравље. Ја лично их никад не једем.", - "Не заборави крекере!", - "Просто обожавам Сир Патуљака. Их кад бих знао како да га направим.", - "Питам се шта ли је са друге стране планина.", - "Надам се да ћу да направим мој лични једрењак једног дана.", - "Желиш ли да видиш моју башту? Важи, можда неки други пут.", - "Предиван да за шетњу у шуми!", - "Бити, или не бити? Мислим да ћу бити фармер.", - "Зар не мислиш да је наше село најбоље?", - "Шта мислиш да Сјајне Остатке чини тако сјајним?", - "Мислим да је време за други доручак!", - "Јеси ли икад ухватио/ла свитца?", - "Просто не разумем одакле ови Sauroks-и настављају да долазе.", - "Волео бих да неко држи вукове даље од села.", - "Имао/ла сам предиван сан о сиру синоћ. Да ли то нешто значи?", - "Оставио/ла сам мало сира код брата. Сад не знам да ли постоји или не. Зовем га Шредингер сир.", - "Оставио/ла сам мало сира код сестре. Сад не знам да ли постоји или не. Зовем га Шредингер сир.", - "Неко би требало да предузме нешто по питању ових култиста. По могућности не ја.", - "Надам се да ће киша ускоро. Било би добро за усеве.", - "Обожавам мед! И мрзим пчеле.", - "Жело/ла бих да видим свет једног дана. У животу мора бити више од овог села.", - ], - "npc.speech.villager_decline_trade": [ - "Извини, Немам ништа за продају.", - "Трампа? Као да ја имам нешто што би тебе интересовало.", - "Моја кућа је моја, нећу је продати низашта.", - ], - "npc.speech.merchant_advertisement": [ - "Могу ли те заинтересовати за трампу?", - "Желиш ли да се трампиш са мном?", - "Имам гомилу робе, Желиш ли да погледаш?" - ], - "npc.speech.merchant_busy": [ - "Ало, Сачекај свој ред.", - "Молим те сачекај, ја сам само једна особа.", - "Зар не видиш особу испред себе?", - "Само моменат, да завршим.", - "Нема прескакања реда.", - "Заузет/а сам, дођи касније." - ], - "npc.speech.merchant_trade_successful": [ - "Хвала што си пазарио/ла код мене!", - "Хвала лепо!", - ], - "npc.speech.merchant_trade_declined": [ - "Можда следећи пут, пријатан дан желим!", - "Штета, можда следећи пут!" - ], - "npc.speech.villager_cultist_alarm": [ - "Пази! Култист је пуштен са ланца!", - "На оружје! Култисти нападају!", - "Како ли се само култисти усуде да нападну село!", - "Смрт култистима!!!", - "Култисти овде неће бити толерисани!", - "Култист убица!", - "Окуси оштрицу мог мача , ти прљави култисто!", - "Ништа не може опрати твоје крваве руке, култисто!", - "Милијарде блиставих плавих шкољки! Култисти су међу нама!", - "Ускоро долази крај злу овог култисте!", - "Овај култиста је мој!", - "Припреми се да упознаш свог творца, прљави култисто!", - "Видим култисте! За њима!", - "Видим култисте! Напад!", - "Видим култисте! Не дајте им да побегну!", - "Да ли би најчаснији култиста желео једну СМРТ?!", - "Никад опрости! Никад заборави! Култисти, зажалите!", - "Умри, култисто!", - "Твом терору је дошао крај!", - "Ово ти је казна за сва злодела!", - "Овде не волимо типове као што си ти.", - "Боље да си остао под земљом!", - ], - "npc.speech.villager_under_attack": [ - "Упомоћ, нападнут/а сам!", - "Упомоћ, нападнут/а сам!", - "Јој! нападнут/а сам!", - "Јаој! нападнут/а сам! Упомоћ!", - "Помозите ми! Нападнут/а сам!", - "Нападнут/а сам! Упомоћ!", - "Нападнут/а сам! Помозите ми!", - "Упомоћ!", - "Упомоћ! Упомоћ!", - "Упомоћ! Упомоћ! Упомоћ!", - "Нападнут/а сам!", - "АЈАОЈ! Нападнут/а сам!", - "АЈАОЈ! Нападнут/а сам! Упомоћ!", - "Упомоћ! Нападнути смо!", - "Упомоћ! Убица!", - "Упомоћ! Убица је пуштен с' ланца!", - "Упомоћ! Покушавају да ме убију!", - "Стража, Нападнут/а сам!", - "Стража! Нападнут/а сам!", - "Нападнут/а сам! Стража!", - "Упомоћ! Стража! Нападнут/а сам!", - "Стража! Пожурите!", - "Стража! Стража!", - "Стража! Напада ме негативац!", - "Стража, убијте овог прљавог злочинца!", - "Стража! Ено га убица!", - "Стража! Помозите ми!", - "Нећеш се извући са овим! Стража!", - "Ти ђаволе!", - "Помозите ми!", - "Помагајте! Молим вас!", - "Јој! Стража! Упомоћ!", - "Долазе по мене!", - "Упомоћ! Упомоћ! Бивам потиснут/а!", - "Ах, сада видимо насиље својствено систему .", - "Само огреботина!", - "Еј Прекини!", - "Шта сам ти ја скривио?!", - "Молим те престани да ме нападаш!", - "Еј! Пази где упиреш са тим!", - "Одвратни бедниче, нестани одавде!", - "Престани! Одлази одавде!", - "Сада си ме разљутио!", - "Еј! Шта си ти умислио да си?!", - "За то ћу ти одсећи главу!", - "Престани, молим те! Са собом немам ништа вредно!", - "Пустићу мога брата на тебе, он је већи него што сам ја!", - "Неее, Све ћу рећи мајци!", - "Проклет/а да си!", - "Молим те престани са тим.", - "То није лепо од тебе!", - "Твоје оружје ради, сада можеш да га одложиш!", - "Поштеди ме!", - "Молим те, Ја имам фамилију!", - "Премлад/а сам да умрем!", - "Можемо ли да се нагодимо?", - "Насиље није никад одговор!", - "Данас имам веома лош дан...", - "Еј, то боли!", - "ЕЈЈЈ!", - "Веома безобразно!", - "Престани, молим те!", - "Осип те напао!", - "Ово није забавно.", - "Како се усуђујеш?!", - "Платићеш за ово!", - "Наставиш ли овако зажалићеш!", - "Не терај ме да те повредим!", - "Мора да је дошло до неспоразума!", - "Не мораш ово да радиш!", - "Нестани, бедниче!", - "То стварно боли!", - "Зашто то радиш?", - "За име духова, престани!", - "Мора да си ме помешао/ла са неким другим!", - "Ја ово нисам заслужио/ла!", - "Молим те, немој то поново радити.", - "Стража, баците ово чудовиште у језеро!", - "Пустићу мог tarasque на тебе!", - "Зашто јааааа?", - ], - "npc.speech.villager_enemy_killed": [ - "Уништио/ла сам свог противника!", - "Коначно у миру!", - "... где сам оно стао?", - ], - "npc.speech.menacing": [ - "Упозоравам те!", - "Приђеш ли корак ближе нападам!", - "Не плашиш ме!", - "Губи се одавде!", - "Ако ти је живот мио окрени се и одлази!", - "Овде ниси добродошао!", - ], - } -) diff --git a/assets/voxygen/i18n/sr_SR/template.ftl b/assets/voxygen/i18n/sr_SR/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/sr_SR/template.ron b/assets/voxygen/i18n/sr_SR/template.ron deleted file mode 100644 index 398e22ae0b..0000000000 --- a/assets/voxygen/i18n/sr_SR/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Serbian -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/buff.ftl b/assets/voxygen/i18n/sv_SE/buff.ftl new file mode 100644 index 0000000000..2118a12e0f --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Klicka för att ta bort +buff-title-missing = Titel saknas +buff-desc-missing = Beskrivning saknas +buff-title-heal = Hela +buff-desc-heal = Återfå hälsa över tid. +buff-title-potion = Trolldryck +buff-desc-potion = Dricker … +buff-title-saturation = Mättnad +buff-desc-saturation = Återfå hälsa över tid från förbrukningsvaror. +buff-title-campfire_heal = Helande lägereld +buff-desc-campfire_heal = Att vila vid en lägereld helar { $rate }% per sekund. +buff-title-invulnerability = Osårbarhet +buff-desc-invulnerability = Du kan inte skadas av någon attack. +buff-title-protectingward = Skyddsbesvärjelse +buff-desc-protectingward = Du skyddas, någorlunda, från attacker. +buff-title-frenzied = Rasande +buff-desc-frenzied = Du är uppfylld av en onaturlig hastighet och kan ignorera mindre skador. +buff-title-bleed = Blödande +buff-desc-bleed = Orsakar vanlig skada. +buff-title-cursed = Förbannad +buff-desc-cursed = En förbannelse har uttalats över dig. +buff-title-burn = I lågor +buff-desc-burn = Du är eld och lågor +buff-title-crippled = Halt +buff-desc-crippled = Din rörlighet hindras eftersom dina ben är allvarligt skadade. +buff-title-frozen = Frusen +buff-desc-frozen = Din rörlighet och attacker går långsammare. +buff-title-wet = Blöt +buff-desc-wet = Marken skyr dina fötter, vilket gör det svårt att stanna. +buff-title-ensnared = Intrasslad +buff-desc-ensnared = Rankor greppar tag i dina ben vilket begränsar dina rörelser. +buff-stat-health = Återger { $str_total } hälsa +buff-stat-increase_max_energy = Ökar den maximala uthålligheten med { $strength } +buff-stat-increase_max_health = Ökar den maximala hälsan med { $strength } +buff-stat-invulnerability = Ger osårbarhet +buff-text-over_seconds = under { $dur_secs } sekunder +buff-text-for_seconds = i { $dur_secs } sekunder \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/buff.ron b/assets/voxygen/i18n/sv_SE/buff.ron deleted file mode 100644 index a04bff8bd4..0000000000 --- a/assets/voxygen/i18n/sv_SE/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - // Buffs - "buff.remove": "Klicka för att ta bort", - "buff.title.missing": "Titel saknas", - "buff.desc.missing": "Beskrivning saknas", - "buff.title.heal": "Hela", - "buff.desc.heal": "Återfå hälsa över tid.", - "buff.title.potion": "Trolldryck", - "buff.desc.potion": "Dricker …", - "buff.title.saturation": "Mättnad", - "buff.desc.saturation": "Återfå hälsa över tid från förbrukningsvaror.", - "buff.title.campfire_heal": "Helande lägereld", - "buff.desc.campfire_heal": "Att vila vid en lägereld helar {rate}% per sekund.", - "buff.title.invulnerability": "Osårbarhet", - "buff.desc.invulnerability": "Du kan inte skadas av någon attack.", - "buff.title.protectingward": "Skyddsbesvärjelse", - "buff.desc.protectingward": "Du skyddas, någorlunda, från attacker.", - "buff.title.frenzied": "Rasande", - "buff.desc.frenzied": "Du är uppfylld av en onaturlig hastighet och kan ignorera mindre skador.", - // Debuffs - "buff.title.bleed": "Blödande", - "buff.desc.bleed": "Orsakar vanlig skada.", - "buff.title.cursed": "Förbannad", - "buff.desc.cursed": "En förbannelse har uttalats över dig.", - "buff.title.burn": "I lågor", - "buff.desc.burn": "Du är eld och lågor", - "buff.title.crippled": "Halt", - "buff.desc.crippled": "Din rörlighet hindras eftersom dina ben är allvarligt skadade.", - "buff.title.frozen": "Frusen", - "buff.desc.frozen": "Din rörlighet och attacker går långsammare.", - "buff.title.wet": "Blöt", - "buff.desc.wet": "Marken skyr dina fötter, vilket gör det svårt att stanna.", - "buff.title.ensnared": "Intrasslad", - "buff.desc.ensnared": "Rankor greppar tag i dina ben vilket begränsar dina rörelser.", - // Buffs stats - "buff.stat.health": "Återger {str_total} hälsa", - "buff.stat.increase_max_energy": "Ökar den maximala uthålligheten med {strength}", - "buff.stat.increase_max_health": "Ökar den maximala hälsan med {strength}", - "buff.stat.invulnerability": "Ger osårbarhet", - // Text - "buff.text.over_seconds": "under {dur_secs} sekunder", - "buff.text.for_seconds": "i {dur_secs} sekunder", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/char_selection.ftl b/assets/voxygen/i18n/sv_SE/char_selection.ftl new file mode 100644 index 0000000000..6e1e52550a --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Laddar rollpersoner … +char_selection-delete_permanently = Vill du radera rollpersonen permanent? +char_selection-deleting_character = Raderar rollperson … +char_selection-change_server = Byt server +char_selection-enter_world = Öppna värld +char_selection-logout = Logga ut +char_selection-create_new_character = Skapa ny rollperson +char_selection-creating_character = Skapar rollperson … +char_selection-character_creation = Skapa rollperson +char_selection-human_default = Människa (standard) +char_selection-level_fmt = Nivå { $level_nb } +char_selection-uncanny_valley = Vildmark +char_selection-plains_of_uncertainty = Osäkerhetens slättmark +char_selection-beard = Skägg +char_selection-hair_style = Hårstil +char_selection-hair_color = Hårfärg +char_selection-eye_color = Ögonfärg +char_selection-skin = Hud +char_selection-eyeshape = Ögondetaljer +char_selection-accessories = Utsmyckningar +char_selection-create_info_name = Din rollperson behöver ett namn! +char_selection-version_mismatch = VARNING! Den här servern kör en annan version av spelet, vilket skulle kunna orsaka fel. Uppdatera gärna ditt spel. \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/char_selection.ron b/assets/voxygen/i18n/sv_SE/char_selection.ron deleted file mode 100644 index 8b66f4c56a..0000000000 --- a/assets/voxygen/i18n/sv_SE/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "char_selection.loading_characters": "Laddar rollpersoner …", - "char_selection.delete_permanently": "Vill du radera rollpersonen permanent?", - "char_selection.deleting_character": "Raderar rollperson …", - "char_selection.change_server": "Byt server", - "char_selection.enter_world": "Öppna värld", - "char_selection.logout": "Logga ut", - "char_selection.create_new_character": "Skapa ny rollperson", - "char_selection.creating_character": "Skapar rollperson …", - "char_selection.character_creation": "Skapa rollperson", - "char_selection.human_default": "Människa (standard)", - "char_selection.level_fmt": "Nivå {level_nb}", - "char_selection.uncanny_valley": "Vildmark", - "char_selection.plains_of_uncertainty": "Osäkerhetens slättmark", - "char_selection.beard": "Skägg", - "char_selection.hair_style": "Hårstil", - "char_selection.hair_color": "Hårfärg", - "char_selection.eye_color": "Ögonfärg", - "char_selection.skin": "Hud", - "char_selection.eyeshape": "Ögondetaljer", - "char_selection.accessories": "Utsmyckningar", - "char_selection.create_info_name": "Din rollperson behöver ett namn!", - "char_selection.version_mismatch": "VARNING! Den här servern kör en annan version av spelet, vilket skulle kunna orsaka fel. Uppdatera gärna ditt spel.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/common.ftl b/assets/voxygen/i18n/sv_SE/common.ftl new file mode 100644 index 0000000000..40327740ff --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/common.ftl @@ -0,0 +1,104 @@ +common-username = användarnamn +common-singleplayer = En spelare +common-multiplayer = Flera spelare +common-servers = Servrar +common-quit = Avsluta +common-settings = Inställningar +common-languages = Språk +common-interface = Gränssnitt +common-gameplay = Spelande +common-controls = Kontroller +common-video = Grafik +common-sound = Ljud +common-chat = Chatt +common-resume = Återgå +common-characters = Rollpersoner +common-close = Stäng +common-yes = Ja +common-no = Nej +common-back = Tillbaka +common-create = Skapa +common-okay = OK +common-add = Lägg till +common-accept = Acceptera +common-decline = Avböj +common-disclaimer = Varning +common-cancel = Avbryt +common-none = Ingen +common-error = Fel +common-fatal_error = Allvarligt fel +common-you = Du +common-automatic = Auto +common-random = Slump +common-empty = Tomt +common-confirm = Bekräfta +common-delete_server = Radera Server +common-interface_settings = Gränssnittsinställningar +common-gameplay_settings = Spelinställningar +common-controls_settings = Kontrollinställningar +common-video_settings = Grafikinställningar +common-sound_settings = Ljudinställningar +common-language_settings = Språkinställningar +common-chat_settings = Chattinställningar +common-connection_lost = + Anslutningen förlorades! + Startade servern om? + Är klienten uppdaterad? +common-species-orc = Orch +common-species-human = Människa +common-species-dwarf = Dvärg +common-species-elf = Alv +common-species-draugr = Odöd +common-species-danari = Danari +common-weapons-axe = Yxa +common-weapons-dagger = Dolk +common-weapons-greatsword = Stort svärd +common-weapons-shortswords = Korta svärd +common-weapons-sword = Svärd +common-weapons-staff = Eldstav +common-weapons-bow = Pilbåge +common-weapons-hammer = Hammare +common-weapons-general = Allmän strid +common-weapons-sceptre = Helande spira +common-weapons-shield = Sköld +common-weapons-spear = Spjut +common-weapons-hammer_simple = Enkel hammare +common-weapons-sword_simple = Enkelt svärd +common-weapons-staff_simple = Enkel stav +common-weapons-axe_simple = Enkel yxa +common-weapons-bow_simple = Enkel båge +common-weapons-unique = Unik +common-tool-debug = Felsökning +common-tool-farming = Jordbruksredskap +common-tool-pick = Hacka +common-tool-mining = Gruvgrävande +common-kind-modular_component = Modulär komponent +common-kind-glider = Glidare +common-kind-consumable = Förbrukningsvara +common-kind-throwable = Kan kastas +common-kind-utility = Hjälpmedel +common-kind-ingredient = Ingrediens +common-kind-lantern = Lykta +common-hands-one = Enhänt +common-hands-two = Tvåhänt +common-rand_appearance = Slumpmässigt utseende +common-rand_name = Slumpmässigt namn +common-stats-combat_rating = Stridsduglighet +common-stats-power = Kraft +common-stats-speed = Hastighet +common-stats-poise = Allmäntillstånd +common-stats-crit_chance = Kritisk chans +common-stats-crit_mult = Kritisk multi +common-stats-armor = Rustning +common-stats-poise_res = Motståndskraft +common-stats-energy_max = Max Energi +common-stats-energy_reward = Energibelöning +common-stats-crit_power = Kritisk Kraft +common-stats-stealth = Smygning +common-stats-slots = Packningutrymme +common-material-metal = Metall +common-material-wood = Trä +common-material-stone = Sten +common-material-cloth = Tyg +common-material-hide = Skinn +common-sprite-chest = Kista \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/common.ron b/assets/voxygen/i18n/sv_SE/common.ron deleted file mode 100644 index 44520bcefc..0000000000 --- a/assets/voxygen/i18n/sv_SE/common.ron +++ /dev/null @@ -1,126 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "användarnamn", - "common.singleplayer": "En spelare", - "common.multiplayer": "Flera spelare", - "common.servers": "Servrar", - "common.quit": "Avsluta", - "common.settings": "Inställningar", - "common.languages": "Språk", - "common.interface": "Gränssnitt", - "common.gameplay": "Spelande", - "common.controls": "Kontroller", - "common.video": "Grafik", - "common.sound": "Ljud", - "common.chat": "Chatt", - "common.resume": "Återgå", - "common.characters": "Rollpersoner", - "common.close": "Stäng", - "common.yes": "Ja", - "common.no": "Nej", - "common.back": "Tillbaka", - "common.create": "Skapa", - "common.okay": "OK", - "common.add": "Lägg till", - "common.accept": "Acceptera", - "common.decline": "Avböj", - "common.disclaimer": "Varning", - "common.cancel": "Avbryt", - "common.none": "Ingen", - "common.error": "Fel", - "common.fatal_error": "Allvarligt fel", - "common.you": "Du", - "common.automatic": "Auto", - "common.random": "Slump", - "common.empty": "Tomt", - "common.confirm": "Bekräfta", - "common.delete_server": "Radera Server", - - // Settings Window title - "common.interface_settings": "Gränssnittsinställningar", - "common.gameplay_settings": "Spelinställningar", - "common.controls_settings": "Kontrollinställningar", - "common.video_settings": "Grafikinställningar", - "common.sound_settings": "Ljudinställningar", - "common.language_settings": "Språkinställningar", - "common.chat_settings": "Chattinställningar", - - // Message when connection to the server is lost - "common.connection_lost": r#"Anslutningen förlorades! -Startade servern om? -Är klienten uppdaterad?"#, - - - "common.species.orc": "Orch", // orc --> orch - "common.species.human": "Människa", - "common.species.dwarf": "Dvärg", - "common.species.elf": "Alv", - "common.species.draugr": "Odöd", - "common.species.danari": "Danari", - - "common.weapons.axe": "Yxa", - "common.weapons.dagger": "Dolk", - "common.weapons.greatsword": "Stort svärd", - "common.weapons.shortswords": "Korta svärd", - "common.weapons.sword": "Svärd", - "common.weapons.staff": "Eldstav", - "common.weapons.bow": "Pilbåge", - "common.weapons.hammer": "Hammare", - "common.weapons.general": "Allmän strid", - "common.weapons.sceptre": "Helande spira", - "common.weapons.shield": "Sköld", - "common.weapons.spear": "Spjut", - "common.weapons.hammer_simple": "Enkel hammare", - "common.weapons.sword_simple": "Enkelt svärd", - "common.weapons.staff_simple": "Enkel stav", - "common.weapons.axe_simple": "Enkel yxa", - "common.weapons.bow_simple": "Enkel båge", - "common.weapons.unique": "Unik", - "common.tool.debug": "Felsökning", - "common.tool.farming": "Jordbruksredskap", - "common.tool.pick": "Hacka", - "common.tool.mining": "Gruvgrävande", - "common.kind.modular_component": "Modulär komponent", - "common.kind.glider": "Glidare", - "common.kind.consumable": "Förbrukningsvara", - "common.kind.throwable": "Kan kastas", - "common.kind.utility": "Hjälpmedel", - "common.kind.ingredient": "Ingrediens", - "common.kind.lantern": "Lykta", - "common.hands.one": "Enhänt", - "common.hands.two": "Tvåhänt", - - "common.rand_appearance": "Slumpmässigt utseende", - "common.rand_name": "Slumpmässigt namn", - - "common.stats.combat_rating": "Stridsduglighet", // combat rating --> stridsduglighet - "common.stats.power": "Kraft", - "common.stats.speed": "Hastighet", - "common.stats.poise": "Allmäntillstånd", - "common.stats.crit_chance": "Kritisk chans", - "common.stats.crit_mult": "Kritisk multi", - "common.stats.armor": "Rustning", - "common.stats.poise_res":"Motståndskraft", - "common.stats.energy_max": "Max Energi", - "common.stats.energy_reward": "Energibelöning", - "common.stats.crit_power": "Kritisk Kraft", - "common.stats.stealth": "Smygning", - "common.stats.slots": "Packningutrymme", - - "common.material.metal": "Metall", - "common.material.wood": "Trä", - "common.material.stone": "Sten", - "common.material.cloth": "Tyg", - "common.material.hide": "Skinn", - - "common.sprite.chest": "Kista", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/esc_menu.ftl b/assets/voxygen/i18n/sv_SE/esc_menu.ftl new file mode 100644 index 0000000000..e25abe0ebf --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Logga ut +esc_menu-quit_game = Avsluta spel \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/esc_menu.ron b/assets/voxygen/i18n/sv_SE/esc_menu.ron deleted file mode 100644 index 1df259dba0..0000000000 --- a/assets/voxygen/i18n/sv_SE/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "esc_menu.logout": "Logga ut", - "esc_menu.quit_game": "Avsluta spel", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/gameinput.ftl b/assets/voxygen/i18n/sv_SE/gameinput.ftl new file mode 100644 index 0000000000..ebd4910f36 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Grundläggande attack +gameinput-secondary = Sekondär attack +gameinput-block = Parera +gameinput-slot1 = Snabbåtkomst ruta 1 +gameinput-slot2 = Snabbåtkomst ruta 2 +gameinput-slot3 = Snabbåtkomst ruta 3 +gameinput-slot4 = Snabbåtkomst ruta 4 +gameinput-slot5 = Snabbåtkomst ruta 5 +gameinput-slot6 = Snabbåtkomst ruta 6 +gameinput-slot7 = Snabbåtkomst ruta 7 +gameinput-slot8 = Snabbåtkomst ruta 8 +gameinput-slot9 = Snabbåtkomst ruta 9 +gameinput-slot10 = Snabbåtkomst ruta 10 +gameinput-swaploadout = Byt utrustning +gameinput-togglecursor = Visa/dölj mus +gameinput-help = Visa/dölj hjälpfönster +gameinput-toggleinterface = Visa/dölj gränssnitt +gameinput-toggledebug = Visa/dölj BPS felsökningsinformation +gameinput-toggle_egui_debug = Visa/dölj EGUI felsökningsinformation +gameinput-togglechat = Visa/dölj Chatt +gameinput-screenshot = Ta skärmdump +gameinput-toggleingameui = Visa/dölj namnskyltar +gameinput-fullscreen = Fullskärm +gameinput-moveforward = Gå framåt +gameinput-moveleft = Gå åt vänster +gameinput-moveright = Gå åt höger +gameinput-moveback = Gå bakåt +gameinput-jump = Hoppa +gameinput-glide = Glidare +gameinput-roll = Hoppa undan +gameinput-climb = Klättra +gameinput-climbdown = Klättra neråt +gameinput-wallleap = Hoppa från vägg +gameinput-togglelantern = Lykta +gameinput-mount = Sitt upp +gameinput-chat = Prata +gameinput-command = Kommando +gameinput-escape = Avbryt +gameinput-map = Karta +gameinput-bag = Säck +gameinput-trade = Köpslå +gameinput-social = Socialt +gameinput-sit = Sitt +gameinput-spellbook = Trollformler +gameinput-settings = Inställningar +gameinput-respawn = Starta om +gameinput-charge = Anfall +gameinput-togglewield = Byt draget vapen +gameinput-interact = Interagera +gameinput-freelook = Frigör kamera +gameinput-autowalk = Gå eller simma automatiskt +gameinput-cameraclamp = Lås kamera +gameinput-dance = Dansa +gameinput-select = Välj entitet +gameinput-acceptgroupinvite = Acceptera gruppinbjudan +gameinput-declinegroupinvite = Avböj gruppinbjudan +gameinput-cyclecamera = Byt kamera +gameinput-crafting = Tillverkning +gameinput-fly = Flyg +gameinput-sneak = Smyg +gameinput-swimdown = Dyk neråt +gameinput-swimup = Dyk neråt +gameinput-mapzoomin = Förstora kartan +gameinput-mapzoomout = Förminska kartan +gameinput-greet = Hälsa +gameinput-map-locationmarkerbutton = Placera en markör på kartan \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/gameinput.ron b/assets/voxygen/i18n/sv_SE/gameinput.ron deleted file mode 100644 index 588034c6b6..0000000000 --- a/assets/voxygen/i18n/sv_SE/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "gameinput.primary": "Grundläggande attack", - "gameinput.secondary": "Sekondär attack", - "gameinput.block": "Parera", - "gameinput.slot1": "Snabbåtkomst ruta 1", - "gameinput.slot2": "Snabbåtkomst ruta 2", - "gameinput.slot3": "Snabbåtkomst ruta 3", - "gameinput.slot4": "Snabbåtkomst ruta 4", - "gameinput.slot5": "Snabbåtkomst ruta 5", - "gameinput.slot6": "Snabbåtkomst ruta 6", - "gameinput.slot7": "Snabbåtkomst ruta 7", - "gameinput.slot8": "Snabbåtkomst ruta 8", - "gameinput.slot9": "Snabbåtkomst ruta 9", - "gameinput.slot10": "Snabbåtkomst ruta 10", - "gameinput.swaploadout": "Byt utrustning", - "gameinput.togglecursor": "Visa/dölj mus", - "gameinput.help": "Visa/dölj hjälpfönster", - "gameinput.toggleinterface": "Visa/dölj gränssnitt", - "gameinput.toggledebug": "Visa/dölj BPS felsökningsinformation", - "gameinput.toggle_egui_debug": "Visa/dölj EGUI felsökningsinformation", - "gameinput.togglechat": "Visa/dölj Chatt", - "gameinput.screenshot": "Ta skärmdump", - "gameinput.toggleingameui": "Visa/dölj namnskyltar", - "gameinput.fullscreen": "Fullskärm", - "gameinput.moveforward": "Gå framåt", - "gameinput.moveleft": "Gå åt vänster", - "gameinput.moveright": "Gå åt höger", - "gameinput.moveback": "Gå bakåt", - "gameinput.jump": "Hoppa", - "gameinput.glide": "Glidare", - "gameinput.roll": "Hoppa undan", - "gameinput.climb": "Klättra", - "gameinput.climbdown": "Klättra neråt", - "gameinput.wallleap": "Hoppa från vägg", - "gameinput.togglelantern": "Lykta", - "gameinput.mount": "Sitt upp", - "gameinput.chat": "Prata", - "gameinput.command": "Kommando", - "gameinput.escape": "Avbryt", - "gameinput.map": "Karta", - "gameinput.bag": "Säck", - "gameinput.trade": "Köpslå", - "gameinput.social": "Socialt", - "gameinput.sit": "Sitt", - "gameinput.spellbook": "Trollformler", - "gameinput.settings": "Inställningar", - "gameinput.respawn": "Starta om", - "gameinput.charge": "Anfall", - "gameinput.togglewield": "Byt draget vapen", - "gameinput.interact": "Interagera", - "gameinput.freelook": "Frigör kamera", - "gameinput.autowalk": "Gå eller simma automatiskt", - "gameinput.cameraclamp": "Lås kamera", - "gameinput.dance": "Dansa", - "gameinput.select": "Välj entitet", - "gameinput.acceptgroupinvite": "Acceptera gruppinbjudan", - "gameinput.declinegroupinvite": "Avböj gruppinbjudan", - "gameinput.cyclecamera": "Byt kamera", - "gameinput.crafting": "Tillverkning", - "gameinput.fly": "Flyg", - "gameinput.sneak": "Smyg", - "gameinput.swimdown": "Dyk neråt", - "gameinput.swimup": "Dyk neråt", - "gameinput.mapzoomin": "Förstora kartan", - "gameinput.mapzoomout": "Förminska kartan", - "gameinput.greet": "Hälsa", - "gameinput.map.locationmarkerbutton": "Placera en markör på kartan" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/bag.ftl b/assets/voxygen/i18n/sv_SE/hud/bag.ftl new file mode 100644 index 0000000000..e36d1f7768 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = { $playername }s packning +hud-bag-stats_title = Statistik för { $playername } +hud-bag-exp = EP +hud-bag-armor = Rustning +hud-bag-stats = Statistik +hud-bag-head = Huvud +hud-bag-neck = Hals +hud-bag-tabard = Tappert +hud-bag-shoulders = Axlar +hud-bag-chest = Bröst +hud-bag-hands = Händer +hud-bag-lantern = Lykta +hud-bag-glider = Glidare +hud-bag-belt = Bälte +hud-bag-ring = Ring +hud-bag-back = Rygg +hud-bag-legs = Ben +hud-bag-feet = Fötter +hud-bag-mainhand = Förstahand +hud-bag-offhand = Andrahand +hud-bag-inactive_mainhand = Inaktiv förstahand +hud-bag-inactive_offhand = Inaktiv andrahand +hud-bag-swap_equipped_weapons_title = Byt plats på dragna vapen +hud-bag-swap_equipped_weapons_desc = Tryck { $key } +hud-bag-bag = Säck +hud-bag-health = Hälsa +hud-bag-energy = Energi +hud-bag-combat_rating = Stridsduglighet +hud-bag-protection = Skydd +hud-bag-stun_res = Motståndskraft mot att bli överväldigad +hud-bag-combat_rating_desc = + Beräknas från din + utrustning och hälsa. +hud-bag-protection_desc = Skadebegränsning från rustning +hud-bag-stun_res_desc = + Motståndskraft mot att bli överväldigad efter upprepade slag. + Regenereras likt energi. +hud-bag-sort_by_name = Sortera efter Namn +hud-bag-sort_by_quality = Sortera efter Kvalitet +hud-bag-sort_by_category = Sortera efter Kategori \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/bag.ron b/assets/voxygen/i18n/sv_SE/hud/bag.ron deleted file mode 100644 index 6e738e66ec..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}s packning", - "hud.bag.stats_title": "Statistik för {playername}", - "hud.bag.exp": "EP", - "hud.bag.armor": "Rustning", - "hud.bag.stats": "Statistik", - "hud.bag.head": "Huvud", - "hud.bag.neck": "Hals", - "hud.bag.tabard": "Tappert", - "hud.bag.shoulders": "Axlar", - "hud.bag.chest": "Bröst", - "hud.bag.hands": "Händer", - "hud.bag.lantern": "Lykta", - "hud.bag.glider": "Glidare", - "hud.bag.belt": "Bälte", - "hud.bag.ring": "Ring", - "hud.bag.back": "Rygg", - "hud.bag.legs": "Ben", - "hud.bag.feet": "Fötter", - "hud.bag.mainhand": "Förstahand", - "hud.bag.offhand": "Andrahand", - "hud.bag.inactive_mainhand": "Inaktiv förstahand", - "hud.bag.inactive_offhand": "Inaktiv andrahand", - "hud.bag.swap_equipped_weapons_title": "Byt plats på dragna vapen", - "hud.bag.swap_equipped_weapons_desc": "Tryck {key}", - "hud.bag.bag": "Säck", - "hud.bag.health": "Hälsa", - "hud.bag.energy": "Energi", - "hud.bag.combat_rating": "Stridsduglighet", - "hud.bag.protection": "Skydd", - "hud.bag.stun_res": "Motståndskraft mot att bli överväldigad", - "hud.bag.combat_rating_desc": "Beräknas från din\nutrustning och hälsa.", - "hud.bag.protection_desc": "Skadebegränsning från rustning", - "hud.bag.stun_res_desc": "Motståndskraft mot att bli överväldigad efter upprepade slag.\nRegenereras likt energi.", - "hud.bag.sort_by_name": "Sortera efter Namn", - "hud.bag.sort_by_quality": "Sortera efter Kvalitet", - "hud.bag.sort_by_category": "Sortera efter Kategori", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/char_window.ftl b/assets/voxygen/i18n/sv_SE/hud/char_window.ftl new file mode 100644 index 0000000000..a088aa6fd5 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Rollpersonens namn +character_window-character_stats = + Uthållighet + + Kondition + + Viljekraft + + Skydd \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/char_window.ron b/assets/voxygen/i18n/sv_SE/hud/char_window.ron deleted file mode 100644 index e2df5c7bef..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "character_window.character_name": "Rollpersonens namn", - // Character stats - "character_window.character_stats": r#"Uthållighet - -Kondition - -Viljekraft - -Skydd -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/chat.ftl b/assets/voxygen/i18n/sv_SE/hud/chat.ftl new file mode 100644 index 0000000000..eef280dac7 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Alla +hud-chat-chat_tab_hover_tooltip = Högerklicka för inställningar +hud-outcome-burning = dödsorsak: eld +hud-outcome-curse = dödsorsak: trolldom +hud-outcome-bleeding = dödsorsak: blodförlust +hud-outcome-crippled = dödsorsak: allvarliga skador +hud-outcome-frozen = dödsorsak: förfrysning +hud-chat-online_msg = [{ $name }] är inloggad nu +hud-chat-offline_msg = [{ $name }] loggade ut +hud-chat-default_death_msg = [{ $name }] dog +hud-chat-environmental_kill_msg = [{ $name }] dog i { $environment } +hud-chat-fall_kill_msg = [{ $name }] föll till sin död +hud-chat-suicide_msg = [{ $name }] dog av självförvållade skador +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } orsakad av [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] besegrade [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] sköt [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] sprängde [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] dödade [{ $victim }] med trolldom +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } orsakad av { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } dödade [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } sköt [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } sprängde [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } dödade [{ $victim }] med trolldom +hud-chat-npc_other_kill_msg = { $attacker } dödade [{ $victim }] +hud-chat-loot_msg = Du plockade upp [{ $item }] +hud-chat-loot_fail = Din packning är full! +hud-chat-goodbye = Hejdå! +hud-chat-connection_lost = Anslutningen bröts. Sparkas ut om { $time } sekunder. \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/chat.ron b/assets/voxygen/i18n/sv_SE/hud/chat.ron deleted file mode 100644 index 288a5b336a..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.chat.all": "Alla", - "hud.chat.chat_tab_hover_tooltip": "Högerklicka för inställningar", - - // Debuff outcomes - "hud.outcome.burning": "dödsorsak: eld", - "hud.outcome.curse": "dödsorsak: trolldom", - "hud.outcome.bleeding": "dödsorsak: blodförlust", - "hud.outcome.crippled": "dödsorsak: allvarliga skador", - "hud.outcome.frozen": "dödsorsak: förfrysning", - - // Chat outputs - "hud.chat.online_msg": "[{name}] är inloggad nu", - "hud.chat.offline_msg": "[{name}] loggade ut", - - "hud.chat.default_death_msg": "[{name}] dog", - "hud.chat.environmental_kill_msg": "[{name}] dog i {environment}", - "hud.chat.fall_kill_msg": "[{name}] föll till sin död", - "hud.chat.suicide_msg": "[{name}] dog av självförvållade skador", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} orsakad av [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] besegrade [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] sköt [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] sprängde [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] dödade [{victim}] med trolldom", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} orsakad av {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} dödade [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} sköt [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} sprängde [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} dödade [{victim}] med trolldom", - "hud.chat.npc_other_kill_msg": "{attacker} dödade [{victim}]", - - "hud.chat.loot_msg": "Du plockade upp [{item}]", - "hud.chat.loot_fail": "Din packning är full!", - "hud.chat.goodbye": "Hejdå!", - "hud.chat.connection_lost": "Anslutningen bröts. Sparkas ut om {time} sekunder.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/crafting.ftl b/assets/voxygen/i18n/sv_SE/hud/crafting.ftl new file mode 100644 index 0000000000..4b9f9691ce --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/crafting.ftl @@ -0,0 +1,33 @@ +hud-crafting = Tillverkning +hud-crafting-recipes = Recept +hud-crafting-ingredients = Ingredienser: +hud-crafting-craft = Tillverka +hud-crafting-tool_cata = Kräver: +hud-crafting-req_crafting_station = Kräver: +hud-crafting-anvil = Städ +hud-crafting-cauldron = Kittel +hud-crafting-cooking_pot = Kokkärl +hud-crafting-crafting_bench = Arbetsbänk +hud-crafting-forge = Smedja +hud-crafting-loom = Vävstol +hud-crafting-spinning_wheel = Spinnrock +hud-crafting-tanning_rack = Garvningsställning +hud-crafting-salvaging_station = Återvinningsbord +hud-crafting-campfire = Lägereld +hud-crafting-tabs-all = Allt +hud-crafting-tabs-armor = Rustning +hud-crafting-tabs-dismantle = Plocka sönder +hud-crafting-tabs-food = Mat +hud-crafting-tabs-glider = Glidare +hud-crafting-tabs-potion = Trolldrycker +hud-crafting-tabs-tool = Verktyg +hud-crafting-tabs-utility = Redskap +hud-crafting-tabs-weapon = Vapen +hud-crafting-tabs-bag = Säckar +hud-crafting-tabs-processed_material = Material +hud-crafting-dismantle_title = Demontering +hud-crafting-dismantle_explanation = + Håll pekaren över föremål i din väska för att se vad + du kan återvinna. + + Dubbelklicka dem för att börja demontera. \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/crafting.ron b/assets/voxygen/i18n/sv_SE/hud/crafting.ron deleted file mode 100644 index 3b0d2ca2c0..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/crafting.ron +++ /dev/null @@ -1,42 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.crafting": "Tillverkning", - "hud.crafting.recipes": "Recept", - "hud.crafting.ingredients": "Ingredienser:", - "hud.crafting.craft": "Tillverka", - "hud.crafting.tool_cata": "Kräver:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Kräver:", - "hud.crafting.anvil": "Städ", - "hud.crafting.cauldron": "Kittel", - "hud.crafting.cooking_pot": "Kokkärl", - "hud.crafting.crafting_bench": "Arbetsbänk", - "hud.crafting.forge": "Smedja", - "hud.crafting.loom": "Vävstol", - "hud.crafting.spinning_wheel": "Spinnrock", - "hud.crafting.tanning_rack": "Garvningsställning", - "hud.crafting.salvaging_station": "Återvinningsbord", - "hud.crafting.campfire": "Lägereld", - // Tabs - "hud.crafting.tabs.all": "Allt", - "hud.crafting.tabs.armor": "Rustning", - "hud.crafting.tabs.dismantle": "Plocka sönder", - "hud.crafting.tabs.food": "Mat", - "hud.crafting.tabs.glider": "Glidare", - "hud.crafting.tabs.potion": "Trolldrycker", - "hud.crafting.tabs.tool": "Verktyg", - "hud.crafting.tabs.utility": "Redskap", - "hud.crafting.tabs.weapon": "Vapen", - "hud.crafting.tabs.bag": "Säckar", - "hud.crafting.tabs.processed_material": "Material", - "hud.crafting.dismantle_title": "Demontering", - "hud.crafting.dismantle_explanation" : "Håll pekaren över föremål i din väska för att se vad\ndu kan återvinna.\n\nDubbelklicka dem för att börja demontera.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/group.ftl b/assets/voxygen/i18n/sv_SE/hud/group.ftl new file mode 100644 index 0000000000..2186130cb2 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grupp +hud-group-invite_to_join = [{ $name }] bjöd in dig till sin grupp! +hud-group-invite_to_trade = [{ $name }] skulle vilja köpslå med dig. +hud-group-invite = Bjud in +hud-group-kick = Sparka ut +hud-group-assign_leader = Utse ledare +hud-group-leave = Lämna grupp +hud-group-dead = Död +hud-group-out_of_range = Utom räckhåll +hud-group-add_friend = Lägg tills om vän +hud-group-link_group = Koppla grupper +hud-group-in_menu = I meny +hud-group-members = Gruppmedlemmar \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/group.ron b/assets/voxygen/i18n/sv_SE/hud/group.ron deleted file mode 100644 index aeb5dd73a5..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.group": "Grupp", - "hud.group.invite_to_join": "[{name}] bjöd in dig till sin grupp!", - "hud.group.invite_to_trade": "[{name}] skulle vilja köpslå med dig.", - "hud.group.invite": "Bjud in", - "hud.group.kick": "Sparka ut", - "hud.group.assign_leader": "Utse ledare", - "hud.group.leave": "Lämna grupp", - "hud.group.dead" : "Död", - "hud.group.out_of_range": "Utom räckhåll", - "hud.group.add_friend": "Lägg tills om vän", - "hud.group.link_group": "Koppla grupper", - "hud.group.in_menu": "I meny", - "hud.group.members": "Gruppmedlemmar", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/map.ftl b/assets/voxygen/i18n/sv_SE/hud/map.ftl new file mode 100644 index 0000000000..6dafeea638 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/map.ftl @@ -0,0 +1,32 @@ +hud-map-map_title = Karta +hud-map-qlog_title = Uppdrag +hud-map-topo_map = Topografisk +hud-map-difficulty = Svårighet +hud-map-towns = Samhällen +hud-map-castles = Borgar +hud-map-dungeons = Dungeons +hud-map-caves = Grottor +hud-map-cave = Grotta +hud-map-peaks = Berg +hud-map-biomes = Biomer +hud-map-voxel_map = Voxelkarta +hud-map-trees = Jätteträd +hud-map-tree = Jätteträd +hud-map-town = Samhälle +hud-map-castle = Borg +hud-map-dungeon = Dungeon +hud-map-difficulty_dungeon = + Dungeon + + Svårighet: { $difficulty } +hud-map-drag = Drag +hud-map-zoom = Zooma +hud-map-mid_click = Markera landmärke +hud-map-recenter = Omcentrera +hud-map-marked_location = Markerad Plats +hud-map-marked_location_remove = Klicka för att ta bort +hud-map-change_map_mode = Ändra kartläge +hud-map-toggle_minimap_voxel = Växla Minikartans Voxelvy +hud-map-zoom_minimap_explanation = + Zooma in Minikartan för att se + området runtom dig i högre detalj \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/map.ron b/assets/voxygen/i18n/sv_SE/hud/map.ron deleted file mode 100644 index ec590b5dd9..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/map.ron +++ /dev/null @@ -1,39 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Karta", - "hud.map.qlog_title": "Uppdrag", - "hud.map.topo_map": "Topografisk", - "hud.map.difficulty": "Svårighet", - "hud.map.towns": "Samhällen", - "hud.map.castles": "Borgar", - "hud.map.dungeons": "Dungeons", - "hud.map.caves": "Grottor", - "hud.map.cave": "Grotta", - "hud.map.peaks": "Berg", - "hud.map.biomes": "Biomer", - "hud.map.voxel_map": "Voxelkarta", - "hud.map.trees": "Jätteträd", - "hud.map.tree": "Jätteträd", - "hud.map.town": "Samhälle", - "hud.map.castle": "Borg", - "hud.map.dungeon": "Dungeon", - "hud.map.difficulty_dungeon": "Dungeon\n\nSvårighet: {difficulty}", - "hud.map.drag": "Drag", - "hud.map.zoom": "Zooma", - "hud.map.mid_click": "Markera landmärke", - "hud.map.recenter": "Omcentrera", - "hud.map.marked_location": "Markerad Plats", - "hud.map.marked_location_remove": "Klicka för att ta bort", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.map.change_map_mode": "Ändra kartläge", - "hud.map.toggle_minimap_voxel": "Växla Minikartans Voxelvy", - "hud.map.zoom_minimap_explanation": "Zooma in Minikartan för att se\nområdet runtom dig i högre detalj", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/misc.ftl b/assets/voxygen/i18n/sv_SE/hud/misc.ftl new file mode 100644 index 0000000000..72c434aa3d --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = Visa inte detta vid uppstart +hud-show_tips = Visa tips +hud-quests = Uppdrag +hud-you_died = Du dog +hud-waypoint_saved = Landmärke sparat +hud-sp_arrow_txt = FP +hud-inventory_full = Full packning +hud-press_key_to_show_keybindings_fmt = [{ $key }] tangentbordsgenvägar +hud-press_key_to_toggle_lantern_fmt = [{ $key }] lykta +hud-press_key_to_show_debug_info_fmt = Tryck { $key } för att vids felsökningsinformation +hud-press_key_to_toggle_keybindings_fmt = Tryck { $key } för att visa/dölja genvägar +hud-press_key_to_toggle_debug_info_fmt = Tryck { $key } att visa/dölja felsökningsinformation +hud-press_key_to_respawn = Tryck { $key } för att gå tillbaka till lägereld du besökte senast. +hud-tutorial_btn = Instruktioner +hud-tutorial_click_here = Tryck [ { $key } ] för att frigöra din muspekare och klicka på den här knappen! +hud-tutorial_elements = Tillverkning +hud-temp_quest_headline = Var hälsad! +hud-temp_quest_text = + Du kan börja din färd med att utforska den här byn och samla ihop lite förnödenheter. + + Känn dig fri att ta med dig vad du kan tänkas behöva på dina äventyr! + + Titta längst ner på höger sida av din skärm för att se saker som din packning, tillverkningsmeny och karta. + + Tilllverkningsstationerna låter dig tillverka rustning, vapen, mat och mycket mer! + + De vilda djuren runtom hela byn är en bra källa till djurhudar för att tillverka något för att skydda mot farorna ute i världen. + + När du känner dig redo, försök skaffa bättre utrustning från de många utmaningarna som finns markerade på din karta! +hud-spell = Förtrollningar +hud-diary = Dagbok +hud-free_look_indicator = Kameran är olåst. Tryck { $key } för att ändra. +hud-camera_clamp_indicator = Kameran är låst vertikalt. Tryck { $key } För att ändra. +hud-auto_walk_indicator = Automatisk gång / simning aktiverad +hud-collect = Samla in +hud-pick_up = Plocka upp +hud-open = Öppna +hud-use = Använd +hud-mine = Hacka +hud-talk = Prata +hud-trade = Byt +hud-mount = Bestig +hud-sit = Sitt \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/misc.ron b/assets/voxygen/i18n/sv_SE/hud/misc.ron deleted file mode 100644 index 5f1bc828ac..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.do_not_show_on_startup": "Visa inte detta vid uppstart", - "hud.show_tips": "Visa tips", - "hud.quests": "Uppdrag", - "hud.you_died": "Du dog", - "hud.waypoint_saved": "Landmärke sparat", - "hud.sp_arrow_txt": "FP", - "hud.inventory_full": "Full packning", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] tangentbordsgenvägar", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] lykta", - "hud.press_key_to_show_debug_info_fmt": "Tryck {key} för att vids felsökningsinformation", - "hud.press_key_to_toggle_keybindings_fmt": "Tryck {key} för att visa/dölja genvägar", - "hud.press_key_to_toggle_debug_info_fmt": "Tryck {key} att visa/dölja felsökningsinformation", - - // Respawn message - "hud.press_key_to_respawn": r#"Tryck {key} för att gå tillbaka till lägereld du besökte senast."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Instruktioner"#, - "hud.tutorial_click_here": r#"Tryck [ {key} ] för att frigöra din muspekare och klicka på den här knappen!"#, - "hud.tutorial_elements": r#"Tillverkning"#, - -"hud.temp_quest_headline": r#"Var hälsad!"#, -"hud.temp_quest_text": r#"Du kan börja din färd med att utforska den här byn och samla ihop lite förnödenheter. - -Känn dig fri att ta med dig vad du kan tänkas behöva på dina äventyr! - -Titta längst ner på höger sida av din skärm för att se saker som din packning, tillverkningsmeny och karta. - -Tilllverkningsstationerna låter dig tillverka rustning, vapen, mat och mycket mer! - -De vilda djuren runtom hela byn är en bra källa till djurhudar för att tillverka något för att skydda mot farorna ute i världen. - -När du känner dig redo, försök skaffa bättre utrustning från de många utmaningarna som finns markerade på din karta! -"#, - - "hud.spell": "Förtrollningar", - // Diary - "hud.diary": "Dagbok", - - "hud.free_look_indicator": "Kameran är olåst. Tryck {key} för att ändra.", - "hud.camera_clamp_indicator": "Kameran är låst vertikalt. Tryck {key} För att ändra.", - "hud.auto_walk_indicator": "Automatisk gång / simning aktiverad", - "hud.collect": "Samla in", - "hud.pick_up": "Plocka upp", - "hud.open": "Öppna", - "hud.use": "Använd", - "hud.mine": "Hacka", - "hud.talk": "Prata", - "hud.trade": "Byt", - "hud.mount": "Bestig", - "hud.sit": "Sitt", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/sct.ftl b/assets/voxygen/i18n/sv_SE/hud/sct.ftl new file mode 100644 index 0000000000..9280f5e667 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } EP +hud-sct-block = BLOCKERAD \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/sct.ron b/assets/voxygen/i18n/sv_SE/hud/sct.ron deleted file mode 100644 index 182642586b..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} EP", - "hud.sct.block": "BLOCKERAD", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/settings.ftl b/assets/voxygen/i18n/sv_SE/hud/settings.ftl new file mode 100644 index 0000000000..87a1f00284 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/settings.ftl @@ -0,0 +1,122 @@ +hud-settings-general = Allmänt +hud-settings-none = Ingen +hud-settings-press_behavior-toggle = Slå av eller på +hud-settings-press_behavior-hold = Håll +hud-settings-help_window = Hjälpfönster +hud-settings-debug_info = Felsökningsinformation +hud-settings-show_hitboxes = Visa kollisionsgränser +hud-settings-show_chat = Visa chatt +hud-settings-show_hotkey_hints = Visa snabbtangentstips +hud-settings-tips_on_startup = Tips vid uppstart +hud-settings-ui_scale = Skalning av gränssnitt +hud-settings-relative_scaling = Relativ skalning +hud-settings-custom_scaling = Anpassad skalning +hud-settings-crosshair = Hårkors +hud-settings-opacity = Transparens +hud-settings-hotbar = Snabbåtkomst +hud-settings-toggle_shortcuts = Växla genvägar +hud-settings-buffs_skillbar = Effekter vid Förmågomätarna +hud-settings-buffs_mmap = Effekter vid Minikartan +hud-settings-toggle_bar_experience = Visa/dölj erfarenhetsmätare +hud-settings-scrolling_combat_text = Rullande stridstext +hud-settings-incoming_damage = Inkommande skada +hud-settings-speech_bubble = Pratbubbla +hud-settings-speech_bubble_self = Visa egna pratbubblor +hud-settings-speech_bubble_dark_mode = Pratbubbla mörkt läge +hud-settings-speech_bubble_icon = Pratbubbleikon +hud-settings-energybar_numbers = Energimätare med värden +hud-settings-always_show_bars = Visa alltid Energimätare +hud-settings-values = Värden +hud-settings-percentages = Procent +hud-settings-chat = Chatt +hud-settings-background_opacity = Bakgrundstransparens +hud-settings-chat_character_name = Karaktärsnamn i chatten +hud-settings-loading_tips = Tips på laddningsskärmen +hud-settings-reset_interface = Återställ till standard +hud-settings-pan_sensitivity = Panoreringskänslighet +hud-settings-zoom_sensitivity = Zoomkänslighet +hud-settings-camera_clamp_angle = Vinkel för kamera fastlåst i verikalt läge +hud-settings-invert_scroll_zoom = Invertera scrollhjulet för zoomning +hud-settings-invert_mouse_y_axis = Invertera musens Y-axel +hud-settings-invert_controller_y_axis = Invertera kontrollerns Y-axel +hud-settings-enable_mouse_smoothing = Mjuka kamerarörelser +hud-settings-free_look_behavior = Beteende för rörlig kamera +hud-settings-auto_walk_behavior = Beteende för automatisk gång +hud-settings-camera_clamp_behavior = Beteende för låst kamera +hud-settings-player_physics_behavior = Spelarfysik (experiment) +hud-settings-stop_auto_walk_on_input = Avsluta automatisk gång vid rörelse +hud-settings-auto_camera = Automatisk kamera +hud-settings-reset_gameplay = Återställ till standard +hud-settings-view_distance = Visningsavstånd +hud-settings-sprites_view_distance = Visningsavstånd för sprites +hud-settings-figures_view_distance = Visningsavstånd för entiteter +hud-settings-maximum_fps = Maximal bildhastighet +hud-settings-background_fps = Bakgrundsbildhastighet +hud-settings-present_mode = Presentationsläge +hud-settings-present_mode-fifo = Först in–först ut +hud-settings-present_mode-mailbox = Brevlåda +hud-settings-present_mode-immediate = Omedelbar +hud-settings-fov = Bildvinkel (grader) +hud-settings-gamma = Gamma +hud-settings-exposure = Exponering +hud-settings-ambiance = Omgivningens ljusstyrka +hud-settings-antialiasing_mode = AntiAliasing-läge +hud-settings-upscale_factor = Intern upplösning +hud-settings-cloud_rendering_mode = Molnrenderingsläge +hud-settings-fluid_rendering_mode = Vätskerenderingsläge +hud-settings-fluid_rendering_mode-cheap = Billig +hud-settings-fluid_rendering_mode-shiny = Blank +hud-settings-cloud_rendering_mode-minimal = Minimal +hud-settings-cloud_rendering_mode-low = Låg +hud-settings-cloud_rendering_mode-medium = Medium +hud-settings-cloud_rendering_mode-high = Hög +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Helskärm +hud-settings-fullscreen_mode = Helskärmsläge +hud-settings-fullscreen_mode-exclusive = Exklusivt +hud-settings-fullscreen_mode-borderless = Utan ram +hud-settings-gpu_profiler = Aktivera GPU-timing (stöds inte överallt) +hud-settings-particles = Partiklar +hud-settings-lossy_terrain_compression = Destruktiv komprimering av terräng +hud-settings-resolution = Upplösning +hud-settings-bit_depth = Bitdjup +hud-settings-refresh_rate = Uppdateringsfrekvens +hud-settings-lighting_rendering_mode = Återgivning av ljussättning +hud-settings-lighting_rendering_mode-ashikhmin = Typ A - Hög +hud-settings-lighting_rendering_mode-blinnphong = Typ B - Medium +hud-settings-lighting_rendering_mode-lambertian = Typ L - Billig +hud-settings-shadow_rendering_mode = Återgivning av skuggor +hud-settings-shadow_rendering_mode-none = Ingen +hud-settings-shadow_rendering_mode-cheap = Billig +hud-settings-shadow_rendering_mode-map = Mappad +hud-settings-shadow_rendering_mode-map-resolution = Upplösning +hud-settings-lod_detail = Detailjrikedom +hud-settings-save_window_size = Kom ihåg fönsterstorlek +hud-settings-reset_graphics = Återställ till standard +hud-settings-bloom = Bloom +hud-settings-point_glow = Punktssken +hud-settings-master_volume = Huvudvolym +hud-settings-inactive_master_volume_perc = Huvudvolym (inaktivt fönster) +hud-settings-music_volume = Musikvolym +hud-settings-sound_effect_volume = Ljudeffektsvolym +hud-settings-audio_device = Ljudenhet +hud-settings-reset_sound = Återställ till standard +hud-settings-english_fallback = Visa på engelska om översättning saknas +hud-settings-awaitingkey = Tryck på någon tangent … +hud-settings-unbound = Ingen +hud-settings-reset_keybinds = Återställ till standard +hud-settings-chat_tabs = Chattflikar +hud-settings-label = Etikett: +hud-settings-delete = Radera +hud-settings-show_all = Visa alla +hud-settings-messages = Meddelanden +hud-settings-activity = Aktivitet +hud-settings-death = Död +hud-settings-group = Grupp +hud-settings-faction = Fraktion +hud-settings-world = Värld +hud-settings-region = Region +hud-settings-say = Säg +hud-settings-all = Alla +hud-settings-group_only = Endast grupp +hud-settings-reset_chat = Återställ till standard \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/settings.ron b/assets/voxygen/i18n/sv_SE/hud/settings.ron deleted file mode 100644 index b81dcfa598..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/settings.ron +++ /dev/null @@ -1,140 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - // Settings - "hud.settings.general": "Allmänt", - "hud.settings.none": "Ingen", - "hud.settings.press_behavior.toggle": "Slå av eller på", - "hud.settings.press_behavior.hold": "Håll", - "hud.settings.help_window": "Hjälpfönster", - "hud.settings.debug_info": "Felsökningsinformation", - "hud.settings.show_hitboxes": "Visa kollisionsgränser", - "hud.settings.show_chat": "Visa chatt", - "hud.settings.show_hotkey_hints": "Visa snabbtangentstips", - "hud.settings.tips_on_startup": "Tips vid uppstart", - "hud.settings.ui_scale": "Skalning av gränssnitt", - "hud.settings.relative_scaling": "Relativ skalning", - "hud.settings.custom_scaling": "Anpassad skalning", - "hud.settings.crosshair": "Hårkors", - "hud.settings.opacity": "Transparens", - "hud.settings.hotbar": "Snabbåtkomst", - "hud.settings.toggle_shortcuts": "Växla genvägar", - "hud.settings.buffs_skillbar": "Effekter vid Förmågomätarna", - "hud.settings.buffs_mmap": "Effekter vid Minikartan", - "hud.settings.toggle_bar_experience": "Visa/dölj erfarenhetsmätare", - "hud.settings.scrolling_combat_text": "Rullande stridstext", - "hud.settings.incoming_damage": "Inkommande skada", - "hud.settings.speech_bubble": "Pratbubbla", - "hud.settings.speech_bubble_self": "Visa egna pratbubblor", - "hud.settings.speech_bubble_dark_mode": "Pratbubbla mörkt läge", - "hud.settings.speech_bubble_icon": "Pratbubbleikon", - "hud.settings.energybar_numbers": "Energimätare med värden", - "hud.settings.always_show_bars": "Visa alltid Energimätare", - "hud.settings.values": "Värden", - "hud.settings.percentages": "Procent", - "hud.settings.chat": "Chatt", - "hud.settings.background_opacity": "Bakgrundstransparens", - "hud.settings.chat_character_name": "Karaktärsnamn i chatten", - "hud.settings.loading_tips": "Tips på laddningsskärmen", - "hud.settings.reset_interface": "Återställ till standard", - - "hud.settings.pan_sensitivity": "Panoreringskänslighet", - "hud.settings.zoom_sensitivity": "Zoomkänslighet", - "hud.settings.camera_clamp_angle": "Vinkel för kamera fastlåst i verikalt läge", - "hud.settings.invert_scroll_zoom": "Invertera scrollhjulet för zoomning", - "hud.settings.invert_mouse_y_axis": "Invertera musens Y-axel", - "hud.settings.invert_controller_y_axis": "Invertera kontrollerns Y-axel", - "hud.settings.enable_mouse_smoothing": "Mjuka kamerarörelser", - "hud.settings.free_look_behavior": "Beteende för rörlig kamera", - "hud.settings.auto_walk_behavior": "Beteende för automatisk gång", - "hud.settings.camera_clamp_behavior": "Beteende för låst kamera", - "hud.settings.player_physics_behavior": "Spelarfysik (experiment)", - "hud.settings.stop_auto_walk_on_input": "Avsluta automatisk gång vid rörelse", - "hud.settings.auto_camera": "Automatisk kamera", - "hud.settings.reset_gameplay": "Återställ till standard", - - "hud.settings.view_distance": "Visningsavstånd", - "hud.settings.sprites_view_distance": "Visningsavstånd för sprites", - "hud.settings.figures_view_distance": "Visningsavstånd för entiteter", - "hud.settings.maximum_fps": "Maximal bildhastighet", - "hud.settings.background_fps": "Bakgrundsbildhastighet", - "hud.settings.present_mode": "Presentationsläge", - "hud.settings.present_mode.fifo": "Först in–först ut", - "hud.settings.present_mode.mailbox": "Brevlåda", - "hud.settings.present_mode.immediate": "Omedelbar", - "hud.settings.fov": "Bildvinkel (grader)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Exponering", - "hud.settings.ambiance": "Omgivningens ljusstyrka", - "hud.settings.antialiasing_mode": "AntiAliasing-läge", - "hud.settings.upscale_factor": "Intern upplösning", - "hud.settings.cloud_rendering_mode": "Molnrenderingsläge", - "hud.settings.fluid_rendering_mode": "Vätskerenderingsläge", - "hud.settings.fluid_rendering_mode.cheap": "Billig", - "hud.settings.fluid_rendering_mode.shiny": "Blank", - "hud.settings.cloud_rendering_mode.minimal": "Minimal", - "hud.settings.cloud_rendering_mode.low": "Låg", - "hud.settings.cloud_rendering_mode.medium": "Medium", - "hud.settings.cloud_rendering_mode.high": "Hög", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Helskärm", - "hud.settings.fullscreen_mode": "Helskärmsläge", - "hud.settings.fullscreen_mode.exclusive": "Exklusivt", - "hud.settings.fullscreen_mode.borderless": "Utan ram", - "hud.settings.gpu_profiler": "Aktivera GPU-timing (stöds inte överallt)", - "hud.settings.particles": "Partiklar", - "hud.settings.lossy_terrain_compression": "Destruktiv komprimering av terräng", - "hud.settings.resolution": "Upplösning", - "hud.settings.bit_depth": "Bitdjup", - "hud.settings.refresh_rate": "Uppdateringsfrekvens", - "hud.settings.lighting_rendering_mode": "Återgivning av ljussättning", - "hud.settings.lighting_rendering_mode.ashikhmin": "Typ A - Hög", - "hud.settings.lighting_rendering_mode.blinnphong": "Typ B - Medium", - "hud.settings.lighting_rendering_mode.lambertian": "Typ L - Billig", - "hud.settings.shadow_rendering_mode": "Återgivning av skuggor", - "hud.settings.shadow_rendering_mode.none": "Ingen", - "hud.settings.shadow_rendering_mode.cheap": "Billig", - "hud.settings.shadow_rendering_mode.map": "Mappad", - "hud.settings.shadow_rendering_mode.map.resolution": "Upplösning", - "hud.settings.lod_detail": " Detailjrikedom", - "hud.settings.save_window_size": "Kom ihåg fönsterstorlek", - "hud.settings.reset_graphics": "Återställ till standard", - "hud.settings.bloom": "Bloom", - "hud.settings.point_glow": "Punktssken", - - "hud.settings.master_volume": "Huvudvolym", - "hud.settings.inactive_master_volume_perc": "Huvudvolym (inaktivt fönster)", - "hud.settings.music_volume": "Musikvolym", - "hud.settings.sound_effect_volume": "Ljudeffektsvolym", - "hud.settings.audio_device": "Ljudenhet", - "hud.settings.reset_sound": "Återställ till standard", - - "hud.settings.english_fallback": "Visa på engelska om översättning saknas", - - "hud.settings.awaitingkey": "Tryck på någon tangent …", - "hud.settings.unbound": "Ingen", - "hud.settings.reset_keybinds": "Återställ till standard", - - "hud.settings.chat_tabs": "Chattflikar", - "hud.settings.label": "Etikett:", - "hud.settings.delete": "Radera", - "hud.settings.show_all": "Visa alla", - "hud.settings.messages": "Meddelanden", - "hud.settings.activity": "Aktivitet", - "hud.settings.death": "Död", - "hud.settings.group": "Grupp", - "hud.settings.faction": "Fraktion", - "hud.settings.world": "Värld", - "hud.settings.region": "Region", - "hud.settings.say": "Säg", - "hud.settings.all": "Alla", - "hud.settings.group_only": "Endast grupp", - "hud.settings.reset_chat" : "Återställ till standard", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/skills.ftl b/assets/voxygen/i18n/sv_SE/hud/skills.ftl new file mode 100644 index 0000000000..7b575dbbdd --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/skills.ftl @@ -0,0 +1,237 @@ +hud-rank_up = Nytt färdighetspoäng +hud-skill-sp_available = { $number } FP tillgängliga +hud-skill-not_unlocked = Inte upplåst än +hud-skill-req_sp ={"\u000A"} + + Kräver { $number } FP +hud-skill-inc_health_title = Öka hälsa +hud-skill-inc_health = Ökar den maximala hälsan med { $boost }{ $SP } +hud-skill-inc_energy_title = Öka energi +hud-skill-inc_energy = Ökar den maximala energin med { $boost }{ $SP } +hud-skill-unlck_sword_title = Lås upp svärd +hud-skill-unlck_sword = Låser upp färdighetsträdet för svärd{ $SP } +hud-skill-unlck_axe_title = Lås upp yxa +hud-skill-unlck_axe = Låser upp färdighetsträdet för yxa{ $SP } +hud-skill-unlck_hammer_title = Lås upp hammare +hud-skill-unlck_hammer = Låser upp färdighetsträdet för hammare{ $SP } +hud-skill-unlck_bow_title = Lås upp pilbåge +hud-skill-unlck_bow = Låser upp färdighetsträdet för pilbåge{ $SP } +hud-skill-unlck_staff_title = Lås upp stav +hud-skill-unlck_staff = Låser upp färdighetsträdet för stav{ $SP } +hud-skill-unlck_sceptre_title = Lås upp spira +hud-skill-unlck_sceptre = Låser upp färdighetsträdet för spira{ $SP } +hud-skill-dodge_title = Ducka +hud-skill-dodge = Rulla åt sidan genom att mittenklicka och ger temporär immunitet mot närstridsattacker (iframes) medan du rullar. +hud-skill-roll_energy_title = Rullningsenergikostnad +hud-skill-roll_energy = Rullning använder { $boost }% mindre energi{ $SP } +hud-skill-roll_speed_title = Rullningshastighet +hud-skill-roll_speed = Ralla { $boost }% fortare{ $SP } +hud-skill-roll_dur_title = Rullningstid +hud-skill-roll_dur = Rulla { $boost }% längre{ $SP } +hud-skill-climbing_title = Klättring +hud-skill-climbing = Hoppa högre +hud-skill-climbing_cost_title = Kostnad för klättring +hud-skill-climbing_cost = Klättring använder { $boost }% mindre energi{ $SP } +hud-skill-climbing_speed_title = Klättringshastighet +hud-skill-climbing_speed = Klättra { $boost }% fortare{ $SP } +hud-skill-swim_title = Simning +hud-skill-swim = Förflyttelse i blöta miljöer +hud-skill-swim_speed_title = Simningshastighet +hud-skill-swim_speed = Simma { $boost }% fortare{ $SP } +hud-skill-sc_lifesteal_title = Livsstjälande stråle +hud-skill-sc_lifesteal = Sug livet ur dina fiender +hud-skill-sc_lifesteal_damage_title = Skada +hud-skill-sc_lifesteal_damage = Orsaka { $boost }% större skada{ $SP } +hud-skill-sc_lifesteal_range_title = Räckvidd +hud-skill-sc_lifesteal_range = Din stråle når { $boost }% längre{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Livsstjälande +hud-skill-sc_lifesteal_lifesteal = Omvandlar ytterligare { $boost }% av skadan till kroppspoäng{ $SP } +hud-skill-sc_lifesteal_regen_title = Energiregeneration +hud-skill-sc_lifesteal_regen = Fyll på din energi med ytterligare { $boost }%{ $SP } +hud-skill-sc_heal_title = Helande aura +hud-skill-sc_heal = Hela dina allierade med dina fienders blod, behöver kombo för att aktivera +hud-skill-sc_heal_heal_title = Hela +hud-skill-sc_heal_heal = Ökar mängden du helar med { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Energikostnad +hud-skill-sc_heal_cost = Helande kräver { $boost }% mindre energi{ $SP } +hud-skill-sc_heal_duration_title = Tidsspann +hud-skill-sc_heal_duration = Effekterna från din helande aura varar { $boost }% längre{ $SP } +hud-skill-sc_heal_range_title = Radie +hud-skill-sc_heal_range = Din helande aura når { $boost }% längre{ $SP } +hud-skill-sc_wardaura_unlock_title = Låser upp beskyddande aura +hud-skill-sc_wardaura_unlock = Låter dig skydda dina vänner mot fiendeattacker{ $SP } +hud-skill-sc_wardaura_strength_title = Styrka +hud-skill-sc_wardaura_strength = Ditt skydd blir { $boost }% starkare{ $SP } +hud-skill-sc_wardaura_duration_title = Varaktighet +hud-skill-sc_wardaura_duration = Ditt beskydd varar { $boost }% längre{ $SP } +hud-skill-sc_wardaura_range_title = Räckvidd +hud-skill-sc_wardaura_range = Ditt beskydd når { $boost }% längre{ $SP } +hud-skill-sc_wardaura_cost_title = Energikostnad +hud-skill-sc_wardaura_cost = Ditt beskydd kräver { $boost }% mindre energi att upprätta{ $SP } +hud-skill-st_shockwave_range_title = Chockfrontens räckvidd +hud-skill-st_shockwave_range = Kasta saker som tidigre var utom räckhåll, räckvidden utökas med { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Chockfrontens kostnad +hud-skill-st_shockwave_cost = Minskar energikostnaden för stt kasta hjälplösa bybor med { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Chockfrontens styrka +hud-skill-st_shockwave_knockback = Chockfronten blir { $boost }% mer kraftfull{ $SP } +hud-skill-st_shockwave_damage_title = Chockfrontens skada +hud-skill-st_shockwave_damage = Ökar skadeverkan med { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Lås upp chockfront +hud-skill-st_shockwave_unlock = Låser upp möjligheten att slå undan fiender med eld{ $SP } +hud-skill-st_flamethrower_title = Eldkastare +hud-skill-st_flamethrower = Slungar eld, för välgrillade fiender +hud-skill-st_flame_velocity_title = Flamhastighet +hud-skill-st_flame_velocity = Elden sprider sig snabbt, { $boost }% snabbare{ $SP } +hud-skill-st_flamethrower_range_title = Eldkastares räckvidd +hud-skill-st_flamethrower_range = När flammorna inte når, räcker de { $boost }% längre{ $SP } +hud-skill-st_energy_drain_title = Energikostnad +hud-skill-st_energy_drain = Minskar energikostnaden med { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Eldkastarens skadeverkan +hud-skill-st_flamethrower_damage = Orsakar { $boost }% mer skada{ $SP } +hud-skill-st_explosion_radius_title = Explosionsradie +hud-skill-st_explosion_radius = Större är bättre, explosionsradien ökar med { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Engergiregeneration +hud-skill-st_energy_regen = Ökar energiregenerationen med { $boost }%{ $SP } +hud-skill-st_fireball_title = Eldklot +hud-skill-st_fireball = Skjuter ett eldklot som exploderar vid träff +hud-skill-st_damage_title = Skada +hud-skill-st_damage = Orsakar { $boost }% mer skada{ $SP } +hud-skill-bow_projectile_speed_title = Projektilhastighet +hud-skill-bow_projectile_speed = Låter dig skjuta pilar { $boost }% längre och snabbare{ $SP } +hud-skill-bow_charged_title = Laddat skott +hud-skill-bow_charged = Eftersom du väntade längre +hud-skill-bow_charged_damage_title = Laddad Skada +hud-skill-bow_charged_damage = Ökar skadeverkan med { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Energiåterhämtning +hud-skill-bow_charged_energy_regen = Öka energiåterhämtning med { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Laddad knuffning +hud-skill-bow_charged_knockback = Knuffa fiender { $boost }%{ $SP } längre bort +hud-skill-bow_charged_speed_title = Laddad Hastighet +hud-skill-bow_charged_speed = Ökar hur fort du laddar attacken med { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Laddad rörelsehastighet +hud-skill-bow_charged_move = Ökar hur fort du kan röra på dig medan du laddar attacken med { $boost }%{ $SP } +hud-skill-bow_repeater_title = Upprepande skott +hud-skill-bow_repeater = Skjuter fortare ju längre tid du skjuter +hud-skill-bow_repeater_damage_title = Upprepande skottsskada +hud-skill-bow_repeater_damage = Ökar skadan du gör med { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Upprepande skottskostnad +hud-skill-bow_repeater_cost = Minskar energikostnaden för att bli ett upprepande skott med { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Upprepande skottshastighet +hud-skill-bow_repeater_speed = Ökar hur fort du skjuter pilar med { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Låser upp Hagelgevär +hud-skill-bow_shotgun_unlock = Låter dig skjuta flera pilar samtidigt{ $SP } +hud-skill-bow_shotgun_damage_title = Hagelgevärsskada +hud-skill-bow_shotgun_damage = Ökar skadan du gör med { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Hagelgevärskostnad +hud-skill-bow_shotgun_cost = Miinskar kostnaden för hagelgevär med { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Hagelgevärspilar +hud-skill-bow_shotgun_arrow_count = Ökar antalet pilar i skottsalvan med { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Hagelgevärsspridning +hud-skill-bow_shotgun_spread = Minskar pilarnas spridning med { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Hoppsradie +hud-skill-hmr_leap_radius = Ökar attackradie vid marknedslag med { $boost } meter{ $SP } +hud-skill-hmr_leap_distance_title = Hoppsavstånd +hud-skill-hmr_leap_distance = Ökar hoppsavståndet med { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Hoppskostnad +hud-skill-hmr_leap_cost = Minskar hoppskostnaden med { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Knuffning från hopp +hud-skill-hmr_leap_knockback = Ökar knuffning från hopp med { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Hoppsskada +hud-skill-hmr_leap_damage = Ökar hoppsskada med { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Lås upp hopp +hud-skill-hmr_unlock_leap = Låser upp ett hopp{ $SP } +hud-skill-hmr_charged_melee_title = Laddad Närstrid +hud-skill-hmr_charged_melee = Närstrid, men laddad +hud-skill-hmr_charged_rate_title = Laddningshastighet +hud-skill-hmr_charged_rate = Ökar hur fort du laddar slaget med { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Energiminskning för laddad närstrid +hud-skill-hmr_charged_melee_nrg_drain = Minskar hur fort energi minskar när du laddar med { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Laddad Närstridsskada +hud-skill-hmr_charged_melee_damage = Ökar skadan från den laddade slaget med { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Laddad närstridsknuffning +hud-skill-hmr_charged_melee_knockback = Ökar massivt slagens kastningspotential med { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Enkelslag +hud-skill-hmr_single_strike_regen_title = Enkelslagsåterhämtning +hud-skill-hmr_single_strike_regen = Ökar uthållighetsökningen för varje successivt slag{ $SP } +hud-skill-hmr_single_strike_speed_title = Enkelslagshastighet +hud-skill-hmr_single_strike_speed = Ökar attackhastigheten för varje successivt slag{ $SP } +hud-skill-hmr_single_strike_damage_title = Enkelslagsskada +hud-skill-hmr_single_strike_damage = Ökar skadan för varje successiv träff{ $SP } +hud-skill-hmr_single_strike_knockback_title = Enkelslagsknuffning +hud-skill-hmr_single_strike_knockback = Ökar slagens kastningspotential med { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Trippelslag +hud-skill-sw_trip_str = Gör upp till tre slag +hud-skill-sw_trip_str_combo_title = Trippelslagskombo +hud-skill-sw_trip_str_combo = Låser upp komboskalning för trippelslag{ $SP } +hud-skill-sw_trip_str_dmg_title = Trippelslagsskada +hud-skill-sw_trip_str_dmg = Ökar skadan varje successivt slag gör{ $SP } +hud-skill-sw_trip_str_sp_title = Trippelslagshastighet +hud-skill-sw_trip_str_sp = Ökar attackhastighetsökningen för varje successivt slag{ $SP } +hud-skill-sw_trip_str_reg_title = Tripellslagsåterhämtning +hud-skill-sw_trip_str_reg = Ökar uthållighetsökningen för varje successivt slag{ $SP } +hud-skill-sw_dash_title = Språng +hud-skill-sw_dash = Spetsa dina fiender +hud-skill-sw_dash_dmg_title = Språngsskada +hud-skill-sw_dash_dmg = Ökar första skadan från språnget med { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Språngsminskning +hud-skill-sw_dash_drain = Minskar hur fort energi minskar medan du springer med { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Språngsskada +hud-skill-sw_dash_cost = Minskar första kostnaden från språnget med { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Språngshastighet +hud-skill-sw_dash_speed = Ökar hur fort du kan röra dig medan du springer { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Spring genom +hud-skill-sw_dash_charge_through = Tillåter dig att springa genom de första fienderna du träffar{ $SP } +hud-skill-sw_dash_scale_title = Språngets skalande skada +hud-skill-sw_dash_scale = Ökar skadans skalning från språnget med { $boost }%{ $SP } +hud-skill-sw_spin_title = Snurrning Upplåst +hud-skill-sw_spin = Låser upp svärdssnurrning{ $SP } +hud-skill-sw_spin_dmg_title = Snurrningsskada +hud-skill-sw_spin_dmg = Ökar skadan som görs med { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Snurrningshastighet +hud-skill-sw_spin_spd = Ökar hastigheten du snurrar med med { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Snurrningskostnad +hud-skill-sw_spin_cost = Minskar energikostnaden för varje snurr med { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Snurrning snurrar +hud-skill-sw_spin_spins = Ökar antalet gånger du kan snurra{ $SP } +hud-skill-sw_interrupt_title = Avbryter attacker +hud-skill-sw_interrupt = Tillåter dig att omedelbart byta från en attack till en annan{ $SP } +hud-skill-axe_double_strike_title = Dubbelslag +hud-skill-axe_double_strike = Fäll skurkar likt furor +hud-skill-axe_double_strike_combo_title = Dubbelslagskombination +hud-skill-axe_double_strike_combo = Låser upp ett andra slag{ $SP } +hud-skill-axe_double_strike_damage_title = Dubbelslagsskada +hud-skill-axe_double_strike_damage = Ökar skadan från varje successiv träff{ $SP } +hud-skill-axe_double_strike_speed_title = Dubbelslagshastighet +hud-skill-axe_double_strike_speed = Ökar attackhastigheten från varje successiv träff{ $SP } +hud-skill-axe_double_strike_regen_title = Dubbelslagsregeneration +hud-skill-axe_double_strike_regen = Ökar uthållighetsökningen från varje successiv träff{ $SP } +hud-skill-axe_spin_title = Yxsnurrning +hud-skill-axe_infinite_axe_spin_title = Oändlig Yxsnurrning +hud-skill-axe_infinite_axe_spin = Snurra så länge du har energi{ $SP } +hud-skill-axe_spin_damage_title = Snurrningsskada +hud-skill-axe_spin_damage = Ökar skadan varje snurrning gör med { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Snurrningshelikopter +hud-skill-axe_spin_helicopter = Du faller lite långsammare medan du snurrar{ $SP } +hud-skill-axe_spin_speed_title = Snurrningshastighet +hud-skill-axe_spin_speed = Ökar din snurrningshasighet med { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Snurrningskostnad +hud-skill-axe_spin_cost = Minskar uthållighetskostnaden för snurrning med { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Låser upp Hopp +hud-skill-axe_unlock_leap = Låser upp en hoppsnurrning{ $SP } +hud-skill-axe_leap_damage_title = Hoppsskada +hud-skill-axe_leap_damage = Ökar skadan från hopp med { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Knuffning från hopp +hud-skill-axe_leap_knockback = Ökar hoppets knuffning med { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Hoppkostnad +hud-skill-axe_leap_cost = Minskar hoppets kostnaden med { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Hoppavstånd +hud-skill-axe_leap_distance = Ökar hoppets avstånd med { $boost }%{ $SP } +hud-skill-mining_title = Gruvgrävande +hud-skill-pick_strike_title = Hackeslag +hud-skill-pick_strike = Hacka stenar med hackan för att få malm, ädelstenar och erfarenhet +hud-skill-pick_strike_speed_title = Slaghastighet +hud-skill-pick_strike_speed = Hacka stenar fortare{ $SP } +hud-skill-pick_strike_oregain_title = Hackans Malmavkastning +hud-skill-pick_strike_oregain = Chans att få extra malm ({ $boost }% per nivå){ $SP } +hud-skill-pick_strike_gemgain_title = Hackans Ädelstensavkastning +hud-skill-pick_strike_gemgain = Chans att få extra ädelstenar ({ $boost }% per nivå){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/skills.ron b/assets/voxygen/i18n/sv_SE/hud/skills.ron deleted file mode 100644 index 69aca853aa..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/skills.ron +++ /dev/null @@ -1,255 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.rank_up": "Nytt färdighetspoäng", - "hud.skill.sp_available": "{number} FP tillgängliga", - "hud.skill.not_unlocked": "Inte upplåst än", - "hud.skill.req_sp": "\n\nKräver {number} FP", - // Skills - // General - "hud.skill.inc_health_title": "Öka hälsa", - "hud.skill.inc_health": "Ökar den maximala hälsan med {boost}{SP}", - "hud.skill.inc_energy_title": "Öka energi", - "hud.skill.inc_energy": "Ökar den maximala energin med {boost}{SP}", - "hud.skill.unlck_sword_title": "Lås upp svärd", - "hud.skill.unlck_sword": "Låser upp färdighetsträdet för svärd{SP}", - "hud.skill.unlck_axe_title": "Lås upp yxa", - "hud.skill.unlck_axe": "Låser upp färdighetsträdet för yxa{SP}", - "hud.skill.unlck_hammer_title": "Lås upp hammare", - "hud.skill.unlck_hammer": "Låser upp färdighetsträdet för hammare{SP}", - "hud.skill.unlck_bow_title": "Lås upp pilbåge", - "hud.skill.unlck_bow": "Låser upp färdighetsträdet för pilbåge{SP}", - "hud.skill.unlck_staff_title": "Lås upp stav", - "hud.skill.unlck_staff": "Låser upp färdighetsträdet för stav{SP}", - "hud.skill.unlck_sceptre_title": "Lås upp spira", - "hud.skill.unlck_sceptre": "Låser upp färdighetsträdet för spira{SP}", - "hud.skill.dodge_title": "Ducka", - "hud.skill.dodge": "Rulla åt sidan genom att mittenklicka och ger temporär immunitet mot närstridsattacker (iframes) medan du rullar.", - "hud.skill.roll_energy_title": "Rullningsenergikostnad", - "hud.skill.roll_energy": "Rullning använder {boost}% mindre energi{SP}", - "hud.skill.roll_speed_title": "Rullningshastighet", - "hud.skill.roll_speed": "Ralla {boost}% fortare{SP}", - "hud.skill.roll_dur_title": "Rullningstid", - "hud.skill.roll_dur": "Rulla {boost}% längre{SP}", - "hud.skill.climbing_title": "Klättring", - "hud.skill.climbing": "Hoppa högre", - "hud.skill.climbing_cost_title": "Kostnad för klättring", - "hud.skill.climbing_cost": "Klättring använder {boost}% mindre energi{SP}", - "hud.skill.climbing_speed_title": "Klättringshastighet", - "hud.skill.climbing_speed": "Klättra {boost}% fortare{SP}", - "hud.skill.swim_title": "Simning", - "hud.skill.swim": "Förflyttelse i blöta miljöer", - "hud.skill.swim_speed_title": "Simningshastighet", - "hud.skill.swim_speed": "Simma {boost}% fortare{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Livsstjälande stråle", - "hud.skill.sc_lifesteal": "Sug livet ur dina fiender", - "hud.skill.sc_lifesteal_damage_title": "Skada", - "hud.skill.sc_lifesteal_damage": "Orsaka {boost}% större skada{SP}", - "hud.skill.sc_lifesteal_range_title": "Räckvidd", - "hud.skill.sc_lifesteal_range": "Din stråle når {boost}% längre{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Livsstjälande", - "hud.skill.sc_lifesteal_lifesteal": "Omvandlar ytterligare {boost}% av skadan till kroppspoäng{SP}", - "hud.skill.sc_lifesteal_regen_title": "Energiregeneration", - "hud.skill.sc_lifesteal_regen": "Fyll på din energi med ytterligare {boost}%{SP}", - "hud.skill.sc_heal_title": "Helande aura", - "hud.skill.sc_heal": "Hela dina allierade med dina fienders blod, behöver kombo för att aktivera", - "hud.skill.sc_heal_heal_title": "Hela", - "hud.skill.sc_heal_heal": "Ökar mängden du helar med {boost}%{SP}", - "hud.skill.sc_heal_cost_title": "Energikostnad", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.skill.sc_heal_cost": "Helande kräver {boost}% mindre energi{SP}", - "hud.skill.sc_heal_duration_title": "Tidsspann", - "hud.skill.sc_heal_duration": "Effekterna från din helande aura varar {boost}% längre{SP}", - "hud.skill.sc_heal_range_title": "Radie", - "hud.skill.sc_heal_range": "Din helande aura når {boost}% längre{SP}", - "hud.skill.sc_wardaura_unlock_title": "Låser upp beskyddande aura", - "hud.skill.sc_wardaura_unlock": "Låter dig skydda dina vänner mot fiendeattacker{SP}", - "hud.skill.sc_wardaura_strength_title": "Styrka", - "hud.skill.sc_wardaura_strength": "Ditt skydd blir {boost}% starkare{SP}", - "hud.skill.sc_wardaura_duration_title": "Varaktighet", - "hud.skill.sc_wardaura_duration": "Ditt beskydd varar {boost}% längre{SP}", - "hud.skill.sc_wardaura_range_title": "Räckvidd", - "hud.skill.sc_wardaura_range": "Ditt beskydd når {boost}% längre{SP}", - "hud.skill.sc_wardaura_cost_title": "Energikostnad", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.skill.sc_wardaura_cost": "Ditt beskydd kräver {boost}% mindre energi att upprätta{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Chockfrontens räckvidd", - "hud.skill.st_shockwave_range" : "Kasta saker som tidigre var utom räckhåll, räckvidden utökas med {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Chockfrontens kostnad", - "hud.skill.st_shockwave_cost" : "Minskar energikostnaden för stt kasta hjälplösa bybor med {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Chockfrontens styrka", - "hud.skill.st_shockwave_knockback" : "Chockfronten blir {boost}% mer kraftfull{SP}", - "hud.skill.st_shockwave_damage_title" : "Chockfrontens skada", - "hud.skill.st_shockwave_damage" : "Ökar skadeverkan med {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Lås upp chockfront", - "hud.skill.st_shockwave_unlock" : "Låser upp möjligheten att slå undan fiender med eld{SP}", - "hud.skill.st_flamethrower_title" : "Eldkastare", - "hud.skill.st_flamethrower" : "Slungar eld, för välgrillade fiender", - "hud.skill.st_flame_velocity_title" : "Flamhastighet", - "hud.skill.st_flame_velocity" : "Elden sprider sig snabbt, {boost}% snabbare{SP}", - "hud.skill.st_flamethrower_range_title" : "Eldkastares räckvidd", - "hud.skill.st_flamethrower_range" : "När flammorna inte når, räcker de {boost}% längre{SP}", - "hud.skill.st_energy_drain_title" : "Energikostnad", - "hud.skill.st_energy_drain" : "Minskar energikostnaden med {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Eldkastarens skadeverkan", - "hud.skill.st_flamethrower_damage" : "Orsakar {boost}% mer skada{SP}", - "hud.skill.st_explosion_radius_title" : "Explosionsradie", - "hud.skill.st_explosion_radius" : "Större är bättre, explosionsradien ökar med {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Engergiregeneration", - "hud.skill.st_energy_regen" : "Ökar energiregenerationen med {boost}%{SP}", - "hud.skill.st_fireball_title" : "Eldklot", - "hud.skill.st_fireball" : "Skjuter ett eldklot som exploderar vid träff", - "hud.skill.st_damage_title" : "Skada", - "hud.skill.st_damage" : "Orsakar {boost}% mer skada{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Projektilhastighet", - "hud.skill.bow_projectile_speed" : "Låter dig skjuta pilar {boost}% längre och snabbare{SP}", - "hud.skill.bow_charged_title" : "Laddat skott", - "hud.skill.bow_charged" : "Eftersom du väntade längre", - "hud.skill.bow_charged_damage_title" : "Laddad Skada", - "hud.skill.bow_charged_damage" : "Ökar skadeverkan med {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Energiåterhämtning", - "hud.skill.bow_charged_energy_regen" : "Öka energiåterhämtning med {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Laddad knuffning", - "hud.skill.bow_charged_knockback" : "Knuffa fiender {boost}%{SP} längre bort", - "hud.skill.bow_charged_speed_title" : "Laddad Hastighet", - "hud.skill.bow_charged_speed" : "Ökar hur fort du laddar attacken med {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Laddad rörelsehastighet", - "hud.skill.bow_charged_move" : "Ökar hur fort du kan röra på dig medan du laddar attacken med {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Upprepande skott", - "hud.skill.bow_repeater" : "Skjuter fortare ju längre tid du skjuter", - "hud.skill.bow_repeater_damage_title" : "Upprepande skottsskada", - "hud.skill.bow_repeater_damage" : "Ökar skadan du gör med {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Upprepande skottskostnad", - "hud.skill.bow_repeater_cost" : "Minskar energikostnaden för att bli ett upprepande skott med {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Upprepande skottshastighet", - "hud.skill.bow_repeater_speed" : "Ökar hur fort du skjuter pilar med {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Låser upp Hagelgevär", - "hud.skill.bow_shotgun_unlock" : "Låter dig skjuta flera pilar samtidigt{SP}", - "hud.skill.bow_shotgun_damage_title" : "Hagelgevärsskada", - "hud.skill.bow_shotgun_damage" : "Ökar skadan du gör med {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Hagelgevärskostnad", - "hud.skill.bow_shotgun_cost" : "Miinskar kostnaden för hagelgevär med {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Hagelgevärspilar", - "hud.skill.bow_shotgun_arrow_count" : "Ökar antalet pilar i skottsalvan med {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Hagelgevärsspridning", - "hud.skill.bow_shotgun_spread" : "Minskar pilarnas spridning med {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Hoppsradie", - "hud.skill.hmr_leap_radius" : "Ökar attackradie vid marknedslag med {boost} meter{SP}", - "hud.skill.hmr_leap_distance_title" : "Hoppsavstånd", - "hud.skill.hmr_leap_distance" : "Ökar hoppsavståndet med {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Hoppskostnad", - "hud.skill.hmr_leap_cost" : "Minskar hoppskostnaden med {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Knuffning från hopp", - "hud.skill.hmr_leap_knockback" : "Ökar knuffning från hopp med {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Hoppsskada", - "hud.skill.hmr_leap_damage" : "Ökar hoppsskada med {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Lås upp hopp", - "hud.skill.hmr_unlock_leap" : "Låser upp ett hopp{SP}", - "hud.skill.hmr_charged_melee_title" : "Laddad Närstrid", - "hud.skill.hmr_charged_melee" : "Närstrid, men laddad", - "hud.skill.hmr_charged_rate_title" : "Laddningshastighet", - "hud.skill.hmr_charged_rate" : "Ökar hur fort du laddar slaget med {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Energiminskning för laddad närstrid", - "hud.skill.hmr_charged_melee_nrg_drain" : "Minskar hur fort energi minskar när du laddar med {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Laddad Närstridsskada", - "hud.skill.hmr_charged_melee_damage" : "Ökar skadan från den laddade slaget med {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Laddad närstridsknuffning", - "hud.skill.hmr_charged_melee_knockback" : "Ökar massivt slagens kastningspotential med {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Enkelslag", - "hud.skill.hmr_single_strike_regen_title" : "Enkelslagsåterhämtning", - "hud.skill.hmr_single_strike_regen" : "Ökar uthållighetsökningen för varje successivt slag{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Enkelslagshastighet", - "hud.skill.hmr_single_strike_speed" : "Ökar attackhastigheten för varje successivt slag{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Enkelslagsskada", - "hud.skill.hmr_single_strike_damage" : "Ökar skadan för varje successiv träff{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Enkelslagsknuffning", - "hud.skill.hmr_single_strike_knockback" : "Ökar slagens kastningspotential med {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Trippelslag", - "hud.skill.sw_trip_str": "Gör upp till tre slag", - "hud.skill.sw_trip_str_combo_title": "Trippelslagskombo", - "hud.skill.sw_trip_str_combo": "Låser upp komboskalning för trippelslag{SP}", - "hud.skill.sw_trip_str_dmg_title": "Trippelslagsskada", - "hud.skill.sw_trip_str_dmg": "Ökar skadan varje successivt slag gör{SP}", - "hud.skill.sw_trip_str_sp_title": "Trippelslagshastighet", - "hud.skill.sw_trip_str_sp": "Ökar attackhastighetsökningen för varje successivt slag{SP}", - "hud.skill.sw_trip_str_reg_title": "Tripellslagsåterhämtning", - "hud.skill.sw_trip_str_reg": "Ökar uthållighetsökningen för varje successivt slag{SP}", - "hud.skill.sw_dash_title": "Språng", - "hud.skill.sw_dash": "Spetsa dina fiender", - "hud.skill.sw_dash_dmg_title": "Språngsskada", - "hud.skill.sw_dash_dmg": "Ökar första skadan från språnget med {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Språngsminskning", - "hud.skill.sw_dash_drain": "Minskar hur fort energi minskar medan du springer med {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Språngsskada", - "hud.skill.sw_dash_cost": "Minskar första kostnaden från språnget med {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Språngshastighet", - "hud.skill.sw_dash_speed": "Ökar hur fort du kan röra dig medan du springer {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Spring genom", - "hud.skill.sw_dash_charge_through": "Tillåter dig att springa genom de första fienderna du träffar{SP}", - "hud.skill.sw_dash_scale_title": "Språngets skalande skada", - "hud.skill.sw_dash_scale": "Ökar skadans skalning från språnget med {boost}%{SP}", - "hud.skill.sw_spin_title": "Snurrning Upplåst", - "hud.skill.sw_spin": "Låser upp svärdssnurrning{SP}", - "hud.skill.sw_spin_dmg_title": "Snurrningsskada", - "hud.skill.sw_spin_dmg": "Ökar skadan som görs med {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Snurrningshastighet", - "hud.skill.sw_spin_spd": "Ökar hastigheten du snurrar med med {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Snurrningskostnad", - "hud.skill.sw_spin_cost": "Minskar energikostnaden för varje snurr med {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Snurrning snurrar", - "hud.skill.sw_spin_spins": "Ökar antalet gånger du kan snurra{SP}", - "hud.skill.sw_interrupt_title": "Avbryter attacker", - "hud.skill.sw_interrupt": "Tillåter dig att omedelbart byta från en attack till en annan{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Dubbelslag", - "hud.skill.axe_double_strike": "Fäll skurkar likt furor", - "hud.skill.axe_double_strike_combo_title": "Dubbelslagskombination", - "hud.skill.axe_double_strike_combo": "Låser upp ett andra slag{SP}", - "hud.skill.axe_double_strike_damage_title": "Dubbelslagsskada", - "hud.skill.axe_double_strike_damage": "Ökar skadan från varje successiv träff{SP}", - "hud.skill.axe_double_strike_speed_title": "Dubbelslagshastighet", - "hud.skill.axe_double_strike_speed": "Ökar attackhastigheten från varje successiv träff{SP}", - "hud.skill.axe_double_strike_regen_title": "Dubbelslagsregeneration", - "hud.skill.axe_double_strike_regen": "Ökar uthållighetsökningen från varje successiv träff{SP}", - "hud.skill.axe_spin_title": "Yxsnurrning", - "hud.skill.axe_infinite_axe_spin_title": "Oändlig Yxsnurrning", - "hud.skill.axe_infinite_axe_spin": "Snurra så länge du har energi{SP}", - "hud.skill.axe_spin_damage_title": "Snurrningsskada", - "hud.skill.axe_spin_damage": "Ökar skadan varje snurrning gör med {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Snurrningshelikopter", - "hud.skill.axe_spin_helicopter": "Du faller lite långsammare medan du snurrar{SP}", - "hud.skill.axe_spin_speed_title": "Snurrningshastighet", - "hud.skill.axe_spin_speed": "Ökar din snurrningshasighet med {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Snurrningskostnad", - "hud.skill.axe_spin_cost": "Minskar uthållighetskostnaden för snurrning med {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Låser upp Hopp", - "hud.skill.axe_unlock_leap": "Låser upp en hoppsnurrning{SP}", - "hud.skill.axe_leap_damage_title": "Hoppsskada", - "hud.skill.axe_leap_damage": "Ökar skadan från hopp med {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Knuffning från hopp", - "hud.skill.axe_leap_knockback": "Ökar hoppets knuffning med {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Hoppkostnad", - "hud.skill.axe_leap_cost": "Minskar hoppets kostnaden med {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Hoppavstånd", - "hud.skill.axe_leap_distance": "Ökar hoppets avstånd med {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Gruvgrävande", - "hud.skill.pick_strike_title": "Hackeslag", - "hud.skill.pick_strike": "Hacka stenar med hackan för att få malm, ädelstenar och erfarenhet", - "hud.skill.pick_strike_speed_title": "Slaghastighet", - "hud.skill.pick_strike_speed": "Hacka stenar fortare{SP}", - "hud.skill.pick_strike_oregain_title": "Hackans Malmavkastning", - "hud.skill.pick_strike_oregain": "Chans att få extra malm ({boost}% per nivå){SP}", - "hud.skill.pick_strike_gemgain_title": "Hackans Ädelstensavkastning", - "hud.skill.pick_strike_gemgain": "Chans att få extra ädelstenar ({boost}% per nivå){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/sv_SE/hud/social.ftl b/assets/voxygen/i18n/sv_SE/hud/social.ftl new file mode 100644 index 0000000000..efe6bfcdbe --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Andra spelare +hud-social-online = Inloggade: +hud-social-friends = Vänner +hud-social-not_yet_available = Inte tillgängligt än +hud-social-faction = Fraktion +hud-social-play_online_fmt = { $nb_player } spelare inloggade +hud-social-name = Namn +hud-social-level = Nivå +hud-social-zone = Område +hud-social-account = Konto \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/social.ron b/assets/voxygen/i18n/sv_SE/hud/social.ron deleted file mode 100644 index 22da17a7e3..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.social": "Andra spelare", - "hud.social.online": "Inloggade:", - "hud.social.friends": "Vänner", - "hud.social.not_yet_available": "Inte tillgängligt än", - "hud.social.faction": "Fraktion", - "hud.social.play_online_fmt": "{nb_player} spelare inloggade", - "hud.social.name": "Namn", - "hud.social.level": "Nivå", - "hud.social.zone": "Område", - "hud.social.account": "Konto", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/sv_SE/hud/trade.ftl b/assets/voxygen/i18n/sv_SE/hud/trade.ftl new file mode 100644 index 0000000000..20bcfc34c4 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/trade.ftl @@ -0,0 +1,25 @@ +hud-trade-trade_window = Byte +hud-trade-phase1_description = + Drag de föremål du vill byta + till motsvarande ruta. +hud-trade-phase2_description = + Bytet är nu låst för att ge dig + tid att inspektera det. +hud-trade-phase3_description = Bytet behandlas. +hud-trade-persons_offer = Erbjudande från { $playername } +hud-trade-has_accepted = + { $playername } + har accepterat +hud-trade-accept = Acceptera +hud-trade-decline = Avböj +hud-trade-invite_sent = Bytesförfrågan har skickats till { $playername }. +hud-trade-result-completed = Bytet har genomförts. +hud-trade-result-declined = Bytet har avbrutits. +hud-trade-result-nospace = Inte tillräckligt mycket utrymme för att genomföra bytet. +hud-trade-buy_price = Köpepris +hud-trade-sell_price = Försäljningspris +hud-trade-coin = mynt +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Ditt erbjudande +hud-trade-their_offer = Deras erbjudande \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/trade.ron b/assets/voxygen/i18n/sv_SE/hud/trade.ron deleted file mode 100644 index 45f9eab984..0000000000 --- a/assets/voxygen/i18n/sv_SE/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - "hud.trade.trade_window": "Byte", - "hud.trade.phase1_description": "Drag de föremål du vill byta\n till motsvarande ruta.", - "hud.trade.phase2_description": "Bytet är nu låst för att ge dig\n tid att inspektera det.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Bytet behandlas.", - "hud.trade.persons_offer": "Erbjudande från {playername}", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.has_accepted": "{playername}\nhar accepterat", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.accept": "Acceptera", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.decline": "Avböj", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.invite_sent": "Bytesförfrågan har skickats till {playername}.", - "hud.trade.result.completed": "Bytet har genomförts.", - "hud.trade.result.declined": "Bytet har avbrutits.", - "hud.trade.result.nospace": "Inte tillräckligt mycket utrymme för att genomföra bytet.", - "hud.trade.buy_price": "Köpepris", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.sell_price": "Försäljningspris", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.coin": "mynt", // Comment to disable "Outdated" marking. Remove next time this translation changes - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Ditt erbjudande", - "hud.trade.their_offer": "Deras erbjudande", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/sv_SE/main.ftl b/assets/voxygen/i18n/sv_SE/main.ftl new file mode 100644 index 0000000000..d4a82752c4 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/main.ftl @@ -0,0 +1,95 @@ +main-username = Användarnamn +main-server = Server +main-password = Lösenord +main-connecting = Ansluter +main-creating_world = Skapar värld +main-tip = Tips: +main-unbound_key_tip = obunden +main-notice = + Välkommen till alfa-versionen av Veloren! + + Innan du dyker in i det roliga, ber vi dig hålla några saker i åtanke: + + - Detta är en väldigt tidig alfa-version. Förvänta dig buggar, väldigt bristfällig spelupplevelse, ovårdad spelmekanik och saknade funktioner. + + - Om du har konstruktiva synpunkter eller buggar att rapportera går det bra att kontakta oss på Reddit, GitLab eller vår gemenskaps Discord-server. + + - Veloren har öppen källkod, publicerad under licensen GPL 3. Det innebär att du får spela, modifiera och sprida spelet vidare precis + som du vill (så länge dina ändringar publiceras under samma licens). + + - Veloren är ett projekt som drivs av en gemenskap utan vinstintresse och alla som bidrar är en volontär. + Om du gillar det du ser, får du gärna gå med i en utvecklings- eller konstgrupp! + + Tack för att du tog dig tid att läsa det här meddelandet, vi hoppas du kommer gilla spelet! + + ~ Velorens utvecklare +main-login_process = + Information om inloggningsproceduren: + + Observera att du behöver ett konto + för att spela på vissa servrar. + + Du kan skapa ett konto på + + https://veloren.net/account/. +main-login-server_not_found = Servern hittades inte +main-login-authentication_error = Inloggningsfel på servern +main-login-internal_error = Internt fel hos klienten (troligen på grund av att rollpersonen har raderats) +main-login-failed_auth_server_url_invalid = Kunde inte ansluta till inloggningsservern +main-login-insecure_auth_scheme = Inloggning kan inte ske över HTTP. Detta är osäkert! För utvecklingsskäl får HTTP användas för 'localhost' ooch felsökningsinstallationer +main-login-server_full = Servern är full +main-login-untrusted_auth_server = Inloggningsservern är inte betrodd +main-login-outdated_client_or_server = ServernÄrTokig: Versionerna är förmodligen inte kompatibla, se om det finns uppdateringar tillgängliga. +main-login-timeout = Timeout: Servern svarade inte i tid. (Överbelastad eller nätverksproblem.) +main-login-server_shut_down = Servern stannade +main-login-network_error = Nätverksfel +main-login-network_wrong_version = Olika version hos server och klient, vänligen uppdatera din spelklient. +main-login-failed_sending_request = Förfrågan till inloggningsservern misslyckades +main-login-invalid_character = Den valda rollpersonen är ogiltig +main-login-client_crashed = Klienten kraschade +main-login-not_on_whitelist = Du måste finnas på administratörens vitlista för att få gå med +main-login-banned = Du har blockerats med följande motivering +main-login-kicked = Du har sparkats ut med följande motivering +main-login-select_language = Välj ett språk +main-login-client_version = Klientversion +main-login-server_version = Serverversion +main-login-client_init_failed = Klienten misslyckades att initiera: { $init_fail_reason } +main-login-username_bad_characters = Användarnamnet innehåller otillåtna tecken! (Endast alfanumeriska tecken, '_' och '-' är tillåtna) +main-login-username_too_long = Användarnamnet är för långt! Den maximala längden är: { $max_len } +main-servers-select_server = Välj en server +main-servers-singleplayer_error = Misslyckades att ansluta till den interna servern: { $sp_error } +main-servers-network_error = Serverns nätverks/uttagsfel: { $raw_error } +main-servers-participant_error = Deltagarfrånkoppling/protokollfel : { $raw_error } +main-servers-stream_error = Klientanslutnings-/komprimerings-/(av)serialiseringsfel: { $raw_error } +main-servers-database_error = Serverdatabasfel: { $raw_error } +main-servers-persistence_error = Serverpersistensfel (Troligtvis Tillgångs/Karaktärsdatarelaterat): { $raw_error } +main-servers-other_error = Generellt serverfel: { $raw_error } +main-credits = Lista över medverkande +main-credits-created_by = skapat av +main-credits-music = Musik +main-credits-fonts = Typsnitt +main-credits-other_art = Annan konst +main-credits-contributors = Bidragare +loading-tips = + .a0 = Tryck '{ $gameinput-togglelantern }' för att tända din lykta. + .a1 = Tryck '{ $gameinput-help }' för att se alla standardgenvägar. + .a2 = Du kan skriva /say eller /s för att endast prata med spelare i din närhet. + .a3 = Du kan skriva /region eller /r to för att endast prata med spelare upp till hundra block bort. + .a4 = Administratörer kan använda kommandot /build för att växla till byggläget. + .a5 = Du kan skriva /group eller /g för att endast prata med spelare i din nuvarande grupp. + .a6 = Använd /tell följt av ett spelarnamn och meddelande för att kommunicera direkt med en spelare. + .a7 = Håll ett öga öppet för mat, kistor och andra fynd som finns utspridda över hela världen! + .a8 = Är dina väskor fyllda med mat? Testa att tillverka bättre mat från den! + .a9 = Undrar du vad det finns att göra? Testa på en av dungeonsarna markerade på kartan! + .a10 = Glöm inte anpassa grafiken för din dator. Tryck '{ $gameinput-settings }' för att öppna inställningarna. + .a11 = Delad glädje är dubbel glädje! Tryck '{ $gameinput-social }' för att se vilka som spelar just nu. + .a12 = Tryck '{ $gameinput-dance }' för att dansa. Party! + .a13 = Tryck '{ $gameinput-glide }' för att använda din glidare och bli himlarnas härskare. + .a14 = Veloren är fortfarande i Pre-Alpha-stadiet. Vi gör vårt yttersta för att förbättra spelet varje dag! + .a15 = Om du vill gå med i utvecklargruppen eller bara snacka med oss får du gärna logga in på vår Discord-server. + .a16 = Du kan välja att visa din hälsostatus i inställningarna. + .a17 = Sitt nära en lägereld (tryck '{ $gameinput-sit }') för att långsamt återhämta dig från skador. + .a18 = Behöver du fler väskor eller bättre rustning för din fortsatta färd? Tryck '{ $gameinput-crafting }' för att öppna tillverkningsmenyn! + .a19 = Tryck '{ $gameinput-roll }' för att rulla. Det är användbart att rulla för att röra sig fortare och undvika fiendernas attacker. + .a20 = Undrar du vad et föremål används till? Sök efter 'input:' i tillverkningmenyn för att se vilka recept det används i. + .a21 = Har du hittat något coolt? Ta en bild av det med '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/main.ron b/assets/voxygen/i18n/sv_SE/main.ron deleted file mode 100644 index b8e7fe32a9..0000000000 --- a/assets/voxygen/i18n/sv_SE/main.ron +++ /dev/null @@ -1,114 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Swedish -( - string_map: { - /// Start Main screen section - "main.username": "Användarnamn", - "main.server": "Server", - "main.password": "Lösenord", - "main.connecting": "Ansluter", - "main.creating_world": "Skapar värld", - "main.tip": "Tips:", - "main.unbound_key_tip": "obunden", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Välkommen till alfa-versionen av Veloren! - -Innan du dyker in i det roliga, ber vi dig hålla några saker i åtanke: - -- Detta är en väldigt tidig alfa-version. Förvänta dig buggar, väldigt bristfällig spelupplevelse, ovårdad spelmekanik och saknade funktioner. - -- Om du har konstruktiva synpunkter eller buggar att rapportera går det bra att kontakta oss på Reddit, GitLab eller vår gemenskaps Discord-server. - -- Veloren har öppen källkod, publicerad under licensen GPL 3. Det innebär att du får spela, modifiera och sprida spelet vidare precis - som du vill (så länge dina ändringar publiceras under samma licens). - -- Veloren är ett projekt som drivs av en gemenskap utan vinstintresse och alla som bidrar är en volontär. -Om du gillar det du ser, får du gärna gå med i en utvecklings- eller konstgrupp! - -Tack för att du tog dig tid att läsa det här meddelandet, vi hoppas du kommer gilla spelet! - -~ Velorens utvecklare"#, - - // Login process description - "main.login_process": r#"Information om inloggningsproceduren: - -Observera att du behöver ett konto -för att spela på vissa servrar. - -Du kan skapa ett konto på - -https://veloren.net/account/."#, - "main.login.server_not_found": "Servern hittades inte", - "main.login.authentication_error": "Inloggningsfel på servern", - "main.login.internal_error": "Internt fel hos klienten (troligen på grund av att rollpersonen har raderats)", - "main.login.failed_auth_server_url_invalid": "Kunde inte ansluta till inloggningsservern", - "main.login.insecure_auth_scheme": "Inloggning kan inte ske över HTTP. Detta är osäkert! För utvecklingsskäl får HTTP användas för 'localhost' ooch felsökningsinstallationer", - "main.login.server_full": "Servern är full", - "main.login.untrusted_auth_server": "Inloggningsservern är inte betrodd", - "main.login.outdated_client_or_server": "ServernÄrTokig: Versionerna är förmodligen inte kompatibla, se om det finns uppdateringar tillgängliga.", - "main.login.timeout": "Timeout: Servern svarade inte i tid. (Överbelastad eller nätverksproblem.)", - "main.login.server_shut_down": "Servern stannade", - "main.login.network_error": "Nätverksfel", - "main.login.network_wrong_version": "Olika version hos server och klient, vänligen uppdatera din spelklient.", - "main.login.failed_sending_request": "Förfrågan till inloggningsservern misslyckades", - "main.login.invalid_character": "Den valda rollpersonen är ogiltig", - "main.login.client_crashed": "Klienten kraschade", - "main.login.not_on_whitelist": "Du måste finnas på administratörens vitlista för att få gå med", - "main.login.banned": "Du har blockerats med följande motivering", - "main.login.kicked": "Du har sparkats ut med följande motivering", - "main.login.select_language": "Välj ett språk", - "main.login.client_version": "Klientversion", - "main.login.server_version": "Serverversion", - "main.login.client_init_failed": "Klienten misslyckades att initiera: {init_fail_reason}", - "main.login.username_bad_characters": "Användarnamnet innehåller otillåtna tecken! (Endast alfanumeriska tecken, '_' och '-' är tillåtna)", - "main.login.username_too_long": "Användarnamnet är för långt! Den maximala längden är: {max_len}", - "main.servers.select_server": "Välj en server", - "main.servers.singleplayer_error": "Misslyckades att ansluta till den interna servern: {sp_error}", - "main.servers.network_error": "Serverns nätverks/uttagsfel: {raw_error}", - "main.servers.participant_error": "Deltagarfrånkoppling/protokollfel : {raw_error}", - "main.servers.stream_error": "Klientanslutnings-/komprimerings-/(av)serialiseringsfel: {raw_error}", - "main.servers.database_error": "Serverdatabasfel: {raw_error}", - "main.servers.persistence_error": "Serverpersistensfel (Troligtvis Tillgångs/Karaktärsdatarelaterat): {raw_error}", - "main.servers.other_error": "Generellt serverfel: {raw_error}", - - // Credits screen - "main.credits": "Lista över medverkande", - "main.credits.created_by": "skapat av", - "main.credits.music": "Musik", - "main.credits.fonts": "Typsnitt", - "main.credits.other_art": "Annan konst", - "main.credits.contributors": "Bidragare", - - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Tryck '{gameinput.togglelantern}' för att tända din lykta.", - "Tryck '{gameinput.help}' för att se alla standardgenvägar.", - "Du kan skriva /say eller /s för att endast prata med spelare i din närhet.", - "Du kan skriva /region eller /r to för att endast prata med spelare upp till hundra block bort.", - "Administratörer kan använda kommandot /build för att växla till byggläget.", - "Du kan skriva /group eller /g för att endast prata med spelare i din nuvarande grupp.", - "Använd /tell följt av ett spelarnamn och meddelande för att kommunicera direkt med en spelare.", - "Håll ett öga öppet för mat, kistor och andra fynd som finns utspridda över hela världen!", - "Är dina väskor fyllda med mat? Testa att tillverka bättre mat från den!", - "Undrar du vad det finns att göra? Testa på en av dungeonsarna markerade på kartan!", - "Glöm inte anpassa grafiken för din dator. Tryck '{gameinput.settings}' för att öppna inställningarna.", - "Delad glädje är dubbel glädje! Tryck '{gameinput.social}' för att se vilka som spelar just nu.", - "Tryck '{gameinput.dance}' för att dansa. Party!", - "Tryck '{gameinput.glide}' för att använda din glidare och bli himlarnas härskare.", - "Veloren är fortfarande i Pre-Alpha-stadiet. Vi gör vårt yttersta för att förbättra spelet varje dag!", - "Om du vill gå med i utvecklargruppen eller bara snacka med oss får du gärna logga in på vår Discord-server.", - "Du kan välja att visa din hälsostatus i inställningarna.", - "Sitt nära en lägereld (tryck '{gameinput.sit}') för att långsamt återhämta dig från skador.", - "Behöver du fler väskor eller bättre rustning för din fortsatta färd? Tryck '{gameinput.crafting}' för att öppna tillverkningsmenyn!", - "Tryck '{gameinput.roll}' för att rulla. Det är användbart att rulla för att röra sig fortare och undvika fiendernas attacker.", - "Undrar du vad et föremål används till? Sök efter 'input:' i tillverkningmenyn för att se vilka recept det används i.", - "Har du hittat något coolt? Ta en bild av det med '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/sv_SE/npc.ftl b/assets/voxygen/i18n/sv_SE/npc.ftl new file mode 100644 index 0000000000..6745d61196 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/npc.ftl @@ -0,0 +1,163 @@ +npc-speech-villager = + .a0 = Är inte detta en underbar dag? + .a1 = Hur står det till idag? + .a2 = Tjenixen! + .a3 = Undrar vad en Catoblepa tänker på när den betar. + .a4 = Vad tycker du om vädret idag? + .a5 = Blotta tanken av dungeons ger mig rysningar. Jag hoppas att någon kommer städa ur dem. + .a6 = Jag skulle vilja utforska någon dungeon när jag blir starkare. + .a7 = Har du sett min katt? + .a8 = Har du också hört ryktet om Landhajar? Jag hörde att de bor i öknar. + .a9 = De påstår att glimrande ädelstenar av alla dess slag kan hittas i dungeons. + .a10 = Visst blir man lycklig av ost! + .a11 = Kom in, vettja! Vi skulle just börja på en ost. + .a12 = Vissa påstår att svamp skulle vara bra för hälsan. Det skulle aldrig falla mig in att äta en. + .a13 = Glöm inte kexen för allt i världen! + .a14 = Jag bara älskar dvärgarnas ost. Om jag bara visste hur de tillverkades … + .a15 = Undrar just vad som ligger på andra sidan bergen där borta. + .a16 = Jag skulle vilja konstruera min egna glidare en dag. + .a17 = Skulle du vilja se min trädgård? Okej, kanske någon annan gång då. + .a18 = En underbar dag för en skogspromenad! + .a19 = Att vara eller inte vara? Jag tror nog jag borde bli bonde. + .a20 = Visst är väl vår by den bästa i världen? + .a21 = Vad tror du får Skimrande Lämningar att lysa? + .a22 = Jag tycker nog det börjar bli dags för en andra frukost! + .a23 = Har du lyckats fånga en eldfluga någon gång? + .a24 = Jag kan bara inte begripa var alla dessa Sauroker kommer ifrån. + .a25 = Jag önskar att någon kunde hålla alla vargar på avstånd från byn. + .a26 = Jag hade en fantastisk dröm om ost inatt. Vad tror du det kan betyda? + .a27 = Jag lämnade en ost hos min bror. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost. + .a28 = Jag lämnade en ost hos min syster. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost. + .a29 = Någon borde göra något åt de där sektanhängarna. Förslgsvis inte jag. + .a30 = Jag hoppas verkligen vi får lite regn snart. Det vore bra för grödorna. + .a31 = Jag älskar honung! Om det inte vore för dessa fördömda bin. + .a32 = En dag skulle jag vilja se världen. Livet måste väl vara större än bara den här hålan? +npc-speech-villager_decline_trade = + .a0 = Tyvärr har jag inget till salu. + .a1 = En vaddå? Tror inte jag har något av intresse för dig. + .a2 = Mitt hus är mitt och jag tänker inte flytta för allt i världen. +npc-speech-merchant_advertisement = + .a0 = Kan jag fresta med någon av dessa fina varor? + .a1 = Skulle du vilja köpa någonting? + .a2 = Jag har gott om varor, skulle du vilja se för dig själv? +npc-speech-merchant_busy = + .a0 = Hallå där, vänta på din tur! + .a1 = Ta det lugnt, jag är bara en människa. + .a2 = Ser du inte att andra står före dig i kön? + .a3 = Bara ett ögonblick, jag är snart klar. + .a4 = Du får nöja dig med din plats i kön. + .a5 = Jag är upptagen, kom igen lite senare. +npc-speech-merchant_trade_successful = + .a0 = Tack för att du ville handla av mig! + .a1 = Tack så mycket! +npc-speech-merchant_trade_declined = + .a0 = Kanske en annan gång, ha en bra dag! + .a1 = Äsch, det får bli nästa gång istället! +npc-speech-villager_cultist_alarm = + .a0 = Se upp! Här är en sektmedlem i farten! + .a1 = Till vapen! Sektanhängarna anfaller! + .a2 = Hur vågar sektanhängarna angripa vår by! + .a3 = Död åt sekten! + .a4 = Sektens anhängare kommer inte tolereras här! + .a5 = Mordiska sektanhängare! + .a6 = Smaka på min svärdsegg, din smutsiga sektanhängare! + .a7 = Inget kan två blodet från era händer, sektanhängare! + .a8 = Tusen troglodytiska terapeuter! En sektmedlem mitt ibland oss! + .a9 = Sektens ondskefulla tid är snart förbi! + .a10 = Den här sektanhängaren är min + .a11 = Gör dig redo för ett möte med din skapare, vidriga sektanhängare! + .a12 = Jag ser en sektmedlem! Efter dem! + .a13 = Jag ser en sektmedlem! Till attack! + .a14 = Jag ser en sektmedlem! Låt dem inte komma undan! + .a15 = Skulle den högt vördade sektmedlemmen önska spilla lite blod? + .a16 = Aldrig förlåta! Aldrig förglömma! Sektanhängare, ve er! + .a17 = Dö, sektanhängare! + .a18 = Ert skräckvälde ska gå under! + .a19 = Här är betalningen för allt ni gjort! + .a20 = Vi uppskattar inte sådana som du här omkring. + .a21 = Ni borde stannat kvar i ert gryt! +npc-speech-villager_under_attack = + .a0 = Hjälp, jag är under attack! + .a1 = Hjälp! Jag är under attack! + .a2 = Aj! Jag blir attackerad! + .a3 = Aj! Jag blir attackerad! Hjälp! + .a4 = Hjälp mig! Någon attackerar mig! + .a5 = Någon attackerar mig! Hjälp! + .a6 = Någon attackerar mig! Hjälp mig! + .a7 = Hjälp! + .a8 = Hjälp! Hjälp! + .a9 = Hjälp! Hjälp! Hjälp! + .a10 = Någon attackerar mig! + .a11 = Aaahhh! Någon attackerar mig! + .a12 = Aaahhh! Någon attackerar mig! Hjälp! + .a13 = Hjälp! Vi blir attackerade! + .a14 = Hjälp! Mördare! + .a15 = Hjälp! En mördare är är i farten! + .a16 = Hjälp! De försöker döda mig! + .a17 = Vakter, någon attackerar mig! + .a18 = Vakter! Någon attackerar mig! + .a19 = Jag blir attackerad! Vakter + .a20 = Hjälp! Vakter! Jag blir angripen! + .a21 = Vakter! Kom fort! + .a22 = Vakter! Vakter! + .a23 = Vakter! En skurk angriper mig! + .a24 = Vakter, slå ihjäl denna vidriga förbytare! + .a25 = Vakter! Här är en mördare! + .a26 = Vakter! Hjälp mig! + .a27 = Du kommer inte komma undan med det här! Vakter! + .a28 = Din skurk! + .a29 = Hjälp mig! + .a30 = Hjälp! Snälla! + .a31 = Aj! Vakter, hjälp! + .a32 = De kommer efter mig! + .a33 = Hjälp! Hjälp! Jag blir förtryckt! + .a34 = Och här ser vi tydligt hur systemet främjar våld. + .a35 = Ingen fara, det här är bara en skråma! + .a36 = Sluta upp med det! + .a37 = Hur har jag gjort dig orätt? + .a38 = Sluta attackera mig! + .a39 = Hallå där, akta vart du pekar den där saken! + .a40 = Din skändliga usling, försvinn med dig! + .a41 = Sluta upp med det! Försvinn! + .a42 = Hu har du gjort mig riktigt arg! + .a43 = Hallå där! Vem tror du att du är?! + .a44 = Det ska du få betala för med ditt huvud! + .a45 = Snälla sluta, jag har inget av värde! + .a46 = Jag kommer skicka min bror efter dig, han är ännu större än jag! + .a47 = Nej, detta ska allt mamma få höra om! + .a48 = Må olyckan följa i dina spår! + .a49 = Gör inte om det, är du snäll. + .a50 = Det var inte särskilt trevligt gjort! + .a51 = Ditt vapen verkar fungera, du kan lägga det åt sidan nu! + .a52 = Visa mig nåd! + .a53 = Snälla, tänk på min familj! + .a54 = Jag är för ung för att dö! + .a55 = Kan vi inte sätta oss ner och prata istället? + .a56 = Våld är aldrig lösningen! + .a57 = Den här dagen blir bara bättre och bättre … + .a58 = Aj, det gjorde faktiskt ont! + .a59 = Ah! + .a60 = Så oförskämt! + .a61 = Sluta, bara sluta! + .a62 = Du har dragit en svår olycka över dig! + .a63 = Detta är inte roligt. + .a64 = Hur vågar du?! + .a65 = Det ska du allt få betala för! + .a66 = Du kommer ångra dig om du forstätter så där! + .a67 = Tvinga inte mig att göra dig illa! + .a68 = Det måste ha skett ett missförstånd! + .a69 = Du behöver inte göra det här! + .a70 = Försvinn, demon! + .a71 = Det gjorde riktigt ont! + .a72 = Vad fick dig att göra så? + .a73 = Sluta! Vid andarna, upphör nu! + .a74 = Du måste ha blandat ihop mig med någon annan! + .a75 = Vad har jag gjort för att förtjäna detta? + .a76 = Gör inte om det. + .a77 = Vakter, kasta tillbaka detta odjur i sjön! + .a78 = Jag kommer sätta min tarask efter dig! + .a79 = Varför just jag? +npc-speech-villager_enemy_killed = + .a0 = Min fiende är förgjord! + .a1 = Äntligen lite lugn och ro! + .a2 = Vad var det nu jag höll på med? \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/npc.ron b/assets/voxygen/i18n/sv_SE/npc.ron deleted file mode 100644 index e7c3fef4d9..0000000000 --- a/assets/voxygen/i18n/sv_SE/npc.ron +++ /dev/null @@ -1,183 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for sweden Swedish -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "Är inte detta en underbar dag?", - "Hur står det till idag?", - "Tjenixen!", - "Undrar vad en Catoblepa tänker på när den betar.", // Catoblepa --> Catoblepa - "Vad tycker du om vädret idag?", - "Blotta tanken av dungeons ger mig rysningar. Jag hoppas att någon kommer städa ur dem.", - "Jag skulle vilja utforska någon dungeon när jag blir starkare.", - "Har du sett min katt?", - "Har du också hört ryktet om Landhajar? Jag hörde att de bor i öknar.", // Land Shark --> Landhaj - "De påstår att glimrande ädelstenar av alla dess slag kan hittas i dungeons.", - "Visst blir man lycklig av ost!", - "Kom in, vettja! Vi skulle just börja på en ost.", - "Vissa påstår att svamp skulle vara bra för hälsan. Det skulle aldrig falla mig in att äta en.", - "Glöm inte kexen för allt i världen!", - "Jag bara älskar dvärgarnas ost. Om jag bara visste hur de tillverkades …", - "Undrar just vad som ligger på andra sidan bergen där borta.", - "Jag skulle vilja konstruera min egna glidare en dag.", - "Skulle du vilja se min trädgård? Okej, kanske någon annan gång då.", - "En underbar dag för en skogspromenad!", - "Att vara eller inte vara? Jag tror nog jag borde bli bonde.", - "Visst är väl vår by den bästa i världen?", - "Vad tror du får Skimrande Lämningar att lysa?", /// Glowing Remains --> Skimrande Lämningar - "Jag tycker nog det börjar bli dags för en andra frukost!", - "Har du lyckats fånga en eldfluga någon gång?", - "Jag kan bara inte begripa var alla dessa Sauroker kommer ifrån.", // Saurok --> Saurok - "Jag önskar att någon kunde hålla alla vargar på avstånd från byn.", - "Jag hade en fantastisk dröm om ost inatt. Vad tror du det kan betyda?", - "Jag lämnade en ost hos min bror. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost.", - "Jag lämnade en ost hos min syster. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost.", - "Någon borde göra något åt de där sektanhängarna. Förslgsvis inte jag.", /// cultist --> sektanhängare (collectively and allies) alt. sektmedlem (individually) - "Jag hoppas verkligen vi får lite regn snart. Det vore bra för grödorna.", - "Jag älskar honung! Om det inte vore för dessa fördömda bin.", - "En dag skulle jag vilja se världen. Livet måste väl vara större än bara den här hålan?", - ], - "npc.speech.villager_decline_trade": [ - "Tyvärr har jag inget till salu.", - "En vaddå? Tror inte jag har något av intresse för dig.", - "Mitt hus är mitt och jag tänker inte flytta för allt i världen.", - ], - "npc.speech.merchant_advertisement": [ - "Kan jag fresta med någon av dessa fina varor?", - "Skulle du vilja köpa någonting?", - "Jag har gott om varor, skulle du vilja se för dig själv?" - ], - "npc.speech.merchant_busy": [ - "Hallå där, vänta på din tur!", - "Ta det lugnt, jag är bara en människa.", - "Ser du inte att andra står före dig i kön?", - "Bara ett ögonblick, jag är snart klar.", - "Du får nöja dig med din plats i kön.", - "Jag är upptagen, kom igen lite senare." - ], - "npc.speech.merchant_trade_successful": [ - "Tack för att du ville handla av mig!", - "Tack så mycket!", - ], - "npc.speech.merchant_trade_declined": [ - "Kanske en annan gång, ha en bra dag!", - "Äsch, det får bli nästa gång istället!" - ], - "npc.speech.villager_cultist_alarm": [ - "Se upp! Här är en sektmedlem i farten!", - "Till vapen! Sektanhängarna anfaller!", - "Hur vågar sektanhängarna angripa vår by!", - "Död åt sekten!", - "Sektens anhängare kommer inte tolereras här!", - "Mordiska sektanhängare!", - "Smaka på min svärdsegg, din smutsiga sektanhängare!", - "Inget kan två blodet från era händer, sektanhängare!", - "Tusen troglodytiska terapeuter! En sektmedlem mitt ibland oss!", - "Sektens ondskefulla tid är snart förbi!", - "Den här sektanhängaren är min", - "Gör dig redo för ett möte med din skapare, vidriga sektanhängare!", - "Jag ser en sektmedlem! Efter dem!", - "Jag ser en sektmedlem! Till attack!", - "Jag ser en sektmedlem! Låt dem inte komma undan!", - "Skulle den högt vördade sektmedlemmen önska spilla lite blod?", - "Aldrig förlåta! Aldrig förglömma! Sektanhängare, ve er!", - "Dö, sektanhängare!", - "Ert skräckvälde ska gå under!", - "Här är betalningen för allt ni gjort!", - "Vi uppskattar inte sådana som du här omkring.", - "Ni borde stannat kvar i ert gryt!", - ], - "npc.speech.villager_under_attack": [ - "Hjälp, jag är under attack!", - "Hjälp! Jag är under attack!", - "Aj! Jag blir attackerad!", - "Aj! Jag blir attackerad! Hjälp!", - "Hjälp mig! Någon attackerar mig!", - "Någon attackerar mig! Hjälp!", - "Någon attackerar mig! Hjälp mig!", - "Hjälp!", - "Hjälp! Hjälp!", - "Hjälp! Hjälp! Hjälp!", - "Någon attackerar mig!", - "Aaahhh! Någon attackerar mig!", - "Aaahhh! Någon attackerar mig! Hjälp!", - "Hjälp! Vi blir attackerade!", - "Hjälp! Mördare!", - "Hjälp! En mördare är är i farten!", - "Hjälp! De försöker döda mig!", - "Vakter, någon attackerar mig!", - "Vakter! Någon attackerar mig!", - "Jag blir attackerad! Vakter", - "Hjälp! Vakter! Jag blir angripen!", - "Vakter! Kom fort!", - "Vakter! Vakter!", - "Vakter! En skurk angriper mig!", - "Vakter, slå ihjäl denna vidriga förbytare!", - "Vakter! Här är en mördare!", - "Vakter! Hjälp mig!", - "Du kommer inte komma undan med det här! Vakter!", - "Din skurk!", - "Hjälp mig!", - "Hjälp! Snälla!", - "Aj! Vakter, hjälp!", - "De kommer efter mig!", - "Hjälp! Hjälp! Jag blir förtryckt!", - "Och här ser vi tydligt hur systemet främjar våld.", - "Ingen fara, det här är bara en skråma!", - "Sluta upp med det!", - "Hur har jag gjort dig orätt?", - "Sluta attackera mig!", - "Hallå där, akta vart du pekar den där saken!", - "Din skändliga usling, försvinn med dig!", - "Sluta upp med det! Försvinn!", - "Hu har du gjort mig riktigt arg!", - "Hallå där! Vem tror du att du är?!", - "Det ska du få betala för med ditt huvud!", - "Snälla sluta, jag har inget av värde!", - "Jag kommer skicka min bror efter dig, han är ännu större än jag!", - "Nej, detta ska allt mamma få höra om!", - "Må olyckan följa i dina spår!", - "Gör inte om det, är du snäll.", - "Det var inte särskilt trevligt gjort!", - "Ditt vapen verkar fungera, du kan lägga det åt sidan nu!", - "Visa mig nåd!", - "Snälla, tänk på min familj!", - "Jag är för ung för att dö!", - "Kan vi inte sätta oss ner och prata istället?", - "Våld är aldrig lösningen!", - "Den här dagen blir bara bättre och bättre …", - "Aj, det gjorde faktiskt ont!", - "Ah!", - "Så oförskämt!", - "Sluta, bara sluta!", - "Du har dragit en svår olycka över dig!", - "Detta är inte roligt.", - "Hur vågar du?!", - "Det ska du allt få betala för!", - "Du kommer ångra dig om du forstätter så där!", - "Tvinga inte mig att göra dig illa!", - "Det måste ha skett ett missförstånd!", - "Du behöver inte göra det här!", - "Försvinn, demon!", - "Det gjorde riktigt ont!", - "Vad fick dig att göra så?", - "Sluta! Vid andarna, upphör nu!", - "Du måste ha blandat ihop mig med någon annan!", - "Vad har jag gjort för att förtjäna detta?", - "Gör inte om det.", - "Vakter, kasta tillbaka detta odjur i sjön!", - "Jag kommer sätta min tarask efter dig!", - "Varför just jag?", - ], - "npc.speech.villager_enemy_killed": [ - "Min fiende är förgjord!", - "Äntligen lite lugn och ro!", - "Vad var det nu jag höll på med?", - ] - } -) diff --git a/assets/voxygen/i18n/th_TH/buff.ftl b/assets/voxygen/i18n/th_TH/buff.ftl new file mode 100644 index 0000000000..c47725408e --- /dev/null +++ b/assets/voxygen/i18n/th_TH/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = กดเพื่อปิด +buff-title-missing = ไม่มีชื่อ +buff-desc-missing = ไม่มีคำบรรยาย +buff-title-heal = สถานะฟื้นฟู +buff-desc-heal = ฟื้นฟูพลังชีวิตเป็นช่วง ๆ +buff-title-potion = ยา +buff-desc-potion = กำลังดื่มด่ำกับยา... +buff-title-saturation = สถานะท้องอิ่ม +buff-desc-saturation = พื้นฟูพลังชีวิตเป็นช่วง ๆ เมื่อทานอาหาร +buff-title-campfire_heal = พักผ่อน ณ แคมป์ไฟ +buff-desc-campfire_heal = เมื่อนั่งพักที่แคมป์ไฟจะช่วยพื้นฟูพลังชีวิต { $rate }% ต่อวินาที +buff-title-invulnerability = สถานะอมตะ +buff-desc-invulnerability = ไม่เสียพลังชีวิตเมื่อถูกโจมตี +buff-title-protectingward = สถานะพรคุ้มครอง +buff-desc-protectingward = พระกำลังคุ้มครอง เสียพลังชีวิตเล็กน้อยเมื่อถูกโจมตี +buff-title-frenzied = สถานะบ้าคลั่ง +buff-desc-frenzied = วิ่งเร็วขึ้นอย่างมาก ความเสียหลายเล้กน้อยไม่สามารถหยุดคุณได้ +buff-title-hastened = สถานะเครื่องติด +buff-desc-hastened = ความเร็วในการโจมตีและเคลื่อนที่เพิ่มขึ้น +buff-title-bleed = สถานะเลือดไหล +buff-desc-bleed = ได้รับความเสียหายแบบธรรมดา ๆ +buff-title-cursed = สถานะต้องสาป +buff-desc-cursed = ฉันขอฉาบแก! +buff-title-burn = สถานะไฟลุก +buff-desc-burn = ก้าวแรกไม่เป็นไร ก้าวต่อไป... +buff-title-crippled = สถานะขาหัก +buff-desc-crippled = ขาได้รับบาดเจ็บ เคลื่อนไหวได้ช้าลง +buff-title-frozen = สถานะแช่แข็ง +buff-desc-frozen = ความเร็วในการโจมตีและเคลื่อนที่ลดลง +buff-title-wet = สถานะเปียก +buff-desc-wet = พื้นลื่นมาก ๆ ระวังหกล้ม +buff-title-ensnared = สถานะพฤกษาบ่วงรัด +buff-desc-ensnared = เถาวัลย์กำลังรัดขา ขยับไปไหนไม่ได้เลย +buff-stat-health = ฟื้นฟูพลังชีวิต { $str_total } หน่วย +buff-stat-increase_max_energy = เพิ่มพลังงานสูงสุด { $strength } หน่วย +buff-stat-increase_max_health = เพิ่มพลังชีวิตสูงสุด { $strength } หน่วย +buff-stat-invulnerability = มอบ สถานะอมตา +buff-text-over_seconds = ในช่วงเวลา { $dur_secs } วินาที +buff-text-for_seconds = เป็นเวลา { $dur_secs } วินาที \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/buff.ron b/assets/voxygen/i18n/th_TH/buff.ron deleted file mode 100644 index 8e4d85b9fa..0000000000 --- a/assets/voxygen/i18n/th_TH/buff.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - // Buffs - "buff.remove": "กดเพื่อปิด", - "buff.title.missing": "ไม่มีชื่อ", - "buff.desc.missing": "ไม่มีคำบรรยาย", - "buff.title.heal": "สถานะฟื้นฟู", - "buff.desc.heal": "ฟื้นฟูพลังชีวิตเป็นช่วง ๆ", - "buff.title.potion": "ยา", - "buff.desc.potion": "กำลังดื่มด่ำกับยา...", - "buff.title.saturation": "สถานะท้องอิ่ม", - "buff.desc.saturation": "พื้นฟูพลังชีวิตเป็นช่วง ๆ เมื่อทานอาหาร", - "buff.title.campfire_heal": "พักผ่อน ณ แคมป์ไฟ", - "buff.desc.campfire_heal": "เมื่อนั่งพักที่แคมป์ไฟจะช่วยพื้นฟูพลังชีวิต {rate}% ต่อวินาที", - "buff.title.invulnerability": "สถานะอมตะ", - "buff.desc.invulnerability": "ไม่เสียพลังชีวิตเมื่อถูกโจมตี", - "buff.title.protectingward": "สถานะพรคุ้มครอง", - "buff.desc.protectingward": "พระกำลังคุ้มครอง เสียพลังชีวิตเล็กน้อยเมื่อถูกโจมตี", - "buff.title.frenzied": "สถานะบ้าคลั่ง", - "buff.desc.frenzied": "วิ่งเร็วขึ้นอย่างมาก ความเสียหลายเล้กน้อยไม่สามารถหยุดคุณได้", - "buff.title.hastened": "สถานะเครื่องติด", - "buff.desc.hastened": "ความเร็วในการโจมตีและเคลื่อนที่เพิ่มขึ้น", - // Debuffs - "buff.title.bleed": "สถานะเลือดไหล", - "buff.desc.bleed": "ได้รับความเสียหายแบบธรรมดา ๆ", - "buff.title.cursed": "สถานะต้องสาป", - "buff.desc.cursed": "ฉันขอฉาบแก!", - "buff.title.burn": "สถานะไฟลุก", - "buff.desc.burn": "ก้าวแรกไม่เป็นไร ก้าวต่อไป...", - "buff.title.crippled": "สถานะขาหัก", - "buff.desc.crippled": "ขาได้รับบาดเจ็บ เคลื่อนไหวได้ช้าลง", - "buff.title.frozen": "สถานะแช่แข็ง", - "buff.desc.frozen": "ความเร็วในการโจมตีและเคลื่อนที่ลดลง", - "buff.title.wet": "สถานะเปียก", - "buff.desc.wet": "พื้นลื่นมาก ๆ ระวังหกล้ม", - "buff.title.ensnared": "สถานะพฤกษาบ่วงรัด", - "buff.desc.ensnared": "เถาวัลย์กำลังรัดขา ขยับไปไหนไม่ได้เลย", - // Buffs stats - "buff.stat.health": "ฟื้นฟูพลังชีวิต {str_total} หน่วย", - "buff.stat.increase_max_energy": "เพิ่มพลังงานสูงสุด {strength} หน่วย", - "buff.stat.increase_max_health": "เพิ่มพลังชีวิตสูงสุด {strength} หน่วย", - "buff.stat.invulnerability": "มอบ สถานะอมตา", - // Text - "buff.text.over_seconds": "ในช่วงเวลา {dur_secs} วินาที", - "buff.text.for_seconds": "เป็นเวลา {dur_secs} วินาที", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/char_selection.ftl b/assets/voxygen/i18n/th_TH/char_selection.ftl new file mode 100644 index 0000000000..a4fb8d7149 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = อยู่ระหว่างการโหลดตัวละคร ... +char_selection-delete_permanently = ลบตัวละครทิ้งหรือไม่? +char_selection-deleting_character = อยู่ระหว่างการลบตัวละคร ... +char_selection-change_server = เปลี่ยนเซิร์ฟเวอร์ +char_selection-enter_world = เข้าสู่โลก +char_selection-logout = ออกจากเกม +char_selection-create_new_character = สร้างตัวละครใหม่ +char_selection-creating_character = อยู่ระหว่างการสร้างตัวละคร... +char_selection-character_creation = ปรับแต่งตัวละคร +char_selection-human_default = มนุษย์ธรรมดา +char_selection-level_fmt = เลเวล { $level_nb } +char_selection-uncanny_valley = ป่าดงพงไพร +char_selection-plains_of_uncertainty = ที่ราบที่ไม่น่าไว้วางใจ +char_selection-beard = หนวด +char_selection-hair_style = ทรงผม +char_selection-hair_color = สีผม +char_selection-eye_color = สีตา +char_selection-skin = ผิว +char_selection-eyeshape = รายละเอียดดวงตา +char_selection-accessories = เครื่องประดับ +char_selection-create_info_name = ตัวละครต้องมีชื่อนะ! +char_selection-version_mismatch = คำเตือน! เวอร์ชั่นเกมของคุณกับของเซิร์ฟเวอร์ไม่ตรงกัน กรุณาอัปเดทเกม \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/char_selection.ron b/assets/voxygen/i18n/th_TH/char_selection.ron deleted file mode 100644 index 5dc52f5f5c..0000000000 --- a/assets/voxygen/i18n/th_TH/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "char_selection.loading_characters": "อยู่ระหว่างการโหลดตัวละคร ...", - "char_selection.delete_permanently": "ลบตัวละครทิ้งหรือไม่?", - "char_selection.deleting_character": "อยู่ระหว่างการลบตัวละคร ...", - "char_selection.change_server": "เปลี่ยนเซิร์ฟเวอร์", - "char_selection.enter_world": "เข้าสู่โลก", - "char_selection.logout": "ออกจากเกม", - "char_selection.create_new_character": "สร้างตัวละครใหม่", - "char_selection.creating_character": "อยู่ระหว่างการสร้างตัวละคร...", - "char_selection.character_creation": "ปรับแต่งตัวละคร", - "char_selection.human_default": "มนุษย์ธรรมดา", - "char_selection.level_fmt": "เลเวล {level_nb}", - "char_selection.uncanny_valley": "ป่าดงพงไพร", - "char_selection.plains_of_uncertainty": "ที่ราบที่ไม่น่าไว้วางใจ", - "char_selection.beard": "หนวด", - "char_selection.hair_style": "ทรงผม", - "char_selection.hair_color": "สีผม", - "char_selection.eye_color": "สีตา", - "char_selection.skin": "ผิว", - "char_selection.eyeshape": "รายละเอียดดวงตา", - "char_selection.accessories": "เครื่องประดับ", - "char_selection.create_info_name": "ตัวละครต้องมีชื่อนะ!", - "char_selection.version_mismatch": "คำเตือน! เวอร์ชั่นเกมของคุณกับของเซิร์ฟเวอร์ไม่ตรงกัน กรุณาอัปเดทเกม", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/common.ftl b/assets/voxygen/i18n/th_TH/common.ftl new file mode 100644 index 0000000000..9242348b20 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/common.ftl @@ -0,0 +1,108 @@ +common-username = ชื่อผู้ใช้ +common-singleplayer = โหมดเล่นคนเดียว +common-multiplayer = โหมดเล่นหลายคน +common-servers = รายชื่อเซิร์ฟเวอร์ +common-quit = ปิดเกม +common-settings = ตั้งค่า +common-languages = ภาษา +common-interface = หน้าจอ +common-gameplay = เกมเพลย์ +common-controls = ปุ่มควบคุม +common-video = จอภาพ +common-sound = เสียง +common-chat = พูดคุย +common-resume = เริ่มเกมต่อ +common-characters = ตัวละคร +common-close = ปิด +common-yes = ตกลก +common-no = ปฏิเสธ +common-back = กลับ +common-create = สร้าง +common-okay = โอเค +common-add = เพิ่ม +common-accept = ยอมรับ +common-decline = ปฏิเสธ +common-disclaimer = ระวัง +common-cancel = ยกเลิก +common-none = ไม่มี +common-error = ผิดพลาด +common-fatal_error = ผิดพลาดรุนแรง +common-you = คุณ +common-automatic = ออโต้ +common-random = สุ่ม +common-empty = ว่าง +common-confirm = ตกลง +common-delete_server = ลบเซิร์ฟเวอร์ +common-interface_settings = ตั้งค่าหน้าจอ +common-gameplay_settings = ตั้งค่าเกมเพลย์ +common-controls_settings = ตั้งค่าปุ่มควบคุม +common-video_settings = ตั้งค่ากราฟฟิก +common-sound_settings = ตั้งค่าเสียง +common-language_settings = ตั้งค่าภาษา +common-chat_settings = ตั้งค่าการสนทนา +common-connection_lost = + โอ๊ะโอ้ว การเชื่อมต่อจะถูกจากเซิร์ฟเวอร์ + อาจะเป็นเพราะเซิร์ฟเวอร์ถูกปิด + หรือเพราะตัวเกมไม่ใช่เวอร์ชั่นล่าสุด +common-species-orc = ออร์ค +common-species-human = มนุษย์ +common-species-dwarf = คนแคระ +common-species-elf = เอลฟ์ +common-species-draugr = ภูตผี +common-species-danari = ดานาริ +common-weapons-axe = ขวาน +common-weapons-dagger = มีดสั้น +common-weapons-greatsword = ดาบใหญ่ +common-weapons-shortswords = ดาบสั้น +common-weapons-sword = ดาบ +common-weapons-staff = คถาอัคนี +common-weapons-bow = ธนู +common-weapons-hammer = ค้อน +common-weapons-general = ทั่วไป +common-weapons-sceptre = คถาอภิรักษ์ +common-weapons-shield = โล่ +common-weapons-spear = หอก +common-weapons-hammer_simple = ค้อนอย่างง่าย +common-weapons-sword_simple = ดาบอย่างง่าย +common-weapons-staff_simple = คถาอัคนีอย่างง่าย +common-weapons-axe_simple = ขวานอย่างง่าย +common-weapons-bow_simple = ธนูอย่างง่าย +common-weapons-unique = แปลกไม่เหมือนใคร +common-tool-debug = ดีบัค +common-tool-farming = เครื่องมือการเกษตร +common-tool-pick = พลั่ว +common-tool-mining = การขุดหิน +common-kind-modular_component = ส่วนประกอบ +common-kind-modular_component_partial = วัสดุ +common-kind-glider = เครื่องร่อน +common-kind-consumable = ของใช้ +common-kind-throwable = ของใช้ชนิดปา +common-kind-utility = อุปกรณ์ของใช้ +common-kind-ingredient = วัตถุดิบ +common-kind-lantern = ตะเกียง +common-hands-one = จับมือเดียว +common-hands-two = จับสองมือ +common-rand_appearance = สุ่มภาพลักษณ์ +common-rand_name = สุ่มชื่อ +common-stats-combat_rating = ค่าอุปกรณ์ +common-stats-power = พลังโจมตี +common-stats-speed = ความเร็ว +common-stats-poise = ค่าทรงตัว +common-stats-range = ระยะโจมตี +common-stats-energy_efficiency = ประสิทธิภาพพลังงาน +common-stats-buff_strength = เสริมพลังความแข็งแกร่ง +common-stats-crit_chance = โอกาสคริติคอล +common-stats-crit_mult = ความรุนแรงคริติคอล +common-stats-armor = เกราะ +common-stats-poise_res = ความคงทน +common-stats-energy_max = พลังงานสูงสุด +common-stats-energy_reward = อัตราฟื้นฟูพลังงาน +common-stats-crit_power = ความรุนแรงของคริติคอล +common-stats-stealth = ลดการถูกตรวจจับ +common-stats-slots = จำนวนช่อง +common-material-metal = โลหะ +common-material-wood = ไม้ +common-material-stone = หิน +common-material-cloth = ผ้า +common-material-hide = หนังสัตว์ +common-sprite-chest = กล่องสมบัติ \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/common.ron b/assets/voxygen/i18n/th_TH/common.ron deleted file mode 100644 index cbcf706f22..0000000000 --- a/assets/voxygen/i18n/th_TH/common.ron +++ /dev/null @@ -1,130 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "ชื่อผู้ใช้", - "common.singleplayer": "โหมดเล่นคนเดียว", - "common.multiplayer": "โหมดเล่นหลายคน", - "common.servers": "รายชื่อเซิร์ฟเวอร์", - "common.quit": "ปิดเกม", - "common.settings": "ตั้งค่า", - "common.languages": "ภาษา", - "common.interface": "หน้าจอ", - "common.gameplay": "เกมเพลย์", - "common.controls": "ปุ่มควบคุม", - "common.video": "จอภาพ", - "common.sound": "เสียง", - "common.chat": "พูดคุย", - "common.resume": "เริ่มเกมต่อ", - "common.characters": "ตัวละคร", - "common.close": "ปิด", - "common.yes": "ตกลก", - "common.no": "ปฏิเสธ", - "common.back": "กลับ", - "common.create": "สร้าง", - "common.okay": "โอเค", - "common.add": "เพิ่ม", - "common.accept": "ยอมรับ", - "common.decline": "ปฏิเสธ", - "common.disclaimer": "ระวัง", - "common.cancel": "ยกเลิก", - "common.none": "ไม่มี", - "common.error": "ผิดพลาด", - "common.fatal_error": "ผิดพลาดรุนแรง", - "common.you": "คุณ", - "common.automatic": "ออโต้", - "common.random": "สุ่ม", - "common.empty": "ว่าง", - "common.confirm": "ตกลง", - "common.delete_server": "ลบเซิร์ฟเวอร์", - - // Settings Window title - "common.interface_settings": "ตั้งค่าหน้าจอ", - "common.gameplay_settings": "ตั้งค่าเกมเพลย์", - "common.controls_settings": "ตั้งค่าปุ่มควบคุม", - "common.video_settings": "ตั้งค่ากราฟฟิก", - "common.sound_settings": "ตั้งค่าเสียง", - "common.language_settings": "ตั้งค่าภาษา", - "common.chat_settings": "ตั้งค่าการสนทนา", - - // Message when connection to the server is lost - "common.connection_lost": r#"โอ๊ะโอ้ว การเชื่อมต่อจะถูกจากเซิร์ฟเวอร์ -อาจะเป็นเพราะเซิร์ฟเวอร์ถูกปิด -หรือเพราะตัวเกมไม่ใช่เวอร์ชั่นล่าสุด"#, - - - "common.species.orc": "ออร์ค", - "common.species.human": "มนุษย์", - "common.species.dwarf": "คนแคระ", - "common.species.elf": "เอลฟ์", - "common.species.draugr": "ภูตผี", - "common.species.danari": "ดานาริ", - - "common.weapons.axe": "ขวาน", - "common.weapons.dagger": "มีดสั้น", - "common.weapons.greatsword": "ดาบใหญ่", - "common.weapons.shortswords": "ดาบสั้น", - "common.weapons.sword": "ดาบ", - "common.weapons.staff": "คถาอัคนี", - "common.weapons.bow": "ธนู", - "common.weapons.hammer": "ค้อน", - "common.weapons.general": "ทั่วไป", - "common.weapons.sceptre": "คถาอภิรักษ์", - "common.weapons.shield": "โล่", - "common.weapons.spear": "หอก", - "common.weapons.hammer_simple": "ค้อนอย่างง่าย", - "common.weapons.sword_simple": "ดาบอย่างง่าย", - "common.weapons.staff_simple": "คถาอัคนีอย่างง่าย", - "common.weapons.axe_simple": "ขวานอย่างง่าย", - "common.weapons.bow_simple": "ธนูอย่างง่าย", - "common.weapons.unique": "แปลกไม่เหมือนใคร", - "common.tool.debug": "ดีบัค", - "common.tool.farming": "เครื่องมือการเกษตร", - "common.tool.pick": "พลั่ว", - "common.tool.mining": "การขุดหิน", - "common.kind.modular_component": "ส่วนประกอบ", - "common.kind.modular_component_partial": "วัสดุ", - "common.kind.glider": "เครื่องร่อน", - "common.kind.consumable": "ของใช้", - "common.kind.throwable": "ของใช้ชนิดปา", - "common.kind.utility": "อุปกรณ์ของใช้", - "common.kind.ingredient": "วัตถุดิบ", - "common.kind.lantern": "ตะเกียง", - "common.hands.one": "จับมือเดียว", - "common.hands.two": "จับสองมือ", - - "common.rand_appearance": "สุ่มภาพลักษณ์", - "common.rand_name": "สุ่มชื่อ", - - "common.stats.combat_rating": "ค่าอุปกรณ์", - "common.stats.power": "พลังโจมตี", - "common.stats.speed": "ความเร็ว", - "common.stats.poise": "ค่าทรงตัว", - "common.stats.range": "ระยะโจมตี", - "common.stats.energy_efficiency": "ประสิทธิภาพพลังงาน", - "common.stats.buff_strength": "เสริมพลังความแข็งแกร่ง", - "common.stats.crit_chance": "โอกาสคริติคอล", - "common.stats.crit_mult": "ความรุนแรงคริติคอล", - "common.stats.armor": "เกราะ", - "common.stats.poise_res":"ความคงทน", - "common.stats.energy_max": "พลังงานสูงสุด", - "common.stats.energy_reward": "อัตราฟื้นฟูพลังงาน", - "common.stats.crit_power": "ความรุนแรงของคริติคอล", - "common.stats.stealth": "ลดการถูกตรวจจับ", - "common.stats.slots": "จำนวนช่อง", - - "common.material.metal": "โลหะ", - "common.material.wood": "ไม้", - "common.material.stone": "หิน", - "common.material.cloth": "ผ้า", - "common.material.hide": "หนังสัตว์", - - "common.sprite.chest": "กล่องสมบัติ", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/esc_menu.ftl b/assets/voxygen/i18n/th_TH/esc_menu.ftl new file mode 100644 index 0000000000..4c998142f8 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = ออกจากระบบ +esc_menu-quit_game = ออกจากเกม \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/esc_menu.ron b/assets/voxygen/i18n/th_TH/esc_menu.ron deleted file mode 100644 index 70527325ba..0000000000 --- a/assets/voxygen/i18n/th_TH/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "esc_menu.logout": "ออกจากระบบ", - "esc_menu.quit_game": "ออกจากเกม", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/gameinput.ftl b/assets/voxygen/i18n/th_TH/gameinput.ftl new file mode 100644 index 0000000000..6b761edcde --- /dev/null +++ b/assets/voxygen/i18n/th_TH/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = โจมตีปกติ +gameinput-secondary = โจมตีพิเศษ +gameinput-block = บล็อค +gameinput-slot1 = แถบของใช้ช่องที่ 1 +gameinput-slot2 = แถบของใช้ช่องที่ 2 +gameinput-slot3 = แถบของใช้ช่องที่ 3 +gameinput-slot4 = แถบของใช้ช่องที่ 4 +gameinput-slot5 = แถบของใช้ช่องที่ 5 +gameinput-slot6 = แถบของใช้ช่องที่ 6 +gameinput-slot7 = แถบของใช้ช่องที่ 7 +gameinput-slot8 = แถบของใช้ช่องที่ 8 +gameinput-slot9 = แถบของใช้ช่องที่ 9 +gameinput-slot10 = แถบของใช้ช่องที่ 10 +gameinput-swaploadout = สลับอุปกรณ์สวมใส่ +gameinput-togglecursor = เปิด/ปิดเมาส์ +gameinput-help = เปิด/ปิดข้อความช่วยเหลือ +gameinput-toggleinterface = เปิด/ปิดหน้าต่างข้อมูล +gameinput-toggledebug = เปิด/ปิดข้อมูลดีบัค +gameinput-toggle_egui_debug = เปิด/ปิดข้อมูลดีบัคของ GUI +gameinput-togglechat = เปิด/ปิดช่องสนทนา +gameinput-screenshot = ถ่ายภาพหน้าจอ +gameinput-toggleingameui = เปิด/ปิดชื่อผู้เล่น +gameinput-fullscreen = ใช้โหมด Fullscreen +gameinput-moveforward = เดินหน้า +gameinput-moveleft = เดินทางซ้าย +gameinput-moveright = เดินทางขวา +gameinput-moveback = ถอยหลัง +gameinput-jump = กระโดด +gameinput-glide = ใช้เครื่องร่อน +gameinput-roll = กลิ้ง +gameinput-climb = ปีน +gameinput-climbdown = ปีนลง +gameinput-wallleap = กระโดดข้ามกำแพง +gameinput-togglelantern = จุด/ดับตะเกียง +gameinput-mount = ขี่สัตว์เลี้ยง +gameinput-chat = สนทนากับผู้เล่น +gameinput-command = คำสั่ง +gameinput-escape = หนีจากพื้นที่ +gameinput-map = แผนที่ +gameinput-bag = กระเป๋า +gameinput-trade = แลกของ +gameinput-social = สังคม +gameinput-sit = นั่ง +gameinput-spellbook = หนังสือเวทย์มนต์ +gameinput-settings = การตั้งค่า +gameinput-respawn = เกิดใหม่ +gameinput-charge = ชสร์ต +gameinput-togglewield = สลับมือ +gameinput-interact = สัมผัสสิ่งของ +gameinput-freelook = ปลดล็อคกล้อง +gameinput-autowalk = เดินหน้าอัตโนมัต +gameinput-cameraclamp = ล็อคหน้าจอ +gameinput-dance = เต้น +gameinput-select = เลือกสิ่งต่าง ๆ +gameinput-acceptgroupinvite = ยอมรับคำเชิญเข้าปาร์ตี้ +gameinput-declinegroupinvite = ปฏิเสธคำเชิญเข้าปาร์ตี้ +gameinput-cyclecamera = หมุนมุมกล้อง +gameinput-crafting = สร้างสิ่งของ +gameinput-fly = บิน +gameinput-sneak = ย่อง +gameinput-swimdown = ดำน้ำ +gameinput-swimup = ขึ้นสู่ผิวน้ำ +gameinput-mapzoomin = ซูมเข้าแผนที่ +gameinput-mapzoomout = ซูมออกแผนที่ +gameinput-greet = ทักทาย +gameinput-map-locationmarkerbutton = ปักหมุดในแผนที่ \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/gameinput.ron b/assets/voxygen/i18n/th_TH/gameinput.ron deleted file mode 100644 index 56fef5e92c..0000000000 --- a/assets/voxygen/i18n/th_TH/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "gameinput.primary": "โจมตีปกติ", - "gameinput.secondary": "โจมตีพิเศษ", - "gameinput.block": "บล็อค", - "gameinput.slot1": "แถบของใช้ช่องที่ 1", - "gameinput.slot2": "แถบของใช้ช่องที่ 2", - "gameinput.slot3": "แถบของใช้ช่องที่ 3", - "gameinput.slot4": "แถบของใช้ช่องที่ 4", - "gameinput.slot5": "แถบของใช้ช่องที่ 5", - "gameinput.slot6": "แถบของใช้ช่องที่ 6", - "gameinput.slot7": "แถบของใช้ช่องที่ 7", - "gameinput.slot8": "แถบของใช้ช่องที่ 8", - "gameinput.slot9": "แถบของใช้ช่องที่ 9", - "gameinput.slot10": "แถบของใช้ช่องที่ 10", - "gameinput.swaploadout": "สลับอุปกรณ์สวมใส่", - "gameinput.togglecursor": "เปิด/ปิดเมาส์", - "gameinput.help": "เปิด/ปิดข้อความช่วยเหลือ", - "gameinput.toggleinterface": "เปิด/ปิดหน้าต่างข้อมูล", - "gameinput.toggledebug": "เปิด/ปิดข้อมูลดีบัค", - "gameinput.toggle_egui_debug": "เปิด/ปิดข้อมูลดีบัคของ GUI", - "gameinput.togglechat": "เปิด/ปิดช่องสนทนา", - "gameinput.screenshot": "ถ่ายภาพหน้าจอ", - "gameinput.toggleingameui": "เปิด/ปิดชื่อผู้เล่น", - "gameinput.fullscreen": "ใช้โหมด Fullscreen", - "gameinput.moveforward": "เดินหน้า", - "gameinput.moveleft": "เดินทางซ้าย", - "gameinput.moveright": "เดินทางขวา", - "gameinput.moveback": "ถอยหลัง", - "gameinput.jump": "กระโดด", - "gameinput.glide": "ใช้เครื่องร่อน", - "gameinput.roll": "กลิ้ง", - "gameinput.climb": "ปีน", - "gameinput.climbdown": "ปีนลง", - "gameinput.wallleap": "กระโดดข้ามกำแพง", - "gameinput.togglelantern": "จุด/ดับตะเกียง", - "gameinput.mount": "ขี่สัตว์เลี้ยง", - "gameinput.chat": "สนทนากับผู้เล่น", - "gameinput.command": "คำสั่ง", - "gameinput.escape": "หนีจากพื้นที่", - "gameinput.map": "แผนที่", - "gameinput.bag": "กระเป๋า", - "gameinput.trade": "แลกของ", - "gameinput.social": "สังคม", - "gameinput.sit": "นั่ง", - "gameinput.spellbook": "หนังสือเวทย์มนต์", - "gameinput.settings": "การตั้งค่า", - "gameinput.respawn": "เกิดใหม่", - "gameinput.charge": "ชสร์ต", - "gameinput.togglewield": "สลับมือ", - "gameinput.interact": "สัมผัสสิ่งของ", - "gameinput.freelook": "ปลดล็อคกล้อง", - "gameinput.autowalk": "เดินหน้าอัตโนมัต", - "gameinput.cameraclamp": "ล็อคหน้าจอ", - "gameinput.dance": "เต้น", - "gameinput.select": "เลือกสิ่งต่าง ๆ", - "gameinput.acceptgroupinvite": "ยอมรับคำเชิญเข้าปาร์ตี้", - "gameinput.declinegroupinvite": "ปฏิเสธคำเชิญเข้าปาร์ตี้", - "gameinput.cyclecamera": "หมุนมุมกล้อง", - "gameinput.crafting": "สร้างสิ่งของ", - "gameinput.fly": "บิน", - "gameinput.sneak": "ย่อง", - "gameinput.swimdown": "ดำน้ำ", - "gameinput.swimup": "ขึ้นสู่ผิวน้ำ", - "gameinput.mapzoomin": "ซูมเข้าแผนที่", - "gameinput.mapzoomout": "ซูมออกแผนที่", - "gameinput.greet": "ทักทาย", - "gameinput.map.locationmarkerbutton": "ปักหมุดในแผนที่" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/bag.ftl b/assets/voxygen/i18n/th_TH/hud/bag.ftl new file mode 100644 index 0000000000..ac23fa7de8 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/bag.ftl @@ -0,0 +1,37 @@ +hud-bag-inventory = สัมภาระของ { $playername } +hud-bag-stats_title = ข้อมูลสถานะของ { $playername } +hud-bag-exp = ค่าประสบการณ์ +hud-bag-armor = เกราะ +hud-bag-stats = สถานะ +hud-bag-head = ศรีษะ +hud-bag-neck = คอ +hud-bag-tabard = ชุดทับเกราะ +hud-bag-shoulders = ไหล่ +hud-bag-chest = ลำตัว +hud-bag-hands = มือ +hud-bag-lantern = ตะเกียง +hud-bag-glider = เครื่องร่อน +hud-bag-belt = เข็มขัด +hud-bag-ring = แหวน +hud-bag-back = หลัง +hud-bag-legs = ขา +hud-bag-feet = เท่า +hud-bag-mainhand = มือข้างถนัด +hud-bag-offhand = มืออีกข้าง +hud-bag-inactive_mainhand = มือข้างถนัด (ไม่ได้ใช้งาน) +hud-bag-inactive_offhand = มืออีกข้าง (ไม่ได้ใช้งาน) +hud-bag-swap_equipped_weapons_title = สลับอาวุธที่ส่วมอยู่ +hud-bag-swap_equipped_weapons_desc = กด { $key } +hud-bag-bag = กระเป๋า +hud-bag-health = พลังชีวิต +hud-bag-energy = พลังงาน +hud-bag-combat_rating = ค่าอุปกรณ์ +hud-bag-protection = ค่าการป้องกัน +hud-bag-stun_res = ความต้านทานต่อการถูกสตัน +hud-bag-stealth = อัตราการตรวจับ +hud-bag-combat_rating_desc = นับจากอุปกรณ์ที่คุณกำลังสวมใส่และพลังชีวิต +hud-bag-protection_desc = ลดความเสียหายที่ได้รับ +hud-bag-stun_res_desc = ความทนทานต่อการถูกสตันเมื่อถูกโจมตี พื้นฟูเหมือนพลังชีวิตและพลังงาน +hud-bag-sort_by_name = จัดเรียงตามชื่อ +hud-bag-sort_by_quality = จัดเรียงตามคุณภาพ +hud-bag-sort_by_category = จัดเรียงตามประเภท \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/bag.ron b/assets/voxygen/i18n/th_TH/hud/bag.ron deleted file mode 100644 index 86467a01ee..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/bag.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - // Inventory - "hud.bag.inventory": "สัมภาระของ {playername}", - "hud.bag.stats_title": "ข้อมูลสถานะของ {playername}", - "hud.bag.exp": "ค่าประสบการณ์", - "hud.bag.armor": "เกราะ", - "hud.bag.stats": "สถานะ", - "hud.bag.head": "ศรีษะ", - "hud.bag.neck": "คอ", - "hud.bag.tabard": "ชุดทับเกราะ", - "hud.bag.shoulders": "ไหล่", - "hud.bag.chest": "ลำตัว", - "hud.bag.hands": "มือ", - "hud.bag.lantern": "ตะเกียง", - "hud.bag.glider": "เครื่องร่อน", - "hud.bag.belt": "เข็มขัด", - "hud.bag.ring": "แหวน", - "hud.bag.back": "หลัง", - "hud.bag.legs": "ขา", - "hud.bag.feet": "เท่า", - "hud.bag.mainhand": "มือข้างถนัด", - "hud.bag.offhand": "มืออีกข้าง", - "hud.bag.inactive_mainhand": "มือข้างถนัด (ไม่ได้ใช้งาน)", - "hud.bag.inactive_offhand": "มืออีกข้าง (ไม่ได้ใช้งาน)", - "hud.bag.swap_equipped_weapons_title": "สลับอาวุธที่ส่วมอยู่", - "hud.bag.swap_equipped_weapons_desc": "กด {key}", - "hud.bag.bag": "กระเป๋า", - "hud.bag.health": "พลังชีวิต", - "hud.bag.energy": "พลังงาน", - "hud.bag.combat_rating": "ค่าอุปกรณ์", - "hud.bag.protection": "ค่าการป้องกัน", - "hud.bag.stun_res": "ความต้านทานต่อการถูกสตัน", - "hud.bag.stealth": "อัตราการตรวจับ", - "hud.bag.combat_rating_desc": "นับจากอุปกรณ์ที่คุณกำลังสวมใส่และพลังชีวิต", - "hud.bag.protection_desc": "ลดความเสียหายที่ได้รับ", - "hud.bag.stun_res_desc": "ความทนทานต่อการถูกสตันเมื่อถูกโจมตี พื้นฟูเหมือนพลังชีวิตและพลังงาน", - "hud.bag.sort_by_name": "จัดเรียงตามชื่อ", - "hud.bag.sort_by_quality": "จัดเรียงตามคุณภาพ", - "hud.bag.sort_by_category": "จัดเรียงตามประเภท", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/char_window.ftl b/assets/voxygen/i18n/th_TH/hud/char_window.ftl new file mode 100644 index 0000000000..ed7c37594a --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = ชื่อตัวละคร +character_window-character_stats = + ความอึด + + ความฟิต + + ความมุ่งมั่น + + พลังป้องกัน \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/char_window.ron b/assets/voxygen/i18n/th_TH/hud/char_window.ron deleted file mode 100644 index 110cb95581..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "character_window.character_name": "ชื่อตัวละคร", - // Character stats - "character_window.character_stats": r#"ความอึด - -ความฟิต - -ความมุ่งมั่น - -พลังป้องกัน -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/chat.ftl b/assets/voxygen/i18n/th_TH/hud/chat.ftl new file mode 100644 index 0000000000..932f829486 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = ทั้งหมด +hud-chat-chat_tab_hover_tooltip = คลิกขวาเพื่อตั้งค่า +hud-outcome-burning = เสียชีวิต เพราะถูกไฟคลอก +hud-outcome-curse = เสียชีวิต เพราะถูกคำสาป +hud-outcome-bleeding = เสียชีวิต เพราะเลือดไหล +hud-outcome-crippled = เสียชีวิต เพราะขาหัก +hud-outcome-frozen = เสียชีวิต เพราะกลายเป็นไอศกรีมแช่แข็ง +hud-chat-online_msg = [{ $name }] กำลังออนไลน์ +hud-chat-offline_msg = [{ $name }] ออกจากเกม +hud-chat-default_death_msg = [{ $name }] เสียชีวิต +hud-chat-environmental_kill_msg = [{ $name }] เสียชีวิตในสภาพแวดล้อม { $environment } +hud-chat-fall_kill_msg = [{ $name }] เสียชีวิต เพราะตกพื้นแรงไปหน่อย +hud-chat-suicide_msg = [{ $name }] เสียชีวิต เพราะทำร้ายตัวเอง (???) +hud-chat-died_of_pvp_buff_msg = [{ $victim }] ถูกสังหารโดย [{ $attacker }] จากการใช้ { $died_of_buff } +hud-chat-pvp_melee_kill_msg = [{ $attacker }] สังหาร [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $victim }] โดนลั่นหัวคม ๆ โดย [{ $attacker }] +hud-chat-pvp_explosion_kill_msg = [{ $victim }] โดนระเบิดเป็นชิ้น ๆ โดย [{ $attacker }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] สังหาร [{ $victim }] ด้วยไสยเวทย์ +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] เสียชีวิต เพราะ { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] ถูกสังหารโดย { $attacker } จากการใช้ { $died_of_buff } น่าเเห็นใจ +hud-chat-npc_melee_kill_msg = { $attacker } สังหาร [{ $victim }] น่าเเห็นใจ +hud-chat-npc_ranged_kill_msg = [{ $victim }] โดนลั่นหัวคม ๆ โดย { $attacker } น่าเห็นใจ +hud-chat-npc_explosion_kill_msg = [{ $victim }] โดนระเบิดเป็นชิ้น ๆ โดย { $attacker } น่าเเห็นใจ +hud-chat-npc_energy_kill_msg = { $attacker } สังหาร [{ $victim }] ด้วยไสยเวทย์ น่าเเห็นใจ +hud-chat-npc_other_kill_msg = [{ $victim }] ถูกสังหารโดย { $attacker } น่าเเห็นใจ +hud-chat-loot_msg = ได้รับ [{ $item }] +hud-chat-loot_fail = กระเป๋าเต็มแล้ว +hud-chat-goodbye = ลาก่อน +hud-chat-connection_lost = ถูกตัดการเชื่อมต่อ เชื่อมต่อใหม่ในอีก { $time } วินาที \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/chat.ron b/assets/voxygen/i18n/th_TH/hud/chat.ron deleted file mode 100644 index 28951f7225..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.chat.all": "ทั้งหมด", - "hud.chat.chat_tab_hover_tooltip": "คลิกขวาเพื่อตั้งค่า", - - // Debuff outcomes - "hud.outcome.burning": "เสียชีวิต เพราะถูกไฟคลอก", - "hud.outcome.curse": "เสียชีวิต เพราะถูกคำสาป", - "hud.outcome.bleeding": "เสียชีวิต เพราะเลือดไหล", - "hud.outcome.crippled": "เสียชีวิต เพราะขาหัก", - "hud.outcome.frozen": "เสียชีวิต เพราะกลายเป็นไอศกรีมแช่แข็ง", - - // Chat outputs - "hud.chat.online_msg": "[{name}] กำลังออนไลน์", - "hud.chat.offline_msg": "[{name}] ออกจากเกม", - - "hud.chat.default_death_msg": "[{name}] เสียชีวิต", - "hud.chat.environmental_kill_msg": "[{name}] เสียชีวิตในสภาพแวดล้อม {environment}", - "hud.chat.fall_kill_msg": "[{name}] เสียชีวิต เพราะตกพื้นแรงไปหน่อย", - "hud.chat.suicide_msg": "[{name}] เสียชีวิต เพราะทำร้ายตัวเอง (???)", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] ถูกสังหารโดย [{attacker}] จากการใช้ {died_of_buff}", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] สังหาร [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{victim}] โดนลั่นหัวคม ๆ โดย [{attacker}]", - "hud.chat.pvp_explosion_kill_msg": "[{victim}] โดนระเบิดเป็นชิ้น ๆ โดย [{attacker}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] สังหาร [{victim}] ด้วยไสยเวทย์", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] เสียชีวิต เพราะ {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] ถูกสังหารโดย {attacker} จากการใช้ {died_of_buff} น่าเเห็นใจ", - "hud.chat.npc_melee_kill_msg": "{attacker} สังหาร [{victim}] น่าเเห็นใจ", - "hud.chat.npc_ranged_kill_msg": "[{victim}] โดนลั่นหัวคม ๆ โดย {attacker} น่าเห็นใจ", - "hud.chat.npc_explosion_kill_msg": "[{victim}] โดนระเบิดเป็นชิ้น ๆ โดย {attacker} น่าเเห็นใจ", - "hud.chat.npc_energy_kill_msg": "{attacker} สังหาร [{victim}] ด้วยไสยเวทย์ น่าเเห็นใจ", - "hud.chat.npc_other_kill_msg": "[{victim}] ถูกสังหารโดย {attacker} น่าเเห็นใจ", - - "hud.chat.loot_msg": "ได้รับ [{item}]", - "hud.chat.loot_fail": "กระเป๋าเต็มแล้ว", - "hud.chat.goodbye": "ลาก่อน", - "hud.chat.connection_lost": "ถูกตัดการเชื่อมต่อ เชื่อมต่อใหม่ในอีก {time} วินาที", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/crafting.ftl b/assets/voxygen/i18n/th_TH/hud/crafting.ftl new file mode 100644 index 0000000000..beec17240a --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/crafting.ftl @@ -0,0 +1,42 @@ +hud-crafting = สร้างสิ่งของ +hud-crafting-recipes = สูตรการสร้าง +hud-crafting-ingredients = วัตถุดิบ: +hud-crafting-craft = สร้าง +hud-crafting-tool_cata = สิ่งที่ต้องใช้: +hud-crafting-req_crafting_station = สิ่งที่ต้องใช้: +hud-crafting-anvil = ทั่ง +hud-crafting-cauldron = หม้อต้มยา +hud-crafting-cooking_pot = หม้อธรรมดา +hud-crafting-crafting_bench = โต๊ะของช่าง +hud-crafting-forge = เตาหลอม +hud-crafting-loom = กี่ทอผ้า +hud-crafting-spinning_wheel = เครื่องกรอไหม +hud-crafting-tanning_rack = ราวตากหนังสัตว์ +hud-crafting-salvaging_station = โต๊ะย่อย +hud-crafting-campfire = แคมป์ไฟ +hud-crafting-tabs-all = ทุกอย่าง +hud-crafting-tabs-armor = เกราะ +hud-crafting-tabs-dismantle = ย่อย +hud-crafting-tabs-food = อาหาร +hud-crafting-tabs-glider = เครื่องร่อย +hud-crafting-tabs-potion = ยา +hud-crafting-tabs-tool = เครื่องมือ +hud-crafting-tabs-utility = อื่น ๆ +hud-crafting-tabs-weapon = อาวุธ +hud-crafting-tabs-bag = กระเป๋า +hud-crafting-tabs-processed_material = แร่หลอมแล้วและอัญมนี +hud-crafting-dismantle_title = การย่อย +hud-crafting-dismantle_explanation = + เอาไปในชี้ที่กระเป๋าเพื่อดูไอเทมที่สามารถย่อยได้ + คลิกสองครั้งเพื่อย่อยไอเทม +hud-crafting-modular_desc = หยิบส่วนประกอบมาวางเพื่อสร้างอาวุธ +hud-crafting-mod_weap_prim_slot_title = ส่วนประกอบหลักของอาวุธ +hud-crafting-mod_weap_prim_slot_desc = นำส่วนประกอบหลักของอาวุธมาวางที่นี้ (เช่น ตัวดาบ, หัวขวาน หรือคันธนู) +hud-crafting-mod_weap_sec_slot_title = ส่วนประกอบรองของอาวุธ +hud-crafting-mod_weap_sec_slot_desc = นำส่วนประกอบรองของอาวุธมาวางที่นี้ (เช่น ด้ามดาบ, ที่จับคันธนู, หรือแกนคถา). +hud-crafting-mod_comp_metal_prim_slot_title = แท่งโลหะ +hud-crafting-mod_comp_metal_prim_slot_desc = นำแท่งโลหะมาวางที่นี้ โลหะบางชนิดไม่สามารถนำมาประกอบเป็นอาวุธได้ +hud-crafting-mod_comp_wood_prim_slot_title = ไม้ +hud-crafting-mod_comp_wood_prim_slot_desc = นำไม้มาวางที่นี้ ไม้บางชนิดไม่สามารถนำมาประกอบอาวุธได้ +hud-crafting-mod_comp_sec_slot_title = สัตว์วัตถุ +hud-crafting-mod_comp_sec_slot_desc = สามารถใช้ชิ้นส่วนสัตว์เพื่อเพิ่มประสิทธิภาพของอาวุธ ชิ้นส่วนจากสัตว์บางชนิดไม่สามารถนำมาใช้เพิ่มประสิทธิภาพได้ \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/crafting.ron b/assets/voxygen/i18n/th_TH/hud/crafting.ron deleted file mode 100644 index 8f2d6f00d2..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/crafting.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.crafting": "สร้างสิ่งของ", - "hud.crafting.recipes": "สูตรการสร้าง", - "hud.crafting.ingredients": "วัตถุดิบ:", - "hud.crafting.craft": "สร้าง", - "hud.crafting.tool_cata": "สิ่งที่ต้องใช้:", - // Crafting Stations - "hud.crafting.req_crafting_station": "สิ่งที่ต้องใช้:", - "hud.crafting.anvil": "ทั่ง", - "hud.crafting.cauldron": "หม้อต้มยา", - "hud.crafting.cooking_pot": "หม้อธรรมดา", - "hud.crafting.crafting_bench": "โต๊ะของช่าง", - "hud.crafting.forge": "เตาหลอม", - "hud.crafting.loom": "กี่ทอผ้า", - "hud.crafting.spinning_wheel": "เครื่องกรอไหม", - "hud.crafting.tanning_rack": "ราวตากหนังสัตว์", - "hud.crafting.salvaging_station": "โต๊ะย่อย", - "hud.crafting.campfire": "แคมป์ไฟ", - // Tabs - "hud.crafting.tabs.all": "ทุกอย่าง", - "hud.crafting.tabs.armor": "เกราะ", - "hud.crafting.tabs.dismantle": "ย่อย", - "hud.crafting.tabs.food": "อาหาร", - "hud.crafting.tabs.glider": "เครื่องร่อย", - "hud.crafting.tabs.potion": "ยา", - "hud.crafting.tabs.tool": "เครื่องมือ", - "hud.crafting.tabs.utility": "อื่น ๆ", - "hud.crafting.tabs.weapon": "อาวุธ", - "hud.crafting.tabs.bag": "กระเป๋า", - "hud.crafting.tabs.processed_material": "แร่หลอมแล้วและอัญมนี", - "hud.crafting.dismantle_title": "การย่อย", - "hud.crafting.dismantle_explanation" : "เอาไปในชี้ที่กระเป๋าเพื่อดูไอเทมที่สามารถย่อยได้\nคลิกสองครั้งเพื่อย่อยไอเทม", - "hud.crafting.modular_desc": "หยิบส่วนประกอบมาวางเพื่อสร้างอาวุธ", - "hud.crafting.mod_weap_prim_slot_title": "ส่วนประกอบหลักของอาวุธ", - "hud.crafting.mod_weap_prim_slot_desc": "นำส่วนประกอบหลักของอาวุธมาวางที่นี้ (เช่น ตัวดาบ, หัวขวาน หรือคันธนู)", - "hud.crafting.mod_weap_sec_slot_title": "ส่วนประกอบรองของอาวุธ", - "hud.crafting.mod_weap_sec_slot_desc": "นำส่วนประกอบรองของอาวุธมาวางที่นี้ (เช่น ด้ามดาบ, ที่จับคันธนู, หรือแกนคถา).", - "hud.crafting.mod_comp_metal_prim_slot_title": "แท่งโลหะ", - "hud.crafting.mod_comp_metal_prim_slot_desc": "นำแท่งโลหะมาวางที่นี้ โลหะบางชนิดไม่สามารถนำมาประกอบเป็นอาวุธได้", - "hud.crafting.mod_comp_wood_prim_slot_title": "ไม้", - "hud.crafting.mod_comp_wood_prim_slot_desc": "นำไม้มาวางที่นี้ ไม้บางชนิดไม่สามารถนำมาประกอบอาวุธได้", - "hud.crafting.mod_comp_sec_slot_title": "สัตว์วัตถุ", - "hud.crafting.mod_comp_sec_slot_desc": "สามารถใช้ชิ้นส่วนสัตว์เพื่อเพิ่มประสิทธิภาพของอาวุธ ชิ้นส่วนจากสัตว์บางชนิดไม่สามารถนำมาใช้เพิ่มประสิทธิภาพได้", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/group.ftl b/assets/voxygen/i18n/th_TH/hud/group.ftl new file mode 100644 index 0000000000..da731420b7 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = ปาร์ตี้ +hud-group-invite_to_join = ผู้เล่น [{ $name }] ต้องการชวนคุณเข้าปาร์ตี้! +hud-group-invite_to_trade = ผู้เล่น [{ $name }] ต้องการแลกของกับคุณ +hud-group-invite = เชิญชวน +hud-group-kick = เตะออก +hud-group-assign_leader = มอบตำแหน่งหัวหน้า +hud-group-leave = ออกจากปาร์ตี้ +hud-group-dead = เสียชีวิต +hud-group-out_of_range = อยู่นอกระยะ +hud-group-add_friend = เพิ่มในรานชื่อเพื่อน +hud-group-link_group = เชื่อมปาร์ตี้ +hud-group-in_menu = อยู่ในหน้าต่างเมนู +hud-group-members = รายชื่อสมาชิก \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/group.ron b/assets/voxygen/i18n/th_TH/hud/group.ron deleted file mode 100644 index 8412fc6be6..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.group": "ปาร์ตี้", - "hud.group.invite_to_join": "ผู้เล่น [{name}] ต้องการชวนคุณเข้าปาร์ตี้!", - "hud.group.invite_to_trade": "ผู้เล่น [{name}] ต้องการแลกของกับคุณ", - "hud.group.invite": "เชิญชวน", - "hud.group.kick": "เตะออก", - "hud.group.assign_leader": "มอบตำแหน่งหัวหน้า", - "hud.group.leave": "ออกจากปาร์ตี้", - "hud.group.dead" : "เสียชีวิต", - "hud.group.out_of_range": "อยู่นอกระยะ", - "hud.group.add_friend": "เพิ่มในรานชื่อเพื่อน", - "hud.group.link_group": "เชื่อมปาร์ตี้", - "hud.group.in_menu": "อยู่ในหน้าต่างเมนู", - "hud.group.members": "รายชื่อสมาชิก", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/map.ftl b/assets/voxygen/i18n/th_TH/hud/map.ftl new file mode 100644 index 0000000000..5d438e9acf --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/map.ftl @@ -0,0 +1,32 @@ +hud-map-map_title = แผนที่ +hud-map-qlog_title = ภารกิจ +hud-map-topo_map = แผ่นที่ความสูง +hud-map-difficulty = ระดับความยาก +hud-map-towns = หมู่บ้านแขนง +hud-map-castles = ปราสาทแขนง +hud-map-dungeons = ดันเจียนแขนง +hud-map-caves = ถ้ำแขนง +hud-map-cave = ถ้ำเดี่ยว +hud-map-peaks = ภูเขา +hud-map-biomes = เขตภูมิภาค +hud-map-voxel_map = แผนที่ Voxel +hud-map-trees = ต้นไม้ยักษ์แขนง +hud-map-tree = ต้นไม้ยักษ์เดี่ยว +hud-map-town = หมู่บ้านเดี่ยว +hud-map-castle = ปารสาทเดี่ยว +hud-map-dungeon = ปราสาทเดี่ยว +hud-map-difficulty_dungeon = + ดันเจี่ยน + + ความยาก: { $difficulty } ดาว +hud-map-drag = ลาก +hud-map-zoom = ซูม +hud-map-mid_click = ปักหมุด +hud-map-recenter = กลับมาที่ผู้เล่น +hud-map-marked_location = สถานที่ที่ปักหมุด +hud-map-marked_location_remove = กดเพื่อนำออก +hud-map-change_map_mode = เปลี่ยนโหมดแผนที่ +hud-map-toggle_minimap_voxel = เปลี่ยนโหมดมินิแมพ +hud-map-zoom_minimap_explanation = ซูมเข้าในมินิแมพเพื่อเพิ่มความคมชัด +hud-map-gnarling = ฐานทัพของเหล่า Gnarling +hud-map-placed_by = ปักโดย { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/map.ron b/assets/voxygen/i18n/th_TH/hud/map.ron deleted file mode 100644 index 9b5863367f..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "แผนที่", - "hud.map.qlog_title": "ภารกิจ", - "hud.map.topo_map": "แผ่นที่ความสูง", - "hud.map.difficulty": "ระดับความยาก", - "hud.map.towns": "หมู่บ้านแขนง", - "hud.map.castles": "ปราสาทแขนง", - "hud.map.dungeons": "ดันเจียนแขนง", - "hud.map.caves": "ถ้ำแขนง", - "hud.map.cave": "ถ้ำเดี่ยว", - "hud.map.peaks": "ภูเขา", - "hud.map.biomes": "เขตภูมิภาค", - "hud.map.voxel_map": "แผนที่ Voxel ", - "hud.map.trees": "ต้นไม้ยักษ์แขนง", - "hud.map.tree": "ต้นไม้ยักษ์เดี่ยว", - "hud.map.town": "หมู่บ้านเดี่ยว", - "hud.map.castle": "ปารสาทเดี่ยว", - "hud.map.dungeon": "ปราสาทเดี่ยว", - "hud.map.difficulty_dungeon": "ดันเจี่ยน\n\nความยาก: {difficulty} ดาว", - "hud.map.drag": "ลาก", - "hud.map.zoom": "ซูม", - "hud.map.mid_click": "ปักหมุด", - "hud.map.recenter": "กลับมาที่ผู้เล่น", - "hud.map.marked_location": "สถานที่ที่ปักหมุด", - "hud.map.marked_location_remove": "กดเพื่อนำออก", - "hud.map.change_map_mode": "เปลี่ยนโหมดแผนที่", - "hud.map.toggle_minimap_voxel": "เปลี่ยนโหมดมินิแมพ", - "hud.map.zoom_minimap_explanation": "ซูมเข้าในมินิแมพเพื่อเพิ่มความคมชัด", - "hud.map.gnarling": "ฐานทัพของเหล่า Gnarling", - "hud.map.placed_by": "ปักโดย {name}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/misc.ftl b/assets/voxygen/i18n/th_TH/hud/misc.ftl new file mode 100644 index 0000000000..a625f43c10 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/misc.ftl @@ -0,0 +1,43 @@ +hud-do_not_show_on_startup = ไมม่ต้องแสดงเมื่อเปิดเกม +hud-show_tips = แสดงคำแนะนำ +hud-quests = ภารกิจ +hud-you_died = สิ้นชีพ +hud-waypoint_saved = จดจำจุดเกิด +hud-sp_arrow_txt = แต้มทักษะ +hud-inventory_full = กระเป๋าเต็ม +hud-press_key_to_show_keybindings_fmt = [{ $key }] ปุ่มควบคุม +hud-press_key_to_toggle_lantern_fmt = [{ $key }] จุดตะเกียง +hud-press_key_to_show_debug_info_fmt = กด { $key } เพื่อแสดงข้อมูลเชิงลึก +hud-press_key_to_toggle_keybindings_fmt = กด { $key } เพื่อสลับปุ่มลัด +hud-press_key_to_toggle_debug_info_fmt = กด { $key } เพื่อสลับข้อมูลเชิงลึก +hud-press_key_to_respawn = กด { $key } เพื่อเกิดใหม่ที่จุดเกิด +hud-tutorial_btn = วิธีเล่น +hud-tutorial_click_here = กด [ { $key } ] เพื่อปล่อยเมาส์และกดที่ปุ่นนี้สิ! +hud-tutorial_elements = การสร้างสิ่งของ +hud-temp_quest_headline = สวัสดี คุณนักเดินทาง! +hud-temp_quest_text = + ถ้าไม่รู้จะเริ่มยังไง ลองเดินดูรอบหมู่บ้านดูก่อนก็ได้ ถ้ามีของอะไรที่ถูกใจก็หยิบเอาได้เลย ไม่ต้องเกรงใจนะ + + ถือว่าเราช่วย ๆ กันก็แล้วกัน ฮ่าฮ่าฮ่าฮ่าฮ่า + + มุมขวาล่างของจอจะเป็นของสำคัญอย่างสัมภาระ, เมนูสร้างสิ่งของ และที่ขาดไม่ได้แผนที่ + + สามารถสร้างสิ่งของจำเป็นอย่างเช่น อาวุธ, เกราะ, อาหาร แล้วก็อื่น ๆ อีกเต็มเลย ที่โต๊ะของช่าง + + สัตว์ที่อยู่รอบ ๆ นี้ก็เป็นแหล่ง Animal Hide ชั้นดีเลยทีเดียว ติดกระเป๋าไว้บางก็ไม่เสียหายนะ + + ถ้าของพร้อม คนพร้อมก็เริ่มออกเดินทางได้เลย! +hud-spell = เวทย์มนต์คาถา +hud-diary = ไดอาร่ +hud-free_look_indicator = กำลังปลดล็อคกล้อง กด { $key } เพื่อปิด +hud-camera_clamp_indicator = กำลังล็อคหน้าจอในแนวตั้ง กด { $key } เพื่อปิด +hud-auto_walk_indicator = กำลังเดินแบบอัตโนมัต +hud-collect = เก็บ +hud-pick_up = หยิบ +hud-open = เปิด +hud-use = ใช้ +hud-mine = ขุด +hud-talk = คุย +hud-trade = แลกเปลี่ยน +hud-mount = ขี่ +hud-sit = นั่ง \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/misc.ron b/assets/voxygen/i18n/th_TH/hud/misc.ron deleted file mode 100644 index 22243a96b4..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/misc.ron +++ /dev/null @@ -1,63 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.do_not_show_on_startup": "ไมม่ต้องแสดงเมื่อเปิดเกม", - "hud.show_tips": "แสดงคำแนะนำ", - "hud.quests": "ภารกิจ", - "hud.you_died": "สิ้นชีพ", - "hud.waypoint_saved": "จดจำจุดเกิด", - "hud.sp_arrow_txt": "แต้มทักษะ", - "hud.inventory_full": "กระเป๋าเต็ม", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] ปุ่มควบคุม", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] จุดตะเกียง", - "hud.press_key_to_show_debug_info_fmt": "กด {key} เพื่อแสดงข้อมูลเชิงลึก", - "hud.press_key_to_toggle_keybindings_fmt": "กด {key} เพื่อสลับปุ่มลัด", - "hud.press_key_to_toggle_debug_info_fmt": "กด {key} เพื่อสลับข้อมูลเชิงลึก", - - // Respawn message - "hud.press_key_to_respawn": r#"กด {key} เพื่อเกิดใหม่ที่จุดเกิด"#, - - // Tutorial Button - "hud.tutorial_btn": r#"วิธีเล่น"#, - "hud.tutorial_click_here": r#"กด [ {key} ] เพื่อปล่อยเมาส์และกดที่ปุ่นนี้สิ!"#, - "hud.tutorial_elements": r#"การสร้างสิ่งของ"#, - -"hud.temp_quest_headline": r#"สวัสดี คุณนักเดินทาง!"#, -"hud.temp_quest_text": r#"ถ้าไม่รู้จะเริ่มยังไง ลองเดินดูรอบหมู่บ้านดูก่อนก็ได้ ถ้ามีของอะไรที่ถูกใจก็หยิบเอาได้เลย ไม่ต้องเกรงใจนะ - -ถือว่าเราช่วย ๆ กันก็แล้วกัน ฮ่าฮ่าฮ่าฮ่าฮ่า - -มุมขวาล่างของจอจะเป็นของสำคัญอย่างสัมภาระ, เมนูสร้างสิ่งของ และที่ขาดไม่ได้แผนที่ - -สามารถสร้างสิ่งของจำเป็นอย่างเช่น อาวุธ, เกราะ, อาหาร แล้วก็อื่น ๆ อีกเต็มเลย ที่โต๊ะของช่าง - -สัตว์ที่อยู่รอบ ๆ นี้ก็เป็นแหล่ง Animal Hide ชั้นดีเลยทีเดียว ติดกระเป๋าไว้บางก็ไม่เสียหายนะ - -ถ้าของพร้อม คนพร้อมก็เริ่มออกเดินทางได้เลย! -"#, - - "hud.spell": "เวทย์มนต์คาถา", - // Diary - "hud.diary": "ไดอาร่", - - "hud.free_look_indicator": "กำลังปลดล็อคกล้อง กด {key} เพื่อปิด", - "hud.camera_clamp_indicator": "กำลังล็อคหน้าจอในแนวตั้ง กด {key} เพื่อปิด", - "hud.auto_walk_indicator": "กำลังเดินแบบอัตโนมัต", - "hud.collect": "เก็บ", - "hud.pick_up": "หยิบ", - "hud.open": "เปิด", - "hud.use": "ใช้", - "hud.mine": "ขุด", - "hud.talk": "คุย", - "hud.trade": "แลกเปลี่ยน", - "hud.mount": "ขี่", - "hud.sit": "นั่ง", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/sct.ftl b/assets/voxygen/i18n/th_TH/hud/sct.ftl new file mode 100644 index 0000000000..9a372d2604 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = ป้องกันสำเร็จ \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/sct.ron b/assets/voxygen/i18n/th_TH/hud/sct.ron deleted file mode 100644 index 5351e76011..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "ป้องกันสำเร็จ", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/settings.ftl b/assets/voxygen/i18n/th_TH/hud/settings.ftl new file mode 100644 index 0000000000..4585784788 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/settings.ftl @@ -0,0 +1,124 @@ +hud-settings-general = ทั่วไป +hud-settings-none = ไม่มี +hud-settings-press_behavior-toggle = เปิด/ปิด +hud-settings-press_behavior-hold = กดค้าง +hud-settings-help_window = หน้าต่างช่วยเหลือ +hud-settings-debug_info = ข้อมูลเชิงลึก +hud-settings-show_hitboxes = แสดง Hitbox +hud-settings-show_chat = แสดงช่องสนทนา +hud-settings-show_hotkey_hints = แสดงตัวช่วยแถบของใช้ +hud-settings-tips_on_startup = แสดงคำแนะนำตอนเปิดเกม +hud-settings-ui_scale = ขนาดเมนู +hud-settings-relative_scaling = กำหนดให้ +hud-settings-custom_scaling = กำหนดเอง +hud-settings-crosshair = เป้า +hud-settings-opacity = ความเข้มของเป้า +hud-settings-hotbar = แถบของใช้ +hud-settings-toggle_shortcuts = เปิด/ปิดปุ่มลัด +hud-settings-buffs_skillbar = แสดงสถานะที่แถบสกิล +hud-settings-buffs_mmap = แสดงสถานะที่แผนที่ +hud-settings-toggle_bar_experience = เปิด/ปิดแถบค่าประสบการณ์ +hud-settings-scrolling_combat_text = ความเสียหายที่ทำได้ +hud-settings-incoming_damage = ความเสียหายที่ได้รับ +hud-settings-speech_bubble = ลูกโป่งคำพูด +hud-settings-speech_bubble_self = แสดงลูกโป่งคำพูด +hud-settings-speech_bubble_dark_mode = แสดงลูกดป่งคำพูดแบบมืด +hud-settings-speech_bubble_icon = ไอคอนของลูกโป่งคำพูด +hud-settings-energybar_numbers = แสดงตัวเลขที่แถบพลังงาน +hud-settings-always_show_bars = แสดงแถบพลังงานตลอดเวลา +hud-settings-values = ค่า +hud-settings-percentages = ร้อยละ +hud-settings-chat = สนทนา +hud-settings-background_opacity = ความเข้มจางของพื้นหลัง +hud-settings-chat_character_name = ชื่อผู้เล่นในช่องสนทนา +hud-settings-loading_tips = คำแนะนำตอนโหลดเกม +hud-settings-reset_interface = ใช้ค่าเริ่มต้น +hud-settings-pan_sensitivity = ความเร็วเมาส์แนวนอน +hud-settings-zoom_sensitivity = ความเร็วในการซูมเข้า/ออก +hud-settings-camera_clamp_angle = องศามุมเงยเมื่อล็อคมุมกล้องในแนวตั้ง +hud-settings-invert_scroll_zoom = สลับการซูมเข้า/ออก +hud-settings-invert_mouse_y_axis = สลับทิศทางเมาส์ในแนวตั้ง +hud-settings-invert_controller_y_axis = สลับทิศทางจอยในแนวตั้ง +hud-settings-enable_mouse_smoothing = ขยับเมาส์แบบนุ่มนวล +hud-settings-free_look_behavior = พฤติกรรมเมื่อปลดล็อคกล้อง +hud-settings-auto_walk_behavior = พฤติกรรมเมื่อเดินอัตโนมัต +hud-settings-camera_clamp_behavior = พฤติกรรมเมื่อล็อคมุมกล้อง +hud-settings-player_physics_behavior = ใช้ฟิสิกส์กับตัวละคร (ระหว่างการทดลอง) +hud-settings-stop_auto_walk_on_input = หยุดการเดินอัตโนมัตเมื่อขยับเอง +hud-settings-auto_camera = มุมกล้องอัตโนมัต +hud-settings-reset_gameplay = ใช้ค่าเริ่มต้น +hud-settings-view_distance = ระยะการมองเห็น +hud-settings-lod_distance = ระยะ LoD +hud-settings-sprites_view_distance = ระยะการมองเห็นพื้นหลัง +hud-settings-figures_view_distance = ระยะการมองเห็นตัวละคร +hud-settings-maximum_fps = เฟรมเรทสูงสุด +hud-settings-background_fps = เฟรมเรทเมื่อพับจอ +hud-settings-present_mode = โหมด Present +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = องศาการมองเห็น +hud-settings-gamma = ความสว่าง +hud-settings-exposure = ปริมาณแสงที่ตกที่กล้อง +hud-settings-ambiance = ความสว่างของพื้นที่ +hud-settings-antialiasing_mode = โหมดการลบรอยหยัก (Anti Aliasing) +hud-settings-upscale_factor = ความคมชัดภายใน +hud-settings-cloud_rendering_mode = คุณภาพของเมฆ +hud-settings-fluid_rendering_mode = คุณภาพของเหลว +hud-settings-fluid_rendering_mode-cheap = ต่ำ +hud-settings-fluid_rendering_mode-shiny = เงางาม +hud-settings-cloud_rendering_mode-minimal = น้อย +hud-settings-cloud_rendering_mode-low = ต้ำ +hud-settings-cloud_rendering_mode-medium = กลาง +hud-settings-cloud_rendering_mode-high = สูง +hud-settings-cloud_rendering_mode-ultra = สูงที่สุด +hud-settings-fullscreen = เต็มหน้าจอ +hud-settings-fullscreen_mode = โหมดเต็มหน้าจอ +hud-settings-fullscreen_mode-exclusive = Exclusive +hud-settings-fullscreen_mode-borderless = เต็มจอแบบไร้ขอบ (Borderless) +hud-settings-gpu_profiler = เปิดการเร่งด้วย GPU (อาจไม่รองรับ) +hud-settings-particles = อนุภาค +hud-settings-lossy_terrain_compression = บีบอัดการโหลดพื้น +hud-settings-weapon_trails = เส้นอาวุธเมื่อโจมตี +hud-settings-resolution = ความคมชัด +hud-settings-bit_depth = ความคมชัดสี +hud-settings-refresh_rate = เฟรมเรท +hud-settings-lighting_rendering_mode = คุณภาพแสง +hud-settings-lighting_rendering_mode-ashikhmin = Type A - สูง +hud-settings-lighting_rendering_mode-blinnphong = Type B - กลาง +hud-settings-lighting_rendering_mode-lambertian = Type L - ต่ำ +hud-settings-shadow_rendering_mode = คุณภาพเงา +hud-settings-shadow_rendering_mode-none = ปิดเงา +hud-settings-shadow_rendering_mode-cheap = ต่ำ +hud-settings-shadow_rendering_mode-map = แมพ +hud-settings-shadow_rendering_mode-map-resolution = Resolution +hud-settings-lod_detail = รายละเอียด LoD +hud-settings-save_window_size = บันทึกขนาดหน้าจอ +hud-settings-reset_graphics = ใช้ค่าเริ่มต้น +hud-settings-bloom = แสงฟุ้ง (Bloom) +hud-settings-point_glow = จุดเรืองแสง +hud-settings-master_volume = ระดับเสียงทั้งหมด +hud-settings-inactive_master_volume_perc = ระดับเสียเมื่อพับจอ +hud-settings-music_volume = ระดับเสียงเพลง +hud-settings-sound_effect_volume = ระดับเสียงเอฟเฟค +hud-settings-audio_device = อุปกรร์กระจายเสียง +hud-settings-reset_sound = ใช้ค่าเริ่มต้น +hud-settings-english_fallback = แสดงภาษาอังกฤษในกรณีที่ไม่มีคำแปล +hud-settings-awaitingkey = กดปุ่มเพื่อตั้ง... +hud-settings-unbound = ไม่มี +hud-settings-reset_keybinds = ใช้ค่าเริ่มต้น +hud-settings-chat_tabs = แถบการสนทนา +hud-settings-label = คำอธิบาย: +hud-settings-delete = ลบ +hud-settings-show_all = แสดงทั้งหมด +hud-settings-messages = ข้อความ +hud-settings-activity = ความเคลื่อนไหว +hud-settings-death = เสียชีวิต +hud-settings-group = ปาร์ตี้ +hud-settings-faction = ฝ่าย +hud-settings-world = โลก +hud-settings-region = ภูมิภาค +hud-settings-say = พูด +hud-settings-all = ทั้งหมด +hud-settings-group_only = ปาร์ตี้เท่านั้น +hud-settings-reset_chat = ใช้ค่าเริ่มต้น \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/settings.ron b/assets/voxygen/i18n/th_TH/hud/settings.ron deleted file mode 100644 index 97559f562d..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/settings.ron +++ /dev/null @@ -1,142 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - // Settings - "hud.settings.general": "ทั่วไป", - "hud.settings.none": "ไม่มี", - "hud.settings.press_behavior.toggle": "เปิด/ปิด", - "hud.settings.press_behavior.hold": "กดค้าง", - "hud.settings.help_window": "หน้าต่างช่วยเหลือ", - "hud.settings.debug_info": "ข้อมูลเชิงลึก", - "hud.settings.show_hitboxes": "แสดง Hitbox", - "hud.settings.show_chat": "แสดงช่องสนทนา", - "hud.settings.show_hotkey_hints": "แสดงตัวช่วยแถบของใช้", - "hud.settings.tips_on_startup": "แสดงคำแนะนำตอนเปิดเกม", - "hud.settings.ui_scale": "ขนาดเมนู", - "hud.settings.relative_scaling": "กำหนดให้", - "hud.settings.custom_scaling": "กำหนดเอง", - "hud.settings.crosshair": "เป้า", - "hud.settings.opacity": "ความเข้มของเป้า", - "hud.settings.hotbar": "แถบของใช้", - "hud.settings.toggle_shortcuts": "เปิด/ปิดปุ่มลัด", - "hud.settings.buffs_skillbar": "แสดงสถานะที่แถบสกิล", - "hud.settings.buffs_mmap": "แสดงสถานะที่แผนที่", - "hud.settings.toggle_bar_experience": "เปิด/ปิดแถบค่าประสบการณ์", - "hud.settings.scrolling_combat_text": "ความเสียหายที่ทำได้", - "hud.settings.incoming_damage": "ความเสียหายที่ได้รับ", - "hud.settings.speech_bubble": "ลูกโป่งคำพูด", - "hud.settings.speech_bubble_self": "แสดงลูกโป่งคำพูด", - "hud.settings.speech_bubble_dark_mode": "แสดงลูกดป่งคำพูดแบบมืด", - "hud.settings.speech_bubble_icon": "ไอคอนของลูกโป่งคำพูด", - "hud.settings.energybar_numbers": "แสดงตัวเลขที่แถบพลังงาน", - "hud.settings.always_show_bars": "แสดงแถบพลังงานตลอดเวลา", - "hud.settings.values": "ค่า", - "hud.settings.percentages": "ร้อยละ", - "hud.settings.chat": "สนทนา", - "hud.settings.background_opacity": "ความเข้มจางของพื้นหลัง", - "hud.settings.chat_character_name": "ชื่อผู้เล่นในช่องสนทนา", - "hud.settings.loading_tips": "คำแนะนำตอนโหลดเกม", - "hud.settings.reset_interface": "ใช้ค่าเริ่มต้น", - - "hud.settings.pan_sensitivity": "ความเร็วเมาส์แนวนอน", - "hud.settings.zoom_sensitivity": "ความเร็วในการซูมเข้า/ออก", - "hud.settings.camera_clamp_angle": "องศามุมเงยเมื่อล็อคมุมกล้องในแนวตั้ง", - "hud.settings.invert_scroll_zoom": "สลับการซูมเข้า/ออก", - "hud.settings.invert_mouse_y_axis": "สลับทิศทางเมาส์ในแนวตั้ง", - "hud.settings.invert_controller_y_axis": "สลับทิศทางจอยในแนวตั้ง", - "hud.settings.enable_mouse_smoothing": "ขยับเมาส์แบบนุ่มนวล", - "hud.settings.free_look_behavior": "พฤติกรรมเมื่อปลดล็อคกล้อง", - "hud.settings.auto_walk_behavior": "พฤติกรรมเมื่อเดินอัตโนมัต", - "hud.settings.camera_clamp_behavior": "พฤติกรรมเมื่อล็อคมุมกล้อง", - "hud.settings.player_physics_behavior": "ใช้ฟิสิกส์กับตัวละคร (ระหว่างการทดลอง)", - "hud.settings.stop_auto_walk_on_input": "หยุดการเดินอัตโนมัตเมื่อขยับเอง", - "hud.settings.auto_camera": "มุมกล้องอัตโนมัต", - "hud.settings.reset_gameplay": "ใช้ค่าเริ่มต้น", - - "hud.settings.view_distance": "ระยะการมองเห็น", - "hud.settings.lod_distance": "ระยะ LoD", - "hud.settings.sprites_view_distance": "ระยะการมองเห็นพื้นหลัง", - "hud.settings.figures_view_distance": "ระยะการมองเห็นตัวละคร", - "hud.settings.maximum_fps": "เฟรมเรทสูงสุด", - "hud.settings.background_fps": "เฟรมเรทเมื่อพับจอ", - "hud.settings.present_mode": "โหมด Present", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "องศาการมองเห็น", - "hud.settings.gamma": "ความสว่าง", - "hud.settings.exposure": "ปริมาณแสงที่ตกที่กล้อง", - "hud.settings.ambiance": "ความสว่างของพื้นที่", - "hud.settings.antialiasing_mode": "โหมดการลบรอยหยัก (Anti Aliasing)", - "hud.settings.upscale_factor": "ความคมชัดภายใน", - "hud.settings.cloud_rendering_mode": "คุณภาพของเมฆ", - "hud.settings.fluid_rendering_mode": "คุณภาพของเหลว", - "hud.settings.fluid_rendering_mode.cheap": "ต่ำ", - "hud.settings.fluid_rendering_mode.shiny": "เงางาม", - "hud.settings.cloud_rendering_mode.minimal": "น้อย", - "hud.settings.cloud_rendering_mode.low": "ต้ำ", - "hud.settings.cloud_rendering_mode.medium": "กลาง", - "hud.settings.cloud_rendering_mode.high": "สูง", - "hud.settings.cloud_rendering_mode.ultra": "สูงที่สุด", - "hud.settings.fullscreen": "เต็มหน้าจอ", - "hud.settings.fullscreen_mode": "โหมดเต็มหน้าจอ", - "hud.settings.fullscreen_mode.exclusive": "Exclusive", - "hud.settings.fullscreen_mode.borderless": "เต็มจอแบบไร้ขอบ (Borderless)", - "hud.settings.gpu_profiler": "เปิดการเร่งด้วย GPU (อาจไม่รองรับ)", - "hud.settings.particles": "อนุภาค", - "hud.settings.lossy_terrain_compression": "บีบอัดการโหลดพื้น", - "hud.settings.weapon_trails": "เส้นอาวุธเมื่อโจมตี", - "hud.settings.resolution": "ความคมชัด", - "hud.settings.bit_depth": "ความคมชัดสี", - "hud.settings.refresh_rate": "เฟรมเรท", - "hud.settings.lighting_rendering_mode": "คุณภาพแสง", - "hud.settings.lighting_rendering_mode.ashikhmin": "Type A - สูง", - "hud.settings.lighting_rendering_mode.blinnphong": "Type B - กลาง", - "hud.settings.lighting_rendering_mode.lambertian": "Type L - ต่ำ", - "hud.settings.shadow_rendering_mode": "คุณภาพเงา", - "hud.settings.shadow_rendering_mode.none": "ปิดเงา", - "hud.settings.shadow_rendering_mode.cheap": "ต่ำ", - "hud.settings.shadow_rendering_mode.map": "แมพ", - "hud.settings.shadow_rendering_mode.map.resolution": "Resolution", - "hud.settings.lod_detail": "รายละเอียด LoD", - "hud.settings.save_window_size": "บันทึกขนาดหน้าจอ", - "hud.settings.reset_graphics": "ใช้ค่าเริ่มต้น", - "hud.settings.bloom": "แสงฟุ้ง (Bloom)", - "hud.settings.point_glow": "จุดเรืองแสง", - - "hud.settings.master_volume": "ระดับเสียงทั้งหมด", - "hud.settings.inactive_master_volume_perc": "ระดับเสียเมื่อพับจอ", - "hud.settings.music_volume": "ระดับเสียงเพลง", - "hud.settings.sound_effect_volume": "ระดับเสียงเอฟเฟค", - "hud.settings.audio_device": "อุปกรร์กระจายเสียง", - "hud.settings.reset_sound": "ใช้ค่าเริ่มต้น", - - "hud.settings.english_fallback": "แสดงภาษาอังกฤษในกรณีที่ไม่มีคำแปล", - - "hud.settings.awaitingkey": "กดปุ่มเพื่อตั้ง...", - "hud.settings.unbound": "ไม่มี", - "hud.settings.reset_keybinds": "ใช้ค่าเริ่มต้น", - - "hud.settings.chat_tabs": "แถบการสนทนา", - "hud.settings.label": "คำอธิบาย:", - "hud.settings.delete": "ลบ", - "hud.settings.show_all": "แสดงทั้งหมด", - "hud.settings.messages": "ข้อความ", - "hud.settings.activity": "ความเคลื่อนไหว", - "hud.settings.death": "เสียชีวิต", - "hud.settings.group": "ปาร์ตี้", - "hud.settings.faction": "ฝ่าย", - "hud.settings.world": "โลก", - "hud.settings.region": "ภูมิภาค", - "hud.settings.say": "พูด", - "hud.settings.all": "ทั้งหมด", - "hud.settings.group_only": "ปาร์ตี้เท่านั้น", - "hud.settings.reset_chat" : "ใช้ค่าเริ่มต้น", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/skills.ftl b/assets/voxygen/i18n/th_TH/hud/skills.ftl new file mode 100644 index 0000000000..e0f4c64efa --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = ได้รับแต้มทักษะ +hud-skill-sp_available = แต้มทักษะที่ใช้ได้ { $number } แต้ม +hud-skill-not_unlocked = ยังไม่ปลดล็อค +hud-skill-req_sp ={"\u000A"} + + ใช้แต้มทักษะ { $number } แต้ม +hud-skill-inc_health_title = พลังชีวิต +hud-skill-inc_health = เพิ่มพลังชีวิตสูงสุด { $boost }{ $SP } หน่วย +hud-skill-inc_energy_title = พลังงาน +hud-skill-inc_energy = เพิ่มพลังงานสูงสุด { $boost }{ $SP } หน่วย +hud-skill-unlck_sword_title = ปลดล็อคอาวุธ ดาบ +hud-skill-unlck_sword = ปลดล็อคทักษะพิเศษของดาบ{ $SP } +hud-skill-unlck_axe_title = ปลดล็อคอาวุธ ขวาน +hud-skill-unlck_axe = ปลดล็อคทักษะพิเศษของขวาน{ $SP } +hud-skill-unlck_hammer_title = ปลดล็อคอาวุธ ค้อน +hud-skill-unlck_hammer = ปลดล็อคทักษะพิเศษของค้อน{ $SP } +hud-skill-unlck_bow_title = ปลดล็อคอาวุธ ธนู +hud-skill-unlck_bow = ปลดล็อคทักษะพิเศษของธนู{ $SP } +hud-skill-unlck_staff_title = ปลดล็อคอาวุธ คถาอัคนี +hud-skill-unlck_staff = ปลดล็อคทักษะพิเศษของคถาอัคนี{ $SP } +hud-skill-unlck_sceptre_title = ปลดล็อคอาวุธ คถาอภิรักษ์ +hud-skill-unlck_sceptre = ปลดล็อคทักษะพิเศษของคถาอภิรักษ์{ $SP } +hud-skill-dodge_title = กลิ้งหลบ +hud-skill-dodge = กลิ้งหลบด้วยการกดเมาส์กลาง และไม่ได้รับความเสียหาย (iframe) จากการโจมตีระยะใกล้ในขณะที่กำลังกลิ้ง +hud-skill-roll_energy_title = พลังงานการกลิ้งหลบ +hud-skill-roll_energy = การกลิ้งหลบจะใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-roll_speed_title = ความเร็วการกลิ้งหลบ +hud-skill-roll_speed = การกลิ้งจะมีความเร็วเพิ่มขึ้น { $boost }% { $SP } +hud-skill-roll_dur_title = ระยะเวลาการกลิ้งหลบ +hud-skill-roll_dur = ระยะเวลาในการกลิ้งจะเพิ่มขึ้น { $boost }% { $SP } +hud-skill-climbing_title = ปีน +hud-skill-climbing = กระโดดสูงขึ้น +hud-skill-climbing_cost_title = พลังงานการปีน +hud-skill-climbing_cost = การปีนจะใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-climbing_speed_title = ความเร็วการปีน +hud-skill-climbing_speed = ปีนเร็วขึ้น { $boost }% { $SP } +hud-skill-swim_title = ว่ายน้ำ +hud-skill-swim = การเคลื่อนในของเหลว +hud-skill-swim_speed_title = ความเร็วในการว่าย +hud-skill-swim_speed = ว่ายน้ำเร็วขึ้น { $boost }% { $SP } +hud-skill-sc_lifesteal_title = ลำแสงดูดเลือด +hud-skill-sc_lifesteal = ดูดพลังชีวิตจากผู้โชคร้ายมาเป็นของตัวเอง +hud-skill-sc_lifesteal_damage_title = เพิ่มความเสียหาย +hud-skill-sc_lifesteal_damage = ลำแสงดูดเลือดสร้างความเสียหายมากขึ้น { $boost }% { $SP } +hud-skill-sc_lifesteal_range_title = เพิ่มระยะ +hud-skill-sc_lifesteal_range = ความยาวของลำแสงดูดเลือดเพิ่มขึ้น { $boost }% { $SP } +hud-skill-sc_lifesteal_lifesteal_title = อำนาจการดูด +hud-skill-sc_lifesteal_lifesteal = เปลี่ยนความเสียหาย { $boost }% ที่ทำได้เป็นพลังชีวิต { $SP } +hud-skill-sc_lifesteal_regen_title = พื้นพลังงาน +hud-skill-sc_lifesteal_regen = ฟื้นฟูพลังงาน { $boost }% { $SP } +hud-skill-sc_heal_title = อาณาอภิรักษ์ +hud-skill-sc_heal = ฟื้นฟูพลังชีวิตของคุณและเพื่อนร่วมปาร์ตี้ ต้องมี Combo ถึงจะใช้ได้ +hud-skill-sc_heal_heal_title = ทรงพลัง +hud-skill-sc_heal_heal = ฟื้นฟูพลังชีวิตของคุณและเพื่อนร่วมปาร์ตี้อีก { $boost }% { $SP } +hud-skill-sc_heal_cost_title = ลดพลังงาน +hud-skill-sc_heal_cost = อาณาอภิรักษ์จะใช้พลังงานน้อย { $boost }% ในการร่าย { $SP } +hud-skill-sc_heal_duration_title = ยื้อเวลา +hud-skill-sc_heal_duration = อาณาอภิรักษ์จะมีระยะเวลานานขึ้น { $boost }% { $SP } +hud-skill-sc_heal_range_title = รัศมี +hud-skill-sc_heal_range = อาณาอภิรักษ์จะมีขนาดกว้างขึ้น { $boost }% { $SP } +hud-skill-sc_wardaura_unlock_title = อาณาปกปัก +hud-skill-sc_wardaura_unlock = ป้องกันคุณและเพื่อนร่วมปาร์ตี้ ไม่ได้รับความเสียหาย{ $SP } +hud-skill-sc_wardaura_strength_title = ทรงพลัง +hud-skill-sc_wardaura_strength = อาณาปกปักป้องกันความเสียหายได้มากขึ้น { $boost }% { $SP } +hud-skill-sc_wardaura_duration_title = ยื้อเวลา +hud-skill-sc_wardaura_duration = อาณาปกปักมีระยะเวลานานขึ้น { $boost }% { $SP } +hud-skill-sc_wardaura_range_title = รัศมี +hud-skill-sc_wardaura_range = อาณาปกปักมีขอบเขตกว้าขึ้น { $boost }% { $SP } +hud-skill-sc_wardaura_cost_title = ลดพลังงาน +hud-skill-sc_wardaura_cost = อาณาปกปักใช้พลังงานน้อย { $boost }% ในการร่าย { $SP } +hud-skill-st_shockwave_range_title = รัศมี +hud-skill-st_shockwave_range = คลื่นกระแทกมีรัศมีเพิ่มขึ้น { $boost }% { $SP } +hud-skill-st_shockwave_cost_title = ลดพลังงาน +hud-skill-st_shockwave_cost = คลื่นกระแทกใช้พลังงานน้อยลง { $boost }% ในการร่าย { $SP } +hud-skill-st_shockwave_knockback_title = กระเด็น +hud-skill-st_shockwave_knockback = คลื่นกระแทกผลักศัตรูออกไปไกลขึ้น { $boost }% { $SP } +hud-skill-st_shockwave_damage_title = ทรงพลัง +hud-skill-st_shockwave_damage = คลื่นกระแทกสร้างความเสียหายมากขึ้น { $boost }% { $SP } +hud-skill-st_shockwave_unlock_title = คลื่นกระแทก +hud-skill-st_shockwave_unlock = ผลักศัตรู้ที่อยู่ใกล้ ๆ ออกและสร้างความเสียหาย { $SP } +hud-skill-st_flamethrower_title = เพลิงกิเลน +hud-skill-st_flamethrower = เผาให้หมด เผาให้ราบ +hud-skill-st_flame_velocity_title = เร่งความเร็ว +hud-skill-st_flame_velocity = เพลิงกิเลนเคลื่อนที่เร็วขึ้น { $boost }% { $SP } +hud-skill-st_flamethrower_range_title = เพิ่มระยะ +hud-skill-st_flamethrower_range = เพลิงกิเลนเดินทางได้ไกลขึ้น { $boost }% { $SP } +hud-skill-st_energy_drain_title = ลดพลังงาน +hud-skill-st_energy_drain = เพลิงกิเลนใช้พลังงานลดลง { $boost }% { $SP } +hud-skill-st_flamethrower_damage_title = ทรงพลัง +hud-skill-st_flamethrower_damage = เพลิงกิเลนสร้างความเสียหายมากขึ้น { $boost }% { $SP } +hud-skill-st_explosion_radius_title = รัศมี +hud-skill-st_explosion_radius = ลูกไฟกัมปนาทมีระยะกว้างขึ้น { $boost }% { $SP } +hud-skill-st_energy_regen_title = พื้นพลังงาน +hud-skill-st_energy_regen = ลูกไฟกัมปนาทพื้นฟูนพลังงานมากขึ้น { $boost }% { $SP } +hud-skill-st_fireball_title = ลูกไฟกัมปนาท +hud-skill-st_fireball = ยิงลูกไฟที่สร้างความเสียหายเป็นวงรอบเมื่อตกพื้น +hud-skill-st_damage_title = ทรงพลัง +hud-skill-st_damage = ลูกไฟกัมปนาทสร้างความเสียหายมากขึ้น { $boost }% { $SP } +hud-skill-bow_projectile_speed_title = เร่งความเร็ว +hud-skill-bow_projectile_speed = ลูกธนูเดินทางเร็วขึ้นและระยะทางเพิ่มขึ้น { $boost }% { $SP } +hud-skill-bow_charged_title = ขอเล็งก่อน +hud-skill-bow_charged = ขอบคุณที่รอกัน +hud-skill-bow_charged_damage_title = ทรงพลัง +hud-skill-bow_charged_damage = เมื่อชักคันธนูค้างไว้ ลูกธนูจะสร้างความเสียหายมากขึ้น { $boost }% { $SP } +hud-skill-bow_charged_energy_regen_title = พื้นฟูพลังงาน +hud-skill-bow_charged_energy_regen = เมื่อชักคันธนูค้างไว้ พื้นฟูพลังงานมากขึ้น { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = อันกระเด็น +hud-skill-bow_charged_knockback = เมื่อชักคันธนูค้างไว้ ศัตรูจะถูกผลักให้กระเด็ดออกไกลขึ้น { $boost }%{ $SP } +hud-skill-bow_charged_speed_title = มือไว +hud-skill-bow_charged_speed = ยิงธนูได้เร็วขึ้น { $boost }% { $SP } +hud-skill-bow_charged_move_title = คล่องตัว +hud-skill-bow_charged_move = ขณะชักคันธนู เคลื่อนที่ได้เร็วขึ้น { $boost }% { $SP } +hud-skill-bow_repeater_title = กระหน่ำยิง +hud-skill-bow_repeater = เพิ่มความเร็วในการยิงธนูเมื่อยิงต่อเนื่อง +hud-skill-bow_repeater_damage_title = ทรงพลัง +hud-skill-bow_repeater_damage = สร้างความเสียหายเพิ่มขึ้น { $boost }% { $SP } +hud-skill-bow_repeater_cost_title = ลดพลังงาน +hud-skill-bow_repeater_cost = กระหน่ำใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-bow_repeater_speed_title = เร่งความเร็ว +hud-skill-bow_repeater_speed = กระหน่ำยิง เพิ่มความเร็วโจมตีอีก { $boost }% { $SP } +hud-skill-bow_shotgun_unlock_title = ยิงกระจาย +hud-skill-bow_shotgun_unlock = ยิงธนูได้หลายดอกพร้อมกัน { $SP } +hud-skill-bow_shotgun_damage_title = ทรงพลัง +hud-skill-bow_shotgun_damage = ยิงกระจายสร้างความเสียหายเพิ่มขึ้น { $boost }% { $SP } +hud-skill-bow_shotgun_cost_title = ลดพลังงาน +hud-skill-bow_shotgun_cost = ยิงกระจายใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-bow_shotgun_arrow_count_title = จำนวนลูกธนู +hud-skill-bow_shotgun_arrow_count = เพิ่มจำนวนลูกธนูที่ยิงกระจายใช้ { $boost } { $SP } +hud-skill-bow_shotgun_spread_title = จุดตาย +hud-skill-bow_shotgun_spread = ลดความกระจายของลูกธนูลง { $boost }% { $SP } +hud-skill-hmr_leap_radius_title = รัศมี +hud-skill-hmr_leap_radius = กระโดดทุมมีขอบเขตเพิ่มขึ้นเป็น { $boost } เมตร { $SP } +hud-skill-hmr_leap_distance_title = แชมป์กระโดดไกล +hud-skill-hmr_leap_distance = กระโดนทุบมีระยะทางเพิ่มขึ้น { $boost }% { $SP } +hud-skill-hmr_leap_cost_title = ลดพลังงาน +hud-skill-hmr_leap_cost = กระโดดทุบใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-hmr_leap_knockback_title = กระเด็ดออก +hud-skill-hmr_leap_knockback = ศัตรูที่ถูกกระโดดทุบจะกระเด็นออกไกลขึ้น { $boost }% { $SP } +hud-skill-hmr_leap_damage_title = ทรงพลัง +hud-skill-hmr_leap_damage = กระโดดทุบสร้างความเสียหายมากขึ้น { $boost }% { $SP } +hud-skill-hmr_unlock_leap_title = กระโดดทุบ +hud-skill-hmr_unlock_leap = กระโดดขึ้นไปในอากาศแล้วฟาดค้อนใส่ศัตรู{ $SP } +hud-skill-hmr_charged_melee_title = หน้าสะบัด +hud-skill-hmr_charged_melee = ง้างค้อนแล้วฟาดใส่ศัตรูอย่างรุนแรง +hud-skill-hmr_charged_rate_title = ง้างเร็ว +hud-skill-hmr_charged_rate = ง้างค้อนได้เร็วขึ้น { $boost }% { $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = ลดพลังงาน +hud-skill-hmr_charged_melee_nrg_drain = ลดพลังงานทมี่ใช้ในการง้างค้อนลง { $boost }% { $SP } +hud-skill-hmr_charged_melee_damage_title = ทรงพลัง +hud-skill-hmr_charged_melee_damage = เมื่อง้างค้อน สร้างเสียหายกับศัตรูเพิ่มขึ้น { $boost }% { $SP } +hud-skill-hmr_charged_melee_knockback_title = กระเด็ดออก +hud-skill-hmr_charged_melee_knockback = เมื่อง้างค้อน ศัตรูจะกระเด็ดออกไปไกลขึ้น { $boost }% { $SP } +hud-skill-hmr_single_strike_title = ฟาดค้อน +hud-skill-hmr_single_strike = ฟาดค้อนใส่ศัตรู +hud-skill-hmr_single_strike_regen_title = ฟื้นฟูพลังงาน +hud-skill-hmr_single_strike_regen = พื้นฟูพลังงาน เมื่อฟาดค้อนใส่ศัตรูสำเร็จ { $SP } +hud-skill-hmr_single_strike_speed_title = กล้ามแขนเป็นมัด ๆ +hud-skill-hmr_single_strike_speed = ความเร็วโจมตีเพิ่มขึ้น เมื่อฟาดค้อนใส่ศัตรูสำเร็จต่อเนื่องกัน{ $SP } +hud-skill-hmr_single_strike_damage_title = ทรงพลัง +hud-skill-hmr_single_strike_damage = ฟาดค้อนสร้างความเสียหายมากขึ้น { $SP } +hud-skill-hmr_single_strike_knockback_title = กระเด็ดออก +hud-skill-hmr_single_strike_knockback = เมื่อถูกฟาด ศัตรูจะกระเด็ดออกไปไกลขึ้น { $boost }% { $SP } +hud-skill-sw_trip_str_title = ระบำดาบ +hud-skill-sw_trip_str = ฟาดฟันศัตรูด้วยดาบ ต่อเนื่องสูงสุด 3 ครั้ง +hud-skill-sw_trip_str_combo_title = ระบำดาบทรงพลัง +hud-skill-sw_trip_str_combo = สร้างความเสียหายมากขึ้นตามจำนวนคอมโบ { $SP } +hud-skill-sw_trip_str_dmg_title = ระบำดาบทรงพลัง +hud-skill-sw_trip_str_dmg = การฟาดฟันแต่ละครั้งจะสร้างความเสียหายมากขึ้น { $SP } +hud-skill-sw_trip_str_sp_title = ระบำดาบร่ายรำ +hud-skill-sw_trip_str_sp = การฟาดฟันแต่ละครั้งจะเพิ่มความเร็วโจมตี { $SP } +hud-skill-sw_trip_str_reg_title = ระบำดาบนิรันตร +hud-skill-sw_trip_str_reg = การฟาดฟันแต่ละครั้งจะช่วยฟื้นฟูพลังงาน { $SP } +hud-skill-sw_dash_title = พุ่งใส่ +hud-skill-sw_dash = พุ่งใส่ศัตรูที่โชคไม่ดี +hud-skill-sw_dash_dmg_title = ทรงพลัง +hud-skill-sw_dash_dmg = พุ่งใส่สร้างความเสรหายเพิ่มขึ้น { $boost }% { $SP } +hud-skill-sw_dash_drain_title = เหนื่อยยาก +hud-skill-sw_dash_drain = ลดพลังงานที่ใช้ขณะพุ่งลง { $boost }% { $SP } +hud-skill-sw_dash_cost_title = ลดพลังงาน +hud-skill-sw_dash_cost = พุ่งใส่ใช้พลังงานลดลง { $boost }% ในช่วงแรก { $SP } +hud-skill-sw_dash_speed_title = ว่องไว +hud-skill-sw_dash_speed = ขณะพุ่ง ความเร็วเคลื่อนที่เพิ่มขึ้น { $boost }% { $SP } +hud-skill-sw_dash_charge_through_title = พุ่งทะลุ +hud-skill-sw_dash_charge_through = สามมารถพุ่งทะลุศัตรูตัวแรก { $SP } +hud-skill-sw_dash_scale_title = โมเมนตัม +hud-skill-sw_dash_scale = สร้างความเสียหายเพิ่มขึ้นตามระยะที่ทำได้ { $boost }% { $SP } +hud-skill-sw_spin_title = หมุน +hud-skill-sw_spin = เหวี่ยงดาบไปรอบตัว { $SP } +hud-skill-sw_spin_dmg_title = ทรงพลัง +hud-skill-sw_spin_dmg = หมุนสร้างความเสียหายเพิ่มขึ้น { $boost }% { $SP } +hud-skill-sw_spin_spd_title = รวดเร็ว +hud-skill-sw_spin_spd = ความเร็วในการหมุนเพิ่มขึ้น { $boost }% { $SP } +hud-skill-sw_spin_cost_title = ลดพลังงาน +hud-skill-sw_spin_cost = ลดพลังงานที่ใช้ในการหมุนลง { $boost }% { $SP } +hud-skill-sw_spin_spins_title = จำนวน +hud-skill-sw_spin_spins = เพิ่มจำนวนรอบที่หมุน { $SP } +hud-skill-sw_interrupt_title = รำบำดาบขั้นสูง +hud-skill-sw_interrupt = สามมารถฟันดาบต่อเนื่องติดต่อกันได้ { $SP } +hud-skill-axe_double_strike_title = ฟันคู่ +hud-skill-axe_double_strike = ฟันให้ราบ +hud-skill-axe_double_strike_combo_title = ฟันคู่ต่อเนื่อง +hud-skill-axe_double_strike_combo = สามารถฟันติดต่อกันได้ { $SP } +hud-skill-axe_double_strike_damage_title = ทรงพลัง +hud-skill-axe_double_strike_damage = การฟันแต่ละครั้งสร้างความเสียหายเพิ่มขึ้น { $SP } +hud-skill-axe_double_strike_speed_title = รวดเร็ว +hud-skill-axe_double_strike_speed = การฟันแต่ละครั้งเพิ่มความเร็วโจมตี { $SP } +hud-skill-axe_double_strike_regen_title = ฟื้นฟูพลังงาน +hud-skill-axe_double_strike_regen = การฟันแต่ละครั้งจะช่วยฟื้นฟูพลังงาน { $SP } +hud-skill-axe_spin_title = เอามือขึ้นแล้ว หมุน หมุน +hud-skill-axe_spin = ชูมือขึ้นโบกไปมา +hud-skill-axe_infinite_axe_spin_title = ไม่เวียนอีก +hud-skill-axe_infinite_axe_spin = เหวียงขวานได้เรื่อย ๆ จนกว่าพลังงานจะหมด { $SP } +hud-skill-axe_spin_damage_title = ทรงพลัง +hud-skill-axe_spin_damage = เหวียงขวานสร้างความเสียหมายเพิ่มขึ้น { $boost }% { $SP } +hud-skill-axe_spin_helicopter_title = พลศาสตร์แรงยก +hud-skill-axe_spin_helicopter = ตกถึงพื้นช้าลงในขณะที่เหวี่ยงขวาน { $SP } +hud-skill-axe_spin_speed_title = ความมเร็ว +hud-skill-axe_spin_speed = เหวี่ยงขวานเร็วขึ้น { $boost }% { $SP } +hud-skill-axe_spin_cost_title = ลดพลังงาน +hud-skill-axe_spin_cost = เหวี่ยงขวานใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-axe_unlock_leap_title = กระโดดฟัน +hud-skill-axe_unlock_leap = กระโดดขึ้นไปในอากาศ และฟันศัตรู{ $SP } +hud-skill-axe_leap_damage_title = ทรงพลัง +hud-skill-axe_leap_damage = กระโดดฟันสร้างความเสียหายเพิ่มขึ้น { $boost }% { $SP } +hud-skill-axe_leap_knockback_title = กระเด็นออก +hud-skill-axe_leap_knockback = กระโดดฟันจะผลักศัตรูออกไปไกลขึ้น { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = ลดพลังงาน +hud-skill-axe_leap_cost = กระโดดฟันใช้พลังงานน้อยลง { $boost }% { $SP } +hud-skill-axe_leap_distance_title = กระโดดไกล +hud-skill-axe_leap_distance = ระยะในการกระโดดเพิ่มขึ้น{ $boost }% { $SP } +hud-skill-mining_title = ขุดหิน +hud-skill-pick_strike_title = ขุด ขุด ขุด +hud-skill-pick_strike = Hit rocks with the pickaxe to gain ore, gems and experience +hud-skill-pick_strike_speed_title = แข็งแรง +hud-skill-pick_strike_speed = ขุดหินได้เร็วขึ้น { $SP } +hud-skill-pick_strike_oregain_title = โชคลาภ แร่ +hud-skill-pick_strike_oregain = มีโอกาสได้รับแร่มากขึ้น ({ $boost }% ต่อเลเเวล) { $SP } +hud-skill-pick_strike_gemgain_title = โชคลาภ อัญมนี +hud-skill-pick_strike_gemgain = มีโอกาสได้รับอัญมนีมากขึ้น ({ $boost }% ต่อเลเวล){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/skills.ron b/assets/voxygen/i18n/th_TH/hud/skills.ron deleted file mode 100644 index c19833e671..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/skills.ron +++ /dev/null @@ -1,258 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.rank_up": "ได้รับแต้มทักษะ", - "hud.skill.sp_available": "แต้มทักษะที่ใช้ได้ {number} แต้ม", - "hud.skill.not_unlocked": "ยังไม่ปลดล็อค", - "hud.skill.req_sp": "\n\nใช้แต้มทักษะ {number} แต้ม", - // Skills - // General - "hud.skill.inc_health_title": "พลังชีวิต", - "hud.skill.inc_health": "เพิ่มพลังชีวิตสูงสุด {boost}{SP} หน่วย", - "hud.skill.inc_energy_title": "พลังงาน", - "hud.skill.inc_energy": "เพิ่มพลังงานสูงสุด {boost}{SP} หน่วย", - "hud.skill.unlck_sword_title": "ปลดล็อคอาวุธ ดาบ", - "hud.skill.unlck_sword": "ปลดล็อคทักษะพิเศษของดาบ{SP}", - "hud.skill.unlck_axe_title": "ปลดล็อคอาวุธ ขวาน", - "hud.skill.unlck_axe": "ปลดล็อคทักษะพิเศษของขวาน{SP}", - "hud.skill.unlck_hammer_title": "ปลดล็อคอาวุธ ค้อน", - "hud.skill.unlck_hammer": "ปลดล็อคทักษะพิเศษของค้อน{SP}", - "hud.skill.unlck_bow_title": "ปลดล็อคอาวุธ ธนู", - "hud.skill.unlck_bow": "ปลดล็อคทักษะพิเศษของธนู{SP}", - "hud.skill.unlck_staff_title": "ปลดล็อคอาวุธ คถาอัคนี", - "hud.skill.unlck_staff": "ปลดล็อคทักษะพิเศษของคถาอัคนี{SP}", - "hud.skill.unlck_sceptre_title": "ปลดล็อคอาวุธ คถาอภิรักษ์", - "hud.skill.unlck_sceptre": "ปลดล็อคทักษะพิเศษของคถาอภิรักษ์{SP}", - "hud.skill.dodge_title": "กลิ้งหลบ", - "hud.skill.dodge": "กลิ้งหลบด้วยการกดเมาส์กลาง และไม่ได้รับความเสียหาย (iframe) จากการโจมตีระยะใกล้ในขณะที่กำลังกลิ้ง", - "hud.skill.roll_energy_title": "พลังงานการกลิ้งหลบ", - "hud.skill.roll_energy": "การกลิ้งหลบจะใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.roll_speed_title": "ความเร็วการกลิ้งหลบ", - "hud.skill.roll_speed": "การกลิ้งจะมีความเร็วเพิ่มขึ้น {boost}% {SP}", - "hud.skill.roll_dur_title": "ระยะเวลาการกลิ้งหลบ", - "hud.skill.roll_dur": "ระยะเวลาในการกลิ้งจะเพิ่มขึ้น {boost}% {SP}", - "hud.skill.climbing_title": "ปีน", - "hud.skill.climbing": "กระโดดสูงขึ้น", - "hud.skill.climbing_cost_title": "พลังงานการปีน", - "hud.skill.climbing_cost": "การปีนจะใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.climbing_speed_title": "ความเร็วการปีน", - "hud.skill.climbing_speed": "ปีนเร็วขึ้น {boost}% {SP}", - "hud.skill.swim_title": "ว่ายน้ำ", - "hud.skill.swim": "การเคลื่อนในของเหลว", - "hud.skill.swim_speed_title": "ความเร็วในการว่าย", - "hud.skill.swim_speed": "ว่ายน้ำเร็วขึ้น {boost}% {SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "ลำแสงดูดเลือด", - "hud.skill.sc_lifesteal": "ดูดพลังชีวิตจากผู้โชคร้ายมาเป็นของตัวเอง", - "hud.skill.sc_lifesteal_damage_title": "เพิ่มความเสียหาย", - "hud.skill.sc_lifesteal_damage": "ลำแสงดูดเลือดสร้างความเสียหายมากขึ้น {boost}% {SP}", - "hud.skill.sc_lifesteal_range_title": "เพิ่มระยะ", - "hud.skill.sc_lifesteal_range": "ความยาวของลำแสงดูดเลือดเพิ่มขึ้น {boost}% {SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "อำนาจการดูด", - "hud.skill.sc_lifesteal_lifesteal": "เปลี่ยนความเสียหาย {boost}% ที่ทำได้เป็นพลังชีวิต {SP}", - "hud.skill.sc_lifesteal_regen_title": "พื้นพลังงาน", - "hud.skill.sc_lifesteal_regen": "ฟื้นฟูพลังงาน {boost}% {SP}", - "hud.skill.sc_heal_title": "อาณาอภิรักษ์", - "hud.skill.sc_heal": "ฟื้นฟูพลังชีวิตของคุณและเพื่อนร่วมปาร์ตี้ ต้องมี Combo ถึงจะใช้ได้", - "hud.skill.sc_heal_heal_title": "ทรงพลัง", - "hud.skill.sc_heal_heal": "ฟื้นฟูพลังชีวิตของคุณและเพื่อนร่วมปาร์ตี้อีก {boost}% {SP}", - "hud.skill.sc_heal_cost_title": "ลดพลังงาน", - "hud.skill.sc_heal_cost": "อาณาอภิรักษ์จะใช้พลังงานน้อย {boost}% ในการร่าย {SP}", - "hud.skill.sc_heal_duration_title": "ยื้อเวลา", - "hud.skill.sc_heal_duration": "อาณาอภิรักษ์จะมีระยะเวลานานขึ้น {boost}% {SP}", - "hud.skill.sc_heal_range_title": "รัศมี", - "hud.skill.sc_heal_range": "อาณาอภิรักษ์จะมีขนาดกว้างขึ้น {boost}% {SP}", - "hud.skill.sc_wardaura_unlock_title": "อาณาปกปัก", - "hud.skill.sc_wardaura_unlock": "ป้องกันคุณและเพื่อนร่วมปาร์ตี้ ไม่ได้รับความเสียหาย{SP}", - "hud.skill.sc_wardaura_strength_title": "ทรงพลัง", - "hud.skill.sc_wardaura_strength": "อาณาปกปักป้องกันความเสียหายได้มากขึ้น {boost}% {SP}", - "hud.skill.sc_wardaura_duration_title": "ยื้อเวลา", - "hud.skill.sc_wardaura_duration": "อาณาปกปักมีระยะเวลานานขึ้น {boost}% {SP}", - "hud.skill.sc_wardaura_range_title": "รัศมี", - "hud.skill.sc_wardaura_range": "อาณาปกปักมีขอบเขตกว้าขึ้น {boost}% {SP}", - "hud.skill.sc_wardaura_cost_title": "ลดพลังงาน", - "hud.skill.sc_wardaura_cost": "อาณาปกปักใช้พลังงานน้อย {boost}% ในการร่าย {SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "รัศมี", - "hud.skill.st_shockwave_range" : "คลื่นกระแทกมีรัศมีเพิ่มขึ้น {boost}% {SP}", - "hud.skill.st_shockwave_cost_title" : "ลดพลังงาน", - "hud.skill.st_shockwave_cost" : "คลื่นกระแทกใช้พลังงานน้อยลง {boost}% ในการร่าย {SP}", - "hud.skill.st_shockwave_knockback_title" : "กระเด็น", - "hud.skill.st_shockwave_knockback" : "คลื่นกระแทกผลักศัตรูออกไปไกลขึ้น {boost}% {SP}", - "hud.skill.st_shockwave_damage_title" : "ทรงพลัง", - "hud.skill.st_shockwave_damage" : "คลื่นกระแทกสร้างความเสียหายมากขึ้น {boost}% {SP}", - "hud.skill.st_shockwave_unlock_title" : "คลื่นกระแทก", - "hud.skill.st_shockwave_unlock" : "ผลักศัตรู้ที่อยู่ใกล้ ๆ ออกและสร้างความเสียหาย {SP}", - "hud.skill.st_flamethrower_title" : "เพลิงกิเลน", - "hud.skill.st_flamethrower" : "เผาให้หมด เผาให้ราบ", - "hud.skill.st_flame_velocity_title" : "เร่งความเร็ว", - "hud.skill.st_flame_velocity" : "เพลิงกิเลนเคลื่อนที่เร็วขึ้น {boost}% {SP}", - "hud.skill.st_flamethrower_range_title" : "เพิ่มระยะ", - "hud.skill.st_flamethrower_range" : "เพลิงกิเลนเดินทางได้ไกลขึ้น {boost}% {SP}", - "hud.skill.st_energy_drain_title" : "ลดพลังงาน", - "hud.skill.st_energy_drain" : "เพลิงกิเลนใช้พลังงานลดลง {boost}% {SP}", - "hud.skill.st_flamethrower_damage_title" : "ทรงพลัง", - "hud.skill.st_flamethrower_damage" : "เพลิงกิเลนสร้างความเสียหายมากขึ้น {boost}% {SP}", - "hud.skill.st_explosion_radius_title" : "รัศมี", - "hud.skill.st_explosion_radius" : "ลูกไฟกัมปนาทมีระยะกว้างขึ้น {boost}% {SP}", - "hud.skill.st_energy_regen_title" : "พื้นพลังงาน", - "hud.skill.st_energy_regen" : "ลูกไฟกัมปนาทพื้นฟูนพลังงานมากขึ้น {boost}% {SP}", - "hud.skill.st_fireball_title" : "ลูกไฟกัมปนาท", - "hud.skill.st_fireball" : "ยิงลูกไฟที่สร้างความเสียหายเป็นวงรอบเมื่อตกพื้น", - "hud.skill.st_damage_title" : "ทรงพลัง", - "hud.skill.st_damage" : "ลูกไฟกัมปนาทสร้างความเสียหายมากขึ้น {boost}% {SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "เร่งความเร็ว", - "hud.skill.bow_projectile_speed" : "ลูกธนูเดินทางเร็วขึ้นและระยะทางเพิ่มขึ้น {boost}% {SP}", - "hud.skill.bow_charged_title" : "ขอเล็งก่อน", - "hud.skill.bow_charged" : "ขอบคุณที่รอกัน", - "hud.skill.bow_charged_damage_title" : "ทรงพลัง", - "hud.skill.bow_charged_damage" : "เมื่อชักคันธนูค้างไว้ ลูกธนูจะสร้างความเสียหายมากขึ้น {boost}% {SP}", - "hud.skill.bow_charged_energy_regen_title" : "พื้นฟูพลังงาน", - "hud.skill.bow_charged_energy_regen" : "เมื่อชักคันธนูค้างไว้ พื้นฟูพลังงานมากขึ้น {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "อันกระเด็น", - "hud.skill.bow_charged_knockback" : "เมื่อชักคันธนูค้างไว้ ศัตรูจะถูกผลักให้กระเด็ดออกไกลขึ้น {boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "มือไว", - "hud.skill.bow_charged_speed" : "ยิงธนูได้เร็วขึ้น {boost}% {SP}", - "hud.skill.bow_charged_move_title" : "คล่องตัว", - "hud.skill.bow_charged_move" : "ขณะชักคันธนู เคลื่อนที่ได้เร็วขึ้น {boost}% {SP}", - "hud.skill.bow_repeater_title" : "กระหน่ำยิง", - "hud.skill.bow_repeater" : "เพิ่มความเร็วในการยิงธนูเมื่อยิงต่อเนื่อง", - "hud.skill.bow_repeater_damage_title" : "ทรงพลัง", - "hud.skill.bow_repeater_damage" : "สร้างความเสียหายเพิ่มขึ้น {boost}% {SP}", - "hud.skill.bow_repeater_cost_title" : "ลดพลังงาน", - "hud.skill.bow_repeater_cost" : "กระหน่ำใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.bow_repeater_speed_title" : "เร่งความเร็ว", - "hud.skill.bow_repeater_speed" : "กระหน่ำยิง เพิ่มความเร็วโจมตีอีก {boost}% {SP}", - "hud.skill.bow_shotgun_unlock_title" : "ยิงกระจาย", - "hud.skill.bow_shotgun_unlock" : "ยิงธนูได้หลายดอกพร้อมกัน {SP}", - "hud.skill.bow_shotgun_damage_title" : "ทรงพลัง", - "hud.skill.bow_shotgun_damage" : "ยิงกระจายสร้างความเสียหายเพิ่มขึ้น {boost}% {SP}", - "hud.skill.bow_shotgun_cost_title" : "ลดพลังงาน", - "hud.skill.bow_shotgun_cost" : "ยิงกระจายใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "จำนวนลูกธนู", - "hud.skill.bow_shotgun_arrow_count" : "เพิ่มจำนวนลูกธนูที่ยิงกระจายใช้ {boost} {SP}", - "hud.skill.bow_shotgun_spread_title" : "จุดตาย", - "hud.skill.bow_shotgun_spread" : "ลดความกระจายของลูกธนูลง {boost}% {SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "รัศมี", - "hud.skill.hmr_leap_radius" : "กระโดดทุมมีขอบเขตเพิ่มขึ้นเป็น {boost} เมตร {SP}", - "hud.skill.hmr_leap_distance_title" : "แชมป์กระโดดไกล", - "hud.skill.hmr_leap_distance" : "กระโดนทุบมีระยะทางเพิ่มขึ้น {boost}% {SP}", - "hud.skill.hmr_leap_cost_title" : "ลดพลังงาน", - "hud.skill.hmr_leap_cost" : "กระโดดทุบใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.hmr_leap_knockback_title" : "กระเด็ดออก", - "hud.skill.hmr_leap_knockback" : "ศัตรูที่ถูกกระโดดทุบจะกระเด็นออกไกลขึ้น {boost}% {SP}", - "hud.skill.hmr_leap_damage_title" : "ทรงพลัง", - "hud.skill.hmr_leap_damage" : "กระโดดทุบสร้างความเสียหายมากขึ้น {boost}% {SP}", - "hud.skill.hmr_unlock_leap_title" : "กระโดดทุบ", - "hud.skill.hmr_unlock_leap" : "กระโดดขึ้นไปในอากาศแล้วฟาดค้อนใส่ศัตรู{SP}", - "hud.skill.hmr_charged_melee_title" : "หน้าสะบัด", - "hud.skill.hmr_charged_melee" : "ง้างค้อนแล้วฟาดใส่ศัตรูอย่างรุนแรง", - "hud.skill.hmr_charged_rate_title" : "ง้างเร็ว", - "hud.skill.hmr_charged_rate" : "ง้างค้อนได้เร็วขึ้น {boost}% {SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "ลดพลังงาน", - "hud.skill.hmr_charged_melee_nrg_drain" : "ลดพลังงานทมี่ใช้ในการง้างค้อนลง {boost}% {SP}", - "hud.skill.hmr_charged_melee_damage_title" : "ทรงพลัง", - "hud.skill.hmr_charged_melee_damage" : "เมื่อง้างค้อน สร้างเสียหายกับศัตรูเพิ่มขึ้น {boost}% {SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "กระเด็ดออก", - "hud.skill.hmr_charged_melee_knockback" : "เมื่อง้างค้อน ศัตรูจะกระเด็ดออกไปไกลขึ้น {boost}% {SP}", - "hud.skill.hmr_single_strike_title" : "ฟาดค้อน", - "hud.skill.hmr_single_strike" : "ฟาดค้อนใส่ศัตรู", - "hud.skill.hmr_single_strike_regen_title" : "ฟื้นฟูพลังงาน", - "hud.skill.hmr_single_strike_regen" : "พื้นฟูพลังงาน เมื่อฟาดค้อนใส่ศัตรูสำเร็จ {SP}", - "hud.skill.hmr_single_strike_speed_title" : "กล้ามแขนเป็นมัด ๆ", - "hud.skill.hmr_single_strike_speed" : "ความเร็วโจมตีเพิ่มขึ้น เมื่อฟาดค้อนใส่ศัตรูสำเร็จต่อเนื่องกัน{SP}", - "hud.skill.hmr_single_strike_damage_title" : "ทรงพลัง", - "hud.skill.hmr_single_strike_damage" : "ฟาดค้อนสร้างความเสียหายมากขึ้น {SP}", - "hud.skill.hmr_single_strike_knockback_title" : "กระเด็ดออก", - "hud.skill.hmr_single_strike_knockback" : "เมื่อถูกฟาด ศัตรูจะกระเด็ดออกไปไกลขึ้น {boost}% {SP}", - // Sword - "hud.skill.sw_trip_str_title": "ระบำดาบ", - "hud.skill.sw_trip_str": "ฟาดฟันศัตรูด้วยดาบ ต่อเนื่องสูงสุด 3 ครั้ง", - "hud.skill.sw_trip_str_combo_title": "ระบำดาบทรงพลัง", - "hud.skill.sw_trip_str_combo": "สร้างความเสียหายมากขึ้นตามจำนวนคอมโบ {SP}", - "hud.skill.sw_trip_str_dmg_title": "ระบำดาบทรงพลัง", - "hud.skill.sw_trip_str_dmg": "การฟาดฟันแต่ละครั้งจะสร้างความเสียหายมากขึ้น {SP}", - "hud.skill.sw_trip_str_sp_title": "ระบำดาบร่ายรำ", - "hud.skill.sw_trip_str_sp": "การฟาดฟันแต่ละครั้งจะเพิ่มความเร็วโจมตี {SP}", - "hud.skill.sw_trip_str_reg_title": "ระบำดาบนิรันตร", - "hud.skill.sw_trip_str_reg": "การฟาดฟันแต่ละครั้งจะช่วยฟื้นฟูพลังงาน {SP}", - "hud.skill.sw_dash_title": "พุ่งใส่", - "hud.skill.sw_dash": "พุ่งใส่ศัตรูที่โชคไม่ดี", - "hud.skill.sw_dash_dmg_title": "ทรงพลัง", - "hud.skill.sw_dash_dmg": "พุ่งใส่สร้างความเสรหายเพิ่มขึ้น {boost}% {SP}", - "hud.skill.sw_dash_drain_title": "เหนื่อยยาก", - "hud.skill.sw_dash_drain": "ลดพลังงานที่ใช้ขณะพุ่งลง {boost}% {SP}", - "hud.skill.sw_dash_cost_title": "ลดพลังงาน", - "hud.skill.sw_dash_cost": "พุ่งใส่ใช้พลังงานลดลง {boost}% ในช่วงแรก {SP}", - "hud.skill.sw_dash_speed_title": "ว่องไว", - "hud.skill.sw_dash_speed": "ขณะพุ่ง ความเร็วเคลื่อนที่เพิ่มขึ้น {boost}% {SP}", - "hud.skill.sw_dash_charge_through_title": "พุ่งทะลุ", - "hud.skill.sw_dash_charge_through": "สามมารถพุ่งทะลุศัตรูตัวแรก {SP}", - "hud.skill.sw_dash_scale_title": "โมเมนตัม", - "hud.skill.sw_dash_scale": "สร้างความเสียหายเพิ่มขึ้นตามระยะที่ทำได้ {boost}% {SP}", - "hud.skill.sw_spin_title": "หมุน", - "hud.skill.sw_spin": "เหวี่ยงดาบไปรอบตัว {SP}", - "hud.skill.sw_spin_dmg_title": "ทรงพลัง", - "hud.skill.sw_spin_dmg": "หมุนสร้างความเสียหายเพิ่มขึ้น {boost}% {SP}", - "hud.skill.sw_spin_spd_title": "รวดเร็ว", - "hud.skill.sw_spin_spd": "ความเร็วในการหมุนเพิ่มขึ้น {boost}% {SP}", - "hud.skill.sw_spin_cost_title": "ลดพลังงาน", - "hud.skill.sw_spin_cost": "ลดพลังงานที่ใช้ในการหมุนลง {boost}% {SP}", - "hud.skill.sw_spin_spins_title": "จำนวน", - "hud.skill.sw_spin_spins": "เพิ่มจำนวนรอบที่หมุน {SP}", - "hud.skill.sw_interrupt_title": "รำบำดาบขั้นสูง", - "hud.skill.sw_interrupt": "สามมารถฟันดาบต่อเนื่องติดต่อกันได้ {SP}", - // Axe - "hud.skill.axe_double_strike_title": "ฟันคู่", - "hud.skill.axe_double_strike": "ฟันให้ราบ", - "hud.skill.axe_double_strike_combo_title": "ฟันคู่ต่อเนื่อง", - "hud.skill.axe_double_strike_combo": "สามารถฟันติดต่อกันได้ {SP}", - "hud.skill.axe_double_strike_damage_title": "ทรงพลัง", - "hud.skill.axe_double_strike_damage": "การฟันแต่ละครั้งสร้างความเสียหายเพิ่มขึ้น {SP}", - "hud.skill.axe_double_strike_speed_title": "รวดเร็ว", - "hud.skill.axe_double_strike_speed": "การฟันแต่ละครั้งเพิ่มความเร็วโจมตี {SP}", - "hud.skill.axe_double_strike_regen_title": "ฟื้นฟูพลังงาน", - "hud.skill.axe_double_strike_regen": "การฟันแต่ละครั้งจะช่วยฟื้นฟูพลังงาน {SP}", - "hud.skill.axe_spin_title": "เอามือขึ้นแล้ว หมุน หมุน", - "hud.skill.axe_spin": "ชูมือขึ้นโบกไปมา", - "hud.skill.axe_infinite_axe_spin_title": "ไม่เวียนอีก", - "hud.skill.axe_infinite_axe_spin": "เหวียงขวานได้เรื่อย ๆ จนกว่าพลังงานจะหมด {SP}", - "hud.skill.axe_spin_damage_title": "ทรงพลัง", - "hud.skill.axe_spin_damage": "เหวียงขวานสร้างความเสียหมายเพิ่มขึ้น {boost}% {SP}", - "hud.skill.axe_spin_helicopter_title": "พลศาสตร์แรงยก", - "hud.skill.axe_spin_helicopter": "ตกถึงพื้นช้าลงในขณะที่เหวี่ยงขวาน {SP}", - "hud.skill.axe_spin_speed_title": "ความมเร็ว", - "hud.skill.axe_spin_speed": "เหวี่ยงขวานเร็วขึ้น {boost}% {SP}", - "hud.skill.axe_spin_cost_title": "ลดพลังงาน", - "hud.skill.axe_spin_cost": "เหวี่ยงขวานใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.axe_unlock_leap_title": "กระโดดฟัน", - "hud.skill.axe_unlock_leap": "กระโดดขึ้นไปในอากาศ และฟันศัตรู{SP}", - "hud.skill.axe_leap_damage_title": "ทรงพลัง", - "hud.skill.axe_leap_damage": "กระโดดฟันสร้างความเสียหายเพิ่มขึ้น {boost}% {SP}", - "hud.skill.axe_leap_knockback_title": "กระเด็นออก", - "hud.skill.axe_leap_knockback": "กระโดดฟันจะผลักศัตรูออกไปไกลขึ้น {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "ลดพลังงาน", - "hud.skill.axe_leap_cost": "กระโดดฟันใช้พลังงานน้อยลง {boost}% {SP}", - "hud.skill.axe_leap_distance_title": "กระโดดไกล", - "hud.skill.axe_leap_distance": "ระยะในการกระโดดเพิ่มขึ้น{boost}% {SP}", - // Mining - "hud.skill.mining_title": "ขุดหิน", - "hud.skill.pick_strike_title": "ขุด ขุด ขุด", - "hud.skill.pick_strike": "Hit rocks with the pickaxe to gain ore, gems and experience", - "hud.skill.pick_strike": "เมื่อขุดหินจะได้รับแร่หรืออัญมนีตามชินของหินที่ขุด", - "hud.skill.pick_strike_speed_title": "แข็งแรง", - "hud.skill.pick_strike_speed": "ขุดหินได้เร็วขึ้น {SP}", - "hud.skill.pick_strike_oregain_title": "โชคลาภ แร่", - "hud.skill.pick_strike_oregain": "มีโอกาสได้รับแร่มากขึ้น ({boost}% ต่อเลเเวล) {SP}", - "hud.skill.pick_strike_gemgain_title": "โชคลาภ อัญมนี", - "hud.skill.pick_strike_gemgain": "มีโอกาสได้รับอัญมนีมากขึ้น ({boost}% ต่อเลเวล){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/hud/social.ftl b/assets/voxygen/i18n/th_TH/hud/social.ftl new file mode 100644 index 0000000000..aface0d4a1 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = ผู้เล่นอื่น +hud-social-online = กำลังออนไลน์: +hud-social-friends = เพื่อน +hud-social-not_yet_available = ยังไม่สามารถใช้การได้ +hud-social-faction = ฝ่าย +hud-social-play_online_fmt = ผู้เล่น { $nb_player } คน กำลังออนไลน์ +hud-social-name = ชื่อ +hud-social-level = เลเวล +hud-social-zone = เขตพื้นที่ +hud-social-account = บัญชี \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/social.ron b/assets/voxygen/i18n/th_TH/hud/social.ron deleted file mode 100644 index 4599cc2452..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.social": "ผู้เล่นอื่น", - "hud.social.online": "กำลังออนไลน์:", - "hud.social.friends": "เพื่อน", - "hud.social.not_yet_available": "ยังไม่สามารถใช้การได้", - "hud.social.faction": "ฝ่าย", - "hud.social.play_online_fmt": "ผู้เล่น {nb_player} คน กำลังออนไลน์", - "hud.social.name": "ชื่อ", - "hud.social.level": "เลเวล", - "hud.social.zone": "เขตพื้นที่", - "hud.social.account": "บัญชี", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/th_TH/hud/trade.ftl b/assets/voxygen/i18n/th_TH/hud/trade.ftl new file mode 100644 index 0000000000..aae7b92c76 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/hud/trade.ftl @@ -0,0 +1,20 @@ +hud-trade-trade_window = แลกสิ่งของ +hud-trade-phase1_description = หยิบสิ่งของที่ต้องการแลกไปไว้ในพื้นที่ที่กำหนด +hud-trade-phase2_description = กรุณาตรวจสิ่งของที่ต้องการแลกเปลี่ยน +hud-trade-phase3_description = อยู่ระหว่างการแลกเปลี่ยนสิ่งของ +hud-trade-persons_offer = ผู้เล่น { $playername } ต้องการแลกเปลี่ยนสิ่งของ +hud-trade-has_accepted = ผู้เล่น { $playername } ยอมรับการแลกเปลี่ยน +hud-trade-accept = ยอมรับ +hud-trade-decline = ปฏิเสธ +hud-trade-invite_sent = คำขอเพื่อแลฃกเปลี่ยนสิ่งของถูกส่งไปให้ผู้เล่น { $playername }. +hud-trade-result-completed = การแลกเปลี่ยนเสร็จสมบูรณ์ +hud-trade-result-declined = ปฏิเสธการแลกเปลี่ยน +hud-trade-result-nospace = ช่องสัมภาระไม่พอ การแลกเปลี่ยนถูกยกเลิก +hud-trade-buy_price = ราคาซื้อ +hud-trade-sell_price = ราคาขาย +hud-trade-coin = เหรียญ +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = สิ่งของที่คุณต้องการแลก +hud-trade-their_offer = สิ่งของที่เขาต้องการแลก +hud-trade-amount_input = เลือกสิ่งของ \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/hud/trade.ron b/assets/voxygen/i18n/th_TH/hud/trade.ron deleted file mode 100644 index cf8c906881..0000000000 --- a/assets/voxygen/i18n/th_TH/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - "hud.trade.trade_window": "แลกสิ่งของ", - "hud.trade.phase1_description": "หยิบสิ่งของที่ต้องการแลกไปไว้ในพื้นที่ที่กำหนด", - "hud.trade.phase2_description": "กรุณาตรวจสิ่งของที่ต้องการแลกเปลี่ยน", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "อยู่ระหว่างการแลกเปลี่ยนสิ่งของ", - "hud.trade.persons_offer": "ผู้เล่น {playername} ต้องการแลกเปลี่ยนสิ่งของ", - "hud.trade.has_accepted": "ผู้เล่น {playername} ยอมรับการแลกเปลี่ยน", - "hud.trade.accept": "ยอมรับ", - "hud.trade.decline": "ปฏิเสธ", - "hud.trade.invite_sent": "คำขอเพื่อแลฃกเปลี่ยนสิ่งของถูกส่งไปให้ผู้เล่น {playername}.", - "hud.trade.result.completed": "การแลกเปลี่ยนเสร็จสมบูรณ์", - "hud.trade.result.declined": "ปฏิเสธการแลกเปลี่ยน", - "hud.trade.result.nospace": "ช่องสัมภาระไม่พอ การแลกเปลี่ยนถูกยกเลิก", - "hud.trade.buy_price": "ราคาซื้อ", - "hud.trade.sell_price": "ราคาขาย", - "hud.trade.coin": "เหรียญ", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "สิ่งของที่คุณต้องการแลก", - "hud.trade.their_offer": "สิ่งของที่เขาต้องการแลก", - "hud.trade.amount_input": "เลือกสิ่งของ" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/th_TH/main.ftl b/assets/voxygen/i18n/th_TH/main.ftl new file mode 100644 index 0000000000..30d466e088 --- /dev/null +++ b/assets/voxygen/i18n/th_TH/main.ftl @@ -0,0 +1,157 @@ +main-username = ชื่อผู้ใช้ +main-server = เซิร์ฟเวอร์ +main-password = รหัสผ่าน +main-connecting = อยู่ระหว่างการเชื่อมต่อ +main-creating_world = อยู่ระหว่างการสร้างโลก +main-tip = คำแนะนำ: +main-unbound_key_tip = ยกเลิกปุ่ม +main-notice = + ยินดีต้อนรับเข้าสู่โลกเวโลเรน (ในเวอร์ชั่นอัลฟา)! + + แต่ก่อนที่ความสนุกจะเริ่ม สิ่งที่คุณควรรู้คือ + + - ตัวเกมอยู่ในช่วงแรกของการพัฒนา ดังนั้น ตัวเกมจึงยังไม่สมบูรณ์ บางองค์ประกอบอาจขาดหายหรือทำงานผิดพลาด + + - หากคุณต้องการให้คำแนะนำเกี่ยวกับเกมหรือแจ้งบัค คุณสามารถติดต่อเราได้ที่ Reddit, GitLab หรือผ่านทาง Discord ของเรา + + - เวโลเรนจัดอยู่ในหมวดหมู่ลิขสิทธิ์ของ GPL-3 คือ อนุญาตให้ใช้งาน, ดัดแปลง และแจกจ่ายได้โดยไม่คิดค่าใช้จ่าย (แต่ต้องอยู่ภายลิขสิทธิ์เดียวกัน) + + - เวโลเรนเป็นเกมที่สร้างขึ้นโดยไม่หวังผลกำไร ผู้ที่มีส่วนร่วมทุกคนเป็นอาสาสมัคร + ดังนั้นถ้าคุณสนใจอยากเข้าร่วม ทางทีมพัฒนายินดีต้อนรับเสมอ + + ท้ายที่สุดเราขอขอบคุณที่สละเวลาอ่านสาส์นน้อย ๆ เล่มนี้ เราหวังว่าคุณจะได้รับสนุกจากเกมของเรา + + ~ ด้วยความเคารพ ทีมผู้พัฒนา + + Welcome to the alpha version of Veloren! + + Before you dive into the fun, please keep a few things in mind: + + - This is a very early alpha. Expect bugs, extremely unfinished gameplay, unpolished mechanics, and missing features. + + - If you have constructive feedback or bug reports, you can contact us via Reddit, GitLab, or our community Discord server. + + - Veloren is licensed under the GPL 3 open-source licence. That means you're free to play, modify, and redistribute the game however + you wish (provided derived work is also under GPL 3). + + - Veloren is a non-profit community project, and everybody working on it is a volunteer. + If you like what you see, you're welcome to join the development or art teams! + + Thanks for taking the time to read this notice, we hope you enjoy the game! + + ~ The Veloren Devs +main-login_process = + ขั้นตอนการเข้าเกม: + + คุณอาจจำเป็นจะต้องสมัครรหัสเพื่อเข้าเล่นบางเซิร์ฟเวอร์ + + สร้างรหัสได้ที่ + + https://veloren.net/account/. +main-login-server_not_found = + ไม่พบเซิร์ฟเวอร์ + Server not found +main-login-authentication_error = + ยินยันรหัสผิดพลาด + Auth error on server +main-login-internal_error = + เกิดข้อผิดพลาดขึ้นกับตัวเกม (ตัวละครอาจถูกลบไปแล้ว) + Internal error on client (most likely, player character was deleted) +main-login-failed_auth_server_url_invalid = + ไม่สามารถยืนยันรหัสได้ + Failed to connect to auth server +main-login-insecure_auth_scheme = + ไม่อนุญาตให้ยืนยันตัวตนผ่านรูปแบบ HTTP เนื่องจากความปลอดภัย อนุญาตให้ใช้ HTTP ก็ต่อเมื่อทำการดีบัคหรือเมื่อรันบน localhost เท่านั้น + The auth Scheme HTTP is NOT supported. It's insecure! For development purposes, HTTP is allowed for 'localhost' or debug builds +main-login-server_full = + เซิร์ฟเวอร์เต็ม + Server is full +main-login-untrusted_auth_server = + เซิร์ฟเวอร์ที่ใช้ในการยืนยันรหัสไม่น่าไว้วางใจ + Auth server not trusted +main-login-outdated_client_or_server = + เซิร์ฟเวอร์ล้มเหลว: อาจเกิดจากตัวเกมไม่ได้รับการอัพเดท โปรดอัพเดทตัวเกม + ServerWentMad: Probably versions are incompatible, check for updates. +main-login-timeout = + หมดเวลา: เซิร์ฟเวอร์ไม่ตอบกลับในเวลาที่กำหนด (เซิร์ฟเวอร์อาจเต็มหรือเกิดปัญหากับเคลือข่าย) + Timeout: Server did not respond in time. (Overloaded or network issues). +main-login-server_shut_down = + เซิร์ฟเวอร์ปิดอยู่ + Server shut down +main-login-network_error = + เคลือข่ายขัดข้อง + Network error +main-login-network_wrong_version = + เวอร์ชั่นของตัวเกมและเซิร์ฟเวอร์ไม่ตรงกัน โปรดอัพเดทตัวเกม + Mismatched server and client version, please update your game client. +main-login-failed_sending_request = + ยืนยันรหัสล้มเหลว + Request to Auth server failed +main-login-invalid_character = + ไม่สามารถเลือกตัวละครได้ + The selected character is invalid +main-login-client_crashed = + ตัวเกมปิดตัวลงกระทันหัน + Client crashed +main-login-not_on_whitelist = + ต้องได้รับคำอนุญาตในการเชื่อมต่อเข้าเซิร์ฟเวอร์ + You need a Whitelist entry by an Admin to join +main-login-banned = ถูกแบนจากเซิร์ฟเวอร์ เนื่องจากเหตุผลต่อไปนี้ +main-login-kicked = ถูกเตะจากเซิร์ฟเวอร์ เนื่องจากเหตุผลต่อไปนี้ +main-login-select_language = เลือกภาษา +main-login-client_version = เวอร์ชั่นของตัวเกม +main-login-server_version = เวอร์ชั่นของเซิร์ฟเวอร์ +main-login-client_init_failed = + ไม่สามารถเริ่มตัวเกมได้ เนื่องจาก { $init_fail_reason } + Client failed to initialize: { $init_fail_reason } +main-login-username_bad_characters = ชื่อประกอบตัวตัวอักษรต้องห้าม (อนุญาตให้ใช้ตัวอักษร a-z, 0-9, '_' และ '-' เท่านั้น) +main-login-username_too_long = ชื่อยาวเกินไป เต็มที่ { $max_len } ตัวอักษร +main-servers-select_server = เลือกเซิร์ฟเวอร์ +main-servers-singleplayer_error = + ไม่สามารถเข้าเล่มโหมดผู้เล่นคนเดียวได้ ข้อผิดพลาด:{ $sp_error } + Failed to connect to internal server: { $sp_error } +main-servers-network_error = + เกิดความผิดพลาดขึ้นกับเคลือข่าย ข้อผิดพลาด: { $raw_error } + Server network/socket error: { $raw_error } +main-servers-participant_error = + โปรโตคอลผิดพลาด ข้อผิดพลาด: { $raw_error } + Participant disconnect/protocol error: { $raw_error } +main-servers-stream_error = + เกิดข้อผิดพลาดกับการเชื่อมต่อ, การบีบอัดข้อมูล หรือการอ่านข้อมูล: { $raw_error } + Client connection/compression/(de)serialization error: { $raw_error } +main-servers-database_error = + ฐานข้อมูลของเซิร์ฟเวอร์ล้มเหลว ข้อผิดพลาด: { $raw_error } + Server database error: { $raw_error } +main-servers-persistence_error = + เซิร์ฟเวอร์ไม่สามารถรักษาข้อมูลได้ ข้อผิดพลาด: { $raw_error } + Server persistence error (Probably Asset/Character Data related): { $raw_error } +main-servers-other_error = Server general error: { $raw_error } +main-credits = เครดิต +main-credits-created_by = โดย +main-credits-music = เพลง +main-credits-fonts = ตัวหนังสือ +main-credits-other_art = การออกแบบอื่น ๆ +main-credits-contributors = ผู้สนับสนุน +loading-tips = + .a0 = ในโลกที่มืดมิดกด '{ $gameinput-togglelantern }' เพื่อจุดตะเกียงได้นะ + .a1 = กด '{ $gameinput-help }' เพื่อดูปุ่มควมคุมต่าง ๆ ได้ + .a2 = ใช้คำสั่ง /say หรือ /s ในช่องสนทนาเพื่อพูดคุยกับผู้เล่นที่อยู่ใกล้ ๆ + .a3 = ใช้คำสั่ง /region หรือ /r ในช่องสนทนาเพื่อพูดคุยกับผู้เล่นที่ในระยะหนึ่งบล็อค + .a4 = ผู้ที่เป็นแอดมินสามารถใช้คำสั่ง /build เพื่อเข้าสู่โหมดสร้างได้ + .a5 = ใช้คำสั่ง /group หรือ /g ในช่องสนทนาเพื่อพูดคุยกับผู้เล่นที่อยู่ในปาร์ตี้ + .a6 = อยากคุยกับใครเป็นการส่วนตัว ใช้คำสั่ง /tell ตามด้วยชื่อผู้เล่นและข้อความ เพื่อกระซิบ + .a7 = อาหาร, ไห และกล่องสมบัติสามารถพบได้ทั่วไป ลองหาดูดี ๆ นะ + .a8 = กระเป๋าเต็มเพราะอาหารเยอะใช่ไหม? ลองทำอาหารที่ดีกว่าจากอาหารที่มีอยู่สิ + .a9 = นั่งว่าง ๆ ไม่มีอะไรทำหรอ? ลองไปตะลุยดันเจียนสักหน่อยไหมหล่ะ? + .a10 = อย่าลืมตั้งค่ากราฟฟิกให้เหมาะสมกับหน้าจอของตัวเองนะ กด '{ $gameinput-settings }' เพื่อเปิดเมนูตั้งค่า + .a11 = เล่นกับเพื่อนจะยิ่งสนุกกว่า กด '{ $gameinput-social }' เพื่อดูว่าเพื่อนคนไหนกำลังออนไลน์ + .a12 = กด '{ $gameinput-dance }' เพื่อเต้น ไหนเอาท่าเต้นมาดูหน่อยสิ! + .a13 = กด '{ $gameinput-glide }' เพื่อใช้เครื่องร่อน วันนี้เราจะไปแตะขอบฟ้ากัน! + .a14 = ถึงแม้ว่าเวโลเรนจะยังอยู่ในช่วง Pre-Aplha แต่พวกเราก็ตั้งใจพัฒนาเกมทุกวันนะ! + .a15 = อยากมีส่วนร่วมในการพัฒนาเวโลเรนหรืออยากคุยกับทีมพัฒนาใช่ไหม มาเจอเราใน Discord สิ! + .a16 = คุณสามารถปิดตัวเลขที่แสดงพลังชีวิตได้ด้วยการตั้งค่า + .a17 = นั่งพักใกล้ ๆ แคมป์ไฟ (กด '{ $gameinput-sit }') เพื่อฟื้นฟูพลังชีวิตและความเหนื่อยล้า + .a18 = ประสบปัญหากระเป๋าเต็มหรือเกราะไม่โหดพอใช่ไหม สร้างกระเป๋าและเกราะที่โหดขึ้นกว่าเดิมได้โดยการเปิดเมนูสร้างของ กด '{ $gameinput-crafting }' + .a19 = กด '{ $gameinput-roll }' เพื่อหลบการโจมตีแบบดิจิทัล + .a20 = ไม่แน่ใจว่าวัตถุในการสร้างของหาจากไหนหรอ? พิม 'input:' ในแถบด้านบนเพื่อดูวัตถุที่ต้องใช้ + .a21 = ถ่ายรูปเท่ห์ ๆ ไปอวดเพื่อนด้วย '{ $gameinput-screenshot }' \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/main.ron b/assets/voxygen/i18n/th_TH/main.ron deleted file mode 100644 index 73ca7f4d4b..0000000000 --- a/assets/voxygen/i18n/th_TH/main.ron +++ /dev/null @@ -1,154 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - /// Start Main screen section - "main.username": "ชื่อผู้ใช้", - "main.server": "เซิร์ฟเวอร์", - "main.password": "รหัสผ่าน", - "main.connecting": "อยู่ระหว่างการเชื่อมต่อ", - "main.creating_world": "อยู่ระหว่างการสร้างโลก", - "main.tip": "คำแนะนำ:", - "main.unbound_key_tip": "ยกเลิกปุ่ม", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"ยินดีต้อนรับเข้าสู่โลกเวโลเรน (ในเวอร์ชั่นอัลฟา)! - -แต่ก่อนที่ความสนุกจะเริ่ม สิ่งที่คุณควรรู้คือ - -- ตัวเกมอยู่ในช่วงแรกของการพัฒนา ดังนั้น ตัวเกมจึงยังไม่สมบูรณ์ บางองค์ประกอบอาจขาดหายหรือทำงานผิดพลาด - -- หากคุณต้องการให้คำแนะนำเกี่ยวกับเกมหรือแจ้งบัค คุณสามารถติดต่อเราได้ที่ Reddit, GitLab หรือผ่านทาง Discord ของเรา - -- เวโลเรนจัดอยู่ในหมวดหมู่ลิขสิทธิ์ของ GPL-3 คือ อนุญาตให้ใช้งาน, ดัดแปลง และแจกจ่ายได้โดยไม่คิดค่าใช้จ่าย (แต่ต้องอยู่ภายลิขสิทธิ์เดียวกัน) - -- เวโลเรนเป็นเกมที่สร้างขึ้นโดยไม่หวังผลกำไร ผู้ที่มีส่วนร่วมทุกคนเป็นอาสาสมัคร -ดังนั้นถ้าคุณสนใจอยากเข้าร่วม ทางทีมพัฒนายินดีต้อนรับเสมอ - -ท้ายที่สุดเราขอขอบคุณที่สละเวลาอ่านสาส์นน้อย ๆ เล่มนี้ เราหวังว่าคุณจะได้รับสนุกจากเกมของเรา - -~ ด้วยความเคารพ ทีมผู้พัฒนา - -Welcome to the alpha version of Veloren! - -Before you dive into the fun, please keep a few things in mind: - -- This is a very early alpha. Expect bugs, extremely unfinished gameplay, unpolished mechanics, and missing features. - -- If you have constructive feedback or bug reports, you can contact us via Reddit, GitLab, or our community Discord server. - -- Veloren is licensed under the GPL 3 open-source licence. That means you're free to play, modify, and redistribute the game however - you wish (provided derived work is also under GPL 3). - -- Veloren is a non-profit community project, and everybody working on it is a volunteer. -If you like what you see, you're welcome to join the development or art teams! - -Thanks for taking the time to read this notice, we hope you enjoy the game! - -~ The Veloren Devs"#, - - // Login process description - "main.login_process": r#"ขั้นตอนการเข้าเกม: - -คุณอาจจำเป็นจะต้องสมัครรหัสเพื่อเข้าเล่นบางเซิร์ฟเวอร์ - -สร้างรหัสได้ที่ - -https://veloren.net/account/."#, - "main.login.server_not_found": r#"ไม่พบเซิร์ฟเวอร์ -Server not found"#, - "main.login.authentication_error": r#"ยินยันรหัสผิดพลาด -Auth error on server"#, - "main.login.internal_error": r#"เกิดข้อผิดพลาดขึ้นกับตัวเกม (ตัวละครอาจถูกลบไปแล้ว) -Internal error on client (most likely, player character was deleted)"#, - "main.login.failed_auth_server_url_invalid": r#"ไม่สามารถยืนยันรหัสได้ -Failed to connect to auth server"#, - "main.login.insecure_auth_scheme": r#"ไม่อนุญาตให้ยืนยันตัวตนผ่านรูปแบบ HTTP เนื่องจากความปลอดภัย อนุญาตให้ใช้ HTTP ก็ต่อเมื่อทำการดีบัคหรือเมื่อรันบน localhost เท่านั้น -The auth Scheme HTTP is NOT supported. It's insecure! For development purposes, HTTP is allowed for 'localhost' or debug builds"#, - "main.login.server_full": r#"เซิร์ฟเวอร์เต็ม -Server is full"#, - "main.login.untrusted_auth_server": r#"เซิร์ฟเวอร์ที่ใช้ในการยืนยันรหัสไม่น่าไว้วางใจ -Auth server not trusted"#, - "main.login.outdated_client_or_server": r#"เซิร์ฟเวอร์ล้มเหลว: อาจเกิดจากตัวเกมไม่ได้รับการอัพเดท โปรดอัพเดทตัวเกม -ServerWentMad: Probably versions are incompatible, check for updates."#, - "main.login.timeout": r#"หมดเวลา: เซิร์ฟเวอร์ไม่ตอบกลับในเวลาที่กำหนด (เซิร์ฟเวอร์อาจเต็มหรือเกิดปัญหากับเคลือข่าย) -Timeout: Server did not respond in time. (Overloaded or network issues)."#, - "main.login.server_shut_down": r#"เซิร์ฟเวอร์ปิดอยู่ -Server shut down"#, - "main.login.network_error": r#"เคลือข่ายขัดข้อง -Network error"#, - "main.login.network_wrong_version": r#"เวอร์ชั่นของตัวเกมและเซิร์ฟเวอร์ไม่ตรงกัน โปรดอัพเดทตัวเกม -Mismatched server and client version, please update your game client."#, - "main.login.failed_sending_request": r#"ยืนยันรหัสล้มเหลว -Request to Auth server failed"#, - "main.login.invalid_character": r#"ไม่สามารถเลือกตัวละครได้ -The selected character is invalid"#, - "main.login.client_crashed": r#"ตัวเกมปิดตัวลงกระทันหัน -Client crashed"#, - "main.login.not_on_whitelist": r#"ต้องได้รับคำอนุญาตในการเชื่อมต่อเข้าเซิร์ฟเวอร์ -You need a Whitelist entry by an Admin to join"#, - "main.login.banned": "ถูกแบนจากเซิร์ฟเวอร์ เนื่องจากเหตุผลต่อไปนี้", - "main.login.kicked": "ถูกเตะจากเซิร์ฟเวอร์ เนื่องจากเหตุผลต่อไปนี้", - "main.login.select_language": "เลือกภาษา", - "main.login.client_version": "เวอร์ชั่นของตัวเกม", - "main.login.server_version": "เวอร์ชั่นของเซิร์ฟเวอร์", - "main.login.client_init_failed": r#"ไม่สามารถเริ่มตัวเกมได้ เนื่องจาก {init_fail_reason} -Client failed to initialize: {init_fail_reason}"#, - "main.login.username_bad_characters": "ชื่อประกอบตัวตัวอักษรต้องห้าม (อนุญาตให้ใช้ตัวอักษร a-z, 0-9, '_' และ '-' เท่านั้น)", - "main.login.username_too_long": "ชื่อยาวเกินไป เต็มที่ {max_len} ตัวอักษร", - "main.servers.select_server": "เลือกเซิร์ฟเวอร์", - "main.servers.singleplayer_error": r#"ไม่สามารถเข้าเล่มโหมดผู้เล่นคนเดียวได้ ข้อผิดพลาด:{sp_error} -Failed to connect to internal server: {sp_error}"#, - "main.servers.network_error": r#"เกิดความผิดพลาดขึ้นกับเคลือข่าย ข้อผิดพลาด: {raw_error} -Server network/socket error: {raw_error}"#, - "main.servers.participant_error": r#"โปรโตคอลผิดพลาด ข้อผิดพลาด: {raw_error} -Participant disconnect/protocol error: {raw_error}"#, - "main.servers.stream_error": r#"เกิดข้อผิดพลาดกับการเชื่อมต่อ, การบีบอัดข้อมูล หรือการอ่านข้อมูล: {raw_error} -Client connection/compression/(de)serialization error: {raw_error}"#, - "main.servers.database_error": r#"ฐานข้อมูลของเซิร์ฟเวอร์ล้มเหลว ข้อผิดพลาด: {raw_error} -Server database error: {raw_error}"#, - "main.servers.persistence_error": r#"เซิร์ฟเวอร์ไม่สามารถรักษาข้อมูลได้ ข้อผิดพลาด: {raw_error} -Server persistence error (Probably Asset/Character Data related): {raw_error}"#, - "main.servers.other_error": "Server general error: {raw_error}", - - // Credits screen - "main.credits": "เครดิต", - "main.credits.created_by": "โดย", - "main.credits.music": "เพลง", - "main.credits.fonts": "ตัวหนังสือ", - "main.credits.other_art": "การออกแบบอื่น ๆ", - "main.credits.contributors": "ผู้สนับสนุน", - - /// End Main screen section - }, - - - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "ในโลกที่มืดมิดกด '{gameinput.togglelantern}' เพื่อจุดตะเกียงได้นะ", - "กด '{gameinput.help}' เพื่อดูปุ่มควมคุมต่าง ๆ ได้", - "ใช้คำสั่ง /say หรือ /s ในช่องสนทนาเพื่อพูดคุยกับผู้เล่นที่อยู่ใกล้ ๆ", - "ใช้คำสั่ง /region หรือ /r ในช่องสนทนาเพื่อพูดคุยกับผู้เล่นที่ในระยะหนึ่งบล็อค", - "ผู้ที่เป็นแอดมินสามารถใช้คำสั่ง /build เพื่อเข้าสู่โหมดสร้างได้", - "ใช้คำสั่ง /group หรือ /g ในช่องสนทนาเพื่อพูดคุยกับผู้เล่นที่อยู่ในปาร์ตี้", - "อยากคุยกับใครเป็นการส่วนตัว ใช้คำสั่ง /tell ตามด้วยชื่อผู้เล่นและข้อความ เพื่อกระซิบ", - "อาหาร, ไห และกล่องสมบัติสามารถพบได้ทั่วไป ลองหาดูดี ๆ นะ", - "กระเป๋าเต็มเพราะอาหารเยอะใช่ไหม? ลองทำอาหารที่ดีกว่าจากอาหารที่มีอยู่สิ", - "นั่งว่าง ๆ ไม่มีอะไรทำหรอ? ลองไปตะลุยดันเจียนสักหน่อยไหมหล่ะ?", - "อย่าลืมตั้งค่ากราฟฟิกให้เหมาะสมกับหน้าจอของตัวเองนะ กด '{gameinput.settings}' เพื่อเปิดเมนูตั้งค่า", - "เล่นกับเพื่อนจะยิ่งสนุกกว่า กด '{gameinput.social}' เพื่อดูว่าเพื่อนคนไหนกำลังออนไลน์", - "กด '{gameinput.dance}' เพื่อเต้น ไหนเอาท่าเต้นมาดูหน่อยสิ!", - "กด '{gameinput.glide}' เพื่อใช้เครื่องร่อน วันนี้เราจะไปแตะขอบฟ้ากัน!", - "ถึงแม้ว่าเวโลเรนจะยังอยู่ในช่วง Pre-Aplha แต่พวกเราก็ตั้งใจพัฒนาเกมทุกวันนะ!", - "อยากมีส่วนร่วมในการพัฒนาเวโลเรนหรืออยากคุยกับทีมพัฒนาใช่ไหม มาเจอเราใน Discord สิ!", - "คุณสามารถปิดตัวเลขที่แสดงพลังชีวิตได้ด้วยการตั้งค่า", - "นั่งพักใกล้ ๆ แคมป์ไฟ (กด '{gameinput.sit}') เพื่อฟื้นฟูพลังชีวิตและความเหนื่อยล้า", - "ประสบปัญหากระเป๋าเต็มหรือเกราะไม่โหดพอใช่ไหม สร้างกระเป๋าและเกราะที่โหดขึ้นกว่าเดิมได้โดยการเปิดเมนูสร้างของ กด '{gameinput.crafting}'", - "กด '{gameinput.roll}' เพื่อหลบการโจมตีแบบดิจิทัล", - "ไม่แน่ใจว่าวัตถุในการสร้างของหาจากไหนหรอ? พิม 'input:' ในแถบด้านบนเพื่อดูวัตถุที่ต้องใช้", - "ถ่ายรูปเท่ห์ ๆ ไปอวดเพื่อนด้วย '{gameinput.screenshot}'", - ], - } -) diff --git a/assets/voxygen/i18n/th_TH/npc.ftl b/assets/voxygen/i18n/th_TH/npc.ftl new file mode 100644 index 0000000000..84a774e23d --- /dev/null +++ b/assets/voxygen/i18n/th_TH/npc.ftl @@ -0,0 +1,212 @@ +npc-speech-villager = + .a0 = ฮืมมมม ชีส +npc-speech-villager_open = + .a0 = วัวคิดอะไรตอนกินหญ้านะ คิดเหมือนตอนเรากินข้าวหรือเปล่า? + .a1 = สงสัยไหมว่าทำไม Glowing Remains ถึงเรืองแสงได้ + .a2 = เคยเห็น Land Shark ไหม ฉันได้ข่าวว่ามีคนเจอแถบทะเลทราย + .a3 = อีกฝากของภูเขามีศัตรูอยู่ใช่ไหม? + .a4 = เคยฝากขนมไว้ให้กับน้อง แล้วพอกลับมาเอาคืนขนมหายไปไหม? น่าแปลกใจจริง ๆ + .a5 = เคยจับหิ้งห้อยไหม? เคยหรอ? + .a6 = เขาลือกันว่าในถ้ำมีอัญมนีเต็มไปหมดเลยนะ เชื่อไหม + .a7 = Sauroks พวกนี้มากจากไหนกันนะเต็มไปหมดเลย +npc-speech-villager_adventurous = + .a0 = สักวันฉันจะสร้างเครื่องร่อนแล้วบินไปแตะขอบฟ้าให้ได้เลย + .a1 = ไวฉันโตกว่านี้อีกนิดหนึ่งชั้นจะเข้าไปตะลุยถ้ำนั้นให้รู้แล้วรู้รอด +npc-speech-villager_closed = + .a0 = หน้าตาไม่คุ้นเลย ทำตัวตามสบายนะคนแปลกหน้า + .a1 = หมู่บ้านเราสุดยอดที่สุดแล้วในระแวงนี้หน่ะนะ + .a2 = มีคนเคยผ่านมาแล้วเล่าให้ฟังว่า Mushroom เนี่ยดีต่อสุขภาพสุด ๆ ฉันก็ไม่รู้หรอกนะว่าจริงแท้ขนาดไหน + .a3 = จะทำดี หรือจะไม่ทำดี กลับบ้านไปเลี้ยงวัวดีกว่า +npc-speech-villager_conscientious = + .a0 = ฉันไม่ใช่นักเดินทางหรอก แต่ก็มีอะไรให้ทำตลอดนั่นแหละ + .a1 = เชื่อไหมว่ามีคนคนหนึ่งสั่งฝนให้ตกได้ด้วยนะ +npc-speech-villager_busybody = + .a0 = ฉันกำลังยุ่งมาก ๆ ขอโทษทีนะ +npc-speech-villager_unconscientious = + .a0 = อาหารเช้าเป็นสิ่งสำคัญนะ มากินข้าว(รอบที่สอง)กันดีกว่า + .a1 = บ้านฉันไม่เรียบร้อยเท่าไหร่ แต่ถ้าฉันคิดแบบนั้นฉันก็ต้องเก็บกวาดอยู่ ไม่เอาดีกว่า ฮ่าฮ่าฮ่า + .a2 = เป็นเรื่องแล้วไง... แว่นตาหาย +npc-speech-villager_extroverted = + .a0 = เมื่อวันก่อนนะพี่ แหม่ไม่อยากจะเล่า + .a1 = อรุณเบิกฟ้า นกกาโบยบิน + .a2 = ว่าไงคุณนักเดินทาง อากาศแจ๋มเลยใช่ไหมหล่ะ + .a3 = ฉันได้บอกคุณหรือยังว่าฉันชอบชีสมาก ๆ เลย + .a4 = วันนี้เป็นอย่างไรบ้างคุณนักเดินทาง! + .a5 = ชีสคนแคระนี้ช่างอร่อยเกินบรรยายจริง ๆ ถ้าทำกินเองได้คงจะดีน่าดู + .a6 = คุณทำนายฝันเป็นไหม? เมื่อคืนฉันฝันว่ามีชีสก้อนเบ้อเร่อมารัดด้วยแหละ + .a7 = ฉันชอบน้ำผึ้งนะ แต่ไม่ถูกใจผึ้งเท่าไหร่ มีที่ไหนต่อยเขาแล้วตายเอง??? +npc-speech-villager_sociable = + .a0 = นั่งพักกินชีสกับเราก่อนไหมคุณนักเดินทาง? ฉันรับประกันว่าอร่อย + .a1 = อยากเห็นสวนสุดรักของพวกเรารึเปล่า ! ไม่หรอ?, โอเค..งั้ไว้ครั้งหน้าก็ได้. + .a2 = ฉันปลูกดอกไม้ไว้เต็มเลย อยากดูไหมคุณนักเดินทาง? ไม่อยากหรอ? แย่จัง +npc-speech-villager_introverted = + .a0 = มิงกาลาบา + .a1 = ฉันก็แค่ชาวบ้านธรรมดา ๆ ที่ผ่านทางมาก็เท่านั้นแหละ +npc-speech-villager_agreeable = + .a0 = วันนี้อากาศเย็นสบาย ใช่ไหมคุณนักเดินทาง + .a1 = ถ้ามีอะไรให้ช่วยบอกฉันได้เลยนะ + .a2 = แมวฉัน แมวฉันหาย มีใครเห็นแมวฉันไหม!? +npc-speech-villager_worried = + .a0 = ฉันมีลางสังหรณ์ไม่ดีเลย ระวังตัวด้วยนะคุณนักเดินทาง ฉันเป็นห่วงคุณเหลือเกิน +npc-speech-villager_disagreeable = + .a0 = คนสมัยนี้พูดตรงไปก็ไม่ชอบ พูดอ้อมไปก็ไม่ชอบ เอาแต่ใจจริง ๆ + .a1 = เดี๋ยวนี้คนเป็นอะไรไปหมดเปราะบางกันเหลือเกิน +npc-speech-villager_neurotic = + .a0 = มีดันเจียนอยู่ใกล้ ๆ แบบนี้ฉันรู้สึกไม่สบายใจเลย เมื่อไหร่จะมีคนไปกำจัดมอสเตอร์พวกนั้นนะ + .a1 = ต้องมีคนไปจัดพวก Cultist ให้ราบคาบไปสักที แค่ออกความเห็นนะ ไม่ได้จะอาสา + .a2 = ท้องไส้ไม่ดีเลย รู้สึกเหมือนเรื่องร้าย ๆ จะเกิดขึ้น + .a3 = พวก Wolf ชักจะเข้ามาใกล้หมู่บ้านเกินไปแล้ว ต้องหาคนฝีมือดีไปไล่ +npc-speech-villager_sad_loner = + .a0 = เหงาจัง + .a1 = ... ขอโทษที พอดีว่าฉันน่ะคุยไม่ค่อยเก่งเท่าไหร่ +npc-speech-villager_seeker = + .a0 = ฉันอยากไปเห็นโลกภายนอก นอกกำแพงนี้ นั่นแหละความฝันของฉันเอเรน เย... +npc-speech-villager_stable = + .a0 = วันนี้เป็นวันที่สงบดีจริง ๆ + .a1 = ชีวิตมันก็... ไม่ได้แย่ขนานนั้นนะ + .a2 = ช่างเป็นวันที่สดใส นกร้องขับขาน ดอกไม้เบ่งบาน ในวันแบบนี้คนแบบคุณควรไปเดินเล่นในป่า! +npc-speech-villager_decline_trade = + .a0 = ขอโทษที ฉันไม่ของอะไรจะแลกหรอก + .a1 = ชาวบ้านอย่างฉันจะมีของอะไรไปแลกกับคุณ + .a2 = บ้านหลังนี้ฉันยังโปะไม่หมดน่ะ คงจะแลกไม่ได้หรอกนะ! +npc-speech-merchant_advertisement = + .a0 = แวะดูสักนิด แวะพักสักหน่อย อาจจะเจอของที่ถูกใจนะคุณนักเดินทาง + .a1 = อยากซื้อขายรึเปล่าเอ่ย? + .a2 = ฉันมีของเด็ด เด็ดเยอะแยะเลยนะ อยากจะดูไหมหล่ะ? +npc-speech-merchant_busy = + .a0 = ช้าก่อนสหาย ฉันมีแค่สองมือ + .a1 = สักครู่นะ ใกล้จะเสร็จแล้ว + .a2 = ฉันยุ่งมากเลย ขอเวลาอีกสักพักรพ +npc-speech-merchant_busy_rude = + .a0 = เด็กสมัยนี้รอไม่เป็นเลยรึ + .a1 = กลับไปต่อแถวซะ เจ้าคนไร้สามัญสำนึก + .a2 = แซงคิวแบบนี้ นิสัยไม่ดีเลยนะ +npc-speech-merchant_trade_successful = + .a0 = ยินดีที่ได้ทำธุริกจร่วมกัน สหาย + .a1 = ขอบคุณนะ +npc-speech-merchant_trade_declined = + .a0 = แหม่ น่าเสียดายจริง ๆ ไว้คราวหน้าก็แล้วก็ + .a1 = อินิดูก่อนแล้วกลับมาซื้อทีหลังได้นะจ๊ะนายจ๋า +npc-speech-villager_cultist_alarm = + .a0 = ทุกคนระวัง! พวก Cultist กำลังมา! + .a1 = ผู้ชายมาทางนี้! พวก Cultist บุกแล้ว! + .a2 = ใจกล้ามากที่จะตีหมู่บ้านของเรา เจ้าพวก Cultist! + .a3 = ทำให้มันเสียใจที่มาบุกหมู่บ้านเรา! + .a4 = อย่าให้พวกมันคิดว่าเราอ่อนแอ แสดงให้มันเห็นว่าไม่กลัวมัน + .a5 = เจ้าพวก Cultist สารเลว + .a6 = เป็นไงรสชาติคมดาบฉันถูกปากไหม เจ้าพวก Cultist โสมม + .a7 = ชีวิตของคนบริสุทธิ์ที่ไร้ทางสู้ พวกแกจะต้องชดใช้ + .a8 = พระเจ้าช่วยกล้วยทอด มีพวก Cultist ปลอมตัวมาในหมู่พวกเรา + .a9 = ความชั่วร้ายของพวกแก จะจบอยู่ที่นี้! + .a10 = อย่างแกเนี่ยต้องเจอคนอย่างฉัน! + .a11 = สวดมนต์อ้อนวอนไปก็เท่านั้นแหละ เจ้าพวก Cultist + .a12 = มันอยู่ตรงนั้น พวกลุย + .a13 = ตรงหน้าสิบสองนาฬิกา พวกเราจัดให้มันสักดอก + .a14 = ตรงนั้น อย่ามันรอดไปได้ + .a15 = สนใจรับความตายร้อน ๆ สักจอกไหมหล่ะ เดี๋ยวฉันเลี้ยงเอง + .a16 = ฉันจะไม่วันลืมสิ่งที่แกทำกับฉัน ไม่มีวัน! + .a17 = ชีวิตที่น่าสังเวช จบสิ้นเพียงเท่านี้ + .a18 = ลัทธิอันโสโครก สิ้นสุดแล้ว + .a19 = กรรมติดคมดาบ + .a20 = ขอโทษที แต่พวกเราไม่ต้อนรับ + .a21 = อยู่แบบหลบ ๆ ซ่อน ๆ ก็ดีอยู่แล้ว +npc-speech-villager_under_attack = + .a0 = ทางนี้! ช่วยด้วย! + .a1 = ทางนี้! ช่วยด้วย! + .a2 = โอ้ย! เล่นแรงจัง โป้ง! ไม่เล่นด้วยแล้ว + .a3 = โอ้ย! เล่นแรงจัง โป้ง! ไม่เล่นด้วยแล้ว + .a4 = ฉันพลาดท่าแล้ว ช่วยด้วย! ทางนี้! + .a5 = ได้ทีขี่ม้าไล่เลยนะ ใครก็ได้ช่วยmu! + .a6 = ช่วยด้วย! + .a7 = เจ็บเหลือเกิน ใครก็ได้ช่วยฉันmy! + .a8 = อั๊ก ช่วย...ด้วย ได้โปรด + .a9 = ทางนี้! ทางนี้! + .a10 = ทางนี้! ทางนี้! เร็วเข้า! + .a11 = ฉันต้านไว้ได้อีกไม่นาน + .a12 = บ้าที่สุด! ขอกำลังเสริมด่วน! + .a13 = บัดสบเอ๊ย! ขอกำลังเสริมด่วน! + .a14 = ใครก็ได้ช่วยพวกเราด้วย! + .a15 = ฆาตกรเต็มไปหมด ช่วยฉันที! + .a16 = ฆาตกรเต็มไปหมด ทุกคนต้านไว้! + .a17 = ช่วยด้วย! พวกมันจะฆ่าฉัน + .a18 = ทหาร ทางนี้เร็วเข้า! + .a19 = ทหาร ทางนี้! + .a20 = ทหาร! ได้โปรดปกป้องฉันด้วย + .a21 = ทหาร! ใครก็ได้! ฉันกลัวเหลือเกิน + .a22 = ทหาร! มีเรื่องแล้ว! + .a23 = ทหาร! ทหาร! + .a24 = ทหาร! มีผู้ร้ายอยู่ตรงนี้! + .a25 = ใครก็ได้ จัดการคนพวกนี้ที! + .a26 = ทหาร! มีคนจะทำร้ายฉัน + .a27 = พระเจ้าคุ้มครอง + .a28 = ทหารหายไปไหนกันหมด ฉันอยู่ตรงนี้! ช่วยด้วย! + .a29 = สารเลว! + .a30 = ได้โปรด ฉันยังไม่อยากตาย + .a31 = ได้โปรด พระเจ้าช่วยคุ้มครองลูกด้วย + .a32 = โอ้ย! เจ็บนะ! + .a33 = พวกมันกำลังจะมาฆ่าฉัน + .a34 = พวกมันจะบูชาฉัน ช่วยด้วย! + .a35 = ความรุนแรง ช่างเป็นวงจรที่อุบาวท์เสียจริง + .a36 = แค่นี้ ไกลหัวใจ (ปอด) + .a37 = พอใจหรือยัง + .a38 = ฉันไปทำอะให้แค้นเคืองกันหรือยังไง + .a39 = อย่าทำอะไรฉันอีกเลย ฉันกลัวแล้ว + .a40 = ถือมีดระวังหน่อยสิ เกิดผีผลักขึ้นมาจะทำยังไง! + .a41 = ฉันขอสาปแช่งพวกแกทุกตน + .a42 = ได้โปรด ได้โปรด + .a43 = ชักจะมีน้ำโหขึ้นมาแล้วนะ! + .a44 = อาการมันเป็นยังไงหนิ พี่บ่าว + .a45 = ฉันเอาคืนให้สาสมเลยคอยดู + .a46 = ฉันไม่ของมีค่าอะไรหรอก อย่าทำอะไรฉันเลย + .a47 = หยุดนะ ไม่งั้นฉันจะไปฟ้องพ่อ ให้มาจัดการคุณ + .a48 = แงงงงง แม่จ้าช่วยหนูด้วยยยย + .a49 = เทวดาฟ้าดินเป็นพยาน + .a50 = สหาย อย่าทำแบบนี้เลย มันบาปนะ + .a51 = นี้! นิสัยไม่ดีเลยนะ + .a52 = พอได้หรือยังพ่อคุณ รู้แล้วว่าเก่ง + .a53 = ไว้ชีวิตข้าน้อยด้วย + .a54 = ฉันมีครอบครัวที่ต้องเลี้ยง ถ้าฉันตายพวกเขาจะอยู่ยังไง + .a55 = ฉันยังเด็กอย่าทำอะไรฉันเลย + .a56 = ค่อย ๆ พูด ค่อย ๆ จากันก่อนสหาย + .a57 = ใช้ความรุนแรงแก้ปัญหาไม่ได้นะ มันไม่ถูกต้อง! + .a58 = ถึงว่าหล่ะ เมื่อเช้าจิ้งจกทัก... + .a59 = อุ๊ย เจ็บนะ ระวังหน่อยสิ! + .a60 = ว๊ายยยยยยยยยย + .a61 = ไร้มารยาทสิ้นดี + .a62 = พอเถอะก่อนจะบานปลาย + .a63 = สาธุ ของให้หน้าเป็นสิว + .a64 = สนุกอยู่คนเดียวแบบนี้ ใช้่ไม่ได้ + .a65 = รู้ไหมว่าฉันเป็นลูกใคร!? + .a66 = ระวังเถอะ เวรกรรมจะตามทัน + .a67 = หยุดเถอะ ก่อนจะเจ็บตัว + .a68 = ช้าก่อน ฉันไม่อยากมีเรื่อง + .a69 = ต้องมีเรื่องอะไรเข้าใจผิดกันแน่ ๆ + .a70 = เราอย่าใช้กำลังคุยกันเลยนะ + .a71 = ไส่หัวไป เจ้าคนสถุน + .a72 = เจ็บไปหมดแล้ว + .a73 = มาอารมณ์ไหนอีกละเนี่ย + .a74 = ฉันชักจะรำคาญแล้วสิ + .a75 = จ จำคนผิดแล้ววววว + .a76 = เสี่ยส่งคนมาจริง ๆ หรอเนี่ย? + .a77 = พอเถอะนะ เอาจริง ๆ จากใจเลย + .a78 = ทหาร! เอามันไปขัง + .a79 = ส่งหมาไปกัดซะดีไหม + .a80 = ฉันผิดอารายยยยย +npc-speech-villager_enemy_killed = + .a0 = ต่อหน้าข้า ศัตรูพ่ายแพ้เช่นเคย + .a1 = ความสงบสุขกลับมาอีกครั้ง + .a2 = ... เรา มาทำอะไรอยู่ตรงนี้กันนะ +npc-speech-menacing = + .a0 = อย่าบอกว่าไม่เตือนนะ + .a1 = ห่าง ๆ หน่อยสหาย + .a2 = น่ากลัวตายหล่ะ + .a3 = ไปไหนก็ไป + .a4 = อยากหลับแบบไม่ง่วงสิท่า + .a5 = ไม่ชอบขี้หน้าเลยแหะ +npc-speech-cultist_low_health_fleeing = + .a0 = พี่น้องข้า กลับไปตั้งหลัก! + .a1 = พี่น้องข้า ถอย! + .a2 = ฝากไว้ก่อนเถอะ + .a3 = ความอัปยศนี้ ข้าจะตามล้างแค้นทุกชาติไป + .a4 = เหนื่อยเหลือเกิน ต้อง... หนี + .a5 = ทุกอย่าง ดู... มืดไปหมด \ No newline at end of file diff --git a/assets/voxygen/i18n/th_TH/npc.ron b/assets/voxygen/i18n/th_TH/npc.ron deleted file mode 100644 index 9c9006eb69..0000000000 --- a/assets/voxygen/i18n/th_TH/npc.ron +++ /dev/null @@ -1,250 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for ไทย (Thai) -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "ฮืมมมม ชีส", - ], - "npc.speech.villager_open": [ - "วัวคิดอะไรตอนกินหญ้านะ คิดเหมือนตอนเรากินข้าวหรือเปล่า?", - "สงสัยไหมว่าทำไม Glowing Remains ถึงเรืองแสงได้", - "เคยเห็น Land Shark ไหม ฉันได้ข่าวว่ามีคนเจอแถบทะเลทราย", - "อีกฝากของภูเขามีศัตรูอยู่ใช่ไหม?", - "เคยฝากขนมไว้ให้กับน้อง แล้วพอกลับมาเอาคืนขนมหายไปไหม? น่าแปลกใจจริง ๆ", - "เคยจับหิ้งห้อยไหม? เคยหรอ?", - "เขาลือกันว่าในถ้ำมีอัญมนีเต็มไปหมดเลยนะ เชื่อไหม", - "Sauroks พวกนี้มากจากไหนกันนะเต็มไปหมดเลย", - ], - "npc.speech.villager_adventurous": [ - "สักวันฉันจะสร้างเครื่องร่อนแล้วบินไปแตะขอบฟ้าให้ได้เลย", - "ไวฉันโตกว่านี้อีกนิดหนึ่งชั้นจะเข้าไปตะลุยถ้ำนั้นให้รู้แล้วรู้รอด", - ], - "npc.speech.villager_closed": [ - "หน้าตาไม่คุ้นเลย ทำตัวตามสบายนะคนแปลกหน้า", - "หมู่บ้านเราสุดยอดที่สุดแล้วในระแวงนี้หน่ะนะ", - "มีคนเคยผ่านมาแล้วเล่าให้ฟังว่า Mushroom เนี่ยดีต่อสุขภาพสุด ๆ ฉันก็ไม่รู้หรอกนะว่าจริงแท้ขนาดไหน", - "จะทำดี หรือจะไม่ทำดี กลับบ้านไปเลี้ยงวัวดีกว่า", - ], - "npc.speech.villager_conscientious": [ - "ฉันไม่ใช่นักเดินทางหรอก แต่ก็มีอะไรให้ทำตลอดนั่นแหละ", - "เชื่อไหมว่ามีคนคนหนึ่งสั่งฝนให้ตกได้ด้วยนะ", - ], - "npc.speech.villager_busybody": [ - "ฉันกำลังยุ่งมาก ๆ ขอโทษทีนะ", - ], - "npc.speech.villager_unconscientious": [ - "อาหารเช้าเป็นสิ่งสำคัญนะ มากินข้าว(รอบที่สอง)กันดีกว่า", - "บ้านฉันไม่เรียบร้อยเท่าไหร่ แต่ถ้าฉันคิดแบบนั้นฉันก็ต้องเก็บกวาดอยู่ ไม่เอาดีกว่า ฮ่าฮ่าฮ่า", - "เป็นเรื่องแล้วไง... แว่นตาหาย", - ], - "npc.speech.villager_extroverted": [ - "เมื่อวันก่อนนะพี่ แหม่ไม่อยากจะเล่า", - "อรุณเบิกฟ้า นกกาโบยบิน", - "ว่าไงคุณนักเดินทาง อากาศแจ๋มเลยใช่ไหมหล่ะ", - "ฉันได้บอกคุณหรือยังว่าฉันชอบชีสมาก ๆ เลย", - "วันนี้เป็นอย่างไรบ้างคุณนักเดินทาง!", - "ชีสคนแคระนี้ช่างอร่อยเกินบรรยายจริง ๆ ถ้าทำกินเองได้คงจะดีน่าดู", - "คุณทำนายฝันเป็นไหม? เมื่อคืนฉันฝันว่ามีชีสก้อนเบ้อเร่อมารัดด้วยแหละ", - "ฉันชอบน้ำผึ้งนะ แต่ไม่ถูกใจผึ้งเท่าไหร่ มีที่ไหนต่อยเขาแล้วตายเอง???", - ], - "npc.speech.villager_sociable": [ - "นั่งพักกินชีสกับเราก่อนไหมคุณนักเดินทาง? ฉันรับประกันว่าอร่อย", - "อยากเห็นสวนสุดรักของพวกเรารึเปล่า ! ไม่หรอ?, โอเค..งั้ไว้ครั้งหน้าก็ได้.", - "ฉันปลูกดอกไม้ไว้เต็มเลย อยากดูไหมคุณนักเดินทาง? ไม่อยากหรอ? แย่จัง", - ], - "npc.speech.villager_introverted": [ - "มิงกาลาบา", - "ฉันก็แค่ชาวบ้านธรรมดา ๆ ที่ผ่านทางมาก็เท่านั้นแหละ", - ], - "npc.speech.villager_agreeable": [ - "วันนี้อากาศเย็นสบาย ใช่ไหมคุณนักเดินทาง", - "ถ้ามีอะไรให้ช่วยบอกฉันได้เลยนะ", - "แมวฉัน แมวฉันหาย มีใครเห็นแมวฉันไหม!?", - ], - "npc.speech.villager_worried": [ - "ฉันมีลางสังหรณ์ไม่ดีเลย ระวังตัวด้วยนะคุณนักเดินทาง ฉันเป็นห่วงคุณเหลือเกิน", - ], - "npc.speech.villager_disagreeable": [ - "คนสมัยนี้พูดตรงไปก็ไม่ชอบ พูดอ้อมไปก็ไม่ชอบ เอาแต่ใจจริง ๆ", - "เดี๋ยวนี้คนเป็นอะไรไปหมดเปราะบางกันเหลือเกิน", - ], - "npc.speech.villager_neurotic": [ - "มีดันเจียนอยู่ใกล้ ๆ แบบนี้ฉันรู้สึกไม่สบายใจเลย เมื่อไหร่จะมีคนไปกำจัดมอสเตอร์พวกนั้นนะ", - "ต้องมีคนไปจัดพวก Cultist ให้ราบคาบไปสักที แค่ออกความเห็นนะ ไม่ได้จะอาสา", - "ท้องไส้ไม่ดีเลย รู้สึกเหมือนเรื่องร้าย ๆ จะเกิดขึ้น", - "พวก Wolf ชักจะเข้ามาใกล้หมู่บ้านเกินไปแล้ว ต้องหาคนฝีมือดีไปไล่", - ], - "npc.speech.villager_sad_loner": [ - "เหงาจัง", - "... ขอโทษที พอดีว่าฉันน่ะคุยไม่ค่อยเก่งเท่าไหร่", - ], - "npc.speech.villager_seeker": [ - "ฉันอยากไปเห็นโลกภายนอก นอกกำแพงนี้ นั่นแหละความฝันของฉันเอเรน เย...", - ], - "npc.speech.villager_stable": [ - "วันนี้เป็นวันที่สงบดีจริง ๆ", - "ชีวิตมันก็... ไม่ได้แย่ขนานนั้นนะ", - "ช่างเป็นวันที่สดใส นกร้องขับขาน ดอกไม้เบ่งบาน ในวันแบบนี้คนแบบคุณควรไปเดินเล่นในป่า!", - ], - "npc.speech.villager_decline_trade": [ - "ขอโทษที ฉันไม่ของอะไรจะแลกหรอก", - "ชาวบ้านอย่างฉันจะมีของอะไรไปแลกกับคุณ", - "บ้านหลังนี้ฉันยังโปะไม่หมดน่ะ คงจะแลกไม่ได้หรอกนะ!", - ], - "npc.speech.merchant_advertisement": [ - "แวะดูสักนิด แวะพักสักหน่อย อาจจะเจอของที่ถูกใจนะคุณนักเดินทาง", - "อยากซื้อขายรึเปล่าเอ่ย?", - "ฉันมีของเด็ด เด็ดเยอะแยะเลยนะ อยากจะดูไหมหล่ะ?" - ], - "npc.speech.merchant_busy": [ - "ช้าก่อนสหาย ฉันมีแค่สองมือ", - "สักครู่นะ ใกล้จะเสร็จแล้ว", - "ฉันยุ่งมากเลย ขอเวลาอีกสักพักรพ", - ], - "npc.speech.merchant_busy_rude": [ - "เด็กสมัยนี้รอไม่เป็นเลยรึ", - "กลับไปต่อแถวซะ เจ้าคนไร้สามัญสำนึก", - "แซงคิวแบบนี้ นิสัยไม่ดีเลยนะ", - ], - "npc.speech.merchant_trade_successful": [ - "ยินดีที่ได้ทำธุริกจร่วมกัน สหาย", - "ขอบคุณนะ", - ], - "npc.speech.merchant_trade_declined": [ - "แหม่ น่าเสียดายจริง ๆ ไว้คราวหน้าก็แล้วก็", - "อินิดูก่อนแล้วกลับมาซื้อทีหลังได้นะจ๊ะนายจ๋า" - ], - "npc.speech.villager_cultist_alarm": [ - "ทุกคนระวัง! พวก Cultist กำลังมา!", - "ผู้ชายมาทางนี้! พวก Cultist บุกแล้ว!", - "ใจกล้ามากที่จะตีหมู่บ้านของเรา เจ้าพวก Cultist!", - "ทำให้มันเสียใจที่มาบุกหมู่บ้านเรา!", - "อย่าให้พวกมันคิดว่าเราอ่อนแอ แสดงให้มันเห็นว่าไม่กลัวมัน", - "เจ้าพวก Cultist สารเลว", - "เป็นไงรสชาติคมดาบฉันถูกปากไหม เจ้าพวก Cultist โสมม", - "ชีวิตของคนบริสุทธิ์ที่ไร้ทางสู้ พวกแกจะต้องชดใช้", - "พระเจ้าช่วยกล้วยทอด มีพวก Cultist ปลอมตัวมาในหมู่พวกเรา", - "ความชั่วร้ายของพวกแก จะจบอยู่ที่นี้!", - "อย่างแกเนี่ยต้องเจอคนอย่างฉัน!", - "สวดมนต์อ้อนวอนไปก็เท่านั้นแหละ เจ้าพวก Cultist", - "มันอยู่ตรงนั้น พวกลุย", - "ตรงหน้าสิบสองนาฬิกา พวกเราจัดให้มันสักดอก", - "ตรงนั้น อย่ามันรอดไปได้", - "สนใจรับความตายร้อน ๆ สักจอกไหมหล่ะ เดี๋ยวฉันเลี้ยงเอง", - "ฉันจะไม่วันลืมสิ่งที่แกทำกับฉัน ไม่มีวัน!", - "ชีวิตที่น่าสังเวช จบสิ้นเพียงเท่านี้", - "ลัทธิอันโสโครก สิ้นสุดแล้ว", - "กรรมติดคมดาบ", - "ขอโทษที แต่พวกเราไม่ต้อนรับ", - "อยู่แบบหลบ ๆ ซ่อน ๆ ก็ดีอยู่แล้ว", - ], - "npc.speech.villager_under_attack": [ - "ทางนี้! ช่วยด้วย!", - "ทางนี้! ช่วยด้วย!", - "โอ้ย! เล่นแรงจัง โป้ง! ไม่เล่นด้วยแล้ว", - "โอ้ย! เล่นแรงจัง โป้ง! ไม่เล่นด้วยแล้ว", - "ฉันพลาดท่าแล้ว ช่วยด้วย! ทางนี้!", - "ได้ทีขี่ม้าไล่เลยนะ ใครก็ได้ช่วยmu!", - "ช่วยด้วย!", - "เจ็บเหลือเกิน ใครก็ได้ช่วยฉันmy!", - "อั๊ก ช่วย...ด้วย ได้โปรด", - "ทางนี้! ทางนี้!", - "ทางนี้! ทางนี้! เร็วเข้า!", - "ฉันต้านไว้ได้อีกไม่นาน", - "บ้าที่สุด! ขอกำลังเสริมด่วน!", - "บัดสบเอ๊ย! ขอกำลังเสริมด่วน!", - "ใครก็ได้ช่วยพวกเราด้วย!", - "ฆาตกรเต็มไปหมด ช่วยฉันที!", - "ฆาตกรเต็มไปหมด ทุกคนต้านไว้!", - "ช่วยด้วย! พวกมันจะฆ่าฉัน", - "ทหาร ทางนี้เร็วเข้า!", - "ทหาร ทางนี้!", - "ทหาร! ได้โปรดปกป้องฉันด้วย", - "ทหาร! ใครก็ได้! ฉันกลัวเหลือเกิน", - "ทหาร! มีเรื่องแล้ว!", - "ทหาร! ทหาร!", - "ทหาร! มีผู้ร้ายอยู่ตรงนี้!", - "ใครก็ได้ จัดการคนพวกนี้ที!", - "ทหาร! มีคนจะทำร้ายฉัน", - "พระเจ้าคุ้มครอง", - "ทหารหายไปไหนกันหมด ฉันอยู่ตรงนี้! ช่วยด้วย!", - "สารเลว!", - "ได้โปรด ฉันยังไม่อยากตาย", - "ได้โปรด พระเจ้าช่วยคุ้มครองลูกด้วย", - "โอ้ย! เจ็บนะ!", - "พวกมันกำลังจะมาฆ่าฉัน", - "พวกมันจะบูชาฉัน ช่วยด้วย!", - "ความรุนแรง ช่างเป็นวงจรที่อุบาวท์เสียจริง", - "แค่นี้ ไกลหัวใจ (ปอด)", - "พอใจหรือยัง", - "ฉันไปทำอะให้แค้นเคืองกันหรือยังไง", - "อย่าทำอะไรฉันอีกเลย ฉันกลัวแล้ว", - "ถือมีดระวังหน่อยสิ เกิดผีผลักขึ้นมาจะทำยังไง!", - "ฉันขอสาปแช่งพวกแกทุกตน", - "ได้โปรด ได้โปรด", - "ชักจะมีน้ำโหขึ้นมาแล้วนะ!", - "อาการมันเป็นยังไงหนิ พี่บ่าว", - "ฉันเอาคืนให้สาสมเลยคอยดู", - "ฉันไม่ของมีค่าอะไรหรอก อย่าทำอะไรฉันเลย", - "หยุดนะ ไม่งั้นฉันจะไปฟ้องพ่อ ให้มาจัดการคุณ", - "แงงงงง แม่จ้าช่วยหนูด้วยยยย", - "เทวดาฟ้าดินเป็นพยาน", - "สหาย อย่าทำแบบนี้เลย มันบาปนะ", - "นี้! นิสัยไม่ดีเลยนะ", - "พอได้หรือยังพ่อคุณ รู้แล้วว่าเก่ง", - "ไว้ชีวิตข้าน้อยด้วย", - "ฉันมีครอบครัวที่ต้องเลี้ยง ถ้าฉันตายพวกเขาจะอยู่ยังไง", - "ฉันยังเด็กอย่าทำอะไรฉันเลย", - "ค่อย ๆ พูด ค่อย ๆ จากันก่อนสหาย", - "ใช้ความรุนแรงแก้ปัญหาไม่ได้นะ มันไม่ถูกต้อง!", - "ถึงว่าหล่ะ เมื่อเช้าจิ้งจกทัก...", - "อุ๊ย เจ็บนะ ระวังหน่อยสิ!", - "ว๊ายยยยยยยยยย", - "ไร้มารยาทสิ้นดี", - "พอเถอะก่อนจะบานปลาย", - "สาธุ ของให้หน้าเป็นสิว", - "สนุกอยู่คนเดียวแบบนี้ ใช้่ไม่ได้", - "รู้ไหมว่าฉันเป็นลูกใคร!?", - "ระวังเถอะ เวรกรรมจะตามทัน", - "หยุดเถอะ ก่อนจะเจ็บตัว", - "ช้าก่อน ฉันไม่อยากมีเรื่อง", - "ต้องมีเรื่องอะไรเข้าใจผิดกันแน่ ๆ", - "เราอย่าใช้กำลังคุยกันเลยนะ", - "ไส่หัวไป เจ้าคนสถุน", - "เจ็บไปหมดแล้ว", - "มาอารมณ์ไหนอีกละเนี่ย", - "ฉันชักจะรำคาญแล้วสิ ", - "จ จำคนผิดแล้ววววว", - "เสี่ยส่งคนมาจริง ๆ หรอเนี่ย?", - "พอเถอะนะ เอาจริง ๆ จากใจเลย", - "ทหาร! เอามันไปขัง", - "ส่งหมาไปกัดซะดีไหม", - "ฉันผิดอารายยยยย", - ], - "npc.speech.villager_enemy_killed": [ - "ต่อหน้าข้า ศัตรูพ่ายแพ้เช่นเคย", - "ความสงบสุขกลับมาอีกครั้ง", - "... เรา มาทำอะไรอยู่ตรงนี้กันนะ", - ], - "npc.speech.menacing": [ - "อย่าบอกว่าไม่เตือนนะ", - "ห่าง ๆ หน่อยสหาย", - "น่ากลัวตายหล่ะ", - "ไปไหนก็ไป", - "อยากหลับแบบไม่ง่วงสิท่า", - "ไม่ชอบขี้หน้าเลยแหะ", - ], - "npc.speech.cultist_low_health_fleeing": [ - "พี่น้องข้า กลับไปตั้งหลัก!", - "พี่น้องข้า ถอย!", - "ฝากไว้ก่อนเถอะ", - "ความอัปยศนี้ ข้าจะตามล้างแค้นทุกชาติไป", - "เหนื่อยเหลือเกิน ต้อง... หนี", - "ทุกอย่าง ดู... มืดไปหมด", - ] - } -) diff --git a/assets/voxygen/i18n/th_TH/template.ftl b/assets/voxygen/i18n/th_TH/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/th_TH/template.ron b/assets/voxygen/i18n/th_TH/template.ron deleted file mode 100644 index f0d8b704da..0000000000 --- a/assets/voxygen/i18n/th_TH/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/buff.ftl b/assets/voxygen/i18n/tr_TR/buff.ftl new file mode 100644 index 0000000000..c16fb55c3f --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Etkiyi kadırmak için tıkla +buff-title-missing = İsim Yok +buff-desc-missing = Açıklama Yok +buff-title-heal = İyileşme +buff-desc-heal = Zamanla can kazan. +buff-title-potion = İksir +buff-desc-potion = İçiyor... +buff-title-saturation = Tokluk +buff-desc-saturation = Tüketilebilen maddelerden zamanla can kazan. +buff-title-campfire_heal = Kamp Ateşi +buff-desc-campfire_heal = Kamp ateşinin yakınında oturmak canını saniyede %{ $rate } iyileştirir. +buff-title-invulnerability = Dokunulmazlık +buff-desc-invulnerability = Hiçbir saldırıdan hasar almazsın. +buff-title-protectingward = Koruyucu Totem +buff-desc-protectingward = Saldırılardan biraz korunuyorsun. +buff-title-frenzied = Gözü Dönmüş +buff-desc-frenzied = Olağanüstü bir hıza sahipsin ve hafif sakatlıkları atlatabilirsin. +buff-title-bleed = Kanama +buff-desc-bleed = Devamlı hasar verir. +buff-title-cursed = Lanetli +buff-desc-cursed = Lanetlisin. +buff-title-burn = Yanıyor +buff-desc-burn = Canlı canlı yanıyorsun. +buff-title-crippled = Topal +buff-desc-crippled = Bacakların ağır yaralı olduğu için topallıyorsun. +buff-title-frozen = Donmuş +buff-desc-frozen = Hareketlerin ve saldırıların yavaşladı. +buff-title-wet = Islak +buff-desc-wet = Yerler ayağını kabul etmiyor, durmakta zorlanıyorsun. +buff-title-ensnared = Tuzağa Düşmüş +buff-desc-ensnared = Sarmaşıklar bacağına dolanarak hareketini kısıtlıyor. +buff-stat-health = { $str_total } Can Yeniler +buff-stat-increase_max_energy = Maksimum Enerjiyi { $strength } Arttırır. +buff-stat-increase_max_health = Maksimum Canı { $strength } Arttırır. +buff-stat-invulnerability = Dokunulmazlık kazandırır +buff-text-over_seconds = { $dur_secs } saniye içinde +buff-text-for_seconds = { $dur_secs } saniye boyunca \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/buff.ron b/assets/voxygen/i18n/tr_TR/buff.ron deleted file mode 100644 index 60a4ab870a..0000000000 --- a/assets/voxygen/i18n/tr_TR/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // Buffs - "buff.remove": "Etkiyi kadırmak için tıkla", - "buff.title.missing": "İsim Yok", - "buff.desc.missing": "Açıklama Yok", - "buff.title.heal": "İyileşme", - "buff.desc.heal": "Zamanla can kazan.", - "buff.title.potion": "İksir", - "buff.desc.potion": "İçiyor...", - "buff.title.saturation": "Tokluk", - "buff.desc.saturation": "Tüketilebilen maddelerden zamanla can kazan.", - "buff.title.campfire_heal": "Kamp Ateşi", - "buff.desc.campfire_heal": "Kamp ateşinin yakınında oturmak canını saniyede %{rate} iyileştirir.", - "buff.title.invulnerability": "Dokunulmazlık", - "buff.desc.invulnerability": "Hiçbir saldırıdan hasar almazsın.", - "buff.title.protectingward": "Koruyucu Totem", - "buff.desc.protectingward": "Saldırılardan biraz korunuyorsun.", - "buff.title.frenzied": "Gözü Dönmüş", - "buff.desc.frenzied": "Olağanüstü bir hıza sahipsin ve hafif sakatlıkları atlatabilirsin.", - // Debuffs - "buff.title.bleed": "Kanama", - "buff.desc.bleed": "Devamlı hasar verir.", - "buff.title.cursed": "Lanetli", - "buff.desc.cursed": "Lanetlisin.", - "buff.title.burn": "Yanıyor", - "buff.desc.burn": "Canlı canlı yanıyorsun.", - "buff.title.crippled": "Topal", - "buff.desc.crippled": "Bacakların ağır yaralı olduğu için topallıyorsun.", - "buff.title.frozen": "Donmuş", - "buff.desc.frozen": "Hareketlerin ve saldırıların yavaşladı.", - "buff.title.wet": " Islak", - "buff.desc.wet": "Yerler ayağını kabul etmiyor, durmakta zorlanıyorsun.", - "buff.title.ensnared": "Tuzağa Düşmüş", - "buff.desc.ensnared": "Sarmaşıklar bacağına dolanarak hareketini kısıtlıyor.", - // Buffs stats - "buff.stat.health": "{str_total} Can Yeniler", - "buff.stat.increase_max_energy": "Maksimum Enerjiyi {strength} Arttırır.", - "buff.stat.increase_max_health": "Maksimum Canı {strength} Arttırır.", - "buff.stat.invulnerability": "Dokunulmazlık kazandırır", - // Text - "buff.text.over_seconds": "{dur_secs} saniye içinde", - "buff.text.for_seconds": "{dur_secs} saniye boyunca", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/char_selection.ftl b/assets/voxygen/i18n/tr_TR/char_selection.ftl new file mode 100644 index 0000000000..e3cabfeefb --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/char_selection.ftl @@ -0,0 +1,23 @@ +char_selection-loading_characters = Karakterler yükleniyor... +char_selection-delete_permanently = + Bu karakteri kalıcı olarak + silmek istediğinden emin misin? +char_selection-deleting_character = Karakter siliniyor... +char_selection-change_server = Sunucu Değiştir +char_selection-enter_world = Dünyaya Gir +char_selection-logout = Çıkış yap +char_selection-create_new_character = Yeni Karakter Oluştur +char_selection-creating_character = Karakter oluşturuluyor... +char_selection-character_creation = Karakter Oluşturma +char_selection-human_default = İnsan Varsayılanı +char_selection-level_fmt = Seviye { $level_nb } +char_selection-uncanny_valley = Tekinsiz Vadi +char_selection-plains_of_uncertainty = Belirsizlik Ovaları +char_selection-beard = Sakal +char_selection-hair_style = Saç Stili +char_selection-hair_color = Saç Rengi +char_selection-eye_color = Göz Rengi +char_selection-skin = Ten Rengi +char_selection-eyeshape = Göz Detayları +char_selection-accessories = Aksesuarlar +char_selection-create_info_name = Karakterinin bir isme ihtiyacı var! \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/char_selection.ron b/assets/voxygen/i18n/tr_TR/char_selection.ron deleted file mode 100644 index 37edf4a249..0000000000 --- a/assets/voxygen/i18n/tr_TR/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "char_selection.loading_characters": "Karakterler yükleniyor...", - "char_selection.delete_permanently": r#"Bu karakteri kalıcı olarak -silmek istediğinden emin misin?"#, - "char_selection.deleting_character": "Karakter siliniyor...", - "char_selection.change_server": "Sunucu Değiştir", - "char_selection.enter_world": "Dünyaya Gir", - "char_selection.logout": "Çıkış yap", - "char_selection.create_new_character": "Yeni Karakter Oluştur", - "char_selection.creating_character": "Karakter oluşturuluyor...", - "char_selection.character_creation": "Karakter Oluşturma", - "char_selection.human_default": "İnsan Varsayılanı", - "char_selection.level_fmt": "Seviye {level_nb}", - "char_selection.uncanny_valley": "Tekinsiz Vadi", - "char_selection.plains_of_uncertainty": "Belirsizlik Ovaları", - "char_selection.beard": "Sakal", - "char_selection.hair_style": "Saç Stili", - "char_selection.hair_color": "Saç Rengi", - "char_selection.eye_color": "Göz Rengi", - "char_selection.skin": "Ten Rengi", - "char_selection.eyeshape": "Göz Detayları", - "char_selection.accessories": "Aksesuarlar", - "char_selection.create_info_name": "Karakterinin bir isme ihtiyacı var!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/common.ftl b/assets/voxygen/i18n/tr_TR/common.ftl new file mode 100644 index 0000000000..3a5b07d3ee --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/common.ftl @@ -0,0 +1,98 @@ +common-username = kullanıcı adı +common-singleplayer = Tek oyuncu +common-multiplayer = Çok oyunculu +common-servers = Sunucular +common-quit = Çık +common-settings = Ayarlar +common-languages = Diller +common-interface = Arayüz +common-gameplay = Oynanış +common-controls = Kontroller +common-video = Video +common-sound = Ses +common-chat = Sohbet +common-resume = Devam Et +common-characters = Karakterler +common-close = Kapat +common-yes = Evet +common-no = Hayır +common-back = Geri +common-create = Oluştur +common-okay = Tamam +common-add = Ekle +common-accept = Kabul Et +common-decline = Reddet +common-disclaimer = Uyarı +common-cancel = İptal Et +common-none = Yok +common-error = Hata +common-fatal_error = Ölümcül hata +common-you = Sen +common-automatic = Otomatik +common-random = Rastgele +common-empty = Boş +common-interface_settings = Arayüz Ayarları +common-gameplay_settings = Oynanış Ayarları +common-controls_settings = Kontrol Ayarları +common-video_settings = Görüntü Ayarları +common-sound_settings = Ses Ayarları +common-language_settings = Dil Ayarları +common-chat_settings = Sohbet Ayarları +common-connection_lost = + Bağlantı koptu! + Sunucu yeniden mi başladı? + İstemci güncel mi? +common-species-orc = Ork +common-species-human = İnsan +common-species-dwarf = Cüce +common-species-elf = Elf +common-species-draugr = Hortlak +common-species-danari = Danari +common-weapons-axe = Balta +common-weapons-sword = Kılıç +common-weapons-staff = Asa +common-weapons-bow = Yay +common-weapons-hammer = Çekiç +common-weapons-sceptre = Şifa Asası +common-weapons-greatsword = Büyük Kılıç +common-weapons-shortswords = Kısa Kılıçlar +common-weapons-general = Genel Dövüş +common-weapons-shield = Kalkan +common-weapons-spear = Mızrak +common-weapons-hammer_simple = Basit Çekiç +common-weapons-sword_simple = Basit Kılıç +common-weapons-staff_simple = Basit Asa +common-weapons-axe_simple = Basit Balta +common-weapons-bow_simple = Basit Yay +common-weapons-unique = Eşsiz +common-tool-debug = Debug +common-tool-farming = Tarım Aleti +common-tool-pick = Kazma +common-tool-mining = Madencilik +common-kind-modular_component = Modüler Parça +common-kind-glider = Planör +common-kind-consumable = Tüketilen +common-kind-throwable = Fırlatılabilir +common-kind-utility = Yararlı +common-kind-ingredient = Malzeme +common-kind-lantern = Fener +common-hands-one = Tek Elli +common-hands-two = Çift Elli +common-rand_name = Rastgele isim +common-rand_appearance = Rastgele görünüm +common-stats-combat_rating = DP +common-stats-power = Güç +common-stats-speed = Hız +common-stats-crit_chance = Kritik Şansı +common-stats-crit_mult = Kritik Çarpanı +common-stats-armor = Zırh +common-stats-energy_max = Maksimum Enerji +common-stats-energy_reward = Enerji Ödülü +common-stats-crit_power = Kritik Gücü +common-stats-stealth = Gizlilik +common-stats-slots = Slotlar +common-material-metal = Metal +common-material-wood = Tahta +common-material-stone = Taş +common-material-cloth = Kumaş +common-material-hide = Post \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/common.ron b/assets/voxygen/i18n/tr_TR/common.ron deleted file mode 100644 index 7e61bfb44d..0000000000 --- a/assets/voxygen/i18n/tr_TR/common.ron +++ /dev/null @@ -1,121 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "kullanıcı adı", - "common.singleplayer": "Tek oyuncu", - "common.multiplayer": "Çok oyunculu", - "common.servers": "Sunucular", - "common.quit": "Çık", - "common.settings": "Ayarlar", - "common.languages": "Diller", - "common.interface": "Arayüz", - "common.gameplay": "Oynanış", - "common.controls": "Kontroller", - "common.video": "Video", - "common.sound": "Ses", - "common.chat": "Sohbet", - "common.resume": "Devam Et", - "common.characters": "Karakterler", - "common.close": "Kapat", - "common.yes": "Evet", - "common.no": "Hayır", - "common.back": "Geri", - "common.create": "Oluştur", - "common.okay": "Tamam", - "common.add": "Ekle", - "common.accept": "Kabul Et", - "common.decline": "Reddet", - "common.disclaimer": "Uyarı", - "common.cancel": "İptal Et", - "common.none": "Yok", - "common.error": "Hata", - "common.fatal_error": "Ölümcül hata", - "common.you": "Sen", - "common.automatic": "Otomatik", - "common.random": "Rastgele", - "common.empty": "Boş", - - // Settings Window title - "common.interface_settings": "Arayüz Ayarları", - "common.gameplay_settings": "Oynanış Ayarları", - "common.controls_settings": "Kontrol Ayarları", - "common.video_settings": "Görüntü Ayarları", - "common.sound_settings": "Ses Ayarları", - "common.language_settings": "Dil Ayarları", - "common.chat_settings": "Sohbet Ayarları", - - // Message when connection to the server is lost - "common.connection_lost": r#"Bağlantı koptu! -Sunucu yeniden mi başladı? -İstemci güncel mi?"#, - - - "common.species.orc": "Ork", - "common.species.human": "İnsan", - "common.species.dwarf": "Cüce", - "common.species.elf": "Elf", - "common.species.draugr": "Hortlak", - "common.species.danari": "Danari", - - "common.weapons.axe": "Balta", - "common.weapons.sword": "Kılıç", - "common.weapons.staff": "Asa", - "common.weapons.bow": "Yay", - "common.weapons.hammer": "Çekiç", - "common.weapons.sceptre": "Şifa Asası", - "common.weapons.greatsword": "Büyük Kılıç", - "common.weapons.shortswords": "Kısa Kılıçlar", - "common.weapons.general": "Genel Dövüş", - "common.weapons.shield": "Kalkan", - "common.weapons.spear": "Mızrak", - "common.weapons.hammer_simple": "Basit Çekiç", - "common.weapons.sword_simple": "Basit Kılıç", - "common.weapons.staff_simple": "Basit Asa", - "common.weapons.axe_simple": "Basit Balta", - "common.weapons.bow_simple": "Basit Yay", - "common.weapons.unique": "Eşsiz", - "common.tool.debug": "Debug", - "common.tool.farming": "Tarım Aleti", - "common.tool.pick": "Kazma", - "common.tool.mining": "Madencilik", - "common.kind.modular_component": "Modüler Parça", - "common.kind.glider": "Planör", - "common.kind.consumable": "Tüketilen", - "common.kind.throwable": "Fırlatılabilir", - "common.kind.utility": "Yararlı", - "common.kind.ingredient": "Malzeme", - "common.kind.lantern": "Fener", - "common.hands.one": "Tek Elli", - "common.hands.two": "Çift Elli", - - "common.rand_name": "Rastgele isim", - "common.rand_appearance": "Rastgele görünüm", - - "common.stats.combat_rating": "DP", - "common.stats.power": "Güç", - "common.stats.speed": "Hız", - //"common.stats.poise": "Poise", - "common.stats.crit_chance": "Kritik Şansı", - "common.stats.crit_mult": "Kritik Çarpanı", - "common.stats.armor": "Zırh", - //"common.stats.poise_res":"Stun Res", - "common.stats.energy_max": "Maksimum Enerji", - "common.stats.energy_reward": "Enerji Ödülü", - "common.stats.crit_power": "Kritik Gücü", - "common.stats.stealth": "Gizlilik", - "common.stats.slots": "Slotlar", - - "common.material.metal": "Metal", - "common.material.wood": "Tahta", - "common.material.stone": "Taş", - "common.material.cloth": "Kumaş", - "common.material.hide": "Post", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/esc_menu.ftl b/assets/voxygen/i18n/tr_TR/esc_menu.ftl new file mode 100644 index 0000000000..028c6502e0 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Çıkış yap +esc_menu-quit_game = Oyundan çık \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/esc_menu.ron b/assets/voxygen/i18n/tr_TR/esc_menu.ron deleted file mode 100644 index f4ba2f5f44..0000000000 --- a/assets/voxygen/i18n/tr_TR/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "esc_menu.logout": "Çıkış yap", - "esc_menu.quit_game": "Oyundan çık", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/gameinput.ftl b/assets/voxygen/i18n/tr_TR/gameinput.ftl new file mode 100644 index 0000000000..dab0f9303d --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/gameinput.ftl @@ -0,0 +1,56 @@ +gameinput-primary = Birincil Saldırı +gameinput-secondary = İkincil Saldırı/Savun/Hedef al +gameinput-slot1 = Eylem çubuğu Slot 1 +gameinput-slot2 = Eylem çubuğu Slot 2 +gameinput-slot3 = Eylem çubuğu Slot 3 +gameinput-slot4 = Eylem çubuğu Slot 4 +gameinput-slot5 = Eylem çubuğu Slot 5 +gameinput-slot6 = Eylem çubuğu Slot 6 +gameinput-slot7 = Eylem çubuğu Slot 7 +gameinput-slot8 = Eylem çubuğu Slot 8 +gameinput-slot9 = Eylem çubuğu Slot 9 +gameinput-slot10 = Eylem çubuğu Slot 10 +gameinput-swaploadout = Tehçizatı Değiştir +gameinput-togglecursor = Fareyi aç/kapa +gameinput-help = Yardım penceresini aç/kapa +gameinput-toggleinterface = Arayüzü aç/kapa +gameinput-toggledebug = FPS ve Hata ayıklama bilgilerini aç/kapa +gameinput-screenshot = Ekran görüntüsü al +gameinput-toggleingameui = İsim etiketlerini aç/kapa +gameinput-fullscreen = Tam ekranı aç/kapa +gameinput-moveforward = İleri git +gameinput-moveleft = Sola git +gameinput-moveright = Sağa git +gameinput-moveback = Geri git +gameinput-jump = Zıpla +gameinput-glide = Planör +gameinput-roll = Yuvarlan +gameinput-climb = Tırman +gameinput-climbdown = İn +gameinput-wallleap = Duvar Sıçrayışı +gameinput-togglelantern = Feneri yak/söndür +gameinput-mount = Bin +gameinput-chat = Sohbet +gameinput-command = Komut +gameinput-escape = Oyunu Duraklat +gameinput-map = Harita +gameinput-bag = Envanter +gameinput-social = Sosyal +gameinput-sit = Otur +gameinput-spellbook = Büyüler +gameinput-settings = Ayarlar +gameinput-respawn = Yeniden Canlan +gameinput-charge = Hücum +gameinput-togglewield = Kuşan/koy +gameinput-interact = Etkileşim +gameinput-freelook = Serbest Bakış +gameinput-autowalk = Otomatik Yürüyüş +gameinput-dance = Dans et +gameinput-select = Varlık Seç +gameinput-acceptgroupinvite = Grup Davetini Kabul Et +gameinput-declinegroupinvite = Grup Davetini Reddet +gameinput-crafting = Üretim +gameinput-fly = Uç +gameinput-sneak = Eğil +gameinput-swimdown = Aşağı yüz +gameinput-swimup = Yukarı yüz \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/gameinput.ron b/assets/voxygen/i18n/tr_TR/gameinput.ron deleted file mode 100644 index acf1a7ad70..0000000000 --- a/assets/voxygen/i18n/tr_TR/gameinput.ron +++ /dev/null @@ -1,67 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "gameinput.primary": "Birincil Saldırı", - "gameinput.secondary": "İkincil Saldırı/Savun/Hedef al", - "gameinput.slot1": "Eylem çubuğu Slot 1", - "gameinput.slot2": "Eylem çubuğu Slot 2", - "gameinput.slot3": "Eylem çubuğu Slot 3", - "gameinput.slot4": "Eylem çubuğu Slot 4", - "gameinput.slot5": "Eylem çubuğu Slot 5", - "gameinput.slot6": "Eylem çubuğu Slot 6", - "gameinput.slot7": "Eylem çubuğu Slot 7", - "gameinput.slot8": "Eylem çubuğu Slot 8", - "gameinput.slot9": "Eylem çubuğu Slot 9", - "gameinput.slot10": "Eylem çubuğu Slot 10", - "gameinput.swaploadout": "Tehçizatı Değiştir", - "gameinput.togglecursor": "Fareyi aç/kapa", - "gameinput.help": "Yardım penceresini aç/kapa", - "gameinput.toggleinterface": "Arayüzü aç/kapa", - "gameinput.toggledebug": "FPS ve Hata ayıklama bilgilerini aç/kapa", - "gameinput.screenshot": "Ekran görüntüsü al", - "gameinput.toggleingameui": "İsim etiketlerini aç/kapa", - "gameinput.fullscreen": "Tam ekranı aç/kapa", - "gameinput.moveforward": "İleri git", - "gameinput.moveleft": "Sola git", - "gameinput.moveright": "Sağa git", - "gameinput.moveback": "Geri git", - "gameinput.jump": "Zıpla", - "gameinput.glide": "Planör", - "gameinput.roll": "Yuvarlan", - "gameinput.climb": "Tırman", - "gameinput.climbdown": "İn", - "gameinput.wallleap": "Duvar Sıçrayışı", - "gameinput.togglelantern": "Feneri yak/söndür", - "gameinput.mount": "Bin", - "gameinput.chat": "Sohbet", - "gameinput.command": "Komut", - "gameinput.escape": "Oyunu Duraklat", - "gameinput.map": "Harita", - "gameinput.bag": "Envanter", - "gameinput.social": "Sosyal", - "gameinput.sit": "Otur", - "gameinput.spellbook": "Büyüler", - "gameinput.settings": "Ayarlar", - "gameinput.respawn": "Yeniden Canlan", - "gameinput.charge": "Hücum", - "gameinput.togglewield": "Kuşan/koy", - "gameinput.interact": "Etkileşim", - "gameinput.freelook": "Serbest Bakış", - "gameinput.autowalk": "Otomatik Yürüyüş", - "gameinput.dance": "Dans et", - "gameinput.select": "Varlık Seç", - "gameinput.acceptgroupinvite": "Grup Davetini Kabul Et", - "gameinput.declinegroupinvite": "Grup Davetini Reddet", - "gameinput.crafting": "Üretim", - "gameinput.fly": "Uç", - "gameinput.sneak": "Eğil", - "gameinput.swimdown": "Aşağı yüz", - "gameinput.swimup": "Yukarı yüz", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/bag.ftl b/assets/voxygen/i18n/tr_TR/hud/bag.ftl new file mode 100644 index 0000000000..9964a1579d --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/bag.ftl @@ -0,0 +1,20 @@ +hud-bag-inventory = { $playername }'in Envanteri +hud-bag-stats_title = { $playername }'in Nitelikleri +hud-bag-exp = Tecrübe +hud-bag-armor = Zırh +hud-bag-stats = Nitelikler +hud-bag-head = Baş +hud-bag-neck = Boyun +hud-bag-tabard = Cüppe +hud-bag-shoulders = Omuzlar +hud-bag-chest = Göğüs +hud-bag-hands = Eller +hud-bag-lantern = Fener +hud-bag-glider = Planör +hud-bag-belt = Kemer +hud-bag-ring = Yüzük +hud-bag-back = Arka +hud-bag-legs = Bacaklar +hud-bag-feet = Ayaklar +hud-bag-mainhand = Birincil +hud-bag-offhand = İkincil \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/bag.ron b/assets/voxygen/i18n/tr_TR/hud/bag.ron deleted file mode 100644 index b38bdf4d42..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/bag.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername}'in Envanteri", - "hud.bag.stats_title": "{playername}'in Nitelikleri", - "hud.bag.exp": "Tecrübe", - "hud.bag.armor": "Zırh", - "hud.bag.stats": "Nitelikler", - "hud.bag.head": "Baş", - "hud.bag.neck": "Boyun", - "hud.bag.tabard": "Cüppe", - "hud.bag.shoulders": "Omuzlar", - "hud.bag.chest": "Göğüs", - "hud.bag.hands": "Eller", - "hud.bag.lantern": "Fener", - "hud.bag.glider": "Planör", - "hud.bag.belt": "Kemer", - "hud.bag.ring": "Yüzük", - "hud.bag.back": "Arka", - "hud.bag.legs": "Bacaklar", - "hud.bag.feet": "Ayaklar", - "hud.bag.mainhand": "Birincil", - "hud.bag.offhand": "İkincil", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/char_window.ftl b/assets/voxygen/i18n/tr_TR/hud/char_window.ftl new file mode 100644 index 0000000000..5ff38c60b2 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Karakter Adı +character_window-character_stats = + Dayanıklılık + + Çeviklik + + İrade gücü + + Koruma \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/char_window.ron b/assets/voxygen/i18n/tr_TR/hud/char_window.ron deleted file mode 100644 index f890e6c483..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "character_window.character_name": "Karakter Adı", - // Charater stats - "character_window.character_stats": r#"Dayanıklılık - -Çeviklik - -İrade gücü - -Koruma -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/chat.ftl b/assets/voxygen/i18n/tr_TR/hud/chat.ftl new file mode 100644 index 0000000000..c8c57f0eb3 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/chat.ftl @@ -0,0 +1,20 @@ +hud-chat-online_msg = [{ $name }] çevrimiçi oldu. +hud-chat-offline_msg = [{ $name }] çevrimdışı oldu. +hud-chat-default_death_msg = [{ $name }] öldü. +hud-chat-environmental_kill_msg = [{ $name }] { $environment }'da öldü. +hud-chat-fall_kill_msg = [{ $name }] yüksekten düşerek öldü. +hud-chat-suicide_msg = [{ $name }] kendini yaralayarak öldü. +hud-chat-pvp_melee_kill_msg = [{ $victim }], [{ $attacker }] tarafından mağlup edildi. +hud-chat-pvp_ranged_kill_msg = [{ $victim }], [{ $attacker }] tarafından vuruldu. +hud-chat-pvp_explosion_kill_msg = [{ $victim }], [{ $attacker }] tarafından havaya uçuruldu. +hud-chat-pvp_energy_kill_msg = [{ $victim }], [{ $attacker }] tarafından büyü ile mağlup edildi. +hud-chat-pvp_buff_kill_msg = [{ $victim }], [{ $attacker }] tarafından öldürüldü. +hud-chat-npc_melee_kill_msg = [{ $victim }], { $attacker } tarafından mağlup edildi. +hud-chat-npc_ranged_kill_msg = [{ $victim }], { $attacker } tarafından vuruldu. +hud-chat-npc_explosion_kill_msg = [{ $victim }], { $attacker } tarafından havaya uçuruldu. +hud-chat-npc_energy_kill_msg = [{ $victim }], { $attacker } tarafından büyü ile mağlup edildi. +hud-chat-npc_other_kill_msg = [{ $victim }], { $attacker } tarafından öldürüldü. +hud-chat-loot_msg = [{ $item }] topladın. +hud-chat-loot_fail = Envanterin dolu! +hud-chat-goodbye = Hoşçakal! +hud-chat-connection_lost = Bağlantı koptu. { $time } saniye içinde sunucudan atılacaksın. \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/chat.ron b/assets/voxygen/i18n/tr_TR/hud/chat.ron deleted file mode 100644 index bb3451c758..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/chat.ron +++ /dev/null @@ -1,37 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // Chat outputs - "hud.chat.online_msg": "[{name}] çevrimiçi oldu.", - "hud.chat.offline_msg": "[{name}] çevrimdışı oldu.", - - "hud.chat.default_death_msg": "[{name}] öldü.", - "hud.chat.environmental_kill_msg": "[{name}] {environment}'da öldü.", - "hud.chat.fall_kill_msg": "[{name}] yüksekten düşerek öldü.", - "hud.chat.suicide_msg": "[{name}] kendini yaralayarak öldü.", - - "hud.chat.pvp_melee_kill_msg": "[{victim}], [{attacker}] tarafından mağlup edildi.", - "hud.chat.pvp_ranged_kill_msg": "[{victim}], [{attacker}] tarafından vuruldu.", - "hud.chat.pvp_explosion_kill_msg": "[{victim}], [{attacker}] tarafından havaya uçuruldu.", - "hud.chat.pvp_energy_kill_msg": "[{victim}], [{attacker}] tarafından büyü ile mağlup edildi.", - "hud.chat.pvp_buff_kill_msg": "[{victim}], [{attacker}] tarafından öldürüldü.", - - - "hud.chat.npc_melee_kill_msg": "[{victim}], {attacker} tarafından mağlup edildi.", - "hud.chat.npc_ranged_kill_msg": "[{victim}], {attacker} tarafından vuruldu.", - "hud.chat.npc_explosion_kill_msg": "[{victim}], {attacker} tarafından havaya uçuruldu.", - "hud.chat.npc_energy_kill_msg": "[{victim}], {attacker} tarafından büyü ile mağlup edildi.", - "hud.chat.npc_other_kill_msg": "[{victim}], {attacker} tarafından öldürüldü.", - - "hud.chat.loot_msg": "[{item}] topladın.", - "hud.chat.loot_fail": "Envanterin dolu!", - "hud.chat.goodbye": "Hoşçakal!", - "hud.chat.connection_lost": "Bağlantı koptu. {time} saniye içinde sunucudan atılacaksın.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/crafting.ftl b/assets/voxygen/i18n/tr_TR/hud/crafting.ftl new file mode 100644 index 0000000000..e43e81e813 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/crafting.ftl @@ -0,0 +1,5 @@ +hud-crafting = Üretim +hud-crafting-recipes = Tarifler +hud-crafting-ingredients = Malzemeler: +hud-crafting-craft = Üret +hud-crafting-tool_cata = Gerektiriyor: \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/crafting.ron b/assets/voxygen/i18n/tr_TR/hud/crafting.ron deleted file mode 100644 index 465549dc8f..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/crafting.ron +++ /dev/null @@ -1,16 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "hud.crafting": "Üretim", - "hud.crafting.recipes": "Tarifler", - "hud.crafting.ingredients": "Malzemeler:", - "hud.crafting.craft": "Üret", - "hud.crafting.tool_cata": "Gerektiriyor:", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/group.ftl b/assets/voxygen/i18n/tr_TR/hud/group.ftl new file mode 100644 index 0000000000..9dee50ce9d --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/group.ftl @@ -0,0 +1,12 @@ +hud-group = Grup +hud-group-invite_to_join = [{ $name }] seni grubuna davet etti! +hud-group-invite = Davet Et +hud-group-kick = Gruptan At +hud-group-assign_leader = Lider Seç +hud-group-leave = Gruptan Ayrıl +hud-group-dead = Ölü +hud-group-out_of_range = Erişim dışı +hud-group-add_friend = Arkadaşlara Ekle +hud-group-link_group = Grupları Bağla +hud-group-in_menu = Menüde +hud-group-members = Grup Üyeleri \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/group.ron b/assets/voxygen/i18n/tr_TR/hud/group.ron deleted file mode 100644 index 5fa2eed351..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/group.ron +++ /dev/null @@ -1,23 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "hud.group": "Grup", - "hud.group.invite_to_join": "[{name}] seni grubuna davet etti!", - "hud.group.invite": "Davet Et", - "hud.group.kick": "Gruptan At", - "hud.group.assign_leader": "Lider Seç", - "hud.group.leave": "Gruptan Ayrıl", - "hud.group.dead" : "Ölü", - "hud.group.out_of_range": "Erişim dışı", - "hud.group.add_friend": "Arkadaşlara Ekle", - "hud.group.link_group": "Grupları Bağla", - "hud.group.in_menu": "Menüde", - "hud.group.members": "Grup Üyeleri", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/map.ftl b/assets/voxygen/i18n/tr_TR/hud/map.ftl new file mode 100644 index 0000000000..b4a6d6c794 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/map.ftl @@ -0,0 +1,18 @@ +hud-map-map_title = Harita +hud-map-qlog_title = Görevler +hud-map-difficulty = Zorluk +hud-map-towns = Şehirler +hud-map-castles = Kaleler +hud-map-dungeons = Zindanlar +hud-map-caves = Mağaralar +hud-map-cave = Mağara +hud-map-town = Şehir +hud-map-castle = Kale +hud-map-dungeon = Zindan +hud-map-difficulty_dungeon = + Zindan + + Zorluğu: { $difficulty } +hud-map-drag = Sürükle +hud-map-zoom = Büyüt / küçült +hud-map-recenter = Merkezle \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/map.ron b/assets/voxygen/i18n/tr_TR/hud/map.ron deleted file mode 100644 index 71bfea76cf..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/map.ron +++ /dev/null @@ -1,27 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Harita", - "hud.map.qlog_title": "Görevler", - "hud.map.difficulty": "Zorluk", - "hud.map.towns": "Şehirler", - "hud.map.castles": "Kaleler", - "hud.map.dungeons": "Zindanlar", - "hud.map.caves": "Mağaralar", - "hud.map.cave": "Mağara", - "hud.map.town": "Şehir", - "hud.map.castle": "Kale", - "hud.map.dungeon": "Zindan", - "hud.map.difficulty_dungeon": "Zindan\n\nZorluğu: {difficulty}", - "hud.map.drag": "Sürükle", - "hud.map.zoom": "Büyüt / küçült", - "hud.map.recenter": "Merkezle", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/misc.ftl b/assets/voxygen/i18n/tr_TR/hud/misc.ftl new file mode 100644 index 0000000000..7212520604 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/misc.ftl @@ -0,0 +1,61 @@ +hud-do_not_show_on_startup = Bunu açılışta gösterme +hud-show_tips = Öneriler +hud-quests = Görevler +hud-you_died = Öldün +hud-waypoint_saved = Yol noktası kaydedildi +hud-press_key_to_show_keybindings_fmt = Kontrolleri göstermek için { $key }'e bas +hud-press_key_to_toggle_lantern_fmt = Fenerini yakmak veya söndürmek için [{ $key }]'e bas +hud-press_key_to_show_debug_info_fmt = Hata ayıklama bilgilerini göstermek için { $key }'e bas +hud-press_key_to_toggle_keybindings_fmt = Kontrolleri açmak veya kapamak için { $key }'e bas +hud-press_key_to_toggle_debug_info_fmt = Hata ayıklama bilgilerini açmak veya kapamak için { $key }'e bas +hud-press_key_to_respawn = Ziyaret ettiğin en son kamp ateşinde yeniden doğmak için { $key }'e bas. +hud-welcome = + Veloren Alfa sürümüne hoşgeldin!, + + + Başlamadan önce bazı ipuçları: + + + EN ÖNEMLİSİ: Yeniden doğma noktanı ayarlamak için sohbete /waypoint yaz. + + Bu ölmüşsen bile yapılabilir! + + + Kontrolleri görmek için F1'e bas. + + Sohbet komutlarını görmek için sohbete /help yaz. + + + Dünyada rastgele oluşan sandıklar ve başka objeler var! + + Onları toplamak için Sağ-Tık kullan. + + Topladıklarını kullanmak için 'B' tuşuna basarak envanterini aç. + + Envanterindeki eşyaları kullanmak veya kuşanmak için iki kere üzerlerine tıkla. + + Üzerlerine bir kere tıklayıp ve sonra envaterin dışına tıklayarak onları at. + + + Veloren'de geceler oldukça karanlık olabiliyor. + + 'G' tuşuna basarak fenerini yak. + + + Bu pencereyi kapatmak için imlecini serbest bırakmak mı istiyorsun? TAB'a bas! + + + Veloren'in Dünyasında sana iyi eğlenceler! +hud-temp_quest_headline = Lütfen bize yardım et maceracı! +hud-temp_quest_text = + Kasabamızın etrafında kültistlerle + dolu zindanlar belirdi. + + Birkaç yoldaş bul, yiyeceğini hazırla + ve kült lideri ile onun yardımcılarını alt et. + + Kim bilir? Belki onların tılsımlı + eşyalarını bile ele geçirebilirsin! +hud-spell = Büyü +hud-free_look_indicator = Serbest bakış açık, kapatmak için { $key } tuşuna bas +hud-auto_walk_indicator = Otomatik yürüme açık \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/misc.ron b/assets/voxygen/i18n/tr_TR/hud/misc.ron deleted file mode 100644 index de096d1707..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/misc.ron +++ /dev/null @@ -1,78 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "hud.do_not_show_on_startup": "Bunu açılışta gösterme", - "hud.show_tips": "Öneriler", - "hud.quests": "Görevler", - "hud.you_died": "Öldün", - "hud.waypoint_saved": "Yol noktası kaydedildi", - - "hud.press_key_to_show_keybindings_fmt": "Kontrolleri göstermek için {key}'e bas", - "hud.press_key_to_toggle_lantern_fmt": "Fenerini yakmak veya söndürmek için [{key}]'e bas", - "hud.press_key_to_show_debug_info_fmt": "Hata ayıklama bilgilerini göstermek için {key}'e bas", - "hud.press_key_to_toggle_keybindings_fmt": "Kontrolleri açmak veya kapamak için {key}'e bas", - "hud.press_key_to_toggle_debug_info_fmt": "Hata ayıklama bilgilerini açmak veya kapamak için {key}'e bas", - - // Respawn message - "hud.press_key_to_respawn": r#"Ziyaret ettiğin en son kamp ateşinde yeniden doğmak için {key}'e bas."#, - - // Welcome message - "hud.welcome": r#"Veloren Alfa sürümüne hoşgeldin!, - - -Başlamadan önce bazı ipuçları: - - -EN ÖNEMLİSİ: Yeniden doğma noktanı ayarlamak için sohbete /waypoint yaz. - -Bu ölmüşsen bile yapılabilir! - - -Kontrolleri görmek için F1'e bas. - -Sohbet komutlarını görmek için sohbete /help yaz. - - -Dünyada rastgele oluşan sandıklar ve başka objeler var! - -Onları toplamak için Sağ-Tık kullan. - -Topladıklarını kullanmak için 'B' tuşuna basarak envanterini aç. - -Envanterindeki eşyaları kullanmak veya kuşanmak için iki kere üzerlerine tıkla. - -Üzerlerine bir kere tıklayıp ve sonra envaterin dışına tıklayarak onları at. - - -Veloren'de geceler oldukça karanlık olabiliyor. - -'G' tuşuna basarak fenerini yak. - - -Bu pencereyi kapatmak için imlecini serbest bırakmak mı istiyorsun? TAB'a bas! - - -Veloren'in Dünyasında sana iyi eğlenceler!"#, - -"hud.temp_quest_headline": r#"Lütfen bize yardım et maceracı!"#, -"hud.temp_quest_text": r#"Kasabamızın etrafında kültistlerle -dolu zindanlar belirdi. - -Birkaç yoldaş bul, yiyeceğini hazırla -ve kült lideri ile onun yardımcılarını alt et. - -Kim bilir? Belki onların tılsımlı -eşyalarını bile ele geçirebilirsin!"#, - - "hud.spell": "Büyü", - - "hud.free_look_indicator": "Serbest bakış açık, kapatmak için {key} tuşuna bas", - "hud.auto_walk_indicator": "Otomatik yürüme açık", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/sct.ftl b/assets/voxygen/i18n/tr_TR/hud/sct.ftl new file mode 100644 index 0000000000..bc72586095 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Tecrübe +hud-sct-block = BLOKLANDI \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/sct.ron b/assets/voxygen/i18n/tr_TR/hud/sct.ron deleted file mode 100644 index 7df179b0cc..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Tecrübe", - "hud.sct.block": "BLOKLANDI", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/settings.ftl b/assets/voxygen/i18n/tr_TR/hud/settings.ftl new file mode 100644 index 0000000000..50223208b1 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/settings.ftl @@ -0,0 +1,83 @@ +hud-settings-general = Genel +hud-settings-none = Yok +hud-settings-press_behavior-toggle = Aç/kapa +hud-settings-press_behavior-hold = Basılı tut +hud-settings-help_window = Yardım Penceresi +hud-settings-debug_info = Hata Ayıklama Bilgileri +hud-settings-tips_on_startup = Açılışta İpuçlarını Göster +hud-settings-ui_scale = Arayüz Ölçeği +hud-settings-relative_scaling = Otomatik Ölçek +hud-settings-custom_scaling = Sabit Ölçek +hud-settings-crosshair = İmleç tipi +hud-settings-opacity = Şeffaflık +hud-settings-hotbar = Aksiyon Çubuğu +hud-settings-toggle_shortcuts = Kısayolları aç/kapa +hud-settings-buffs_skillbar = Etkiler yetenek çubuğunun üstünde +hud-settings-buffs_mmap = Etkiler haritanın yanında +hud-settings-toggle_bar_experience = Tecrübe çubuğunu aç/kapa +hud-settings-scrolling_combat_text = Verilen/Alınan Hasar Yazısı +hud-settings-incoming_damage = Alınan Hasarı Tek Tek Göster +hud-settings-speech_bubble = Konuşma balonu +hud-settings-speech_bubble_dark_mode = Konuşma balonunda karanlık tema kullan +hud-settings-speech_bubble_icon = Konuşma balonunda ikon göster +hud-settings-energybar_numbers = Enerji çubuğu değerleri +hud-settings-values = Sayılar +hud-settings-percentages = Yüzdeler +hud-settings-chat = Sohbet +hud-settings-background_opacity = Arkaplan Şeffaflığı +hud-settings-chat_character_name = Sohbette karakter isimlerini göster +hud-settings-loading_tips = Yükleme ekranı ipuçları +hud-settings-pan_sensitivity = Kaydırma Hassaslığı +hud-settings-zoom_sensitivity = Büyütme Hassaslığı +hud-settings-invert_scroll_zoom = Kaydırma Büyütmesini ters çevir +hud-settings-invert_mouse_y_axis = Fare Y eksenini ters çevir +hud-settings-enable_mouse_smoothing = Kamera kontrolünü yumuşat +hud-settings-free_look_behavior = Serbest bakış davranışı +hud-settings-auto_walk_behavior = Otomatik yürüme davranışı +hud-settings-stop_auto_walk_on_input = + Otomatik yürüyüşü hareket + edince kapat +hud-settings-view_distance = Görüş Mesafesi +hud-settings-sprites_view_distance = Sprite Görüş Mesafesi +hud-settings-figures_view_distance = Figür Görüş Mesafesi +hud-settings-maximum_fps = Maksimum FPS +hud-settings-fov = Görüş alanı (derece) +hud-settings-gamma = Gama +hud-settings-exposure = Görünürlük +hud-settings-ambiance = Ortam Parlaklığı +hud-settings-antialiasing_mode = Kenar Yumuşatma Modu +hud-settings-upscale_factor = Render Büyütme Faktörü +hud-settings-cloud_rendering_mode = Bulut Kalitesi +hud-settings-fluid_rendering_mode = Su Kalitesi +hud-settings-fluid_rendering_mode-cheap = Basit +hud-settings-fluid_rendering_mode-shiny = Güzel +hud-settings-cloud_rendering_mode-minimal = En Düşük +hud-settings-cloud_rendering_mode-low = Düşük +hud-settings-cloud_rendering_mode-medium = Orta +hud-settings-cloud_rendering_mode-high = Yüksek +hud-settings-cloud_rendering_mode-ultra = En Yüksek +hud-settings-fullscreen = Tam Ekran +hud-settings-fullscreen_mode = Tam Ekran Modu +hud-settings-fullscreen_mode-exclusive = Ekranı kapla +hud-settings-fullscreen_mode-borderless = Penceresiz +hud-settings-particles = Partiküller +hud-settings-resolution = Çözünürlük +hud-settings-bit_depth = Bit Derinliği +hud-settings-refresh_rate = Yenileme Hızı +hud-settings-lighting_rendering_mode = Aydınlanma Modu +hud-settings-lighting_rendering_mode-ashikhmin = A Tipi - Yüksek +hud-settings-lighting_rendering_mode-blinnphong = B Tipi - Orta +hud-settings-lighting_rendering_mode-lambertian = L Tipi - Düşük +hud-settings-shadow_rendering_mode = Gölge Modu +hud-settings-shadow_rendering_mode-none = Yok +hud-settings-shadow_rendering_mode-cheap = Basit +hud-settings-shadow_rendering_mode-map = Ayrıntılı +hud-settings-shadow_rendering_mode-map-resolution = Çözünürlük +hud-settings-lod_detail = Uzak Cisim Detayı +hud-settings-save_window_size = Pencere boyutunu kaydet +hud-settings-music_volume = Müzik Sesi +hud-settings-sound_effect_volume = Efekt Sesi +hud-settings-audio_device = Ses Aygıtı +hud-settings-awaitingkey = Bir tuşa bas... +hud-settings-unbound = Atanmamış +hud-settings-reset_keybinds = Varsayılana döndür \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/settings.ron b/assets/voxygen/i18n/tr_TR/hud/settings.ron deleted file mode 100644 index e2a5038977..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/settings.ron +++ /dev/null @@ -1,98 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - // Settings - "hud.settings.general": "Genel", - "hud.settings.none": "Yok", - "hud.settings.press_behavior.toggle": "Aç/kapa", - "hud.settings.press_behavior.hold": "Basılı tut", - "hud.settings.help_window": "Yardım Penceresi", - "hud.settings.debug_info": "Hata Ayıklama Bilgileri", - "hud.settings.tips_on_startup": "Açılışta İpuçlarını Göster", - "hud.settings.ui_scale": "Arayüz Ölçeği", - "hud.settings.relative_scaling": "Otomatik Ölçek", - "hud.settings.custom_scaling": "Sabit Ölçek", - "hud.settings.crosshair": "İmleç tipi", - "hud.settings.opacity": "Şeffaflık", - "hud.settings.hotbar": "Aksiyon Çubuğu", - "hud.settings.toggle_shortcuts": "Kısayolları aç/kapa", - "hud.settings.buffs_skillbar": "Etkiler yetenek çubuğunun üstünde", - "hud.settings.buffs_mmap": "Etkiler haritanın yanında", - "hud.settings.toggle_bar_experience": "Tecrübe çubuğunu aç/kapa", - "hud.settings.scrolling_combat_text": "Verilen/Alınan Hasar Yazısı", - "hud.settings.incoming_damage": "Alınan Hasarı Tek Tek Göster", - "hud.settings.speech_bubble": "Konuşma balonu", - "hud.settings.speech_bubble_dark_mode": "Konuşma balonunda karanlık tema kullan", - "hud.settings.speech_bubble_icon": "Konuşma balonunda ikon göster", - "hud.settings.energybar_numbers": "Enerji çubuğu değerleri", - "hud.settings.values": "Sayılar", - "hud.settings.percentages": "Yüzdeler", - "hud.settings.chat": "Sohbet", - "hud.settings.background_opacity": "Arkaplan Şeffaflığı", - "hud.settings.chat_character_name": "Sohbette karakter isimlerini göster", - "hud.settings.loading_tips": "Yükleme ekranı ipuçları", - - "hud.settings.pan_sensitivity": "Kaydırma Hassaslığı", - "hud.settings.zoom_sensitivity": "Büyütme Hassaslığı", - "hud.settings.invert_scroll_zoom": "Kaydırma Büyütmesini ters çevir", - "hud.settings.invert_mouse_y_axis": "Fare Y eksenini ters çevir", - "hud.settings.enable_mouse_smoothing": "Kamera kontrolünü yumuşat", - "hud.settings.free_look_behavior": "Serbest bakış davranışı", - "hud.settings.auto_walk_behavior": "Otomatik yürüme davranışı", - "hud.settings.stop_auto_walk_on_input": r#"Otomatik yürüyüşü hareket -edince kapat"#, - - "hud.settings.view_distance": "Görüş Mesafesi", - "hud.settings.sprites_view_distance": "Sprite Görüş Mesafesi", - "hud.settings.figures_view_distance": "Figür Görüş Mesafesi", - "hud.settings.maximum_fps": "Maksimum FPS", - "hud.settings.fov": "Görüş alanı (derece)", - "hud.settings.gamma": "Gama", - "hud.settings.exposure": "Görünürlük", - "hud.settings.ambiance": "Ortam Parlaklığı", - "hud.settings.antialiasing_mode": "Kenar Yumuşatma Modu", - "hud.settings.upscale_factor": "Render Büyütme Faktörü", - "hud.settings.cloud_rendering_mode": "Bulut Kalitesi", - "hud.settings.fluid_rendering_mode": "Su Kalitesi", - "hud.settings.fluid_rendering_mode.cheap": "Basit", - "hud.settings.fluid_rendering_mode.shiny": "Güzel", - "hud.settings.cloud_rendering_mode.minimal": "En Düşük", - "hud.settings.cloud_rendering_mode.low": "Düşük", - "hud.settings.cloud_rendering_mode.medium": "Orta", - "hud.settings.cloud_rendering_mode.high": "Yüksek", - "hud.settings.cloud_rendering_mode.ultra": "En Yüksek", - "hud.settings.fullscreen": "Tam Ekran", - "hud.settings.fullscreen_mode": "Tam Ekran Modu", - "hud.settings.fullscreen_mode.exclusive": "Ekranı kapla", - "hud.settings.fullscreen_mode.borderless": "Penceresiz", - "hud.settings.particles": "Partiküller", - "hud.settings.resolution": "Çözünürlük", - "hud.settings.bit_depth": "Bit Derinliği", - "hud.settings.refresh_rate": "Yenileme Hızı", - "hud.settings.lighting_rendering_mode": "Aydınlanma Modu", - "hud.settings.lighting_rendering_mode.ashikhmin": "A Tipi - Yüksek", - "hud.settings.lighting_rendering_mode.blinnphong": "B Tipi - Orta", - "hud.settings.lighting_rendering_mode.lambertian": "L Tipi - Düşük", - "hud.settings.shadow_rendering_mode": "Gölge Modu", - "hud.settings.shadow_rendering_mode.none": "Yok", - "hud.settings.shadow_rendering_mode.cheap": "Basit", - "hud.settings.shadow_rendering_mode.map": "Ayrıntılı", - "hud.settings.shadow_rendering_mode.map.resolution": "Çözünürlük", - "hud.settings.lod_detail": "Uzak Cisim Detayı", - "hud.settings.save_window_size": "Pencere boyutunu kaydet", - - "hud.settings.music_volume": "Müzik Sesi", - "hud.settings.sound_effect_volume": "Efekt Sesi", - "hud.settings.audio_device": "Ses Aygıtı", - - "hud.settings.awaitingkey": "Bir tuşa bas...", - "hud.settings.unbound": "Atanmamış", - "hud.settings.reset_keybinds": "Varsayılana döndür", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/tr_TR/hud/social.ftl b/assets/voxygen/i18n/tr_TR/hud/social.ftl new file mode 100644 index 0000000000..5795f9d2bd --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Diğer Oyuncular +hud-social-online = Çevrimiçi: +hud-social-friends = Arkadaşlar +hud-social-not_yet_available = Şu anda kullanılabilir değil +hud-social-faction = Klan +hud-social-play_online_fmt = { $nb_player } oyuncu çevrimiçi +hud-social-name = İsim +hud-social-level = Seviye +hud-social-zone = Bölge +hud-social-account = Hesap \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/hud/social.ron b/assets/voxygen/i18n/tr_TR/hud/social.ron deleted file mode 100644 index 62a2ffea21..0000000000 --- a/assets/voxygen/i18n/tr_TR/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - "hud.social": "Diğer Oyuncular", - "hud.social.online": "Çevrimiçi:", - "hud.social.friends": "Arkadaşlar", - "hud.social.not_yet_available": "Şu anda kullanılabilir değil", - "hud.social.faction": "Klan", - "hud.social.play_online_fmt": "{nb_player} oyuncu çevrimiçi", - "hud.social.name": "İsim", - "hud.social.level": "Seviye", - "hud.social.zone": "Bölge", - "hud.social.account": "Hesap", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/tr_TR/main.ftl b/assets/voxygen/i18n/tr_TR/main.ftl new file mode 100644 index 0000000000..4d291950a9 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/main.ftl @@ -0,0 +1,76 @@ +main-username = Kullanıcı adı +main-server = Sunucu +main-password = Şifre +main-connecting = Bağlanılıyor +main-creating_world = Dünya oluşturuluyor +main-tip = İpucu: +main-notice = + Veloren Alfa sürümüne hoşgeldin! + + Eğlenmeye başlamadan önce, lütfen bir kaç şeyi aklında tut: + + - Bu alfa sürümü daha çok yeni. Hatalar, bitmemiş oynanış, elden geçirilmemiş mekanikler ve eksik özellikler bulunuyor. + + - Yapıcı geri bildirim veya hata raporların varsa bize Reddit, GitLab veya Discord kullanarak ulaşabilirsin. + + - Veloren GPL 3 açık kaynak lisansı ile lisanslıdır. Bunun anlamı, oyunu istediğin gibi oynayabilir, değiştirebilir ve dağıtabilirsin + (türetilmiş çalışmalarda GPL 3 ile lisanslanmış olduğu sürece) + + - Veloren kar gütmeyen bir topluluk projesidir ve üzerinde çalışan herkes birer gönüllüdür. + Gördüklerini beğendiysen, geliştirme veya sanat takımlarına katılabilirsin! + + Bu bildiriyi okumaya zaman ayırdığın için teşekkür ederiz, umarız ki oyundan memnun kalırsın! + + ~ Veloren Geliştiricileri +main-login_process = + Giriş işlemi hakkında bilgi: + + Eğer giriş yaparken sorunlarla karşılaşıyorsan: + + Lütfen kimlik doğrulaması gerektiren sunucularda + oynamak için bir hesaba ihtiyacın olduğunu hatırla. + + https://veloren.net/account/ adresinden + + bir hesap oluşturabilirsin. +main-login-server_not_found = Sunucu bulunamadı +main-login-authentication_error = Sunucuda kimlik doğrulama hatası +main-login-internal_error = İç istemci hatası (büyük ihtimalle oyuncu karakteri silindi.) +main-login-failed_auth_server_url_invalid = Kimlik doğrulama sunucusuna bağlanılamadı. +main-login-insecure_auth_scheme = HTTP kimlik doğrulama desteklenmiyor. Güvenli değil! Geliştirme amacıyla, HTTP'ye 'localhost' ve debug buildleri için izin verilir. +main-login-server_full = Sunucu dolu +main-login-untrusted_auth_server = Kimlik doğrulama sunucusu güvenilir değil +main-login-outdated_client_or_server = SunucuÇılgınaDöndü: Muhtemelen versiyonlar uyuşmuyor, güncellemeleri kontrol et. +main-login-timeout = Zamanaşımı: Sunucu zamanında cevap vermedi. (Aşırı yüklenme veya ağ sorunları). +main-login-server_shut_down = Sunucu kapandı +main-login-network_error = Ağ hatası +main-login-network_wrong_version = Sunucu ve istemci versiyonu uyuşmuyor, lütfen istemcinizi güncelleyin. +main-login-failed_sending_request = Kimlik doğrulama sunucusuna istek gönderilemedi +main-login-invalid_character = Seçilen karakter geçersiz +main-login-client_crashed = İstemci çöktü +main-login-not_on_whitelist = Sunucuya girmek için bir Yönetici tarafından beyaz listeye eklenmen gerekiyor +main-login-banned = Sunucudan aşağıdaki sebepten dolayı yasaklandınız +main-login-kicked = Sunucudan aşağıdaki sebepten dolayı atıldınız +main-login-select_language = Bir dil seç +main-login-client_version = İstemci Versiyonu +main-login-server_version = Sunucu Versiyonu +main-servers-select_server = Bir sunucu seç +loading-tips = + .a0 = '{ $gameinput-togglelantern }'ye basarak fenerini yak. + .a1 = '{ $gameinput-help }'e basarak bütün kontrolleri görebilirsin. + .a2 = '/say' veya '/s' yazarak sadece hemen yanındaki oyuncularla konuşabilirsin. + .a3 = '/region' veya '/r' yazarak sadece bir kaç yüz blok içindeki oyuncularla konuşabilirsin. + .a4 = Özel bir mesaj göndermek için '/tell' ve sonra bir oyuncu ismi ile mesajını yaz. + .a5 = Aynı seviyedeki NPCler farklı zorluklara sahip olabilir. + .a6 = Yemek, sandık ve diğer ganimetler için yere bak! + .a7 = Envanterin yemekle mi dolu? Onları kullanarak daha iyi yemek yapmaya çalış! + .a8 = Ne yapabileceğini merak mı ediyorsun? Zindanlar haritada kahverengi bölgeler olarak işaretlenmiştir! + .a9 = Grafikleri sistemin için ayarlamayı unutma. '{ $gameinput-settings }'e basarak ayarları aç. + .a10 = Başkalarıyla oynamak eğlencelidir! '{ $gameinput-social }'ya basarak kimlerin çevirimiçi olduğunu gör. + .a11 = Can barının yanında kurukafa olan bir NPC senden hayli bir güçlüdür. + .a12 = '{ $gameinput-dance }'ye basarak dans et. Parti! + .a13 = '{ $gameinput-glide }'e basarak Planörünü aç ve gökyüzünü fethet. + .a14 = Veloren hala Pre-Alpha'da. Onu geliştirmek için her gün elimizden geleni yapıyoruz! + .a15 = Geliştirme Takımına katılmak istiyorsan veya sadece sohbet etmek istiyorsan Discord sunucumuza katıl. + .a16 = Can barında canı sayı olarak görmek istiyorsan, bunu ayarlardan aktifleştirebilirsin. + .a17 = Niteliklerini görmek için envanterindeki 'Nitelikler' düğmesine tıklayabilirsin. \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/main.ron b/assets/voxygen/i18n/tr_TR/main.ron deleted file mode 100644 index 9fec94dbc1..0000000000 --- a/assets/voxygen/i18n/tr_TR/main.ron +++ /dev/null @@ -1,92 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - /// Start Main screen section - "main.username": "Kullanıcı adı", - "main.server": "Sunucu", - "main.password": "Şifre", - "main.connecting": "Bağlanılıyor", - "main.creating_world": "Dünya oluşturuluyor", - "main.tip": "İpucu:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Veloren Alfa sürümüne hoşgeldin! - -Eğlenmeye başlamadan önce, lütfen bir kaç şeyi aklında tut: - -- Bu alfa sürümü daha çok yeni. Hatalar, bitmemiş oynanış, elden geçirilmemiş mekanikler ve eksik özellikler bulunuyor. - -- Yapıcı geri bildirim veya hata raporların varsa bize Reddit, GitLab veya Discord kullanarak ulaşabilirsin. - -- Veloren GPL 3 açık kaynak lisansı ile lisanslıdır. Bunun anlamı, oyunu istediğin gibi oynayabilir, değiştirebilir ve dağıtabilirsin -(türetilmiş çalışmalarda GPL 3 ile lisanslanmış olduğu sürece) - -- Veloren kar gütmeyen bir topluluk projesidir ve üzerinde çalışan herkes birer gönüllüdür. -Gördüklerini beğendiysen, geliştirme veya sanat takımlarına katılabilirsin! - -Bu bildiriyi okumaya zaman ayırdığın için teşekkür ederiz, umarız ki oyundan memnun kalırsın! - -~ Veloren Geliştiricileri"#, - - // Login process description - "main.login_process": r#"Giriş işlemi hakkında bilgi: - -Eğer giriş yaparken sorunlarla karşılaşıyorsan: - -Lütfen kimlik doğrulaması gerektiren sunucularda -oynamak için bir hesaba ihtiyacın olduğunu hatırla. - -https://veloren.net/account/ adresinden - -bir hesap oluşturabilirsin."#, - "main.login.server_not_found": "Sunucu bulunamadı", - "main.login.authentication_error": "Sunucuda kimlik doğrulama hatası", - "main.login.internal_error": "İç istemci hatası (büyük ihtimalle oyuncu karakteri silindi.)", - "main.login.failed_auth_server_url_invalid": "Kimlik doğrulama sunucusuna bağlanılamadı.", - "main.login.insecure_auth_scheme": "HTTP kimlik doğrulama desteklenmiyor. Güvenli değil! Geliştirme amacıyla, HTTP'ye 'localhost' ve debug buildleri için izin verilir.", - "main.login.server_full": "Sunucu dolu", - "main.login.untrusted_auth_server": "Kimlik doğrulama sunucusu güvenilir değil", - "main.login.outdated_client_or_server": "SunucuÇılgınaDöndü: Muhtemelen versiyonlar uyuşmuyor, güncellemeleri kontrol et.", - "main.login.timeout": "Zamanaşımı: Sunucu zamanında cevap vermedi. (Aşırı yüklenme veya ağ sorunları).", - "main.login.server_shut_down": "Sunucu kapandı", - "main.login.network_error": "Ağ hatası", - "main.login.network_wrong_version": "Sunucu ve istemci versiyonu uyuşmuyor, lütfen istemcinizi güncelleyin.", - "main.login.failed_sending_request": "Kimlik doğrulama sunucusuna istek gönderilemedi", - "main.login.invalid_character": "Seçilen karakter geçersiz", - "main.login.client_crashed": "İstemci çöktü", - "main.login.not_on_whitelist": "Sunucuya girmek için bir Yönetici tarafından beyaz listeye eklenmen gerekiyor", - "main.login.banned": "Sunucudan aşağıdaki sebepten dolayı yasaklandınız", - "main.login.kicked": "Sunucudan aşağıdaki sebepten dolayı atıldınız", - "main.login.select_language": "Bir dil seç", - "main.login.client_version": "İstemci Versiyonu", - "main.login.server_version": "Sunucu Versiyonu", - "main.servers.select_server": "Bir sunucu seç", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "'{gameinput.togglelantern}'ye basarak fenerini yak.", - "'{gameinput.help}'e basarak bütün kontrolleri görebilirsin.", - "'/say' veya '/s' yazarak sadece hemen yanındaki oyuncularla konuşabilirsin.", - "'/region' veya '/r' yazarak sadece bir kaç yüz blok içindeki oyuncularla konuşabilirsin.", - "Özel bir mesaj göndermek için '/tell' ve sonra bir oyuncu ismi ile mesajını yaz.", - "Aynı seviyedeki NPCler farklı zorluklara sahip olabilir.", - "Yemek, sandık ve diğer ganimetler için yere bak!", - "Envanterin yemekle mi dolu? Onları kullanarak daha iyi yemek yapmaya çalış!", - "Ne yapabileceğini merak mı ediyorsun? Zindanlar haritada kahverengi bölgeler olarak işaretlenmiştir!", - "Grafikleri sistemin için ayarlamayı unutma. '{gameinput.settings}'e basarak ayarları aç.", - "Başkalarıyla oynamak eğlencelidir! '{gameinput.social}'ya basarak kimlerin çevirimiçi olduğunu gör.", - "Can barının yanında kurukafa olan bir NPC senden hayli bir güçlüdür.", - "'{gameinput.dance}'ye basarak dans et. Parti!", - "'{gameinput.glide}'e basarak Planörünü aç ve gökyüzünü fethet.", - "Veloren hala Pre-Alpha'da. Onu geliştirmek için her gün elimizden geleni yapıyoruz!", - "Geliştirme Takımına katılmak istiyorsan veya sadece sohbet etmek istiyorsan Discord sunucumuza katıl.", - "Can barında canı sayı olarak görmek istiyorsan, bunu ayarlardan aktifleştirebilirsin.", - "Niteliklerini görmek için envanterindeki 'Nitelikler' düğmesine tıklayabilirsin.", - ], - } -) diff --git a/assets/voxygen/i18n/tr_TR/npc.ftl b/assets/voxygen/i18n/tr_TR/npc.ftl new file mode 100644 index 0000000000..4f71e67cd5 --- /dev/null +++ b/assets/voxygen/i18n/tr_TR/npc.ftl @@ -0,0 +1,80 @@ +npc-speech-villager_under_attack = + .a0 = Saldırı altındayım, yardım edin! + .a1 = Saldırı altındayım! Yardım edin! + .a2 = Ahhh! Saldırı altındayım! + .a3 = Ahhh! Saldırı altındayım! Yardım edin! + .a4 = Saldırı altındayım! Bana yardım edin! + .a5 = Yardım edin! Saldırı altındayım! + .a6 = Bana yardım edin! Saldırı altındayım! + .a7 = Yardım edin! + .a8 = Yardım edin! Yardım edin! + .a9 = Yardım edin! Yardım edin! Yardım edin! + .a10 = Saldırı altındayım! + .a11 = AAAHHHH! Saldırı altındayım! + .a12 = AAAHHHH! Yardım edin! Saldırı altındayım! + .a13 = Saldırı altındayız! Yardım edin! + .a14 = Katil! Yardım edin! + .a15 = Bir katil serbestçe dolaşıyor! Yardım edin! + .a16 = Beni öldürmeye çalışıyorlar! Yardım edin! + .a17 = Gardiyanlar, saldırı altındayım! + .a18 = Saldırı altındayım! Gardiyanlar! + .a19 = Gardiyanlar! Saldırı altındayım! + .a20 = Saldırı altındayım! Gardiyanlar! Yardım edin! + .a21 = Gardiyanlar! Çabuk gelin! + .a22 = Gardiyanlar! Gardiyanlar! + .a23 = Bana saldıran bir kötü var! Yardım edin! + .a24 = Gardiyanlar, bu pis kötüyü öldürün! + .a25 = Gardiyanlar! Burada bir katil var! + .a26 = Gardiyanlar! Bana yardım edin! + .a27 = Bu yanına kalmayacak! Gardiyanlar! + .a28 = Seni şeytan! + .a29 = Bana yardım edin! + .a30 = Lütfen! Yardım edin! + .a31 = Ahhh! Gardiyanlar! Yardım edin! + .a32 = Benim için geliyorlar! + .a33 = Yardım edin! Yardım edin! Baskı altındayım! + .a34 = Ah, artık sistemin doğasında var olan şiddeti görüyoruz. + .a35 = Bu bana göre bir çizik bile değil! + .a36 = Yapma şunu! + .a37 = Ben sana ne yaptım ki?! + .a38 = Lütfen bana saldırmayı kes! + .a39 = Hey! Onu nereye yönelttiğine dikkat et! + .a40 = Aşağılık herif, gözüm bile görmesin! + .a41 = Durdur şunu! Git buradan! + .a42 = Şimdi beni kızdırmaya başladın! + .a43 = Hey! Sen kim olduğunu zannediyorsun ki?! + .a44 = Bunun için kelleni alacağım! + .a45 = Yapma, lütfen! Değerli hiçbir şeyim yok bile! + .a46 = Kardeşimi üzerine salacağım, o benden bile büyük! + .a47 = Olamaaaz, Seni anneme söyleyeceğim! + .a48 = Lanet olsun sana! + .a49 = Lütfen yapma şunu. + .a50 = Bunu yapman pek kibarca değildi! + .a51 = Evet silahın çalışıyor, şimdi kaldırabilir misin? + .a52 = Bağışlayın beni! + .a53 = Lütfen, benim bir ailem var! + .a54 = Ölmek için çok gencim! + .a55 = Bunu konuşarak çözebilir miyiz? + .a56 = Şiddet hiçbir zaman çare değildir! + .a57 = Günüm gittikçe kötüleşiyor... + .a58 = Hey, bu acıttı! + .a59 = Eek! + .a60 = Ne kadar da kaba! + .a61 = Dur, sana yalvarırım! + .a62 = Lanet olsun sana! + .a63 = Bu eğlenceli bile değil. + .a64 = Ne cürret?! + .a65 = Bunu sana ödeteceğim! + .a66 = Yapmaya devam edersen bunun için pişman olacaksın! + .a67 = Sana zarar vermek zorunda bırakma beni! + .a68 = Bir yanlış anlaşılma olmalı! + .a69 = Bunu yapmak zorunda değilsin! + .a70 = Defol! + .a71 = Bu gerçekten acıttı! + .a72 = Bunu neden yaptın ki? + .a73 = Ruhlar tarafından, dur! + .a74 = Beni başkasıyla karıştırmış olmalısın! + .a75 = Bunu haketmiyorum! + .a76 = Lütfen bunu bir daha yapma. + .a77 = Muhafızlar, şu canavarı göle atın! + .a78 = Tarrasque'ımı üzerine salarım! \ No newline at end of file diff --git a/assets/voxygen/i18n/tr_TR/npc.ron b/assets/voxygen/i18n/tr_TR/npc.ron deleted file mode 100644 index dd433e925a..0000000000 --- a/assets/voxygen/i18n/tr_TR/npc.ron +++ /dev/null @@ -1,92 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Turkish (Turkey) -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager_under_attack": [ - "Saldırı altındayım, yardım edin!", - "Saldırı altındayım! Yardım edin!", - "Ahhh! Saldırı altındayım!", - "Ahhh! Saldırı altındayım! Yardım edin!", - "Saldırı altındayım! Bana yardım edin!", - "Yardım edin! Saldırı altındayım!", - "Bana yardım edin! Saldırı altındayım!", - "Yardım edin!", - "Yardım edin! Yardım edin!", - "Yardım edin! Yardım edin! Yardım edin!", - "Saldırı altındayım!", - "AAAHHHH! Saldırı altındayım!", - "AAAHHHH! Yardım edin! Saldırı altındayım!", - "Saldırı altındayız! Yardım edin!", - "Katil! Yardım edin!", - "Bir katil serbestçe dolaşıyor! Yardım edin!", - "Beni öldürmeye çalışıyorlar! Yardım edin!", - "Gardiyanlar, saldırı altındayım!", - "Saldırı altındayım! Gardiyanlar!", - "Gardiyanlar! Saldırı altındayım!", - "Saldırı altındayım! Gardiyanlar! Yardım edin!", - "Gardiyanlar! Çabuk gelin!", - "Gardiyanlar! Gardiyanlar!", - "Bana saldıran bir kötü var! Yardım edin!", - "Gardiyanlar, bu pis kötüyü öldürün!", - "Gardiyanlar! Burada bir katil var!", - "Gardiyanlar! Bana yardım edin!", - "Bu yanına kalmayacak! Gardiyanlar!", - "Seni şeytan!", - "Bana yardım edin!", - "Lütfen! Yardım edin!", - "Ahhh! Gardiyanlar! Yardım edin!", - "Benim için geliyorlar!", - "Yardım edin! Yardım edin! Baskı altındayım!", - "Ah, artık sistemin doğasında var olan şiddeti görüyoruz.", - "Bu bana göre bir çizik bile değil!", - "Yapma şunu!", - "Ben sana ne yaptım ki?!", - "Lütfen bana saldırmayı kes!", - "Hey! Onu nereye yönelttiğine dikkat et!", - "Aşağılık herif, gözüm bile görmesin!", - "Durdur şunu! Git buradan!", - "Şimdi beni kızdırmaya başladın!", - "Hey! Sen kim olduğunu zannediyorsun ki?!", - "Bunun için kelleni alacağım!", - "Yapma, lütfen! Değerli hiçbir şeyim yok bile!", - "Kardeşimi üzerine salacağım, o benden bile büyük!", - "Olamaaaz, Seni anneme söyleyeceğim!", - "Lanet olsun sana!", - "Lütfen yapma şunu.", - "Bunu yapman pek kibarca değildi!", - "Evet silahın çalışıyor, şimdi kaldırabilir misin?", - "Bağışlayın beni!", - "Lütfen, benim bir ailem var!", - "Ölmek için çok gencim!", - "Bunu konuşarak çözebilir miyiz?", - "Şiddet hiçbir zaman çare değildir!", - "Günüm gittikçe kötüleşiyor...", - "Hey, bu acıttı!", - "Eek!", - "Ne kadar da kaba!", - "Dur, sana yalvarırım!", - "Lanet olsun sana!", - "Bu eğlenceli bile değil.", - "Ne cürret?!", - "Bunu sana ödeteceğim!", - "Yapmaya devam edersen bunun için pişman olacaksın!", - "Sana zarar vermek zorunda bırakma beni!", - "Bir yanlış anlaşılma olmalı!", - "Bunu yapmak zorunda değilsin!", - "Defol!", - "Bu gerçekten acıttı!", - "Bunu neden yaptın ki?", - "Ruhlar tarafından, dur!", - "Beni başkasıyla karıştırmış olmalısın!", - "Bunu haketmiyorum!", - "Lütfen bunu bir daha yapma.", - "Muhafızlar, şu canavarı göle atın!", - "Tarrasque'ımı üzerine salarım!", - ], - } -) diff --git a/assets/voxygen/i18n/uk_UA/buff.ftl b/assets/voxygen/i18n/uk_UA/buff.ftl new file mode 100644 index 0000000000..103fbb6ff6 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/buff.ftl @@ -0,0 +1,37 @@ +buff-remove = Клікніть, щоб видалити +buff-title-missing = Назва відсутня +buff-desc-missing = Опис відсутній +buff-title-heal = Зцілення +buff-desc-heal = Поступово відновлює Здоров'я. +buff-title-potion = Зілля +buff-desc-potion = Пиття... +buff-title-saturation = Насичення +buff-desc-saturation = Поступово відновлює Здоров'я з їжі. +buff-title-campfire_heal = Відновлення біля ватри +buff-desc-campfire_heal = Відпочинок біля ватри лікує на { $rate }% за секунду. +buff-title-invulnerability = Невразливість +buff-desc-invulnerability = Ви невразливий, тільки тримайтесь подалі від омели. +buff-title-protectingward = Захисна Аура +buff-desc-protectingward = Ви захищені від атак, у якомусь сенсі. +buff-title-frenzied = Манія +buff-desc-frenzied = Кров тече швидше, прискоруючи ваш рух та помалу зцілюючи вас. +buff-title-cursed = Проклін +buff-desc-cursed = Вас прокляли. +buff-title-bleed = Кровотеча +buff-desc-bleed = Завдає регулярних пошкодженнь. +buff-title-burn = У Вогні +buff-desc-burn = Ви згораєте заживо. +buff-title-crippled = Калічення +buff-desc-crippled = Ваші рухи дуже скуті через отримані травми. +buff-title-frozen = Обмороження +buff-desc-frozen = Швидкість пересування та атак знижена. +buff-title-wet = Волога +buff-desc-wet = Земля плутає ваші ноги ускладнючи пересування. +buff-title-ensnared = Пастка +buff-desc-ensnared = Ліани опутують ваші ноги, перешкоджаючи ходьбі. +buff-stat-health = Відновлює { $str_total } ОЗ +buff-stat-increase_max_health = Підвищує Максимальне Здоров'я на { $strength } +buff-stat-increase_max_energy = Підвищує Максимальну Енергію на { $strength } +buff-stat-invulnerability = Дає невразливість +buff-text-for_seconds = протягом { $dur_secs } сек. +buff-text-over_seconds = впродовж { $dur_secs } сек. \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/buff.ron b/assets/voxygen/i18n/uk_UA/buff.ron deleted file mode 100644 index ceb08de5bc..0000000000 --- a/assets/voxygen/i18n/uk_UA/buff.ron +++ /dev/null @@ -1,65 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "buff.remove": "Клікніть, щоб видалити", - "buff.title.missing": "Назва відсутня", - - // Buffs - "buff.desc.missing": "Опис відсутній", - "buff.title.heal": "Зцілення", - - "buff.desc.heal": "Поступово відновлює Здоров'я.", - "buff.title.potion": "Зілля", - - "buff.desc.potion": "Пиття...", - "buff.title.saturation": "Насичення", - - "buff.desc.saturation": "Поступово відновлює Здоров'я з їжі.", - "buff.title.campfire_heal": "Відновлення біля ватри", - - "buff.desc.campfire_heal": "Відпочинок біля ватри лікує на {rate}% за секунду.", - "buff.title.invulnerability": "Невразливість", - "buff.desc.invulnerability": "Ви невразливий, тільки тримайтесь подалі від омели.", - - "buff.title.protectingward": "Захисна Аура", - "buff.desc.protectingward": "Ви захищені від атак, у якомусь сенсі.", - - "buff.title.frenzied": "Манія", - "buff.desc.frenzied": "Кров тече швидше, прискоруючи ваш рух та помалу зцілюючи вас.", - // Debuffs - "buff.title.cursed": "Проклін", - "buff.desc.cursed": "Вас прокляли.", - - "buff.title.bleed": "Кровотеча", - "buff.desc.bleed": "Завдає регулярних пошкодженнь.", - - "buff.title.burn": "У Вогні", - "buff.desc.burn": "Ви згораєте заживо.", - - "buff.title.crippled": "Калічення", - "buff.desc.crippled": "Ваші рухи дуже скуті через отримані травми.", - - "buff.title.frozen": "Обмороження", - "buff.desc.frozen": "Швидкість пересування та атак знижена.", - - "buff.title.wet": "Волога", - "buff.desc.wet": "Земля плутає ваші ноги ускладнючи пересування.", - - "buff.title.ensnared": "Пастка", - "buff.desc.ensnared": "Ліани опутують ваші ноги, перешкоджаючи ходьбі.", - // Stats - "buff.stat.health": "Відновлює {str_total} ОЗ", - "buff.stat.increase_max_health": "Підвищує Максимальне Здоров'я на {strength}", - "buff.stat.increase_max_energy": "Підвищує Максимальну Енергію на {strength}", - "buff.stat.invulnerability": "Дає невразливість", - // Text - "buff.text.for_seconds": "протягом {dur_secs} сек.", - "buff.text.over_seconds": "впродовж {dur_secs} сек.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/char_selection.ftl b/assets/voxygen/i18n/uk_UA/char_selection.ftl new file mode 100644 index 0000000000..363da8023f --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Завантаження персонажів... +char_selection-delete_permanently = Видалити цього персонажа назавжди? +char_selection-deleting_character = Видалення персонажа... +char_selection-change_server = Змінити сервер +char_selection-enter_world = Увійти в світ +char_selection-logout = Вийти +char_selection-create_new_character = Створити нового персонажа +char_selection-creating_character = Створення персонажа... +char_selection-character_creation = Створення персонажа +char_selection-human_default = Типова людина +char_selection-level_fmt = Рівень { $level_nb } +char_selection-uncanny_valley = Дика Природа +char_selection-plains_of_uncertainty = Рівнини Невизначеності +char_selection-beard = Борода +char_selection-hair_style = Зачіска +char_selection-hair_color = Колір волосся +char_selection-eye_color = Колір очей +char_selection-skin = Шкіра +char_selection-eyeshape = Форма очей +char_selection-accessories = Аксесуари +char_selection-create_info_name = Назвіть вашого персонажа! +char_selection-version_mismatch = УВАГА! Цей сервер використовує іншу (ймовірно несумісну) версію гри. Будь ласка, оновіть свою гру! \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/char_selection.ron b/assets/voxygen/i18n/uk_UA/char_selection.ron deleted file mode 100644 index 019ad32ce9..0000000000 --- a/assets/voxygen/i18n/uk_UA/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "char_selection.loading_characters": "Завантаження персонажів...", - "char_selection.delete_permanently": "Видалити цього персонажа назавжди?", - "char_selection.deleting_character": "Видалення персонажа...", - "char_selection.change_server": "Змінити сервер", - "char_selection.enter_world": "Увійти в світ", - "char_selection.logout": "Вийти", - "char_selection.create_new_character": "Створити нового персонажа", - "char_selection.creating_character": "Створення персонажа...", - "char_selection.character_creation": "Створення персонажа", - "char_selection.human_default": "Типова людина", - "char_selection.level_fmt": "Рівень {level_nb}", - "char_selection.uncanny_valley": "Дика Природа", - "char_selection.plains_of_uncertainty": "Рівнини Невизначеності", - "char_selection.beard": "Борода", - "char_selection.hair_style": "Зачіска", - "char_selection.hair_color": "Колір волосся", - "char_selection.eye_color": "Колір очей", - "char_selection.skin": "Шкіра", - "char_selection.eyeshape": "Форма очей", - "char_selection.accessories": "Аксесуари", - "char_selection.create_info_name": "Назвіть вашого персонажа!", - "char_selection.version_mismatch": "УВАГА! Цей сервер використовує іншу (ймовірно несумісну) версію гри. Будь ласка, оновіть свою гру!" // force update - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/common.ftl b/assets/voxygen/i18n/uk_UA/common.ftl new file mode 100644 index 0000000000..ac0c4d648a --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/common.ftl @@ -0,0 +1,98 @@ +common-username = Ім'я користувача +common-singleplayer = Одиночна гра +common-multiplayer = Мультиплеєр +common-servers = Сервери +common-quit = Вихід +common-settings = Налаштування +common-interface = Інтерфейс +common-chat = Чат +common-gameplay = Гра +common-controls = Елементи Керування +common-video = Графіка +common-sound = Звук +common-languages = Мова +common-resume = Продовжити +common-characters = Персонажі +common-close = Закрити +common-yes = Так +common-no = Ні +common-back = Назад +common-create = Створити +common-okay = Добре +common-add = Додати +common-accept = Прийняти +common-decline = Відхилити +common-disclaimer = Дисклеймер +common-cancel = Відмінити +common-none = Нічого +common-error = Помилка +common-fatal_error = Фатальна Помилка +common-you = Ви +common-automatic = Автоматично +common-random = Випадково +common-empty = Пустий +common-interface_settings = Налаштування Інтерфейсу +common-chat_settings = Налаштування Чату +common-gameplay_settings = Налаштування Гри +common-controls_settings = Налаштування Елементів Керування +common-video_settings = Налаштування Графіки +common-sound_settings = Налаштування Звуку +common-language_settings = Налаштування Мови +common-connection_lost = + З'єднання розірвано! + Можливо сервер перезапустився? + Чи Ваш клієнт не останньої версії? +common-weapons-axe = Сокира +common-weapons-sword = Меч +common-weapons-staff = Посох +common-weapons-bow = Лук +common-weapons-hammer = Молот +common-weapons-sceptre = Скіпетр +common-weapons-shield = Щит +common-weapons-spear = Спис +common-weapons-general = Бій (загальне) +common-weapons-hammer_simple = Простий Молот +common-weapons-sword_simple = Простий Меч +common-weapons-staff_simple = Простий Посох +common-weapons-axe_simple = Проста Сокира +common-weapons-bow_simple = Простий Лук +common-weapons-unique = Унікальне +common-tool-debug = Дебаг +common-tool-farming = Фермерський Інструмент +common-tool-pick = Кирка +common-tool-mining = Гірнича справа +common-kind-modular_component = Модульний Компонент +common-kind-glider = Дельтаплан +common-kind-consumable = Вживане +common-kind-throwable = Можна кинути +common-kind-utility = Корисність +common-kind-ingredient = Інгредієнт +common-kind-lantern = Ліхтар +common-hands-one = Одноручне +common-hands-two = Дворучне +common-rand_appearance = Випадкова зовнішність +common-rand_name = Випадкове ім'я +common-species-orc = Орк +common-species-human = Людина +common-species-dwarf = Дварф +common-species-elf = Ельф +common-species-draugr = Нежить +common-species-danari = Данарі +common-stats-combat_rating = БР +common-stats-power = Потужність +common-stats-speed = Швидкість +common-stats-poise = Приголомшення +common-stats-crit_chance = Крит. шанс +common-stats-crit_mult = Крит. множник +common-stats-crit_power = Крит. модифікатор +common-stats-energy_max = Макс. енергія +common-stats-energy_reward = Винагороди Енергії +common-stats-stealth = Стелс +common-stats-armor = Броні +common-stats-poise_res = Баланс +common-stats-slots = Слотів +common-material-metal = Метал +common-material-wood = Дерево +common-material-stone = Камінь +common-material-cloth = Тканина +common-material-hide = Шкіра \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/common.ron b/assets/voxygen/i18n/uk_UA/common.ron deleted file mode 100644 index 291db2ecb5..0000000000 --- a/assets/voxygen/i18n/uk_UA/common.ron +++ /dev/null @@ -1,128 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Ім'я користувача", - "common.singleplayer": "Одиночна гра", - "common.multiplayer": "Мультиплеєр", - "common.servers": "Сервери", - "common.quit": "Вихід", - "common.settings": "Налаштування", - - // Settings Submenus - "common.interface": "Інтерфейс", - "common.chat": "Чат", - "common.gameplay": "Гра", - "common.controls": "Елементи Керування", - "common.video": "Графіка", - "common.sound": "Звук", - "common.languages": "Мова", - - // Common actions - "common.resume": "Продовжити", - "common.characters": "Персонажі", - "common.close": "Закрити", - "common.yes": "Так", - "common.no": "Ні", - "common.back": "Назад", - "common.create": "Створити", - "common.okay": "Добре", - "common.add": "Додати", - "common.accept": "Прийняти", - "common.decline": "Відхилити", - "common.disclaimer": "Дисклеймер", - "common.cancel": "Відмінити", - "common.none": "Нічого", - "common.error": "Помилка", - "common.fatal_error": "Фатальна Помилка", - "common.you": "Ви", - "common.automatic": "Автоматично", - "common.random": "Випадково", - "common.empty": "Пустий", - - // Settings Window title - "common.interface_settings": "Налаштування Інтерфейсу", - "common.chat_settings": "Налаштування Чату", - "common.gameplay_settings": "Налаштування Гри", - "common.controls_settings": "Налаштування Елементів Керування", - "common.video_settings": "Налаштування Графіки", - "common.sound_settings": "Налаштування Звуку", - "common.language_settings": "Налаштування Мови", - - // Message when connection to the server is lost - "common.connection_lost": r#"З'єднання розірвано! -Можливо сервер перезапустився? -Чи Ваш клієнт не останньої версії?"#, - - // Weapon skills - "common.weapons.axe": "Сокира", - "common.weapons.sword": "Меч", - "common.weapons.staff": "Посох", - "common.weapons.bow": "Лук", - "common.weapons.hammer": "Молот", - "common.weapons.sceptre": "Скіпетр", - "common.weapons.shield": "Щит", - "common.weapons.spear": "Спис", - "common.weapons.general": "Бій (загальне)", - - // Tools & Weapons - "common.weapons.hammer_simple": "Простий Молот", - "common.weapons.sword_simple": "Простий Меч", - "common.weapons.staff_simple": "Простий Посох", - "common.weapons.axe_simple": "Проста Сокира", - "common.weapons.bow_simple": "Простий Лук", - "common.weapons.unique": "Унікальне", - "common.tool.debug": "Дебаг", - "common.tool.farming": "Фермерський Інструмент", - "common.tool.pick": "Кирка", - "common.tool.mining": "Гірнича справа", - "common.kind.modular_component": "Модульний Компонент", - "common.kind.glider": "Дельтаплан", - "common.kind.consumable": "Вживане", - "common.kind.throwable": "Можна кинути", - "common.kind.utility": "Корисність", - "common.kind.ingredient": "Інгредієнт", - "common.kind.lantern": "Ліхтар", - "common.hands.one": "Одноручне", - "common.hands.two": "Дворучне", - - // Character creation - "common.rand_appearance": "Випадкова зовнішність", - "common.rand_name": "Випадкове ім'я", - - "common.species.orc": "Орк", - "common.species.human": "Людина", - "common.species.dwarf": "Дварф", - "common.species.elf": "Ельф", - "common.species.draugr": "Нежить", - "common.species.danari": "Данарі", - - // Stats - "common.stats.combat_rating": "БР", - "common.stats.power": "Потужність", - "common.stats.speed": "Швидкість", - "common.stats.poise": "Приголомшення", - "common.stats.crit_chance": "Крит. шанс", - "common.stats.crit_mult": "Крит. множник", - "common.stats.crit_power": "Крит. модифікатор", - "common.stats.energy_max": "Макс. енергія", - "common.stats.energy_reward": "Винагороди Енергії", - "common.stats.stealth": "Стелс", - "common.stats.armor": "Броні", - "common.stats.poise_res": "Баланс", // force update - "common.stats.slots": "Слотів", - - // Materials - "common.material.metal": "Метал", - "common.material.wood": "Дерево", - "common.material.stone": "Камінь", - "common.material.cloth": "Тканина", - "common.material.hide": "Шкіра", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/esc_menu.ftl b/assets/voxygen/i18n/uk_UA/esc_menu.ftl new file mode 100644 index 0000000000..886bb55458 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Вийти в меню +esc_menu-quit_game = Вийти з гри \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/esc_menu.ron b/assets/voxygen/i18n/uk_UA/esc_menu.ron deleted file mode 100644 index c2ec0caf24..0000000000 --- a/assets/voxygen/i18n/uk_UA/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "esc_menu.logout": "Вийти в меню", - "esc_menu.quit_game": "Вийти з гри", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/gameinput.ftl b/assets/voxygen/i18n/uk_UA/gameinput.ftl new file mode 100644 index 0000000000..1225ff9d58 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/gameinput.ftl @@ -0,0 +1,63 @@ +gameinput-primary = Базова атака +gameinput-secondary = Додаткова атака +gameinput-block = Блок +gameinput-slot1 = Слот швидкого доступу 1 +gameinput-slot2 = Слот швидкого доступу 2 +gameinput-slot3 = Слот швидкого доступу 3 +gameinput-slot4 = Слот швидкого доступу 4 +gameinput-slot5 = Слот швидкого доступу 5 +gameinput-slot6 = Слот швидкого доступу 6 +gameinput-slot7 = Слот швидкого доступу 7 +gameinput-slot8 = Слот швидкого доступу 8 +gameinput-slot9 = Слот швидкого доступу 9 +gameinput-slot10 = Слот швидкого доступу 10 +gameinput-swaploadout = Змінити спорядження +gameinput-togglecursor = Ввімк/вимк вказівник +gameinput-help = Відображати панель довідки +gameinput-toggleinterface = Відображати інтерфейс +gameinput-toggledebug = Відображати FPS і технічну інформацію +gameinput-screenshot = Сфотографувати екран +gameinput-toggleingameui = Відображати імена +gameinput-fullscreen = Повноекранний режим +gameinput-moveforward = Рух вперед +gameinput-moveleft = Рух ліворуч +gameinput-moveright = Рух праворуч +gameinput-moveback = Рух назад +gameinput-jump = Стрибати +gameinput-glide = Дельтаплан +gameinput-greet = Вітання +gameinput-roll = Перекид +gameinput-climb = Лізти вгору +gameinput-climbdown = Лізти вниз +gameinput-wallleap = Стрибок від стіни +gameinput-togglelantern = Ліхтар +gameinput-mount = Осідлати +gameinput-chat = Чат +gameinput-command = Команда +gameinput-escape = Вихід +gameinput-map = Мапа +gameinput-bag = Інвентар +gameinput-trade = Торгувати +gameinput-social = Інші гравці +gameinput-sit = Сісти +gameinput-spellbook = Чари +gameinput-settings = Налаштування +gameinput-respawn = Відродитись +gameinput-charge = Зарядити +gameinput-togglewield = Дістати зброю +gameinput-interact = Взаємодіяти +gameinput-freelook = Вільний огляд +gameinput-autowalk = Авто Рух/Політ +gameinput-dance = Танцювати +gameinput-select = Обрати +gameinput-acceptgroupinvite = Прийняти запрошення в групу +gameinput-declinegroupinvite = Відхилити запрошення в групу +gameinput-crafting = Ремесло +gameinput-fly = Летіти +gameinput-sneak = Підкрадатись +gameinput-swimdown = Пірнати +gameinput-swimup = Випливати +gameinput-cameraclamp = Закріпити камеру +gameinput-cyclecamera = Крутити камеру +gameinput-mapzoomin = Приблизити мапу +gameinput-mapzoomout = Віддалити мапу \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/gameinput.ron b/assets/voxygen/i18n/uk_UA/gameinput.ron deleted file mode 100644 index a7d4611cf8..0000000000 --- a/assets/voxygen/i18n/uk_UA/gameinput.ron +++ /dev/null @@ -1,74 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "gameinput.primary": "Базова атака", - "gameinput.secondary": "Додаткова атака", // force update - "gameinput.block": "Блок", - "gameinput.slot1": "Слот швидкого доступу 1", - "gameinput.slot2": "Слот швидкого доступу 2", - "gameinput.slot3": "Слот швидкого доступу 3", - "gameinput.slot4": "Слот швидкого доступу 4", - "gameinput.slot5": "Слот швидкого доступу 5", - "gameinput.slot6": "Слот швидкого доступу 6", - "gameinput.slot7": "Слот швидкого доступу 7", - "gameinput.slot8": "Слот швидкого доступу 8", - "gameinput.slot9": "Слот швидкого доступу 9", - "gameinput.slot10": "Слот швидкого доступу 10", - "gameinput.swaploadout": "Змінити спорядження", - "gameinput.togglecursor": "Ввімк/вимк вказівник", - "gameinput.help": "Відображати панель довідки", - "gameinput.toggleinterface": "Відображати інтерфейс", - "gameinput.toggledebug": "Відображати FPS і технічну інформацію", - "gameinput.screenshot": "Сфотографувати екран", - "gameinput.toggleingameui": "Відображати імена", - "gameinput.fullscreen": "Повноекранний режим", - "gameinput.moveforward": "Рух вперед", - "gameinput.moveleft": "Рух ліворуч", - "gameinput.moveright": "Рух праворуч", - "gameinput.moveback": "Рух назад", - "gameinput.jump": "Стрибати", - "gameinput.glide": "Дельтаплан", - "gameinput.greet": "Вітання", - "gameinput.roll": "Перекид", - "gameinput.climb": "Лізти вгору", - "gameinput.climbdown": "Лізти вниз", - "gameinput.wallleap": "Стрибок від стіни", - "gameinput.togglelantern": "Ліхтар", - "gameinput.mount": "Осідлати", - "gameinput.chat": "Чат", - "gameinput.command": "Команда", - "gameinput.escape": "Вихід", - "gameinput.map": "Мапа", - "gameinput.bag": "Інвентар", - "gameinput.trade": "Торгувати", - "gameinput.social": "Інші гравці", - "gameinput.sit": "Сісти", - "gameinput.spellbook": "Чари", - "gameinput.settings": "Налаштування", - "gameinput.respawn": "Відродитись", - "gameinput.charge": "Зарядити", - "gameinput.togglewield": "Дістати зброю", - "gameinput.interact": "Взаємодіяти", - "gameinput.freelook": "Вільний огляд", - "gameinput.autowalk": "Авто Рух/Політ", // force update - "gameinput.dance": "Танцювати", - "gameinput.select": "Обрати", - "gameinput.acceptgroupinvite": "Прийняти запрошення в групу", - "gameinput.declinegroupinvite": "Відхилити запрошення в групу", - "gameinput.crafting": "Ремесло", - "gameinput.fly": "Летіти", - "gameinput.sneak": "Підкрадатись", - "gameinput.swimdown": "Пірнати", - "gameinput.swimup": "Випливати", - "gameinput.cameraclamp": "Закріпити камеру", - "gameinput.cyclecamera": "Крутити камеру", - "gameinput.mapzoomin": "Приблизити мапу", - "gameinput.mapzoomout": "Віддалити мапу", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/ability.ftl b/assets/voxygen/i18n/uk_UA/hud/ability.ftl new file mode 100644 index 0000000000..9962c8dfa2 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/ability.ftl @@ -0,0 +1,16 @@ +common-abilities-debug-possess-name = Заклинаюча Стріла +common-abilities-debug-possess-desc = Стріляє отруйною стрілою. Дає тобі контроль над ціллю. +common-abilities-sword-spin-name = Буревій +common-abilities-sword-spin-desc = Рушай вперед кружляючи з мечем. +common-abilities-axe-leap-name = Стрибок Сокири +common-abilities-axe-leap-desc = Стрибок з рубаним ударом, слідує за курсором. +common-abilities-hammer-leap-name = Погром +common-abilities-hammer-leap-desc = Атака по області. Стрибок спрямований за курсором. +common-abilities-bow-shotgun-name = Стріловик +common-abilities-bow-shotgun-desc = Постріл купою стріл за раз. +common-abilities-staff-fireshockwave-name = Кільце Вогню +common-abilities-staff-fireshockwave-desc = Підпалює землю вогненною ударною хвилєю. +common-abilities-sceptre-wardingaura-name = Захисна Аура +common-abilities-sceptre-wardingaura-desc = Укріплює тебе і твоїх спільників силами природи на деякий час. +common-abilities-unknown-name = Неназвана Здатність +common-abilities-unknown-desc = Здатність без опису \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/ability.ron b/assets/voxygen/i18n/uk_UA/hud/ability.ron deleted file mode 100644 index b0c79bea5e..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/ability.ron +++ /dev/null @@ -1,35 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian language -( - string_map: { - // Debug stick - "common.abilities.debug.possess.name": "Заклинаюча Стріла", - "common.abilities.debug.possess.desc": "Стріляє отруйною стрілою. Дає тобі контроль над ціллю.", - // Sword - "common.abilities.sword.spin.name": "Буревій", - "common.abilities.sword.spin.desc": "Рушай вперед кружляючи з мечем.", - // Axe - "common.abilities.axe.leap.name": "Стрибок Сокири", - "common.abilities.axe.leap.desc": "Стрибок з рубаним ударом, слідує за курсором.", - // Hammer - "common.abilities.hammer.leap.name": "Погром", - "common.abilities.hammer.leap.desc": "Атака по області. Стрибок спрямований за курсором.", - // Bow - "common.abilities.bow.shotgun.name": "Стріловик", - "common.abilities.bow.shotgun.desc": "Постріл купою стріл за раз.", - // Staff - "common.abilities.staff.fireshockwave.name": "Кільце Вогню", - "common.abilities.staff.fireshockwave.desc": "Підпалює землю вогненною ударною хвилєю.", - // Sceptre - "common.abilities.sceptre.wardingaura.name": "Захисна Аура", - "common.abilities.sceptre.wardingaura.desc": "Укріплює тебе і твоїх спільників силами природи на деякий час.", - // Unknown - "common.abilities.unknown.name": "Неназвана Здатність", - "common.abilities.unknown.desc": "Здатність без опису", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/bag.ftl b/assets/voxygen/i18n/uk_UA/hud/bag.ftl new file mode 100644 index 0000000000..8589bb3c39 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Інвентар { $playername } +hud-bag-stats_title = Характеристики { $playername } +hud-bag-exp = Досвід +hud-bag-armor = Спорядження +hud-bag-stats = Характеристики +hud-bag-head = Голова +hud-bag-neck = Шия +hud-bag-tabard = Вбрання +hud-bag-shoulders = Плечі +hud-bag-chest = Груди +hud-bag-hands = Руки +hud-bag-lantern = Ліхтар +hud-bag-glider = Дельтаплан +hud-bag-belt = Пояс +hud-bag-ring = Кільце +hud-bag-back = Спина +hud-bag-legs = Ноги +hud-bag-feet = Ступні +hud-bag-bag = Сумка +hud-bag-mainhand = Основна рука +hud-bag-offhand = Другорядна рука +hud-bag-inactive_mainhand = Основна рука (запас) +hud-bag-inactive_offhand = Другорядна рука (запас) +hud-bag-swap_equipped_weapons_title = Змінити зброю +hud-bag-swap_equipped_weapons_desc = Натисніть { $key } +hud-bag-sort_by_name = Сортувати за Назвою +hud-bag-sort_by_quality = Сортувати за Якістю +hud-bag-sort_by_category = Сортувати за Категорією +hud-bag-health = Здоров'я +hud-bag-energy = Енергія +hud-bag-combat_rating = Бойовий рейтинг +hud-bag-combat_rating_desc = + Розрахований з огляду на ваше + спорядження і здоров'я +hud-bag-protection = Захист +hud-bag-protection_desc = Поглинання ушкоджень через броню +hud-bag-stun_res = Баланс +hud-bag-stun_res_desc = + Супротив до приголомшення + Відновлюється подібно до Енергії \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/bag.ron b/assets/voxygen/i18n/uk_UA/hud/bag.ron deleted file mode 100644 index 1a286d1a60..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/bag.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - // Inventory - "hud.bag.inventory": "Інвентар {playername}", - "hud.bag.stats_title": "Характеристики {playername}", - "hud.bag.exp": "Досвід", - "hud.bag.armor": "Спорядження", - "hud.bag.stats": "Характеристики", - "hud.bag.head": "Голова", - "hud.bag.neck": "Шия", - "hud.bag.tabard": "Вбрання", - "hud.bag.shoulders": "Плечі", - "hud.bag.chest": "Груди", - "hud.bag.hands": "Руки", - "hud.bag.lantern": "Ліхтар", - "hud.bag.glider": "Дельтаплан", - "hud.bag.belt": "Пояс", - "hud.bag.ring": "Кільце", - "hud.bag.back": "Спина", - "hud.bag.legs": "Ноги", - "hud.bag.feet": "Ступні", - "hud.bag.bag": "Сумка", - - // Loadouts - "hud.bag.mainhand": "Основна рука", - "hud.bag.offhand": "Другорядна рука", - "hud.bag.inactive_mainhand": "Основна рука (запас)", - "hud.bag.inactive_offhand": "Другорядна рука (запас)", - "hud.bag.swap_equipped_weapons_title": "Змінити зброю", - "hud.bag.swap_equipped_weapons_desc": "Натисніть {key}", - - // Inventory actions - "hud.bag.sort_by_name": "Сортувати за Назвою", - "hud.bag.sort_by_quality": "Сортувати за Якістю", - "hud.bag.sort_by_category": "Сортувати за Категорією", - - // Stats - "hud.bag.health": "Здоров'я", - "hud.bag.energy": "Енергія", - "hud.bag.combat_rating": "Бойовий рейтинг", - "hud.bag.combat_rating_desc": "Розрахований з огляду на ваше\nспорядження і здоров'я", - "hud.bag.protection": "Захист", - "hud.bag.protection_desc": "Поглинання ушкоджень через броню", - "hud.bag.stun_res": "Баланс", - "hud.bag.stun_res_desc": "Супротив до приголомшення\nВідновлюється подібно до Енергії", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/char_window.ftl b/assets/voxygen/i18n/uk_UA/hud/char_window.ftl new file mode 100644 index 0000000000..3269402e12 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Ім'я персонажа +character_window-character_stats = + Сила + + Рефлекси + + Сила Волі + + Захист \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/char_window.ron b/assets/voxygen/i18n/uk_UA/hud/char_window.ron deleted file mode 100644 index 0fe9948bb4..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "character_window.character_name": "Ім'я персонажа", - // Character stats - "character_window.character_stats": r#"Сила - -Рефлекси - -Сила Волі - -Захист -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/chat.ftl b/assets/voxygen/i18n/uk_UA/hud/chat.ftl new file mode 100644 index 0000000000..f682f47588 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Все +hud-chat-chat_tab_hover_tooltip = Правий клік для налаштування +hud-outcome-bleeding = померли від крововтрати +hud-outcome-burning = згоріли живцем +hud-outcome-curse = померли від прокльону +hud-outcome-crippled = загинули від травм +hud-outcome-frozen = замерзли на смерть +hud-chat-online_msg = [{ $name }] зайшли на сервер +hud-chat-offline_msg = [{ $name }] вийшли з серверу +hud-chat-default_death_msg = [{ $name }] померли +hud-chat-environmental_kill_msg = [{ $name }] померли в { $environment } +hud-chat-fall_kill_msg = [{ $name }] померли від падіння +hud-chat-suicide_msg = [{ $name }] померли від самозаподіяних ран +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } через [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] перемогли [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] застрелили [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] підірвали [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] вбили [{ $victim }] магією +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } через { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } вбили [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } застрелили [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } підірвали [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } вбили [{ $victim }] магією +hud-chat-npc_other_kill_msg = { $attacker } вбили [{ $victim }] +hud-chat-loot_msg = Ви підібрали [{ $item }] +hud-chat-loot_fail = Ваш інвентар переповнено! +hud-chat-goodbye = До побачення! +hud-chat-connection_lost = З'єднання втрачено. Перепідключення через { $time } секунд(и/у). \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/chat.ron b/assets/voxygen/i18n/uk_UA/hud/chat.ron deleted file mode 100644 index fb5a377d58..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/chat.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - // Tabs - "hud.chat.all": "Все", - "hud.chat.chat_tab_hover_tooltip": "Правий клік для налаштування", - // Outcomes - "hud.outcome.bleeding": "померли від крововтрати", - "hud.outcome.burning": "згоріли живцем", - "hud.outcome.curse": "померли від прокльону", - "hud.outcome.crippled": "загинули від травм", - "hud.outcome.frozen": "замерзли на смерть", - // Chat outputs - "hud.chat.online_msg": "[{name}] зайшли на сервер", - "hud.chat.offline_msg": "[{name}] вийшли з серверу", - - "hud.chat.default_death_msg": "[{name}] померли", - "hud.chat.environmental_kill_msg": "[{name}] померли в {environment}", - "hud.chat.fall_kill_msg": "[{name}] померли від падіння", - "hud.chat.suicide_msg": "[{name}] померли від самозаподіяних ран", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} через [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] перемогли [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] застрелили [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] підірвали [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] вбили [{victim}] магією", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} через {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} вбили [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} застрелили [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} підірвали [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} вбили [{victim}] магією", - "hud.chat.npc_other_kill_msg": "{attacker} вбили [{victim}]", - - "hud.chat.loot_msg": "Ви підібрали [{item}]", - "hud.chat.loot_fail": "Ваш інвентар переповнено!", - "hud.chat.goodbye": "До побачення!", - "hud.chat.connection_lost": "З'єднання втрачено. Перепідключення через {time} секунд(и/у).", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/crafting.ftl b/assets/voxygen/i18n/uk_UA/hud/crafting.ftl new file mode 100644 index 0000000000..676ed79d31 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/crafting.ftl @@ -0,0 +1,25 @@ +hud-crafting = Ремесло +hud-crafting-recipes = Рецепти +hud-crafting-ingredients = Інгредієнти: +hud-crafting-craft = Виготовити +hud-crafting-tool_cata = Необхідно: +hud-crafting-req_crafting_station = Необхідне Приладдя: +hud-crafting-anvil = Ковадло +hud-crafting-cauldron = Казан +hud-crafting-cooking_pot = Кастрюля +hud-crafting-crafting_bench = Верстак +hud-crafting-forge = Горнило +hud-crafting-loom = Ткацький Верстат +hud-crafting-spinning_wheel = Самопряд +hud-crafting-tanning_rack = Кобилиця +hud-crafting-tabs-all = Усе +hud-crafting-tabs-armor = Броня +hud-crafting-tabs-dismantle = Переробка +hud-crafting-tabs-processed_material = Матеріали +hud-crafting-tabs-food = Їжа +hud-crafting-tabs-glider = Планери +hud-crafting-tabs-potion = Зілля +hud-crafting-tabs-tool = Інструменти +hud-crafting-tabs-utility = Корисності +hud-crafting-tabs-weapon = Зброя +hud-crafting-tabs-bag = Сумки \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/crafting.ron b/assets/voxygen/i18n/uk_UA/hud/crafting.ron deleted file mode 100644 index 9aa250b835..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/crafting.ron +++ /dev/null @@ -1,40 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "hud.crafting": "Ремесло", - "hud.crafting.recipes": "Рецепти", - "hud.crafting.ingredients": "Інгредієнти:", - "hud.crafting.craft": "Виготовити", - "hud.crafting.tool_cata": "Необхідно:", - - // Crafting Stations - "hud.crafting.req_crafting_station": "Необхідне Приладдя:", - "hud.crafting.anvil": "Ковадло", - "hud.crafting.cauldron": "Казан", - "hud.crafting.cooking_pot": "Кастрюля", - "hud.crafting.crafting_bench": "Верстак", - "hud.crafting.forge": "Горнило", - "hud.crafting.loom": "Ткацький Верстат", - "hud.crafting.spinning_wheel": "Самопряд", - "hud.crafting.tanning_rack": "Кобилиця", - - // Tabs - "hud.crafting.tabs.all": "Усе", - "hud.crafting.tabs.armor": "Броня", - "hud.crafting.tabs.dismantle": "Переробка", - "hud.crafting.tabs.processed_material": "Матеріали", - "hud.crafting.tabs.food": "Їжа", - "hud.crafting.tabs.glider": "Планери", - "hud.crafting.tabs.potion": "Зілля", - "hud.crafting.tabs.tool": "Інструменти", - "hud.crafting.tabs.utility": "Корисності", - "hud.crafting.tabs.weapon": "Зброя", - "hud.crafting.tabs.bag": "Сумки", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/group.ftl b/assets/voxygen/i18n/uk_UA/hud/group.ftl new file mode 100644 index 0000000000..6f8be6a6ab --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Група +hud-group-invite_to_join = [{ $name }] запросили Вас до їхньої групи! +hud-group-invite_to_trade = [{ $name }] хочуть поторгувати з Вами. +hud-group-invite = Запросити +hud-group-kick = Викинути +hud-group-assign_leader = Призначити лідером +hud-group-leave = Покинути групу +hud-group-dead = Мертвий +hud-group-out_of_range = Недосяжний +hud-group-add_friend = Додати друга +hud-group-link_group = Зв'язати групи +hud-group-in_menu = В меню +hud-group-members = Учасники групи \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/group.ron b/assets/voxygen/i18n/uk_UA/hud/group.ron deleted file mode 100644 index 576acdb8e7..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "hud.group": "Група", - "hud.group.invite_to_join": "[{name}] запросили Вас до їхньої групи!", - "hud.group.invite_to_trade": "[{name}] хочуть поторгувати з Вами.", - "hud.group.invite": "Запросити", - "hud.group.kick": "Викинути", - "hud.group.assign_leader": "Призначити лідером", - "hud.group.leave": "Покинути групу", - "hud.group.dead" : "Мертвий", - "hud.group.out_of_range": "Недосяжний", - "hud.group.add_friend": "Додати друга", - "hud.group.link_group": "Зв'язати групи", - "hud.group.in_menu": "В меню", - "hud.group.members": "Учасники групи", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/map.ftl b/assets/voxygen/i18n/uk_UA/hud/map.ftl new file mode 100644 index 0000000000..f9eea29267 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/map.ftl @@ -0,0 +1,37 @@ +hud-map-map_title = Мапа +hud-map-qlog_title = Завдання +hud-map-towns = Міста +hud-map-town = Місто +hud-map-castles = Фортеці +hud-map-castle = Фортеця +hud-map-dungeons = Підземелля +hud-map-dungeon = Підземелля +hud-map-difficulty = Складність +hud-map-difficulty_dungeon = + Складність + + Підземелля: { $difficulty } +hud-map-caves = Печери +hud-map-cave = Печера +hud-map-peaks = Гори +hud-map-tree = Гігантське дерево +hud-map-trees = + Гігантські + дерева +hud-map-drag = Область +hud-map-zoom = Масштаб +hud-map-recenter = Відцентрувати +hud-map-mid_click = Додати вказівник +hud-map-topo_map = + Топографічна + Мапа +hud-map-voxel_map = + Воксельна + Мінімапа +hud-map-marked_location = Вказівник +hud-map-marked_location_remove = Натисніть, щоб видалити +hud-map-change_map_mode = Змінити режим Мапи +hud-map-toggle_minimap_voxel = Переключитися до Воксельної Мінімапи +hud-map-zoom_minimap_explanation = + Масштабуйте мінімапу щоб + побачити область навколо себе \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/map.ron b/assets/voxygen/i18n/uk_UA/hud/map.ron deleted file mode 100644 index b3ddf92ee1..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Мапа", - "hud.map.qlog_title": "Завдання", - "hud.map.towns": "Міста", - "hud.map.town": "Місто", - "hud.map.castles": "Фортеці", - "hud.map.castle": "Фортеця", - "hud.map.dungeons": "Підземелля", // force update - "hud.map.dungeon": "Підземелля", - "hud.map.difficulty": "Складність", - "hud.map.difficulty_dungeon": "Складність\n\nПідземелля: {difficulty}", - "hud.map.caves": "Печери", - "hud.map.cave": "Печера", - "hud.map.peaks": "Гори", // force update - "hud.map.tree": "Гігантське дерево", - "hud.map.trees": "Гігантські\nдерева", - "hud.map.drag": "Область", - "hud.map.zoom": "Масштаб", - "hud.map.recenter": "Відцентрувати", - "hud.map.mid_click": "Додати вказівник", - "hud.map.topo_map": "Топографічна\nМапа", - "hud.map.voxel_map": "Воксельна\nМінімапа", - "hud.map.marked_location": "Вказівник", - "hud.map.marked_location_remove": "Натисніть, щоб видалити", // force update - "hud.map.change_map_mode": "Змінити режим Мапи", - "hud.map.toggle_minimap_voxel": "Переключитися до Воксельної Мінімапи", - "hud.map.zoom_minimap_explanation": "Масштабуйте мінімапу щоб\nпобачити область навколо себе", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/misc.ftl b/assets/voxygen/i18n/uk_UA/hud/misc.ftl new file mode 100644 index 0000000000..83171720cc --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/misc.ftl @@ -0,0 +1,33 @@ +hud-do_not_show_on_startup = Не показувати після запуску +hud-show_tips = Показувати підказки +hud-quests = Завдання +hud-you_died = Ви померли +hud-waypoint_saved = Шляхову Мітку збережено +hud-sp_arrow_txt = ОУ +hud-inventory_full = Повний Інвентар +hud-press_key_to_show_keybindings_fmt = [{ $key }] Елементи керування +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Ліхтар +hud-press_key_to_show_debug_info_fmt = Натисніть { $key } для відображення технічної інформації +hud-press_key_to_toggle_keybindings_fmt = Натисніть { $key } для відображення елементів керування +hud-press_key_to_toggle_debug_info_fmt = Натисніть { $key } для відображення технічної інформації +hud-press_key_to_respawn = Натисніть { $key }, щоб відновитись біля останньої відвіданої ватри. +hud-tutorial_btn = Туторіал +hud-tutorial_click_here = Натисни [ { $key } ] щоб мати змогу тицьнути цю кнопку! +hud-tutorial_elements = Ремесло +hud-temp_quest_headline = Вітання, Мандрівник! +hud-temp_quest_text = + Щоб розпочати свою подорож, можете погуляти по цьому селищу і зібрати собі припасів. + + Не соромтесь, беріть все, що вам знадобиться на Шляху. + + Декілька порад: + Подивиться у нижній правий кут свого екрану, там Ви знайдете різні корисні речі як-то сумка, меню ремесла і мапу. + Дикі звері на околиці селища є чудовим джерелом Шкіряних Смужок з яких можна створити собі якийсь захист щоб вберегти себе від загроз цього великого світу. + Як відчуєте, що готові - спробуйте отримати ще краще спорядження з купи міток на вашій мапі. + + І пам'ятайте що грати з друзями завжди веселіше - знайдіть собі спільників! +hud-spell = Чари +hud-diary = Щоденник +hud-free_look_indicator = Вільний огляд активовано. Натисніть { $key }, щоб вимкнути. +hud-auto_walk_indicator = Авто Рух/Політ активовано +hud-camera_clamp_indicator = Камера вертикально закріплена. Натисніть { $key } щоб відімкнути \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/misc.ron b/assets/voxygen/i18n/uk_UA/hud/misc.ron deleted file mode 100644 index 7c1575cec3..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/misc.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "hud.do_not_show_on_startup": "Не показувати після запуску", - "hud.show_tips": "Показувати підказки", - "hud.quests": "Завдання", - "hud.you_died": "Ви померли", - "hud.waypoint_saved": "Шляхову Мітку збережено", - "hud.sp_arrow_txt": "ОУ", - "hud.inventory_full": "Повний Інвентар", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Елементи керування", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Ліхтар", - "hud.press_key_to_show_debug_info_fmt": "Натисніть {key} для відображення технічної інформації", - "hud.press_key_to_toggle_keybindings_fmt": "Натисніть {key} для відображення елементів керування", - "hud.press_key_to_toggle_debug_info_fmt": "Натисніть {key} для відображення технічної інформації", - - // Respawn message - "hud.press_key_to_respawn": r#"Натисніть {key}, щоб відновитись біля останньої відвіданої ватри."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Туторіал"#, - "hud.tutorial_click_here": r#"Натисни [ {key} ] щоб мати змогу тицьнути цю кнопку!"#, - - "hud.tutorial_elements": r#"Ремесло"#, - // Start quest - "hud.temp_quest_headline": r#"Вітання, Мандрівник!"#, - "hud.temp_quest_text": r#"Щоб розпочати свою подорож, можете погуляти по цьому селищу і зібрати собі припасів. - -Не соромтесь, беріть все, що вам знадобиться на Шляху. - -Декілька порад: -Подивиться у нижній правий кут свого екрану, там Ви знайдете різні корисні речі як-то сумка, меню ремесла і мапу. -Дикі звері на околиці селища є чудовим джерелом Шкіряних Смужок з яких можна створити собі якийсь захист щоб вберегти себе від загроз цього великого світу. -Як відчуєте, що готові - спробуйте отримати ще краще спорядження з купи міток на вашій мапі. - -І пам'ятайте що грати з друзями завжди веселіше - знайдіть собі спільників!"#, - - "hud.spell": "Чари", - // Diary - "hud.diary": "Щоденник", - - "hud.free_look_indicator": "Вільний огляд активовано. Натисніть {key}, щоб вимкнути.", - "hud.auto_walk_indicator": "Авто Рух/Політ активовано", // force update - "hud.camera_clamp_indicator": "Камера вертикально закріплена. Натисніть {key} щоб відімкнути", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/sct.ftl b/assets/voxygen/i18n/uk_UA/hud/sct.ftl new file mode 100644 index 0000000000..b6aac8cd42 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Досвід +hud-sct-block = ЗАБЛОКОВАНО \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/sct.ron b/assets/voxygen/i18n/uk_UA/hud/sct.ron deleted file mode 100644 index 182914b837..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Досвід", - "hud.sct.block": "ЗАБЛОКОВАНО", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/settings.ftl b/assets/voxygen/i18n/uk_UA/hud/settings.ftl new file mode 100644 index 0000000000..a2e49ce012 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/settings.ftl @@ -0,0 +1,132 @@ +hud-settings-general = Основні +hud-settings-none = Нічого +hud-settings-press_behavior-toggle = Перемикання +hud-settings-press_behavior-hold = Утримування +hud-settings-help_window = Вікно довідки +hud-settings-debug_info = Технічна інформація +hud-settings-show_hitboxes = Відображати хітбокси +hud-settings-show_chat = Відображати чат +hud-settings-tips_on_startup = Підказки при запуску +hud-settings-ui_scale = Масштабування інтерфейсу +hud-settings-relative_scaling = Відносне +hud-settings-custom_scaling = Ручне +hud-settings-crosshair = Приціл +hud-settings-opacity = Прозорість +hud-settings-hotbar = Панель швидкого доступу +hud-settings-toggle_shortcuts = Гарячі клавіші +hud-settings-buffs_skillbar = Бафи біля Панелі Швидкого Доступу +hud-settings-buffs_mmap = Бафи біля Мінімапи +hud-settings-toggle_bar_experience = Панель досвіду +hud-settings-scrolling_combat_text = Відображення Пошкоджень/Зцілень +hud-settings-incoming_damage = Роздільно отримані Гравцем +hud-settings-speech_bubble = Діалоги +hud-settings-speech_bubble_dark_mode = Темний режим +hud-settings-speech_bubble_icon = Піктограма +hud-settings-energybar_numbers = Панель здоров'я і енергії +hud-settings-values = Значення +hud-settings-percentages = Відсотки +hud-settings-chat = Чат +hud-settings-background_opacity = Прозорість фону +hud-settings-chat_character_name = Імена персонажів в чаті +hud-settings-loading_tips = Підказки на екрані завантаження +hud-settings-reset_interface = + Значення за + замовчуванням +hud-settings-pan_sensitivity = Чутливість миші +hud-settings-zoom_sensitivity = Чутливість прокрутки +hud-settings-invert_scroll_zoom = Інвертувати прокрутку +hud-settings-invert_mouse_y_axis = Інвертувати вісь Y миші +hud-settings-invert_controller_y_axis = Інвертація контролера по осі Y +hud-settings-enable_mouse_smoothing = + Згладження руху + камери +hud-settings-free_look_behavior = Вмикання вільного перегляду +hud-settings-auto_walk_behavior = Вмикання авто-ходи +hud-settings-auto_camera = Авто камера +hud-settings-camera_clamp_angle = Кут для закріплення камери у режимі закріплення +hud-settings-camera_clamp_behavior = Поведінка закріпленої камери +hud-settings-player_physics_behavior = Ігрова фізика (експереминтальнe) +hud-settings-stop_auto_walk_on_input = + Вимикати авто-ходу + при русі +hud-settings-reset_gameplay = + Значення за + замовчуванням +hud-settings-view_distance = ДВ (дальн. видим.) +hud-settings-sprites_view_distance = ДВ спрайтів +hud-settings-figures_view_distance = ДВ об'єктів +hud-settings-maximum_fps = Максимальний FPS +hud-settings-present_mode = Режим Відображення +hud-settings-present_mode-fifo = Fifo (VSync) +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = Кут огляду (градуси) +hud-settings-gamma = Гамма +hud-settings-exposure = Експозиція +hud-settings-ambiance = Заповнююча яскравість +hud-settings-antialiasing_mode = Режим Анти-Аліасингу +hud-settings-upscale_factor = Внутрішня Роздільна Здатність +hud-settings-cloud_rendering_mode = Режим відображення Хмар +hud-settings-fluid_rendering_mode = Режим відображення Рідин +hud-settings-fluid_rendering_mode-cheap = Дешевий +hud-settings-fluid_rendering_mode-shiny = Блискучий +hud-settings-cloud_rendering_mode-minimal = Мінімальний +hud-settings-cloud_rendering_mode-low = Низький +hud-settings-cloud_rendering_mode-medium = Середній +hud-settings-cloud_rendering_mode-high = Високий +hud-settings-cloud_rendering_mode-ultra = Ультра +hud-settings-fullscreen = На весь екран +hud-settings-fullscreen_mode = Повноекранний режим +hud-settings-fullscreen_mode-exclusive = Ексклюзивний +hud-settings-fullscreen_mode-borderless = Вікно без рамок +hud-settings-gpu_profiler = GPU заміри (можливо не доступні) +hud-settings-particles = Частинки +hud-settings-lossy_terrain_compression = Стискання з втратами даних про місцевість +hud-settings-resolution = Роздільна здатність +hud-settings-bit_depth = Глибина кольору +hud-settings-refresh_rate = Частота оновлення +hud-settings-lighting_rendering_mode = Режим Освітлення +hud-settings-lighting_rendering_mode-ashikhmin = Тип A - Високий +hud-settings-lighting_rendering_mode-blinnphong = Тип B - Середній +hud-settings-lighting_rendering_mode-lambertian = Тип L - Дешевий +hud-settings-shadow_rendering_mode = Режим відображення Тіней +hud-settings-shadow_rendering_mode-none = Без тіней +hud-settings-shadow_rendering_mode-cheap = Дешевий +hud-settings-shadow_rendering_mode-map = Карта тіней +hud-settings-shadow_rendering_mode-map-resolution = Роздільна здатність +hud-settings-lod_detail = Рівень деталізації +hud-settings-save_window_size = Зберегти розмір вікна +hud-settings-reset_graphics = + Значення за + замовчуванням +hud-settings-master_volume = Гучність +hud-settings-inactive_master_volume_perc = Гучність (якщо вікно неактивне) +hud-settings-music_volume = Гучність Музики +hud-settings-sound_effect_volume = Гучність Звукових Eфектів +hud-settings-audio_device = Звуковий пристрій +hud-settings-reset_sound = + Значення за + замовчуванням +hud-settings-awaitingkey = Натисніть клавішу... +hud-settings-unbound = Нічого +hud-settings-reset_keybinds = + Значення за + замовчуванням +hud-settings-english_fallback = Використовувати англійську для неперекладених рядків +hud-settings-chat_tabs = Секціі Чату +hud-settings-label = Ярлик: +hud-settings-delete = Видалити +hud-settings-show_all = Показати все +hud-settings-messages = Повідомлення +hud-settings-activity = Активності +hud-settings-death = Смерті +hud-settings-group = Група +hud-settings-faction = Фракція +hud-settings-world = Світ +hud-settings-region = Регіон +hud-settings-say = Голос +hud-settings-all = Усе +hud-settings-group_only = Тільки група +hud-settings-reset_chat = + Значення за + замовчуванням \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/settings.ron b/assets/voxygen/i18n/uk_UA/hud/settings.ron deleted file mode 100644 index 7eba6b69fe..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/settings.ron +++ /dev/null @@ -1,136 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - // Settings - "hud.settings.general": "Основні", - "hud.settings.none": "Нічого", - "hud.settings.press_behavior.toggle": "Перемикання", - "hud.settings.press_behavior.hold": "Утримування", - "hud.settings.help_window": "Вікно довідки", - "hud.settings.debug_info": "Технічна інформація", - "hud.settings.show_hitboxes": "Відображати хітбокси", - "hud.settings.show_chat": "Відображати чат", - "hud.settings.tips_on_startup": "Підказки при запуску", - "hud.settings.ui_scale": "Масштабування інтерфейсу", - "hud.settings.relative_scaling": "Відносне", - "hud.settings.custom_scaling": "Ручне", - "hud.settings.crosshair": "Приціл", - "hud.settings.opacity": "Прозорість", - "hud.settings.hotbar": "Панель швидкого доступу", - "hud.settings.toggle_shortcuts": "Гарячі клавіші", - "hud.settings.buffs_skillbar": "Бафи біля Панелі Швидкого Доступу", - "hud.settings.buffs_mmap": "Бафи біля Мінімапи", - "hud.settings.toggle_bar_experience": "Панель досвіду", - "hud.settings.scrolling_combat_text": "Відображення Пошкоджень/Зцілень", - "hud.settings.incoming_damage": "Роздільно отримані Гравцем", - "hud.settings.speech_bubble": "Діалоги", - "hud.settings.speech_bubble_dark_mode": "Темний режим", - "hud.settings.speech_bubble_icon": "Піктограма", - "hud.settings.energybar_numbers": "Панель здоров'я і енергії", - "hud.settings.values": "Значення", - "hud.settings.percentages": "Відсотки", - "hud.settings.chat": "Чат", - "hud.settings.background_opacity": "Прозорість фону", - "hud.settings.chat_character_name": "Імена персонажів в чаті", - "hud.settings.loading_tips": "Підказки на екрані завантаження", - "hud.settings.reset_interface": "Значення за\n замовчуванням", - - "hud.settings.pan_sensitivity": "Чутливість миші", - "hud.settings.zoom_sensitivity": "Чутливість прокрутки", - "hud.settings.invert_scroll_zoom": "Інвертувати прокрутку", - "hud.settings.invert_mouse_y_axis": "Інвертувати вісь Y миші", - "hud.settings.invert_controller_y_axis": "Інвертація контролера по осі Y", - "hud.settings.enable_mouse_smoothing": "Згладження руху\nкамери", - "hud.settings.free_look_behavior": "Вмикання вільного перегляду", - "hud.settings.auto_walk_behavior": "Вмикання авто-ходи", - "hud.settings.auto_camera": "Авто камера", - "hud.settings.camera_clamp_angle": "Кут для закріплення камери у режимі закріплення", - "hud.settings.camera_clamp_behavior": "Поведінка закріпленої камери", - "hud.settings.player_physics_behavior": "Ігрова фізика (експереминтальнe)", - "hud.settings.stop_auto_walk_on_input": "Вимикати авто-ходу\nпри русі", - "hud.settings.reset_gameplay": "Значення за\n замовчуванням", - - "hud.settings.view_distance": "ДВ (дальн. видим.)", - "hud.settings.sprites_view_distance": "ДВ спрайтів", - "hud.settings.figures_view_distance": "ДВ об'єктів", - "hud.settings.maximum_fps": "Максимальний FPS", - "hud.settings.present_mode": "Режим Відображення", - "hud.settings.present_mode.fifo": "Fifo (VSync)", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "Кут огляду (градуси)", - "hud.settings.gamma": "Гамма", - "hud.settings.exposure": "Експозиція", - "hud.settings.ambiance": "Заповнююча яскравість", - "hud.settings.antialiasing_mode": "Режим Анти-Аліасингу", - "hud.settings.upscale_factor": "Внутрішня Роздільна Здатність", - "hud.settings.cloud_rendering_mode": "Режим відображення Хмар", - "hud.settings.fluid_rendering_mode": "Режим відображення Рідин", - "hud.settings.fluid_rendering_mode.cheap": "Дешевий", - "hud.settings.fluid_rendering_mode.shiny": "Блискучий", - "hud.settings.cloud_rendering_mode.minimal": "Мінімальний", - "hud.settings.cloud_rendering_mode.low": "Низький", - "hud.settings.cloud_rendering_mode.medium": "Середній", - "hud.settings.cloud_rendering_mode.high": "Високий", - "hud.settings.cloud_rendering_mode.ultra": "Ультра", - "hud.settings.fullscreen": "На весь екран", - "hud.settings.fullscreen_mode": "Повноекранний режим", - "hud.settings.fullscreen_mode.exclusive": "Ексклюзивний", - "hud.settings.fullscreen_mode.borderless": "Вікно без рамок", - "hud.settings.gpu_profiler": "GPU заміри (можливо не доступні)", - "hud.settings.particles": "Частинки", - "hud.settings.lossy_terrain_compression": "Стискання з втратами даних про місцевість", - "hud.settings.resolution": "Роздільна здатність", - "hud.settings.bit_depth": "Глибина кольору", - "hud.settings.refresh_rate": "Частота оновлення", // force update - "hud.settings.lighting_rendering_mode": "Режим Освітлення", - "hud.settings.lighting_rendering_mode.ashikhmin": "Тип A - Високий", - "hud.settings.lighting_rendering_mode.blinnphong": "Тип B - Середній", - "hud.settings.lighting_rendering_mode.lambertian": "Тип L - Дешевий", - "hud.settings.shadow_rendering_mode": "Режим відображення Тіней", - "hud.settings.shadow_rendering_mode.none": "Без тіней", - "hud.settings.shadow_rendering_mode.cheap": "Дешевий", - "hud.settings.shadow_rendering_mode.map": "Карта тіней", - "hud.settings.shadow_rendering_mode.map.resolution": "Роздільна здатність", - "hud.settings.lod_detail": "Рівень деталізації", - "hud.settings.save_window_size": "Зберегти розмір вікна", - "hud.settings.reset_graphics": "Значення за\n замовчуванням", - - "hud.settings.master_volume": "Гучність", - "hud.settings.inactive_master_volume_perc": "Гучність (якщо вікно неактивне)", - "hud.settings.music_volume": "Гучність Музики", - "hud.settings.sound_effect_volume": "Гучність Звукових Eфектів", - "hud.settings.audio_device": "Звуковий пристрій", - "hud.settings.reset_sound": "Значення за\n замовчуванням", - - "hud.settings.awaitingkey": "Натисніть клавішу...", - "hud.settings.unbound": "Нічого", - "hud.settings.reset_keybinds": "Значення за\n замовчуванням", - - // Language settings - "hud.settings.english_fallback": "Використовувати англійську для неперекладених рядків", - // Chat settings - "hud.settings.chat_tabs": "Секціі Чату", - "hud.settings.label": "Ярлик:", - "hud.settings.delete": "Видалити", - "hud.settings.show_all": "Показати все", - "hud.settings.messages": "Повідомлення", - "hud.settings.activity": "Активності", - "hud.settings.death": "Смерті", - "hud.settings.group": "Група", - "hud.settings.faction": "Фракція", - "hud.settings.world": "Світ", - "hud.settings.region": "Регіон", - "hud.settings.say": "Голос", - "hud.settings.none": "Нічого", - "hud.settings.all": "Усе", - "hud.settings.group_only": "Тільки група", - "hud.settings.reset_chat" : "Значення за\n замовчуванням", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/skills.ftl b/assets/voxygen/i18n/uk_UA/hud/skills.ftl new file mode 100644 index 0000000000..150fcc7006 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Нова Одиниця Уміння +hud-skill-sp_available = Доступно { $number } ОУ +hud-skill-not_unlocked = Ще не відкрито +hud-skill-req_sp ={"\u000A"} + + Необхідно { $number } ОУ +hud-skill-inc_health_title = Збільшення здоров'я +hud-skill-inc_health = Збільшує максимальне здоров'я на { $boost }{ $SP } +hud-skill-inc_energy_title = Збільшення енергії +hud-skill-inc_energy = Збільшує максимальну енергію на { $boost }{ $SP } +hud-skill-unlck_sword_title = Меч +hud-skill-unlck_sword = Відкриває дерево навичок володіння мечем{ $SP } +hud-skill-unlck_axe_title = Сокира +hud-skill-unlck_axe = Відкриває дерево навичок володіння сокирою{ $SP } +hud-skill-unlck_hammer_title = Молот +hud-skill-unlck_hammer = Відкриває дерево навичок володіння молотом{ $SP } +hud-skill-unlck_bow_title = Лук +hud-skill-unlck_bow = Відкриває дерево навичок володіння луком{ $SP } +hud-skill-unlck_staff_title = Посох +hud-skill-unlck_staff = Відкриває дерево навичок володіння посохом{ $SP } +hud-skill-unlck_sceptre_title = Цілющий скіпетр +hud-skill-unlck_sceptre = Відкриває дерево навичок володіння цілющим скіпетром{ $SP } +hud-skill-dodge_title = Ухил +hud-skill-dodge = Станьте невразливим до ближніх атак під час перекиду +hud-skill-roll_energy_title = Енергоспоживання перекиду +hud-skill-roll_energy = Перекид споживає на { $boost }% менше енергії{ $SP } +hud-skill-roll_speed_title = Швидкість перекиду +hud-skill-roll_speed = Перекид виконується на { $boost }% швидше{ $SP } +hud-skill-roll_dur_title = Тривалість перекиду +hud-skill-roll_dur = Дозволяє котитись на { $boost }% довше{ $SP } +hud-skill-climbing_title = Лазiння +hud-skill-climbing = Стрибай вище +hud-skill-climbing_cost_title = Витрати на лазiння +hud-skill-climbing_cost = Лазіння витрачає на { $boost }% енергії менше{ $SP } +hud-skill-climbing_speed_title = Швидкість лазіння +hud-skill-climbing_speed = Лізь на { $boost }% швидше{ $SP } +hud-skill-swim_title = Плавання +hud-skill-swim = Пересування у вологому середовищі +hud-skill-swim_speed_title = Швидкість плавання +hud-skill-swim_speed = Пливи на { $boost }% швидше{ $SP } +hud-skill-sc_lifesteal_title = Промінь життєкрада +hud-skill-sc_lifesteal = Випивай життя зі своїх ворогів +hud-skill-sc_lifesteal_damage_title = Шкода +hud-skill-sc_lifesteal_damage = Завдає на { $boost }% більше ушкоджень{ $SP } +hud-skill-sc_lifesteal_range_title = Дальність +hud-skill-sc_lifesteal_range = Твій промінь сягає на { $boost }% довше{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Крадіжка життя +hud-skill-sc_lifesteal_lifesteal = Конвертує додаткових { $boost }% з ушкоджень у здоров'я{ $SP } +hud-skill-sc_lifesteal_regen_title = Регенерація енергії +hud-skill-sc_lifesteal_regen = Поповнює енергію з додатковими { $boost }%{ $SP } +hud-skill-sc_heal_title = Аура цілителя +hud-skill-sc_heal = Зцілює вас і ваших союзників. (Потужність залежить від числа комбо) +hud-skill-sc_heal_heal_title = Зцілення +hud-skill-sc_heal_heal = Збільшує потужність зцілення на { $boost }%{ $SP } +hud-skill-sc_heal_cost_title = Витрати енергії +hud-skill-sc_heal_cost = Створення аури вимагає на { $boost }% менше енергії{ $SP } +hud-skill-sc_heal_duration_title = Довготривалість +hud-skill-sc_heal_duration = Регенерація працює на { $boost }% довше{ $SP } +hud-skill-sc_heal_range_title = Дальність +hud-skill-sc_heal_range = Еффект аури має більший на { $boost }% радіус{ $SP } +hud-skill-sc_wardaura_unlock_title = Розблоковує Захисну Ауру +hud-skill-sc_wardaura_unlock = Дозволяє захищати своїх спільників від атак ворогів{ $SP } +hud-skill-sc_wardaura_strength_title = Сила +hud-skill-sc_wardaura_strength = Ефект вашого захисту росте на { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Довготривалість +hud-skill-sc_wardaura_duration = Ваша аура тримається на { $boost }% довше{ $SP } +hud-skill-sc_wardaura_range_title = Радіус +hud-skill-sc_wardaura_range = Захисна аура сягає на { $boost }% далі{ $SP } +hud-skill-sc_wardaura_cost_title = Витрати енергії +hud-skill-sc_wardaura_cost = Створення аури вимагає на { $boost }% менше енергії{ $SP } +hud-skill-st_shockwave_range_title = Радіус ударної хвилі +hud-skill-st_shockwave_range = Збільшує радіус дії ударної хвилі на { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Енергоспоживання ударної хвилі +hud-skill-st_shockwave_cost = Ударна хвиля споживає на { $boost }% менше енергії{ $SP } +hud-skill-st_shockwave_knockback_title = Дальність відкидання ударною хвилею +hud-skill-st_shockwave_knockback = Збільшує дальність відкидання ударною хвилею на { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Ушкодження ударною хвилею +hud-skill-st_shockwave_damage = Збільшує ушкодження ударною хвилею на { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Ударна хвиля +hud-skill-st_shockwave_unlock = Відкриває можливість відкидати ворогів вогняною ударною хвилею{ $SP } +hud-skill-st_flame_velocity_title = Швидкість полум'я +hud-skill-st_flame_velocity = Вогонь досягає цілі швидше, на { $boost }% швидше{ $SP } +hud-skill-st_flamethrower = Розбуди свого внутрішнього Дракона +hud-skill-st_flamethrower_title = Вогнемет +hud-skill-st_flamethrower_damage_title = Ушкодження вогнеметом +hud-skill-st_flamethrower_damage = Збільшує ушкодження вогнеметом на { $boost }%{ $SP } +hud-skill-st_flamethrower_range_title = Дальність дії вогнемету +hud-skill-st_flamethrower_range = Збільшує дальність дії вогнемету { $boost }%{ $SP } +hud-skill-st_energy_drain_title = Енергоспоживання вогнемету +hud-skill-st_energy_drain = Зменшує швидкість споживання енергії вогнеметом на { $boost }%{ $SP } +hud-skill-st_fireball = Запускає вогняні кулі, що вибухають вражаючи ціль +hud-skill-st_fireball_title = Вогнений м'яч +hud-skill-st_explosion_radius_title = Радіус вибуху +hud-skill-st_explosion_radius = Більше - краще, збільшує радіус вибуху снарядів на { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Відновлення енергії +hud-skill-st_energy_regen = Збільшує відновлення енергії від заподіяних ушкоджень на { $boost }%{ $SP } +hud-skill-st_damage_title = Ушкодження снарядами +hud-skill-st_damage = Збільшує ушкодження вогняними снарядами на { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Швидкість стріл +hud-skill-bow_projectile_speed = Стріли летять на { $boost }% швидше і далі{ $SP } +hud-skill-bow_charged_title = Заряджений постріл +hud-skill-bow_charged = Терпіння винагороджується +hud-skill-bow_charged_damage_title = Ушкодження +hud-skill-bow_charged_damage = Збільшує ушкодження на { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Відновлення енергії +hud-skill-bow_charged_energy_regen = Збільшує відновлення енергії на { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Відкидання потужним пострілом +hud-skill-bow_charged_knockback = Потужний постріл відкидає ворогів на { $boost }% далі{ $SP } +hud-skill-bow_charged_speed_title = Швидкість зарядження потужного пострілу +hud-skill-bow_charged_speed = Збільшує швидкість зарядження потужного пострілу на { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Швидкість руху +hud-skill-bow_charged_move = Збільшує швидкість руху під час зарядження потужного пострілу на { $boost }%{ $SP } +hud-skill-bow_repeater_title = Стріломет +hud-skill-bow_repeater = Випускає стрілу за стрілою набираючи швидкість +hud-skill-bow_repeater_damage_title = Ушкодження +hud-skill-bow_repeater_damage = Збільшує ушкодження на { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Енергозатрата +hud-skill-bow_repeater_cost = Запуск черги стріл споживає на { $boost }% менше енергії{ $SP } +hud-skill-bow_repeater_speed_title = Швидкість +hud-skill-bow_repeater_speed = Збільшує темп стріломету на { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Стріловик +hud-skill-bow_shotgun_unlock = Розблоковує можливість запуску декількох стріл одночасно{ $SP } +hud-skill-bow_shotgun_damage_title = Ушкодження +hud-skill-bow_shotgun_damage = Збільшує ушкодження на { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Енергоспоживання +hud-skill-bow_shotgun_cost = Постріл споживає на { $boost }% менше енергії{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Кількість стріл +hud-skill-bow_shotgun_arrow_count = Збільшує кількість стріл на { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Кучність стріл +hud-skill-bow_shotgun_spread = Зменшує розліт стріл на { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Радіус ударної хвилі від атаки в стрибку +hud-skill-hmr_leap_radius = Збільшує радіус ударної хвилі від атаки в стрибку на { $boost } метр{ $SP } +hud-skill-hmr_leap_distance_title = Дальність стрибка +hud-skill-hmr_leap_distance = Збільшує дальність стрибка на { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Енергоспоживання атаки в стрибку +hud-skill-hmr_leap_cost = Атака в стрибку споживає на { $boost }% менше енергії{ $SP } +hud-skill-hmr_leap_knockback_title = Відкидання атакою в стрибку +hud-skill-hmr_leap_knockback = Збільшує відстань відкидання від атаки в стрибку на { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Ушкодження атакою в стрибку +hud-skill-hmr_leap_damage = Збільшує ушкодження від атаки в стрибку на { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Атака в стрибку +hud-skill-hmr_unlock_leap = Відкриває атаку в стрибку{ $SP } +hud-skill-hmr_charged_melee_title = Заряджена холодна зброя +hud-skill-hmr_charged_melee = На холоді розряджається скоріше +hud-skill-hmr_charged_rate_title = Швидкість потужного удару +hud-skill-hmr_charged_rate = Збільшує швидкість зарядження потужного удару на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Енергоспоживання потужного удару +hud-skill-hmr_charged_melee_nrg_drain = Зарядження потужного удару споживає на { $boost }% менше енергії{ $SP } +hud-skill-hmr_charged_melee_damage_title = Ушкодження потужним ударом +hud-skill-hmr_charged_melee_damage = Збільшує ушкодження потужним ударом на { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Відкидання потужним ударом +hud-skill-hmr_charged_melee_knockback = Збільшує відстань відкидання ворогів потужним ударом на { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Одиночний Удар +hud-skill-hmr_single_strike = Одинокий як ти +hud-skill-hmr_single_strike_regen_title = Комбо приріст відновлення енергії +hud-skill-hmr_single_strike_regen = Збільшує приріст відновлення енергії від ударів підряд{ $SP } +hud-skill-hmr_single_strike_speed_title = Комбо приріст швидкості +hud-skill-hmr_single_strike_speed = Збільшує приріст швидкості від ударів підряд{ $SP } +hud-skill-hmr_single_strike_damage_title = Комбо приріст ушкодження +hud-skill-hmr_single_strike_damage = Збільшує приріст ушкодження від ударів підряд{ $SP } +hud-skill-hmr_single_strike_knockback_title = Відкидання +hud-skill-hmr_single_strike_knockback = Збільшує відстань відкидання ворогів на { $boost }%{ $SP } +hud-skill-sw_trip_str = Бог любить трійцю +hud-skill-sw_trip_str_title = Потрійний Удар +hud-skill-sw_trip_str_combo_title = Комбо трьох ударів +hud-skill-sw_trip_str_combo = Відкриває приріст харакатеристик від ударів підряд{ $SP } +hud-skill-sw_trip_str_dmg_title = Комбо приріст ушкодження +hud-skill-sw_trip_str_dmg = Збільшує приріст ушкодження від ударів підряд{ $SP } +hud-skill-sw_trip_str_sp_title = Комбо приріст швидкості +hud-skill-sw_trip_str_sp = Збільшує приріст швидкості від ударів підряд{ $SP } +hud-skill-sw_trip_str_reg_title = Комбо приріст відновлення енергії +hud-skill-sw_trip_str_reg = Збільшує приріст відновлення енергії від ударів підряд{ $SP } +hud-skill-sw_dash = Пронесись блискавкою поміж своїх ворогів +hud-skill-sw_dash_title = Ривок +hud-skill-sw_dash_dmg_title = Ушкодження випадом +hud-skill-sw_dash_dmg = Збільшує початкове ушкодження випадом на { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Енергоспоживання випаду +hud-skill-sw_dash_drain = Зменшує швидкість споживання енергії в випаді на { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Енергозатрати на випад +hud-skill-sw_dash_cost = Зменшує початкову енергетичну ціну випаду на { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Швидкість випаду +hud-skill-sw_dash_speed = Збільшує швидкість руху під час випаду { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Ривок Наскрізь +hud-skill-sw_dash_charge_through = Дозволяє прорватись наскрізь першого ворога{ $SP } +hud-skill-sw_dash_scale_title = Приріст ушкодження випадом +hud-skill-sw_dash_scale = Збільшує приріст ушкодження випадом на { $boost }%{ $SP } +hud-skill-sw_spin_title = Кружляння +hud-skill-sw_spin = Відкриває можливість кружляння з мечем{ $SP } +hud-skill-sw_spin_dmg_title = Ушкодження кружлянням +hud-skill-sw_spin_dmg = Збільшує ужкодження під час кружляння на { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Швидкість кружляння +hud-skill-sw_spin_spd = Збільшує швидкість кружляння на { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Енергоспоживання кружляння +hud-skill-sw_spin_cost = Зменшує споживання енергії кожного оберту на { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Кількість обертів +hud-skill-sw_spin_spins = Збільшує максимальну кількість обертів{ $SP } +hud-skill-sw_interrupt_title = Переривання атаки +hud-skill-sw_interrupt = Дозволяє миттєво перервати ворожу атаку власною{ $SP } +hud-skill-axe_double_strike_title = Подвійний удар +hud-skill-axe_double_strike = Порубай цих злодюг +hud-skill-axe_double_strike_combo_title = Комбо двох ударів +hud-skill-axe_double_strike_combo = Відкриває другий послідовний удар{ $SP } +hud-skill-axe_double_strike_damage_title = Комбо приріст ушкодження +hud-skill-axe_double_strike_damage = Збільшує приріст ушкодження від ударів підряд{ $SP } +hud-skill-axe_double_strike_speed_title = Комбо приріст швидкості +hud-skill-axe_double_strike_speed = Збільшує приріст швидкості від ударів підряд{ $SP } +hud-skill-axe_double_strike_regen_title = Комбо приріст відновлення енергії +hud-skill-axe_double_strike_regen = Збільшує приріст відновлення енергії від ударів підряд{ $SP } +hud-skill-axe_spin_title = Кружляння з топором +hud-skill-axe_spin = Марами, сивими хмарами дико крутили ... +hud-skill-axe_infinite_axe_spin_title = Незкінченне кружляння +hud-skill-axe_infinite_axe_spin = Дозволяє кружляти доки не закінчиться енергія{ $SP } +hud-skill-axe_spin_damage_title = Ушкодження кружлянням +hud-skill-axe_spin_damage = Збільшує ушкодження під час кружляння на { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Гелікоптер +hud-skill-axe_spin_helicopter = Сповільнює падіння під час кружляння{ $SP } +hud-skill-axe_spin_speed_title = Швидкість кружляння +hud-skill-axe_spin_speed = Збільшує швидкість кружляння на { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Енергоспоживання кружляння +hud-skill-axe_spin_cost = Зменшує споживання енергії в кружлянні на { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Атака в стрибку +hud-skill-axe_unlock_leap = Відкриває атаку в стрибку{ $SP } +hud-skill-axe_leap_damage_title = Ушкодження атакою в стрибку +hud-skill-axe_leap_damage = Збільшує ушкодження від атаки в стрибку на { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Відкидання атакою в стрибку +hud-skill-axe_leap_knockback = Збільшує відстань відкидання від атаки в стрибку на { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Енергоспоживання атаки в стрибку +hud-skill-axe_leap_cost = Зменшує споживання енергії атакою в стрибку на { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Дальність стрибка +hud-skill-axe_leap_distance = Збільшує дальність стрибка на { $boost }%{ $SP } +hud-skill-mining_title = Гірнича справа +hud-skill-pick_strike_title = Удар Киркою +hud-skill-pick_strike = Шукайте руди та коштовні камені щоб здобути матеріали +hud-skill-pick_strike_speed_title = Швидший Удар +hud-skill-pick_strike_speed = Добувайте матеріали швидше{ $SP } +hud-skill-pick_strike_oregain_title = Щасливий удар (Руди) +hud-skill-pick_strike_oregain = Шанс здобути додаткову руду (+{ $boost }% за рівень){ $SP } +hud-skill-pick_strike_gemgain_title = Щасливий удар (Камені) +hud-skill-pick_strike_gemgain = Шанс здобути додатковий камінь (+{ $boost }% за рівень){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/skills.ron b/assets/voxygen/i18n/uk_UA/hud/skills.ron deleted file mode 100644 index 8eb6ac97a2..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/skills.ron +++ /dev/null @@ -1,311 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "hud.rank_up": "Нова Одиниця Уміння", - "hud.skill.sp_available": "Доступно {number} ОУ", - "hud.skill.not_unlocked": "Ще не відкрито", - "hud.skill.req_sp": "\n\nНеобхідно {number} ОУ", - // Skills - // General - "hud.skill.inc_health_title": "Збільшення здоров'я", - "hud.skill.inc_health": "Збільшує максимальне здоров'я на {boost}{SP}", - "hud.skill.inc_energy_title": "Збільшення енергії", - "hud.skill.inc_energy": "Збільшує максимальну енергію на {boost}{SP}", - "hud.skill.unlck_sword_title": "Меч", - "hud.skill.unlck_sword": "Відкриває дерево навичок володіння мечем{SP}", - "hud.skill.unlck_axe_title": "Сокира", - "hud.skill.unlck_axe": "Відкриває дерево навичок володіння сокирою{SP}", - "hud.skill.unlck_hammer_title": "Молот", - "hud.skill.unlck_hammer": "Відкриває дерево навичок володіння молотом{SP}", - "hud.skill.unlck_bow_title": "Лук", - "hud.skill.unlck_bow": "Відкриває дерево навичок володіння луком{SP}", - "hud.skill.unlck_staff_title": "Посох", - "hud.skill.unlck_staff": "Відкриває дерево навичок володіння посохом{SP}", - "hud.skill.unlck_sceptre_title": "Цілющий скіпетр", - "hud.skill.unlck_sceptre": "Відкриває дерево навичок володіння цілющим скіпетром{SP}", - "hud.skill.dodge_title": "Ухил", - "hud.skill.dodge": "Станьте невразливим до ближніх атак під час перекиду", - "hud.skill.roll_energy_title": "Енергоспоживання перекиду", - "hud.skill.roll_energy": "Перекид споживає на {boost}% менше енергії{SP}", - "hud.skill.roll_speed_title": "Швидкість перекиду", - "hud.skill.roll_speed": "Перекид виконується на {boost}% швидше{SP}", - "hud.skill.roll_dur_title": "Тривалість перекиду", - "hud.skill.roll_dur": "Дозволяє котитись на {boost}% довше{SP}", - "hud.skill.climbing_title": "Лазiння", - "hud.skill.climbing": "Стрибай вище", - "hud.skill.climbing_cost_title": "Витрати на лазiння", - "hud.skill.climbing_cost": "Лазіння витрачає на {boost}% енергії менше{SP}", - "hud.skill.climbing_speed_title": "Швидкість лазіння", - "hud.skill.climbing_speed": "Лізь на {boost}% швидше{SP}", - "hud.skill.swim_title": "Плавання", - "hud.skill.swim": "Пересування у вологому середовищі", - "hud.skill.swim_speed_title": "Швидкість плавання", - "hud.skill.swim_speed": "Пливи на {boost}% швидше{SP}", - // Sceptre - // Lifesteal - "hud.skill.sc_lifesteal_title": "Промінь життєкрада", - "hud.skill.sc_lifesteal": "Випивай життя зі своїх ворогів", - - "hud.skill.sc_lifesteal_damage_title": "Шкода", - "hud.skill.sc_lifesteal_damage": "Завдає на {boost}% більше ушкоджень{SP}", - - "hud.skill.sc_lifesteal_range_title": "Дальність", - "hud.skill.sc_lifesteal_range": "Твій промінь сягає на {boost}% довше{SP}", - - "hud.skill.sc_lifesteal_lifesteal_title": "Крадіжка життя", - "hud.skill.sc_lifesteal_lifesteal": "Конвертує додаткових {boost}% з ушкоджень у здоров'я{SP}", - - "hud.skill.sc_lifesteal_regen_title": "Регенерація енергії", - "hud.skill.sc_lifesteal_regen": "Поповнює енергію з додатковими {boost}%{SP}", - - // Healing - "hud.skill.sc_heal_title": "Аура цілителя", - "hud.skill.sc_heal": "Зцілює вас і ваших союзників. (Потужність залежить від числа комбо)", - - "hud.skill.sc_heal_heal_title": "Зцілення", // force update - "hud.skill.sc_heal_heal": "Збільшує потужність зцілення на {boost}%{SP}", // force update - - "hud.skill.sc_heal_cost_title": "Витрати енергії", - "hud.skill.sc_heal_cost": "Створення аури вимагає на {boost}% менше енергії{SP}", - - "hud.skill.sc_heal_duration_title": "Довготривалість", - "hud.skill.sc_heal_duration": "Регенерація працює на {boost}% довше{SP}", - - "hud.skill.sc_heal_range_title": "Дальність", // force update - "hud.skill.sc_heal_range": "Еффект аури має більший на {boost}% радіус{SP}", - - // Ward aura - "hud.skill.sc_wardaura_unlock_title": "Розблоковує Захисну Ауру", - "hud.skill.sc_wardaura_unlock": "Дозволяє захищати своїх спільників від атак ворогів{SP}", - - "hud.skill.sc_wardaura_strength_title": "Сила", - "hud.skill.sc_wardaura_strength": "Ефект вашого захисту росте на {boost}%{SP}", - - "hud.skill.sc_wardaura_duration_title": "Довготривалість", - "hud.skill.sc_wardaura_duration": "Ваша аура тримається на {boost}% довше{SP}", - - "hud.skill.sc_wardaura_range_title": "Радіус", - "hud.skill.sc_wardaura_range": "Захисна аура сягає на {boost}% далі{SP}", - - "hud.skill.sc_wardaura_cost_title": "Витрати енергії", - "hud.skill.sc_wardaura_cost": "Створення аури вимагає на {boost}% менше енергії{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Радіус ударної хвилі", - "hud.skill.st_shockwave_range" : "Збільшує радіус дії ударної хвилі на {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Енергоспоживання ударної хвилі", - "hud.skill.st_shockwave_cost" : "Ударна хвиля споживає на {boost}% менше енергії{SP}", - "hud.skill.st_shockwave_knockback_title" : "Дальність відкидання ударною хвилею", - "hud.skill.st_shockwave_knockback" : "Збільшує дальність відкидання ударною хвилею на {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Ушкодження ударною хвилею", - "hud.skill.st_shockwave_damage" : "Збільшує ушкодження ударною хвилею на {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Ударна хвиля", - "hud.skill.st_shockwave_unlock" : "Відкриває можливість відкидати ворогів вогняною ударною хвилею{SP}", - "hud.skill.st_flame_velocity_title" : "Швидкість полум'я", - "hud.skill.st_flame_velocity" : "Вогонь досягає цілі швидше, на {boost}% швидше{SP}", - "hud.skill.st_flamethrower": "Розбуди свого внутрішнього Дракона", - "hud.skill.st_flamethrower_title": "Вогнемет", - "hud.skill.st_flamethrower_damage_title" : "Ушкодження вогнеметом", - "hud.skill.st_flamethrower_damage" : "Збільшує ушкодження вогнеметом на {boost}%{SP}", - "hud.skill.st_flamethrower_range_title" : "Дальність дії вогнемету", - "hud.skill.st_flamethrower_range" : "Збільшує дальність дії вогнемету {boost}%{SP}", - "hud.skill.st_energy_drain_title" : "Енергоспоживання вогнемету", - "hud.skill.st_energy_drain" : "Зменшує швидкість споживання енергії вогнеметом на {boost}%{SP}", - "hud.skill.st_fireball": "Запускає вогняні кулі, що вибухають вражаючи ціль", - "hud.skill.st_fireball_title": "Вогнений м'яч", - "hud.skill.st_explosion_radius_title" : "Радіус вибуху", - "hud.skill.st_explosion_radius" : "Більше - краще, збільшує радіус вибуху снарядів на {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Відновлення енергії", - "hud.skill.st_energy_regen" : "Збільшує відновлення енергії від заподіяних ушкоджень на {boost}%{SP}", - "hud.skill.st_damage_title" : "Ушкодження снарядами", - "hud.skill.st_damage" : "Збільшує ушкодження вогняними снарядами на {boost}%{SP}", - // Bow - // Passive - "hud.skill.bow_projectile_speed_title" : "Швидкість стріл", - "hud.skill.bow_projectile_speed" : "Стріли летять на {boost}% швидше і далі{SP}", - - // Charged Shoot - "hud.skill.bow_charged_title" : "Заряджений постріл", - "hud.skill.bow_charged" : "Терпіння винагороджується", - - "hud.skill.bow_charged_damage_title" : "Ушкодження", - "hud.skill.bow_charged_damage" : "Збільшує ушкодження на {boost}%{SP}", - - "hud.skill.bow_charged_energy_regen_title" : "Відновлення енергії", - "hud.skill.bow_charged_energy_regen" : "Збільшує відновлення енергії на {boost}%{SP}", - - "hud.skill.bow_charged_knockback_title" : "Відкидання потужним пострілом", - "hud.skill.bow_charged_knockback" : "Потужний постріл відкидає ворогів на {boost}% далі{SP}", - - "hud.skill.bow_charged_speed_title" : "Швидкість зарядження потужного пострілу", - "hud.skill.bow_charged_speed" : "Збільшує швидкість зарядження потужного пострілу на {boost}%{SP}", - - "hud.skill.bow_charged_move_title" : "Швидкість руху", - "hud.skill.bow_charged_move" : "Збільшує швидкість руху під час зарядження потужного пострілу на {boost}%{SP}", - - // Repeater - "hud.skill.bow_repeater_title" : "Стріломет", - "hud.skill.bow_repeater" : "Випускає стрілу за стрілою набираючи швидкість", - - "hud.skill.bow_repeater_damage_title" : "Ушкодження", - "hud.skill.bow_repeater_damage" : "Збільшує ушкодження на {boost}%{SP}", - - "hud.skill.bow_repeater_cost_title" : "Енергозатрата", - "hud.skill.bow_repeater_cost" : "Запуск черги стріл споживає на {boost}% менше енергії{SP}", - - "hud.skill.bow_repeater_speed_title" : "Швидкість", - "hud.skill.bow_repeater_speed" : "Збільшує темп стріломету на {boost}%{SP}", - // Shotgun - "hud.skill.bow_shotgun_unlock_title" : "Стріловик", - "hud.skill.bow_shotgun_unlock" : "Розблоковує можливість запуску декількох стріл одночасно{SP}", - - "hud.skill.bow_shotgun_damage_title" : "Ушкодження", - "hud.skill.bow_shotgun_damage" : "Збільшує ушкодження на {boost}%{SP}", - - "hud.skill.bow_shotgun_cost_title" : "Енергоспоживання", - "hud.skill.bow_shotgun_cost" : "Постріл споживає на {boost}% менше енергії{SP}", - - "hud.skill.bow_shotgun_arrow_count_title" : "Кількість стріл", - "hud.skill.bow_shotgun_arrow_count" : "Збільшує кількість стріл на {boost}{SP}", - - "hud.skill.bow_shotgun_spread_title" : "Кучність стріл", - "hud.skill.bow_shotgun_spread" : "Зменшує розліт стріл на {boost}%{SP}", - - // Hammer - "hud.skill.hmr_leap_radius_title" : "Радіус ударної хвилі від атаки в стрибку", - "hud.skill.hmr_leap_radius" : "Збільшує радіус ударної хвилі від атаки в стрибку на {boost} метр{SP}", - "hud.skill.hmr_leap_distance_title" : "Дальність стрибка", - "hud.skill.hmr_leap_distance" : "Збільшує дальність стрибка на {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Енергоспоживання атаки в стрибку", - "hud.skill.hmr_leap_cost" : "Атака в стрибку споживає на {boost}% менше енергії{SP}", - "hud.skill.hmr_leap_knockback_title" : "Відкидання атакою в стрибку", - "hud.skill.hmr_leap_knockback" : "Збільшує відстань відкидання від атаки в стрибку на {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Ушкодження атакою в стрибку", - "hud.skill.hmr_leap_damage" : "Збільшує ушкодження від атаки в стрибку на {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Атака в стрибку", - "hud.skill.hmr_unlock_leap" : "Відкриває атаку в стрибку{SP}", - "hud.skill.hmr_charged_melee_title" : "Заряджена холодна зброя", - "hud.skill.hmr_charged_melee" : "На холоді розряджається скоріше", - "hud.skill.hmr_charged_rate_title" : "Швидкість потужного удару", - "hud.skill.hmr_charged_rate" : "Збільшує швидкість зарядження потужного удару на {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Енергоспоживання потужного удару", - "hud.skill.hmr_charged_melee_nrg_drain" : "Зарядження потужного удару споживає на {boost}% менше енергії{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Ушкодження потужним ударом", - "hud.skill.hmr_charged_melee_damage" : "Збільшує ушкодження потужним ударом на {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Відкидання потужним ударом", - "hud.skill.hmr_charged_melee_knockback" : "Збільшує відстань відкидання ворогів потужним ударом на {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Одиночний Удар", - "hud.skill.hmr_single_strike" : "Одинокий як ти", - "hud.skill.hmr_single_strike_regen_title" : "Комбо приріст відновлення енергії", - "hud.skill.hmr_single_strike_regen" : "Збільшує приріст відновлення енергії від ударів підряд{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Комбо приріст швидкості", - "hud.skill.hmr_single_strike_speed" : "Збільшує приріст швидкості від ударів підряд{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Комбо приріст ушкодження", - "hud.skill.hmr_single_strike_damage" : "Збільшує приріст ушкодження від ударів підряд{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Відкидання", - "hud.skill.hmr_single_strike_knockback" : "Збільшує відстань відкидання ворогів на {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str": "Бог любить трійцю", - "hud.skill.sw_trip_str_title": "Потрійний Удар", - "hud.skill.sw_trip_str_combo_title": "Комбо трьох ударів", - "hud.skill.sw_trip_str_combo": "Відкриває приріст харакатеристик від ударів підряд{SP}", - "hud.skill.sw_trip_str_dmg_title": "Комбо приріст ушкодження", - "hud.skill.sw_trip_str_dmg": "Збільшує приріст ушкодження від ударів підряд{SP}", - "hud.skill.sw_trip_str_sp_title": "Комбо приріст швидкості", - "hud.skill.sw_trip_str_sp": "Збільшує приріст швидкості від ударів підряд{SP}", - "hud.skill.sw_trip_str_reg_title": "Комбо приріст відновлення енергії", - "hud.skill.sw_trip_str_reg": "Збільшує приріст відновлення енергії від ударів підряд{SP}", - "hud.skill.sw_dash": "Пронесись блискавкою поміж своїх ворогів", - "hud.skill.sw_dash_title": "Ривок", - "hud.skill.sw_dash_dmg_title": "Ушкодження випадом", - "hud.skill.sw_dash_dmg": "Збільшує початкове ушкодження випадом на {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Енергоспоживання випаду", - "hud.skill.sw_dash_drain": "Зменшує швидкість споживання енергії в випаді на {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Енергозатрати на випад", - "hud.skill.sw_dash_cost": "Зменшує початкову енергетичну ціну випаду на {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Швидкість випаду", - "hud.skill.sw_dash_speed": "Збільшує швидкість руху під час випаду {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Ривок Наскрізь", - "hud.skill.sw_dash_charge_through": "Дозволяє прорватись наскрізь першого ворога{SP}", - "hud.skill.sw_dash_scale_title": "Приріст ушкодження випадом", - "hud.skill.sw_dash_scale": "Збільшує приріст ушкодження випадом на {boost}%{SP}", - "hud.skill.sw_spin_title": "Кружляння", - "hud.skill.sw_spin": "Відкриває можливість кружляння з мечем{SP}", - "hud.skill.sw_spin_dmg_title": "Ушкодження кружлянням", - "hud.skill.sw_spin_dmg": "Збільшує ужкодження під час кружляння на {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Швидкість кружляння", - "hud.skill.sw_spin_spd": "Збільшує швидкість кружляння на {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Енергоспоживання кружляння", - "hud.skill.sw_spin_cost": "Зменшує споживання енергії кожного оберту на {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Кількість обертів", - "hud.skill.sw_spin_spins": "Збільшує максимальну кількість обертів{SP}", - "hud.skill.sw_interrupt_title": "Переривання атаки", - "hud.skill.sw_interrupt": "Дозволяє миттєво перервати ворожу атаку власною{SP}", - // Axe - // Double strike - "hud.skill.axe_double_strike_title": "Подвійний удар", - "hud.skill.axe_double_strike": "Порубай цих злодюг", - - "hud.skill.axe_double_strike_combo_title": "Комбо двох ударів", - "hud.skill.axe_double_strike_combo": "Відкриває другий послідовний удар{SP}", - - "hud.skill.axe_double_strike_damage_title": "Комбо приріст ушкодження", - "hud.skill.axe_double_strike_damage": "Збільшує приріст ушкодження від ударів підряд{SP}", - - "hud.skill.axe_double_strike_speed_title": "Комбо приріст швидкості", - "hud.skill.axe_double_strike_speed": "Збільшує приріст швидкості від ударів підряд{SP}", - - "hud.skill.axe_double_strike_regen_title": "Комбо приріст відновлення енергії", - "hud.skill.axe_double_strike_regen": "Збільшує приріст відновлення енергії від ударів підряд{SP}", - - // Spin - "hud.skill.axe_spin_title": "Кружляння з топором", - "hud.skill.axe_spin": "Марами, сивими хмарами дико крутили ...", - - "hud.skill.axe_infinite_axe_spin_title": "Незкінченне кружляння", - "hud.skill.axe_infinite_axe_spin": "Дозволяє кружляти доки не закінчиться енергія{SP}", - - "hud.skill.axe_spin_damage_title": "Ушкодження кружлянням", - "hud.skill.axe_spin_damage": "Збільшує ушкодження під час кружляння на {boost}%{SP}", - - "hud.skill.axe_spin_helicopter_title": "Гелікоптер", - "hud.skill.axe_spin_helicopter": "Сповільнює падіння під час кружляння{SP}", - - "hud.skill.axe_spin_speed_title": "Швидкість кружляння", - "hud.skill.axe_spin_speed": "Збільшує швидкість кружляння на {boost}%{SP}", - - "hud.skill.axe_spin_cost_title": "Енергоспоживання кружляння", - "hud.skill.axe_spin_cost": "Зменшує споживання енергії в кружлянні на {boost}%{SP}", - // Leap - "hud.skill.axe_unlock_leap_title": "Атака в стрибку", - "hud.skill.axe_unlock_leap": "Відкриває атаку в стрибку{SP}", - - "hud.skill.axe_leap_damage_title": "Ушкодження атакою в стрибку", - "hud.skill.axe_leap_damage": "Збільшує ушкодження від атаки в стрибку на {boost}%{SP}", - - "hud.skill.axe_leap_knockback_title": "Відкидання атакою в стрибку", - "hud.skill.axe_leap_knockback": "Збільшує відстань відкидання від атаки в стрибку на {boost}%{SP}", - - "hud.skill.axe_leap_cost_title": "Енергоспоживання атаки в стрибку", - "hud.skill.axe_leap_cost": "Зменшує споживання енергії атакою в стрибку на {boost}%{SP}", - - "hud.skill.axe_leap_distance_title": "Дальність стрибка", - "hud.skill.axe_leap_distance": "Збільшує дальність стрибка на {boost}%{SP}", - - // Mining - "hud.skill.mining_title": "Гірнича справа", - "hud.skill.pick_strike_title": "Удар Киркою", - "hud.skill.pick_strike": "Шукайте руди та коштовні камені щоб здобути матеріали", - "hud.skill.pick_strike_speed_title": "Швидший Удар", - "hud.skill.pick_strike_speed": "Добувайте матеріали швидше{SP}", - "hud.skill.pick_strike_oregain_title": "Щасливий удар (Руди)", - "hud.skill.pick_strike_oregain": "Шанс здобути додаткову руду (+{boost}% за рівень){SP}", - "hud.skill.pick_strike_gemgain_title": "Щасливий удар (Камені)", - "hud.skill.pick_strike_gemgain": "Шанс здобути додатковий камінь (+{boost}% за рівень){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/uk_UA/hud/social.ftl b/assets/voxygen/i18n/uk_UA/hud/social.ftl new file mode 100644 index 0000000000..4d36135a62 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Інші гравці +hud-social-online = В мережі: +hud-social-friends = Друзі +hud-social-not_yet_available = Ще не доступно +hud-social-faction = Фракція +hud-social-play_online_fmt = { $nb_player } гравців в мережі +hud-social-name = Ім'я +hud-social-level = Рівень +hud-social-zone = Зона +hud-social-account = Обліковий запис \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/social.ron b/assets/voxygen/i18n/uk_UA/hud/social.ron deleted file mode 100644 index 3fe9dfd774..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "hud.social": "Інші гравці", - "hud.social.online": "В мережі:", - "hud.social.friends": "Друзі", - "hud.social.not_yet_available": "Ще не доступно", - "hud.social.faction": "Фракція", - "hud.social.play_online_fmt": "{nb_player} гравців в мережі", - "hud.social.name": "Ім'я", - "hud.social.level": "Рівень", - "hud.social.zone": "Зона", - "hud.social.account": "Обліковий запис", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/uk_UA/hud/trade.ftl b/assets/voxygen/i18n/uk_UA/hud/trade.ftl new file mode 100644 index 0000000000..962588535b --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/hud/trade.ftl @@ -0,0 +1,25 @@ +hud-trade-trade_window = Торгове вікно +hud-trade-phase1_description = + Перетягніть речі, якими ви хочете + торгувати до відповідної області. +hud-trade-phase2_description = + Торговий процес тепер замкнений і + ви маєте змогу перевірити угоду. +hud-trade-phase3_description = Угода опрацьовується. +hud-trade-persons_offer = + Пропозиція + { $playername } +hud-trade-has_accepted = + { $playername } + дав згоду +hud-trade-accept = Прийняти +hud-trade-decline = Відмовитись +hud-trade-invite_sent = Пропозиція торгувати надіслана до { $playername }. +hud-trade-result-completed = Торгівля завершилась успішно. +hud-trade-result-declined = Торгівля розірвана. +hud-trade-result-nospace = Недостатньо місця щоб завершити торг. +hud-trade-buy_price = Ціна покупки +hud-trade-sell_price = Ціна продажу +hud-trade-coin = Монет +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/hud/trade.ron b/assets/voxygen/i18n/uk_UA/hud/trade.ron deleted file mode 100644 index 6de093fc57..0000000000 --- a/assets/voxygen/i18n/uk_UA/hud/trade.ron +++ /dev/null @@ -1,30 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" Ukrainian -( - string_map: { - "hud.trade.trade_window": "Торгове вікно", - "hud.trade.phase1_description": "Перетягніть речі, якими ви хочете\nторгувати до відповідної області.", - "hud.trade.phase2_description": "Торговий процес тепер замкнений і\nви маєте змогу перевірити угоду.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Угода опрацьовується.", - "hud.trade.persons_offer": "Пропозиція\n{playername}", - "hud.trade.has_accepted": "{playername}\n дав згоду", - "hud.trade.accept": "Прийняти", - "hud.trade.decline": "Відмовитись", - "hud.trade.invite_sent": "Пропозиція торгувати надіслана до {playername}.", - "hud.trade.result.completed": "Торгівля завершилась успішно.", - "hud.trade.result.declined": "Торгівля розірвана.", - "hud.trade.result.nospace": "Недостатньо місця щоб завершити торг.", - "hud.trade.buy_price": "Ціна покупки", - "hud.trade.sell_price": "Ціна продажу", - "hud.trade.coin": "Монет", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/uk_UA/main.ftl b/assets/voxygen/i18n/uk_UA/main.ftl new file mode 100644 index 0000000000..bdd485e052 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/main.ftl @@ -0,0 +1,75 @@ +main-username = Ім'я користовуча +main-server = Сервер +main-password = Пароль +main-connecting = З'єднання +main-creating_world = Створення світу +main-tip = Підказка: +main-notice = + Вітаємо в альфа-версії Veloren! + + Кілька моментів перед зануренням в пригоди: + + - Це дуже рання альфа. Будьте готові до багів, сирого ігроладу, невідполірованих механік та відсутності фіч. + + - Якщо у Вас є конструктивна критика, поради або Ви знайшли баги - можете зв'язатись з нами на Reddit, GitLab чи Discord-сервері нашої спільноти. + + - Veloren розповсюджується під ліцензією GPL 3. Це означає, що Ви вільні грати, модифікувати та розповсюджувати + гру як забажаєте (за умови, що Ваші допрацювання поширюватимуться також під GPL 3) + + - Veloren - це неприбутковий проект, і всі, хто над ним працюють - волонтери. + Якщо він Вам подобається, ласкаво просимо долучитись до команд розробників чи художників. + + Дякуємо, що прочитали. Щиро сподіваємось, що вам сподобається гра! + + ~ Команда Veloren +main-login_process = + Інформація про процес входу: + + Для гри на серверах з авторизацією + необхідно мати обліковий запис. + + Створити обліковий запис можна тут: + + https://veloren.net/account/. +main-login-server_not_found = Сервер не знайдено +main-login-authentication_error = Помилка авторизації на сервері +main-login-internal_error = Внутріння помилка у кліента (скоріше за все, персонаж був видалений) +main-login-failed_auth_server_url_invalid = Не вдалося з'єднатися з сервером аутентифікації +main-login-insecure_auth_scheme = HTTP схема аутентифікації НЕ підтримується. Це небезпечно! Для розробки це дозволено для 'localhost' або дебажних збірок +main-login-network_wrong_version = Сервер використовує інакшу версію гри. Перевірте свою версію і оновіть гру. +main-login-server_full = Сервер переповнено +main-login-untrusted_auth_server = Ненадійний сервер авторизації +main-login-outdated_client_or_server = Помилка: ймовірно версії не сумісні, перевірте оновлення. +main-login-timeout = Тайм-аут: сервер не відповів вчасно (перенавантажений, або проблеми з Вашою мережею). +main-login-server_shut_down = Сервер вимкнено +main-login-network_error = Помилка мережі +main-login-failed_sending_request = Запит до сервера авторизації невдалий +main-login-invalid_character = Обраний персонаж недоступний +main-login-client_crashed = Клієнт впав +main-login-not_on_whitelist = Для входу необхідний дозвіл від адміністратора. +main-login-banned = Вас заблоковано з наступної причини: +main-login-kicked = Вас викинуто з наступної причини: +main-login-select_language = Оберіть мову +main-servers-select_server = Оберіть сервер +main-login-client_version = Версія кліента +main-login-server_version = Версія сервера +loading-tips = + .a0 = Натисніть '{ $gameinput-togglelantern }', щоб засвітити ліхтар. + .a1 = Натисніть '{ $gameinput-help }', щоб переглянути стандартні елементи керування. + .a2 = Введіть /say чи /s, щоб написати лише гравцям поряд. + .a3 = Введіть /region чи /r, щоб написати лише гравцям в радіусі кількох сотень блоків навколо. + .a4 = Адміністратори можуть використовувати команду /build для переходу в режим будування + .a5 = Введіть /group чи /g, щоб написати лише гравцям з Вашої групи. + .a6 = Щоб надіслати приватне повідомлення, введіть /tell, ім'я гравця та Ваше повідомлення. + .a7 = Тримайте око на вістрі - їжа, скрині та інші корисні предмети можуть бути де-завгодно! + .a8 = Інвентар переповнений харчами? Спробуйте поєднати їх в кращу їжу! + .a9 = Шукаєте чим би це зайнятись? Провідайте одне з позначених на мапі підземель! + .a10 = Не забудьте налаштувати оптимальну для Вашої системи якість зображення. Натисніть '{ $gameinput-settings }', щоб відкрити налаштування. + .a11 = Грати з іншими весело! Натисніть '{ $gameinput-social }', щоб переглянути список користувачів в мережі. + .a12 = Натисніть '{ $gameinput-dance }', щоб потанцювати. Гей-Гоп! + .a13 = Натисніть '{ $gameinput-glide }', щоб дістати Дельтаплан, та підкорюйте небеса! + .a14 = Veloren все ще на стадії ранньої альфи. Ми стараємося робити покращення кожного дня! + .a15 = Якшо Ви хочете долучитись до розробки або ж просто поспілкуватись із нами, приєднуйтесь до нашого Discord-серверу. + .a16 = Ви можете змінити відображення індикатора здоров'я в налаштуваннях. + .a17 = Присядьте біля ватри (натиснувши '{ $gameinput-sit }'), щоб відпочити та відновити здоров'я. + .a18 = Потребуєте більше торбин чи кращу броню? Натисніть '{ $gameinput-crafting }' щоб відкрити ремісниче меню. \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/main.ron b/assets/voxygen/i18n/uk_UA/main.ron deleted file mode 100644 index dfcf34b9b5..0000000000 --- a/assets/voxygen/i18n/uk_UA/main.ron +++ /dev/null @@ -1,90 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - "main.username": "Ім'я користовуча", - "main.server": "Сервер", - "main.password": "Пароль", - "main.connecting": "З'єднання", - "main.creating_world": "Створення світу", - "main.tip": "Підказка:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Вітаємо в альфа-версії Veloren! - -Кілька моментів перед зануренням в пригоди: - -- Це дуже рання альфа. Будьте готові до багів, сирого ігроладу, невідполірованих механік та відсутності фіч. - -- Якщо у Вас є конструктивна критика, поради або Ви знайшли баги - можете зв'язатись з нами на Reddit, GitLab чи Discord-сервері нашої спільноти. - -- Veloren розповсюджується під ліцензією GPL 3. Це означає, що Ви вільні грати, модифікувати та розповсюджувати - гру як забажаєте (за умови, що Ваші допрацювання поширюватимуться також під GPL 3) - -- Veloren - це неприбутковий проект, і всі, хто над ним працюють - волонтери. -Якщо він Вам подобається, ласкаво просимо долучитись до команд розробників чи художників. - -Дякуємо, що прочитали. Щиро сподіваємось, що вам сподобається гра! - -~ Команда Veloren"#, - - // Login process description - "main.login_process": r#"Інформація про процес входу: - -Для гри на серверах з авторизацією -необхідно мати обліковий запис. - -Створити обліковий запис можна тут: - -https://veloren.net/account/."#, - "main.login.server_not_found": "Сервер не знайдено", - "main.login.authentication_error": "Помилка авторизації на сервері", - "main.login.internal_error": "Внутріння помилка у кліента (скоріше за все, персонаж був видалений)", - "main.login.failed_auth_server_url_invalid": "Не вдалося з'єднатися з сервером аутентифікації", - "main.login.insecure_auth_scheme": "HTTP схема аутентифікації НЕ підтримується. Це небезпечно! Для розробки це дозволено для 'localhost' або дебажних збірок", - "main.login.network_wrong_version": "Сервер використовує інакшу версію гри. Перевірте свою версію і оновіть гру.", // force update - "main.login.server_full": "Сервер переповнено", - "main.login.untrusted_auth_server": "Ненадійний сервер авторизації", - "main.login.outdated_client_or_server": "Помилка: ймовірно версії не сумісні, перевірте оновлення.", - "main.login.timeout": "Тайм-аут: сервер не відповів вчасно (перенавантажений, або проблеми з Вашою мережею).", - "main.login.server_shut_down": "Сервер вимкнено", - "main.login.network_error": "Помилка мережі", - "main.login.failed_sending_request": "Запит до сервера авторизації невдалий", - "main.login.invalid_character": "Обраний персонаж недоступний", - "main.login.client_crashed": "Клієнт впав", - "main.login.not_on_whitelist": "Для входу необхідний дозвіл від адміністратора.", - "main.login.banned": "Вас заблоковано з наступної причини:", - "main.login.kicked": "Вас викинуто з наступної причини:", - "main.login.select_language": "Оберіть мову", - - "main.servers.select_server": "Оберіть сервер", - "main.login.client_version": "Версія кліента", - "main.login.server_version": "Версія сервера", - }, - - - vector_map: { - "loading.tips": [ - "Натисніть '{gameinput.togglelantern}', щоб засвітити ліхтар.", - "Натисніть '{gameinput.help}', щоб переглянути стандартні елементи керування.", - "Введіть /say чи /s, щоб написати лише гравцям поряд.", - "Введіть /region чи /r, щоб написати лише гравцям в радіусі кількох сотень блоків навколо.", - "Адміністратори можуть використовувати команду /build для переходу в режим будування", - "Введіть /group чи /g, щоб написати лише гравцям з Вашої групи.", - "Щоб надіслати приватне повідомлення, введіть /tell, ім'я гравця та Ваше повідомлення.", - "Тримайте око на вістрі - їжа, скрині та інші корисні предмети можуть бути де-завгодно!", - "Інвентар переповнений харчами? Спробуйте поєднати їх в кращу їжу!", - "Шукаєте чим би це зайнятись? Провідайте одне з позначених на мапі підземель!", - "Не забудьте налаштувати оптимальну для Вашої системи якість зображення. Натисніть '{gameinput.settings}', щоб відкрити налаштування.", - "Грати з іншими весело! Натисніть '{gameinput.social}', щоб переглянути список користувачів в мережі.", - "Натисніть '{gameinput.dance}', щоб потанцювати. Гей-Гоп!", - "Натисніть '{gameinput.glide}', щоб дістати Дельтаплан, та підкорюйте небеса!", - "Veloren все ще на стадії ранньої альфи. Ми стараємося робити покращення кожного дня!", - "Якшо Ви хочете долучитись до розробки або ж просто поспілкуватись із нами, приєднуйтесь до нашого Discord-серверу.", - "Ви можете змінити відображення індикатора здоров'я в налаштуваннях.", - "Присядьте біля ватри (натиснувши '{gameinput.sit}'), щоб відпочити та відновити здоров'я.", - "Потребуєте більше торбин чи кращу броню? Натисніть '{gameinput.crafting}' щоб відкрити ремісниче меню.", - ], - } -) diff --git a/assets/voxygen/i18n/uk_UA/npc.ftl b/assets/voxygen/i18n/uk_UA/npc.ftl new file mode 100644 index 0000000000..5dcb53cb54 --- /dev/null +++ b/assets/voxygen/i18n/uk_UA/npc.ftl @@ -0,0 +1,138 @@ +npc-speech-villager = + .a0 = Ну хіба ж не прекрасний сьогодні день? + .a1 = Як ся маєш? + .a2 = Гарного тобі дня! + .a3 = Цікаво, про що думає Катоблепас, коли їсть траву... + .a4 = Як тобі така погода? + .a5 = Мурашки по спині від одної тільки думки про ті підземелля! Сподіваюсь, хтось з ними розбереться. + .a6 = Коли я посильнішаю, мені б хотілось піти в спелеопохід, досліджувати печери! + .a7 = Ви не бачили мого кота? + .a8 = Ви коли небудь чули про лютих Земних Акул? Кажуть, вони водяться в пустелях. + .a9 = Кажуть, в печерах можна знайти коштовне каміння будь-яких типів. + .a10 = Я просто шаленію від сиру! + .a11 = Не зайдете в гості? Ми якраз збирались поласувати сиру! + .a12 = Кажуть, гриби корисні для здоров'я. Я, правда, ніколи їх не їм. + .a13 = Не забудь сухарики! + .a14 = Обожнюю Дварфський Сир! Хотілось би вміти його робити... + .a15 = Цікаво, що там по іншу сторону гір... + .a16 = Я сподіваюсь виготовити власний дельтаплан одного дня. + .a17 = Ви не хотіли б подивитись на мій сад? Гаразд, можливо іншим разом. + .a18 = Прекрасний день для прогулянки в лісі! + .a19 = Бути чи не бути? Думаю, я буду фермером. + .a20 = Ви не думали про те, що наше селище - найкраще? + .a21 = Як ти думаєш, чому Сяючі Залишки світяться? + .a22 = По-моєму, час другого сніданку! + .a23 = А ви коли небудь ловили світлячка? + .a24 = Я не можу зрозуміти, звідки приходять ці Сауроки. + .a25 = Хотілося б, щоб хтось захищав селище від вовків. + .a26 = Сьогодні мені приснився прекрасний сон про сир. Що б це значило? +npc-speech-villager_under_attack = + .a0 = Допоможіть, на мене напали! + .a1 = Рятуйте! Б'ють! + .a2 = Ай! Больно! + .a3 = Лупцюють! + .a4 = Допоможіть! + .a5 = Рятуйте! + .a6 = Хто-небудь, допоможіть! + .a7 = Будь ласка, допоможіть! + .a8 = АААААА! Рятуйте! + .a9 = Рятуйте! Вбивця! + .a10 = Рятуйте! Мене зараз вб'ють! + .a11 = Охорона, на мене напали! + .a12 = Охорона! На мене напали! + .a13 = Мене атакують! Охорона! + .a14 = Рятуйте! Охорона! На мене напали! + .a15 = Охорона! Швидше! + .a16 = Охорона! Охорона! + .a17 = Охорона! Цей негідник напав на мене! + .a18 = Охорона, розберіться з цим покидьком! + .a19 = Охорона! Тут вбивця! + .a20 = Охорона! Рятуйте! + .a21 = Це тобі так просто не минеться! Охорона! + .a22 = Ах ти ж падлюка! + .a23 = АААААА! + .a24 = Хто-небудь! + .a25 = Ай! Охорона! Рятуйте! + .a26 = Бляха... Вони прийшли за мною! + .a27 = Рятуйте! Допоможіть! Мене катують! + .a28 = Ага, ось вам і властива системі жорстокість. + .a29 = Це лиш царапина! + .a30 = Ану перестань! + .a31 = Благаю, не бий мене! + .a32 = Агов! Дивись куди сунеш цю штуку! + .a33 = Котись під три чорти! + .a34 = Перестань! Відчепись! + .a35 = Я починаю сердитись! + .a36 = Ким ти тут себе уявляєш?! + .a37 = Ти за це поплатишся головою! + .a38 = Благаю, перестань! У мене нічого немає! + .a39 = Я розкажу моєму братові! Він набагато сильніший за мене! + .a40 = Ааа, я розкажу мамі! + .a41 = Пішло геть, опудало! + .a42 = Благаю, перестань! + .a43 = Це було не дуже етично з Вашого боку! + .a44 = Все, все! Ти вмієш битись! Тепер перестань! + .a45 = Пощади мене! + .a46 = Благаю, у мене сім'я! + .a47 = Почекайте, давайте спокійно обговоримо ситуацію? + .a48 = Насилля - це ніколи не рішення! + .a49 = Та що ж це за день такий... + .a50 = Ауч! Це було больно! + .a51 = Ого, яке нахабство! + .a52 = Досить вже! + .a53 = А щоб тобі! + .a54 = Не весело. + .a55 = Як ти смієш?! + .a56 = Ти за це заплатиш! + .a57 = Тільки спробуй! Ти про це пожалкуєш! + .a58 = Не змушуй мене тебе покарати! + .a59 = Це якесь непорозуміння! + .a60 = В цьому немає необхідності! + .a61 = Та відвали вже! + .a62 = Це було дійсно больно! + .a63 = Ай! Чому ти б'єшся? + .a64 = Ви мене з кимось переплутали! + .a65 = Я такого не заслужив! + .a66 = Більше так не роби, будь ласка. + .a67 = Охорона, викиньте цього монстра в озеро! + .a68 = Я натравлю на тебе свою Тарраску! +npc-speech-villager_decline_trade = + .a0 = Нажаль, в мене немає чим торгувати. + .a1 = Торгівля? Ніби в мене є щось що вас цікавить. + .a2 = Моя земля - моя. I я не продам її ні за що. +npc-speech-merchant_advertisement = + .a0 = Чи можу я зацікавити вас торгівлею? + .a1 = Хочете поторгувати зі мною? + .a2 = В мене є багато товарів, не хочете глянути? +npc-speech-merchant_busy = + .a0 = Гей, тут є черга. + .a1 = Почекайте, в мене тільки одна пара рук. + .a2 = Приглядіться, ви тут не один. + .a3 = Секунду, я майже закінчив. + .a4 = Не лізьте не в свою чергу. + .a5 = Я зайнятий, заходьте пізніше. +npc-speech-merchant_trade_successful = + .a0 = Було приємно мати з вами справу! + .a1 = Заходьте ще! + .a2 = Дякую що обрали нас! +npc-speech-merchant_trade_declined = + .a0 = Не підійшло? Можливо в інший раз! + .a1 = Все одно, на все добре! +npc-speech-villager_cultist_alarm = + .a0 = Увага! Культист крадеться! + .a1 = За зброю! Культисти атакують! + .a2 = Як культисти взагалі посміли прийти сюди! + .a3 = Слава Нації! Смерть Культистам! + .a4 = Я не священик, але ви культисти заслуговуєте на смерть! + .a5 = Вбивця! + .a6 = Коли ти в останнє куштував лезо меча на смак, культист!? + .a7 = Тільки могильна земля змиє кров з твоїх рук, культист! + .a8 = Цей культист вже нікому нічого не зробить! + .a9 = Не чіпайте цього пацюка! Я задушу цього культиста своїми руками! + .a10 = Якщо ти думаєш, що ми чекаємо тебе із караваєм ти сильно помиляєшся. + .a11 = Краще б ви залишались під землею! + .a12 = Чи мріють культисти про пещерних овець? +npc-speech-villager_enemy_killed = + .a0 = Помста - це страва, яку кожен подає по-своєму! + .a1 = Нарешті заслужений спокій! + .a2 = ... так, на чому я зупинився? \ No newline at end of file diff --git a/assets/voxygen/i18n/uk_UA/npc.ron b/assets/voxygen/i18n/uk_UA/npc.ron deleted file mode 100644 index 2704bddf28..0000000000 --- a/assets/voxygen/i18n/uk_UA/npc.ron +++ /dev/null @@ -1,158 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Ukrainian -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "Ну хіба ж не прекрасний сьогодні день?", - "Як ся маєш?", - "Гарного тобі дня!", - "Цікаво, про що думає Катоблепас, коли їсть траву...", - "Як тобі така погода?", - "Мурашки по спині від одної тільки думки про ті підземелля! Сподіваюсь, хтось з ними розбереться.", - "Коли я посильнішаю, мені б хотілось піти в спелеопохід, досліджувати печери!", - "Ви не бачили мого кота?", - "Ви коли небудь чули про лютих Земних Акул? Кажуть, вони водяться в пустелях.", - "Кажуть, в печерах можна знайти коштовне каміння будь-яких типів.", - "Я просто шаленію від сиру!", - "Не зайдете в гості? Ми якраз збирались поласувати сиру!", - "Кажуть, гриби корисні для здоров'я. Я, правда, ніколи їх не їм.", - "Не забудь сухарики!", - "Обожнюю Дварфський Сир! Хотілось би вміти його робити...", - "Цікаво, що там по іншу сторону гір...", - "Я сподіваюсь виготовити власний дельтаплан одного дня.", - "Ви не хотіли б подивитись на мій сад? Гаразд, можливо іншим разом.", - "Прекрасний день для прогулянки в лісі!", - "Бути чи не бути? Думаю, я буду фермером.", - "Ви не думали про те, що наше селище - найкраще?", - "Як ти думаєш, чому Сяючі Залишки світяться?", - "По-моєму, час другого сніданку!", - "А ви коли небудь ловили світлячка?", - "Я не можу зрозуміти, звідки приходять ці Сауроки.", - "Хотілося б, щоб хтось захищав селище від вовків.", - "Сьогодні мені приснився прекрасний сон про сир. Що б це значило?", - ], - "npc.speech.villager_under_attack": [ - "Допоможіть, на мене напали!", - "Рятуйте! Б'ють!", - "Ай! Больно!", - "Лупцюють!", - "Допоможіть!", - "Рятуйте!", - "Хто-небудь, допоможіть!", - "Будь ласка, допоможіть!", - "АААААА! Рятуйте!", - "Рятуйте! Вбивця!", - "Рятуйте! Мене зараз вб'ють!", - "Охорона, на мене напали!", - "Охорона! На мене напали!", - "Мене атакують! Охорона!", - "Рятуйте! Охорона! На мене напали!", - "Охорона! Швидше!", - "Охорона! Охорона!", - "Охорона! Цей негідник напав на мене!", - "Охорона, розберіться з цим покидьком!", - "Охорона! Тут вбивця!", - "Охорона! Рятуйте!", - "Це тобі так просто не минеться! Охорона!", - "Ах ти ж падлюка!", - "АААААА!", - "Хто-небудь!", - "Ай! Охорона! Рятуйте!", - "Бляха... Вони прийшли за мною!", - "Рятуйте! Допоможіть! Мене катують!", - "Ага, ось вам і властива системі жорстокість.", - "Це лиш царапина!", - "Ану перестань!", - "Благаю, не бий мене!", - "Агов! Дивись куди сунеш цю штуку!", - "Котись під три чорти!", - "Перестань! Відчепись!", - "Я починаю сердитись!", - "Ким ти тут себе уявляєш?!", - "Ти за це поплатишся головою!", - "Благаю, перестань! У мене нічого немає!", - "Я розкажу моєму братові! Він набагато сильніший за мене!", - "Ааа, я розкажу мамі!", - "Пішло геть, опудало!", - "Благаю, перестань!", - "Це було не дуже етично з Вашого боку!", - "Все, все! Ти вмієш битись! Тепер перестань!", - "Пощади мене!", - "Благаю, у мене сім'я!", - "Почекайте, давайте спокійно обговоримо ситуацію?", - "Насилля - це ніколи не рішення!", - "Та що ж це за день такий...", - "Ауч! Це було больно!", - "Ого, яке нахабство!", - "Досить вже!", - "А щоб тобі!", - "Не весело.", - "Як ти смієш?!", - "Ти за це заплатиш!", - "Тільки спробуй! Ти про це пожалкуєш!", - "Не змушуй мене тебе покарати!", - "Це якесь непорозуміння!", - "В цьому немає необхідності!", - "Та відвали вже!", - "Це було дійсно больно!", - "Ай! Чому ти б'єшся?", - "Ви мене з кимось переплутали!", - "Я такого не заслужив!", - "Більше так не роби, будь ласка.", - "Охорона, викиньте цього монстра в озеро!", - "Я натравлю на тебе свою Тарраску!", - ], - "npc.speech.villager_decline_trade": [ - "Нажаль, в мене немає чим торгувати.", - "Торгівля? Ніби в мене є щось що вас цікавить.", - "Моя земля - моя. I я не продам її ні за що.", - ], - "npc.speech.merchant_advertisement": [ - "Чи можу я зацікавити вас торгівлею?", - "Хочете поторгувати зі мною?", - "В мене є багато товарів, не хочете глянути?" - ], - "npc.speech.merchant_busy": [ - "Гей, тут є черга.", - "Почекайте, в мене тільки одна пара рук.", - "Приглядіться, ви тут не один.", - "Секунду, я майже закінчив.", - "Не лізьте не в свою чергу.", - "Я зайнятий, заходьте пізніше." - ], - "npc.speech.merchant_trade_successful": [ - "Було приємно мати з вами справу!", - "Заходьте ще!", - "Дякую що обрали нас!", - ], - "npc.speech.merchant_trade_declined": [ - "Не підійшло? Можливо в інший раз!", - "Все одно, на все добре!", - ], - "npc.speech.villager_cultist_alarm": [ - "Увага! Культист крадеться!", - "За зброю! Культисти атакують!", - "Як культисти взагалі посміли прийти сюди!", - "Слава Нації! Смерть Культистам!", - "Я не священик, але ви культисти заслуговуєте на смерть!", - "Вбивця!", - "Коли ти в останнє куштував лезо меча на смак, культист!?", - "Тільки могильна земля змиє кров з твоїх рук, культист!", - "Цей культист вже нікому нічого не зробить!", - "Не чіпайте цього пацюка! Я задушу цього культиста своїми руками!", - "Якщо ти думаєш, що ми чекаємо тебе із караваєм ти сильно помиляєшся.", - "Краще б ви залишались під землею!", - "Чи мріють культисти про пещерних овець?", - ], - "npc.speech.villager_enemy_killed": [ - "Помста - це страва, яку кожен подає по-своєму!", - "Нарешті заслужений спокій!", - "... так, на чому я зупинився?", - ] - } -) diff --git a/assets/voxygen/i18n/vi_VI/buff.ftl b/assets/voxygen/i18n/vi_VI/buff.ftl new file mode 100644 index 0000000000..75f3f58993 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/buff.ftl @@ -0,0 +1,35 @@ +buff-remove = Nhấp để xóa +buff-title-missing = Tiêu Đề Bị Thiếu +buff-desc-missing = Mô Tả Bị Thiếu +buff-title-heal = Hồi máu +buff-desc-heal = Tăng máu theo thời gian. +buff-title-potion = Thuốc +buff-desc-potion = Đang uống... +buff-title-saturation = Bão Hòa +buff-desc-saturation = Tăng máu theo thời gian từ việc hấp thụ vật phẩm. +buff-desc-campfire_heal = Nghỉ ngơi ở lửa trại hồi { $rate }% máu một giây. +buff-title-invulnerability = Bất Tử +buff-desc-invulnerability = Bạn không dính sát thương của bất kỳ đòn tấn công nào. +buff-desc-protectingward = Bạn được bảo vệ phần nào khỏi các đòn tấn công. +buff-title-frenzied = Cuồng Nộ +buff-desc-frenzied = Tăng tốc và bỏ qua sát thương nhỏ. +buff-title-bleed = Chảy Máu +buff-desc-bleed = Gây sát thương liên tục. +buff-title-cursed = Nguyền +buff-desc-cursed = Bạn bị nguyền. +buff-title-burn = Cháy +buff-desc-burn = Bạn đang bị thiêu sống +buff-title-crippled = Què Quặt +buff-desc-crippled = Chuyển động chập chững do chân đã bị thương nặng. +buff-title-frozen = Đông Cứng +buff-desc-frozen = Cả chuyển động và đòn tấn công đều bị làm chậm. +buff-title-wet = Ướt +buff-desc-wet = Mặt sàn trơn trượt, khó dừng lại. +buff-title-ensnared = Trói Buộc +buff-desc-ensnared = Dây leo bám vào chân, cản trở chuyển động của bạn. +buff-stat-health = Hồi { $str_total } Máu +buff-stat-increase_max_energy = Tăng Mức Năng Lượng Tối Đa { $strength } +buff-stat-increase_max_health = Tăng Lượng Máu Tối Đa { $strength } +buff-stat-invulnerability = Cho khả năng miễn sát thương +buff-text-over_seconds = trong { $dur_secs } giây +buff-text-for_seconds = khoảng { $dur_secs } giây \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/buff.ron b/assets/voxygen/i18n/vi_VI/buff.ron deleted file mode 100644 index a7b45cbed0..0000000000 --- a/assets/voxygen/i18n/vi_VI/buff.ron +++ /dev/null @@ -1,52 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - // Buffs - "buff.remove": "Nhấp để xóa", - "buff.title.missing": "Tiêu Đề Bị Thiếu", - "buff.desc.missing": "Mô Tả Bị Thiếu", - "buff.title.heal": "Hồi máu", - "buff.desc.heal": "Tăng máu theo thời gian.", - "buff.title.potion": "Thuốc", - "buff.desc.potion": "Đang uống...", - "buff.title.saturation": "Bão Hòa", - "buff.desc.saturation": "Tăng máu theo thời gian từ việc hấp thụ vật phẩm.", - // "buff.title.campfire_heal": "Campfire Heal", - "buff.desc.campfire_heal": "Nghỉ ngơi ở lửa trại hồi {rate}% máu một giây.", - "buff.title.invulnerability": "Bất Tử", - "buff.desc.invulnerability": "Bạn không dính sát thương của bất kỳ đòn tấn công nào.", - // "buff.title.protectingward": "Protecting Ward", - "buff.desc.protectingward": "Bạn được bảo vệ phần nào khỏi các đòn tấn công.", - "buff.title.frenzied": "Cuồng Nộ", - "buff.desc.frenzied": "Tăng tốc và bỏ qua sát thương nhỏ.", - // Debuffs - "buff.title.bleed": "Chảy Máu", - "buff.desc.bleed": "Gây sát thương liên tục.", - "buff.title.cursed": "Nguyền", - "buff.desc.cursed": "Bạn bị nguyền.", - "buff.title.burn": "Cháy", - "buff.desc.burn": "Bạn đang bị thiêu sống", - "buff.title.crippled": "Què Quặt", - "buff.desc.crippled": "Chuyển động chập chững do chân đã bị thương nặng.", - "buff.title.frozen": "Đông Cứng", - "buff.desc.frozen": "Cả chuyển động và đòn tấn công đều bị làm chậm.", - "buff.title.wet": "Ướt", - "buff.desc.wet": "Mặt sàn trơn trượt, khó dừng lại.", - "buff.title.ensnared": "Trói Buộc", - "buff.desc.ensnared": "Dây leo bám vào chân, cản trở chuyển động của bạn.", - // Buffs stats - "buff.stat.health": "Hồi {str_total} Máu", - "buff.stat.increase_max_energy": "Tăng Mức Năng Lượng Tối Đa {strength}", - "buff.stat.increase_max_health": "Tăng Lượng Máu Tối Đa {strength}", - "buff.stat.invulnerability": "Cho khả năng miễn sát thương", - // Text - "buff.text.over_seconds": "trong {dur_secs} giây", - "buff.text.for_seconds": "khoảng {dur_secs} giây", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/char_selection.ftl b/assets/voxygen/i18n/vi_VI/char_selection.ftl new file mode 100644 index 0000000000..939f4a9372 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/char_selection.ftl @@ -0,0 +1,20 @@ +char_selection-loading_characters = Đang tải nhân vật... +char_selection-delete_permanently = Xóa vĩnh viễn Nhân vật này? +char_selection-deleting_character = Đang Xóa Nhân Vật... +char_selection-change_server = Đổi Máy Chủ +char_selection-enter_world = Vào Trò Chơi +char_selection-logout = Đăng xuất +char_selection-create_new_character = Tạo Nhân Vật Mới +char_selection-creating_character = Đang Tạo Nhân Vật... +char_selection-character_creation = Tạo Nhân Vật +char_selection-human_default = Con Người Mặc Định +char_selection-level_fmt = Cấp Độ { $level_nb } +char_selection-beard = Râu +char_selection-hair_style = Kiểu Tóc +char_selection-hair_color = Màu Tóc +char_selection-eye_color = Màu Mắt +char_selection-skin = Da +char_selection-eyeshape = Kiểu Mắt +char_selection-accessories = Phụ Kiện +char_selection-create_info_name = Đặt tên cho Nhân vật! +char_selection-version_mismatch = Cảnh Báo! Máy chủ này đang chạy một phiên bản khác. Vui lòng cập nhật trò chơi. \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/char_selection.ron b/assets/voxygen/i18n/vi_VI/char_selection.ron deleted file mode 100644 index 9030755458..0000000000 --- a/assets/voxygen/i18n/vi_VI/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "char_selection.loading_characters": "Đang tải nhân vật...", - "char_selection.delete_permanently": "Xóa vĩnh viễn Nhân vật này?", - "char_selection.deleting_character": "Đang Xóa Nhân Vật...", - "char_selection.change_server": "Đổi Máy Chủ", - "char_selection.enter_world": "Vào Trò Chơi", - "char_selection.logout": "Đăng xuất", - "char_selection.create_new_character": "Tạo Nhân Vật Mới", - "char_selection.creating_character": "Đang Tạo Nhân Vật...", - "char_selection.character_creation": "Tạo Nhân Vật", - "char_selection.human_default": "Con Người Mặc Định", - "char_selection.level_fmt": "Cấp Độ {level_nb}", - // "char_selection.uncanny_valley": "Wilderness", - // "char_selection.plains_of_uncertainty": "Plains of Uncertainty", - "char_selection.beard": "Râu", - "char_selection.hair_style": "Kiểu Tóc", - "char_selection.hair_color": "Màu Tóc", - "char_selection.eye_color": "Màu Mắt", - "char_selection.skin": "Da", - "char_selection.eyeshape": "Kiểu Mắt", - "char_selection.accessories": "Phụ Kiện", - "char_selection.create_info_name": "Đặt tên cho Nhân vật!", - "char_selection.version_mismatch": "Cảnh Báo! Máy chủ này đang chạy một phiên bản khác. Vui lòng cập nhật trò chơi.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/common.ftl b/assets/voxygen/i18n/vi_VI/common.ftl new file mode 100644 index 0000000000..c47e185f19 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/common.ftl @@ -0,0 +1,95 @@ +common-username = Tên tài khoản +common-singleplayer = Chơi đơn +common-multiplayer = Chơi mạng +common-servers = Máy chủ +common-quit = Thoát +common-settings = Cài đặt +common-languages = Ngôn ngữ +common-interface = Giao diện +common-gameplay = Lối chơi +common-controls = Điều khiển +common-video = Đồ họa +common-sound = Âm thanh +common-chat = Trò chuyện +common-resume = Tiếp tục +common-characters = Nhân vật +common-close = Đóng +common-yes = Có +common-no = Không +common-back = Quay lại +common-create = Tạo +common-okay = Được +common-add = Thêm +common-accept = Chấp nhận +common-decline = Từ chối +common-disclaimer = Khước từ +common-cancel = Hủy bỏ +common-none = Không còn +common-error = Lỗi +common-fatal_error = Lỗi nghiêm trọng +common-you = Bạn +common-automatic = Tự động +common-random = Ngẫu nhiên +common-empty = Trống rỗng +common-interface_settings = Cài đặt giao diện +common-gameplay_settings = Cài đặt chế độ chơi +common-controls_settings = Cài đặt điều khiển +common-video_settings = Cài đặt hình ảnh +common-sound_settings = Cài đặt âm thanh +common-language_settings = Cài đặt ngôn ngữ +common-chat_settings = Cài đặt trò truyện +common-connection_lost = + Mất kết nối! + Máy chủ đã bị khởi động lại? + Trò chơi có được cập nhật không? +common-species-orc = Loài orc +common-species-human = Loài người +common-species-dwarf = Người lùn +common-species-elf = Yêu tinh +common-species-draugr = Xác sống +common-species-danari = Loài Danari +common-weapons-axe = Rìu +common-weapons-greatsword = Trọng kiếm +common-weapons-shortswords = Đoản kiếm +common-weapons-sword = Kiếm +common-weapons-staff = Hỏa trượng +common-weapons-bow = Cung +common-weapons-hammer = Búa +common-weapons-sceptre = Quyền Trượng Hồi Phục +common-weapons-shield = Khiên +common-weapons-spear = Giáo +common-weapons-hammer_simple = Búa Thô Sơ +common-weapons-sword_simple = Kiếm Thô Sơ +common-weapons-staff_simple = Gậy Phép Thô Sơ +common-weapons-axe_simple = Rìu Thô Sơ +common-weapons-bow_simple = Cung Thô Sơ +common-weapons-unique = Độc Nhất +common-tool-debug = Gỡ Lỗi +common-tool-farming = Nông Cụ +common-tool-pick = Cuốc +common-tool-mining = Khai Mỏ +common-kind-modular_component = Thành phần Mô-đun +common-kind-glider = Dù Lượn +common-kind-consumable = Có thể hấp thụ +common-kind-throwable = Có thể ném +common-kind-ingredient = Nguyên Liệu +common-kind-lantern = Đèn +common-hands-one = Một Tay +common-hands-two = Hai Tay +common-rand_appearance = Ngoại hình ngẫu nhiên +common-rand_name = Tên ngẫu nhiên +common-stats-combat_rating = CR +common-stats-power = Sức Mạnh +common-stats-speed = Tốc Độ +common-stats-poise = Tự Chủ +common-stats-crit_chance = Tỉ Lệ Chí Mạng +common-stats-armor = Giáp +common-stats-energy_max = Năng Lượng Tối Đa +common-stats-energy_reward = Thưởng Năng Lượng +common-stats-crit_power = Sức Mạnh Chí Mạng +common-stats-stealth = Lén Lút +common-material-metal = Kim Loại +common-material-wood = Gỗ +common-material-stone = Đá +common-material-cloth = Vải +common-material-hide = Da \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/common.ron b/assets/voxygen/i18n/vi_VI/common.ron deleted file mode 100644 index 28997dd7ef..0000000000 --- a/assets/voxygen/i18n/vi_VI/common.ron +++ /dev/null @@ -1,121 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Tên tài khoản", - "common.singleplayer": "Chơi đơn", - "common.multiplayer": "Chơi mạng", - "common.servers": "Máy chủ", - "common.quit": "Thoát", - "common.settings": "Cài đặt", - "common.languages": "Ngôn ngữ", - "common.interface": "Giao diện", - "common.gameplay": "Lối chơi", - "common.controls": "Điều khiển", - "common.video": "Đồ họa", - "common.sound": "Âm thanh", - "common.chat": "Trò chuyện", - "common.resume": "Tiếp tục", - "common.characters": "Nhân vật", - "common.close": "Đóng", - "common.yes": "Có", - "common.no": "Không", - "common.back": "Quay lại", - "common.create": "Tạo", - "common.okay": "Được", - "common.add": "Thêm", - "common.accept": "Chấp nhận", - "common.decline": "Từ chối", - "common.disclaimer": "Khước từ", - "common.cancel": "Hủy bỏ", - "common.none": "Không còn", - "common.error": "Lỗi", - "common.fatal_error": "Lỗi nghiêm trọng", - "common.you": "Bạn", - "common.automatic": "Tự động", - "common.random": "Ngẫu nhiên", - "common.empty": "Trống rỗng", - - // Settings Window title - "common.interface_settings": "Cài đặt giao diện", - "common.gameplay_settings": "Cài đặt chế độ chơi", - "common.controls_settings": "Cài đặt điều khiển", - "common.video_settings": "Cài đặt hình ảnh", - "common.sound_settings": "Cài đặt âm thanh", - "common.language_settings": "Cài đặt ngôn ngữ", - "common.chat_settings": "Cài đặt trò truyện", - - // Message when connection to the server is lost - "common.connection_lost": r#"Mất kết nối! -Máy chủ đã bị khởi động lại? -Trò chơi có được cập nhật không?"#, - - - "common.species.orc": "Loài orc", - "common.species.human": "Loài người", - "common.species.dwarf": "Người lùn", - "common.species.elf": "Yêu tinh", - "common.species.draugr": "Xác sống", - "common.species.danari": "Loài Danari", - - "common.weapons.axe": "Rìu", - "common.weapons.greatsword": "Trọng kiếm", - "common.weapons.shortswords": "Đoản kiếm", - "common.weapons.sword": "Kiếm", - "common.weapons.staff": "Hỏa trượng", - "common.weapons.bow": "Cung", - "common.weapons.hammer": "Búa", - // "common.weapons.general": "General Combat", - "common.weapons.sceptre": "Quyền Trượng Hồi Phục", - "common.weapons.shield": "Khiên", - "common.weapons.spear": "Giáo", - "common.weapons.hammer_simple": "Búa Thô Sơ", - "common.weapons.sword_simple": "Kiếm Thô Sơ", - "common.weapons.staff_simple": "Gậy Phép Thô Sơ", - "common.weapons.axe_simple": "Rìu Thô Sơ", - "common.weapons.bow_simple": "Cung Thô Sơ", - "common.weapons.unique": "Độc Nhất", - "common.tool.debug": "Gỡ Lỗi", - "common.tool.farming": "Nông Cụ", - "common.tool.pick": "Cuốc", - "common.tool.mining": "Khai Mỏ", - "common.kind.modular_component": "Thành phần Mô-đun", - "common.kind.glider": "Dù Lượn", - "common.kind.consumable": "Có thể hấp thụ", - "common.kind.throwable": "Có thể ném", - // "common.kind.utility": "Utility", - "common.kind.ingredient": "Nguyên Liệu", - "common.kind.lantern": "Đèn", - "common.hands.one": "Một Tay", - "common.hands.two": "Hai Tay", - - "common.rand_appearance": "Ngoại hình ngẫu nhiên", - "common.rand_name": "Tên ngẫu nhiên", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Sức Mạnh", - "common.stats.speed": "Tốc Độ", - "common.stats.poise": "Tự Chủ", - "common.stats.crit_chance": "Tỉ Lệ Chí Mạng", - // "common.stats.crit_mult": "Crit Mult", - "common.stats.armor": "Giáp", - // "common.stats.poise_res":"Stun Res", - "common.stats.energy_max": "Năng Lượng Tối Đa", - "common.stats.energy_reward": "Thưởng Năng Lượng", - "common.stats.crit_power": "Sức Mạnh Chí Mạng", - "common.stats.stealth": "Lén Lút", - // "common.stats.slots": "Slots", - - "common.material.metal": "Kim Loại", - "common.material.wood": "Gỗ", - "common.material.stone": "Đá", - "common.material.cloth": "Vải", - "common.material.hide": "Da", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/esc_menu.ftl b/assets/voxygen/i18n/vi_VI/esc_menu.ftl new file mode 100644 index 0000000000..b88b7cac39 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Đăng Xuất +esc_menu-quit_game = Thoát Trò Chơi \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/esc_menu.ron b/assets/voxygen/i18n/vi_VI/esc_menu.ron deleted file mode 100644 index 748b932900..0000000000 --- a/assets/voxygen/i18n/vi_VI/esc_menu.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "esc_menu.logout": "Đăng Xuất", - "esc_menu.quit_game": "Thoát Trò Chơi", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/vi_VI/gameinput.ftl b/assets/voxygen/i18n/vi_VI/gameinput.ftl new file mode 100644 index 0000000000..682632ed4c --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/gameinput.ftl @@ -0,0 +1,65 @@ +gameinput-primary = Đòn Đánh Cơ Bản +gameinput-secondary = Đòn Đánh Thứ Cấp +gameinput-block = Đỡ +gameinput-slot1 = Sử dụng vật phẩm ô 1 +gameinput-slot2 = Sử dụng vật phẩm ô 2 +gameinput-slot3 = Sử dụng vật phẩm ô 3 +gameinput-slot4 = Sử dụng vật phẩm ô 4 +gameinput-slot5 = Sử dụng vật phẩm ô 5 +gameinput-slot6 = Sử dụng vật phẩm ô 6 +gameinput-slot7 = Sử dụng vật phẩm ô 7 +gameinput-slot8 = Sử dụng vật phẩm ô 8 +gameinput-slot9 = Sử dụng vật phẩm ô 9 +gameinput-slot10 = Sử dụng vật phẩm ô 10 +gameinput-swaploadout = Đổi Vũ Khí +gameinput-togglecursor = Bật/Tắt Con Trỏ +gameinput-help = Bật/Tắt Cửa Sổ Giúp Đỡ +gameinput-toggleinterface = Bật/Tắt Giao Diện +gameinput-toggledebug = Bật/Tắt FPS và Thông Tin Gỡ Lỗi +gameinput-toggle_egui_debug = Bật/Tắt Thông Tin Gỡ Lỗi EGUI +gameinput-togglechat = Bật/Tắt Trò Chuyện +gameinput-screenshot = Chụp Màn Hình +gameinput-toggleingameui = Bật/Tắt Thẻ Tên +gameinput-fullscreen = Bật/Tắt Toàn Màn Hình +gameinput-moveforward = Đi Thẳng +gameinput-moveleft = Sang Trái +gameinput-moveright = Sang Phải +gameinput-moveback = Đi Lùi +gameinput-jump = Nhảy +gameinput-glide = Lượn +gameinput-roll = Lăn +gameinput-climb = Trèo +gameinput-climbdown = Trèo Xuống +gameinput-wallleap = Nhảy Qua Tường +gameinput-togglelantern = Bật/Tắt Đèn +gameinput-mount = Cưỡi +gameinput-chat = Trò Chuyện +gameinput-command = Lệnh +gameinput-escape = Thoát +gameinput-map = Bản Đồ +gameinput-bag = Túi +gameinput-trade = Giao Dịch +gameinput-social = Xã Hội +gameinput-sit = Ngồi +gameinput-spellbook = Phép +gameinput-settings = Cài Đặt +gameinput-respawn = Tái Sinh +gameinput-charge = Charge +gameinput-togglewield = Bật/Tắt Wield +gameinput-interact = Tương Tác +gameinput-freelook = Quan Sát Tự Do +gameinput-autowalk = Tự Động Đi Bộ/Bơi +gameinput-cameraclamp = Cố Định Máy Quay +gameinput-dance = Nhảy +gameinput-select = Lựa Chọn Đối Tượng +gameinput-acceptgroupinvite = Chấp Nhận Lời Mời Nhóm +gameinput-declinegroupinvite = Từ Chối Lời Mời Nhóm +gameinput-cyclecamera = Quay Máy Quay +gameinput-crafting = Chế Tạo +gameinput-fly = Bay +gameinput-sneak = Lén Lút +gameinput-swimdown = Lặn xuống +gameinput-swimup = Bơi lên +gameinput-mapzoomin = Phóng to bản đồ +gameinput-mapzoomout = Thu nhỏ bản đồ +gameinput-greet = Chào \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/gameinput.ron b/assets/voxygen/i18n/vi_VI/gameinput.ron deleted file mode 100644 index f38f6550db..0000000000 --- a/assets/voxygen/i18n/vi_VI/gameinput.ron +++ /dev/null @@ -1,76 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "gameinput.primary": "Đòn Đánh Cơ Bản", - "gameinput.secondary": "Đòn Đánh Thứ Cấp", - "gameinput.block": "Đỡ", - "gameinput.slot1": "Sử dụng vật phẩm ô 1", - "gameinput.slot2": "Sử dụng vật phẩm ô 2", - "gameinput.slot3": "Sử dụng vật phẩm ô 3", - "gameinput.slot4": "Sử dụng vật phẩm ô 4", - "gameinput.slot5": "Sử dụng vật phẩm ô 5", - "gameinput.slot6": "Sử dụng vật phẩm ô 6", - "gameinput.slot7": "Sử dụng vật phẩm ô 7", - "gameinput.slot8": "Sử dụng vật phẩm ô 8", - "gameinput.slot9": "Sử dụng vật phẩm ô 9", - "gameinput.slot10": "Sử dụng vật phẩm ô 10", - "gameinput.swaploadout": "Đổi Vũ Khí", - "gameinput.togglecursor": "Bật/Tắt Con Trỏ", - "gameinput.help": "Bật/Tắt Cửa Sổ Giúp Đỡ", - "gameinput.toggleinterface": "Bật/Tắt Giao Diện", - "gameinput.toggledebug": "Bật/Tắt FPS và Thông Tin Gỡ Lỗi", - "gameinput.toggle_egui_debug": "Bật/Tắt Thông Tin Gỡ Lỗi EGUI", - "gameinput.togglechat": "Bật/Tắt Trò Chuyện", - "gameinput.screenshot": "Chụp Màn Hình", - "gameinput.toggleingameui": "Bật/Tắt Thẻ Tên", - "gameinput.fullscreen": "Bật/Tắt Toàn Màn Hình", - "gameinput.moveforward": "Đi Thẳng", - "gameinput.moveleft": "Sang Trái", - "gameinput.moveright": "Sang Phải", - "gameinput.moveback": "Đi Lùi", - "gameinput.jump": "Nhảy", - "gameinput.glide": "Lượn", - "gameinput.roll": "Lăn", - "gameinput.climb": "Trèo", - "gameinput.climbdown": "Trèo Xuống", - "gameinput.wallleap": "Nhảy Qua Tường", - "gameinput.togglelantern": "Bật/Tắt Đèn", - "gameinput.mount": "Cưỡi", - "gameinput.chat": "Trò Chuyện", - "gameinput.command": "Lệnh", - "gameinput.escape": "Thoát", - "gameinput.map": "Bản Đồ", - "gameinput.bag": "Túi", - "gameinput.trade": "Giao Dịch", - "gameinput.social": "Xã Hội", - "gameinput.sit": "Ngồi", - "gameinput.spellbook": "Phép", - "gameinput.settings": "Cài Đặt", - "gameinput.respawn": "Tái Sinh", - "gameinput.charge": "Charge", - "gameinput.togglewield": "Bật/Tắt Wield", - "gameinput.interact": "Tương Tác", - "gameinput.freelook": "Quan Sát Tự Do", - "gameinput.autowalk": "Tự Động Đi Bộ/Bơi", - "gameinput.cameraclamp": "Cố Định Máy Quay", - "gameinput.dance": "Nhảy", - "gameinput.select": "Lựa Chọn Đối Tượng", - "gameinput.acceptgroupinvite": "Chấp Nhận Lời Mời Nhóm", - "gameinput.declinegroupinvite": "Từ Chối Lời Mời Nhóm", - "gameinput.cyclecamera": "Quay Máy Quay", - "gameinput.crafting": "Chế Tạo", - "gameinput.fly": "Bay", - "gameinput.sneak": "Lén Lút", - "gameinput.swimdown": "Lặn xuống", - "gameinput.swimup": "Bơi lên", - "gameinput.mapzoomin": "Phóng to bản đồ", - "gameinput.mapzoomout": "Thu nhỏ bản đồ", - "gameinput.greet": "Chào", - }, - - - vector_map: { - } -) \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/bag.ftl b/assets/voxygen/i18n/vi_VI/hud/bag.ftl new file mode 100644 index 0000000000..ccf0d6c385 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/bag.ftl @@ -0,0 +1,40 @@ +hud-bag-inventory = Kho đồ của { $playername } +hud-bag-stats_title = Chỉ số của { $playername } +hud-bag-exp = Exp +hud-bag-armor = Giáp +hud-bag-stats = Chỉ số +hud-bag-head = Đầu +hud-bag-neck = Cổ +hud-bag-tabard = Áo Tabard +hud-bag-shoulders = Vai +hud-bag-chest = Ngực +hud-bag-hands = Tay +hud-bag-lantern = Đèn +hud-bag-glider = Dù lượn +hud-bag-belt = Thắt lưng +hud-bag-ring = Nhẫn +hud-bag-back = Lưng +hud-bag-legs = Chân +hud-bag-feet = Bàn chân +hud-bag-mainhand = Tay thuận +hud-bag-offhand = Tay trái +hud-bag-inactive_mainhand = Tay thuận (Không kích hoạt) +hud-bag-inactive_offhand = Tay trái (Không kích hoạt) +hud-bag-swap_equipped_weapons_title = Đổi vũ khí +hud-bag-swap_equipped_weapons_desc = Nhấn phím { $key } +hud-bag-bag = Túi +hud-bag-health = Máu +hud-bag-energy = Năng Lượng +hud-bag-combat_rating = Chiến Lực +hud-bag-protection = Bảo vệ +hud-bag-stun_res = Khả năng hồi choáng +hud-bag-combat_rating_desc = + Được tính toán từ + trang bị và máu của bạn. +hud-bag-protection_desc = Giảm sát thương +hud-bag-stun_res_desc = + Khả năng phục hồi khỏi bị choáng bởi các đòn liên tiếp. + Hồi phục giống như Năng Lượng. +hud-bag-sort_by_name = Sắp xếp theo Tên +hud-bag-sort_by_quality = Sắp xếp theo chất lượng +hud-bag-sort_by_category = Sắp xếp theo chủng loại \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/bag.ron b/assets/voxygen/i18n/vi_VI/hud/bag.ron deleted file mode 100644 index dd01cfff90..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/bag.ron +++ /dev/null @@ -1,48 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - // Inventory - "hud.bag.inventory": "Kho đồ của {playername}", - "hud.bag.stats_title": "Chỉ số của {playername}", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Giáp", - "hud.bag.stats": "Chỉ số", - "hud.bag.head": "Đầu", - "hud.bag.neck": "Cổ", - "hud.bag.tabard": "Áo Tabard", - "hud.bag.shoulders": "Vai", - "hud.bag.chest": "Ngực", - "hud.bag.hands": "Tay", - "hud.bag.lantern": "Đèn", - "hud.bag.glider": "Dù lượn", - "hud.bag.belt": "Thắt lưng", - "hud.bag.ring": "Nhẫn", - "hud.bag.back": "Lưng", - "hud.bag.legs": "Chân", - "hud.bag.feet": "Bàn chân", - "hud.bag.mainhand": "Tay thuận", - "hud.bag.offhand": "Tay trái", - "hud.bag.inactive_mainhand": "Tay thuận (Không kích hoạt)", - "hud.bag.inactive_offhand": "Tay trái (Không kích hoạt)", - "hud.bag.swap_equipped_weapons_title": "Đổi vũ khí", - "hud.bag.swap_equipped_weapons_desc": "Nhấn phím {key}", - "hud.bag.bag": "Túi", - "hud.bag.health": "Máu", - "hud.bag.energy": "Năng Lượng", - "hud.bag.combat_rating": "Chiến Lực", - "hud.bag.protection": "Bảo vệ", - "hud.bag.stun_res": "Khả năng hồi choáng", - "hud.bag.combat_rating_desc": "Được tính toán từ\ntrang bị và máu của bạn.", - "hud.bag.protection_desc": "Giảm sát thương", - "hud.bag.stun_res_desc": "Khả năng phục hồi khỏi bị choáng bởi các đòn liên tiếp.\nHồi phục giống như Năng Lượng.", - "hud.bag.sort_by_name": "Sắp xếp theo Tên", - "hud.bag.sort_by_quality": "Sắp xếp theo chất lượng", - "hud.bag.sort_by_category": "Sắp xếp theo chủng loại", - }, - - - vector_map: { - } -) \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/char_window.ftl b/assets/voxygen/i18n/vi_VI/hud/char_window.ftl new file mode 100644 index 0000000000..b2e10c9ea3 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Tên nhân vật +character_window-character_stats = + Bền bỉ + + Nhanh nhẹn + + Ý chí + + Bảo vệ \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/char_window.ron b/assets/voxygen/i18n/vi_VI/hud/char_window.ron deleted file mode 100644 index 997485389d..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "character_window.character_name": "Tên nhân vật", - // Character stats - "character_window.character_stats": r#"Bền bỉ - -Nhanh nhẹn - -Ý chí - -Bảo vệ -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/chat.ftl b/assets/voxygen/i18n/vi_VI/hud/chat.ftl new file mode 100644 index 0000000000..76fc6374e6 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Tất cả +hud-chat-chat_tab_hover_tooltip = Nhấp chuột phải để cài đặt +hud-outcome-burning = chết vì: bị cháy +hud-outcome-curse = chết vì: bị nguyền +hud-outcome-bleeding = chết vì: mất máu +hud-outcome-crippled = chết vì: bị què +hud-outcome-frozen = chết vì: bị đông cứng +hud-chat-online_msg = [{ $name }] đang trực tuyến +hud-chat-offline_msg = [{ $name }] đã ngoại tuyến +hud-chat-default_death_msg = [{ $name }] chết +hud-chat-environmental_kill_msg = [{ $name }] chết ở { $environment } +hud-chat-fall_kill_msg = [{ $name }] bị ngã chết +hud-chat-suicide_msg = [{ $name }] tự bị thương mà chết +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } gây ra bởi [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] đã đánh bại [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] đã bắn chết [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] đã nổ tung [{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }] đã giết [{ $victim }] bằng phép thuật +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } gây ra bởi { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } đã giết [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } đã bắn [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } đã nổ tung [{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker } đã giết [{ $victim }] bằng phép thuật +hud-chat-npc_other_kill_msg = { $attacker } đã giết [{ $victim }] +hud-chat-loot_msg = Bạn đã nhặt được [{ $item }] +hud-chat-loot_fail = Kho đồ của bạn đã đầy! +hud-chat-goodbye = Tạm biệt! +hud-chat-connection_lost = Mất kết nối. Thoát ra sau { $time } giây. \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/chat.ron b/assets/voxygen/i18n/vi_VI/hud/chat.ron deleted file mode 100644 index 074201a4b8..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "hud.chat.all": "Tất cả", - "hud.chat.chat_tab_hover_tooltip": "Nhấp chuột phải để cài đặt", - - // Debuff outcomes - "hud.outcome.burning": "chết vì: bị cháy", - "hud.outcome.curse": "chết vì: bị nguyền", - "hud.outcome.bleeding": "chết vì: mất máu", - "hud.outcome.crippled": "chết vì: bị què", - "hud.outcome.frozen": "chết vì: bị đông cứng", - - // Chat outputs - "hud.chat.online_msg": "[{name}] đang trực tuyến", - "hud.chat.offline_msg": "[{name}] đã ngoại tuyến", - - "hud.chat.default_death_msg": "[{name}] chết", - "hud.chat.environmental_kill_msg": "[{name}] chết ở {environment}", - "hud.chat.fall_kill_msg": "[{name}] bị ngã chết", - "hud.chat.suicide_msg": "[{name}] tự bị thương mà chết", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} gây ra bởi [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] đã đánh bại [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] đã bắn chết [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] đã nổ tung [{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] đã giết [{victim}] bằng phép thuật", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} gây ra bởi {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} đã giết [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} đã bắn [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} đã nổ tung [{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker} đã giết [{victim}] bằng phép thuật", - "hud.chat.npc_other_kill_msg": "{attacker} đã giết [{victim}]", - - "hud.chat.loot_msg": "Bạn đã nhặt được [{item}]", - "hud.chat.loot_fail": "Kho đồ của bạn đã đầy!", - "hud.chat.goodbye": "Tạm biệt!", - "hud.chat.connection_lost": "Mất kết nối. Thoát ra sau {time} giây.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/crafting.ftl b/assets/voxygen/i18n/vi_VI/hud/crafting.ftl new file mode 100644 index 0000000000..405d3c1c63 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/crafting.ftl @@ -0,0 +1,25 @@ +hud-crafting = Chế tạo +hud-crafting-recipes = Công thức +hud-crafting-ingredients = Nguyên liệu: +hud-crafting-craft = Chế tạo +hud-crafting-tool_cata = Yêu cầu: +hud-crafting-req_crafting_station = Yêu cầu: +hud-crafting-anvil = Đe +hud-crafting-cauldron = Vạc +hud-crafting-cooking_pot = Nồi Nấu Ăn +hud-crafting-crafting_bench = Bàn Chế Tạo +hud-crafting-forge = Lò Rèn +hud-crafting-loom = Khung Cửi +hud-crafting-spinning_wheel = Guồng Se Sợi +hud-crafting-tanning_rack = Giá Thuộc Da +hud-crafting-tabs-all = Tất cả +hud-crafting-tabs-armor = Giáp +hud-crafting-tabs-dismantle = Tái Chế +hud-crafting-tabs-food = Thức Ăn +hud-crafting-tabs-glider = Dù Lượn +hud-crafting-tabs-potion = Thuốc +hud-crafting-tabs-tool = Dụng Cụ +hud-crafting-tabs-utility = Khác +hud-crafting-tabs-weapon = Vũ Khí +hud-crafting-tabs-bag = Túi +hud-crafting-tabs-processed_material = Vật Liệu \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/crafting.ron b/assets/voxygen/i18n/vi_VI/hud/crafting.ron deleted file mode 100644 index d46bf4ff76..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/crafting.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "hud.crafting": "Chế tạo", - "hud.crafting.recipes": "Công thức", - "hud.crafting.ingredients": "Nguyên liệu:", - "hud.crafting.craft": "Chế tạo", - "hud.crafting.tool_cata": "Yêu cầu:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Yêu cầu:", - "hud.crafting.anvil": "Đe", - "hud.crafting.cauldron": "Vạc", - "hud.crafting.cooking_pot": "Nồi Nấu Ăn", - "hud.crafting.crafting_bench": "Bàn Chế Tạo", - "hud.crafting.forge": "Lò Rèn", - "hud.crafting.loom": "Khung Cửi", - "hud.crafting.spinning_wheel": "Guồng Se Sợi", - "hud.crafting.tanning_rack": "Giá Thuộc Da", - // Tabs - "hud.crafting.tabs.all": "Tất cả", - "hud.crafting.tabs.armor": "Giáp", - "hud.crafting.tabs.dismantle": "Tái Chế", - "hud.crafting.tabs.food": "Thức Ăn", - "hud.crafting.tabs.glider": "Dù Lượn", - "hud.crafting.tabs.potion": "Thuốc", - "hud.crafting.tabs.tool": "Dụng Cụ", - "hud.crafting.tabs.utility": "Khác", - "hud.crafting.tabs.weapon": "Vũ Khí", - "hud.crafting.tabs.bag": "Túi", - "hud.crafting.tabs.processed_material": "Vật Liệu", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/group.ftl b/assets/voxygen/i18n/vi_VI/hud/group.ftl new file mode 100644 index 0000000000..f9b4e6c568 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Nhóm +hud-group-invite_to_join = [{ $name }] đã mời bạn vào nhóm! +hud-group-invite_to_trade = [{ $name }] muốn giao dịch với bạn. +hud-group-invite = Mời +hud-group-kick = Đuổi +hud-group-assign_leader = Trưởng Nhóm +hud-group-leave = Rời Nhóm +hud-group-dead = Đã Chết +hud-group-out_of_range = Ngoài Phạm Vi +hud-group-add_friend = Thêm Bạn +hud-group-link_group = Các Nhóm Liên Kết +hud-group-in_menu = Trong Menu +hud-group-members = Thành Viên \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/group.ron b/assets/voxygen/i18n/vi_VI/hud/group.ron deleted file mode 100644 index 3da867b590..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/group.ron +++ /dev/null @@ -1,25 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "hud.group": "Nhóm", - "hud.group.invite_to_join": "[{name}] đã mời bạn vào nhóm!", - "hud.group.invite_to_trade": "[{name}] muốn giao dịch với bạn.", - "hud.group.invite": "Mời", - "hud.group.kick": "Đuổi", - "hud.group.assign_leader": "Trưởng Nhóm", - "hud.group.leave": "Rời Nhóm", - "hud.group.dead" : "Đã Chết", - "hud.group.out_of_range": "Ngoài Phạm Vi", - "hud.group.add_friend": "Thêm Bạn", - "hud.group.link_group": "Các Nhóm Liên Kết", - "hud.group.in_menu": "Trong Menu", - "hud.group.members": "Thành Viên", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/vi_VI/hud/map.ftl b/assets/voxygen/i18n/vi_VI/hud/map.ftl new file mode 100644 index 0000000000..e11978ec3b --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/map.ftl @@ -0,0 +1,31 @@ +hud-map-map_title = Bản đồ +hud-map-qlog_title = Nhiệm vụ +hud-map-topo_map = Địa hình +hud-map-difficulty = Độ khó +hud-map-towns = Thị trấn +hud-map-castles = Lâu đài +hud-map-dungeons = Hầm ngục +hud-map-caves = Hang động +hud-map-cave = Hang động +hud-map-peaks = Núi +hud-map-voxel_map = Bản đồ Voxel +hud-map-trees = Cây đại thụ +hud-map-tree = Cây đại thụ +hud-map-town = Thị trấn +hud-map-castle = Lâu đài +hud-map-dungeon = Hầm ngục +hud-map-difficulty_dungeon = + Hầm ngục + + Độ khó: { $difficulty } +hud-map-drag = Kéo thả +hud-map-zoom = Phóng to +hud-map-mid_click = Đặt Waypoint +hud-map-recenter = Căn giữa +hud-map-marked_location = Địa điểm đã đánh dấu +hud-map-marked_location_remove = Nhấp để xóa +hud-map-change_map_mode = Đổi kiểu bản đồ +hud-map-toggle_minimap_voxel = Bật tắt Minimap Voxel +hud-map-zoom_minimap_explanation = + Phóng to minimap để xem + khu vực quanh bạn chi tiết hơn \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/map.ron b/assets/voxygen/i18n/vi_VI/hud/map.ron deleted file mode 100644 index 45d490a189..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/map.ron +++ /dev/null @@ -1,38 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Bản đồ", - "hud.map.qlog_title": "Nhiệm vụ", - "hud.map.topo_map": "Địa hình", - "hud.map.difficulty": "Độ khó", - "hud.map.towns": "Thị trấn", - "hud.map.castles": "Lâu đài", - "hud.map.dungeons": "Hầm ngục", - "hud.map.caves": "Hang động", - "hud.map.cave": "Hang động", - "hud.map.peaks": "Núi", - "hud.map.voxel_map": "Bản đồ Voxel", - "hud.map.trees": "Cây đại thụ", - "hud.map.tree": "Cây đại thụ", - "hud.map.town": "Thị trấn", - "hud.map.castle": "Lâu đài", - "hud.map.dungeon": "Hầm ngục", - "hud.map.difficulty_dungeon": "Hầm ngục\n\nĐộ khó: {difficulty}", - "hud.map.drag": "Kéo thả", - "hud.map.zoom": "Phóng to", - "hud.map.mid_click": "Đặt Waypoint", - "hud.map.recenter": "Căn giữa", - "hud.map.marked_location": "Địa điểm đã đánh dấu", - "hud.map.marked_location_remove": "Nhấp để xóa", - "hud.map.change_map_mode": "Đổi kiểu bản đồ", - "hud.map.toggle_minimap_voxel": "Bật tắt Minimap Voxel", - "hud.map.zoom_minimap_explanation": "Phóng to minimap để xem\nkhu vực quanh bạn chi tiết hơn", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/misc.ftl b/assets/voxygen/i18n/vi_VI/hud/misc.ftl new file mode 100644 index 0000000000..e61c182152 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/misc.ftl @@ -0,0 +1,33 @@ +hud-do_not_show_on_startup = Không hiển thị lúc Khởi động +hud-show_tips = Hiển Thị Mẹo +hud-quests = Nhiệm Vụ +hud-you_died = Bạn Đã Chết +hud-waypoint_saved = Waypoint Đã Được Lưu +hud-inventory_full = Kho Đồ Đầy +hud-press_key_to_show_keybindings_fmt = [{ $key }] Phím tắt +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Đèn +hud-press_key_to_show_debug_info_fmt = Nhấn phím { $key } để hiển thị thông tin gỡ lỗi +hud-press_key_to_toggle_keybindings_fmt = Nhấn phím { $key } để bật tắt phím tắt +hud-press_key_to_toggle_debug_info_fmt = Nhấn phím { $key } để bật tắt thông tin gỡ lỗi +hud-press_key_to_respawn = Nhấn phím { $key } để hồi sinh tại đống lửa trại cuối cùng mà bạn ghé thăm. +hud-tutorial_btn = Hướng dẫn +hud-tutorial_click_here = Nhấn phím [ { $key } ] để hiện con trỏ chuột và nhấp vào nút này! +hud-tutorial_elements = Chế tạo +hud-temp_quest_headline = Xin Chào Lữ Khách! +hud-temp_quest_text = + Để bắt đầu hành trình, bạn có thể xem qua ngôi làng này và thu thập một số vật phẩm hữu ích. + + Cứ lấy bất cứ thứ gì bạn cần! + + Nhìn vào góc phải bên dưới của màn hình để tìm những mục khác như túi đồ, menu chế tạo và bản đồ. + + Các trạm chế tạo cho phép bạn tạo áo giáp, vũ khí, thức ăn và nhiều thứ khác! + + Những con động vật hoang dã quanh thị trấn là nguồn cung cấp da tuyệt vời để tạo ra những món đồ bảo hộ cho bạn khỏi những nguy hiểm của thế giới bên ngoài. + + Khi bạn cảm thấy đã sẵn sàng, hãy thử tìm những trang bị tốt hơn từ rất nhiều những thử thách đã được đánh dấu trên bản đồ! +hud-spell = Phép +hud-diary = Nhật ký +hud-free_look_indicator = Chế độ quan sát tự do kích hoạt. Nhấn phím { $key } để tắt. +hud-camera_clamp_indicator = Cố định máy quay dọc kích hoạt. Nhấn phím { $key } để tắt. +hud-auto_walk_indicator = Tự động đi/bơi kích hoạt \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/misc.ron b/assets/voxygen/i18n/vi_VI/hud/misc.ron deleted file mode 100644 index 771fa3f0a6..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/misc.ron +++ /dev/null @@ -1,54 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "hud.do_not_show_on_startup": "Không hiển thị lúc Khởi động", - "hud.show_tips": "Hiển Thị Mẹo", - "hud.quests": "Nhiệm Vụ", - "hud.you_died": "Bạn Đã Chết", - "hud.waypoint_saved": "Waypoint Đã Được Lưu", - // "hud.sp_arrow_txt": "SP", - "hud.inventory_full": "Kho Đồ Đầy", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Phím tắt", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Đèn", - "hud.press_key_to_show_debug_info_fmt": "Nhấn phím {key} để hiển thị thông tin gỡ lỗi", - "hud.press_key_to_toggle_keybindings_fmt": "Nhấn phím {key} để bật tắt phím tắt", - "hud.press_key_to_toggle_debug_info_fmt": "Nhấn phím {key} để bật tắt thông tin gỡ lỗi", - - // Respawn message - "hud.press_key_to_respawn": r#"Nhấn phím {key} để hồi sinh tại đống lửa trại cuối cùng mà bạn ghé thăm."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Hướng dẫn"#, - "hud.tutorial_click_here": r#"Nhấn phím [ {key} ] để hiện con trỏ chuột và nhấp vào nút này!"#, - "hud.tutorial_elements": r#"Chế tạo"#, - -"hud.temp_quest_headline": r#"Xin Chào Lữ Khách!"#, -"hud.temp_quest_text": r#"Để bắt đầu hành trình, bạn có thể xem qua ngôi làng này và thu thập một số vật phẩm hữu ích. - -Cứ lấy bất cứ thứ gì bạn cần! - -Nhìn vào góc phải bên dưới của màn hình để tìm những mục khác như túi đồ, menu chế tạo và bản đồ. - -Các trạm chế tạo cho phép bạn tạo áo giáp, vũ khí, thức ăn và nhiều thứ khác! - -Những con động vật hoang dã quanh thị trấn là nguồn cung cấp da tuyệt vời để tạo ra những món đồ bảo hộ cho bạn khỏi những nguy hiểm của thế giới bên ngoài. - -Khi bạn cảm thấy đã sẵn sàng, hãy thử tìm những trang bị tốt hơn từ rất nhiều những thử thách đã được đánh dấu trên bản đồ! -"#, - - "hud.spell": "Phép", - // Diary - "hud.diary": "Nhật ký", - - "hud.free_look_indicator": "Chế độ quan sát tự do kích hoạt. Nhấn phím {key} để tắt.", - "hud.camera_clamp_indicator": "Cố định máy quay dọc kích hoạt. Nhấn phím {key} để tắt.", - "hud.auto_walk_indicator": "Tự động đi/bơi kích hoạt", - }, - - - vector_map: { - } -) \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/sct.ftl b/assets/voxygen/i18n/vi_VI/hud/sct.ftl new file mode 100644 index 0000000000..1233cc061f --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BỊ CHẶN \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/sct.ron b/assets/voxygen/i18n/vi_VI/hud/sct.ron deleted file mode 100644 index c23fffed48..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BỊ CHẶN", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/settings.ftl b/assets/voxygen/i18n/vi_VI/hud/settings.ftl new file mode 100644 index 0000000000..a22357f814 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/settings.ftl @@ -0,0 +1,109 @@ +hud-settings-general = Cài đặt chung +hud-settings-none = Không +hud-settings-press_behavior-toggle = Bật/Tắt +hud-settings-press_behavior-hold = Giữ +hud-settings-help_window = Cửa sổ giúp đỡ +hud-settings-debug_info = Thông tin gỡ lỗi +hud-settings-show_hitboxes = Hiện hitboxes +hud-settings-show_chat = Hiện trò chuyện +hud-settings-tips_on_startup = Mẹo khi khởi động +hud-settings-ui_scale = Tỉ Lệ Giao Diện +hud-settings-relative_scaling = Tỉ lệ cân xứng +hud-settings-custom_scaling = Tỉ lệ tùy chỉnh +hud-settings-crosshair = Con trỏ +hud-settings-opacity = Độ mờ +hud-settings-toggle_shortcuts = Bật/Tắt phím tắt +hud-settings-buffs_skillbar = Buffs tại thanh kỹ năng +hud-settings-buffs_mmap = Buffs tại Minimap +hud-settings-toggle_bar_experience = Bật tắt thanh kinh nghiệm +hud-settings-scrolling_combat_text = Thông Tin Chiến Đấu +hud-settings-incoming_damage = Sát thương nhận phải +hud-settings-speech_bubble = Bong Bóng Thoại +hud-settings-speech_bubble_dark_mode = Chế độ tối màu +hud-settings-speech_bubble_icon = Biểu tượng bong bóng thoại +hud-settings-energybar_numbers = Giá Trị Thanh Năng Lượng +hud-settings-always_show_bars = Luôn hiển thị thanh Năng Lượng +hud-settings-values = Số +hud-settings-percentages = Tỷ lệ phần trăm +hud-settings-chat = Trò chuyện +hud-settings-background_opacity = Nền mờ +hud-settings-chat_character_name = Hiện tên nhân vật khi trò chuyện +hud-settings-loading_tips = Hiện Thị Mẹo Tại Màn Hình Chờ +hud-settings-reset_interface = Thiết lập mặc định +hud-settings-pan_sensitivity = Độ nhạy xoay +hud-settings-zoom_sensitivity = Độ nhạy thu phóng +hud-settings-camera_clamp_angle = Góc cố định máy quay dọc +hud-settings-invert_scroll_zoom = + Đảo ngược thu phóng + khi cuộn chuột +hud-settings-invert_mouse_y_axis = + Đảo ngược trục Y + của chuột +hud-settings-invert_controller_y_axis = + Đảo ngược trục Y + của tay cầm +hud-settings-enable_mouse_smoothing = Làm mượt máy quay +hud-settings-free_look_behavior = Quan sát tự do +hud-settings-auto_walk_behavior = Tự động đi bộ +hud-settings-camera_clamp_behavior = Cố định máy quay +hud-settings-player_physics_behavior = Player physics (thử nghiệm) +hud-settings-stop_auto_walk_on_input = Dừng tự động đi bộ khi di chuyển +hud-settings-auto_camera = Máy quay tự động +hud-settings-reset_gameplay = Thiết lập mặc định +hud-settings-view_distance = Tầm nhìn xa +hud-settings-sprites_view_distance = Tầm nhìn xa Sprites +hud-settings-figures_view_distance = Tầm nhìn xa Entities +hud-settings-maximum_fps = FPS tối đa +hud-settings-ambiance = Độ sáng môi trường +hud-settings-antialiasing_mode = Chế độ khử răng cưa +hud-settings-cloud_rendering_mode = Chế độ render mây +hud-settings-fluid_rendering_mode = Chế độ render chất lỏng +hud-settings-fluid_rendering_mode-cheap = Kém +hud-settings-fluid_rendering_mode-shiny = Long lanh +hud-settings-cloud_rendering_mode-minimal = Tối thiểu +hud-settings-cloud_rendering_mode-low = Thấp +hud-settings-cloud_rendering_mode-medium = Trung bình +hud-settings-cloud_rendering_mode-high = Cao +hud-settings-cloud_rendering_mode-ultra = Rất cao +hud-settings-fullscreen = Toàn màn hình +hud-settings-fullscreen_mode = Chế độ toàn màn hình +hud-settings-fullscreen_mode-borderless = Không viền +hud-settings-gpu_profiler = Bật bộ đếm thời gian GPU (không phải luôn hỗ trợ) +hud-settings-resolution = Độ phân giải +hud-settings-refresh_rate = Tốc Độ Refresh +hud-settings-lighting_rendering_mode = Chế độ ánh sáng +hud-settings-lighting_rendering_mode-ashikhmin = Kiểu A - Cao +hud-settings-lighting_rendering_mode-blinnphong = Kiểu B - Trung bình +hud-settings-lighting_rendering_mode-lambertian = Kiểu L - Kém +hud-settings-shadow_rendering_mode = Chế độ bóng +hud-settings-shadow_rendering_mode-none = Không +hud-settings-shadow_rendering_mode-cheap = Kém +hud-settings-shadow_rendering_mode-map = Bản đồ +hud-settings-shadow_rendering_mode-map-resolution = Độ phân giải +hud-settings-lod_detail = Chi tiết LoD +hud-settings-save_window_size = Lưu kích thước cửa sổ +hud-settings-reset_graphics = Thiết lập mặc định +hud-settings-master_volume = Âm lượng tổng +hud-settings-inactive_master_volume_perc = Âm lượng cửa sổ không kích hoạt +hud-settings-music_volume = Âm lượng nhạc +hud-settings-sound_effect_volume = Âm lượng hiệu ứng +hud-settings-audio_device = Thiết bị âm thanh +hud-settings-reset_sound = Thiết lập mặc định +hud-settings-english_fallback = Hiển thị tiếng Anh cho những đoạn dịch bị thiếu +hud-settings-awaitingkey = Nhấn một phím bất kỳ... +hud-settings-unbound = Không +hud-settings-reset_keybinds = Thiết lập mặc định +hud-settings-chat_tabs = Tab trò chuyện +hud-settings-label = Nhãn: +hud-settings-delete = Xóa +hud-settings-show_all = Hiển thị tất cả +hud-settings-messages = Tin nhắn +hud-settings-activity = Hoạt động +hud-settings-death = Chết +hud-settings-group = Nhóm +hud-settings-world = Thế giới +hud-settings-region = Vùng +hud-settings-say = Nói +hud-settings-all = Tất cả +hud-settings-group_only = Chỉ nhóm +hud-settings-reset_chat = Thiết lập mặc định \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/settings.ron b/assets/voxygen/i18n/vi_VI/hud/settings.ron deleted file mode 100644 index db00a4317d..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/settings.ron +++ /dev/null @@ -1,136 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Settings - "hud.settings.general": "Cài đặt chung", - "hud.settings.none": "Không", - "hud.settings.press_behavior.toggle": "Bật/Tắt", - "hud.settings.press_behavior.hold": "Giữ", - "hud.settings.help_window": "Cửa sổ giúp đỡ", - "hud.settings.debug_info": "Thông tin gỡ lỗi", - "hud.settings.show_hitboxes": "Hiện hitboxes", - "hud.settings.show_chat": "Hiện trò chuyện", - "hud.settings.tips_on_startup": "Mẹo khi khởi động", - "hud.settings.ui_scale": "Tỉ Lệ Giao Diện", - "hud.settings.relative_scaling": "Tỉ lệ cân xứng", - "hud.settings.custom_scaling": "Tỉ lệ tùy chỉnh", - "hud.settings.crosshair": "Con trỏ", - "hud.settings.opacity": "Độ mờ", - // "hud.settings.hotbar": "Hotbar", - "hud.settings.toggle_shortcuts": "Bật/Tắt phím tắt", - "hud.settings.buffs_skillbar": "Buffs tại thanh kỹ năng", - "hud.settings.buffs_mmap": "Buffs tại Minimap", - "hud.settings.toggle_bar_experience": "Bật tắt thanh kinh nghiệm", - "hud.settings.scrolling_combat_text": "Thông Tin Chiến Đấu", - "hud.settings.incoming_damage": "Sát thương nhận phải", - "hud.settings.speech_bubble": "Bong Bóng Thoại", - "hud.settings.speech_bubble_dark_mode": "Chế độ tối màu", - "hud.settings.speech_bubble_icon": "Biểu tượng bong bóng thoại", - "hud.settings.energybar_numbers": "Giá Trị Thanh Năng Lượng", - "hud.settings.always_show_bars": "Luôn hiển thị thanh Năng Lượng", - "hud.settings.values": "Số", - "hud.settings.percentages": "Tỷ lệ phần trăm", - "hud.settings.chat": "Trò chuyện", - "hud.settings.background_opacity": "Nền mờ", - "hud.settings.chat_character_name": "Hiện tên nhân vật khi trò chuyện", - "hud.settings.loading_tips": "Hiện Thị Mẹo Tại Màn Hình Chờ", - "hud.settings.reset_interface": "Thiết lập mặc định", - - "hud.settings.pan_sensitivity": "Độ nhạy xoay", - "hud.settings.zoom_sensitivity": "Độ nhạy thu phóng", - "hud.settings.camera_clamp_angle": "Góc cố định máy quay dọc", - "hud.settings.invert_scroll_zoom": "Đảo ngược thu phóng\nkhi cuộn chuột", - "hud.settings.invert_mouse_y_axis": "Đảo ngược trục Y\ncủa chuột", - "hud.settings.invert_controller_y_axis": "Đảo ngược trục Y\ncủa tay cầm", - "hud.settings.enable_mouse_smoothing": "Làm mượt máy quay", - "hud.settings.free_look_behavior": "Quan sát tự do", - "hud.settings.auto_walk_behavior": "Tự động đi bộ", - "hud.settings.camera_clamp_behavior": "Cố định máy quay", - "hud.settings.player_physics_behavior": "Player physics (thử nghiệm)", - "hud.settings.stop_auto_walk_on_input": "Dừng tự động đi bộ khi di chuyển", - "hud.settings.auto_camera": "Máy quay tự động", - "hud.settings.reset_gameplay": "Thiết lập mặc định", - - "hud.settings.view_distance": "Tầm nhìn xa", - "hud.settings.sprites_view_distance": "Tầm nhìn xa Sprites", - "hud.settings.figures_view_distance": "Tầm nhìn xa Entities", - "hud.settings.maximum_fps": "FPS tối đa", - // "hud.settings.present_mode": "Present Mode", - // "hud.settings.present_mode.fifo": "Fifo", - // "hud.settings.present_mode.mailbox": "Mailbox", - // "hud.settings.present_mode.immediate": "Immediate", - // "hud.settings.fov": "Field of View (deg)", - // "hud.settings.gamma": "Gamma", - // "hud.settings.exposure": "Exposure", - "hud.settings.ambiance": "Độ sáng môi trường", - "hud.settings.antialiasing_mode": "Chế độ khử răng cưa", - // "hud.settings.upscale_factor": "Internal Resolution", - "hud.settings.cloud_rendering_mode": "Chế độ render mây", - "hud.settings.fluid_rendering_mode": "Chế độ render chất lỏng", - "hud.settings.fluid_rendering_mode.cheap": "Kém", - "hud.settings.fluid_rendering_mode.shiny": "Long lanh", - "hud.settings.cloud_rendering_mode.minimal": "Tối thiểu", - "hud.settings.cloud_rendering_mode.low": "Thấp", - "hud.settings.cloud_rendering_mode.medium": "Trung bình", - "hud.settings.cloud_rendering_mode.high": "Cao", - "hud.settings.cloud_rendering_mode.ultra": "Rất cao", - "hud.settings.fullscreen": "Toàn màn hình", - "hud.settings.fullscreen_mode": "Chế độ toàn màn hình", - // "hud.settings.fullscreen_mode.exclusive": "Exclusive", - "hud.settings.fullscreen_mode.borderless": "Không viền", - "hud.settings.gpu_profiler": "Bật bộ đếm thời gian GPU (không phải luôn hỗ trợ)", - // "hud.settings.particles": "Particles", - // "hud.settings.lossy_terrain_compression": "Lossy terrain compression", - "hud.settings.resolution": "Độ phân giải", - // "hud.settings.bit_depth": "Bit Depth", - "hud.settings.refresh_rate": "Tốc Độ Refresh", - "hud.settings.lighting_rendering_mode": "Chế độ ánh sáng", - "hud.settings.lighting_rendering_mode.ashikhmin": "Kiểu A - Cao ", - "hud.settings.lighting_rendering_mode.blinnphong": "Kiểu B - Trung bình", - "hud.settings.lighting_rendering_mode.lambertian": "Kiểu L - Kém", - "hud.settings.shadow_rendering_mode": "Chế độ bóng", - "hud.settings.shadow_rendering_mode.none": "Không", - "hud.settings.shadow_rendering_mode.cheap": "Kém", - "hud.settings.shadow_rendering_mode.map": "Bản đồ", - "hud.settings.shadow_rendering_mode.map.resolution": "Độ phân giải", - "hud.settings.lod_detail": "Chi tiết LoD", - "hud.settings.save_window_size": "Lưu kích thước cửa sổ", - "hud.settings.reset_graphics": "Thiết lập mặc định", - // "hud.settings.bloom": "Bloom", - - "hud.settings.master_volume": "Âm lượng tổng", - "hud.settings.inactive_master_volume_perc": "Âm lượng cửa sổ không kích hoạt", - "hud.settings.music_volume": "Âm lượng nhạc", - "hud.settings.sound_effect_volume": "Âm lượng hiệu ứng", - "hud.settings.audio_device": "Thiết bị âm thanh", - "hud.settings.reset_sound": "Thiết lập mặc định", - - "hud.settings.english_fallback": "Hiển thị tiếng Anh cho những đoạn dịch bị thiếu", - - "hud.settings.awaitingkey": "Nhấn một phím bất kỳ...", - "hud.settings.unbound": "Không", - "hud.settings.reset_keybinds": "Thiết lập mặc định", - - "hud.settings.chat_tabs": "Tab trò chuyện", - "hud.settings.label": "Nhãn:", - "hud.settings.delete": "Xóa", - "hud.settings.show_all": "Hiển thị tất cả", - "hud.settings.messages": "Tin nhắn", - "hud.settings.activity": "Hoạt động", - "hud.settings.death": "Chết", - "hud.settings.group": "Nhóm", - // "hud.settings.faction": "Faction", - "hud.settings.world": "Thế giới", - "hud.settings.region": "Vùng", - "hud.settings.say": "Nói", - "hud.settings.all": "Tất cả", - "hud.settings.group_only": "Chỉ nhóm", - "hud.settings.reset_chat" : "Thiết lập mặc định", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/skills.ftl b/assets/voxygen/i18n/vi_VI/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/vi_VI/hud/skills.ron b/assets/voxygen/i18n/vi_VI/hud/skills.ron deleted file mode 100644 index 81584383c1..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/skills.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/vi_VI/hud/social.ftl b/assets/voxygen/i18n/vi_VI/hud/social.ftl new file mode 100644 index 0000000000..0847ea9994 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/social.ftl @@ -0,0 +1,8 @@ +hud-social = Người Chơi Khác +hud-social-online = Trực tuyến: +hud-social-friends = Bạn bè +hud-social-not_yet_available = Chưa khả dụng +hud-social-play_online_fmt = { $nb_player } người chơi trực tuyến +hud-social-name = Tên +hud-social-level = Cấp độ +hud-social-account = Tài khoản \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/social.ron b/assets/voxygen/i18n/vi_VI/hud/social.ron deleted file mode 100644 index e30d79458b..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/social.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "hud.social": "Người Chơi Khác", - "hud.social.online": "Trực tuyến:", - "hud.social.friends": "Bạn bè", - "hud.social.not_yet_available": "Chưa khả dụng", - // "hud.social.faction": "Faction", - "hud.social.play_online_fmt": "{nb_player} người chơi trực tuyến", - "hud.social.name": "Tên", - "hud.social.level": "Cấp độ", - // "hud.social.zone": "Zone", - "hud.social.account": "Tài khoản", - }, - - - vector_map: { - } -) \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/trade.ftl b/assets/voxygen/i18n/vi_VI/hud/trade.ftl new file mode 100644 index 0000000000..d0a7919980 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/hud/trade.ftl @@ -0,0 +1,25 @@ +hud-trade-trade_window = Giao Dịch +hud-trade-phase1_description = + Kéo vật phẩm bạn muốn giao dịch + vào khu vực tương ứng. +hud-trade-phase2_description = + Giao dịch hiện đã bị khóa để cho bạn + thời gian để xem lại. +hud-trade-phase3_description = Giao dịch đang được xử lý. +hud-trade-persons_offer = Đề nghị của { $playername } +hud-trade-has_accepted = + { $playername } + đã chấp nhận +hud-trade-accept = Chấp nhận +hud-trade-decline = Từ chối +hud-trade-invite_sent = Yêu cầu giao dịch đã được gửi cho { $playername }. +hud-trade-result-completed = Giao dịch thành công. +hud-trade-result-declined = Giao dịch bị từ chối. +hud-trade-result-nospace = Không đủ không gian để hoàn tất giao dịch. +hud-trade-buy_price = Giá mua +hud-trade-sell_price = Giá bán +hud-trade-coin = đồng +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Đề nghị của bạn +hud-trade-their_offer = Đề nghị của họ \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/hud/trade.ron b/assets/voxygen/i18n/vi_VI/hud/trade.ron deleted file mode 100644 index cfc2fec1ad..0000000000 --- a/assets/voxygen/i18n/vi_VI/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "hud.trade.trade_window": "Giao Dịch", - "hud.trade.phase1_description": "Kéo vật phẩm bạn muốn giao dịch\n vào khu vực tương ứng.", - "hud.trade.phase2_description": "Giao dịch hiện đã bị khóa để cho bạn\n thời gian để xem lại.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Giao dịch đang được xử lý.", - "hud.trade.persons_offer": "Đề nghị của {playername}", - "hud.trade.has_accepted": "{playername}\nđã chấp nhận", - "hud.trade.accept": "Chấp nhận", - "hud.trade.decline": "Từ chối", - "hud.trade.invite_sent": "Yêu cầu giao dịch đã được gửi cho {playername}.", - "hud.trade.result.completed": "Giao dịch thành công.", - "hud.trade.result.declined": "Giao dịch bị từ chối.", - "hud.trade.result.nospace": "Không đủ không gian để hoàn tất giao dịch.", - "hud.trade.buy_price": "Giá mua", - "hud.trade.sell_price": "Giá bán", - "hud.trade.coin": "đồng", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Đề nghị của bạn", - "hud.trade.their_offer": "Đề nghị của họ", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/vi_VI/main.ftl b/assets/voxygen/i18n/vi_VI/main.ftl new file mode 100644 index 0000000000..7a043d1161 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/main.ftl @@ -0,0 +1,77 @@ +main-username = Tên tài khoản +main-server = Máy chủ +main-password = Mật khẩu +main-connecting = Đang kết nối +main-creating_world = Đang tạo thế giới mới +main-tip = Mẹo: +main-notice = + Chào mừng đến với Veloren phiên bản alpha! + + Trước khi bạn bắt đầu chơi Veloren, bạn cần chú ý những điều sau: + + - Đây là một phiên bản alpha chưa hoàn thiện. Trò chơi còn nhiều lỗi, cơ chế và tính năng cũng còn nhiều thiết sót. + + - Nếu bạn muốn phản hồi hoặc báo lỗi, hãy liên hệ với chúng tôi trên Reddit, GitLab, hoặc trên Discord của chúng tôi. + + - Veloren được cấp phép theo giấy phép GPL 3 open-source. Có nghĩa là bạn được phép chơi miễn phí, sửa đổi, và phân phối lại trò chơi theo cách bạn muốn (miễn là nó cũng theo giấy phép GPL 3). + + - Veloren là một dự án cộng đồng phi lợi nhuận, mọi người cùng tình nguyện đóng góp. Nếu bạn thích, hãy tham gia đội phát triển hoặc đội mỹ thuật của chúng tôi! + + Cảm ơn bạn đã dành thời gian đọc thông báo này, chúng tôi hy vọng bạn thích trò chơi này! + + ~ The Veloren Devs +main-login_process = + Thông tin về quá trình đăng nhập: + + Xin lưu ý rằng bạn cần có tài khoản + để chơi trên máy chủ được xác thực. + + Bạn có thể tạo một tài khoản tại + + + https://veloren.net/account/. +main-login-server_not_found = Không tìm thấy máy chủ +main-login-authentication_error = Lỗi xác thực trên máy chủ +main-login-internal_error = Lỗi client (có vẻ nhân vật của người chơi đã bị xóa) +main-login-failed_auth_server_url_invalid = Không thể kết nối tới máy chủ +main-login-insecure_auth_scheme = Xác thực qua HTTP KHÔNG được hỗ trợ vì thiếu bảo mật! HTTP chỉ dành cho mục đích phát triển với 'localhost' hoặc các bản build gỡ lỗi +main-login-server_full = Máy chủ đã đầy +main-login-untrusted_auth_server = Máy chủ xác thực không đáng tin cậy +main-login-outdated_client_or_server = ServerWentMad: Có thể do phiên bản không tương thích, hãy thử cập nhật. +main-login-timeout = Hết giờ: máy chủ không phản hồi kịp thời. (quá tải hoặc lỗi mạng). +main-login-server_shut_down = Máy chủ ngừng hoạt động +main-login-network_error = Lỗi mạng +main-login-network_wrong_version = Phiên bản không tương thích với máy chủ, vui lòng cập nhật game. +main-login-failed_sending_request = Gửi yêu cầu đến máy chủ xác thực không thành công +main-login-invalid_character = Ký tự không hợp lệ +main-login-client_crashed = Trò chơi đã bị crash +main-login-not_on_whitelist = Bạn cần được quản trị viên chấp thuận để tham gia +main-login-banned = Bạn đã bị cấm với lý do +main-login-kicked = Bạn đã bị đuổi với lý do +main-login-select_language = Chọn ngôn ngữ +main-login-client_version = Phiên bản máy khách +main-login-server_version = Phiên bản máy chủ +main-servers-select_server = Chọn máy chủ +loading-tips = + .a0 = Nhấn phím '{ $gameinput-togglelantern }' để bật đèn. + .a1 = Nhấn '{ $gameinput-help }' để xem tất cả các phím tắt mặc định. + .a2 = Bạn có thể gõ /say hoặc /s để chỉ nói chuyện với người chơi xung quanh. + .a3 = Bạn có thể gõ /region hoặc /r để chỉ nói chuyện với người chơi trong khoảng vài trăm blocks xung quanh bạn. + .a4 = Quản trị viên có thể sử dụng /build để vào chế độ xây dựng. + .a5 = Bạn có thể gõ /group hoặc /g để chỉ nói chuyện với những người chơi trong nhóm hiện tại. + .a6 = Để gửi tin nhắn riêng tư gõ /tell theo sau là tên người chơi và tin nhắn của bạn. + .a7 = Để ý thức ăn, rương và các chiến lợi phẩm khác nằm rải rác khắp thế giới! + .a8 = Kho chứa đầy thực phẩm? Hãy thử chế biến những món ăn ngon hơn từ chúng! + .a9 = Không biết làm gì? Thử một trong những hầm ngục được đánh dấu trên bản đồ! + .a10 = Đừng quên điều chỉnh đồ họa cho máy của bạn. Nhấn '{ $gameinput-settings }' để mở cài đặt. + .a11 = Chơi vui hơn khi có bạn! Nhấn '{ $gameinput-social }' để xem ai đang trực tuyến. + .a12 = Kẻ thù có đầu lâu bên dưới thanh máu mạnh hơn so với chính bạn. + .a13 = Nhấn '{ $gameinput-dance }' để nhảy múa. Quẩy lên! + .a14 = Nhấn '{ $gameinput-glide }' để bật dù lượn và chinh phục bầu trời. + .a15 = Veloren vẫn đang trong giai đoạn Pre-Alpha. Chúng tôi đang cố gắng hết sức để cải thiện nó mỗi ngày! + .a16 = Nếu bạn muốn tham gia nhóm phát triển hoặc chỉ đơn giản là trò chuyện, hãy tham gia Discord-Server. + .a17 = Bạn có thể thay đổi hiển thị lượng máu của mình trên thanh máu trong cài đặt. + .a18 = Để xem chỉ số của bạn, hãy nhấn vào nút 'Stats' trong kho. + .a19 = Ngồi gần lửa trại (nhấn nút '{ $gameinput-sit }') để nghỉ ngơi - hồi máu chậm theo thời gian. + .a20 = Cần thêm túi hoặc áo giáp tốt hơn để tiếp tục cuộc hành trình? Nhấn nút '{ $gameinput-crafting }' để mở menu chế tạo! + .a21 = Hãy thử nhảy lên trong khi đang lăn qua một sinh vật nào đó. \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/main.ron b/assets/voxygen/i18n/vi_VI/main.ron deleted file mode 100644 index a7b6a4ae3d..0000000000 --- a/assets/voxygen/i18n/vi_VI/main.ron +++ /dev/null @@ -1,92 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - "main.username": "Tên tài khoản", - "main.server": "Máy chủ", - "main.password": "Mật khẩu", - "main.connecting": "Đang kết nối", - "main.creating_world": "Đang tạo thế giới mới", - "main.tip": "Mẹo:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Chào mừng đến với Veloren phiên bản alpha! - -Trước khi bạn bắt đầu chơi Veloren, bạn cần chú ý những điều sau: - -- Đây là một phiên bản alpha chưa hoàn thiện. Trò chơi còn nhiều lỗi, cơ chế và tính năng cũng còn nhiều thiết sót. - -- Nếu bạn muốn phản hồi hoặc báo lỗi, hãy liên hệ với chúng tôi trên Reddit, GitLab, hoặc trên Discord của chúng tôi. - -- Veloren được cấp phép theo giấy phép GPL 3 open-source. Có nghĩa là bạn được phép chơi miễn phí, sửa đổi, và phân phối lại trò chơi theo cách bạn muốn (miễn là nó cũng theo giấy phép GPL 3). - -- Veloren là một dự án cộng đồng phi lợi nhuận, mọi người cùng tình nguyện đóng góp. Nếu bạn thích, hãy tham gia đội phát triển hoặc đội mỹ thuật của chúng tôi! - -Cảm ơn bạn đã dành thời gian đọc thông báo này, chúng tôi hy vọng bạn thích trò chơi này! - -~ The Veloren Devs"#, - - // Login process description - "main.login_process": r#"Thông tin về quá trình đăng nhập: - -Xin lưu ý rằng bạn cần có tài khoản -để chơi trên máy chủ được xác thực. - -Bạn có thể tạo một tài khoản tại - - -https://veloren.net/account/."#, - "main.login.server_not_found": "Không tìm thấy máy chủ", - "main.login.authentication_error": "Lỗi xác thực trên máy chủ", - "main.login.internal_error": "Lỗi client (có vẻ nhân vật của người chơi đã bị xóa)", - "main.login.failed_auth_server_url_invalid": "Không thể kết nối tới máy chủ", - "main.login.insecure_auth_scheme": "Xác thực qua HTTP KHÔNG được hỗ trợ vì thiếu bảo mật! HTTP chỉ dành cho mục đích phát triển với 'localhost' hoặc các bản build gỡ lỗi", - "main.login.server_full": "Máy chủ đã đầy", - "main.login.untrusted_auth_server": "Máy chủ xác thực không đáng tin cậy", - "main.login.outdated_client_or_server": "ServerWentMad: Có thể do phiên bản không tương thích, hãy thử cập nhật.", - "main.login.timeout": "Hết giờ: máy chủ không phản hồi kịp thời. (quá tải hoặc lỗi mạng).", - "main.login.server_shut_down": "Máy chủ ngừng hoạt động", - "main.login.network_error": "Lỗi mạng", - "main.login.network_wrong_version": "Phiên bản không tương thích với máy chủ, vui lòng cập nhật game.", - "main.login.failed_sending_request": "Gửi yêu cầu đến máy chủ xác thực không thành công", - "main.login.invalid_character": "Ký tự không hợp lệ", - "main.login.client_crashed": "Trò chơi đã bị crash", - "main.login.not_on_whitelist": "Bạn cần được quản trị viên chấp thuận để tham gia", - "main.login.banned": "Bạn đã bị cấm với lý do", - "main.login.kicked": "Bạn đã bị đuổi với lý do", - "main.login.select_language": "Chọn ngôn ngữ", - "main.login.client_version": "Phiên bản máy khách", - "main.login.server_version": "Phiên bản máy chủ", - "main.servers.select_server": "Chọn máy chủ", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "Nhấn phím '{gameinput.togglelantern}' để bật đèn.", - "Nhấn '{gameinput.help}' để xem tất cả các phím tắt mặc định.", - "Bạn có thể gõ /say hoặc /s để chỉ nói chuyện với người chơi xung quanh.", - "Bạn có thể gõ /region hoặc /r để chỉ nói chuyện với người chơi trong khoảng vài trăm blocks xung quanh bạn.", - "Quản trị viên có thể sử dụng /build để vào chế độ xây dựng.", - "Bạn có thể gõ /group hoặc /g để chỉ nói chuyện với những người chơi trong nhóm hiện tại.", - "Để gửi tin nhắn riêng tư gõ /tell theo sau là tên người chơi và tin nhắn của bạn.", - "Để ý thức ăn, rương và các chiến lợi phẩm khác nằm rải rác khắp thế giới!", - "Kho chứa đầy thực phẩm? Hãy thử chế biến những món ăn ngon hơn từ chúng!", - "Không biết làm gì? Thử một trong những hầm ngục được đánh dấu trên bản đồ!", - "Đừng quên điều chỉnh đồ họa cho máy của bạn. Nhấn '{gameinput.settings}' để mở cài đặt.", - "Chơi vui hơn khi có bạn! Nhấn '{gameinput.social}' để xem ai đang trực tuyến.", - "Kẻ thù có đầu lâu bên dưới thanh máu mạnh hơn so với chính bạn.", - "Nhấn '{gameinput.dance}' để nhảy múa. Quẩy lên!", - "Nhấn '{gameinput.glide}' để bật dù lượn và chinh phục bầu trời.", - "Veloren vẫn đang trong giai đoạn Pre-Alpha. Chúng tôi đang cố gắng hết sức để cải thiện nó mỗi ngày!", - "Nếu bạn muốn tham gia nhóm phát triển hoặc chỉ đơn giản là trò chuyện, hãy tham gia Discord-Server.", - "Bạn có thể thay đổi hiển thị lượng máu của mình trên thanh máu trong cài đặt.", - "Để xem chỉ số của bạn, hãy nhấn vào nút 'Stats' trong kho.", - "Ngồi gần lửa trại (nhấn nút '{gameinput.sit}') để nghỉ ngơi - hồi máu chậm theo thời gian.", - "Cần thêm túi hoặc áo giáp tốt hơn để tiếp tục cuộc hành trình? Nhấn nút '{gameinput.crafting}' để mở menu chế tạo!", - "Hãy thử nhảy lên trong khi đang lăn qua một sinh vật nào đó.", - ], - } -) diff --git a/assets/voxygen/i18n/vi_VI/npc.ftl b/assets/voxygen/i18n/vi_VI/npc.ftl new file mode 100644 index 0000000000..894c837ab6 --- /dev/null +++ b/assets/voxygen/i18n/vi_VI/npc.ftl @@ -0,0 +1,153 @@ +npc-speech-villager = + .a0 = Trời hôm nay đẹp thật + .a1 = Dạo này khỏe không? + .a2 = Không biết con Catoblepas nghĩ gì khi nó ăn cỏ nhỉ. + .a3 = Cậu thấy thời tiết hôm nay thế nào? + .a4 = Cứ nhắc tới hầm ngục là tôi lại thấy sợ. Mong là có người sớm dẹp được chúng. + .a5 = Tôi sẽ đi khám phá một cái hang nào đó khi tôi mạnh hơn. + .a6 = Cậu có nhìn thấy con mèo của tôi đâu không? + .a7 = Cậu đã bao giờ nghe về những con Cá Mập Cạn hung dữ chưa? Thấy bảo chúng sống ở sa mạc đấy. + .a8 = Người ta đồn rằng có thể tìm thấy đủ loại đá quý trên đời trong những hang động. + .a9 = Lại đây nào. Chúng tôi đang chuẩn bị ăn pho mát! + .a10 = Mọi người bảo ăn nấm tốt lắm. Nhưng tôi chưa thử bao giờ. + .a11 = Tôi rất thích pho mát của người lùn. Ước gì tôi tự làm được nó. + .a12 = Không biết phía bên kia ngọn núi có gì nhỉ. + .a13 = Tôi hy vọng một ngày nào đó sẽ tự làm được cho mình một cái dù lượn. + .a14 = Cậu có muốn thăm vườn nhà tôi không? Được rồi, để khi khác vậy. + .a15 = Một ngày tuyệt vời để đi dạo trong rừng! + .a16 = Tồn tại hay không tồn tại! Tôi nghĩ tôi sẽ làm một nông dân. + .a17 = Cậu không nghĩ rằng làng của chúng tôi là tốt nhất à? + .a18 = Cậu nghĩ thứ gì khiến Glowing Remains phát sáng? + .a19 = Đến lúc cho bữa sáng thứ hai rồi! + .a20 = Cậu đã bắt được đom đóm bao giờ chưa? + .a21 = Tôi không thể hiểu nổi lũ Saurok cứ liên tục kéo đến từ đâu. + .a22 = Ước gì có ai đó đuổi hết lũ sói đi. + .a23 = Đêm qua tôi có một giấc mơ tuyệt vời về pho mát. Liệu có điềm gì được nhỉ? + .a24 = Ai đó nên xử lý với bọn cultist. Nhưng không phải tôi. + .a25 = Mong là trời sắp mưa. Cây trồng mới tốt tươi + .a26 = Tôi thích mật ong lắm! Nhưng tôi ghét ong. + .a27 = Một ngày nào đó tôi sẽ đi và ngắm nhìn thế giới này. +npc-speech-villager_decline_trade = + .a0 = Xin lỗi, tôi không có gì để giao dịch. + .a1 = Giao dịch á? Trông tôi có thứ gì cậu cần à. + .a2 = Đây là nhà của tôi, tôi không đổi nó cho bất kỳ cái gì cả. +npc-speech-merchant_advertisement = + .a0 = Xin chào. Bạn có chút thời gian để giao dịch chứ? + .a1 = Bạn có muốn mua bán gì không? + .a2 = Tôi có rất nhiều vật phẩm tốt. Có muốn xem qua không? +npc-speech-merchant_busy = + .a0 = Đợi tới lượt đi bạn ơi. + .a1 = Đợi tí đi, tôi có phải ba đầu sáu tay đâu mà. + .a2 = Không thấy phía trước đang có người đợi à? + .a3 = Đợi chút, sắp xong rồi. + .a4 = Vui lòng không chen ngang. + .a5 = Đang bận quá, lát nữa quay lại nhé. +npc-speech-merchant_trade_successful = + .a0 = Rất vui được giao dịch với cậu! + .a1 = Cảm ơn! +npc-speech-merchant_trade_declined = + .a0 = Để khi khác vậy. Chúc một ngày tốt lành! + .a1 = Tệ quá, lúc khác nhé! +npc-speech-villager_cultist_alarm = + .a0 = Coi chừng! Bọn cultist! + .a1 = Sẵn sàng! Lũ cultist đang tấn công! + .a2 = Sao lũ cultist các người dám tấn công làng! + .a3 = Chết đi lũ cultist! + .a4 = Lũ cultist sẽ không được tha thứ ở đây! + .a5 = Cultist sát nhân! + .a6 = Ăn kiếm của ta đi này, lũ cultist bẩn thỉu! + .a7 = Không thứ gì có thể gột sạch máu trên tay ngươi, cultist! + .a8 = Tội ác của lũ cultist sẽ chấm dứt tại đây! + .a9 = Tên cultist này là của ta! + .a10 = Tôi thấy một tên cultist! Bắt hắn! + .a11 = Tôi thấy một tên cultist! Tấn công! + .a12 = Tôi thấy một tên cultist! Đừng để hắn thoát! + .a13 = Không thể tha thứ! Không thể bỏ qua! Cultist, hối lỗi đi! + .a14 = Chết đi, cultist! + .a15 = Đây! Cái giá phải trả cho tất cả những gì nhà ngươi đã làm! + .a16 = Chúng ta không nhân nhượng với loại các ngươi quanh đây. + .a17 = Lũ các người lẽ ra nên yên vị dưới lòng đất! +npc-speech-villager_under_attack = + .a0 = Cứu, tôi đang bị tấn công! + .a1 = Cứu, tôi đang bị tấn công! + .a2 = Ouch! Tôi đang bị tấn công! + .a3 = Ouch! Tôi đang bị tấn công! Cứu! + .a4 = Cứu tôi! Tôi đang bị tấn công! + .a5 = Tôi đang bị tấn công! Cứu! + .a6 = Tôi đang bị tấn công! Cứu tôi với! + .a7 = Cứu tôi với! + .a8 = Cứu! Cứu! + .a9 = Cứu! Cứu! Cứu tôi với! + .a10 = Tôi đang bị tấn công! + .a11 = AAAHHH! Tôi đang bị tấn công! + .a12 = AAAHHH! Tôi đang bị tấn công! Cứu! + .a13 = Cứu! Chúng tôi đang bị tấn công! + .a14 = Cứu! Có kẻ giết người! + .a15 = Cứu! Có kẻ giết người ở đây! + .a16 = Cứu! Chúng đang cố giết tôi! + .a17 = Lính canh, tôi đang bị tấn công! + .a18 = Lính canh, tôi đang bị tấn công! + .a19 = Tôi đang bị tấn công! Lính canh! + .a20 = Cứu! Lính canh! Tôi đang bị tấn công! + .a21 = Lính canh! Đến đây nhanh! + .a22 = Lính canh! Lính canh! + .a23 = Lính canh! Có kẻ xấu tấn công tôi! + .a24 = Lính canh, giết kẻ xấu xa này đi! + .a25 = Lính canh! Có kẻ giết người! + .a26 = Lính canh! Cứu tôi với! + .a27 = Người đừng hòng thoát được khỏi chuyện này! Lính canh! + .a28 = Đồ ác ôn! + .a29 = Cứu tôi với! + .a30 = Cứu với! Làm ơn! + .a31 = Ouch! Lính canh! Cứu! + .a32 = Chúng đang nhắm tới tôi! + .a33 = Cứu! Cứu! Tôi đang bị chèn ép! + .a34 = Dừng tay lại! + .a35 = Ta đã làm gì ngươi?! + .a36 = Làm ơn đừng đánh tôi nữa! + .a37 = Này! Nhà ngươi đang chĩa về ai đấy! + .a38 = Dừng lại! Cút đi! + .a39 = Giờ ngươi làm ta điên lên rồi đấy! + .a40 = Oi! Ngươi nghĩ ngươi là ai?! + .a41 = Làm ơn dừng lại! Tôi không có đồ gì giá trị cả! + .a42 = Tôi sẽ bảo anh tôi xử lý cậu, anh ấy to hơn tôi nhiều! + .a43 = Khônggg, Tôi đi mách mẹ! + .a44 = Làm ơn đừng làm thế mà. + .a45 = Làm thế là không tốt! + .a46 = Vũ khí xịn đấy, giờ thì cất đi được rồi! + .a47 = Tha cho tôi! + .a48 = Làm ơn, tôi còn gia đình phải lo! + .a49 = Tôi còn quá trẻ. Tôi không muốn chết! + .a50 = Chúng ta nói chuyện chút được không? + .a51 = Bạo lực không giải quyết được điều gì! + .a52 = Hôm nay đã biến thành một ngày tồi tệ... + .a53 = Này, đau đấy! + .a54 = Eek! + .a55 = Làm vậy là thô lỗ lắm đấy! + .a56 = Dừng lại đi, tôi cầu xin cậu! + .a57 = Không vui đâu. + .a58 = Sao ngươi dám?! + .a59 = Ngươi sẽ phải trả giá cho chuyện này! + .a60 = Cứ làm đi rồi hối hận! + .a61 = Đừng để tôi phải đánh cậu! + .a62 = Chắc là có hiểu lầm gì rồi! + .a63 = Cậu không cần phải làm thế này! + .a64 = Cút đi, tên ác ôn! + .a65 = Đau thật đấy! + .a66 = Sao cậu lại làm thế? + .a67 = Chắc cậu nhận nhầm người rồi! + .a68 = Tôi không đáng bị thế này! + .a69 = Làm ơn đừng làm thế nữa. + .a70 = Lính canh, ném tên quái vật này xuống hồ đi! + .a71 = Sao lại là tôi? +npc-speech-villager_enemy_killed = + .a0 = Tôi đã tiêu diệt kẻ thù của mình! + .a1 = Cuối cùng thì cũng bình yên! + .a2 = ... cơ nãy đang làm gì ấy nhỉ? +npc-speech-menacing = + .a0 = Ta cảnh báo ngươi! + .a1 = Tiến tới một bước nữa thôi thì đừng trách! + .a2 = Đừng hòng dọa ta! + .a3 = Biến khỏi đây ngay! + .a4 = Quay đầu lại nếu ngươi còn muốn sống! + .a5 = Nhà ngươi không được chào đón ở đây! \ No newline at end of file diff --git a/assets/voxygen/i18n/vi_VI/npc.ron b/assets/voxygen/i18n/vi_VI/npc.ron deleted file mode 100644 index ee9fcb2a52..0000000000 --- a/assets/voxygen/i18n/vi_VI/npc.ron +++ /dev/null @@ -1,189 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Vietnamese (Vietnam) -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "Trời hôm nay đẹp thật", - "Dạo này khỏe không?", - // "Top of the morning to you!", - "Không biết con Catoblepas nghĩ gì khi nó ăn cỏ nhỉ.", - "Cậu thấy thời tiết hôm nay thế nào?", - "Cứ nhắc tới hầm ngục là tôi lại thấy sợ. Mong là có người sớm dẹp được chúng.", - "Tôi sẽ đi khám phá một cái hang nào đó khi tôi mạnh hơn.", - "Cậu có nhìn thấy con mèo của tôi đâu không?", - "Cậu đã bao giờ nghe về những con Cá Mập Cạn hung dữ chưa? Thấy bảo chúng sống ở sa mạc đấy.", - "Người ta đồn rằng có thể tìm thấy đủ loại đá quý trên đời trong những hang động.", - // "I'm just crackers about cheese!", - "Lại đây nào. Chúng tôi đang chuẩn bị ăn pho mát!", - "Mọi người bảo ăn nấm tốt lắm. Nhưng tôi chưa thử bao giờ.", - // "Don't forget the crackers!", - "Tôi rất thích pho mát của người lùn. Ước gì tôi tự làm được nó.", - "Không biết phía bên kia ngọn núi có gì nhỉ.", - "Tôi hy vọng một ngày nào đó sẽ tự làm được cho mình một cái dù lượn.", - "Cậu có muốn thăm vườn nhà tôi không? Được rồi, để khi khác vậy.", - "Một ngày tuyệt vời để đi dạo trong rừng!", - "Tồn tại hay không tồn tại! Tôi nghĩ tôi sẽ làm một nông dân.", - "Cậu không nghĩ rằng làng của chúng tôi là tốt nhất à?", - "Cậu nghĩ thứ gì khiến Glowing Remains phát sáng?", - "Đến lúc cho bữa sáng thứ hai rồi!", - "Cậu đã bắt được đom đóm bao giờ chưa?", - "Tôi không thể hiểu nổi lũ Saurok cứ liên tục kéo đến từ đâu.", - "Ước gì có ai đó đuổi hết lũ sói đi.", - "Đêm qua tôi có một giấc mơ tuyệt vời về pho mát. Liệu có điềm gì được nhỉ?", - "Ai đó nên xử lý với bọn cultist. Nhưng không phải tôi.", - "Mong là trời sắp mưa. Cây trồng mới tốt tươi", - "Tôi thích mật ong lắm! Nhưng tôi ghét ong.", - "Một ngày nào đó tôi sẽ đi và ngắm nhìn thế giới này.", - ], - "npc.speech.villager_decline_trade": [ - "Xin lỗi, tôi không có gì để giao dịch.", - "Giao dịch á? Trông tôi có thứ gì cậu cần à.", - "Đây là nhà của tôi, tôi không đổi nó cho bất kỳ cái gì cả.", - ], - "npc.speech.merchant_advertisement": [ - "Xin chào. Bạn có chút thời gian để giao dịch chứ?", - "Bạn có muốn mua bán gì không?", - "Tôi có rất nhiều vật phẩm tốt. Có muốn xem qua không?" - ], - "npc.speech.merchant_busy": [ - "Đợi tới lượt đi bạn ơi.", - "Đợi tí đi, tôi có phải ba đầu sáu tay đâu mà.", - "Không thấy phía trước đang có người đợi à?", - "Đợi chút, sắp xong rồi.", - "Vui lòng không chen ngang.", - "Đang bận quá, lát nữa quay lại nhé." - ], - "npc.speech.merchant_trade_successful": [ - "Rất vui được giao dịch với cậu!", - "Cảm ơn!", - ], - "npc.speech.merchant_trade_declined": [ - "Để khi khác vậy. Chúc một ngày tốt lành!", - "Tệ quá, lúc khác nhé!" - ], - "npc.speech.villager_cultist_alarm": [ - "Coi chừng! Bọn cultist!", - "Sẵn sàng! Lũ cultist đang tấn công!", - "Sao lũ cultist các người dám tấn công làng!", - "Chết đi lũ cultist!", - "Lũ cultist sẽ không được tha thứ ở đây!", - "Cultist sát nhân!", - "Ăn kiếm của ta đi này, lũ cultist bẩn thỉu!", - "Không thứ gì có thể gột sạch máu trên tay ngươi, cultist!", - // "Billions of blistering blue barnacles! Có một tên cultist trong chúng ta!", - "Tội ác của lũ cultist sẽ chấm dứt tại đây!", - "Tên cultist này là của ta!", - // "Prepare to meet your maker, foul cultist!", - "Tôi thấy một tên cultist! Bắt hắn!", - "Tôi thấy một tên cultist! Tấn công!", - "Tôi thấy một tên cultist! Đừng để hắn thoát!", - // "Would the most honorable cultist care for some DEATH?!", - "Không thể tha thứ! Không thể bỏ qua! Cultist, hối lỗi đi!", - "Chết đi, cultist!", - // "Your reign of terror will seize!", - "Đây! Cái giá phải trả cho tất cả những gì nhà ngươi đã làm!", - "Chúng ta không nhân nhượng với loại các ngươi quanh đây.", - "Lũ các người lẽ ra nên yên vị dưới lòng đất!", - ], - "npc.speech.villager_under_attack": [ - "Cứu, tôi đang bị tấn công!", - "Cứu, tôi đang bị tấn công!", - "Ouch! Tôi đang bị tấn công!", - "Ouch! Tôi đang bị tấn công! Cứu!", - "Cứu tôi! Tôi đang bị tấn công!", - "Tôi đang bị tấn công! Cứu!", - "Tôi đang bị tấn công! Cứu tôi với!", - "Cứu tôi với!", - "Cứu! Cứu!", - "Cứu! Cứu! Cứu tôi với!", - "Tôi đang bị tấn công!", - "AAAHHH! Tôi đang bị tấn công!", - "AAAHHH! Tôi đang bị tấn công! Cứu!", - "Cứu! Chúng tôi đang bị tấn công!", - "Cứu! Có kẻ giết người!", - "Cứu! Có kẻ giết người ở đây!", - "Cứu! Chúng đang cố giết tôi!", - "Lính canh, tôi đang bị tấn công!", - "Lính canh, tôi đang bị tấn công!", - "Tôi đang bị tấn công! Lính canh!", - "Cứu! Lính canh! Tôi đang bị tấn công!", - "Lính canh! Đến đây nhanh!", - "Lính canh! Lính canh!", - "Lính canh! Có kẻ xấu tấn công tôi!", - "Lính canh, giết kẻ xấu xa này đi!", - "Lính canh! Có kẻ giết người!", - "Lính canh! Cứu tôi với!", - "Người đừng hòng thoát được khỏi chuyện này! Lính canh!", - "Đồ ác ôn!", - "Cứu tôi với!", - "Cứu với! Làm ơn!", - "Ouch! Lính canh! Cứu!", - "Chúng đang nhắm tới tôi!", - "Cứu! Cứu! Tôi đang bị chèn ép!", - //"Ah, now we see the violence inherent in the system.", - //"'Tis but a scratch!", - "Dừng tay lại!", - "Ta đã làm gì ngươi?!", - "Làm ơn đừng đánh tôi nữa!", - "Này! Nhà ngươi đang chĩa về ai đấy!", - //"Heinous wretch, be gone with you!", - "Dừng lại! Cút đi!", - "Giờ ngươi làm ta điên lên rồi đấy!", - "Oi! Ngươi nghĩ ngươi là ai?!", - //"I'll have your head for that!", - "Làm ơn dừng lại! Tôi không có đồ gì giá trị cả!", - "Tôi sẽ bảo anh tôi xử lý cậu, anh ấy to hơn tôi nhiều!", - "Khônggg, Tôi đi mách mẹ!", - // "Curse you!", - "Làm ơn đừng làm thế mà.", - "Làm thế là không tốt!", - "Vũ khí xịn đấy, giờ thì cất đi được rồi!", - "Tha cho tôi!", - "Làm ơn, tôi còn gia đình phải lo!", - "Tôi còn quá trẻ. Tôi không muốn chết!", - "Chúng ta nói chuyện chút được không?", - "Bạo lực không giải quyết được điều gì!", - "Hôm nay đã biến thành một ngày tồi tệ...", - "Này, đau đấy!", - "Eek!", - "Làm vậy là thô lỗ lắm đấy!", - "Dừng lại đi, tôi cầu xin cậu!", - // "A pox upon you!", - "Không vui đâu.", - "Sao ngươi dám?!", - "Ngươi sẽ phải trả giá cho chuyện này!", - "Cứ làm đi rồi hối hận!", - "Đừng để tôi phải đánh cậu!", - "Chắc là có hiểu lầm gì rồi!", - "Cậu không cần phải làm thế này!", - "Cút đi, tên ác ôn!", - "Đau thật đấy!", - "Sao cậu lại làm thế?", - // "By the spirits, cease!", - "Chắc cậu nhận nhầm người rồi!", - "Tôi không đáng bị thế này!", - "Làm ơn đừng làm thế nữa.", - "Lính canh, ném tên quái vật này xuống hồ đi!", - // "I'll set my tarasque on you!", - "Sao lại là tôi?", - ], - "npc.speech.villager_enemy_killed": [ - "Tôi đã tiêu diệt kẻ thù của mình!", - "Cuối cùng thì cũng bình yên!", - "... cơ nãy đang làm gì ấy nhỉ?", - ], - "npc.speech.menacing": [ - "Ta cảnh báo ngươi!", - "Tiến tới một bước nữa thôi thì đừng trách!", - "Đừng hòng dọa ta!", - "Biến khỏi đây ngay!", - "Quay đầu lại nếu ngươi còn muốn sống!", - "Nhà ngươi không được chào đón ở đây!", - ], - } -) diff --git a/assets/voxygen/i18n/zh_CN/buff.ftl b/assets/voxygen/i18n/zh_CN/buff.ftl new file mode 100644 index 0000000000..0af1bbcf15 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/buff.ftl @@ -0,0 +1,25 @@ +buff-remove = 点击删除 +buff-title-missing = 缺少标题 +buff-desc-missing = 缺少说明 +buff-title-heal = 治愈 +buff-desc-heal = 一定时间内生命值随缓慢恢复. +buff-title-potion = 药水 +buff-desc-potion = 吨吨吨... +buff-title-saturation = 饱腹 +buff-desc-saturation = 吃饱喝足后,一定时间内生命值随缓慢恢复. +buff-title-campfire_heal = 篝火疗愈 +buff-desc-campfire_heal = 在篝火旁休息每秒可治愈{ $rate }%生命. +buff-title-invulnerability = 无敌 +buff-desc-invulnerability = 你不会受到任何攻击的伤害. +buff-title-protectingward = 守护领域 +buff-desc-protectingward = 有股力量在守护着你,一定时间内防御得到显著提升. +buff-title-bleed = 流血 +buff-desc-bleed = 造成定期伤害. +buff-title-cursed = 诅咒 +buff-desc-cursed = 你被诅咒了. +buff-stat-health = 总共恢复 { $str_total } 点生命值 +buff-stat-increase_max_energy = 提高{ $strength }点耐力值上限 +buff-stat-increase_max_health = 提高{ $strength }点生命值上限 +buff-stat-invulnerability = 获得无敌状态 +buff-text-over_seconds = { $dur_secs } 秒后结束 +buff-text-for_seconds = 持续 { $dur_secs } 秒 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/buff.ron b/assets/voxygen/i18n/zh_CN/buff.ron deleted file mode 100644 index 7efc477e8f..0000000000 --- a/assets/voxygen/i18n/zh_CN/buff.ron +++ /dev/null @@ -1,40 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // Buffs - "buff.remove": "点击删除", - "buff.title.missing": "缺少标题", - "buff.desc.missing": "缺少说明", - "buff.title.heal": "治愈", - "buff.desc.heal": "一定时间内生命值随缓慢恢复.", - "buff.title.potion": "药水", - "buff.desc.potion": "吨吨吨...", - "buff.title.saturation": "饱腹", - "buff.desc.saturation": "吃饱喝足后,一定时间内生命值随缓慢恢复.", - "buff.title.campfire_heal": "篝火疗愈", - "buff.desc.campfire_heal": "在篝火旁休息每秒可治愈{rate}%生命.", - "buff.title.invulnerability": "无敌", - "buff.desc.invulnerability": "你不会受到任何攻击的伤害.", - "buff.title.protectingward": "守护领域", - "buff.desc.protectingward": "有股力量在守护着你,一定时间内防御得到显著提升.", - // Debuffs - "buff.title.bleed": "流血", - "buff.desc.bleed": "造成定期伤害.", - "buff.title.cursed": "诅咒", - "buff.desc.cursed": "你被诅咒了.", - // Buffs stats - "buff.stat.health": "总共恢复 {str_total} 点生命值", - "buff.stat.increase_max_energy": "提高{strength}点耐力值上限 ", - "buff.stat.increase_max_health": "提高{strength}点生命值上限", - "buff.stat.invulnerability": "获得无敌状态", - // Text - "buff.text.over_seconds": "{dur_secs} 秒后结束", - "buff.text.for_seconds": "持续 {dur_secs} 秒", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/char_selection.ftl b/assets/voxygen/i18n/zh_CN/char_selection.ftl new file mode 100644 index 0000000000..ce91eec8ab --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/char_selection.ftl @@ -0,0 +1,21 @@ +char_selection-loading_characters = 加载人物中... +char_selection-delete_permanently = 确定永久删除此角色? +char_selection-deleting_character = 删除角色中... +char_selection-change_server = 切换服务器 +char_selection-enter_world = 进入世界 +char_selection-logout = 登出 +char_selection-create_new_character = 创建新的角色 +char_selection-creating_character = 创建角色中... +char_selection-character_creation = 创建角色 +char_selection-human_default = 普通人类 +char_selection-level_fmt = 等级 { $level_nb } +char_selection-uncanny_valley = 荒野 +char_selection-plains_of_uncertainty = 谜之平原 +char_selection-beard = 胡须 +char_selection-hair_style = 发型 +char_selection-hair_color = 发色 +char_selection-eye_color = 眼睛颜色 +char_selection-skin = 肤色 +char_selection-eyeshape = 眼睛形状 +char_selection-accessories = 配饰 +char_selection-create_info_name = 你的角色需要一个名字! \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/char_selection.ron b/assets/voxygen/i18n/zh_CN/char_selection.ron deleted file mode 100644 index 50eeba02af..0000000000 --- a/assets/voxygen/i18n/zh_CN/char_selection.ron +++ /dev/null @@ -1,31 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "char_selection.loading_characters": "加载人物中...", - "char_selection.delete_permanently": "确定永久删除此角色?", - "char_selection.deleting_character": "删除角色中...", - "char_selection.change_server": "切换服务器", - "char_selection.enter_world": "进入世界", - "char_selection.logout": "登出", - "char_selection.create_new_character": "创建新的角色", - "char_selection.creating_character": "创建角色中...", - "char_selection.character_creation": "创建角色", - "char_selection.human_default": "普通人类", - "char_selection.level_fmt": "等级 {level_nb}", - "char_selection.uncanny_valley": "荒野", - "char_selection.plains_of_uncertainty": "谜之平原", - "char_selection.beard": "胡须", - "char_selection.hair_style": "发型", - "char_selection.hair_color": "发色", - "char_selection.eye_color": "眼睛颜色", - "char_selection.skin": "肤色", - "char_selection.eyeshape": "眼睛形状", - "char_selection.accessories": "配饰", - "char_selection.create_info_name": "你的角色需要一个名字!", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/common.ftl b/assets/voxygen/i18n/zh_CN/common.ftl new file mode 100644 index 0000000000..683c75f984 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/common.ftl @@ -0,0 +1,86 @@ +common-username = 用户名 +common-singleplayer = 单人游戏 +common-multiplayer = 多人游戏 +common-servers = 服务器 +common-quit = 退出 +common-settings = 设置 +common-languages = 语言 +common-interface = 界面 +common-gameplay = 游戏 +common-controls = 控制 +common-video = 图像 +common-sound = 声音 +common-resume = 继续 +common-characters = 角色 +common-close = 关闭 +common-yes = 是 +common-no = 否 +common-back = 返回 +common-create = 创建 +common-okay = 好 +common-add = 添加 +common-accept = 同意 +common-decline = 拒绝 +common-disclaimer = 免责声明 +common-cancel = 返回 +common-none = 无 +common-error = 错误 +common-fatal_error = 致命错误 +common-you = 你 +common-automatic = 自动 +common-random = 随机 +common-empty = 空的 +common-interface_settings = 界面设置 +common-gameplay_settings = 游戏设置 +common-controls_settings = 控制设置 +common-video_settings = 图像设置 +common-sound_settings = 声音设置 +common-language_settings = 语言设置 +common-connection_lost = + 连接丢失! + 服务器是否重启? + 客户端是否更新? +common-species-orc = 兽人 +common-species-human = 人类 +common-species-dwarf = 矮人 +common-species-elf = 精灵 +common-species-draugr = 亡灵 +common-species-danari = 丹那利 +common-weapons-axe = 斧 +common-weapons-sword = 剑 +common-weapons-staff = 法杖 +common-weapons-bow = 弓 +common-weapons-hammer = 锤 +common-weapons-general = 通用 +common-weapons-sceptre = 权杖 +common-weapons-shield = 盾 +common-weapons-spear = 矛 +common-weapons-hammer_simple = 简易锤 +common-weapons-sword_simple = 简易剑 +common-weapons-staff_simple = 简易法杖 +common-weapons-axe_simple = 简易斧 +common-weapons-bow_simple = 简易弓 +common-weapons-unique = 独特 +common-tool-debug = Debug +common-tool-farming = 农具 +common-tool-pick = 镐子 +common-kind-modular_component = 模块化组件 +common-kind-glider = 滑翔伞 +common-kind-consumable = 消耗品 +common-kind-throwable = 垃圾 +common-kind-utility = 道具 +common-kind-ingredient = 配料 +common-kind-lantern = 提灯 +common-hands-one = 单手 +common-hands-two = 双手 +common-rand_appearance = 随机外观 +common-rand_name = 随机名称 +common-stats-combat_rating = 战力 +common-stats-power = 威力 +common-stats-speed = 速度 +common-stats-poise = 法力/耐力回复 +common-stats-crit_chance = 暴击率 +common-stats-crit_mult = 暴击倍率 +common-stats-armor = 护甲 +common-stats-poise_res = 韧性 +common-stats-slots = 栏位 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/common.ron b/assets/voxygen/i18n/zh_CN/common.ron deleted file mode 100644 index d4af06041c..0000000000 --- a/assets/voxygen/i18n/zh_CN/common.ron +++ /dev/null @@ -1,106 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "用户名", - "common.singleplayer": "单人游戏", - "common.multiplayer": "多人游戏", - "common.servers": "服务器", - "common.quit": "退出", - "common.settings": "设置", - "common.languages": "语言", - "common.interface": "界面", - "common.gameplay": "游戏", - "common.controls": "控制", - "common.video": "图像", - "common.sound": "声音", - "common.resume": "继续", - "common.characters": "角色", - "common.close": "关闭", - "common.yes": "是", - "common.no": "否", - "common.back": "返回", - "common.create": "创建", - "common.okay": "好", - "common.add": "添加", - "common.accept": "同意", - "common.decline": "拒绝", - "common.disclaimer": "免责声明", - "common.cancel": "返回", - "common.none": "无", - "common.error": "错误", - "common.fatal_error": "致命错误", - "common.you": "你", - "common.automatic": "自动", - "common.random": "随机", - "common.empty": "空的", - - // Settings Window title - "common.interface_settings": "界面设置", - "common.gameplay_settings": "游戏设置", - "common.controls_settings": "控制设置", - "common.video_settings": "图像设置", - "common.sound_settings": "声音设置", - "common.language_settings": "语言设置", - - // Message when connection to the server is lost - "common.connection_lost": r#"连接丢失! -服务器是否重启? -客户端是否更新?"#, - - - "common.species.orc": "兽人", - "common.species.human": "人类", - "common.species.dwarf": "矮人", - "common.species.elf": "精灵", - "common.species.draugr": "亡灵", - "common.species.danari": "丹那利", - - "common.weapons.axe": "斧", - "common.weapons.sword": "剑", - "common.weapons.staff": "法杖", - "common.weapons.bow": "弓", - "common.weapons.hammer": "锤", - "common.weapons.general": "通用", - "common.weapons.sceptre": "权杖", - "common.weapons.shield": "盾", - "common.weapons.spear": "矛", - "common.weapons.hammer_simple": "简易锤", - "common.weapons.sword_simple": "简易剑", - "common.weapons.staff_simple": "简易法杖", - "common.weapons.axe_simple": "简易斧", - "common.weapons.bow_simple": "简易弓", - "common.weapons.unique": "独特", - "common.tool.debug": "Debug", - "common.tool.farming": "农具", - "common.tool.pick": "镐子", - "common.kind.modular_component": "模块化组件", - "common.kind.glider": "滑翔伞", - "common.kind.consumable": "消耗品", - "common.kind.throwable": "垃圾", - "common.kind.utility": "道具", - "common.kind.ingredient": "配料", - "common.kind.lantern": "提灯", - "common.hands.one": "单手", - "common.hands.two": "双手", - - "common.rand_appearance": "随机外观", - "common.rand_name": "随机名称", - - "common.stats.combat_rating": "战力", - "common.stats.power": "威力", - "common.stats.speed": "速度", - "common.stats.poise": "法力/耐力回复", - "common.stats.crit_chance": "暴击率", - "common.stats.crit_mult": "暴击倍率", - "common.stats.armor": "护甲", - "common.stats.poise_res": "韧性", - "common.stats.slots": "栏位", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/esc_menu.ftl b/assets/voxygen/i18n/zh_CN/esc_menu.ftl new file mode 100644 index 0000000000..8c6a4a4470 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = 登出 +esc_menu-quit_game = 退出游戏 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/esc_menu.ron b/assets/voxygen/i18n/zh_CN/esc_menu.ron deleted file mode 100644 index f62798070c..0000000000 --- a/assets/voxygen/i18n/zh_CN/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "esc_menu.logout": "登出", - "esc_menu.quit_game": "退出游戏", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/gameinput.ftl b/assets/voxygen/i18n/zh_CN/gameinput.ftl new file mode 100644 index 0000000000..67e40943d4 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/gameinput.ftl @@ -0,0 +1,60 @@ +gameinput-primary = 普通攻击 +gameinput-secondary = 特殊攻击/格挡/瞄准 +gameinput-slot1 = 快捷栏 1 +gameinput-slot2 = 快捷栏 2 +gameinput-slot3 = 快捷栏 3 +gameinput-slot4 = 快捷栏 4 +gameinput-slot5 = 快捷栏 5 +gameinput-slot6 = 快捷栏 6 +gameinput-slot7 = 快捷栏 7 +gameinput-slot8 = 快捷栏 8 +gameinput-slot9 = 快捷栏 9 +gameinput-slot10 = 快捷栏 10 +gameinput-swaploadout = 切换武器 +gameinput-togglecursor = 切换显示指针 +gameinput-help = 切换帮助窗口 +gameinput-toggleinterface = 切换显示界面 +gameinput-toggledebug = 切换FPS和调试信息 +gameinput-screenshot = 截图 +gameinput-toggleingameui = 切换名称标签 +gameinput-fullscreen = 切换全屏 +gameinput-moveforward = 前进 +gameinput-moveleft = 左移 +gameinput-moveright = 右移 +gameinput-moveback = 后退 +gameinput-jump = 跳跃 +gameinput-glide = 滑翔 +gameinput-roll = 翻滚 +gameinput-climb = 攀爬 +gameinput-climbdown = 爬下 +gameinput-wallleap = 蹬墙 +gameinput-togglelantern = 切换提灯 +gameinput-mount = 骑乘 +gameinput-chat = 聊天 +gameinput-command = 指令 +gameinput-escape = 退出 +gameinput-map = 地图 +gameinput-bag = 背包 +gameinput-trade = 交易 +gameinput-social = 社交 +gameinput-sit = 坐下 +gameinput-spellbook = 法术 +gameinput-settings = 设置 +gameinput-respawn = 重生 +gameinput-charge = 冲锋 +gameinput-togglewield = 切换手持 +gameinput-interact = 交互 +gameinput-freelook = 自由视角 +gameinput-autowalk = 自动 行走/滑翔 +gameinput-cameraclamp = 锁定视角 +gameinput-dance = 跳舞 +gameinput-select = 选择实体 +gameinput-acceptgroupinvite = 接受队伍邀请 +gameinput-declinegroupinvite = 拒绝队伍邀请 +gameinput-cyclecamera = 切换视角 +gameinput-crafting = 制作 +gameinput-fly = 飞行 +gameinput-sneak = 潜行 +gameinput-swimdown = 下潜 +gameinput-swimup = 上浮 +gameinput-greet = 打招呼 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/gameinput.ron b/assets/voxygen/i18n/zh_CN/gameinput.ron deleted file mode 100644 index 8e01d0f451..0000000000 --- a/assets/voxygen/i18n/zh_CN/gameinput.ron +++ /dev/null @@ -1,71 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "gameinput.primary": "普通攻击", - "gameinput.secondary": "特殊攻击/格挡/瞄准", - "gameinput.slot1": "快捷栏 1", - "gameinput.slot2": "快捷栏 2", - "gameinput.slot3": "快捷栏 3", - "gameinput.slot4": "快捷栏 4", - "gameinput.slot5": "快捷栏 5", - "gameinput.slot6": "快捷栏 6", - "gameinput.slot7": "快捷栏 7", - "gameinput.slot8": "快捷栏 8", - "gameinput.slot9": "快捷栏 9", - "gameinput.slot10": "快捷栏 10", - "gameinput.swaploadout": "切换武器", - "gameinput.togglecursor": "切换显示指针", - "gameinput.help": "切换帮助窗口", - "gameinput.toggleinterface": "切换显示界面", - "gameinput.toggledebug": "切换FPS和调试信息", - "gameinput.screenshot": "截图", - "gameinput.toggleingameui": "切换名称标签", - "gameinput.fullscreen": "切换全屏", - "gameinput.moveforward": "前进", - "gameinput.moveleft": "左移", - "gameinput.moveright": "右移", - "gameinput.moveback": "后退", - "gameinput.jump": "跳跃", - "gameinput.glide": "滑翔", - "gameinput.roll": "翻滚", - "gameinput.climb": "攀爬", - "gameinput.climbdown": "爬下", - "gameinput.wallleap": "蹬墙", - "gameinput.togglelantern": "切换提灯", - "gameinput.mount": "骑乘", - "gameinput.chat": "聊天", - "gameinput.command": "指令", - "gameinput.escape": "退出", - "gameinput.map": "地图", - "gameinput.bag": "背包", - "gameinput.trade": "交易", - "gameinput.social": "社交", - "gameinput.sit": "坐下", - "gameinput.spellbook": "法术", - "gameinput.settings": "设置", - "gameinput.respawn": "重生", - "gameinput.charge": "冲锋", - "gameinput.togglewield": "切换手持", - "gameinput.interact": "交互", - "gameinput.freelook": "自由视角", - "gameinput.autowalk": "自动 行走/滑翔", - "gameinput.cameraclamp": "锁定视角", - "gameinput.dance": "跳舞", - "gameinput.select": "选择实体", - "gameinput.acceptgroupinvite": "接受队伍邀请", - "gameinput.declinegroupinvite": "拒绝队伍邀请", - "gameinput.cyclecamera": "切换视角", - "gameinput.crafting": "制作", - "gameinput.fly": "飞行", - "gameinput.sneak": "潜行", - "gameinput.swimdown": "下潜", - "gameinput.swimup": "上浮", - "gameinput.greet": "打招呼", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/bag.ftl b/assets/voxygen/i18n/zh_CN/hud/bag.ftl new file mode 100644 index 0000000000..69eb71e758 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/bag.ftl @@ -0,0 +1,33 @@ +hud-bag-inventory = { $playername } 的物品栏 +hud-bag-stats_title = { $playername } 的状态 +hud-bag-exp = 经验 +hud-bag-armor = 护甲 +hud-bag-stats = 状态 +hud-bag-head = 头部 +hud-bag-neck = 颈部 +hud-bag-tabard = 披风 +hud-bag-shoulders = 肩膀 +hud-bag-chest = 胸部 +hud-bag-hands = 手部 +hud-bag-lantern = 提灯 +hud-bag-glider = 滑翔伞 +hud-bag-belt = 腰带 +hud-bag-ring = 戒指 +hud-bag-back = 背部 +hud-bag-legs = 腿部 +hud-bag-feet = 脚部 +hud-bag-mainhand = 主手 +hud-bag-offhand = 副手 +hud-bag-bag = 背包 +hud-bag-health = 血量 +hud-bag-energy = 耐力 +hud-bag-combat_rating = 战力 +hud-bag-protection = 防御 +hud-bag-stun_res = 韧性恢复 +hud-bag-combat_rating_desc = + 根据你的装备 + 和血量综合计算得出的数值. +hud-bag-protection_desc = 可以装备护甲来减少伤害 +hud-bag-stun_res_desc = + 抵御被连续击打而晕眩的韧性. + 像耐力一样恢复. \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/bag.ron b/assets/voxygen/i18n/zh_CN/hud/bag.ron deleted file mode 100644 index 45e6602221..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/bag.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // Inventory - "hud.bag.inventory": "{playername} 的物品栏", - "hud.bag.stats_title": "{playername} 的状态", - "hud.bag.exp": "经验", - "hud.bag.armor": "护甲", - "hud.bag.stats": "状态", - "hud.bag.head": "头部", - "hud.bag.neck": "颈部", - "hud.bag.tabard": "披风", - "hud.bag.shoulders": "肩膀", - "hud.bag.chest": "胸部", - "hud.bag.hands": "手部", - "hud.bag.lantern": "提灯", - "hud.bag.glider": "滑翔伞", - "hud.bag.belt": "腰带", - "hud.bag.ring": "戒指", - "hud.bag.back": "背部", - "hud.bag.legs": "腿部", - "hud.bag.feet": "脚部", - "hud.bag.mainhand": "主手", - "hud.bag.offhand": "副手", - "hud.bag.bag": "背包", - "hud.bag.health": "血量", - "hud.bag.energy": "耐力", - "hud.bag.combat_rating": "战力", - "hud.bag.protection": "防御", - "hud.bag.stun_res": "韧性恢复", - "hud.bag.combat_rating_desc": "根据你的装备\n和血量综合计算得出的数值.", - "hud.bag.protection_desc": "可以装备护甲来减少伤害", - "hud.bag.stun_res_desc": "抵御被连续击打而晕眩的韧性.\n像耐力一样恢复.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/char_window.ftl b/assets/voxygen/i18n/zh_CN/hud/char_window.ftl new file mode 100644 index 0000000000..95c042862c --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = 角色名称 +character_window-character_stats = + 耐力 + + 血量 + + 毅力 + + 防御 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/char_window.ron b/assets/voxygen/i18n/zh_CN/hud/char_window.ron deleted file mode 100644 index 7ba05843ca..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "character_window.character_name": "角色名称", - // Character stats - "character_window.character_stats": r#"耐力 - -血量 - -毅力 - -防御 -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/chat.ftl b/assets/voxygen/i18n/zh_CN/hud/chat.ftl new file mode 100644 index 0000000000..792168457f --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/chat.ftl @@ -0,0 +1,22 @@ +hud-chat-online_msg = [{ $name }] 上线了. +hud-chat-offline_msg = [{ $name }] 下线了. +hud-chat-default_death_msg = [{ $name }]死了 +hud-chat-environmental_kill_msg = [{ $name }]死在{ $environment }了 +hud-chat-fall_kill_msg = [{ $name }]因摔落伤害而死亡 +hud-chat-suicide_msg = [{ $name }]因自伤而死亡 +hud-chat-pvp_buff_kill_msg = [{ $victim }]死于{ $attacker }的{ $buff } +hud-chat-pvp_melee_kill_msg = [{ $attacker }]击败了[{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }]射杀了[{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }]炸死了[{ $victim }] +hud-chat-pvp_energy_kill_msg = [{ $attacker }]用魔法击杀了[{ $victim }] +hud-chat-nonexistent_buff_kill_msg = [{ $victim }]死于{ $buff } +hud-chat-npc_buff_kill_msg = [{ $victim }]死于{ $attacker }的{ $buff } +hud-chat-npc_melee_kill_msg = { $attacker }击杀了[{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker }射杀了[{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker }炸死了[{ $victim }] +hud-chat-npc_energy_kill_msg = { $attacker }用魔法击杀了[{ $victim }] +hud-chat-npc_other_kill_msg = { $attacker }击杀了[{ $victim }] +hud-chat-loot_msg = 你捡起了[{ $item }] +hud-chat-loot_fail = 你的背包已满! +hud-chat-goodbye = 再见! +hud-chat-connection_lost = 连接已断开. { $time }秒内将被踢出. \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/chat.ron b/assets/voxygen/i18n/zh_CN/hud/chat.ron deleted file mode 100644 index 1d007d01fa..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/chat.ron +++ /dev/null @@ -1,39 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // Chat outputs - "hud.chat.online_msg": "[{name}] 上线了.", - "hud.chat.offline_msg": "[{name}] 下线了.", - - "hud.chat.default_death_msg": "[{name}]死了", - "hud.chat.environmental_kill_msg": "[{name}]死在{environment}了", - "hud.chat.fall_kill_msg": "[{name}]因摔落伤害而死亡", - "hud.chat.suicide_msg": "[{name}]因自伤而死亡", - - "hud.chat.pvp_buff_kill_msg": "[{victim}]死于{attacker}的{buff}", - "hud.chat.pvp_melee_kill_msg": "[{attacker}]击败了[{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}]射杀了[{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}]炸死了[{victim}]", - "hud.chat.pvp_energy_kill_msg": "[{attacker}]用魔法击杀了[{victim}]", - - "hud.chat.nonexistent_buff_kill_msg": "[{victim}]死于{buff}", - - "hud.chat.npc_buff_kill_msg": "[{victim}]死于{attacker}的{buff}", - "hud.chat.npc_melee_kill_msg": "{attacker}击杀了[{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker}射杀了[{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker}炸死了[{victim}]", - "hud.chat.npc_energy_kill_msg": "{attacker}用魔法击杀了[{victim}]", - "hud.chat.npc_other_kill_msg": "{attacker}击杀了[{victim}]", - - "hud.chat.loot_msg": "你捡起了[{item}]", - "hud.chat.loot_fail": "你的背包已满!", - "hud.chat.goodbye": "再见!", - "hud.chat.connection_lost": "连接已断开. {time}秒内将被踢出.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/crafting.ftl b/assets/voxygen/i18n/zh_CN/hud/crafting.ftl new file mode 100644 index 0000000000..4fe37a5510 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/crafting.ftl @@ -0,0 +1,15 @@ +hud-crafting = 制作 +hud-crafting-recipes = 食谱 +hud-crafting-ingredients = 配方: +hud-crafting-craft = 制作 +hud-crafting-tool_cata = 需要: +hud-crafting-tabs-all = 全部 +hud-crafting-tabs-armor = 防具 +hud-crafting-tabs-dismantle = 分解 +hud-crafting-tabs-food = 食物 +hud-crafting-tabs-glider = 滑翔伞 +hud-crafting-tabs-potion = 药水 +hud-crafting-tabs-tool = 工具 +hud-crafting-tabs-utility = 道具 +hud-crafting-tabs-weapon = 武器 +hud-crafting-tabs-bag = 背包 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/crafting.ron b/assets/voxygen/i18n/zh_CN/hud/crafting.ron deleted file mode 100644 index 394b1bc0c9..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/crafting.ron +++ /dev/null @@ -1,28 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "hud.crafting": "制作", - "hud.crafting.recipes": "食谱", - "hud.crafting.ingredients": "配方:", - "hud.crafting.craft": "制作", - "hud.crafting.tool_cata": "需要:", - - // Tabs - "hud.crafting.tabs.all": "全部", - "hud.crafting.tabs.armor": "防具", - "hud.crafting.tabs.dismantle": "分解", - "hud.crafting.tabs.food": "食物", - "hud.crafting.tabs.glider": "滑翔伞", - "hud.crafting.tabs.potion": "药水", - "hud.crafting.tabs.tool": "工具", - "hud.crafting.tabs.utility": "道具", - "hud.crafting.tabs.weapon": "武器", - "hud.crafting.tabs.bag": "背包", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/group.ftl b/assets/voxygen/i18n/zh_CN/hud/group.ftl new file mode 100644 index 0000000000..ed1b15db25 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = 队伍 +hud-group-invite_to_join = [{ $name }]邀请你加入它们的队伍! +hud-group-invite_to_trade = [{ $name }]希望与你进行交易. +hud-group-invite = 邀请 +hud-group-kick = 踢出 +hud-group-assign_leader = 指定队长 +hud-group-leave = 离开队伍 +hud-group-dead = 死亡 +hud-group-out_of_range = 超出范围 +hud-group-add_friend = 添加好友 +hud-group-link_group = 连接队伍 +hud-group-in_menu = 菜单中 +hud-group-members = 队伍成员 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/group.ron b/assets/voxygen/i18n/zh_CN/hud/group.ron deleted file mode 100644 index 3de65f1088..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "hud.group": "队伍", - "hud.group.invite_to_join": "[{name}]邀请你加入它们的队伍!", - "hud.group.invite_to_trade": "[{name}]希望与你进行交易.", - "hud.group.invite": "邀请", - "hud.group.kick": "踢出", - "hud.group.assign_leader": "指定队长", - "hud.group.leave": "离开队伍", - "hud.group.dead" : "死亡", - "hud.group.out_of_range": "超出范围", - "hud.group.add_friend": "添加好友", - "hud.group.link_group": "连接队伍", - "hud.group.in_menu": "菜单中", - "hud.group.members": "队伍成员", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/map.ftl b/assets/voxygen/i18n/zh_CN/hud/map.ftl new file mode 100644 index 0000000000..de4d98ddf1 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/map.ftl @@ -0,0 +1,21 @@ +hud-map-map_title = 地图 +hud-map-qlog_title = 任务 +hud-map-topo_map = 地形图 +hud-map-difficulty = 难度 +hud-map-towns = 城镇 +hud-map-castles = 城堡 +hud-map-dungeons = 地牢 +hud-map-caves = 洞穴 +hud-map-cave = 洞穴 +hud-map-trees = 巨树 +hud-map-tree = 巨树 +hud-map-town = 城镇 +hud-map-castle = 城堡 +hud-map-dungeon = 地牢 +hud-map-difficulty_dungeon = + 地牢 + + 难度: { $difficulty } +hud-map-drag = 拖动 +hud-map-zoom = 缩放 +hud-map-recenter = 重新定位 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/map.ron b/assets/voxygen/i18n/zh_CN/hud/map.ron deleted file mode 100644 index d15f4bb1a7..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/map.ron +++ /dev/null @@ -1,30 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // Map and Questlog - "hud.map.map_title": "地图", - "hud.map.qlog_title": "任务", - "hud.map.topo_map": "地形图", - "hud.map.difficulty": "难度", - "hud.map.towns": "城镇", - "hud.map.castles": "城堡", - "hud.map.dungeons": "地牢", - "hud.map.caves": "洞穴", - "hud.map.cave": "洞穴", - "hud.map.trees": "巨树", - "hud.map.tree": "巨树", - "hud.map.town": "城镇", - "hud.map.castle": "城堡", - "hud.map.dungeon": "地牢", - "hud.map.difficulty_dungeon": "地牢\n\n难度: {difficulty}", - "hud.map.drag": "拖动", - "hud.map.zoom": "缩放", - "hud.map.recenter": "重新定位", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/misc.ftl b/assets/voxygen/i18n/zh_CN/hud/misc.ftl new file mode 100644 index 0000000000..fb5e2ac9bc --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/misc.ftl @@ -0,0 +1,33 @@ +hud-do_not_show_on_startup = 启动时不显示这个 +hud-show_tips = 显示提示 +hud-quests = 任务 +hud-you_died = 你死了 +hud-waypoint_saved = 标记已保存 +hud-sp_arrow_txt = 技能点 +hud-press_key_to_show_keybindings_fmt = 按下 { $key } 显示快捷键设置 +hud-press_key_to_toggle_lantern_fmt = [{ $key }] 显示提灯 +hud-press_key_to_show_debug_info_fmt = 按下 { $key } 显示调试信息 +hud-press_key_to_toggle_keybindings_fmt = 按下 { $key } 切换显示快捷键设置 +hud-press_key_to_toggle_debug_info_fmt = 按下 { $key } 切换显示调试信息 +hud-press_key_to_respawn = 按下 { $key } 在你上次访问的篝火处重生. +hud-tutorial_btn = 教程 +hud-tutorial_click_here = 按下 [ { $key } ] 释放鼠标光标并单击此按钮! +hud-tutorial_elements = 制作 +hud-temp_quest_headline = 旅行者你好! +hud-temp_quest_text = + 想要开始旅程的话,可以浏览这个村庄并收集一些物资. + + 祝你你在旅途中随心所欲! + + 查看屏幕的右下角,找到各种内容,例如背包,制作和地图. + + 制作菜单可制作盔甲,武器,食物等等! + + 城镇上到处都是野生动物,是皮革碎片的重要来源,可以为你提供一些防护来抵御危险. + + 只要你准备就绪,就可以尝试挑战地图上的标记点,来获得更好的装备! +hud-spell = 法术 +hud-diary = 技能书 +hud-free_look_indicator = 启用自由视角. 按下 { $key } 禁用. +hud-camera_clamp_indicator = 启用锁定视角. 按下 { $key } 禁用. +hud-auto_walk_indicator = 启用自动 行走/滑翔 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/misc.ron b/assets/voxygen/i18n/zh_CN/hud/misc.ron deleted file mode 100644 index 438a3f0170..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/misc.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "hud.do_not_show_on_startup": "启动时不显示这个", - "hud.show_tips": "显示提示", - "hud.quests": "任务", - "hud.you_died": "你死了", - "hud.waypoint_saved": "标记已保存", - "hud.sp_arrow_txt": "技能点", - - "hud.press_key_to_show_keybindings_fmt": "按下 {key} 显示快捷键设置", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] 显示提灯", - "hud.press_key_to_show_debug_info_fmt": "按下 {key} 显示调试信息", - "hud.press_key_to_toggle_keybindings_fmt": "按下 {key} 切换显示快捷键设置", - "hud.press_key_to_toggle_debug_info_fmt": "按下 {key} 切换显示调试信息", - - // Respawn message - "hud.press_key_to_respawn": r#"按下 {key} 在你上次访问的篝火处重生."#, - - // Tutorial Button - "hud.tutorial_btn": r#"教程"#, - "hud.tutorial_click_here": r#"按下 [ {key} ] 释放鼠标光标并单击此按钮!"#, - "hud.tutorial_elements": r#"制作"#, - -"hud.temp_quest_headline": r#"旅行者你好!"#, -"hud.temp_quest_text": r#"想要开始旅程的话,可以浏览这个村庄并收集一些物资. - -祝你你在旅途中随心所欲! - -查看屏幕的右下角,找到各种内容,例如背包,制作和地图. - -制作菜单可制作盔甲,武器,食物等等! - -城镇上到处都是野生动物,是皮革碎片的重要来源,可以为你提供一些防护来抵御危险. - -只要你准备就绪,就可以尝试挑战地图上的标记点,来获得更好的装备! -"#, - - "hud.spell": "法术", - // Diary - "hud.diary": "技能书", - - "hud.free_look_indicator": "启用自由视角. 按下 {key} 禁用.", - "hud.camera_clamp_indicator": "启用锁定视角. 按下 {key} 禁用.", - "hud.auto_walk_indicator": "启用自动 行走/滑翔", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/sct.ftl b/assets/voxygen/i18n/zh_CN/hud/sct.ftl new file mode 100644 index 0000000000..43437ea59c --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount }经验 +hud-sct-block = 格挡 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/sct.ron b/assets/voxygen/i18n/zh_CN/hud/sct.ron deleted file mode 100644 index b08aeb7509..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount}经验", - "hud.sct.block": "格挡", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/settings.ftl b/assets/voxygen/i18n/zh_CN/hud/settings.ftl new file mode 100644 index 0000000000..0e6dbda4ae --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/settings.ftl @@ -0,0 +1,89 @@ +hud-settings-general = 一般 +hud-settings-none = 无 +hud-settings-press_behavior-toggle = 切换 +hud-settings-press_behavior-hold = 按住 +hud-settings-help_window = 帮助 +hud-settings-debug_info = 调试信息 +hud-settings-tips_on_startup = 开始时的提示信息 +hud-settings-ui_scale = UI比例 +hud-settings-relative_scaling = 相对缩放 +hud-settings-custom_scaling = 自定义缩放 +hud-settings-crosshair = 准星 +hud-settings-opacity = 透明度 +hud-settings-hotbar = 快捷键 +hud-settings-toggle_shortcuts = 显示快捷键 +hud-settings-buffs_skillbar = 增益效果显示在技能栏 +hud-settings-buffs_mmap = 增益效果显示在小地图旁 +hud-settings-toggle_bar_experience = 显示经验条 +hud-settings-scrolling_combat_text = 战斗信息 +hud-settings-incoming_damage = 所受伤害 +hud-settings-speech_bubble = 对话框 +hud-settings-speech_bubble_dark_mode = 对话框启用暗色模式 +hud-settings-speech_bubble_icon = 对话框显示图标 +hud-settings-energybar_numbers = 能量条 +hud-settings-values = 数字 +hud-settings-percentages = 百分比 +hud-settings-chat = 聊天 +hud-settings-background_opacity = 背景透明度 +hud-settings-chat_character_name = 聊天显示人物名称 +hud-settings-loading_tips = 加载游戏时显示小提示 +hud-settings-reset_interface = 重置为默认 +hud-settings-pan_sensitivity = 鼠标灵敏度 +hud-settings-zoom_sensitivity = 缩放灵敏度 +hud-settings-camera_clamp_angle = 锁定视角模式垂直角度 +hud-settings-invert_scroll_zoom = 反转滚动缩放 +hud-settings-invert_mouse_y_axis = 反转鼠标Y轴 +hud-settings-invert_controller_y_axis = 反转手柄Y轴 +hud-settings-enable_mouse_smoothing = 平滑相机 +hud-settings-free_look_behavior = 自由视角 +hud-settings-auto_walk_behavior = 自动行走 +hud-settings-camera_clamp_behavior = 锁定视角 +hud-settings-stop_auto_walk_on_input = 停止自动行走 +hud-settings-auto_camera = 自动视角 +hud-settings-reset_gameplay = 重置为默认 +hud-settings-view_distance = 视野距离 +hud-settings-sprites_view_distance = 精灵视距 +hud-settings-figures_view_distance = 实体视距 +hud-settings-maximum_fps = 最高FPS +hud-settings-fov = 视场(角度) +hud-settings-gamma = Gamma(亮度) +hud-settings-exposure = 碰撞箱 +hud-settings-ambiance = 环境亮度 +hud-settings-antialiasing_mode = 抗锯齿模式 +hud-settings-upscale_factor = 输入分辨率 +hud-settings-cloud_rendering_mode = 云朵渲染模式 +hud-settings-fluid_rendering_mode = 流体渲染模式 +hud-settings-fluid_rendering_mode-cheap = 简单 +hud-settings-fluid_rendering_mode-shiny = 闪烁 +hud-settings-cloud_rendering_mode-minimal = 一般 +hud-settings-cloud_rendering_mode-low = 低 +hud-settings-cloud_rendering_mode-medium = 中 +hud-settings-cloud_rendering_mode-high = 高 +hud-settings-cloud_rendering_mode-ultra = 极高 +hud-settings-fullscreen = 全屏 +hud-settings-fullscreen_mode = 全屏模式 +hud-settings-fullscreen_mode-exclusive = 全屏独占 +hud-settings-fullscreen_mode-borderless = 无边框 +hud-settings-particles = 粒子 +hud-settings-resolution = 分辨率 +hud-settings-bit_depth = 图像深度 +hud-settings-refresh_rate = 刷新率 +hud-settings-lighting_rendering_mode = 灯光渲染模式 +hud-settings-lighting_rendering_mode-ashikhmin = A型 - 高 +hud-settings-lighting_rendering_mode-blinnphong = B型 - 中 +hud-settings-lighting_rendering_mode-lambertian = L型 - 差 +hud-settings-shadow_rendering_mode = 阴影渲染模式 +hud-settings-shadow_rendering_mode-none = 无 +hud-settings-shadow_rendering_mode-cheap = 差 +hud-settings-shadow_rendering_mode-map = 地图 +hud-settings-shadow_rendering_mode-map-resolution = 分辨率 +hud-settings-lod_detail = LoD细节 +hud-settings-save_window_size = 保存窗口尺寸 +hud-settings-reset_graphics = 重置为默认 +hud-settings-music_volume = 音乐音量 +hud-settings-sound_effect_volume = 音效音量 +hud-settings-audio_device = 声音设备 +hud-settings-reset_sound = 重置为默认 +hud-settings-awaitingkey = 按任意键... +hud-settings-unbound = 无 +hud-settings-reset_keybinds = 重置为默认 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/settings.ron b/assets/voxygen/i18n/zh_CN/hud/settings.ron deleted file mode 100644 index 4ff00b42e4..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/settings.ron +++ /dev/null @@ -1,106 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - // Settings - "hud.settings.general": "一般", - "hud.settings.none": "无", - "hud.settings.press_behavior.toggle": "切换", - "hud.settings.press_behavior.hold": "按住", - "hud.settings.help_window": "帮助", - "hud.settings.debug_info": "调试信息", - "hud.settings.tips_on_startup": "开始时的提示信息", - "hud.settings.ui_scale": "UI比例", - "hud.settings.relative_scaling": "相对缩放", - "hud.settings.custom_scaling": "自定义缩放", - "hud.settings.crosshair": "准星", - "hud.settings.opacity": "透明度", - "hud.settings.hotbar": "快捷键", - "hud.settings.toggle_shortcuts": "显示快捷键", - "hud.settings.buffs_skillbar": "增益效果显示在技能栏", - "hud.settings.buffs_mmap": "增益效果显示在小地图旁", - "hud.settings.toggle_bar_experience": "显示经验条", - "hud.settings.scrolling_combat_text": "战斗信息", - "hud.settings.incoming_damage": "所受伤害", - "hud.settings.speech_bubble": "对话框", - "hud.settings.speech_bubble_dark_mode": "对话框启用暗色模式", - "hud.settings.speech_bubble_icon": "对话框显示图标", - "hud.settings.energybar_numbers": "能量条", - "hud.settings.values": "数字", - "hud.settings.percentages": "百分比", - "hud.settings.chat": "聊天", - "hud.settings.background_opacity": "背景透明度", - "hud.settings.chat_character_name": "聊天显示人物名称", - "hud.settings.loading_tips": "加载游戏时显示小提示", - "hud.settings.reset_interface": "重置为默认", - - "hud.settings.pan_sensitivity": "鼠标灵敏度", - "hud.settings.zoom_sensitivity": "缩放灵敏度", - "hud.settings.camera_clamp_angle": "锁定视角模式垂直角度", - "hud.settings.invert_scroll_zoom": "反转滚动缩放", - "hud.settings.invert_mouse_y_axis": "反转鼠标Y轴", - "hud.settings.invert_controller_y_axis": "反转手柄Y轴 ", - "hud.settings.enable_mouse_smoothing": "平滑相机", - "hud.settings.free_look_behavior": "自由视角", - "hud.settings.auto_walk_behavior": "自动行走", - "hud.settings.camera_clamp_behavior": "锁定视角", - "hud.settings.stop_auto_walk_on_input": "停止自动行走", - "hud.settings.auto_camera": "自动视角", - "hud.settings.reset_gameplay": "重置为默认", - - "hud.settings.view_distance": "视野距离", - "hud.settings.sprites_view_distance": "精灵视距", - "hud.settings.figures_view_distance": "实体视距", - "hud.settings.maximum_fps": "最高FPS", - "hud.settings.fov": "视场(角度)", - "hud.settings.gamma": "Gamma(亮度)", - "hud.settings.exposure": "碰撞箱", - "hud.settings.ambiance": "环境亮度", - "hud.settings.antialiasing_mode": "抗锯齿模式", - "hud.settings.upscale_factor": "输入分辨率", - "hud.settings.cloud_rendering_mode": "云朵渲染模式", - "hud.settings.fluid_rendering_mode": "流体渲染模式", - "hud.settings.fluid_rendering_mode.cheap": "简单", - "hud.settings.fluid_rendering_mode.shiny": "闪烁", - "hud.settings.cloud_rendering_mode.minimal": "一般", - "hud.settings.cloud_rendering_mode.low": "低", - "hud.settings.cloud_rendering_mode.medium": "中", - "hud.settings.cloud_rendering_mode.high": "高", - "hud.settings.cloud_rendering_mode.ultra": "极高", - "hud.settings.fullscreen": "全屏", - "hud.settings.fullscreen_mode": "全屏模式", - "hud.settings.fullscreen_mode.exclusive": "全屏独占", - "hud.settings.fullscreen_mode.borderless": "无边框", - "hud.settings.particles": "粒子", - "hud.settings.resolution": "分辨率", - "hud.settings.bit_depth": "图像深度", - "hud.settings.refresh_rate": "刷新率", - "hud.settings.lighting_rendering_mode": "灯光渲染模式", - "hud.settings.lighting_rendering_mode.ashikhmin": "A型 - 高", - "hud.settings.lighting_rendering_mode.blinnphong": "B型 - 中", - "hud.settings.lighting_rendering_mode.lambertian": "L型 - 差", - "hud.settings.shadow_rendering_mode": "阴影渲染模式", - "hud.settings.shadow_rendering_mode.none": "无", - "hud.settings.shadow_rendering_mode.cheap": "差", - "hud.settings.shadow_rendering_mode.map": "地图", - "hud.settings.shadow_rendering_mode.map.resolution": "分辨率", - "hud.settings.lod_detail": "LoD细节", - "hud.settings.save_window_size": "保存窗口尺寸", - "hud.settings.reset_graphics": "重置为默认", - - - "hud.settings.music_volume": "音乐音量", - "hud.settings.sound_effect_volume": "音效音量", - "hud.settings.audio_device": "声音设备", - "hud.settings.reset_sound": "重置为默认", - - "hud.settings.awaitingkey": "按任意键...", - "hud.settings.unbound": "无", - "hud.settings.reset_keybinds": "重置为默认", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/skills.ftl b/assets/voxygen/i18n/zh_CN/hud/skills.ftl new file mode 100644 index 0000000000..9c42db9b59 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/skills.ftl @@ -0,0 +1,230 @@ +hud-rank_up = 新的技能点 +hud-skill-sp_available = { $number } 技能点可用 +hud-skill-not_unlocked = 尚未解锁 +hud-skill-req_sp ={"\u000A"} + + 需要 { $number } 技能点 +hud-skill-inc_health_title = 增强生命 +hud-skill-inc_health = 最大生命值提高{ $boost }{ $SP } +hud-skill-inc_energy_title = 增强耐力/法力 +hud-skill-inc_energy = 最大耐力提升{ $boost }{ $SP } +hud-skill-unlck_sword_title = 解锁双手剑专精 +hud-skill-unlck_sword = 解锁双手剑技能树{ $SP } +hud-skill-unlck_axe_title = 解锁双手斧专精 +hud-skill-unlck_axe = 解锁双手斧技能树{ $SP } +hud-skill-unlck_hammer_title = 解锁双手锤专精 +hud-skill-unlck_hammer = 解锁双手锤技能树{ $SP } +hud-skill-unlck_bow_title = 解锁弓专精 +hud-skill-unlck_bow = 解锁弓技能树{ $SP } +hud-skill-unlck_staff_title = 解锁火焰法杖专精 +hud-skill-unlck_staff = 解锁火焰法杖技能树{ $SP } +hud-skill-unlck_sceptre_title = 解锁生命权杖专精 +hud-skill-unlck_sceptre = 解锁生命权杖技能树{ $SP } +hud-skill-dodge_title = 闪避 +hud-skill-dodge = 翻滚可以躲避敌人的攻击{ $SP } +hud-skill-roll_energy_title = 体术(翻滚) +hud-skill-roll_energy = 减少每次翻滚需要消耗的耐力{ $boost }%{ $SP } +hud-skill-roll_speed_title = 迅捷 +hud-skill-roll_speed = 加快{ $boost }%的翻滚速度{ $SP } +hud-skill-roll_dur_title = 飞身跃入 +hud-skill-roll_dur = 翻滚可躲避敌人攻击的时间延长{ $boost }%{ $SP } +hud-skill-climbing_title = 攀爬 +hud-skill-climbing = 你能够攀爬岩壁 +hud-skill-climbing_cost_title = 体术(攀爬) +hud-skill-climbing_cost = 攀爬时耐力消耗速率降低{ $boost }%{ $SP } +hud-skill-climbing_speed_title = 攀岩高手 +hud-skill-climbing_speed = 加快{ $boost }%的攀爬速度{ $SP } +hud-skill-swim_title = 游泳 +hud-skill-swim = 在水中游动 +hud-skill-swim_speed_title = 速泳 +hud-skill-swim_speed = 加快{ $boost }%的游泳速度{ $SP } +hud-skill-sc_lifesteal_title = 生命窃取光束 +hud-skill-sc_lifesteal = 窃取敌人的生命值 +hud-skill-sc_lifesteal_damage_title = 伤害提升 +hud-skill-sc_lifesteal_damage = 光束伤害提升{ $boost }%{ $SP } +hud-skill-sc_lifesteal_range_title = 范围提升 +hud-skill-sc_lifesteal_range = 光束最大射程提升{ $boost }%{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = 效率提升 +hud-skill-sc_lifesteal_lifesteal = 生命窃取效率提升{ $boost }%{ $SP } +hud-skill-sc_lifesteal_regen_title = 法力回复 +hud-skill-sc_lifesteal_regen = 每次击中敌人回复的法力增加{ $boost }%{ $SP } +hud-skill-sc_heal_title = 治愈光束 +hud-skill-sc_heal = 你可以窃取敌人的生命值来治愈你的盟友 +hud-skill-sc_heal_heal_title = 效率提升 +hud-skill-sc_heal_heal = 生命治愈效果提高{ $boost }%{ $SP } +hud-skill-sc_heal_cost_title = 法力节省 +hud-skill-sc_heal_cost = 每次治愈队友需要消耗的法力减少{ $boost }%{ $SP } +hud-skill-sc_heal_range_title = 范围提升 +hud-skill-sc_heal_range = 光束最大射程提升{ $boost }%{ $SP } +hud-skill-sc_wardaura_unlock_title = 守护领域 +hud-skill-sc_wardaura_unlock = 施展一个强大的魔法领域,守护你的盟友{ $SP } +hud-skill-sc_wardaura_strength_title = 效果提升 +hud-skill-sc_wardaura_strength = 领域提供的效果加强{ $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = 持续时间 +hud-skill-sc_wardaura_duration = 领域持续的时间延长{ $boost }%{ $SP } +hud-skill-sc_wardaura_range_title = 广域化 +hud-skill-sc_wardaura_range = 领域覆盖的范围加大{ $boost }%{ $SP } +hud-skill-sc_wardaura_cost_title = 法力节省 +hud-skill-sc_wardaura_cost = 施展领域需要消耗的法力减少{ $boost }%{ $SP } +hud-skill-st_shockwave_range_title = 范围提升 +hud-skill-st_shockwave_range = 冲击波扩散的范围扩大{ $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = 法力节省 +hud-skill-st_shockwave_cost = 施放烈焰花环需要消耗的法力减少{ $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = 冲击强化 +hud-skill-st_shockwave_knockback = 冲击波击退的效果提高{ $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = 伤害提升 +hud-skill-st_shockwave_damage = 冲击波造成的伤害提高{ $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = 烈焰花环 +hud-skill-st_shockwave_unlock = 释放强大的火焰冲击波,伤害并击退周遭敌人{ $SP } +hud-skill-st_flamethrower_title = 火焰吐息 +hud-skill-st_flamethrower = 释放烈焰持续灼烧你的敌人 +hud-skill-st_flame_velocity_title = 高温 +hud-skill-st_flame_velocity = 火焰造成伤害的速度提高{ $boost }%{ $SP } +hud-skill-st_flamethrower_range_title = 范围提升 +hud-skill-st_flamethrower_range = 吐息最大射程提升{ $boost }%{ $SP } +hud-skill-st_energy_drain_title = 法力节省 +hud-skill-st_energy_drain = 吐息时法力消耗速率降低{ $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = 伤害提升 +hud-skill-st_flamethrower_damage = 吐息造成的伤害提高{ $boost }%{ $SP } +hud-skill-st_explosion_radius_title = 爆破专家 +hud-skill-st_explosion_radius = 火球爆炸的半径扩大{ $boost }%{ $SP } +hud-skill-st_energy_regen_title = 法力回复 +hud-skill-st_energy_regen = 每次击中敌人回复的法力增加{ $boost }%{ $SP } +hud-skill-st_fireball_title = 火球术 +hud-skill-st_fireball = 发射火球攻击敌人 +hud-skill-st_damage_title = 伤害提升 +hud-skill-st_damage = 火球造成的伤害提高{ $boost }%{ $SP } +hud-skill-st_explosion_title = 爆炸 +hud-skill-st_explosion = 火球击中物体后会爆炸,造成区域伤害{ $SP } +hud-skill-bow_projectile_speed_title = 神射手 +hud-skill-bow_projectile_speed = 箭矢速度和最大射程提高{ $boost }%{ $SP } +hud-skill-bow_arrow_count_title = 射手 +hud-skill-bow_arrow_count = 当你跳跃时,能额外射出一支箭矢{ $SP } +hud-skill-bow_repeater_cost_title = 耐力节省 +hud-skill-bow_repeater_cost = 施展腾空击需要消耗的耐力减少{ $boost }%{ $SP } +hud-skill-bow_repeater_glide_title = 飞燕 +hud-skill-bow_repeater_glide = 你能腾飞得更远{ $SP } +hud-skill-bow_repeater_damage_title = 伤害提升 +hud-skill-bow_repeater_damage = 每支箭矢造成的伤害提升{ $boost }%{ $SP } +hud-skill-bow_repeater_unlock_title = 腾空击 +hud-skill-bow_repeater_unlock = 飞跃在空中,同时向敌人快速射出数支箭矢{ $SP } +hud-skill-bow_charged_title = 蓄力射击 +hud-skill-bow_charged = 因为你愿意花更长时间蓄力以造成更大伤害 +hud-skill-bow_charged_knockback_title = 冲击强化 +hud-skill-bow_charged_knockback = 蓄力箭矢击退的效果提高{ $boost }%{ $SP } +hud-skill-bow_charged_move_speed_title = 灵巧 +hud-skill-bow_charged_move_speed = 蓄力时的移动速度提高{ $boost }%{ $SP } +hud-skill-bow_charged_speed_title = 专注 +hud-skill-bow_charged_speed = 蓄力效果达到最大化的速度加快{ $boost }%{ $SP } +hud-skill-bow_charged_projectile_speed_title = 弹速强化 +hud-skill-bow_charged_projectile_speed = 蓄力箭矢飞行的速度提高{ $boost }%{ $SP } +hud-skill-bow_charged_drain_title = 耐力节省 +hud-skill-bow_charged_drain = 蓄力时耐力消耗速率降低{ $boost }%{ $SP } +hud-skill-bow_charged_damage_title = 伤害提升 +hud-skill-bow_charged_damage = 蓄力箭矢造成的伤害提升{ $boost }%{ $SP } +hud-skill-bow_energy_regen_title = 耐力回复 +hud-skill-bow_energy_regen = 每次击中敌人回复的耐力增加{ $boost }%{ $SP } +hud-skill-bow_title = 射箭 +hud-skill-bow = 不适合手抖的小朋友哦 +hud-skill-bow_damage_title = 伤害提升 +hud-skill-bow_damage = 箭矢造成的伤害提升{ $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = 震荡 +hud-skill-hmr_leap_radius = 千斤坠伤害的作用半径扩大{ $boost }米{ $SP } +hud-skill-hmr_leap_distance_title = 奋力一跃 +hud-skill-hmr_leap_distance = 飞跃的最大距离提高{ $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = 耐力节省 +hud-skill-hmr_leap_cost = 施展千斤坠需要消耗的耐力减少{ $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = 冲击强化 +hud-skill-hmr_leap_knockback = 千斤坠击退的效果提高{ $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = 伤害提升 +hud-skill-hmr_leap_damage = 千斤坠造成的伤害提升{ $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = 千斤坠 +hud-skill-hmr_unlock_leap = 全力飞跃给予敌人强力一击{ $SP } +hud-skill-hmr_charged_melee_title = 蓄力打击 +hud-skill-hmr_charged_melee = 蓄力造成强力打击 +hud-skill-hmr_charged_rate_title = 专注 +hud-skill-hmr_charged_rate = 蓄力效果达到最大化的速度加快{ $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = 耐力节省 +hud-skill-hmr_charged_melee_nrg_drain = 蓄力时耐力消耗速率降低{ $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = 伤害提升 +hud-skill-hmr_charged_melee_damage = 蓄力打击造成的伤害提升{ $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = 冲击强化 +hud-skill-hmr_charged_melee_knockback = 蓄力打击击退的效果提高{ $boost }%{ $SP } +hud-skill-hmr_single_strike_title = 锤击 +hud-skill-hmr_single_strike = 挥舞大锤打击敌人 +hud-skill-hmr_single_strike_regen_title = 热身(耐力回复) +hud-skill-hmr_single_strike_regen = 随着连击数增加,每次击中敌人回复更多耐力{ $SP } +hud-skill-hmr_single_strike_speed_title = 热身(攻击速度) +hud-skill-hmr_single_strike_speed = 随着连击数增加,每次击中敌人攻击速度加快{ $SP } +hud-skill-hmr_single_strike_damage_title = 热身(伤害) +hud-skill-hmr_single_strike_damage = 随着连击数增加,每次击中敌人造成的伤害提升{ $SP } +hud-skill-hmr_single_strike_knockback_title = 冲击强化 +hud-skill-hmr_single_strike_knockback = 锤击击退的效果提高{ $boost }%{ $SP } +hud-skill-sw_trip_str_title = 三连击 +hud-skill-sw_trip_str = 三连击,劈,砍,刺 +hud-skill-sw_trip_str_combo_title = 姿态调整 +hud-skill-sw_trip_str_combo = 三连击与三连击之间能能更好的衔接{ $SP } +hud-skill-sw_trip_str_dmg_title = 热身(伤害) +hud-skill-sw_trip_str_dmg = 随着连击数增加,每次击中敌人造成的伤害提升{ $SP } +hud-skill-sw_trip_str_sp_title = 热身(攻击速度) +hud-skill-sw_trip_str_sp = 随着连击数增加,每次击中敌人攻击速度加快{ $SP } +hud-skill-sw_trip_str_reg_title = 热身(耐力回复) +hud-skill-sw_trip_str_reg = 随着连击数增加,每次击中敌人回复更多耐力{ $SP } +hud-skill-sw_dash_title = 突刺 +hud-skill-sw_dash = 向前发动快速突刺,划伤敌人 +hud-skill-sw_dash_dmg_title = 伤害提升 +hud-skill-sw_dash_dmg = 突刺起始造成的伤害提升{ $boost }%{ $SP } +hud-skill-sw_dash_drain_title = 耐力节省 +hud-skill-sw_dash_drain = 突刺发动需要消耗的耐力减少{ $boost }%{ $SP } +hud-skill-sw_dash_cost_title = 耐力节省 +hud-skill-sw_dash_cost = 突刺时耐力消耗速率降低{ $boost }%{ $SP } +hud-skill-sw_dash_speed_title = 势如破竹 +hud-skill-sw_dash_speed = 突刺前进的速度提高{ $boost }%{ $SP } +hud-skill-sw_dash_inf_title = 势不可挡 +hud-skill-sw_dash_inf = 你可以持续不断地发动突刺{ $SP } +hud-skill-sw_dash_scale_title = 伤害提升 +hud-skill-sw_dash_scale = 突刺最大造成的伤害提升{ $boost }%{ $SP } +hud-skill-sw_spin_title = 回旋斩 +hud-skill-sw_spin = 发动强力的回旋斩伤害成片的敌人{ $SP } +hud-skill-sw_spin_dmg_title = 伤害提升 +hud-skill-sw_spin_dmg = 回旋斩造成的伤害提升{ $boost }%{ $SP } +hud-skill-sw_spin_spd_title = 斩风 +hud-skill-sw_spin_spd = 回旋斩斩击的速度加快{ $boost }%{ $SP } +hud-skill-sw_spin_cost_title = 耐力节省 +hud-skill-sw_spin_cost = 每段回旋斩需要消耗的耐力减少{ $boost }%{ $SP } +hud-skill-sw_spin_spins_title = 旋转舞者(剑) +hud-skill-sw_spin_spins = 增加每次发动回旋斩斩击的次数{ $SP } +hud-skill-sw_interrupt_title = 纳刀术 +hud-skill-sw_interrupt = 无视攻击动作的后摇,立刻进行其他动作{ $SP } +hud-skill-axe_double_strike_title = 劈砍 +hud-skill-axe_double_strike = 砍倒那些恶棍 +hud-skill-axe_double_strike_combo_title = 二连击 +hud-skill-axe_double_strike_combo = 解锁第二段攻击{ $SP } +hud-skill-axe_double_strike_damage_title = 热身(伤害) +hud-skill-axe_double_strike_damage = 随着连击数增加,每次击中敌人造成的伤害提升{ $SP } +hud-skill-axe_double_strike_speed_title = 热身(攻击速度) +hud-skill-axe_double_strike_speed = 随着连击数增加,每次击中敌人攻击速度加快{ $SP } +hud-skill-axe_double_strike_regen_title = 热身(耐力回复) +hud-skill-axe_double_strike_regen = 随着连击数增加,每次击中敌人回复更多耐力{ $SP } +hud-skill-axe_spin_title = 旋风斩 +hud-skill-axe_spin = 大斧转转乐,绞杀周围目标 +hud-skill-axe_infinite_axe_spin_title = 旋转舞者(斧) +hud-skill-axe_infinite_axe_spin = 有耐力的情况下你可以一直这么转下去{ $SP } +hud-skill-axe_spin_damage_title = 伤害提升 +hud-skill-axe_spin_damage = 旋风斩造成的伤害提升{ $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = 直升机 +hud-skill-axe_spin_helicopter = 旋风斩发动时你下落速度会减慢一点{ $SP } +hud-skill-axe_spin_speed_title = 龙卷风 +hud-skill-axe_spin_speed = 旋风斩旋转的速度加快{ $boost }%{ $SP } +hud-skill-axe_spin_cost_title = 耐力节省 +hud-skill-axe_spin_cost = 每段旋风斩需要消耗的耐力减少{ $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = 飞身一击 +hud-skill-axe_unlock_leap = 飞身施展强力一劈{ $SP } +hud-skill-axe_leap_damage_title = 伤害提升 +hud-skill-axe_leap_damage = 飞身一击造成的伤害提升{ $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = 冲击强化 +hud-skill-axe_leap_knockback = 飞身一击击退的效果提高{ $boost }%{ $SP } +hud-skill-axe_leap_cost_title = 耐力节省 +hud-skill-axe_leap_cost = 施展飞身一击需要消耗的耐力减少{ $boost }%{ $SP } +hud-skill-axe_leap_distance_title = 奋力一跃 +hud-skill-axe_leap_distance = 跳跃距离提升{ $boost }%{ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/skills.ron b/assets/voxygen/i18n/zh_CN/hud/skills.ron deleted file mode 100644 index 4a0c868bed..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/skills.ron +++ /dev/null @@ -1,248 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "hud.rank_up": "新的技能点", - "hud.skill.sp_available": "{number} 技能点可用", - "hud.skill.not_unlocked": "尚未解锁", - "hud.skill.req_sp": "\n\n需要 {number} 技能点", - // Skills - // General - "hud.skill.inc_health_title": "增强生命", - "hud.skill.inc_health": "最大生命值提高{boost}{SP}", - "hud.skill.inc_energy_title": "增强耐力/法力", - "hud.skill.inc_energy": "最大耐力提升{boost}{SP}", - "hud.skill.unlck_sword_title": "解锁双手剑专精", - "hud.skill.unlck_sword": "解锁双手剑技能树{SP}", - "hud.skill.unlck_axe_title": "解锁双手斧专精", - "hud.skill.unlck_axe": "解锁双手斧技能树{SP}", - "hud.skill.unlck_hammer_title": "解锁双手锤专精", - "hud.skill.unlck_hammer": "解锁双手锤技能树{SP}", - "hud.skill.unlck_bow_title": "解锁弓专精", - "hud.skill.unlck_bow": "解锁弓技能树{SP}", - "hud.skill.unlck_staff_title": "解锁火焰法杖专精", - "hud.skill.unlck_staff": "解锁火焰法杖技能树{SP}", - "hud.skill.unlck_sceptre_title": "解锁生命权杖专精", - "hud.skill.unlck_sceptre": "解锁生命权杖技能树{SP}", - "hud.skill.dodge_title": "闪避", - "hud.skill.dodge": "翻滚可以躲避敌人的攻击{SP}", - "hud.skill.roll_energy_title": "体术(翻滚)", - "hud.skill.roll_energy": "减少每次翻滚需要消耗的耐力{boost}%{SP}", - "hud.skill.roll_speed_title": "迅捷", - "hud.skill.roll_speed": "加快{boost}%的翻滚速度{SP}", - "hud.skill.roll_dur_title": "飞身跃入", - "hud.skill.roll_dur": "翻滚可躲避敌人攻击的时间延长{boost}%{SP}", - "hud.skill.climbing_title": "攀爬", - "hud.skill.climbing": "你能够攀爬岩壁", - "hud.skill.climbing_cost_title": "体术(攀爬)", - "hud.skill.climbing_cost": "攀爬时耐力消耗速率降低{boost}%{SP}", - "hud.skill.climbing_speed_title": "攀岩高手", - "hud.skill.climbing_speed": "加快{boost}%的攀爬速度{SP}", - "hud.skill.swim_title": "游泳", - "hud.skill.swim": "在水中游动", - "hud.skill.swim_speed_title": "速泳", - "hud.skill.swim_speed": "加快{boost}%的游泳速度{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "生命窃取光束", - "hud.skill.sc_lifesteal": "窃取敌人的生命值", - "hud.skill.sc_lifesteal_damage_title": "伤害提升", - "hud.skill.sc_lifesteal_damage": "光束伤害提升{boost}%{SP}", - "hud.skill.sc_lifesteal_range_title": "范围提升", - "hud.skill.sc_lifesteal_range": "光束最大射程提升{boost}%{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "效率提升", - "hud.skill.sc_lifesteal_lifesteal": "生命窃取效率提升{boost}%{SP}", - "hud.skill.sc_lifesteal_regen_title": "法力回复", - "hud.skill.sc_lifesteal_regen": "每次击中敌人回复的法力增加{boost}%{SP}", - "hud.skill.sc_heal_title": "治愈光束", - "hud.skill.sc_heal": "你可以窃取敌人的生命值来治愈你的盟友", - "hud.skill.sc_heal_heal_title": "效率提升", - "hud.skill.sc_heal_heal": "生命治愈效果提高{boost}%{SP}", - "hud.skill.sc_heal_cost_title": "法力节省", - "hud.skill.sc_heal_cost": "每次治愈队友需要消耗的法力减少{boost}%{SP}", - "hud.skill.sc_heal_range_title": "范围提升", - "hud.skill.sc_heal_range": "光束最大射程提升{boost}%{SP}", - "hud.skill.sc_wardaura_unlock_title": "守护领域", - "hud.skill.sc_wardaura_unlock": "施展一个强大的魔法领域,守护你的盟友{SP}", - "hud.skill.sc_wardaura_strength_title": "效果提升", - "hud.skill.sc_wardaura_strength": "领域提供的效果加强{boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "持续时间", - "hud.skill.sc_wardaura_duration": "领域持续的时间延长{boost}%{SP}", - "hud.skill.sc_wardaura_range_title": "广域化", - "hud.skill.sc_wardaura_range": "领域覆盖的范围加大{boost}%{SP}", - "hud.skill.sc_wardaura_cost_title": "法力节省", - "hud.skill.sc_wardaura_cost": "施展领域需要消耗的法力减少{boost}%{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "范围提升", - "hud.skill.st_shockwave_range" : "冲击波扩散的范围扩大{boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "法力节省", - "hud.skill.st_shockwave_cost" : "施放烈焰花环需要消耗的法力减少{boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "冲击强化", - "hud.skill.st_shockwave_knockback" : "冲击波击退的效果提高{boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "伤害提升", - "hud.skill.st_shockwave_damage" : "冲击波造成的伤害提高{boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "烈焰花环", - "hud.skill.st_shockwave_unlock" : "释放强大的火焰冲击波,伤害并击退周遭敌人{SP}", - "hud.skill.st_flamethrower_title" : "火焰吐息", - "hud.skill.st_flamethrower" : "释放烈焰持续灼烧你的敌人", - "hud.skill.st_flame_velocity_title" : "高温", - "hud.skill.st_flame_velocity" : "火焰造成伤害的速度提高{boost}%{SP}", - "hud.skill.st_flamethrower_range_title" : "范围提升", - "hud.skill.st_flamethrower_range" : "吐息最大射程提升{boost}%{SP}", - "hud.skill.st_energy_drain_title" : "法力节省", - "hud.skill.st_energy_drain" : "吐息时法力消耗速率降低{boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "伤害提升", - "hud.skill.st_flamethrower_damage" : "吐息造成的伤害提高{boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "爆破专家", - "hud.skill.st_explosion_radius" : "火球爆炸的半径扩大{boost}%{SP}", - "hud.skill.st_energy_regen_title" : "法力回复", - "hud.skill.st_energy_regen" : "每次击中敌人回复的法力增加{boost}%{SP}", - "hud.skill.st_fireball_title" : "火球术", - "hud.skill.st_fireball" : "发射火球攻击敌人", - "hud.skill.st_damage_title" : "伤害提升", - "hud.skill.st_damage" : "火球造成的伤害提高{boost}%{SP}", - "hud.skill.st_explosion_title" : "爆炸", - "hud.skill.st_explosion" : "火球击中物体后会爆炸,造成区域伤害{SP}", - // Bow - // Bow - "hud.skill.bow_projectile_speed_title" : "神射手", - "hud.skill.bow_projectile_speed" : "箭矢速度和最大射程提高{boost}%{SP}", - "hud.skill.bow_arrow_count_title" : "射手", - "hud.skill.bow_arrow_count" : "当你跳跃时,能额外射出一支箭矢{SP}", - "hud.skill.bow_repeater_cost_title" : "耐力节省", - "hud.skill.bow_repeater_cost" : "施展腾空击需要消耗的耐力减少{boost}%{SP}", - "hud.skill.bow_repeater_glide_title" : "飞燕", - "hud.skill.bow_repeater_glide" : "你能腾飞得更远{SP}", - "hud.skill.bow_repeater_damage_title" : "伤害提升", - "hud.skill.bow_repeater_damage" : "每支箭矢造成的伤害提升{boost}%{SP}", - "hud.skill.bow_repeater_unlock_title" : "腾空击", - "hud.skill.bow_repeater_unlock" : "飞跃在空中,同时向敌人快速射出数支箭矢{SP}", - "hud.skill.bow_charged_title" : "蓄力射击", - "hud.skill.bow_charged" : "因为你愿意花更长时间蓄力以造成更大伤害", - "hud.skill.bow_charged_knockback_title" : "冲击强化", - "hud.skill.bow_charged_knockback" : "蓄力箭矢击退的效果提高{boost}%{SP}", - "hud.skill.bow_charged_move_speed_title" : "灵巧", - "hud.skill.bow_charged_move_speed" : "蓄力时的移动速度提高{boost}%{SP}", - "hud.skill.bow_charged_speed_title" : "专注", - "hud.skill.bow_charged_speed" : "蓄力效果达到最大化的速度加快{boost}%{SP}", - "hud.skill.bow_charged_projectile_speed_title" : "弹速强化", - "hud.skill.bow_charged_projectile_speed" : "蓄力箭矢飞行的速度提高{boost}%{SP}", - "hud.skill.bow_charged_drain_title" : "耐力节省", - "hud.skill.bow_charged_drain" : "蓄力时耐力消耗速率降低{boost}%{SP}", - "hud.skill.bow_charged_damage_title" : "伤害提升", - "hud.skill.bow_charged_damage" : "蓄力箭矢造成的伤害提升{boost}%{SP}", - "hud.skill.bow_energy_regen_title" : "耐力回复", - "hud.skill.bow_energy_regen" : "每次击中敌人回复的耐力增加{boost}%{SP}", - "hud.skill.bow_title" : "射箭", - "hud.skill.bow" : "不适合手抖的小朋友哦", - "hud.skill.bow_damage_title" : "伤害提升", - "hud.skill.bow_damage" : "箭矢造成的伤害提升{boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "震荡", - "hud.skill.hmr_leap_radius" : "千斤坠伤害的作用半径扩大{boost}米{SP}", - "hud.skill.hmr_leap_distance_title" : "奋力一跃", - "hud.skill.hmr_leap_distance" : "飞跃的最大距离提高{boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "耐力节省", - "hud.skill.hmr_leap_cost" : "施展千斤坠需要消耗的耐力减少{boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "冲击强化", - "hud.skill.hmr_leap_knockback" : "千斤坠击退的效果提高{boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "伤害提升", - "hud.skill.hmr_leap_damage" : "千斤坠造成的伤害提升{boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "千斤坠", - "hud.skill.hmr_unlock_leap" : "全力飞跃给予敌人强力一击{SP}", - "hud.skill.hmr_charged_melee_title" : "蓄力打击", - "hud.skill.hmr_charged_melee" : "蓄力造成强力打击", - "hud.skill.hmr_charged_rate_title" : "专注", - "hud.skill.hmr_charged_rate" : "蓄力效果达到最大化的速度加快{boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "耐力节省", - "hud.skill.hmr_charged_melee_nrg_drain" : "蓄力时耐力消耗速率降低{boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "伤害提升", - "hud.skill.hmr_charged_melee_damage" : "蓄力打击造成的伤害提升{boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "冲击强化", - "hud.skill.hmr_charged_melee_knockback" : "蓄力打击击退的效果提高{boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "锤击", - "hud.skill.hmr_single_strike" : "挥舞大锤打击敌人", - "hud.skill.hmr_single_strike_regen_title" : "热身(耐力回复)", - "hud.skill.hmr_single_strike_regen" : "随着连击数增加,每次击中敌人回复更多耐力{SP}", - "hud.skill.hmr_single_strike_speed_title" : "热身(攻击速度)", - "hud.skill.hmr_single_strike_speed" : "随着连击数增加,每次击中敌人攻击速度加快{SP}", - "hud.skill.hmr_single_strike_damage_title" : "热身(伤害)", - "hud.skill.hmr_single_strike_damage" : "随着连击数增加,每次击中敌人造成的伤害提升{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "冲击强化", - "hud.skill.hmr_single_strike_knockback" : "锤击击退的效果提高{boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "三连击", - "hud.skill.sw_trip_str": "三连击,劈,砍,刺", - "hud.skill.sw_trip_str_combo_title": "姿态调整", - "hud.skill.sw_trip_str_combo": "三连击与三连击之间能能更好的衔接{SP}", - "hud.skill.sw_trip_str_dmg_title": "热身(伤害)", - "hud.skill.sw_trip_str_dmg": "随着连击数增加,每次击中敌人造成的伤害提升{SP}", - "hud.skill.sw_trip_str_sp_title": "热身(攻击速度)", - "hud.skill.sw_trip_str_sp": "随着连击数增加,每次击中敌人攻击速度加快{SP}", - "hud.skill.sw_trip_str_reg_title": "热身(耐力回复)", - "hud.skill.sw_trip_str_reg": "随着连击数增加,每次击中敌人回复更多耐力{SP}", - "hud.skill.sw_dash_title": "突刺", - "hud.skill.sw_dash": "向前发动快速突刺,划伤敌人", - "hud.skill.sw_dash_dmg_title": "伤害提升", - "hud.skill.sw_dash_dmg": "突刺起始造成的伤害提升{boost}%{SP}", - "hud.skill.sw_dash_drain_title": "耐力节省", - "hud.skill.sw_dash_drain": "突刺发动需要消耗的耐力减少{boost}%{SP}", - "hud.skill.sw_dash_cost_title": "耐力节省", - "hud.skill.sw_dash_cost": "突刺时耐力消耗速率降低{boost}%{SP}", - "hud.skill.sw_dash_speed_title": "势如破竹", - "hud.skill.sw_dash_speed": "突刺前进的速度提高{boost}%{SP}", - "hud.skill.sw_dash_inf_title": "势不可挡", - "hud.skill.sw_dash_inf": "你可以持续不断地发动突刺{SP}", - "hud.skill.sw_dash_scale_title": "伤害提升", - "hud.skill.sw_dash_scale": "突刺最大造成的伤害提升{boost}%{SP}", - "hud.skill.sw_spin_title": "回旋斩", - "hud.skill.sw_spin": "发动强力的回旋斩伤害成片的敌人{SP}", - "hud.skill.sw_spin_dmg_title": "伤害提升", - "hud.skill.sw_spin_dmg": "回旋斩造成的伤害提升{boost}%{SP}", - "hud.skill.sw_spin_spd_title": "斩风", - "hud.skill.sw_spin_spd": "回旋斩斩击的速度加快{boost}%{SP}", - "hud.skill.sw_spin_cost_title": "耐力节省", - "hud.skill.sw_spin_cost": "每段回旋斩需要消耗的耐力减少{boost}%{SP}", - "hud.skill.sw_spin_spins_title": "旋转舞者(剑)", - "hud.skill.sw_spin_spins": "增加每次发动回旋斩斩击的次数{SP}", - "hud.skill.sw_interrupt_title": "纳刀术", - "hud.skill.sw_interrupt": "无视攻击动作的后摇,立刻进行其他动作{SP}", - // Axe - "hud.skill.axe_double_strike_title": "劈砍", - "hud.skill.axe_double_strike": "砍倒那些恶棍", - "hud.skill.axe_double_strike_combo_title": "二连击", - "hud.skill.axe_double_strike_combo": "解锁第二段攻击{SP}", - "hud.skill.axe_double_strike_damage_title": "热身(伤害)", - "hud.skill.axe_double_strike_damage": "随着连击数增加,每次击中敌人造成的伤害提升{SP}", - "hud.skill.axe_double_strike_speed_title": "热身(攻击速度)", - "hud.skill.axe_double_strike_speed": "随着连击数增加,每次击中敌人攻击速度加快{SP}", - "hud.skill.axe_double_strike_regen_title": "热身(耐力回复)", - "hud.skill.axe_double_strike_regen": "随着连击数增加,每次击中敌人回复更多耐力{SP}", - "hud.skill.axe_spin_title": "旋风斩", - "hud.skill.axe_spin": "大斧转转乐,绞杀周围目标", - "hud.skill.axe_infinite_axe_spin_title": "旋转舞者(斧)", - "hud.skill.axe_infinite_axe_spin": "有耐力的情况下你可以一直这么转下去{SP}", - "hud.skill.axe_spin_damage_title": "伤害提升", - "hud.skill.axe_spin_damage": "旋风斩造成的伤害提升{boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "直升机", - "hud.skill.axe_spin_helicopter": "旋风斩发动时你下落速度会减慢一点{SP}", - "hud.skill.axe_spin_speed_title": "龙卷风", - "hud.skill.axe_spin_speed": "旋风斩旋转的速度加快{boost}%{SP}", - "hud.skill.axe_spin_cost_title": "耐力节省", - "hud.skill.axe_spin_cost": "每段旋风斩需要消耗的耐力减少{boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "飞身一击", - "hud.skill.axe_unlock_leap": "飞身施展强力一劈{SP}", - "hud.skill.axe_leap_damage_title": "伤害提升", - "hud.skill.axe_leap_damage": "飞身一击造成的伤害提升{boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "冲击强化", - "hud.skill.axe_leap_knockback": "飞身一击击退的效果提高{boost}%{SP}", - "hud.skill.axe_leap_cost_title": "耐力节省", - "hud.skill.axe_leap_cost": "施展飞身一击需要消耗的耐力减少{boost}%{SP}", - "hud.skill.axe_leap_distance_title": "奋力一跃", - "hud.skill.axe_leap_distance": "跳跃距离提升{boost}%{SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_CN/hud/social.ftl b/assets/voxygen/i18n/zh_CN/hud/social.ftl new file mode 100644 index 0000000000..99b8fec0af --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = 社交 +hud-social-online = 在线: +hud-social-friends = 好友 +hud-social-not_yet_available = 尚不可用 +hud-social-faction = 帮派 +hud-social-play_online_fmt = { $nb_player } 玩家在线 +hud-social-name = 名称 +hud-social-level = 等级 +hud-social-zone = 地区 +hud-social-account = 账号 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/social.ron b/assets/voxygen/i18n/zh_CN/hud/social.ron deleted file mode 100644 index 2e78fed0e3..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "hud.social": "社交", - "hud.social.online": "在线:", - "hud.social.friends": "好友", - "hud.social.not_yet_available": "尚不可用", - "hud.social.faction": "帮派", - "hud.social.play_online_fmt": "{nb_player} 玩家在线", - "hud.social.name": "名称", - "hud.social.level": "等级", - "hud.social.zone": "地区", - "hud.social.account": "账号", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/zh_CN/hud/trade.ftl b/assets/voxygen/i18n/zh_CN/hud/trade.ftl new file mode 100644 index 0000000000..b23824e19f --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/hud/trade.ftl @@ -0,0 +1,17 @@ +hud-trade-trade_window = 交易窗口 +hud-trade-phase1_description = 将你要交易的物品拖到相应的区域. +hud-trade-phase2_description = 现在该交易已锁定,接下来你可以核对本次交易. +hud-trade-phase3_description = 交易正在处理中. +hud-trade-persons_offer = { $playername } 的报价 +hud-trade-has_accepted = + { $playername } + 已经接受 +hud-trade-accept = 接受 +hud-trade-decline = 拒绝 +hud-trade-invite_sent = 交易请求已发送至 { $playername }. +hud-trade-result-completed = 交易成功. +hud-trade-result-declined = 拒绝交易. +hud-trade-result-nospace = 没有足够空间来完成交易. +hud-trade-buy_price = 购买价格 +hud-trade-sell_price = 出售价格 +hud-trade-coin = 硬币 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/hud/trade.ron b/assets/voxygen/i18n/zh_CN/hud/trade.ron deleted file mode 100644 index 200ab438f4..0000000000 --- a/assets/voxygen/i18n/zh_CN/hud/trade.ron +++ /dev/null @@ -1,28 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - "hud.trade.trade_window": "交易窗口", - "hud.trade.phase1_description": "将你要交易的物品拖到相应的区域.", - "hud.trade.phase2_description": "现在该交易已锁定,接下来你可以核对本次交易.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "交易正在处理中.", - "hud.trade.persons_offer": "{playername} 的报价", - "hud.trade.has_accepted": "{playername}\n已经接受", - "hud.trade.accept": "接受", - "hud.trade.decline": "拒绝", - "hud.trade.invite_sent": "交易请求已发送至 {playername}.", - "hud.trade.result.completed": "交易成功.", - "hud.trade.result.declined": "拒绝交易.", - "hud.trade.result.nospace": "没有足够空间来完成交易.", - "hud.trade.buy_price": "购买价格", - "hud.trade.sell_price": "出售价格", - "hud.trade.coin": "硬币", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/zh_CN/main.ftl b/assets/voxygen/i18n/zh_CN/main.ftl new file mode 100644 index 0000000000..7bce1f5ad3 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/main.ftl @@ -0,0 +1,72 @@ +main-username = 用户名 +main-server = 服务器 +main-password = 密码 +main-connecting = 连接中 +main-creating_world = 创建世界中 +main-tip = 小提示: +main-notice = + 欢迎加入 Veloren Alpha 版本! + + 在你开始享受游戏之前,请注意以下事情: + + - 这是非常前期的 alpha 版本,你会遇到不少错误、未完成的游戏模式、未完善的游戏机制以及缺失的功能. + + - 如果有建设性的意见反馈或是错误汇报,可以通过 Reddit、GitLab 或者我们的 Discord 服务器联系我们. + + - Veloren 的授权条款是GPL3. 意思是你可以免费游玩, + 修改并重新发布游戏(衍生内容也必须是GPL3) + + - Veloren 是一个非营利的社区项目, 参与该项目的都是志愿者. + 如果你想在项目中看到你的身影,欢迎加入开发或艺术团队! + + 感谢你抽出宝贵的时间阅读此通知,希望你喜欢这款游戏! + + ~ The Veloren Devs +main-login_process = + 有关登录的信息: + + 请注意,你现在需要一个账户, + 才能在启用身份验证的服务器上游玩. + + 你可以通过下面的网站创建用户. + + https://veloren.net/account/. +main-login-server_not_found = 找不到服务器 +main-login-authentication_error = 服务器验证错误 +main-login-failed_auth_server_url_invalid = 无法连接到身份验证服务器 +main-login-insecure_auth_scheme = 认证服务器不支持HTTP.这并不安全的!出于开发目的,HTTP地址允许使用'localhost'或Debug版本 +main-login-server_full = 服务器已满 +main-login-untrusted_auth_server = 认证服务器不可信 +main-login-outdated_client_or_server = ServerWentMad: 可能的版本不兼容,请检查更新. +main-login-timeout = 超时: 服务器无法及时响应. +main-login-server_shut_down = 服务器已关闭 +main-login-network_error = 网络错误 +main-login-network_wrong_version = 服务器与客户端可能版本不兼容,请检查更新. +main-login-failed_sending_request = 认证服务器请求失败 +main-login-invalid_character = 选择的角色无效 +main-login-client_crashed = 客户端崩溃 +main-login-not_on_whitelist = 需要在管理员的白名单里才可以加入 +main-login-banned = 你被封禁的原因如下 +main-login-kicked = 你被踢出的原因如下 +main-login-select_language = 选择语言 +main-servers-select_server = 选择服务器 +loading-tips = + .a0 = 按下 '{ $gameinput-togglelantern }' 来点亮提灯. + .a1 = 按下 '{ $gameinput-help }' 查看所有默认快捷键. + .a2 = 你可以输入 /say 或 /s 只与您周围的玩家聊天. + .a3 = 你可以输入 /region 或 /r 只与你区域范围内的玩家聊天. + .a4 = 管理员可以输入 /build 指令来进入建造模式. + .a5 = 你可以输入 /group 或 /g 只与你的队伍的玩家聊天. + .a6 = 你可以输入 /tell 玩家名称 发送私人消息. + .a7 = 注意地面上的食物,箱子以及其他战利品! + .a8 = 背包里全是食物? 尝试使用它们制作更好的食物! + .a9 = 不知道做什么? 地图上褐色标点区域有地牢! + .a10 = 不要忘记调整图形设置. 按下 '{ $gameinput-settings }' 打开设置. + .a11 = 和其他人一起游玩时! 按下 '{ $gameinput-social }' 查看在线玩家. + .a12 = 按下 '{ $gameinput-dance }' 跳舞! + .a13 = 按下 '{ $gameinput-glide }' 可以打开滑翔翼并立刻起飞 + .a14 = Veloren 处于Pre-Alpha阶段. 我们每天都在努力改善它! + .a15 = 如果您想加入开发团队或与我们聊天,请加入我们的Discord服务器. + .a16 = 你可以在设置中的生命栏中切换显示你的生命状态. + .a17 = 坐在篝火旁(同时按下 '{ $gameinput-sit }' 键),会缓慢恢复血量. + .a18 = 需要更大的背包或更好的护甲来继续你的旅程吗? 按下 '{ $gameinput-crafting }' 打开制作菜单! \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/main.ron b/assets/voxygen/i18n/zh_CN/main.ron deleted file mode 100644 index 496c2d217c..0000000000 --- a/assets/voxygen/i18n/zh_CN/main.ron +++ /dev/null @@ -1,89 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - /// Start Main screen section - "main.username": "用户名", - "main.server": "服务器", - "main.password": "密码", - "main.connecting": "连接中", - "main.creating_world": "创建世界中", - "main.tip": "小提示:", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"欢迎加入 Veloren Alpha 版本! - -在你开始享受游戏之前,请注意以下事情: - -- 这是非常前期的 alpha 版本,你会遇到不少错误、未完成的游戏模式、未完善的游戏机制以及缺失的功能. - -- 如果有建设性的意见反馈或是错误汇报,可以通过 Reddit、GitLab 或者我们的 Discord 服务器联系我们. - -- Veloren 的授权条款是GPL3. 意思是你可以免费游玩, -修改并重新发布游戏(衍生内容也必须是GPL3) - -- Veloren 是一个非营利的社区项目, 参与该项目的都是志愿者. -如果你想在项目中看到你的身影,欢迎加入开发或艺术团队! - -感谢你抽出宝贵的时间阅读此通知,希望你喜欢这款游戏! - -~ The Veloren Devs"#, - - // Login process description - "main.login_process": r#"有关登录的信息: - -请注意,你现在需要一个账户, -才能在启用身份验证的服务器上游玩. - -你可以通过下面的网站创建用户. - -https://veloren.net/account/."#, - "main.login.server_not_found": "找不到服务器", - "main.login.authentication_error": "服务器验证错误", - "main.login.failed_auth_server_url_invalid": "无法连接到身份验证服务器", - "main.login.insecure_auth_scheme": "认证服务器不支持HTTP.这并不安全的!出于开发目的,HTTP地址允许使用'localhost'或Debug版本", - "main.login.server_full": "服务器已满", - "main.login.untrusted_auth_server": "认证服务器不可信", - "main.login.outdated_client_or_server": "ServerWentMad: 可能的版本不兼容,请检查更新.", - "main.login.timeout": "超时: 服务器无法及时响应.", - "main.login.server_shut_down": "服务器已关闭", - "main.login.network_error": "网络错误", - "main.login.network_wrong_version": "服务器与客户端可能版本不兼容,请检查更新.", - "main.login.failed_sending_request": "认证服务器请求失败", - "main.login.invalid_character": "选择的角色无效", - "main.login.client_crashed": "客户端崩溃", - "main.login.not_on_whitelist": "需要在管理员的白名单里才可以加入", - "main.login.banned": "你被封禁的原因如下", - "main.login.kicked": "你被踢出的原因如下", - "main.login.select_language": "选择语言", - - "main.servers.select_server": "选择服务器", - /// End Main screen section - }, - - - vector_map: { - "loading.tips": [ - "按下 '{gameinput.togglelantern}' 来点亮提灯.", - "按下 '{gameinput.help}' 查看所有默认快捷键.", - "你可以输入 /say 或 /s 只与您周围的玩家聊天.", - "你可以输入 /region 或 /r 只与你区域范围内的玩家聊天.", - "管理员可以输入 /build 指令来进入建造模式.", - "你可以输入 /group 或 /g 只与你的队伍的玩家聊天.", - "你可以输入 /tell 玩家名称 发送私人消息.", - "注意地面上的食物,箱子以及其他战利品!", - "背包里全是食物? 尝试使用它们制作更好的食物!", - "不知道做什么? 地图上褐色标点区域有地牢!", - "不要忘记调整图形设置. 按下 '{gameinput.settings}' 打开设置.", - "和其他人一起游玩时! 按下 '{gameinput.social}' 查看在线玩家.", - "按下 '{gameinput.dance}' 跳舞!", - "按下 '{gameinput.glide}' 可以打开滑翔翼并立刻起飞", - "Veloren 处于Pre-Alpha阶段. 我们每天都在努力改善它!", - "如果您想加入开发团队或与我们聊天,请加入我们的Discord服务器.", - "你可以在设置中的生命栏中切换显示你的生命状态.", - "坐在篝火旁(同时按下 '{gameinput.sit}' 键),会缓慢恢复血量.", - "需要更大的背包或更好的护甲来继续你的旅程吗? 按下 '{gameinput.crafting}' 打开制作菜单!", - ], - } -) diff --git a/assets/voxygen/i18n/zh_CN/npc.ftl b/assets/voxygen/i18n/zh_CN/npc.ftl new file mode 100644 index 0000000000..ef6429f497 --- /dev/null +++ b/assets/voxygen/i18n/zh_CN/npc.ftl @@ -0,0 +1,163 @@ +npc-speech-villager = + .a0 = 这不是很愉快的一天吗? + .a1 = 你今天过得怎么样? + .a2 = 早上好! + .a3 = 我不知道Catoblepas吃草时会在想什么. + .a4 = 你觉得这天气怎样? + .a5 = 一想到那些地牢就会让我感到害怕. 我希望有人能把它们清除掉. + .a6 = 当我变得更强大时,我想去山洞里兜兜风. + .a7 = 你有看见我的猫吗? + .a8 = 你听说过凶猛的陆地鲨吗?我听说它们生活在沙漠中. + .a9 = 他们说在洞穴中可以找到各种闪亮的宝石. + .a10 = 我超喜欢奶酪的! + .a11 = 你不进来吗?我们正要吃奶酪呢! + .a12 = 他们说蘑菇对你的健康有益,切勿单独食用. + .a13 = 别忘了饼干的事! + .a14 = 我只是崇拜矮人奶酪,我希望我能做到. + .a15 = 我想知道山的另一边是什么. + .a16 = 我希望有一天能制做出自己的滑翔伞. + .a17 = 你想看看我的花园吗?好吧,也许还需要再等一等. + .a18 = 在树林里漫步的美好一天! + .a19 = 成败与否?我想我会成为一名农夫. + .a20 = 你不认为我们的村庄是最好的吗? + .a21 = 你认为使尸体发光的原因是什么? + .a22 = 我认为是时候吃第二顿早餐了! + .a23 = 你曾经捉住过萤火虫吗? + .a24 = 我只是不明白那些蜥蜴人从何而来. + .a25 = 我希望有人能让狼远离村子. + .a26 = 昨晚我梦见了美妙的奶酪.这意味着什么? + .a27 = 我和哥哥一起留了一些奶酪.现在我不知道它是否还在.我称它为薛定谔的奶酪. + .a28 = 我和妹妹一起留了一些奶酪.现在我不知道它是否还在.我称它为薛定谔的奶酪. + .a29 = 有人应该对那些邪教徒做些什么.最好不是我. + .a30 = 我希望快点下雨.对农作物有好处. + .a31 = 我爱蜂蜜!但我讨厌蜜蜂. + .a32 = 我希望有一天能看到外面的世界.美好的生活不仅在这村庄里. +npc-speech-villager_decline_trade = + .a0 = 抱歉,我没有什么可交易的. + .a1 = 交易?就好像我得到了你可能感兴趣的任何东西. + .a2 = 房子是我的,我不会用它换任何东西. +npc-speech-merchant_advertisement = + .a0 = 你有兴趣和我的交易吗? + .a1 = 你想和我交易吗? + .a2 = 我有很多货物,你想看看吗? +npc-speech-merchant_busy = + .a0 = 嘿,轮到你了. + .a1 = 请稍等,我只是一个人,忙不过来. + .a2 = 你看到别人在你面前吗? + .a3 = 请稍等,接下让我来就行 + .a4 = 不要插队. + .a5 = 我很忙,稍后再回来. +npc-speech-merchant_trade_successful = + .a0 = 谢谢您与我交易! + .a1 = 谢谢您! +npc-speech-merchant_trade_declined = + .a0 = 也许下次可以,祝你有美好的一天! + .a1 = 太遗憾了,也许下次可以! +npc-speech-villager_cultist_alarm = + .a0 = 当心!那里有一个邪教徒! + .a1 = 拿起武器!信徒们要进攻了! + .a2 = 邪教徒怎么敢攻击我们的村庄! + .a3 = 该死的邪教徒! + .a4 = 这里决不容忍邪教徒! + .a5 = 凶恶的邪教徒! + .a6 = 肮脏的邪教徒,尝尝我的剑刃! + .a7 = 你们邪教徒的手上沾满了鲜血,别想洗清你们的罪孽! + .a8 = Billions of blistering blue barnacles! A cultist among us! + .a9 = 这个邪教徒的邪恶一生即将结束! + .a10 = 这个邪教徒是我的了! + .a11 = 准备跟你的造物主见面吧,肮脏的邪教徒! + .a12 = 我看到一个邪教徒!抓住他们! + .a13 = 我看到一个邪教徒!攻击! + .a14 = 我看到一个邪教徒!别让他跑了! + .a15 = 大多数的邪教徒都会在意死亡吗?! + .a16 = 决不原谅!永不忘记!忏悔吧,邪教徒! + .a17 = 去死吧,邪教徒! + .a18 = 你的恐怖统治即将终结! + .a19 = 你所做的这一切,罪有应得! + .a20 = 我们这里很不欢迎你这种家伙. + .a21 = 你应该下地狱! +npc-speech-villager_under_attack = + .a0 = 救命, 我们受到攻击! + .a1 = 救命! 我们受到攻击! + .a2 = 哎哟! 我受到攻击! + .a3 = 哎哟! 我受到攻击! 我需要帮助! + .a4 = 快救我! 我受到攻击! + .a5 = 我受到攻击! 救命! + .a6 = 我受到攻击! 我需要帮助! + .a7 = 救命! + .a8 = 救命! 救命! + .a9 = 救命! 救命! 救命! + .a10 = 我受到攻击! + .a11 = 啊啊啊啊! 我受到攻击! + .a12 = 啊啊啊啊! 我受到攻击! 救命! + .a13 = 救命! 我们受到攻击! + .a14 = 救命! 有杀人犯! + .a15 = 救命! 这里有一个杀人犯在逃跑! + .a16 = 救命! 他们想杀我! + .a17 = 守卫, 我受到攻击! + .a18 = 守卫! 我受到攻击! + .a19 = 我受到攻击! 守卫! + .a20 = 救命! 守卫! 我受到攻击! + .a21 = 守卫! 快来! + .a22 = 守卫! 守卫! + .a23 = 守卫! 这里有一个恶棍在攻击我! + .a24 = 守卫, 快杀死这个恶棍! + .a25 = 守卫! 这里有一个杀人犯! + .a26 = 守卫! 帮帮我! + .a27 = 你别想逃了! 守卫! + .a28 = 你是恶魔! + .a29 = 救命! + .a30 = 救救我! 拜托! + .a31 = 哎哟! 守卫! 救命! + .a32 = 他们会来找我的! + .a33 = 救命! 救命! 我被压迫了! + .a34 = 啊, 我们看到了这存在于系统里的暴力. + .a35 = 这只是擦伤而已! + .a36 = 停下来! + .a37 = 我曾经对你做过什么?! + .a38 = 不要攻击我了! + .a39 = 嘿! 注意你指向的东西! + .a40 = 可恶的家伙, 你们一起去死吧! + .a41 = 停下来! 然后滚蛋! + .a42 = 你现在让我很生气! + .a43 = 噢! 你以为你是谁?! + .a44 = 我会帮你的! + .a45 = 停, 请停一下! 我没有任何值钱的东西! + .a46 = 我把我的兄弟放在你身上, 他比我的大多了! + .a47 = 不, 我要告诉妈妈! + .a48 = 诅咒你! + .a49 = 请不要这么做. + .a50 = 那不是很好! + .a51 = 你的武器很好, 现在可以收起来了! + .a52 = 绕了我吧! + .a53 = 拜托了, 我还有家庭! + .a54 = 我还小就要死了! + .a55 = 我们可以谈谈这个吗? + .a56 = 暴力永远不是解决问题的方式! + .a57 = 今天真是非常糟糕的一天... + .a58 = 喂, 别打我! + .a59 = 诶! + .a60 = 真没礼貌! + .a61 = 停手, 求求你! + .a62 = 你有病啊! + .a63 = 这不好玩. + .a64 = 你怎么敢?! + .a65 = 你会为此复出代价的! + .a66 = 坚持下去你会后悔的! + .a67 = 不要让我伤害你! + .a68 = 这肯定有什么误会! + .a69 = 你没必要这样对我吧! + .a70 = 再见吧, 恶魔! + .a71 = 真的好疼! + .a72 = 为什么要这么做? + .a73 = 神经病啊, 停手! + .a74 = 你让我和别人感到很迷惑! + .a75 = 我不应该这样! + .a76 = 请不要再这样做. + .a77 = 守卫, 把这个怪物扔进湖里! + .a78 = 我会把怪兽放在你身上! + .a79 = 为什么是我...? +npc-speech-villager_enemy_killed = + .a0 = 我消灭了我的敌人! + .a1 = 终于和平了! + .a2 = ...现在我在做什么? \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_CN/npc.ron b/assets/voxygen/i18n/zh_CN/npc.ron deleted file mode 100644 index 03df6f1099..0000000000 --- a/assets/voxygen/i18n/zh_CN/npc.ron +++ /dev/null @@ -1,183 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// 本地化 "Simplified Chinese" 简体中文 -( - string_map: { - - }, - - vector_map: { - "npc.speech.villager": [ - "这不是很愉快的一天吗?", - "你今天过得怎么样?", - "早上好!", - "我不知道Catoblepas吃草时会在想什么.", - "你觉得这天气怎样?", - "一想到那些地牢就会让我感到害怕. 我希望有人能把它们清除掉.", - "当我变得更强大时,我想去山洞里兜兜风.", - "你有看见我的猫吗?", - "你听说过凶猛的陆地鲨吗?我听说它们生活在沙漠中.", - "他们说在洞穴中可以找到各种闪亮的宝石.", - "我超喜欢奶酪的!", - "你不进来吗?我们正要吃奶酪呢!", - "他们说蘑菇对你的健康有益,切勿单独食用.", - "别忘了饼干的事!", - "我只是崇拜矮人奶酪,我希望我能做到.", - "我想知道山的另一边是什么.", - "我希望有一天能制做出自己的滑翔伞.", - "你想看看我的花园吗?好吧,也许还需要再等一等.", - "在树林里漫步的美好一天!", - "成败与否?我想我会成为一名农夫.", - "你不认为我们的村庄是最好的吗?", - "你认为使尸体发光的原因是什么?", - "我认为是时候吃第二顿早餐了!", - "你曾经捉住过萤火虫吗?", - "我只是不明白那些蜥蜴人从何而来.", - "我希望有人能让狼远离村子.", - "昨晚我梦见了美妙的奶酪.这意味着什么?", - "我和哥哥一起留了一些奶酪.现在我不知道它是否还在.我称它为薛定谔的奶酪.", - "我和妹妹一起留了一些奶酪.现在我不知道它是否还在.我称它为薛定谔的奶酪.", - "有人应该对那些邪教徒做些什么.最好不是我.", - "我希望快点下雨.对农作物有好处.", - "我爱蜂蜜!但我讨厌蜜蜂.", - "我希望有一天能看到外面的世界.美好的生活不仅在这村庄里.", - ], - "npc.speech.villager_decline_trade": [ - "抱歉,我没有什么可交易的.", - "交易?就好像我得到了你可能感兴趣的任何东西.", - "房子是我的,我不会用它换任何东西.", - ], - "npc.speech.merchant_advertisement": [ - "你有兴趣和我的交易吗?", - "你想和我交易吗?", - "我有很多货物,你想看看吗?" - ], - "npc.speech.merchant_busy": [ - "嘿,轮到你了.", - "请稍等,我只是一个人,忙不过来.", - "你看到别人在你面前吗?", - "请稍等,接下让我来就行", - "不要插队.", - "我很忙,稍后再回来." - ], - "npc.speech.merchant_trade_successful": [ - "谢谢您与我交易!", - "谢谢您!", - ], - "npc.speech.merchant_trade_declined": [ - "也许下次可以,祝你有美好的一天!", - "太遗憾了,也许下次可以!" - ], - "npc.speech.villager_cultist_alarm": [ - "当心!那里有一个邪教徒!", - "拿起武器!信徒们要进攻了!", - "邪教徒怎么敢攻击我们的村庄!", - "该死的邪教徒!", - "这里决不容忍邪教徒!", - "凶恶的邪教徒!", - "肮脏的邪教徒,尝尝我的剑刃!", - "你们邪教徒的手上沾满了鲜血,别想洗清你们的罪孽!", - "Billions of blistering blue barnacles! A cultist among us!", - "这个邪教徒的邪恶一生即将结束!", - "这个邪教徒是我的了!", - "准备跟你的造物主见面吧,肮脏的邪教徒!", - "我看到一个邪教徒!抓住他们!", - "我看到一个邪教徒!攻击!", - "我看到一个邪教徒!别让他跑了!", - "大多数的邪教徒都会在意死亡吗?!", - "决不原谅!永不忘记!忏悔吧,邪教徒!", - "去死吧,邪教徒!", - "你的恐怖统治即将终结!", - "你所做的这一切,罪有应得!", - "我们这里很不欢迎你这种家伙.", - "你应该下地狱!", - ], - "npc.speech.villager_under_attack": [ - "救命, 我们受到攻击!", - "救命! 我们受到攻击!", - "哎哟! 我受到攻击!", - "哎哟! 我受到攻击! 我需要帮助!", - "快救我! 我受到攻击!", - "我受到攻击! 救命!", - "我受到攻击! 我需要帮助!", - "救命!", - "救命! 救命!", - "救命! 救命! 救命!", - "我受到攻击!", - "啊啊啊啊! 我受到攻击!", - "啊啊啊啊! 我受到攻击! 救命!", - "救命! 我们受到攻击!", - "救命! 有杀人犯!", - "救命! 这里有一个杀人犯在逃跑!", - "救命! 他们想杀我!", - "守卫, 我受到攻击!", - "守卫! 我受到攻击!", - "我受到攻击! 守卫!", - "救命! 守卫! 我受到攻击!", - "守卫! 快来!", - "守卫! 守卫!", - "守卫! 这里有一个恶棍在攻击我!", - "守卫, 快杀死这个恶棍!", - "守卫! 这里有一个杀人犯!", - "守卫! 帮帮我!", - "你别想逃了! 守卫!", - "你是恶魔!", - "救命!", - "救救我! 拜托!", - "哎哟! 守卫! 救命!", - "他们会来找我的!", - "救命! 救命! 我被压迫了!", - "啊, 我们看到了这存在于系统里的暴力.", - "这只是擦伤而已!", - "停下来!", - "我曾经对你做过什么?!", - "不要攻击我了!", - "嘿! 注意你指向的东西!", - "可恶的家伙, 你们一起去死吧!", - "停下来! 然后滚蛋!", - "你现在让我很生气!", - "噢! 你以为你是谁?!", - "我会帮你的!", - "停, 请停一下! 我没有任何值钱的东西!", - "我把我的兄弟放在你身上, 他比我的大多了!", - "不, 我要告诉妈妈!", - "诅咒你!", - "请不要这么做.", - "那不是很好!", - "你的武器很好, 现在可以收起来了!", - "绕了我吧!", - "拜托了, 我还有家庭!", - "我还小就要死了!", - "我们可以谈谈这个吗?", - "暴力永远不是解决问题的方式!", - "今天真是非常糟糕的一天...", - "喂, 别打我!", - "诶!", - "真没礼貌!", - "停手, 求求你!", - "你有病啊!", - "这不好玩.", - "你怎么敢?!", - "你会为此复出代价的!", - "坚持下去你会后悔的!", - "不要让我伤害你!", - "这肯定有什么误会!", - "你没必要这样对我吧!", - "再见吧, 恶魔!", - "真的好疼!", - "为什么要这么做?", - "神经病啊, 停手!", - "你让我和别人感到很迷惑!", - "我不应该这样!", - "请不要再这样做.", - "守卫, 把这个怪物扔进湖里!", - "我会把怪兽放在你身上!", - "为什么是我...?", - ], - "npc.speech.villager_enemy_killed": [ - "我消灭了我的敌人!", - "终于和平了!", - "...现在我在做什么?", - ] - } -) diff --git a/assets/voxygen/i18n/zh_TW/buff.ftl b/assets/voxygen/i18n/zh_TW/buff.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/buff.ron b/assets/voxygen/i18n/zh_TW/buff.ron deleted file mode 100644 index 9942ee4a90..0000000000 --- a/assets/voxygen/i18n/zh_TW/buff.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/char_selection.ftl b/assets/voxygen/i18n/zh_TW/char_selection.ftl new file mode 100644 index 0000000000..a609de8a3e --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/char_selection.ftl @@ -0,0 +1,18 @@ +char_selection-delete_permanently = 永久刪除這個角色嗎? +char_selection-change_server = 變更伺服器 +char_selection-enter_world = 進入世界 +char_selection-logout = 登出 +char_selection-create_new_charater = 建立心角色 +char_selection-character_creation = 角色建立 +char_selection-human_default = 預設人類 +char_selection-level_fmt = 等級 { $level_nb } +char_selection-uncanny_valley = 怪異峽谷 +char_selection-plains_of_uncertainty = 疑惑平原 +char_selection-beard = 鬍鬚 +char_selection-hair_style = 頭髮造型 +char_selection-hair_color = 頭髮顏色 +char_selection-chest_color = 上半身顏色 +char_selection-eye_color = 眼睛顏色 +char_selection-skin = 膚色 +char_selection-eyebrows = 眉毛 +char_selection-accessories = 飾品 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/char_selection.ron b/assets/voxygen/i18n/zh_TW/char_selection.ron deleted file mode 100644 index 10b01b0338..0000000000 --- a/assets/voxygen/i18n/zh_TW/char_selection.ron +++ /dev/null @@ -1,29 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - "char_selection.delete_permanently": "永久刪除這個角色嗎?", - "char_selection.change_server": "變更伺服器", - "char_selection.enter_world": "進入世界", - "char_selection.logout": "登出", - "char_selection.create_new_charater": "建立心角色", - "char_selection.character_creation": "角色建立", - - "char_selection.human_default": "預設人類", - "char_selection.level_fmt": "等級 {level_nb}", - "char_selection.uncanny_valley": "怪異峽谷", - "char_selection.plains_of_uncertainty": "疑惑平原", - "char_selection.beard": "鬍鬚", - "char_selection.hair_style": "頭髮造型", - "char_selection.hair_color": "頭髮顏色", - "char_selection.chest_color": "上半身顏色", - "char_selection.eye_color": "眼睛顏色", - "char_selection.skin": "膚色", - "char_selection.eyebrows": "眉毛", - "char_selection.accessories": "飾品", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/common.ftl b/assets/voxygen/i18n/zh_TW/common.ftl new file mode 100644 index 0000000000..9aa7a28c1d --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/common.ftl @@ -0,0 +1,41 @@ +common-username = 帳號名稱 +common-singleplayer = 單人模式 +common-multiplayer = 多人模式 +common-servers = 伺服器 +common-quit = 退出 +common-settings = 設定 +common-languages = 語言 +common-interface = 界面 +common-gameplay = 遊戲 +common-controls = 控制 +common-video = 畫面 +common-sound = 聲音 +common-resume = 繼續 +common-characters = 角色 +common-close = 關閉 +common-yes = 是 +common-no = 否 +common-back = 返回 +common-create = 建立 +common-okay = 好 +common-accept = 接受 +common-disclaimer = 免責聲明 +common-cancel = 取消 +common-none = 無 +common-error = 錯誤 +common-fatal_error = 致命錯誤 +common-connection_lost = + 連線中斷! + 檢查看看伺服器重啟了嗎? + 客戶端有更新了嗎? +common-races-orc = 獸人 +common-races-human = 人類 +common-races-dwarf = 矮人 +common-races-elf = 精靈 +common-races-draugr = 不死族 +common-races-danari = 丹那利 +common-weapons-axe = 斧 +common-weapons-sword = 劍 +common-weapons-staff = 杖 +common-weapons-bow = 弓 +common-weapons-hammer = 鎚 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/common.ron b/assets/voxygen/i18n/zh_TW/common.ron deleted file mode 100644 index 935c2e67f5..0000000000 --- a/assets/voxygen/i18n/zh_TW/common.ron +++ /dev/null @@ -1,57 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "帳號名稱", - "common.singleplayer": "單人模式", - "common.multiplayer": "多人模式", - "common.servers": "伺服器", - "common.quit": "退出", - "common.settings": "設定", - "common.languages": "語言", - "common.interface": "界面", - "common.gameplay": "遊戲", - "common.controls": "控制", - "common.video": "畫面", - "common.sound": "聲音", - "common.resume": "繼續", - "common.characters": "角色", - "common.close": "關閉", - "common.yes": "是", - "common.no": "否", - "common.back": "返回", - "common.create": "建立", - "common.okay": "好", - "common.accept": "接受", - "common.disclaimer": "免責聲明", - "common.cancel": "取消", - "common.none": "無", - "common.error": "錯誤", - "common.fatal_error": "致命錯誤", - - // Message when connection to the server is lost - "common.connection_lost": r#"連線中斷! -檢查看看伺服器重啟了嗎? -客戶端有更新了嗎?"#, - - - "common.races.orc": "獸人", - "common.races.human": "人類", - "common.races.dwarf": "矮人", - "common.races.elf": "精靈", - "common.races.draugr": "不死族", - "common.races.danari": "丹那利", - - "common.weapons.axe": "斧", - "common.weapons.sword": "劍", - "common.weapons.staff": "杖", - "common.weapons.bow": "弓", - "common.weapons.hammer": "鎚", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/esc_menu.ftl b/assets/voxygen/i18n/zh_TW/esc_menu.ftl new file mode 100644 index 0000000000..ecc43ce5b2 --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = 登出 +esc_menu-quit_game = 退出遊戲 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/esc_menu.ron b/assets/voxygen/i18n/zh_TW/esc_menu.ron deleted file mode 100644 index 306b0e99f4..0000000000 --- a/assets/voxygen/i18n/zh_TW/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - "esc_menu.logout": "登出", - "esc_menu.quit_game": "退出遊戲", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/gameinput.ftl b/assets/voxygen/i18n/zh_TW/gameinput.ftl new file mode 100644 index 0000000000..39c4a0883f --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/gameinput.ftl @@ -0,0 +1 @@ +gameinput-greet = 打招呼 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/gameinput.ron b/assets/voxygen/i18n/zh_TW/gameinput.ron deleted file mode 100644 index 251c0254e9..0000000000 --- a/assets/voxygen/i18n/zh_TW/gameinput.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - "gameinput.greet": "打招呼", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/bag.ftl b/assets/voxygen/i18n/zh_TW/hud/bag.ftl new file mode 100644 index 0000000000..14a024b0b2 --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/hud/bag.ftl @@ -0,0 +1,5 @@ +hud-bag-inventory = 的物品欄 +hud-bag-stats_title = 的狀態 +hud-bag-exp = 經驗 +hud-bag-armor = 護甲 +hud-bag-stats = 狀態 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/hud/bag.ron b/assets/voxygen/i18n/zh_TW/hud/bag.ron deleted file mode 100644 index b7deda04c5..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/bag.ron +++ /dev/null @@ -1,17 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - // Inventory - "hud.bag.inventory": "的物品欄", - "hud.bag.stats_title": "的狀態", - "hud.bag.exp": "經驗", - "hud.bag.armor": "護甲", - "hud.bag.stats": "狀態", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/char_window.ftl b/assets/voxygen/i18n/zh_TW/hud/char_window.ftl new file mode 100644 index 0000000000..28d4758ae9 --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/hud/char_window.ftl @@ -0,0 +1,7 @@ +character_window-character_name = 角色名稱 +character_window-character_stats = + 耐力 + + 敏捷 + + 法力 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/hud/char_window.ron b/assets/voxygen/i18n/zh_TW/hud/char_window.ron deleted file mode 100644 index 2b2c284546..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/char_window.ron +++ /dev/null @@ -1,20 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - /// Start character window section - "character_window.character_name": "角色名稱", - // Charater stats - "character_window.character_stats": r#"耐力 - -敏捷 - -法力 -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/chat.ftl b/assets/voxygen/i18n/zh_TW/hud/chat.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/hud/chat.ron b/assets/voxygen/i18n/zh_TW/hud/chat.ron deleted file mode 100644 index 9942ee4a90..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/chat.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/crafting.ftl b/assets/voxygen/i18n/zh_TW/hud/crafting.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/hud/crafting.ron b/assets/voxygen/i18n/zh_TW/hud/crafting.ron deleted file mode 100644 index 9942ee4a90..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/crafting.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/group.ftl b/assets/voxygen/i18n/zh_TW/hud/group.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/hud/group.ron b/assets/voxygen/i18n/zh_TW/hud/group.ron deleted file mode 100644 index 9942ee4a90..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/group.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/map.ftl b/assets/voxygen/i18n/zh_TW/hud/map.ftl new file mode 100644 index 0000000000..e674f39257 --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/hud/map.ftl @@ -0,0 +1,2 @@ +hud-map-map_title = 地圖 +hud-map-qlog_title = 任務 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/hud/map.ron b/assets/voxygen/i18n/zh_TW/hud/map.ron deleted file mode 100644 index 21ac3c7015..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/map.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - // Map and Questlog - "hud.map.map_title": "地圖", - "hud.map.qlog_title": "任務", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/misc.ftl b/assets/voxygen/i18n/zh_TW/hud/misc.ftl new file mode 100644 index 0000000000..4c7d4b118e --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/hud/misc.ftl @@ -0,0 +1,48 @@ +hud-do_not_show_on_startup = 開啟時不顯示這個 +hud-show_tips = 顯示提示 +hud-quests = 任務 +hud-you_died = 死亡 +hud-press_key_to_show_keybindings_fmt = 按 { $key } 以顯示按鍵設置 +hud-press_key_to_show_debug_info_fmt = 按 { $key } 以顯示除錯資訊 +hud-press_key_to_toggle_keybindings_fmt = 按 { $key } 以切換按鍵設置 +hud-press_key_to_toggle_debug_info_fmt = 按 { $key } 以切換除錯資訊 +hud-press_key_to_respawn = 按 { $key } 以重生在上一個營火堆。 +hud-welcome = + 歡迎來到 Veloren Alpha 版, + + + 以下是些開始前的提示: + + + 最重要的提示:想設置重生點請在聊天欄輸入 /waypoint 。 + + 就算死了也可以作! + + + 按 F1 可以查看按鍵設置。 + + 在聊天欄輸入 /help 可以查看聊天指令 + + + 寶箱和物品會隨機重生在世界中! + + 點擊右鍵能收集它們。 + + 要真的使用收集到的物品,請按「B」開啟物品欄。 + + 在背包中雙擊物品來使用或裝備它們。 + + 要拋棄它們的話,可以按它們一次然後再點背包外面一次 + + + Veloren 半夜會特別暗。 + + 在聊天欄輸入 /lantern 可以點亮提燈 + + + 想要用滑鼠關閉這個視窗?請按 TAB! + + + 祝您的 Veloren 旅途愉快。 +hud-spell = 法術 +hud-free_look_indicator = 進入自由視角中 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/hud/misc.ron b/assets/voxygen/i18n/zh_TW/hud/misc.ron deleted file mode 100644 index 2bd08e3fb7..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/misc.ron +++ /dev/null @@ -1,65 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - "hud.do_not_show_on_startup": "開啟時不顯示這個", - "hud.show_tips": "顯示提示", - "hud.quests": "任務", - "hud.you_died": "死亡", - - "hud.press_key_to_show_keybindings_fmt": "按 {key} 以顯示按鍵設置", - "hud.press_key_to_show_debug_info_fmt": "按 {key} 以顯示除錯資訊", - "hud.press_key_to_toggle_keybindings_fmt": "按 {key} 以切換按鍵設置", - "hud.press_key_to_toggle_debug_info_fmt": "按 {key} 以切換除錯資訊", - - // Respawn message - "hud.press_key_to_respawn": r#"按 {key} 以重生在上一個營火堆。"#, - - // Welcome message - "hud.welcome": r#"歡迎來到 Veloren Alpha 版, - - -以下是些開始前的提示: - - -最重要的提示:想設置重生點請在聊天欄輸入 /waypoint 。 - -就算死了也可以作! - - -按 F1 可以查看按鍵設置。 - -在聊天欄輸入 /help 可以查看聊天指令 - - -寶箱和物品會隨機重生在世界中! - -點擊右鍵能收集它們。 - -要真的使用收集到的物品,請按「B」開啟物品欄。 - -在背包中雙擊物品來使用或裝備它們。 - -要拋棄它們的話,可以按它們一次然後再點背包外面一次 - - -Veloren 半夜會特別暗。 - -在聊天欄輸入 /lantern 可以點亮提燈 - - -想要用滑鼠關閉這個視窗?請按 TAB! - - -祝您的 Veloren 旅途愉快。"#, - - - "hud.spell": "法術", - "hud.free_look_indicator": "進入自由視角中", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/sct.ftl b/assets/voxygen/i18n/zh_TW/hud/sct.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/hud/sct.ron b/assets/voxygen/i18n/zh_TW/hud/sct.ron deleted file mode 100644 index 9942ee4a90..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/sct.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/settings.ftl b/assets/voxygen/i18n/zh_TW/hud/settings.ftl new file mode 100644 index 0000000000..b5b2080541 --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/hud/settings.ftl @@ -0,0 +1,125 @@ +hud-settings-general = 一般 +hud-settings-none = 無 +hud-settings-press_behavior-toggle = 切換 +hud-settings-press_behavior-hold = 按住 +hud-settings-help_window = 協助視窗 +hud-settings-debug_info = 除錯資訊 +hud-settings-tips_on_startup = 開啟時顯示提示 +hud-settings-ui_scale = 界面大小 +hud-settings-relative_scaling = 相對大小 +hud-settings-custom_scaling = 自訂大小 +hud-settings-crosshair = 準星 +hud-settings-opacity = 透明度 +hud-settings-hotbar = 角色資訊 +hud-settings-toggle_shortcuts = 顯示快捷鍵 +hud-settings-toggle_bar_experience = 顯示經驗條 +hud-settings-scrolling_combat_text = 戰鬥訊息 +hud-settings-incoming_damage = 所受傷害 +hud-settings-energybar_numbers = 能量條 +hud-settings-values = 數字 +hud-settings-percentages = 百分比 +hud-settings-chat = 聊天欄 +hud-settings-background_opacity = 背景透明度 +hud-settings-pan_sensitivity = 滑鼠靈敏度 +hud-settings-zoom_sensitivity = 縮放靈敏度 +hud-settings-invert_scroll_zoom = 反轉滾輪縮放 +hud-settings-invert_mouse_y_axis = 反轉 Y 軸 +hud-settings-free_look_behavior = 自由視角 +hud-settings-view_distance = 視野距離 +hud-settings-maximum_fps = 最高 FPS +hud-settings-fov = 視野 +hud-settings-gamma = Gamma +hud-settings-antialiasing_mode = 反鋸齒模式 +hud-settings-cloud_rendering_mode = 雲朵渲染模式 +hud-settings-fluid_rendering_mode = 流體渲染模式 +hud-settings-fluid_rendering_mode-cheap = 簡單 +hud-settings-fluid_rendering_mode-shiny = 閃爍 +hud-settings-cloud_rendering_mode-regular = 一般 +hud-settings-fullscreen = 全螢幕 +hud-settings-save_window_size = 儲存螢幕大小 +hud-settings-music_volume = 音樂音量 +hud-settings-sound_effect_volume = 音效音量 +hud-settings-audio_device = 音訊設備 +hud-settings-control_names = + 顯示滑鼠 + 切換協助視窗 + 切換界面 + 切換 FPS 與除錯資訊 + 拍照 + 切換名稱標籤 + 切換全螢幕 + + + 往前移動 + 往左移動 + 往右移動 + 往後移動 + + 跳躍 + + 滑翔翼 + + 閃避 + + 翻滾 + + 攀爬 + + 往下攀爬 + + 自動行走 + + 收刀/拔出武器 + + 戴上/卸下頭盔 + + 坐下 + + 騎乘 + + 互動 + + + 基本攻擊 + 附屬攻擊/格檔/瞄準 + + + 技能條欄位 1 + 技能條欄位 2 + 技能條欄位 3 + 技能條欄位 4 + 技能條欄位 5 + 技能條欄位 6 + 技能條欄位 7 + 技能條欄位 8 + 技能條欄位 9 + 技能條欄位 10 + + + 暫停選單 + 設定 + 社交 + 地圖 + 法術書 + 角色 + 任務日誌 + 背包 + + + + 傳送聊天訊息 + 滾動聊天欄 + + + 自由視角 + + 聊天指令: + + /alias [Name] - 變更的聊天名稱 + /tp [Name] - 傳送到其他玩家 + /jump - 偏移自己的位置 + /goto - 傳送到指定位置 + /kill - 自殺 + /pig - 生成一隻豬 NPC + /wolf - 生成一隻狼 NPC + /help - 顯示聊天指令 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/hud/settings.ron b/assets/voxygen/i18n/zh_TW/hud/settings.ron deleted file mode 100644 index c0f1d39a3c..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/settings.ron +++ /dev/null @@ -1,142 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - // Settings - "hud.settings.general": "一般", - "hud.settings.none": "無", - "hud.settings.press_behavior.toggle": "切換", - "hud.settings.press_behavior.hold": "按住", - "hud.settings.help_window": "協助視窗", - "hud.settings.debug_info": "除錯資訊", - "hud.settings.tips_on_startup": "開啟時顯示提示", - "hud.settings.ui_scale": "界面大小", - "hud.settings.relative_scaling": "相對大小", - "hud.settings.custom_scaling": "自訂大小", - "hud.settings.crosshair": "準星", - "hud.settings.opacity": "透明度", - "hud.settings.hotbar": "角色資訊", - "hud.settings.toggle_shortcuts": "顯示快捷鍵", - "hud.settings.toggle_bar_experience": "顯示經驗條", - "hud.settings.scrolling_combat_text": "戰鬥訊息", - "hud.settings.incoming_damage": "所受傷害", - "hud.settings.energybar_numbers": "能量條", - "hud.settings.values": "數字", - "hud.settings.percentages": "百分比", - "hud.settings.chat": "聊天欄", - "hud.settings.background_opacity": "背景透明度", - "hud.settings.none": "無", - - "hud.settings.pan_sensitivity": "滑鼠靈敏度", - "hud.settings.zoom_sensitivity": "縮放靈敏度", - "hud.settings.invert_scroll_zoom": "反轉滾輪縮放", - "hud.settings.invert_mouse_y_axis": "反轉 Y 軸", - "hud.settings.free_look_behavior": "自由視角", - - "hud.settings.view_distance": "視野距離", - "hud.settings.maximum_fps": "最高 FPS", - "hud.settings.fov": "視野", - "hud.settings.gamma": "Gamma", - "hud.settings.antialiasing_mode": "反鋸齒模式", - "hud.settings.cloud_rendering_mode": "雲朵渲染模式", - "hud.settings.fluid_rendering_mode": "流體渲染模式", - "hud.settings.fluid_rendering_mode.cheap": "簡單", - "hud.settings.fluid_rendering_mode.shiny": "閃爍", - "hud.settings.cloud_rendering_mode.regular": "一般", - "hud.settings.fullscreen": "全螢幕", - "hud.settings.save_window_size": "儲存螢幕大小", - - "hud.settings.music_volume": "音樂音量", - "hud.settings.sound_effect_volume": "音效音量", - "hud.settings.audio_device": "音訊設備", - - // Control list - "hud.settings.control_names": r#"顯示滑鼠 -切換協助視窗 -切換界面 -切換 FPS 與除錯資訊 -拍照 -切換名稱標籤 -切換全螢幕 - - -往前移動 -往左移動 -往右移動 -往後移動 - -跳躍 - -滑翔翼 - -閃避 - -翻滾 - -攀爬 - -往下攀爬 - -自動行走 - -收刀/拔出武器 - -戴上/卸下頭盔 - -坐下 - -騎乘 - -互動 - - -基本攻擊 -附屬攻擊/格檔/瞄準 - - -技能條欄位 1 -技能條欄位 2 -技能條欄位 3 -技能條欄位 4 -技能條欄位 5 -技能條欄位 6 -技能條欄位 7 -技能條欄位 8 -技能條欄位 9 -技能條欄位 10 - - -暫停選單 -設定 -社交 -地圖 -法術書 -角色 -任務日誌 -背包 - - - -傳送聊天訊息 -滾動聊天欄 - - -自由視角 - -聊天指令: - -/alias [Name] - 變更的聊天名稱 -/tp [Name] - 傳送到其他玩家 -/jump - 偏移自己的位置 -/goto - 傳送到指定位置 -/kill - 自殺 -/pig - 生成一隻豬 NPC -/wolf - 生成一隻狼 NPC -/help - 顯示聊天指令"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/skills.ftl b/assets/voxygen/i18n/zh_TW/hud/skills.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/hud/skills.ron b/assets/voxygen/i18n/zh_TW/hud/skills.ron deleted file mode 100644 index 9942ee4a90..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/skills.ron +++ /dev/null @@ -1,11 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/hud/social.ftl b/assets/voxygen/i18n/zh_TW/hud/social.ftl new file mode 100644 index 0000000000..e176e4635d --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/hud/social.ftl @@ -0,0 +1,6 @@ +hud-social = 社交 +hud-social-online = 線上 +hud-social-friends = 朋友 +hud-social-not_yet_available = 尚未開放 +hud-social-faction = 陣營 +hud-social-play_online_fmt = { $nb_player } 位朋友在線 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/hud/social.ron b/assets/voxygen/i18n/zh_TW/hud/social.ron deleted file mode 100644 index 109a665f9e..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/social.ron +++ /dev/null @@ -1,18 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - "hud.social": "社交", - "hud.social.online": "線上", - "hud.social.friends": "朋友", - "hud.social.not_yet_available": "尚未開放", - "hud.social.faction": "陣營", - "hud.social.play_online_fmt": "{nb_player} 位朋友在線", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/zh_TW/hud/trade.ftl b/assets/voxygen/i18n/zh_TW/hud/trade.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/hud/trade.ron b/assets/voxygen/i18n/zh_TW/hud/trade.ron deleted file mode 100644 index 4feee7e25a..0000000000 --- a/assets/voxygen/i18n/zh_TW/hud/trade.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/zh_TW/main.ftl b/assets/voxygen/i18n/zh_TW/main.ftl new file mode 100644 index 0000000000..0c16cdb3da --- /dev/null +++ b/assets/voxygen/i18n/zh_TW/main.ftl @@ -0,0 +1,40 @@ +main-connecting = 連線中 +main-creating_world = 生成世界中 +main-notice = + 歡迎加入 Veloren alpha 版! + + 在您開始享受遊戲之前,請注意一些事情: + + - 這是非常前期的 alpha 版本,您會遇到不少錯誤、未完成遊戲模式、未完善的遊戲機制以及缺失的功能。 + - 如鬼有建設性的意見回饋或是錯誤回報,可以上 Reddit、GitLab 或者我們的 Discord 伺服器。 + - Veloren 的授權條款是 GPL 3 open-source licence,也就是任何人都可以任意的遊玩、更改並重新發布遊戲(其衍生的專案也都是 GPL 3)。 + - Veloren 是個非營利的社群專案,任何人都是自願參預開發的。如果喜歡的話,歡迎加入開發與美術設計團隊。 + - 「Voxel RPG」是個專屬的類別,就像任何的第一人稱射擊遊戲以前都稱作 Doom 的複製品。 + + 就像他們一樣,我們想要打造完美的作品,這不是款複製品遊戲,而此遊戲的開發將會讓未來的遊戲更加多元化。 + + 感謝您的閱讀,我們祝您能享受遊戲! + + ~ Veloren 開發人員 +main-login_process = + Information on the Login Process: + + If you are having issues signing in: + + Please note that you now need an account + to play on auth-enabled servers. + + You can create an account over at + + https://veloren.net/account/. +main-login-server_not_found = 找不到伺服器 +main-login-authentication_error = 伺服器認證錯誤 +main-login-server_full = 伺服器已滿 +main-login-untrusted_auth_server = 認證伺服器不可信 +main-login-outdated_client_or_server = 伺服器錯誤:版本可能不相容,請檢查更新。 +main-login-timeout = 逾時:伺服器無法即時回應(也許試過載或者網路問題)。 +main-login-server_shut_down = 伺服器已關閉 +main-login-network_error = 網路錯誤 +main-login-failed_sending_request = 認證伺服器請求失敗 +main-login-client_crashed = 客戶端崩潰 +main-login-select_language = 选择一种语言 \ No newline at end of file diff --git a/assets/voxygen/i18n/zh_TW/main.ron b/assets/voxygen/i18n/zh_TW/main.ron deleted file mode 100644 index 103ee284df..0000000000 --- a/assets/voxygen/i18n/zh_TW/main.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Traditional Chinese -( - string_map: { - "main.connecting": "連線中", - "main.creating_world": "生成世界中", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"歡迎加入 Veloren alpha 版! - -在您開始享受遊戲之前,請注意一些事情: - -- 這是非常前期的 alpha 版本,您會遇到不少錯誤、未完成遊戲模式、未完善的遊戲機制以及缺失的功能。 -- 如鬼有建設性的意見回饋或是錯誤回報,可以上 Reddit、GitLab 或者我們的 Discord 伺服器。 -- Veloren 的授權條款是 GPL 3 open-source licence,也就是任何人都可以任意的遊玩、更改並重新發布遊戲(其衍生的專案也都是 GPL 3)。 -- Veloren 是個非營利的社群專案,任何人都是自願參預開發的。如果喜歡的話,歡迎加入開發與美術設計團隊。 -- 「Voxel RPG」是個專屬的類別,就像任何的第一人稱射擊遊戲以前都稱作 Doom 的複製品。 - -就像他們一樣,我們想要打造完美的作品,這不是款複製品遊戲,而此遊戲的開發將會讓未來的遊戲更加多元化。 - -感謝您的閱讀,我們祝您能享受遊戲! - -~ Veloren 開發人員"#, - - // Login process description - "main.login_process": r#"Information on the Login Process: - -If you are having issues signing in: - -Please note that you now need an account -to play on auth-enabled servers. - -You can create an account over at - -https://veloren.net/account/."#, - "main.login.server_not_found": "找不到伺服器", - "main.login.authentication_error": "伺服器認證錯誤", - "main.login.server_full": "伺服器已滿", - "main.login.untrusted_auth_server": "認證伺服器不可信", - "main.login.outdated_client_or_server": "伺服器錯誤:版本可能不相容,請檢查更新。", - "main.login.timeout": "逾時:伺服器無法即時回應(也許試過載或者網路問題)。", - "main.login.server_shut_down": "伺服器已關閉", - "main.login.network_error": "網路錯誤", - "main.login.failed_sending_request": "認證伺服器請求失敗", - "main.login.client_crashed": "客戶端崩潰", - "main.login.select_language": "选择一种语言 ", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/zh_TW/npc.ftl b/assets/voxygen/i18n/zh_TW/npc.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/zh_TW/npc.ron b/assets/voxygen/i18n/zh_TW/npc.ron deleted file mode 100644 index 9f25779f55..0000000000 --- a/assets/voxygen/i18n/zh_TW/npc.ron +++ /dev/null @@ -1,10 +0,0 @@ -/// Localization for Traditional Chinese -( - string_map: { - - }, - - vector_map: { - - }, -) From 9a8c2885804547581708805f145ec55c7d0e0aee Mon Sep 17 00:00:00 2001 From: DaforLynx Date: Sat, 6 Aug 2022 21:29:38 +0000 Subject: [PATCH 014/854] Lower volume of river sfx --- assets/voxygen/audio/soundtrack.ron | 2 +- voxygen/src/audio/channel.rs | 4 +- voxygen/src/audio/mod.rs | 39 ++++++++++++++++++- .../src/audio/sfx/event_mapper/block/mod.rs | 26 +++++++++---- voxygen/src/hud/mod.rs | 2 +- 5 files changed, 60 insertions(+), 13 deletions(-) diff --git a/assets/voxygen/audio/soundtrack.ron b/assets/voxygen/audio/soundtrack.ron index 50da4ff7f4..c776cf6436 100644 --- a/assets/voxygen/audio/soundtrack.ron +++ b/assets/voxygen/audio/soundtrack.ron @@ -76,7 +76,7 @@ )), Individual(( title: "A Hero's Sorrow", - path: "voxygen.audio.soundtrack.overworld.a_heroes_sorrow", + path: "voxygen.audio.soundtrack.overworld.a_heros_sorrow", length: 251.0, timing: None, weather: Some(Rain), diff --git a/voxygen/src/audio/channel.rs b/voxygen/src/audio/channel.rs index 099c9c34d5..d446a431dd 100644 --- a/voxygen/src/audio/channel.rs +++ b/voxygen/src/audio/channel.rs @@ -253,12 +253,12 @@ impl SfxChannel { /// Same as SfxChannel::play but with the source passed through /// a low pass filter at 300 Hz - pub fn play_with_low_pass_filter(&mut self, source: S) + pub fn play_with_low_pass_filter(&mut self, source: S, freq: u32) where S: Sized + Send + 'static, S: Source, { - let source = source.low_pass(300); + let source = source.low_pass(freq); self.sink.append(source); } diff --git a/voxygen/src/audio/mod.rs b/voxygen/src/audio/mod.rs index 86db868caa..ad23c7e8ab 100644 --- a/voxygen/src/audio/mod.rs +++ b/voxygen/src/audio/mod.rs @@ -276,7 +276,7 @@ impl AudioFrontend { channel.set_pos(position); channel.update(&listener); if underwater { - channel.play_with_low_pass_filter(sound.convert_samples()); + channel.play_with_low_pass_filter(sound.convert_samples(), 300); } else { channel.play(sound); } @@ -290,6 +290,43 @@ impl AudioFrontend { } } + /// Play a sfx file given its position, SfxEvent, and volume with a low-pass + /// filter at the given frequency + pub fn emit_filtered_sfx( + &mut self, + trigger_item: Option<(&SfxEvent, &SfxTriggerItem)>, + position: Vec3, + volume: Option, + freq: Option, + underwater: bool, + ) { + if let Some(sfx_file) = Self::get_sfx_file(trigger_item) { + // Play sound in empty channel at given position + if self.audio_stream.is_some() && volume.map_or(true, |v| v > MIN_HEARABLE_VOLUME) { + let sound = load_ogg(sfx_file).amplify(volume.unwrap_or(1.0)); + + let listener = self.listener.clone(); + if let Some(channel) = self.get_sfx_channel() { + channel.set_pos(position); + channel.update(&listener); + if !underwater { + channel.play_with_low_pass_filter( + sound.convert_samples(), + freq.unwrap_or(20000), + ) + } else { + channel.play_with_low_pass_filter(sound.convert_samples(), 300) + }; + } + } + } else { + debug!( + "Missing sfx trigger config for sfx event at position: {:?}", + position + ); + } + } + /// Plays a sfx using a non-spatial sink at the given volume; doesn't need a /// position /// Passing no volume will default to 1.0 diff --git a/voxygen/src/audio/sfx/event_mapper/block/mod.rs b/voxygen/src/audio/sfx/event_mapper/block/mod.rs index 6b70442345..d5c7efc669 100644 --- a/voxygen/src/audio/sfx/event_mapper/block/mod.rs +++ b/voxygen/src/audio/sfx/event_mapper/block/mod.rs @@ -101,14 +101,14 @@ impl EventMapper for BlockEventMapper { blocks: |boi| &boi.slow_river, range: 1, sfx: SfxEvent::RunningWaterSlow, - volume: 1.5, + volume: 1.2, cond: |_| true, }, BlockSounds { blocks: |boi| &boi.fast_river, range: 1, sfx: SfxEvent::RunningWaterFast, - volume: 2.5, + volume: 1.5, cond: |_| true, }, //BlockSounds { @@ -238,12 +238,22 @@ impl EventMapper for BlockEventMapper { .unwrap_or(false); let sfx_trigger_item = triggers.get_key_value(&sounds.sfx); - audio.emit_sfx( - sfx_trigger_item, - block_pos, - Some(sounds.volume), - underwater, - ); + if sounds.sfx == SfxEvent::RunningWaterFast { + audio.emit_filtered_sfx( + sfx_trigger_item, + block_pos, + Some(sounds.volume), + Some(8000), + underwater, + ); + } else { + audio.emit_sfx( + sfx_trigger_item, + block_pos, + Some(sounds.volume), + underwater, + ); + } } internal_state.time = Instant::now(); internal_state.event = sounds.sfx.clone(); diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 3d51f3e6af..62530d6950 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -2448,7 +2448,7 @@ impl Hud { // Current song info Text::new(&format!( - "Currently playing: {} [{}]", + "Now playing: {} [{}]", debug_info.current_track, debug_info.current_artist, )) .color(TEXT_COLOR) From 94dbd4cb252a7ea4e90051fb59194356654ba42c Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 13:38:36 +0300 Subject: [PATCH 015/854] Respond to review, make char_slider take String --- voxygen/src/menu/char_selection/ui/mod.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index f2f0bfa3ec..f582cafd0e 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -1052,7 +1052,7 @@ impl Controls { const SLIDER_HEIGHT: u16 = 30; fn char_slider<'a>( - text: &str, + text: String, state: &'a mut slider::State, max: u8, selected_val: u8, @@ -1079,7 +1079,7 @@ impl Controls { } fn char_slider_greyable<'a>( active: bool, - text: &str, + text: String, state: &'a mut slider::State, max: u8, selected_val: u8, @@ -1117,7 +1117,7 @@ impl Controls { let slider_options = Column::with_children(vec![ char_slider( - &i18n.get("char_selection.hair_style"), + i18n.get("char_selection.hair_style").into_owned(), &mut sliders.hair_style, body.species.num_hair_styles(body.body_type) - 1, body.hair_style, @@ -1125,7 +1125,7 @@ impl Controls { (fonts, imgs), ), char_slider( - &i18n.get("char_selection.hair_color"), + i18n.get("char_selection.hair_color").into_owned(), &mut sliders.hair_color, body.species.num_hair_colors() - 1, body.hair_color, @@ -1133,7 +1133,7 @@ impl Controls { (fonts, imgs), ), char_slider( - &i18n.get("char_selection.skin"), + i18n.get("char_selection.skin").into_owned(), &mut sliders.skin, body.species.num_skin_colors() - 1, body.skin, @@ -1141,7 +1141,7 @@ impl Controls { (fonts, imgs), ), char_slider( - &i18n.get("char_selection.eyeshape"), + i18n.get("char_selection.eyeshape").into_owned(), &mut sliders.eyes, body.species.num_eyes(body.body_type) - 1, body.eyes, @@ -1149,7 +1149,7 @@ impl Controls { (fonts, imgs), ), char_slider( - &i18n.get("char_selection.eye_color"), + i18n.get("char_selection.eye_color").into_owned(), &mut sliders.eye_color, body.species.num_eye_colors() - 1, body.eye_color, @@ -1158,7 +1158,7 @@ impl Controls { ), char_slider_greyable( body.species.num_accessories(body.body_type) > 1, - &i18n.get("char_selection.accessories"), + i18n.get("char_selection.accessories").into_owned(), &mut sliders.accessory, body.species.num_accessories(body.body_type) - 1, body.accessory, @@ -1167,7 +1167,7 @@ impl Controls { ), char_slider_greyable( body.species.num_beards(body.body_type) > 1, - &i18n.get("char_selection.beard"), + i18n.get("char_selection.beard").into_owned(), &mut sliders.beard, body.species.num_beards(body.body_type) - 1, body.beard, From b5436872edbe42d21b5399c0c927557e843e563e Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 13:54:58 +0300 Subject: [PATCH 016/854] Adress review, remove redundant .into_owned --- voxygen/src/menu/char_selection/ui/mod.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index f582cafd0e..049364bb78 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -554,8 +554,7 @@ impl Controls { .into(), Text::new( // TODO: Add actual location here - i18n.get("char_selection.uncanny_valley") - .into_owned(), + i18n.get("char_selection.uncanny_valley"), ) .into(), ]), @@ -601,7 +600,7 @@ impl Controls { let button = Button::new( new_character_button, Container::new(Text::new( - i18n.get("char_selection.create_new_character").to_owned(), + i18n.get("char_selection.create_new_character"), )) .width(Length::Fill) .height(Length::Fill) @@ -717,7 +716,7 @@ impl Controls { if let Some(info_content) = info_content { let over_content: Element<_> = match &info_content { InfoContent::Deletion(_) => Column::with_children(vec![ - Text::new(i18n.get("char_selection.delete_permanently").into_owned()) + Text::new(i18n.get("char_selection.delete_permanently")) .size(fonts.cyri.scale(24)) .into(), Row::with_children(vec![ @@ -744,22 +743,22 @@ impl Controls { .spacing(10) .into(), InfoContent::LoadingCharacters => { - Text::new(i18n.get("char_selection.loading_characters").into_owned()) + Text::new(i18n.get("char_selection.loading_characters")) .size(fonts.cyri.scale(24)) .into() }, InfoContent::CreatingCharacter => { - Text::new(i18n.get("char_selection.creating_character").into_owned()) + Text::new(i18n.get("char_selection.creating_character")) .size(fonts.cyri.scale(24)) .into() }, InfoContent::EditingCharacter => { - Text::new(i18n.get("char_selection.editing_character").into_owned()) + Text::new(i18n.get("char_selection.editing_character")) .size(fonts.cyri.scale(24)) .into() }, InfoContent::DeletingCharacter => { - Text::new(i18n.get("char_selection.deleting_character").into_owned()) + Text::new(i18n.get("char_selection.deleting_character")) .size(fonts.cyri.scale(24)) .into() }, From c38d94e50427edcdb99098896b295ebf26e02b1d Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 14:39:04 +0300 Subject: [PATCH 017/854] Refactor try_variaton and error handling in i18n --- Cargo.lock | 8 +++--- voxygen/i18n/Cargo.toml | 6 ++--- voxygen/i18n/src/lib.rs | 58 +++++++++++++++++++++-------------------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0858e84264..c57671ce91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1905,7 +1905,7 @@ dependencies = [ [[package]] name = "fluent" version = "0.16.0" -source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" +source = "git+https://github.com/juliancoffee/fluent-rs.git?branch=patched#929cf9512de121cce9b4cbf1cb860cd3294a1cd9" dependencies = [ "fluent-bundle", "unic-langid", @@ -1914,7 +1914,7 @@ dependencies = [ [[package]] name = "fluent-bundle" version = "0.15.2" -source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" +source = "git+https://github.com/juliancoffee/fluent-rs.git?branch=patched#929cf9512de121cce9b4cbf1cb860cd3294a1cd9" dependencies = [ "fluent-langneg", "fluent-syntax", @@ -1938,7 +1938,7 @@ dependencies = [ [[package]] name = "fluent-syntax" version = "0.11.0" -source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" +source = "git+https://github.com/juliancoffee/fluent-rs.git?branch=patched#929cf9512de121cce9b4cbf1cb860cd3294a1cd9" dependencies = [ "thiserror", ] @@ -2843,7 +2843,7 @@ dependencies = [ [[package]] name = "intl-memoizer" version = "0.5.1" -source = "git+https://github.com/juliancoffee/fluent-rs.git#c91d9f48b5a8734bd9183145320f5108526b2d1e" +source = "git+https://github.com/juliancoffee/fluent-rs.git?branch=patched#929cf9512de121cce9b4cbf1cb860cd3294a1cd9" dependencies = [ "type-map", "unic-langid", diff --git a/voxygen/i18n/Cargo.toml b/voxygen/i18n/Cargo.toml index 187b906e65..3d66203ed9 100644 --- a/voxygen/i18n/Cargo.toml +++ b/voxygen/i18n/Cargo.toml @@ -12,9 +12,9 @@ ron = "0.7" serde = { version = "1.0", features = ["derive"] } # Localization unic-langid = { version = "0.9"} -intl-memoizer = { git = "https://github.com/juliancoffee/fluent-rs.git"} -fluent = { git = "https://github.com/juliancoffee/fluent-rs.git"} -fluent-bundle = { git = "https://github.com/juliancoffee/fluent-rs.git"} +intl-memoizer = { git = "https://github.com/juliancoffee/fluent-rs.git", branch = "patched"} +fluent = { git = "https://github.com/juliancoffee/fluent-rs.git", branch = "patched"} +fluent-bundle = { git = "https://github.com/juliancoffee/fluent-rs.git", branch = "patched"} # Utility hashbrown = { version = "0.12", features = ["serde", "nightly"] } deunicode = "1.0" diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 2714103ffd..53eba5b72b 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -78,47 +78,49 @@ impl Language { let mut errs = Vec::new(); let msg = bundle.format_pattern(msg.value()?, args, &mut errs); for err in errs { - eprintln!("err: {err} for {key}"); + tracing::error!("err: {err} for {key}"); } Some(msg) } - fn try_collect_attrs<'a>( - &'a self, - key: &str, - args: Option<&'a FluentArgs>, - ) -> Option>> { - let bundle = &self.bundle; - let msg = bundle.get_message(key)?; - - let mut errs = Vec::new(); - let mut attrs = Vec::new(); - - for attr in msg.attributes() { - let msg = bundle.format_pattern(attr.value(), args, &mut errs); - attrs.push(msg); - } - for err in errs { - eprintln!("err: {err} for {key}"); - } - - Some(attrs) - } - fn try_variation<'a>( &'a self, key: &str, seed: u16, args: Option<&'a FluentArgs>, ) -> Option> { - let mut attrs = self.try_collect_attrs(key, args)?; + let bundle = &self.bundle; + let msg = bundle.get_message(key)?; + let mut attrs = msg.attributes(); - if attrs.is_empty() { - None + if attrs.len() != 0 { + let idx = usize::from(seed) % attrs.len(); + // unwrap is ok here, because idx is bound to attrs.len() + // by using modulo operator. + // + // For example: + // (I) + // * attributes = [.x = 5, .y = 7, z. = 4] + // * len = 3 + // * seed can be 12, 50, 1 + // 12 % 3 = 0, attrs.skip(0) => first element + // 50 % 3 = 2, attrs.skip(2) => third element + // 1 % 3 = 1, attrs.skip(1) => second element + // (II) + // * attributes = [] + // * len = 0 + // * no matter what seed is, we return None in code above + let variation = attrs.nth(idx).unwrap(); + let mut errs = Vec::new(); + let msg = bundle.format_pattern(variation.value(), args, &mut errs); + for err in errs { + tracing::error!("err: {err} for {key}"); + } + + Some(msg) } else { - let variation = attrs.swap_remove(usize::from(seed) % attrs.len()); - Some(variation) + None } } } From f2df1adf27a7a7a4ed3b0fffb43739b4662648b1 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 15:04:32 +0300 Subject: [PATCH 018/854] Improve documentation --- common/assets/src/lib.rs | 2 +- voxygen/i18n/src/lib.rs | 19 ++++++++++++------- voxygen/src/hud/diary.rs | 2 ++ voxygen/src/hud/util.rs | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/common/assets/src/lib.rs b/common/assets/src/lib.rs index e1bf8b1c29..e25fa101da 100644 --- a/common/assets/src/lib.rs +++ b/common/assets/src/lib.rs @@ -17,7 +17,7 @@ pub use assets_manager::{ mod fs; mod walk; -pub use walk::*; +pub use walk::{walk_tree, Walk}; lazy_static! { /// The HashMap where all loaded assets are stored in. diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 53eba5b72b..236742cea0 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -72,7 +72,7 @@ struct Language { } impl Language { - fn try_msg<'a>(&'a self, key: &str, args: Option<&'a FluentArgs>) -> Option> { + fn try_msg<'a>(&'a self, key: &str, args: Option<&'a FluentArgs>) -> Option> { let bundle = &self.bundle; let msg = bundle.get_message(key)?; let mut errs = Vec::new(); @@ -247,18 +247,19 @@ pub struct LocalizationHandle { pub use_english_fallback: bool, } -/// Read `LocalizationGuard` +/// Read [LocalizationGuard](LocalizationGuard) // arbitrary choice to minimize changing all of veloren pub type Localization = LocalizationGuard; -/// RAII guard returned from `Localization::read`(), resembles `AssetGuard` +/// RAII guard returned from [LocalizationHandle::read()](LocalizationHandle::read), +/// resembles [AssetGuard](AssetGuard) pub struct LocalizationGuard { active: AssetGuard, fallback: Option>, } impl LocalizationGuard { - /// DEPRECATED + /// !!!DEPRECATED!!! /// /// Get a localized text from the given key /// @@ -267,7 +268,8 @@ impl LocalizationGuard { /// If the key is not present in the localization object /// then the key itself is returned. /// - /// NOTE: this function shouldn't be used in new code. + /// # NOTE: + /// This function shouldn't be used in new code. /// It is kept for compatibility with old code that uses /// old style dot-separated keys and this function internally /// replaces them with dashes. @@ -299,7 +301,7 @@ impl LocalizationGuard { // NOTE: we clone the key if translation was missing // We could use borrowed version, but it would mean that // `key`, `self`, and result should have the same lifetime. - // Which would make it impossible to use with runtime generated keys. + // Which would make it way more awkard to use with runtime generated keys. self.try_msg(key) .unwrap_or_else(|| Cow::Owned(key.to_owned())) } @@ -311,7 +313,7 @@ impl LocalizationGuard { pub fn try_msg_ctx<'a>(&'a self, key: &str, args: &'a FluentArgs) -> Option> { // NOTE: as after using args we get our result owned (because you need // to clone pattern during forming value from args), this conversion - // to Cow;:Owned is no-op. + // to Cow::Owned is no-op. // We could use String here, but using Cow everywhere in i18n API is // prefered for consistency. self.active @@ -483,15 +485,18 @@ mod tests { use super::*; #[test] + // Test that localization list is loaded (not empty) fn check_localization_list() { let list = list_localizations(); assert!(!list.is_empty()); } #[test] + // Test that reference language can be loaded fn validate_reference_language() { let _ = LocalizationHandle::load_expect(REFERENCE_LANG); } #[test] + // Test to verify that all languages are valid and loadable fn validate_all_localizations() { let list = list_localizations(); for meta in list { diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index 077c82c32a..ddc7cc705b 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -3359,6 +3359,8 @@ fn mining_skill_strings(skill: MiningSkill) -> SkillStrings<'static> { } } +/// Helper object used returned by `skill_strings` as source for +/// later internationalization and formatting. enum SkillStrings<'a> { Plain { title: &'a str, diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 7fc8e5518a..cf3514832d 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -359,7 +359,7 @@ pub fn ability_description<'a>( ability_id: &str, loc: &'a Localization, ) -> (Cow<'a, str>, Cow<'a, str>) { - // TODO: Use attribute mechanic + // TODO: Use fluent attribute mechanic let (name, desc) = ( format!("{}.name", ability_id), format!("{}.desc", ability_id), From e22babc51b7dcef2c10d67c8b68f84426b3baaaf Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 15:13:59 +0300 Subject: [PATCH 019/854] Improve error diagnostic in LocalizationHandle --- voxygen/i18n/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 236742cea0..15ebc37d9d 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -418,8 +418,7 @@ impl LocalizationHandle { fallback: if is_default { None } else { - // TODO: shouldn't this panic? - Language::load(&default_key).ok() + Some(Language::load(&default_key)?) }, use_english_fallback: false, }) From 05caa2d3a8e940db1a4fdce3971c07fb640089b7 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 15:42:23 +0300 Subject: [PATCH 020/854] Fix rebase error --- voxygen/src/hud/settings_window/sound.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index c7dea10b21..54d3837bcd 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -356,7 +356,7 @@ impl<'a> Widget for Sound<'a> { .w_h(RESET_BUTTONS_WIDTH, RESET_BUTTONS_HEIGHT) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .down_from(state.ids.ambience_volume_slider, 12.0) + .down_from(state.ids.music_frequency_slider, 12.0) .label(&self.localized_strings.get("hud.settings.reset_sound")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) From c10f722e25288df0ed2800c304178f84c0590f80 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 15:51:52 +0300 Subject: [PATCH 021/854] Improve loading-tips args --- voxygen/src/menu/main/ui/connecting.rs | 37 ++++++++++---------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index 6990fef10e..393dd5cf5b 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -1,5 +1,3 @@ -use std::str::FromStr; - use super::{ConnectionState, Imgs, Message}; use crate::{ @@ -102,29 +100,22 @@ impl Screen { let children = match connection_state { ConnectionState::InProgress => { let tip = if show_tip { - let key = |code| { - if let Ok(game_input) = GameInput::from_str(code) { - match controls.keybindings.get(&game_input) { - Some(Some(key_mouse)) => key_mouse.display_string(key_layout), - Some(None) => i18n.get("main.unbound_key_tip").into_owned(), - None => ControlSettings::default_binding(game_input) - .display_string(key_layout), - } - } else { - "code".to_owned() - } + let key = |code| match controls.keybindings.get(&code) { + Some(Some(key_mouse)) => key_mouse.display_string(key_layout), + Some(None) => i18n.get("main.unbound_key_tip").into_owned(), + None => ControlSettings::default_binding(code).display_string(key_layout), }; let keys = i18n::fluent_args! { - "gameinput-togglelantern" => key("gameinput.togglelantern"), - "gameinput-help" => key("gameinput.help"), - "gameinput-settings" => key("gameinput.settings"), - "gameinput-social" => key("gameinput.social"), - "gameinput-dance" => key("gameinput.dance"), - "gameinput-glide" => key("gameinput.glide"), - "gameinput-sit" => key("gameinput.sit"), - "gameinput-crafting" => key("gameinput.crafting"), - "gameinput-roll" => key("gameinput.roll"), - "gameinput-screenshot" => key("gameinput.screenshot"), + "gameinput-togglelantern" => key(GameInput::ToggleLantern), + "gameinput-help" => key(GameInput::Help), + "gameinput-settings" => key(GameInput::Settings), + "gameinput-social" => key(GameInput::Social), + "gameinput-dance" => key(GameInput::Dance), + "gameinput-glide" => key(GameInput::Glide), + "gameinput-sit" => key(GameInput::Sit), + "gameinput-crafting" => key(GameInput::Crafting), + "gameinput-roll" => key(GameInput::Roll), + "gameinput-screenshot" => key(GameInput::Screenshot), }; let tip = &i18n.get_variation_ctx("loading-tips", self.tip_number, &keys); let tip = format!("{} {}", i18n.get("main.tip"), tip); From 445b748e1a34a6b4ca7d40cf4b47fba4a446666c Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 16:20:45 +0300 Subject: [PATCH 022/854] Improve ability i18n algorithm --- voxygen/src/hud/util.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index cf3514832d..c5c5393b25 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -361,9 +361,20 @@ pub fn ability_description<'a>( ) -> (Cow<'a, str>, Cow<'a, str>) { // TODO: Use fluent attribute mechanic let (name, desc) = ( - format!("{}.name", ability_id), - format!("{}.desc", ability_id), + format!("{}.name", ability_id).replace('.', "-"), + format!("{}.desc", ability_id).replace('.', "-"), ); - (loc.get(&name), loc.get(&desc)) + // 1) Try localize ability + // 2) If not, say that ability is unknown + // 3) If unknown key is missed, just return id + // TODO: better algorithm? + ( + loc.try_msg(&name) + .or_else(|| loc.try_msg("common-abilities-unknown-name")) + .unwrap_or(Cow::Owned(name)), + loc.try_msg(&desc) + .or_else(|| loc.try_msg("common-abilities-unknown-desc")) + .unwrap_or(Cow::Owned(desc)), + ) } From 67df7a1e74c2e717afd818e29e965c0dba2b5a2e Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 16:45:18 +0300 Subject: [PATCH 023/854] fmt --- voxygen/i18n/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 15ebc37d9d..a94feedcc5 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -251,7 +251,8 @@ pub struct LocalizationHandle { // arbitrary choice to minimize changing all of veloren pub type Localization = LocalizationGuard; -/// RAII guard returned from [LocalizationHandle::read()](LocalizationHandle::read), +/// RAII guard returned from +/// [LocalizationHandle::read()](LocalizationHandle::read), /// resembles [AssetGuard](AssetGuard) pub struct LocalizationGuard { active: AssetGuard, From eed5aef1d04536dc5f9bf9f0977b19a8cdb72836 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 18:09:30 +0300 Subject: [PATCH 024/854] fix wording --- voxygen/i18n/src/lib.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index a94feedcc5..1fff103e18 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -247,13 +247,12 @@ pub struct LocalizationHandle { pub use_english_fallback: bool, } -/// Read [LocalizationGuard](LocalizationGuard) +/// Read [LocalizationGuard] // arbitrary choice to minimize changing all of veloren pub type Localization = LocalizationGuard; -/// RAII guard returned from -/// [LocalizationHandle::read()](LocalizationHandle::read), -/// resembles [AssetGuard](AssetGuard) +/// RAII guard returned from [LocalizationHandle::read()], resembles +/// [AssetGuard] pub struct LocalizationGuard { active: AssetGuard, fallback: Option>, @@ -302,7 +301,7 @@ impl LocalizationGuard { // NOTE: we clone the key if translation was missing // We could use borrowed version, but it would mean that // `key`, `self`, and result should have the same lifetime. - // Which would make it way more awkard to use with runtime generated keys. + // Which would make it way more awkward to use with runtime generated keys. self.try_msg(key) .unwrap_or_else(|| Cow::Owned(key.to_owned())) } @@ -407,7 +406,7 @@ impl LocalizationHandle { } /// # Errors - /// Returns error if active language can't be loaded + /// Returns error if active of fallback language can't be loaded pub fn load(specifier: &str) -> Result { let default_key = ["voxygen.i18n.", REFERENCE_LANG].concat(); let language_key = ["voxygen.i18n.", specifier].concat(); From 8a132d0726f2b2f0e97d78019c5c6fca7e5f6506 Mon Sep 17 00:00:00 2001 From: Tavo Annus Date: Sun, 7 Aug 2022 19:57:16 +0300 Subject: [PATCH 025/854] Add zoom cap to admin to keep zoom in a sensible range By clamping zoom, panic due to float overflow is avoided Regular player zoom cap is also reduced to a more sensible range --- CHANGELOG.md | 1 + voxygen/src/scene/camera.rs | 8 ++++---- voxygen/src/scene/mod.rs | 9 +++++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index caaf448cba..db42f8af25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed +- Fixed crash due to zooming out very far ## [0.13.0] - 2022-07-23 diff --git a/voxygen/src/scene/camera.rs b/voxygen/src/scene/camera.rs index a81c6f2f6a..c93d3474c7 100644 --- a/voxygen/src/scene/camera.rs +++ b/voxygen/src/scene/camera.rs @@ -541,7 +541,9 @@ impl Camera { } /// Zoom with the ability to switch between first and third-person mode. - pub fn zoom_switch(&mut self, delta: f32, cap: Option) { + /// + /// Note that cap > 18237958000000.0 can cause panic due to float overflow + pub fn zoom_switch(&mut self, delta: f32, cap: f32) { if delta > 0_f32 || self.mode != CameraMode::FirstPerson { let t = self.tgt_dist + delta; const MIN_THIRD_PERSON: f32 = 2.35; @@ -561,9 +563,7 @@ impl Camera { } } - if let Some(cap) = cap { - self.tgt_dist = self.tgt_dist.min(cap); - } + self.tgt_dist = self.tgt_dist.min(cap); } /// Get the distance of the camera from the focus diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 15ca5e10db..78ae2622cb 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -44,7 +44,8 @@ use num::traits::{Float, FloatConst}; use specs::{Entity as EcsEntity, Join, WorldExt}; use vek::*; -const ZOOM_CAP: f32 = 10000.0; +const ZOOM_CAP_PLAYER: f32 = 1000.0; +const ZOOM_CAP_ADMIN: f32 = 100000.0; // TODO: Don't hard-code this. const CURSOR_PAN_SCALE: f32 = 0.005; @@ -380,10 +381,14 @@ impl Scene { }, // Zoom the camera when a zoom event occurs Event::Zoom(delta) => { + let cap = if client.is_moderator() { + ZOOM_CAP_ADMIN + } else { + ZOOM_CAP_PLAYER + }; // when zooming in the distance the camera travelles should be based on the // final distance. This is to make sure the camera travelles the // same distance when zooming in and out - let cap = (!client.is_moderator()).then_some(ZOOM_CAP); if delta < 0.0 { self.camera.zoom_switch( // Thank you Imbris for doing the math From 38d3bdeeee3c1d7c6ebffc0450b817b21114c3ae Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 7 Aug 2022 20:05:03 +0300 Subject: [PATCH 026/854] Pre-merge activity * Add CHANGELOG * Remove script to convert .ron files to .ftl files --- CHANGELOG.md | 1 + Cargo.lock | 10 -- voxygen/i18n/Cargo.toml | 11 -- voxygen/i18n/src/bin/migrate.rs | 232 -------------------------------- 4 files changed, 1 insertion(+), 253 deletions(-) delete mode 100644 voxygen/i18n/src/bin/migrate.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index caaf448cba..a7b4e11019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a setting to influence the gap between music track plays. ### Changed +- Use fluent for translations ### Removed diff --git a/Cargo.lock b/Cargo.lock index c57671ce91..a328b4794d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5321,15 +5321,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-tuple-vec-map" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a04d0ebe0de77d7d445bb729a895dcb0a288854b267ca85f030ce51cdc578c82" -dependencies = [ - "serde", -] - [[package]] name = "serde_bytes" version = "0.11.5" @@ -6936,7 +6927,6 @@ dependencies = [ "intl-memoizer", "ron 0.7.0", "serde", - "serde-tuple-vec-map", "tracing", "unic-langid", "veloren-common-assets", diff --git a/voxygen/i18n/Cargo.toml b/voxygen/i18n/Cargo.toml index 3d66203ed9..89c784aa73 100644 --- a/voxygen/i18n/Cargo.toml +++ b/voxygen/i18n/Cargo.toml @@ -19,14 +19,3 @@ fluent-bundle = { git = "https://github.com/juliancoffee/fluent-rs.git", branch hashbrown = { version = "0.12", features = ["serde", "nightly"] } deunicode = "1.0" tracing = "0.1" -# Bin -serde-tuple-vec-map = "1.0" - -# FIXME: remove before merge -[[bin]] -name = "i18n-migrate" -required-features = ["i18n-migrate"] -path = "src/bin/migrate.rs" - -[features] -i18n-migrate = [] diff --git a/voxygen/i18n/src/bin/migrate.rs b/voxygen/i18n/src/bin/migrate.rs deleted file mode 100644 index a68b46a498..0000000000 --- a/voxygen/i18n/src/bin/migrate.rs +++ /dev/null @@ -1,232 +0,0 @@ -use std::{ffi::OsStr, fs, io::Write, path::Path}; - -use serde::Deserialize; - -use common_assets::{walk_tree, Walk}; - -/// Structure representing file for old .ron format -#[derive(Deserialize)] -struct RawFragment { - #[serde(with = "tuple_vec_map")] - string_map: Vec<(String, String)>, - #[serde(with = "tuple_vec_map")] - vector_map: Vec<(String, Vec)>, -} - -impl RawFragment { - fn read(path: &Path) -> Self { - let source = fs::File::open(path).unwrap(); - ron::de::from_reader(source).unwrap() - } -} - -/// Message value, may contain interpolated variables -struct Pattern { - view: String, -} - -impl Pattern { - fn expand(self) -> String { - let mut buff = String::new(); - if self.view.contains('\n') { - let mut first = true; - for line in self.view.lines() { - if line.is_empty() && first { - // fluent ignores space characters at the beginning - // so we need to encode \n explicitly - buff.push_str(r#"{"\u000A"}"#); - } else { - buff.push_str("\n "); - } - if first { - first = false; - } - buff.push_str(line); - } - } else { - buff.push_str(" "); - buff.push_str(&self.view); - } - - buff - } -} - -/// Fluent entry -struct Message { - value: Option, - attributes: Vec<(String, Pattern)>, -} - -impl Message { - fn stringify(self) -> String { - let mut buff = String::new(); - // append equal sign - buff.push_str(" ="); - // display value if any - if let Some(value) = self.value { - buff.push_str(&value.expand()); - } - // add attributes - for (attr_name, attr) in self.attributes { - // new line and append tab - buff.push_str("\n "); - // print attrname - buff.push('.'); - buff.push_str(&attr_name); - // equal sign - buff.push_str(" ="); - // display attr - buff.push_str(&attr.expand()); - } - - buff - } -} - -/// Structure representing file for new .ftl format -struct Source { - entries: Vec<(String, Message)>, -} - -impl Source { - fn write(self, path: &Path) { - let mut source = fs::File::create(path).unwrap(); - let mut first = true; - for (key, msg) in self.entries { - if !first { - source.write_all(b"\n").unwrap(); - } else { - first = false; - } - source.write_all(key.as_bytes()).unwrap(); - source.write_all(msg.stringify().as_bytes()).unwrap(); - } - } -} - -// Convert old i18n string to new fluent format -fn to_pattern(old: String) -> Pattern { - let mut buff = String::new(); - - let mut in_capture = false; - let mut need_sign = false; - - for ch in old.chars() { - if ch == '{' { - if !in_capture { - in_capture = true; - } else { - panic!("double {{"); - } - need_sign = true; - - buff.push(ch); - buff.push(' '); - } else if ch == '}' { - if in_capture { - in_capture = false; - } else { - panic!("}} without opening {{"); - } - - buff.push(' '); - buff.push(ch); - } else { - if need_sign { - buff.push('$'); - need_sign = false; - } - if ch == '.' && in_capture { - buff.push('-') - } else { - buff.push(ch) - } - } - } - - Pattern { view: buff } -} - -fn to_attributes(old: Vec) -> Message { - let mut attributes = Vec::new(); - for (i, string) in old.iter().enumerate() { - let attr_name = format!("a{i}"); - let attr = to_pattern(string.to_owned()); - attributes.push((attr_name, attr)) - } - - Message { - value: None, - attributes, - } -} - -fn convert(old: RawFragment) -> Source { - let mut entries = Vec::new(); - let mut cache = Vec::new(); - for (key, string) in old.string_map.into_iter() { - if cache.contains(&key) { - continue; - } else { - cache.push(key.clone()); - } - // common.weapon.tool -> common-weapon-tool - let key = key.replace('.', "-").to_owned(); - let msg = Message { - value: Some(to_pattern(string.to_owned())), - attributes: Vec::new(), - }; - entries.push((key, msg)) - } - - for (key, variation) in old.vector_map.into_iter() { - if cache.contains(&key) { - continue; - } else { - cache.push(key.clone()); - } - // common.weapon.tool -> common-weapon-tool - let key = key.replace('.', "-").to_owned(); - let msg = to_attributes(variation); - entries.push((key, msg)) - } - - Source { entries } -} - -fn migrate(tree: Walk, from: &Path, to: &Path) { - match tree { - Walk::Dir { path, content } => { - println!("{:?}", path); - let target_dir = to.join(path); - fs::create_dir(target_dir).unwrap(); - for entry in content { - migrate(entry, from, to); - } - }, - Walk::File(path) => { - if path.file_name() == Some(OsStr::new("_manifest.ron")) - || path.file_name() == Some(OsStr::new("README.md")) - { - fs::copy(from.join(&path), to.join(path)).unwrap(); - } else { - let old = RawFragment::read(&from.join(&path)); - let new = convert(old); - new.write(&to.join(path).with_extension("ftl")); - } - }, - } -} - -fn main() { - // it assumes that you have old i18n files in i18n-ron directory - let old_path = Path::new("assets/voxygen/i18n-ron"); - let new_path = Path::new("assets/voxygen/i18n"); - let tree = walk_tree(&old_path, &old_path).unwrap(); - let tree = Walk::Dir { - path: Path::new("").to_owned(), - content: tree, - }; - migrate(tree, &old_path, &new_path); -} From 6fae4efd453ca593bc5e805fdc925cd0775dfa69 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Thu, 28 Jul 2022 23:31:44 +0200 Subject: [PATCH 027/854] PoC: Refactor agent's behavior tree --- server/src/sys/agent.rs | 235 +++++----- server/src/sys/agent/behavior_tree.rs | 632 ++++++++++++++++++++++++++ 2 files changed, 742 insertions(+), 125 deletions(-) create mode 100644 server/src/sys/agent/behavior_tree.rs diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 652ee01d3a..8abd5df579 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -1,4 +1,5 @@ pub mod attack; +pub mod behavior; pub mod consts; pub mod data; pub mod util; @@ -6,6 +7,7 @@ pub mod util; use crate::{ rtsim::{entity::PersonalityTrait, RtSim}, sys::agent::{ + behavior::BehaviorTree, consts::{ AVG_FOLLOW_DIST, DAMAGE_MEMORY_DURATION, DEFAULT_ATTACK_RANGE, FLEE_DURATION, HEALING_ITEM_THRESHOLD, IDLE_HEALING_ITEM_THRESHOLD, MAX_FLEE_DIST, MAX_FOLLOW_DIST, @@ -259,137 +261,120 @@ impl<'a> System<'a> for Sys { // Falling damage starts from 30.0 as of time of writing // But keep in mind our 25 m/s gravity - let is_falling_dangerous = data.vel.0.z < -20.0; - let is_on_fire = read_data - .buffs - .get(entity) - .map_or(false, |b| b.kinds.contains_key(&BuffKind::Burning)); + BehaviorTree::root().run( + agent, + data, + &read_data, + &mut event_emitter, + controller, + ); - // If falling velocity is critical, throw everything - // and save yourself! + // let is_falling_dangerous = data.vel.0.z < -20.0; + + // let is_on_fire = read_data + // .buffs + // .get(entity) + // .map_or(false, |b| b.kinds.contains_key(&BuffKind::Burning)); + + // // If falling velocity is critical, throw everything + // // and save yourself! + // // + // // If can fly - fly. + // // If have glider - glide. + // // Else, rest in peace. + // if is_falling_dangerous && data.traversal_config.can_fly { + // data.fly_upward(controller) + // } else if is_falling_dangerous && data.glider_equipped { + // data.glider_fall(controller); + // // If on fire and able, stop, drop, and roll + // } else if is_on_fire + // && data.body.map_or(false, |b| b.is_humanoid()) + // && data.physics_state.on_ground.is_some() + // && rng.gen_bool((2.0 * read_data.dt.0).clamp(0.0, 1.0) as f64) + // { + // controller.inputs.move_dir = ori + // .look_vec() + // .xy() + // .try_normalized() + // .unwrap_or_else(Vec2::zero); + // controller.push_basic_input(InputKind::Roll); + // } else { + // // Target an entity that's attacking us if the attack was recent and we + // have // a health component + // match health { + // Some(health) + // if read_data.time.0 - health.last_change.time.0 + // < DAMAGE_MEMORY_DURATION => + // { + // if let Some(by) = health.last_change.damage_by() { + // if let Some(attacker) = // - // If can fly - fly. - // If have glider - glide. - // Else, rest in peace. - if is_falling_dangerous && data.traversal_config.can_fly { - data.fly_upward(controller) - } else if is_falling_dangerous && data.glider_equipped { - data.glider_fall(controller); - // If on fire and able, stop, drop, and roll - } else if is_on_fire - && data.body.map_or(false, |b| b.is_humanoid()) - && data.physics_state.on_ground.is_some() - && rng.gen_bool((2.0 * read_data.dt.0).clamp(0.0, 1.0) as f64) - { - controller.inputs.move_dir = ori - .look_vec() - .xy() - .try_normalized() - .unwrap_or_else(Vec2::zero); - controller.push_basic_input(InputKind::Roll); - } else { - // Target an entity that's attacking us if the attack was recent and we have - // a health component - match health { - Some(health) - if read_data.time.0 - health.last_change.time.0 - < DAMAGE_MEMORY_DURATION => - { - if let Some(by) = health.last_change.damage_by() { - if let Some(attacker) = - read_data.uid_allocator.retrieve_entity_internal(by.uid().0) - { - // If target is dead or invulnerable (for now, this only - // means safezone), untarget them and idle. - if is_dead_or_invulnerable(attacker, &read_data) { - agent.target = None; - } else { - if agent.target.is_none() { - controller.push_event(ControlEvent::Utterance( - UtteranceKind::Angry, - )); - } + // read_data.uid_allocator.retrieve_entity_internal(by.uid().0) + // { + // // If target is dead or invulnerable (for now, this only + // // means safezone), untarget them and idle. + // if is_dead_or_invulnerable(attacker, &read_data) { + // agent.target = None; + // } else { + // if agent.target.is_none() { + // controller.push_event(ControlEvent::Utterance( + // UtteranceKind::Angry, + // )); + // } - // Determine whether the new target should be a priority - // over the old one (i.e: because it's either close or - // because they attacked us). - if agent.target.map_or(true, |target| { - data.is_more_dangerous_than_target( - attacker, target, &read_data, - ) - }) { - agent.target = Some(Target { - target: attacker, - hostile: true, - selected_at: read_data.time.0, - aggro_on: true, - }); - } + // // Determine whether the new target should be a + // priority // over the old one + // (i.e: because it's either close or + // // because they attacked us). if + // agent.target.map_or(true, |target| { + // data.is_more_dangerous_than_target( + // attacker, target, &read_data, + // ) }) { + // agent.target = Some(Target { + // target: attacker, + // hostile: true, + // selected_at: read_data.time.0, + // aggro_on: true, + // }); + // } - // Remember this attack if we're an RtSim entity - if let Some(attacker_stats) = - data.rtsim_entity.and(read_data.stats.get(attacker)) - { - agent.add_fight_to_memory( - &attacker_stats.name, - read_data.time.0, - ); - } - } - } - } - }, - _ => {}, - } + // // Remember this attack if we're an RtSim entity + // if let Some(attacker_stats) = + // + // data.rtsim_entity.and(read_data.stats.get(attacker)) + // { + // agent.add_fight_to_memory( + // &attacker_stats.name, + // read_data.time.0, + // ); + // } + // } + // } + // } + // }, + // _ => {}, + // } - if let Some(target_info) = agent.target { - data.react_to_target( - agent, - controller, - &read_data, - &mut event_emitter, - target_info, - &mut rng, - ); - } else { - data.idle_tree(agent, controller, &read_data, &mut rng); - } - if agent.allowed_to_speak() - && data.recv_interaction( - agent, - controller, - &read_data, - &mut event_emitter, - ) - { - agent.timer.start(read_data.time.0, TimerAction::Interact); - } - // Interact if incoming messages - if !agent.inbox.is_empty() { - if matches!( - agent.inbox.front(), - Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt) - ) { - let sound = agent.inbox.pop_front(); - match sound { - Some(AgentEvent::ServerSound(sound)) => { - agent.sounds_heard.push(sound); - }, - Some(AgentEvent::Hurt) => { - // Hurt utterances at random upon receiving damage - if rng.gen::() < 0.4 { - controller.push_utterance(UtteranceKind::Hurt); - } - }, - //Note: this should be unreachable - Some(_) | None => return, - } - } else { - agent.action_state.timer = 0.1; - } - } - } + // if let Some(target_info) = agent.target { + // data.react_to_target( + // agent, + // controller, + // &read_data, + // &mut event_emitter, + // target_info, + // &mut rng, + // ); + // } else { + // data.idle_tree( + // agent, + // controller, + // &read_data, + // &mut event_emitter, + // &mut rng, + // ); + // } + // } debug_assert!(controller.inputs.move_dir.map(|e| !e.is_nan()).reduce_and()); debug_assert!(controller.inputs.look_dir.map(|e| !e.is_nan()).reduce_and()); diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs new file mode 100644 index 0000000000..d4c778cfe8 --- /dev/null +++ b/server/src/sys/agent/behavior_tree.rs @@ -0,0 +1,632 @@ +use common::{ + comp::{ + agent::{ + AgentEvent, Target, TimerAction, DEFAULT_INTERACTION_TIME, TRADE_INTERACTION_TIME, + }, + Agent, Alignment, BehaviorState, Body, BuffKind, ControlAction, ControlEvent, Controller, + InputKind, InventoryEvent, UtteranceKind, + }, + event::{Emitter, ServerEvent}, + path::TraversalConfig, +}; +use common_base::prof_span; +use rand::{prelude::ThreadRng, thread_rng, Rng}; +use specs::saveload::{Marker, MarkerAllocator}; +use vek::Vec2; + +use super::{ + consts::{ + DAMAGE_MEMORY_DURATION, FLEE_DURATION, HEALING_ITEM_THRESHOLD, MAX_FLEE_DIST, + MAX_FOLLOW_DIST, NPC_PICKUP_RANGE, RETARGETING_THRESHOLD_SECONDS, + }, + data::{AgentData, ReadData, TargetData}, + util::{get_entity_by_id, is_dead, is_dead_or_invulnerable, is_invulnerable, stop_pursuing}, +}; + +/// Struct containing essential data for running a behavior tree +struct BehaviorData<'a, 'b, 'c> { + agent: &'a mut Agent, + agent_data: AgentData<'a>, + read_data: &'a ReadData<'a>, + event_emitter: &'a mut Emitter<'c, ServerEvent>, + controller: &'a mut Controller, + rng: &'b mut ThreadRng, +} + +/// Behavior function +/// Determines if the current situation can be handled and act accordingly +/// Returns true if an action has been taken, stopping the tree execution +type BehaviorFn = fn(&mut BehaviorData) -> bool; + +/// ~~list~~ ""tree"" of behavior functions +/// This struct will allow you to run through multiple behavior function until +/// one finally handles an event +pub struct BehaviorTree { + tree: Vec, +} + +impl BehaviorTree { + pub fn root() -> Self { + Self { + tree: vec![ + react_on_dangerous_fall, + react_if_on_fire, + target_if_attacked, + do_target_tree_if_target, + do_idle_tree, + ], + } + } + + pub fn target() -> Self { + Self { + tree: vec![ + untarget_if_dead, + do_hostile_tree_if_hostile, + do_pet_tree_if_owned, + do_pickup_loot, + untarget, + do_idle_tree, + ], + } + } + + pub fn pet() -> Self { + Self { + tree: vec![follow_if_far_away, attack_if_owner_hurt, do_idle_tree], + } + } + + pub fn hostile() -> Self { + Self { + tree: vec![heal_self_if_hurt, hurt_utterance, do_combat], + } + } + + pub fn idle() -> Self { + Self { + tree: vec![ + set_owner_if_no_target, + process_inbox_sound_and_hurt, + process_inbox_interaction, + handle_timer, + ], + } + } + + /// Run the behavior tree until an event has been handled + pub fn run<'a, 'b>( + &self, + agent: &'a mut Agent, + agent_data: AgentData<'a>, + read_data: &'a ReadData, + event_emitter: &'a mut Emitter<'b, ServerEvent>, + controller: &'a mut Controller, + ) -> bool { + let mut behavior_data = BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + controller, + rng: &mut thread_rng(), + }; + + self.run_with_behavior_data(&mut behavior_data) + } + + fn run_with_behavior_data(&self, bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "Behavior Tree"); + for behavior_fn in self.tree.iter() { + if behavior_fn(bdata) { + return true; + } + } + false + } +} + +/// If falling velocity is critical, throw everything +/// and save yourself! +/// +/// If can fly - fly. +/// If have glider - glide. +/// Else, rest in peace. +fn react_on_dangerous_fall(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT react_on_dangerous_fall"); + // Falling damage starts from 30.0 as of time of writing + // But keep in mind our 25 m/s gravity + let is_falling_dangerous = bdata.agent_data.vel.0.z < -20.0; + + if is_falling_dangerous && bdata.agent_data.traversal_config.can_fly { + bdata.agent_data.fly_upward(bdata.controller); + return true; + } else if is_falling_dangerous && bdata.agent_data.glider_equipped { + bdata.agent_data.glider_fall(bdata.controller); + return true; + } + false +} + +/// If on fire and able, stop, drop, and roll +fn react_if_on_fire(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT react_if_on_fire"); + + let is_on_fire = bdata + .read_data + .buffs + .get(*bdata.agent_data.entity) + .map_or(false, |b| b.kinds.contains_key(&BuffKind::Burning)); + + if is_on_fire + && bdata.agent_data.body.map_or(false, |b| b.is_humanoid()) + && bdata.agent_data.physics_state.on_ground.is_some() + && bdata + .rng + .gen_bool((2.0 * bdata.read_data.dt.0).clamp(0.0, 1.0) as f64) + { + bdata.controller.inputs.move_dir = bdata + .agent_data + .ori + .look_vec() + .xy() + .try_normalized() + .unwrap_or_else(Vec2::zero); + bdata.controller.push_basic_input(InputKind::Roll); + return true; + } + false +} + +/// Target an entity that's attacking us if the attack was recent and we have +/// a health component +fn target_if_attacked(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT target_if_attacked"); + match bdata.agent_data.health { + Some(health) + if bdata.read_data.time.0 - health.last_change.time.0 < DAMAGE_MEMORY_DURATION => + { + if let Some(by) = health.last_change.damage_by() { + if let Some(attacker) = bdata + .read_data + .uid_allocator + .retrieve_entity_internal(by.uid().0) + { + // If target is dead or invulnerable (for now, this only + // means safezone), untarget them and idle. + if is_dead_or_invulnerable(attacker, bdata.read_data) { + bdata.agent.target = None; + } else { + if bdata.agent.target.is_none() { + bdata + .controller + .push_event(ControlEvent::Utterance(UtteranceKind::Angry)); + } + + // Determine whether the new target should be a priority + // over the old one (i.e: because it's either close or + // because they attacked us). + if bdata.agent.target.map_or(true, |target| { + bdata.agent_data.is_more_dangerous_than_target( + attacker, + target, + bdata.read_data, + ) + }) { + bdata.agent.target = Some(Target { + target: attacker, + hostile: true, + selected_at: bdata.read_data.time.0, + aggro_on: true, + }); + } + + // Remember this attack if we're an RtSim entity + if let Some(attacker_stats) = bdata + .agent_data + .rtsim_entity + .and(bdata.read_data.stats.get(attacker)) + { + bdata + .agent + .add_fight_to_memory(&attacker_stats.name, bdata.read_data.time.0); + } + } + } + } + }, + _ => {}, + } + false +} + +fn do_target_tree_if_target(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT do_target_tree_if_target"); + if bdata.agent.target.is_some() { + BehaviorTree::target().run_with_behavior_data(bdata); + return true; + } + false +} + +fn do_idle_tree(bdata: &mut BehaviorData) -> bool { + BehaviorTree::idle().run_with_behavior_data(bdata); + true +} + +/// If target is dead, forget them +fn untarget_if_dead(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT untarget_if_dead"); + if let Some(Target { target, .. }) = bdata.agent.target { + if let Some(tgt_health) = bdata.read_data.healths.get(target) { + // If target is dead, forget them + if tgt_health.is_dead { + if let Some(tgt_stats) = bdata + .agent_data + .rtsim_entity + .and(bdata.read_data.stats.get(target)) + { + bdata.agent.forget_enemy(&tgt_stats.name); + } + bdata.agent.target = None; + return true; + } + } + } + false +} + +/// If target is hostile, hostile tree +fn do_hostile_tree_if_hostile(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT do_hostile_tree_if_hostile"); + if let Some(Target { hostile, .. }) = bdata.agent.target { + if hostile { + BehaviorTree::hostile().run_with_behavior_data(bdata); + return true; + } + } + false +} + +/// if owned, act as pet to them +fn do_pet_tree_if_owned(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT do_pet_tree_if_owned"); + if let (Some(Target { target, .. }), Some(Alignment::Owned(uid))) = + (bdata.agent.target, bdata.agent_data.alignment) + { + if bdata.read_data.uids.get(target) == Some(uid) { + BehaviorTree::pet().run_with_behavior_data(bdata); + } else { + bdata.agent.target = None; + BehaviorTree::idle().run_with_behavior_data(bdata); + } + return true; + } + false +} + +fn do_pickup_loot(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT do_pickup_loot"); + if let Some(Target { target, .. }) = bdata.agent.target { + if matches!(bdata.read_data.bodies.get(target), Some(Body::ItemDrop(_))) { + if let Some(tgt_pos) = bdata.read_data.positions.get(target) { + let dist_sqrd = bdata.agent_data.pos.0.distance_squared(tgt_pos.0); + if dist_sqrd < NPC_PICKUP_RANGE.powi(2) { + if let Some(uid) = bdata.read_data.uids.get(target) { + bdata + .controller + .push_event(ControlEvent::InventoryEvent(InventoryEvent::Pickup(*uid))); + } + } else if let Some((bearing, speed)) = bdata.agent.chaser.chase( + &*bdata.read_data.terrain, + bdata.agent_data.pos.0, + bdata.agent_data.vel.0, + tgt_pos.0, + TraversalConfig { + min_tgt_dist: NPC_PICKUP_RANGE - 1.0, + ..bdata.agent_data.traversal_config + }, + ) { + bdata.controller.inputs.move_dir = + bearing.xy().try_normalized().unwrap_or_else(Vec2::zero) + * speed.min(0.2 + (dist_sqrd - (NPC_PICKUP_RANGE - 1.5).powi(2)) / 8.0); + bdata.agent_data.jump_if(bearing.z > 1.5, bdata.controller); + bdata.controller.inputs.move_z = bearing.z; + } + } + return true; + } + } + false +} + +fn untarget(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT untarget"); + bdata.agent.target = None; + false +} + +// If too far away, then follow +fn follow_if_far_away(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT follow_if_far_away"); + if let Some(Target { target, .. }) = bdata.agent.target { + if let Some(tgt_pos) = bdata.read_data.positions.get(target) { + let dist_sqrd = bdata.agent_data.pos.0.distance_squared(tgt_pos.0); + + if dist_sqrd > (MAX_FOLLOW_DIST).powi(2) { + bdata.agent_data.follow( + bdata.agent, + bdata.controller, + &bdata.read_data.terrain, + tgt_pos, + ); + return true; + } + } + } + false +} + +/// Attack target's attacker (if there is one) +/// Target is the owner in this case +fn attack_if_owner_hurt(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT attack_if_owner_hurt"); + if let Some(Target { target, .. }) = bdata.agent.target { + if bdata.read_data.positions.get(target).is_some() { + let owner_recently_attacked = + if let Some(target_health) = bdata.read_data.healths.get(target) { + bdata.read_data.time.0 - target_health.last_change.time.0 < 5.0 + && target_health.last_change.amount < 0.0 + } else { + false + }; + + if owner_recently_attacked { + bdata.agent_data.attack_target_attacker( + bdata.agent, + bdata.read_data, + bdata.controller, + bdata.rng, + ); + return true; + } + } + } + false +} + +/// Set owner if no target +fn set_owner_if_no_target(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT set_owner_if_no_target"); + let small_chance = bdata.rng.gen_bool(0.1); + + if bdata.agent.target.is_none() && small_chance { + if let Some(Alignment::Owned(owner)) = bdata.agent_data.alignment { + if let Some(owner) = get_entity_by_id(owner.id(), bdata.read_data) { + bdata.agent.target = Some(Target::new(owner, false, bdata.read_data.time.0, false)); + } + } + } + false +} + +/// Interact if incoming messages +fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT process_inbox_sound_and_hurt"); + if !bdata.agent.inbox.is_empty() { + if matches!( + bdata.agent.inbox.front(), + Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt) + ) { + let sound = bdata.agent.inbox.pop_front(); + match sound { + Some(AgentEvent::ServerSound(sound)) => { + bdata.agent.sounds_heard.push(sound); + }, + Some(AgentEvent::Hurt) => { + // Hurt utterances at random upon receiving damage + if bdata.rng.gen::() < 0.4 { + bdata.controller.push_utterance(UtteranceKind::Hurt); + } + }, + //Note: this should be unreachable + Some(_) | None => {}, + } + } else { + bdata.agent.action_state.timer = 0.1; + } + } + false +} + +/// If we receive a new interaction, start the interaction timer +fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT process_inbox_interaction"); + if bdata.agent.allowed_to_speak() + && bdata.agent_data.recv_interaction( + bdata.agent, + bdata.controller, + bdata.read_data, + bdata.event_emitter, + ) + { + bdata + .agent + .timer + .start(bdata.read_data.time.0, TimerAction::Interact); + } + false +} + +fn handle_timer(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT handle_timer"); + let timeout = if bdata.agent.behavior.is(BehaviorState::TRADING) { + TRADE_INTERACTION_TIME + } else { + DEFAULT_INTERACTION_TIME + }; + + match bdata.agent.timer.timeout_elapsed( + bdata.read_data.time.0, + TimerAction::Interact, + timeout as f64, + ) { + None => { + // Look toward the interacting entity for a while + if let Some(Target { target, .. }) = &bdata.agent.target { + bdata + .agent_data + .look_toward(bdata.controller, bdata.read_data, *target); + bdata.controller.push_action(ControlAction::Talk); + } + }, + Some(just_ended) => { + if just_ended { + bdata.agent.target = None; + bdata.controller.push_action(ControlAction::Stand); + } + + if bdata.rng.gen::() < 0.1 { + bdata + .agent_data + .choose_target(bdata.agent, bdata.controller, bdata.read_data); + } else { + bdata.agent_data.handle_sounds_heard( + bdata.agent, + bdata.controller, + bdata.read_data, + bdata.rng, + ); + } + }, + } + false +} + +fn heal_self_if_hurt(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT heal_self_if_hurt"); + if bdata.agent_data.damage < HEALING_ITEM_THRESHOLD + && bdata + .agent_data + .heal_self(bdata.agent, bdata.controller, false) + { + bdata.agent.action_state.timer = 0.01; + return true; + } + false +} + +fn hurt_utterance(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT hurt_utterance"); + if let Some(AgentEvent::Hurt) = bdata.agent.inbox.pop_front() { + // Hurt utterances at random upon receiving damage + if bdata.rng.gen::() < 0.4 { + bdata.controller.push_utterance(UtteranceKind::Hurt); + } + } + false +} + +fn do_combat(bdata: &mut BehaviorData) -> bool { + prof_span!(guard, "BT do_combat"); + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + controller, + rng, + } = bdata; + if let Some(Target { + target, + selected_at, + aggro_on, + .. + }) = &mut agent.target + { + let target = *target; + let selected_at = *selected_at; + if let Some(tgt_pos) = read_data.positions.get(target) { + let dist_sqrd = agent_data.pos.0.distance_squared(tgt_pos.0); + let origin_dist_sqrd = match agent.patrol_origin { + Some(pos) => pos.distance_squared(agent_data.pos.0), + None => 1.0, + }; + + let own_health_fraction = match agent_data.health { + Some(val) => val.fraction(), + None => 1.0, + }; + let target_health_fraction = match read_data.healths.get(target) { + Some(val) => val.fraction(), + None => 1.0, + }; + + let in_aggro_range = agent + .psyche + .aggro_dist + .map_or(true, |ad| dist_sqrd < ad.powi(2)); + + if in_aggro_range { + *aggro_on = true; + } + let aggro_on = *aggro_on; + + if agent_data.below_flee_health(agent) { + let has_opportunity_to_flee = agent.action_state.timer < FLEE_DURATION; + let within_flee_distance = dist_sqrd < MAX_FLEE_DIST.powi(2); + + // FIXME: Using action state timer to see if allowed to speak is a hack. + if agent.action_state.timer == 0.0 { + agent_data.cry_out(agent, event_emitter, read_data); + agent.action_state.timer = 0.01; + } else if within_flee_distance && has_opportunity_to_flee { + agent_data.flee(agent, controller, tgt_pos, &read_data.terrain); + agent.action_state.timer += read_data.dt.0; + } else { + agent.action_state.timer = 0.0; + agent.target = None; + agent_data.idle(agent, controller, read_data, rng); + } + } else if is_dead(target, read_data) { + agent_data.exclaim_relief_about_enemy_dead(agent, event_emitter); + agent.target = None; + agent_data.idle(agent, controller, read_data, rng); + } else if is_invulnerable(target, read_data) + || stop_pursuing( + dist_sqrd, + origin_dist_sqrd, + own_health_fraction, + target_health_fraction, + read_data.time.0 - selected_at, + &agent.psyche, + ) + { + agent.target = None; + agent_data.idle(agent, controller, read_data, rng); + } else { + let is_time_to_retarget = + read_data.time.0 - selected_at > RETARGETING_THRESHOLD_SECONDS; + + if !in_aggro_range && is_time_to_retarget { + agent_data.choose_target(agent, controller, read_data); + } + + if aggro_on { + let target_data = TargetData::new( + tgt_pos, + read_data.bodies.get(target), + read_data.scales.get(target), + ); + let tgt_name = read_data.stats.get(target).map(|stats| stats.name.clone()); + + tgt_name.map(|tgt_name| agent.add_fight_to_memory(&tgt_name, read_data.time.0)); + agent_data.attack(agent, controller, &target_data, read_data, rng); + } else { + agent_data.menacing(agent, controller, target, read_data, event_emitter, rng); + } + } + } + } + false +} From d105d7063c7d9bdb72bc8476cda3aead2f2d6d09 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Fri, 29 Jul 2022 12:13:00 +0200 Subject: [PATCH 028/854] Cleanup prof_span + finish unfinished module rename --- server/src/sys/agent.rs | 4 ++-- server/src/sys/agent/behavior_tree.rs | 21 --------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 8abd5df579..6db65d7274 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -1,5 +1,5 @@ pub mod attack; -pub mod behavior; +pub mod behavior_tree; pub mod consts; pub mod data; pub mod util; @@ -7,7 +7,7 @@ pub mod util; use crate::{ rtsim::{entity::PersonalityTrait, RtSim}, sys::agent::{ - behavior::BehaviorTree, + behavior_tree::BehaviorTree, consts::{ AVG_FOLLOW_DIST, DAMAGE_MEMORY_DURATION, DEFAULT_ATTACK_RANGE, FLEE_DURATION, HEALING_ITEM_THRESHOLD, IDLE_HEALING_ITEM_THRESHOLD, MAX_FLEE_DIST, MAX_FOLLOW_DIST, diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index d4c778cfe8..303a9c7551 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -9,7 +9,6 @@ use common::{ event::{Emitter, ServerEvent}, path::TraversalConfig, }; -use common_base::prof_span; use rand::{prelude::ThreadRng, thread_rng, Rng}; use specs::saveload::{Marker, MarkerAllocator}; use vek::Vec2; @@ -116,7 +115,6 @@ impl BehaviorTree { } fn run_with_behavior_data(&self, bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "Behavior Tree"); for behavior_fn in self.tree.iter() { if behavior_fn(bdata) { return true; @@ -133,7 +131,6 @@ impl BehaviorTree { /// If have glider - glide. /// Else, rest in peace. fn react_on_dangerous_fall(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT react_on_dangerous_fall"); // Falling damage starts from 30.0 as of time of writing // But keep in mind our 25 m/s gravity let is_falling_dangerous = bdata.agent_data.vel.0.z < -20.0; @@ -150,8 +147,6 @@ fn react_on_dangerous_fall(bdata: &mut BehaviorData) -> bool { /// If on fire and able, stop, drop, and roll fn react_if_on_fire(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT react_if_on_fire"); - let is_on_fire = bdata .read_data .buffs @@ -181,7 +176,6 @@ fn react_if_on_fire(bdata: &mut BehaviorData) -> bool { /// Target an entity that's attacking us if the attack was recent and we have /// a health component fn target_if_attacked(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT target_if_attacked"); match bdata.agent_data.health { Some(health) if bdata.read_data.time.0 - health.last_change.time.0 < DAMAGE_MEMORY_DURATION => @@ -241,7 +235,6 @@ fn target_if_attacked(bdata: &mut BehaviorData) -> bool { } fn do_target_tree_if_target(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT do_target_tree_if_target"); if bdata.agent.target.is_some() { BehaviorTree::target().run_with_behavior_data(bdata); return true; @@ -256,7 +249,6 @@ fn do_idle_tree(bdata: &mut BehaviorData) -> bool { /// If target is dead, forget them fn untarget_if_dead(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT untarget_if_dead"); if let Some(Target { target, .. }) = bdata.agent.target { if let Some(tgt_health) = bdata.read_data.healths.get(target) { // If target is dead, forget them @@ -278,7 +270,6 @@ fn untarget_if_dead(bdata: &mut BehaviorData) -> bool { /// If target is hostile, hostile tree fn do_hostile_tree_if_hostile(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT do_hostile_tree_if_hostile"); if let Some(Target { hostile, .. }) = bdata.agent.target { if hostile { BehaviorTree::hostile().run_with_behavior_data(bdata); @@ -290,7 +281,6 @@ fn do_hostile_tree_if_hostile(bdata: &mut BehaviorData) -> bool { /// if owned, act as pet to them fn do_pet_tree_if_owned(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT do_pet_tree_if_owned"); if let (Some(Target { target, .. }), Some(Alignment::Owned(uid))) = (bdata.agent.target, bdata.agent_data.alignment) { @@ -306,7 +296,6 @@ fn do_pet_tree_if_owned(bdata: &mut BehaviorData) -> bool { } fn do_pickup_loot(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT do_pickup_loot"); if let Some(Target { target, .. }) = bdata.agent.target { if matches!(bdata.read_data.bodies.get(target), Some(Body::ItemDrop(_))) { if let Some(tgt_pos) = bdata.read_data.positions.get(target) { @@ -341,14 +330,12 @@ fn do_pickup_loot(bdata: &mut BehaviorData) -> bool { } fn untarget(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT untarget"); bdata.agent.target = None; false } // If too far away, then follow fn follow_if_far_away(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT follow_if_far_away"); if let Some(Target { target, .. }) = bdata.agent.target { if let Some(tgt_pos) = bdata.read_data.positions.get(target) { let dist_sqrd = bdata.agent_data.pos.0.distance_squared(tgt_pos.0); @@ -370,7 +357,6 @@ fn follow_if_far_away(bdata: &mut BehaviorData) -> bool { /// Attack target's attacker (if there is one) /// Target is the owner in this case fn attack_if_owner_hurt(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT attack_if_owner_hurt"); if let Some(Target { target, .. }) = bdata.agent.target { if bdata.read_data.positions.get(target).is_some() { let owner_recently_attacked = @@ -397,7 +383,6 @@ fn attack_if_owner_hurt(bdata: &mut BehaviorData) -> bool { /// Set owner if no target fn set_owner_if_no_target(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT set_owner_if_no_target"); let small_chance = bdata.rng.gen_bool(0.1); if bdata.agent.target.is_none() && small_chance { @@ -412,7 +397,6 @@ fn set_owner_if_no_target(bdata: &mut BehaviorData) -> bool { /// Interact if incoming messages fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT process_inbox_sound_and_hurt"); if !bdata.agent.inbox.is_empty() { if matches!( bdata.agent.inbox.front(), @@ -441,7 +425,6 @@ fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { /// If we receive a new interaction, start the interaction timer fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT process_inbox_interaction"); if bdata.agent.allowed_to_speak() && bdata.agent_data.recv_interaction( bdata.agent, @@ -459,7 +442,6 @@ fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { } fn handle_timer(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT handle_timer"); let timeout = if bdata.agent.behavior.is(BehaviorState::TRADING) { TRADE_INTERACTION_TIME } else { @@ -504,7 +486,6 @@ fn handle_timer(bdata: &mut BehaviorData) -> bool { } fn heal_self_if_hurt(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT heal_self_if_hurt"); if bdata.agent_data.damage < HEALING_ITEM_THRESHOLD && bdata .agent_data @@ -517,7 +498,6 @@ fn heal_self_if_hurt(bdata: &mut BehaviorData) -> bool { } fn hurt_utterance(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT hurt_utterance"); if let Some(AgentEvent::Hurt) = bdata.agent.inbox.pop_front() { // Hurt utterances at random upon receiving damage if bdata.rng.gen::() < 0.4 { @@ -528,7 +508,6 @@ fn hurt_utterance(bdata: &mut BehaviorData) -> bool { } fn do_combat(bdata: &mut BehaviorData) -> bool { - prof_span!(guard, "BT do_combat"); let BehaviorData { agent, agent_data, From faf2b13ac105a00f428b1d6e7614a47fdfaa95aa Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Fri, 29 Jul 2022 18:33:34 +0200 Subject: [PATCH 029/854] Move recv_interactions into BehaviorTree + cleanup functions ^& warnings --- server/src/sys/agent.rs | 927 +------------------------- server/src/sys/agent/behavior_tree.rs | 495 +++++++++++++- 2 files changed, 497 insertions(+), 925 deletions(-) diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 6db65d7274..e7271be2b3 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -5,20 +5,18 @@ pub mod data; pub mod util; use crate::{ - rtsim::{entity::PersonalityTrait, RtSim}, + rtsim::RtSim, sys::agent::{ behavior_tree::BehaviorTree, consts::{ - AVG_FOLLOW_DIST, DAMAGE_MEMORY_DURATION, DEFAULT_ATTACK_RANGE, FLEE_DURATION, - HEALING_ITEM_THRESHOLD, IDLE_HEALING_ITEM_THRESHOLD, MAX_FLEE_DIST, MAX_FOLLOW_DIST, - NPC_PICKUP_RANGE, PARTIAL_PATH_DIST, RETARGETING_THRESHOLD_SECONDS, SEPARATION_BIAS, - SEPARATION_DIST, + AVG_FOLLOW_DIST, DEFAULT_ATTACK_RANGE, IDLE_HEALING_ITEM_THRESHOLD, PARTIAL_PATH_DIST, + SEPARATION_BIAS, SEPARATION_DIST, }, data::{AgentData, AttackData, Path, ReadData, Tactic, TargetData}, util::{ aim_projectile, are_our_owners_hostile, entities_have_line_of_sight, get_attacker, - get_entity_by_id, is_dead, is_dead_or_invulnerable, is_dressed_as_cultist, - is_invulnerable, is_village_guard, is_villager, stop_pursuing, + get_entity_by_id, is_dead_or_invulnerable, is_dressed_as_cultist, is_invulnerable, + is_village_guard, is_villager, }, }, }; @@ -26,33 +24,25 @@ use common::{ combat::perception_dist_multiplier_from_stealth, comp::{ self, - agent::{ - AgentEvent, Sound, SoundKind, Target, TimerAction, DEFAULT_INTERACTION_TIME, - TRADE_INTERACTION_TIME, - }, + agent::{Sound, SoundKind, Target}, buff::BuffKind, - compass::{Direction, Distance}, - dialogue::{MoodContext, MoodState, Subject}, inventory::slot::EquipSlot, - invite::{InviteKind, InviteResponse}, item::{ tool::{AbilitySpec, ToolKind}, ConsumableKind, Item, ItemDesc, ItemKind, }, item_drop, projectile::ProjectileConstructor, - Agent, Alignment, BehaviorState, Body, CharacterState, ControlAction, ControlEvent, - Controller, Health, HealthChange, InputKind, InventoryAction, InventoryEvent, Pos, Scale, - UnresolvedChatMsg, UtteranceKind, + Agent, Alignment, Body, CharacterState, ControlAction, ControlEvent, Controller, Health, + HealthChange, InputKind, InventoryAction, Pos, Scale, UnresolvedChatMsg, UtteranceKind, }, effect::{BuffEffect, Effect}, event::{Emitter, EventBus, ServerEvent}, path::TraversalConfig, - rtsim::{Memory, MemoryItem, RtSimEvent}, + rtsim::RtSimEvent, states::basic_beam, terrain::{Block, TerrainGrid}, time::DayPeriod, - trade::{TradeAction, TradePhase, TradeResult}, util::Dir, vol::ReadVol, }; @@ -61,8 +51,7 @@ use common_ecs::{Job, Origin, ParMode, Phase, System}; use rand::{thread_rng, Rng}; use rayon::iter::ParallelIterator; use specs::{ - saveload::{Marker, MarkerAllocator}, - Entity as EcsEntity, Join, ParJoin, Read, WriteExpect, WriteStorage, + saveload::Marker, Entity as EcsEntity, Join, ParJoin, Read, WriteExpect, WriteStorage, }; use vek::*; @@ -135,7 +124,7 @@ impl<'a> System<'a> for Sys { _, )| { let mut event_emitter = event_bus.emitter(); - let mut rng = thread_rng(); + // let mut rng = thread_rng(); // Hack, replace with better system when groups are more sophisticated // Override alignment if in a group unless entity is owned already @@ -259,9 +248,6 @@ impl<'a> System<'a> for Sys { // are the only parts of this tree that should provide // inputs. - // Falling damage starts from 30.0 as of time of writing - // But keep in mind our 25 m/s gravity - BehaviorTree::root().run( agent, data, @@ -270,112 +256,6 @@ impl<'a> System<'a> for Sys { controller, ); - // let is_falling_dangerous = data.vel.0.z < -20.0; - - // let is_on_fire = read_data - // .buffs - // .get(entity) - // .map_or(false, |b| b.kinds.contains_key(&BuffKind::Burning)); - - // // If falling velocity is critical, throw everything - // // and save yourself! - // // - // // If can fly - fly. - // // If have glider - glide. - // // Else, rest in peace. - // if is_falling_dangerous && data.traversal_config.can_fly { - // data.fly_upward(controller) - // } else if is_falling_dangerous && data.glider_equipped { - // data.glider_fall(controller); - // // If on fire and able, stop, drop, and roll - // } else if is_on_fire - // && data.body.map_or(false, |b| b.is_humanoid()) - // && data.physics_state.on_ground.is_some() - // && rng.gen_bool((2.0 * read_data.dt.0).clamp(0.0, 1.0) as f64) - // { - // controller.inputs.move_dir = ori - // .look_vec() - // .xy() - // .try_normalized() - // .unwrap_or_else(Vec2::zero); - // controller.push_basic_input(InputKind::Roll); - // } else { - // // Target an entity that's attacking us if the attack was recent and we - // have // a health component - // match health { - // Some(health) - // if read_data.time.0 - health.last_change.time.0 - // < DAMAGE_MEMORY_DURATION => - // { - // if let Some(by) = health.last_change.damage_by() { - // if let Some(attacker) = - // - // read_data.uid_allocator.retrieve_entity_internal(by.uid().0) - // { - // // If target is dead or invulnerable (for now, this only - // // means safezone), untarget them and idle. - // if is_dead_or_invulnerable(attacker, &read_data) { - // agent.target = None; - // } else { - // if agent.target.is_none() { - // controller.push_event(ControlEvent::Utterance( - // UtteranceKind::Angry, - // )); - // } - - // // Determine whether the new target should be a - // priority // over the old one - // (i.e: because it's either close or - // // because they attacked us). if - // agent.target.map_or(true, |target| { - // data.is_more_dangerous_than_target( - // attacker, target, &read_data, - // ) }) { - // agent.target = Some(Target { - // target: attacker, - // hostile: true, - // selected_at: read_data.time.0, - // aggro_on: true, - // }); - // } - - // // Remember this attack if we're an RtSim entity - // if let Some(attacker_stats) = - // - // data.rtsim_entity.and(read_data.stats.get(attacker)) - // { - // agent.add_fight_to_memory( - // &attacker_stats.name, - // read_data.time.0, - // ); - // } - // } - // } - // } - // }, - // _ => {}, - // } - - // if let Some(target_info) = agent.target { - // data.react_to_target( - // agent, - // controller, - // &read_data, - // &mut event_emitter, - // target_info, - // &mut rng, - // ); - // } else { - // data.idle_tree( - // agent, - // controller, - // &read_data, - // &mut event_emitter, - // &mut rng, - // ); - // } - // } - debug_assert!(controller.inputs.move_dir.map(|e| !e.is_nan()).reduce_and()); debug_assert!(controller.inputs.look_dir.map(|e| !e.is_nan()).reduce_and()); }, @@ -402,275 +282,6 @@ impl<'a> System<'a> for Sys { } impl<'a> AgentData<'a> { - //////////////////////////////////////// - // Subtrees - //////////////////////////////////////// - fn react_to_target( - &self, - agent: &mut Agent, - controller: &mut Controller, - read_data: &ReadData, - event_emitter: &mut Emitter<'_, ServerEvent>, - target_info: Target, - rng: &mut impl Rng, - ) { - let Target { - target, hostile, .. - } = target_info; - - if let Some(tgt_health) = read_data.healths.get(target) { - // If target is dead, forget them - if tgt_health.is_dead { - if let Some(tgt_stats) = self.rtsim_entity.and(read_data.stats.get(target)) { - agent.forget_enemy(&tgt_stats.name); - } - agent.target = None; - // Else, if target is hostile, hostile tree - } else if hostile { - self.cancel_interaction(agent, controller, event_emitter); - self.hostile_tree(agent, controller, read_data, event_emitter, rng); - // Else, if owned, act as pet to them - } else if let Some(Alignment::Owned(uid)) = self.alignment { - if read_data.uids.get(target) == Some(uid) { - self.react_as_pet(agent, controller, read_data, target, rng); - } else { - agent.target = None; - self.idle_tree(agent, controller, read_data, rng); - }; - } else { - self.idle_tree(agent, controller, read_data, rng); - } - } else if matches!(read_data.bodies.get(target), Some(Body::ItemDrop(_))) { - if let Some(tgt_pos) = read_data.positions.get(target) { - let dist_sqrd = self.pos.0.distance_squared(tgt_pos.0); - if dist_sqrd < NPC_PICKUP_RANGE.powi(2) { - if let Some(uid) = read_data.uids.get(target) { - controller - .push_event(ControlEvent::InventoryEvent(InventoryEvent::Pickup(*uid))); - } - } else if let Some((bearing, speed)) = agent.chaser.chase( - &*read_data.terrain, - self.pos.0, - self.vel.0, - tgt_pos.0, - TraversalConfig { - min_tgt_dist: NPC_PICKUP_RANGE - 1.0, - ..self.traversal_config - }, - ) { - controller.inputs.move_dir = - bearing.xy().try_normalized().unwrap_or_else(Vec2::zero) - * speed.min(0.2 + (dist_sqrd - (NPC_PICKUP_RANGE - 1.5).powi(2)) / 8.0); - self.jump_if(bearing.z > 1.5, controller); - controller.inputs.move_z = bearing.z; - } - } - } else { - agent.target = None; - self.idle_tree(agent, controller, read_data, rng); - } - } - - fn react_as_pet( - &self, - agent: &mut Agent, - controller: &mut Controller, - read_data: &ReadData, - target: EcsEntity, - rng: &mut impl Rng, - ) { - if let Some(tgt_pos) = read_data.positions.get(target) { - let dist_sqrd = self.pos.0.distance_squared(tgt_pos.0); - - let owner_recently_attacked = if let Some(target_health) = read_data.healths.get(target) - { - read_data.time.0 - target_health.last_change.time.0 < 5.0 - && target_health.last_change.amount < 0.0 - } else { - false - }; - - // If too far away, then follow - if dist_sqrd > (MAX_FOLLOW_DIST).powi(2) { - self.follow(agent, controller, &read_data.terrain, tgt_pos); - // Else, attack target's attacker (if there is one) - // Target is the owner in this case - } else if owner_recently_attacked { - self.attack_target_attacker(agent, read_data, controller, rng); - // Otherwise, just idle - } else { - self.idle_tree(agent, controller, read_data, rng); - } - } - } - - fn idle_tree( - &self, - agent: &mut Agent, - controller: &mut Controller, - read_data: &ReadData, - rng: &mut impl Rng, - ) { - // TODO: Awareness currently doesn't influence anything. - //agent.decrement_awareness(read_data.dt.0); - - let small_chance = rng.gen_bool(0.1); - // Set owner if no target - if agent.target.is_none() && small_chance { - if let Some(Alignment::Owned(owner)) = self.alignment { - if let Some(owner) = get_entity_by_id(owner.id(), read_data) { - agent.target = Some(Target::new(owner, false, read_data.time.0, false)); - } - } - } - - let timeout = if agent.behavior.is(BehaviorState::TRADING) { - TRADE_INTERACTION_TIME - } else { - DEFAULT_INTERACTION_TIME - }; - - match agent - .timer - .timeout_elapsed(read_data.time.0, TimerAction::Interact, timeout as f64) - { - None => { - // Look toward the interacting entity for a while - if let Some(Target { target, .. }) = &agent.target { - self.look_toward(controller, read_data, *target); - controller.push_action(ControlAction::Talk); - } - }, - Some(just_ended) => { - if just_ended { - agent.target = None; - controller.push_action(ControlAction::Stand); - } - - if rng.gen::() < 0.1 { - self.choose_target(agent, controller, read_data); - } else { - self.handle_sounds_heard(agent, controller, read_data, rng); - } - }, - } - } - - fn hostile_tree( - &self, - agent: &mut Agent, - controller: &mut Controller, - read_data: &ReadData, - event_emitter: &mut Emitter<'_, ServerEvent>, - rng: &mut impl Rng, - ) { - if self.damage < HEALING_ITEM_THRESHOLD && self.heal_self(agent, controller, false) { - agent.action_state.timer = 0.01; - return; - } - - if matches!(agent.inbox.front(), Some(AgentEvent::Hurt)) { - // Hurt utterances at random upon receiving damage - if rng.gen::() < 0.4 { - controller.push_utterance(UtteranceKind::Hurt); - } - agent.inbox.pop_front(); - } - - if let Some(Target { - target, - selected_at, - aggro_on, - .. - }) = &mut agent.target - { - let target = *target; - let selected_at = *selected_at; - if let Some(tgt_pos) = read_data.positions.get(target) { - let dist_sqrd = self.pos.0.distance_squared(tgt_pos.0); - let origin_dist_sqrd = match agent.patrol_origin { - Some(pos) => pos.distance_squared(self.pos.0), - None => 1.0, - }; - - let own_health_fraction = match self.health { - Some(val) => val.fraction(), - None => 1.0, - }; - let target_health_fraction = match read_data.healths.get(target) { - Some(val) => val.fraction(), - None => 1.0, - }; - - let in_aggro_range = agent - .psyche - .aggro_dist - .map_or(true, |ad| dist_sqrd < ad.powi(2)); - - if in_aggro_range { - *aggro_on = true; - } - let aggro_on = *aggro_on; - - if self.below_flee_health(agent) { - let has_opportunity_to_flee = agent.action_state.timer < FLEE_DURATION; - let within_flee_distance = dist_sqrd < MAX_FLEE_DIST.powi(2); - - // FIXME: Using action state timer to see if allowed to speak is a hack. - if agent.action_state.timer == 0.0 { - self.cry_out(agent, event_emitter, read_data); - agent.action_state.timer = 0.01; - } else if within_flee_distance && has_opportunity_to_flee { - self.flee(agent, controller, tgt_pos, &read_data.terrain); - agent.action_state.timer += read_data.dt.0; - } else { - agent.action_state.timer = 0.0; - agent.target = None; - self.idle(agent, controller, read_data, rng); - } - } else if is_dead(target, read_data) { - self.exclaim_relief_about_enemy_dead(agent, event_emitter); - agent.target = None; - self.idle(agent, controller, read_data, rng); - } else if is_invulnerable(target, read_data) - || stop_pursuing( - dist_sqrd, - origin_dist_sqrd, - own_health_fraction, - target_health_fraction, - read_data.time.0 - selected_at, - &agent.psyche, - ) - { - agent.target = None; - self.idle(agent, controller, read_data, rng); - } else { - let is_time_to_retarget = - read_data.time.0 - selected_at > RETARGETING_THRESHOLD_SECONDS; - - if !in_aggro_range && is_time_to_retarget { - self.choose_target(agent, controller, read_data); - } - - if aggro_on { - let target_data = TargetData::new( - tgt_pos, - read_data.bodies.get(target), - read_data.scales.get(target), - ); - let tgt_name = read_data.stats.get(target).map(|stats| stats.name.clone()); - - tgt_name - .map(|tgt_name| agent.add_fight_to_memory(&tgt_name, read_data.time.0)); - self.attack(agent, controller, &target_data, read_data, rng); - } else { - self.menacing(agent, controller, target, read_data, event_emitter, rng); - } - } - } - } - } - //////////////////////////////////////// // Action Nodes //////////////////////////////////////// @@ -962,522 +573,6 @@ impl<'a> AgentData<'a> { } } - /// deny any interaction whenever possible - fn cancel_interaction( - &self, - agent: &mut Agent, - controller: &mut Controller, - event_emitter: &mut Emitter<'_, ServerEvent>, - ) -> bool { - if let Some(msg) = agent.inbox.front() { - let used = match msg { - AgentEvent::Talk(..) | AgentEvent::TradeAccepted(_) => { - self.chat_npc_if_allowed_to_speak( - "npc-speech-villager_busy", - agent, - event_emitter, - ); - true - }, - AgentEvent::TradeInvite(_) => { - controller.push_invite_response(InviteResponse::Decline); - if agent.behavior.can_trade() { - self.chat_npc_if_allowed_to_speak( - "npc-speech-merchant_busy", - agent, - event_emitter, - ); - } else { - self.chat_npc_if_allowed_to_speak( - "npc-speech-villager_busy", - agent, - event_emitter, - ); - } - true - }, - AgentEvent::FinishedTrade(result) => { - // copy pasted from recv_interaction - // because the trade is not cancellable in this state - if agent.behavior.is(BehaviorState::TRADING) { - match result { - TradeResult::Completed => { - self.chat_npc( - "npc-speech-merchant_trade_successful", - event_emitter, - ); - }, - _ => { - self.chat_npc("npc-speech-merchant_trade_declined", event_emitter); - }, - } - agent.behavior.unset(BehaviorState::TRADING); - } - true - }, - AgentEvent::UpdatePendingTrade(boxval) => { - // immediately cancel the trade - let (tradeid, _pending, _prices, _inventories) = &**boxval; - agent.behavior.unset(BehaviorState::TRADING); - event_emitter.emit(ServerEvent::ProcessTradeAction( - *self.entity, - *tradeid, - TradeAction::Decline, - )); - self.chat_npc("npc-speech-merchant_trade_cancelled_hostile", event_emitter); - true - }, - AgentEvent::ServerSound(_) | AgentEvent::Hurt => false, - }; - if used { - agent.inbox.pop_front(); - } - return used; - } - false - } - - fn recv_interaction( - &self, - agent: &mut Agent, - controller: &mut Controller, - read_data: &ReadData, - event_emitter: &mut Emitter<'_, ServerEvent>, - ) -> bool { - // TODO: Process group invites - // TODO: Add Group AgentEvent - // let accept = false; // set back to "matches!(alignment, Alignment::Npc)" - // when we got better NPC recruitment mechanics if accept { - // // Clear agent comp - // //*agent = Agent::default(); - // controller - // .push_event(ControlEvent::InviteResponse(InviteResponse::Accept)); - // } else { - // controller - // .push_event(ControlEvent::InviteResponse(InviteResponse::Decline)); - // } - agent.action_state.timer += read_data.dt.0; - - let msg = agent.inbox.front(); - let used = match msg { - Some(AgentEvent::Talk(by, subject)) => { - if agent.allowed_to_speak() { - if let Some(target) = get_entity_by_id(by.id(), read_data) { - agent.target = Some(Target::new(target, false, read_data.time.0, false)); - - if self.look_toward(controller, read_data, target) { - controller.push_action(ControlAction::Stand); - controller.push_action(ControlAction::Talk); - controller.push_utterance(UtteranceKind::Greeting); - - match subject { - Subject::Regular => { - if let ( - Some((_travel_to, destination_name)), - Some(rtsim_entity), - ) = (&agent.rtsim_controller.travel_to, &self.rtsim_entity) - { - let personality = &rtsim_entity.brain.personality; - let standard_response_msg = || -> String { - if personality - .personality_traits - .contains(PersonalityTrait::Extroverted) - { - format!( - "I'm heading to {}! Want to come along?", - destination_name - ) - } else if personality - .personality_traits - .contains(PersonalityTrait::Disagreeable) - { - "Hrm.".to_string() - } else { - "Hello!".to_string() - } - }; - let msg = - if let Some(tgt_stats) = read_data.stats.get(target) { - agent.rtsim_controller.events.push( - RtSimEvent::AddMemory(Memory { - item: MemoryItem::CharacterInteraction { - name: tgt_stats.name.clone(), - }, - time_to_forget: read_data.time.0 + 600.0, - }), - ); - if rtsim_entity - .brain - .remembers_character(&tgt_stats.name) - { - if personality - .personality_traits - .contains(PersonalityTrait::Extroverted) - { - format!( - "Greetings fair {}! It has been far \ - too long since last I saw you. I'm \ - going to {} right now.", - &tgt_stats.name, destination_name - ) - } else if personality - .personality_traits - .contains(PersonalityTrait::Disagreeable) - { - "Oh. It's you again.".to_string() - } else { - format!( - "Hi again {}! Unfortunately I'm in a \ - hurry right now. See you!", - &tgt_stats.name - ) - } - } else { - standard_response_msg() - } - } else { - standard_response_msg() - }; - self.chat_npc(msg, event_emitter); - } else if agent.behavior.can_trade() { - if !agent.behavior.is(BehaviorState::TRADING) { - controller.push_initiate_invite(*by, InviteKind::Trade); - self.chat_npc( - "npc-speech-merchant_advertisement", - event_emitter, - ); - } else { - let default_msg = "npc-speech-merchant_busy"; - let msg = self.rtsim_entity.map_or(default_msg, |e| { - if e.brain - .personality - .personality_traits - .contains(PersonalityTrait::Disagreeable) - { - "npc-speech-merchant_busy_rude" - } else { - default_msg - } - }); - self.chat_npc(msg, event_emitter); - } - } else { - let mut rng = thread_rng(); - if let Some(extreme_trait) = - self.rtsim_entity.and_then(|e| { - e.brain.personality.random_chat_trait(&mut rng) - }) - { - let msg = match extreme_trait { - PersonalityTrait::Open => { - "npc-speech-villager_open" - }, - PersonalityTrait::Adventurous => { - "npc-speech-villager_adventurous" - }, - PersonalityTrait::Closed => { - "npc-speech-villager_closed" - }, - PersonalityTrait::Conscientious => { - "npc-speech-villager_conscientious" - }, - PersonalityTrait::Busybody => { - "npc-speech-villager_busybody" - }, - PersonalityTrait::Unconscientious => { - "npc-speech-villager_unconscientious" - }, - PersonalityTrait::Extroverted => { - "npc-speech-villager_extroverted" - }, - PersonalityTrait::Introverted => { - "npc-speech-villager_introverted" - }, - PersonalityTrait::Agreeable => { - "npc-speech-villager_agreeable" - }, - PersonalityTrait::Sociable => { - "npc-speech-villager_sociable" - }, - PersonalityTrait::Disagreeable => { - "npc-speech-villager_disagreeable" - }, - PersonalityTrait::Neurotic => { - "npc-speech-villager_neurotic" - }, - PersonalityTrait::Seeker => { - "npc-speech-villager_seeker" - }, - PersonalityTrait::SadLoner => { - "npc-speech-villager_sad_loner" - }, - PersonalityTrait::Worried => { - "npc-speech-villager_worried" - }, - PersonalityTrait::Stable => { - "npc-speech-villager_stable" - }, - }; - self.chat_npc(msg, event_emitter); - } else { - self.chat_npc("npc-speech-villager", event_emitter); - } - } - }, - Subject::Trade => { - if agent.behavior.can_trade() { - if !agent.behavior.is(BehaviorState::TRADING) { - controller.push_initiate_invite(*by, InviteKind::Trade); - self.chat_npc( - "npc-speech-merchant_advertisement", - event_emitter, - ); - } else { - self.chat_npc( - "npc-speech-merchant_busy", - event_emitter, - ); - } - } else { - // TODO: maybe make some travellers willing to trade with - // simpler goods like potions - self.chat_npc( - "npc-speech-villager_decline_trade", - event_emitter, - ); - } - }, - Subject::Mood => { - if let Some(rtsim_entity) = self.rtsim_entity { - if !rtsim_entity.brain.remembers_mood() { - // TODO: the following code will need a rework to - // implement more mood contexts - // This require that town NPCs becomes rtsim_entities to - // work fully. - match rand::random::() % 3 { - 0 => agent.rtsim_controller.events.push( - RtSimEvent::SetMood(Memory { - item: MemoryItem::Mood { - state: MoodState::Good( - MoodContext::GoodWeather, - ), - }, - time_to_forget: read_data.time.0 + 21200.0, - }), - ), - 1 => agent.rtsim_controller.events.push( - RtSimEvent::SetMood(Memory { - item: MemoryItem::Mood { - state: MoodState::Neutral( - MoodContext::EverydayLife, - ), - }, - time_to_forget: read_data.time.0 + 21200.0, - }), - ), - 2 => agent.rtsim_controller.events.push( - RtSimEvent::SetMood(Memory { - item: MemoryItem::Mood { - state: MoodState::Bad( - MoodContext::GoodWeather, - ), - }, - time_to_forget: read_data.time.0 + 86400.0, - }), - ), - _ => {}, // will never happen - } - } - if let Some(memory) = rtsim_entity.brain.get_mood() { - let msg = match &memory.item { - MemoryItem::Mood { state } => state.describe(), - _ => "".to_string(), - }; - self.chat_npc(msg, event_emitter); - } - } - }, - Subject::Location(location) => { - if let Some(tgt_pos) = read_data.positions.get(target) { - let raw_dir = location.origin.as_::() - tgt_pos.0.xy(); - let dist = Distance::from_dir(raw_dir).name(); - let dir = Direction::from_dir(raw_dir).name(); - - let msg = format!( - "{} ? I think it's {} {} from here!", - location.name, dist, dir - ); - self.chat_npc(msg, event_emitter); - } - }, - Subject::Person(person) => { - if let Some(src_pos) = read_data.positions.get(target) { - let msg = if let Some(person_pos) = person.origin { - let distance = Distance::from_dir( - person_pos.xy() - src_pos.0.xy(), - ); - match distance { - Distance::NextTo | Distance::Near => { - format!( - "{} ? I think he's {} {} from here!", - person.name(), - distance.name(), - Direction::from_dir( - person_pos.xy() - src_pos.0.xy(), - ) - .name() - ) - }, - _ => { - format!( - "{} ? I think he's gone visiting another \ - town. Come back later!", - person.name() - ) - }, - } - } else { - format!( - "{} ? Sorry, I don't know where you can find him.", - person.name() - ) - }; - self.chat_npc(msg, event_emitter); - } - }, - Subject::Work => {}, - } - } - } - } - true - }, - Some(AgentEvent::TradeInvite(with)) => { - if agent.behavior.can_trade() { - if !agent.behavior.is(BehaviorState::TRADING) { - // stand still and looking towards the trading player - controller.push_action(ControlAction::Stand); - controller.push_action(ControlAction::Talk); - if let Some(target) = get_entity_by_id(with.id(), read_data) { - agent.target = - Some(Target::new(target, false, read_data.time.0, false)); - } - controller.push_invite_response(InviteResponse::Accept); - agent.behavior.unset(BehaviorState::TRADING_ISSUER); - agent.behavior.set(BehaviorState::TRADING); - } else { - controller.push_invite_response(InviteResponse::Decline); - self.chat_npc_if_allowed_to_speak( - "npc-speech-merchant_busy", - agent, - event_emitter, - ); - } - } else { - // TODO: Provide a hint where to find the closest merchant? - controller.push_invite_response(InviteResponse::Decline); - self.chat_npc_if_allowed_to_speak( - "npc-speech-villager_decline_trade", - agent, - event_emitter, - ); - } - true - }, - Some(AgentEvent::TradeAccepted(with)) => { - if !agent.behavior.is(BehaviorState::TRADING) { - if let Some(target) = get_entity_by_id(with.id(), read_data) { - agent.target = Some(Target::new(target, false, read_data.time.0, false)); - } - agent.behavior.set(BehaviorState::TRADING); - agent.behavior.set(BehaviorState::TRADING_ISSUER); - } - true - }, - Some(AgentEvent::FinishedTrade(result)) => { - if agent.behavior.is(BehaviorState::TRADING) { - match result { - TradeResult::Completed => { - self.chat_npc("npc-speech-merchant_trade_successful", event_emitter); - }, - _ => { - self.chat_npc("npc-speech-merchant_trade_declined", event_emitter); - }, - } - agent.behavior.unset(BehaviorState::TRADING); - } - true - }, - Some(AgentEvent::UpdatePendingTrade(boxval)) => { - let (tradeid, pending, prices, inventories) = &**boxval; - if agent.behavior.is(BehaviorState::TRADING) { - let who: usize = if agent.behavior.is(BehaviorState::TRADING_ISSUER) { - 0 - } else { - 1 - }; - let balance0: f32 = prices.balance(&pending.offers, inventories, 1 - who, true); - let balance1: f32 = prices.balance(&pending.offers, inventories, who, false); - if balance0 >= balance1 { - // If the trade is favourable to us, only send an accept message if we're - // not already accepting (since otherwise, spam-clicking the accept button - // results in lagging and moving to the review phase of an unfavorable trade - // (although since the phase is included in the message, this shouldn't - // result in fully accepting an unfavourable trade)) - if !pending.accept_flags[who] && !pending.is_empty_trade() { - event_emitter.emit(ServerEvent::ProcessTradeAction( - *self.entity, - *tradeid, - TradeAction::Accept(pending.phase), - )); - tracing::trace!(?tradeid, ?balance0, ?balance1, "Accept Pending Trade"); - } - } else { - if balance1 > 0.0 { - let msg = format!( - "That only covers {:.0}% of my costs!", - (balance0 / balance1 * 100.0).floor() - ); - if let Some(tgt_data) = &agent.target { - // If talking with someone in particular, "tell" it only to them - if let Some(with) = read_data.uids.get(tgt_data.target) { - event_emitter.emit(ServerEvent::Chat( - UnresolvedChatMsg::npc_tell(*self.uid, *with, msg), - )); - } else { - event_emitter.emit(ServerEvent::Chat( - UnresolvedChatMsg::npc_say(*self.uid, msg), - )); - } - } else { - event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( - *self.uid, msg, - ))); - } - } - if pending.phase != TradePhase::Mutate { - // we got into the review phase but without balanced goods, decline - agent.behavior.unset(BehaviorState::TRADING); - event_emitter.emit(ServerEvent::ProcessTradeAction( - *self.entity, - *tradeid, - TradeAction::Decline, - )); - } - } - } - true - }, - Some(AgentEvent::ServerSound(_)) => false, - Some(AgentEvent::Hurt) => false, - None => false, - }; - if used { - agent.inbox.pop_front(); - } - used - } - fn look_toward( &self, controller: &mut Controller, diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index 303a9c7551..f85373aa58 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -3,16 +3,23 @@ use common::{ agent::{ AgentEvent, Target, TimerAction, DEFAULT_INTERACTION_TIME, TRADE_INTERACTION_TIME, }, + compass::{Direction, Distance}, + dialogue::{MoodContext, MoodState, Subject}, + invite::{InviteKind, InviteResponse}, Agent, Alignment, BehaviorState, Body, BuffKind, ControlAction, ControlEvent, Controller, - InputKind, InventoryEvent, UtteranceKind, + InputKind, InventoryEvent, UnresolvedChatMsg, UtteranceKind, }, event::{Emitter, ServerEvent}, path::TraversalConfig, + rtsim::{Memory, MemoryItem, RtSimEvent}, + trade::{TradeAction, TradePhase, TradeResult}, }; use rand::{prelude::ThreadRng, thread_rng, Rng}; use specs::saveload::{Marker, MarkerAllocator}; use vek::Vec2; +use crate::rtsim::entity::PersonalityTrait; + use super::{ consts::{ DAMAGE_MEMORY_DURATION, FLEE_DURATION, HEALING_ITEM_THRESHOLD, MAX_FLEE_DIST, @@ -76,6 +83,19 @@ impl BehaviorTree { } } + pub fn interaction() -> Self { + Self { + tree: vec![ + increment_timer_deltatime, + handle_inbox_talk, + handle_inbox_trade_invite, + handle_inbox_trade_accepted, + handle_inbox_finished_trade, + handle_inbox_update_pending_trade, + ], + } + } + pub fn hostile() -> Self { Self { tree: vec![heal_self_if_hurt, hurt_utterance, do_combat], @@ -425,14 +445,7 @@ fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { /// If we receive a new interaction, start the interaction timer fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { - if bdata.agent.allowed_to_speak() - && bdata.agent_data.recv_interaction( - bdata.agent, - bdata.controller, - bdata.read_data, - bdata.event_emitter, - ) - { + if bdata.agent.allowed_to_speak() && BehaviorTree::interaction().run_with_behavior_data(bdata) { bdata .agent .timer @@ -516,6 +529,7 @@ fn do_combat(bdata: &mut BehaviorData) -> bool { controller, rng, } = bdata; + if let Some(Target { target, selected_at, @@ -609,3 +623,466 @@ fn do_combat(bdata: &mut BehaviorData) -> bool { } false } + +fn increment_timer_deltatime(bdata: &mut BehaviorData) -> bool { + bdata.agent.action_state.timer += bdata.read_data.dt.0; + false +} + +/// Handles Talk event if the front of the agent's inbox contains one +fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + controller, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::Talk(_, _))) { + return false; + } + + if let Some(AgentEvent::Talk(by, subject)) = agent.inbox.pop_front() { + if agent.allowed_to_speak() { + if let Some(target) = get_entity_by_id(by.id(), read_data) { + agent.target = Some(Target::new(target, false, read_data.time.0, false)); + + if agent_data.look_toward(controller, read_data, target) { + controller.push_action(ControlAction::Stand); + controller.push_action(ControlAction::Talk); + controller.push_utterance(UtteranceKind::Greeting); + + match subject { + Subject::Regular => { + if let (Some((_travel_to, destination_name)), Some(rtsim_entity)) = + (&agent.rtsim_controller.travel_to, &agent_data.rtsim_entity) + { + let personality = &rtsim_entity.brain.personality; + let standard_response_msg = || -> String { + if personality + .personality_traits + .contains(PersonalityTrait::Extroverted) + { + format!( + "I'm heading to {}! Want to come along?", + destination_name + ) + } else if personality + .personality_traits + .contains(PersonalityTrait::Disagreeable) + { + "Hrm.".to_string() + } else { + "Hello!".to_string() + } + }; + let msg = if let Some(tgt_stats) = read_data.stats.get(target) { + agent.rtsim_controller.events.push(RtSimEvent::AddMemory( + Memory { + item: MemoryItem::CharacterInteraction { + name: tgt_stats.name.clone(), + }, + time_to_forget: read_data.time.0 + 600.0, + }, + )); + if rtsim_entity.brain.remembers_character(&tgt_stats.name) { + if personality + .personality_traits + .contains(PersonalityTrait::Extroverted) + { + format!( + "Greetings fair {}! It has been far too long \ + since last I saw you. I'm going to {} right now.", + &tgt_stats.name, destination_name + ) + } else if personality + .personality_traits + .contains(PersonalityTrait::Disagreeable) + { + "Oh. It's you again.".to_string() + } else { + format!( + "Hi again {}! Unfortunately I'm in a hurry right \ + now. See you!", + &tgt_stats.name + ) + } + } else { + standard_response_msg() + } + } else { + standard_response_msg() + }; + agent_data.chat_npc(msg, event_emitter); + } else if agent.behavior.can_trade() { + if !agent.behavior.is(BehaviorState::TRADING) { + controller.push_initiate_invite(by, InviteKind::Trade); + agent_data.chat_npc( + "npc.speech.merchant_advertisement", + event_emitter, + ); + } else { + let default_msg = "npc.speech.merchant_busy"; + let msg = agent_data.rtsim_entity.map_or(default_msg, |e| { + if e.brain + .personality + .personality_traits + .contains(PersonalityTrait::Disagreeable) + { + "npc.speech.merchant_busy_rude" + } else { + default_msg + } + }); + agent_data.chat_npc(msg, event_emitter); + } + } else { + let mut rng = thread_rng(); + if let Some(extreme_trait) = agent_data + .rtsim_entity + .and_then(|e| e.brain.personality.random_chat_trait(&mut rng)) + { + let msg = match extreme_trait { + PersonalityTrait::Open => "npc.speech.villager_open", + PersonalityTrait::Adventurous => { + "npc.speech.villager_adventurous" + }, + PersonalityTrait::Closed => "npc.speech.villager_closed", + PersonalityTrait::Conscientious => { + "npc.speech.villager_conscientious" + }, + PersonalityTrait::Busybody => { + "npc.speech.villager_busybody" + }, + PersonalityTrait::Unconscientious => { + "npc.speech.villager_unconscientious" + }, + PersonalityTrait::Extroverted => { + "npc.speech.villager_extroverted" + }, + PersonalityTrait::Introverted => { + "npc.speech.villager_introverted" + }, + PersonalityTrait::Agreeable => { + "npc.speech.villager_agreeable" + }, + PersonalityTrait::Sociable => { + "npc.speech.villager_sociable" + }, + PersonalityTrait::Disagreeable => { + "npc.speech.villager_disagreeable" + }, + PersonalityTrait::Neurotic => { + "npc.speech.villager_neurotic" + }, + PersonalityTrait::Seeker => "npc.speech.villager_seeker", + PersonalityTrait::SadLoner => { + "npc.speech.villager_sad_loner" + }, + PersonalityTrait::Worried => "npc.speech.villager_worried", + PersonalityTrait::Stable => "npc.speech.villager_stable", + }; + agent_data.chat_npc(msg, event_emitter); + } else { + agent_data.chat_npc("npc.speech.villager", event_emitter); + } + } + }, + Subject::Trade => { + if agent.behavior.can_trade() { + if !agent.behavior.is(BehaviorState::TRADING) { + controller.push_initiate_invite(by, InviteKind::Trade); + agent_data.chat_npc( + "npc.speech.merchant_advertisement", + event_emitter, + ); + } else { + agent_data.chat_npc("npc.speech.merchant_busy", event_emitter); + } + } else { + // TODO: maybe make some travellers willing to trade with + // simpler goods like potions + agent_data + .chat_npc("npc.speech.villager_decline_trade", event_emitter); + } + }, + Subject::Mood => { + if let Some(rtsim_entity) = agent_data.rtsim_entity { + if !rtsim_entity.brain.remembers_mood() { + // TODO: the following code will need a rework to + // implement more mood contexts + // This require that town NPCs becomes rtsim_entities to + // work fully. + match rand::random::() % 3 { + 0 => agent.rtsim_controller.events.push( + RtSimEvent::SetMood(Memory { + item: MemoryItem::Mood { + state: MoodState::Good( + MoodContext::GoodWeather, + ), + }, + time_to_forget: read_data.time.0 + 21200.0, + }), + ), + 1 => agent.rtsim_controller.events.push( + RtSimEvent::SetMood(Memory { + item: MemoryItem::Mood { + state: MoodState::Neutral( + MoodContext::EverydayLife, + ), + }, + time_to_forget: read_data.time.0 + 21200.0, + }), + ), + 2 => agent.rtsim_controller.events.push( + RtSimEvent::SetMood(Memory { + item: MemoryItem::Mood { + state: MoodState::Bad(MoodContext::GoodWeather), + }, + time_to_forget: read_data.time.0 + 86400.0, + }), + ), + _ => {}, // will never happen + } + } + if let Some(memory) = rtsim_entity.brain.get_mood() { + let msg = match &memory.item { + MemoryItem::Mood { state } => state.describe(), + _ => "".to_string(), + }; + agent_data.chat_npc(msg, event_emitter); + } + } + }, + Subject::Location(location) => { + if let Some(tgt_pos) = read_data.positions.get(target) { + let raw_dir = location.origin.as_::() - tgt_pos.0.xy(); + let dist = Distance::from_dir(raw_dir).name(); + let dir = Direction::from_dir(raw_dir).name(); + + let msg = format!( + "{} ? I think it's {} {} from here!", + location.name, dist, dir + ); + agent_data.chat_npc(msg, event_emitter); + } + }, + Subject::Person(person) => { + if let Some(src_pos) = read_data.positions.get(target) { + let msg = if let Some(person_pos) = person.origin { + let distance = + Distance::from_dir(person_pos.xy() - src_pos.0.xy()); + match distance { + Distance::NextTo | Distance::Near => { + format!( + "{} ? I think he's {} {} from here!", + person.name(), + distance.name(), + Direction::from_dir( + person_pos.xy() - src_pos.0.xy(), + ) + .name() + ) + }, + _ => { + format!( + "{} ? I think he's gone visiting another town. \ + Come back later!", + person.name() + ) + }, + } + } else { + format!( + "{} ? Sorry, I don't know where you can find him.", + person.name() + ) + }; + agent_data.chat_npc(msg, event_emitter); + } + }, + Subject::Work => {}, + } + } + } + } + } + true +} + +fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + controller, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::TradeInvite(_))) { + return false; + } + + if let Some(AgentEvent::TradeInvite(with)) = agent.inbox.pop_front() { + if agent.behavior.can_trade() { + if !agent.behavior.is(BehaviorState::TRADING) { + // stand still and looking towards the trading player + controller.push_action(ControlAction::Stand); + controller.push_action(ControlAction::Talk); + if let Some(target) = get_entity_by_id(with.id(), read_data) { + agent.target = Some(Target::new(target, false, read_data.time.0, false)); + } + controller.push_invite_response(InviteResponse::Accept); + agent.behavior.unset(BehaviorState::TRADING_ISSUER); + agent.behavior.set(BehaviorState::TRADING); + } else { + controller.push_invite_response(InviteResponse::Decline); + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.merchant_busy", + agent, + event_emitter, + ); + } + } else { + // TODO: Provide a hint where to find the closest merchant? + controller.push_invite_response(InviteResponse::Decline); + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.villager_decline_trade", + agent, + event_emitter, + ); + } + } + true +} + +fn handle_inbox_trade_accepted(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, read_data, .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::TradeAccepted(_))) { + return false; + } + + if let Some(AgentEvent::TradeAccepted(with)) = agent.inbox.pop_front() { + if !agent.behavior.is(BehaviorState::TRADING) { + if let Some(target) = get_entity_by_id(with.id(), read_data) { + agent.target = Some(Target::new(target, false, read_data.time.0, false)); + } + agent.behavior.set(BehaviorState::TRADING); + agent.behavior.set(BehaviorState::TRADING_ISSUER); + } + } + true +} + +fn handle_inbox_finished_trade(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + event_emitter, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::FinishedTrade(_))) { + return false; + } + + if let Some(AgentEvent::FinishedTrade(result)) = agent.inbox.pop_front() { + if agent.behavior.is(BehaviorState::TRADING) { + match result { + TradeResult::Completed => { + agent_data.chat_npc("npc.speech.merchant_trade_successful", event_emitter); + }, + _ => { + agent_data.chat_npc("npc.speech.merchant_trade_declined", event_emitter); + }, + } + agent.behavior.unset(BehaviorState::TRADING); + } + } + true +} + +fn handle_inbox_update_pending_trade(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::UpdatePendingTrade(_))) { + return false; + } + + if let Some(AgentEvent::UpdatePendingTrade(boxval)) = agent.inbox.pop_front() { + let (tradeid, pending, prices, inventories) = *boxval; + if agent.behavior.is(BehaviorState::TRADING) { + let who: usize = if agent.behavior.is(BehaviorState::TRADING_ISSUER) { + 0 + } else { + 1 + }; + let balance0: f32 = prices.balance(&pending.offers, &inventories, 1 - who, true); + let balance1: f32 = prices.balance(&pending.offers, &inventories, who, false); + if balance0 >= balance1 { + // If the trade is favourable to us, only send an accept message if we're + // not already accepting (since otherwise, spam-clicking the accept button + // results in lagging and moving to the review phase of an unfavorable trade + // (although since the phase is included in the message, this shouldn't + // result in fully accepting an unfavourable trade)) + if !pending.accept_flags[who] && !pending.is_empty_trade() { + event_emitter.emit(ServerEvent::ProcessTradeAction( + *agent_data.entity, + tradeid, + TradeAction::Accept(pending.phase), + )); + tracing::trace!(?tradeid, ?balance0, ?balance1, "Accept Pending Trade"); + } + } else { + if balance1 > 0.0 { + let msg = format!( + "That only covers {:.0}% of my costs!", + (balance0 / balance1 * 100.0).floor() + ); + if let Some(tgt_data) = &agent.target { + // If talking with someone in particular, "tell" it only to them + if let Some(with) = read_data.uids.get(tgt_data.target) { + event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_tell( + *agent_data.uid, + *with, + msg, + ))); + } else { + event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( + *agent_data.uid, + msg, + ))); + } + } else { + event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( + *agent_data.uid, + msg, + ))); + } + } + if pending.phase != TradePhase::Mutate { + // we got into the review phase but without balanced goods, decline + agent.behavior.unset(BehaviorState::TRADING); + event_emitter.emit(ServerEvent::ProcessTradeAction( + *agent_data.entity, + tradeid, + TradeAction::Decline, + )); + } + } + } + } + true +} From 6994b026b1ae0c98e96ee0bb12f8be4007425010 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Fri, 29 Jul 2022 19:06:08 +0200 Subject: [PATCH 030/854] Remove unused import --- server/src/sys/agent.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index e7271be2b3..ac0d34f8e6 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -50,9 +50,7 @@ use common_base::prof_span; use common_ecs::{Job, Origin, ParMode, Phase, System}; use rand::{thread_rng, Rng}; use rayon::iter::ParallelIterator; -use specs::{ - saveload::Marker, Entity as EcsEntity, Join, ParJoin, Read, WriteExpect, WriteStorage, -}; +use specs::{Entity as EcsEntity, Join, ParJoin, Read, WriteExpect, WriteStorage}; use vek::*; /// This system will allow NPCs to modify their controller From 4f53d055deef1d54a42b7156d83e78e9ed99cb84 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Sat, 6 Aug 2022 13:05:36 +0200 Subject: [PATCH 031/854] Reimplement !3467 + fix event being pushed in front of agent inbox --- server/src/events/entity_manipulation.rs | 2 +- server/src/sys/agent/behavior_tree.rs | 566 ++-------------- .../sys/agent/behavior_tree/interaction.rs | 611 ++++++++++++++++++ 3 files changed, 651 insertions(+), 528 deletions(-) create mode 100644 server/src/sys/agent/behavior_tree/interaction.rs diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 32fb838add..e7a398e94f 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -94,7 +94,7 @@ pub fn handle_health_change(server: &Server, entity: EcsEntity, change: HealthCh let damage = -change.amount; if damage > 5.0 { if let Some(agent) = ecs.write_storage::().get_mut(entity) { - agent.inbox.push_front(AgentEvent::Hurt); + agent.inbox.push_back(AgentEvent::Hurt); } } } diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index f85373aa58..16d042dda4 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -3,22 +3,21 @@ use common::{ agent::{ AgentEvent, Target, TimerAction, DEFAULT_INTERACTION_TIME, TRADE_INTERACTION_TIME, }, - compass::{Direction, Distance}, - dialogue::{MoodContext, MoodState, Subject}, - invite::{InviteKind, InviteResponse}, - Agent, Alignment, BehaviorState, Body, BuffKind, ControlAction, ControlEvent, Controller, - InputKind, InventoryEvent, UnresolvedChatMsg, UtteranceKind, + Agent, Alignment, Behavior, BehaviorCapability, BehaviorState, Body, BuffKind, + ControlAction, ControlEvent, Controller, InputKind, InventoryEvent, UtteranceKind, }, event::{Emitter, ServerEvent}, path::TraversalConfig, - rtsim::{Memory, MemoryItem, RtSimEvent}, - trade::{TradeAction, TradePhase, TradeResult}, }; use rand::{prelude::ThreadRng, thread_rng, Rng}; use specs::saveload::{Marker, MarkerAllocator}; use vek::Vec2; -use crate::rtsim::entity::PersonalityTrait; +use self::interaction::{ + handle_inbox_cancel_interactions, handle_inbox_finished_trade, handle_inbox_talk, + handle_inbox_trade_accepted, handle_inbox_trade_invite, handle_inbox_update_pending_trade, + increment_timer_deltatime, process_inbox_interaction, process_inbox_sound_and_hurt, +}; use super::{ consts::{ @@ -29,8 +28,10 @@ use super::{ util::{get_entity_by_id, is_dead, is_dead_or_invulnerable, is_invulnerable, stop_pursuing}, }; +mod interaction; + /// Struct containing essential data for running a behavior tree -struct BehaviorData<'a, 'b, 'c> { +pub struct BehaviorData<'a, 'b, 'c> { agent: &'a mut Agent, agent_data: AgentData<'a>, read_data: &'a ReadData<'a>, @@ -58,8 +59,8 @@ impl BehaviorTree { react_on_dangerous_fall, react_if_on_fire, target_if_attacked, - do_target_tree_if_target, - do_idle_tree, + do_target_tree_if_target_else_do_idle_tree, + process_inbox_interaction, ], } } @@ -83,22 +84,33 @@ impl BehaviorTree { } } - pub fn interaction() -> Self { - Self { - tree: vec![ - increment_timer_deltatime, - handle_inbox_talk, - handle_inbox_trade_invite, - handle_inbox_trade_accepted, - handle_inbox_finished_trade, - handle_inbox_update_pending_trade, - ], + pub fn interaction(behavior: Behavior) -> Self { + if behavior.can(BehaviorCapability::SPEAK) { + Self { + tree: vec![ + increment_timer_deltatime, + handle_inbox_talk, + handle_inbox_trade_invite, + handle_inbox_trade_accepted, + handle_inbox_finished_trade, + handle_inbox_update_pending_trade, + ], + } + } else { + Self { + tree: vec![handle_inbox_cancel_interactions], + } } } pub fn hostile() -> Self { Self { - tree: vec![heal_self_if_hurt, hurt_utterance, do_combat], + tree: vec![ + handle_inbox_cancel_interactions, + heal_self_if_hurt, + hurt_utterance, + do_combat, + ], } } @@ -107,7 +119,6 @@ impl BehaviorTree { tree: vec![ set_owner_if_no_target, process_inbox_sound_and_hurt, - process_inbox_interaction, handle_timer, ], } @@ -254,10 +265,13 @@ fn target_if_attacked(bdata: &mut BehaviorData) -> bool { false } -fn do_target_tree_if_target(bdata: &mut BehaviorData) -> bool { +/// If the agent has a target, do the target tree, else do the idle tree +/// This function won't stop the behavior tree +fn do_target_tree_if_target_else_do_idle_tree(bdata: &mut BehaviorData) -> bool { if bdata.agent.target.is_some() { BehaviorTree::target().run_with_behavior_data(bdata); - return true; + } else { + BehaviorTree::idle().run_with_behavior_data(bdata); } false } @@ -415,45 +429,6 @@ fn set_owner_if_no_target(bdata: &mut BehaviorData) -> bool { false } -/// Interact if incoming messages -fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { - if !bdata.agent.inbox.is_empty() { - if matches!( - bdata.agent.inbox.front(), - Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt) - ) { - let sound = bdata.agent.inbox.pop_front(); - match sound { - Some(AgentEvent::ServerSound(sound)) => { - bdata.agent.sounds_heard.push(sound); - }, - Some(AgentEvent::Hurt) => { - // Hurt utterances at random upon receiving damage - if bdata.rng.gen::() < 0.4 { - bdata.controller.push_utterance(UtteranceKind::Hurt); - } - }, - //Note: this should be unreachable - Some(_) | None => {}, - } - } else { - bdata.agent.action_state.timer = 0.1; - } - } - false -} - -/// If we receive a new interaction, start the interaction timer -fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { - if bdata.agent.allowed_to_speak() && BehaviorTree::interaction().run_with_behavior_data(bdata) { - bdata - .agent - .timer - .start(bdata.read_data.time.0, TimerAction::Interact); - } - false -} - fn handle_timer(bdata: &mut BehaviorData) -> bool { let timeout = if bdata.agent.behavior.is(BehaviorState::TRADING) { TRADE_INTERACTION_TIME @@ -623,466 +598,3 @@ fn do_combat(bdata: &mut BehaviorData) -> bool { } false } - -fn increment_timer_deltatime(bdata: &mut BehaviorData) -> bool { - bdata.agent.action_state.timer += bdata.read_data.dt.0; - false -} - -/// Handles Talk event if the front of the agent's inbox contains one -fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { - let BehaviorData { - agent, - agent_data, - read_data, - event_emitter, - controller, - .. - } = bdata; - - if !matches!(agent.inbox.front(), Some(AgentEvent::Talk(_, _))) { - return false; - } - - if let Some(AgentEvent::Talk(by, subject)) = agent.inbox.pop_front() { - if agent.allowed_to_speak() { - if let Some(target) = get_entity_by_id(by.id(), read_data) { - agent.target = Some(Target::new(target, false, read_data.time.0, false)); - - if agent_data.look_toward(controller, read_data, target) { - controller.push_action(ControlAction::Stand); - controller.push_action(ControlAction::Talk); - controller.push_utterance(UtteranceKind::Greeting); - - match subject { - Subject::Regular => { - if let (Some((_travel_to, destination_name)), Some(rtsim_entity)) = - (&agent.rtsim_controller.travel_to, &agent_data.rtsim_entity) - { - let personality = &rtsim_entity.brain.personality; - let standard_response_msg = || -> String { - if personality - .personality_traits - .contains(PersonalityTrait::Extroverted) - { - format!( - "I'm heading to {}! Want to come along?", - destination_name - ) - } else if personality - .personality_traits - .contains(PersonalityTrait::Disagreeable) - { - "Hrm.".to_string() - } else { - "Hello!".to_string() - } - }; - let msg = if let Some(tgt_stats) = read_data.stats.get(target) { - agent.rtsim_controller.events.push(RtSimEvent::AddMemory( - Memory { - item: MemoryItem::CharacterInteraction { - name: tgt_stats.name.clone(), - }, - time_to_forget: read_data.time.0 + 600.0, - }, - )); - if rtsim_entity.brain.remembers_character(&tgt_stats.name) { - if personality - .personality_traits - .contains(PersonalityTrait::Extroverted) - { - format!( - "Greetings fair {}! It has been far too long \ - since last I saw you. I'm going to {} right now.", - &tgt_stats.name, destination_name - ) - } else if personality - .personality_traits - .contains(PersonalityTrait::Disagreeable) - { - "Oh. It's you again.".to_string() - } else { - format!( - "Hi again {}! Unfortunately I'm in a hurry right \ - now. See you!", - &tgt_stats.name - ) - } - } else { - standard_response_msg() - } - } else { - standard_response_msg() - }; - agent_data.chat_npc(msg, event_emitter); - } else if agent.behavior.can_trade() { - if !agent.behavior.is(BehaviorState::TRADING) { - controller.push_initiate_invite(by, InviteKind::Trade); - agent_data.chat_npc( - "npc.speech.merchant_advertisement", - event_emitter, - ); - } else { - let default_msg = "npc.speech.merchant_busy"; - let msg = agent_data.rtsim_entity.map_or(default_msg, |e| { - if e.brain - .personality - .personality_traits - .contains(PersonalityTrait::Disagreeable) - { - "npc.speech.merchant_busy_rude" - } else { - default_msg - } - }); - agent_data.chat_npc(msg, event_emitter); - } - } else { - let mut rng = thread_rng(); - if let Some(extreme_trait) = agent_data - .rtsim_entity - .and_then(|e| e.brain.personality.random_chat_trait(&mut rng)) - { - let msg = match extreme_trait { - PersonalityTrait::Open => "npc.speech.villager_open", - PersonalityTrait::Adventurous => { - "npc.speech.villager_adventurous" - }, - PersonalityTrait::Closed => "npc.speech.villager_closed", - PersonalityTrait::Conscientious => { - "npc.speech.villager_conscientious" - }, - PersonalityTrait::Busybody => { - "npc.speech.villager_busybody" - }, - PersonalityTrait::Unconscientious => { - "npc.speech.villager_unconscientious" - }, - PersonalityTrait::Extroverted => { - "npc.speech.villager_extroverted" - }, - PersonalityTrait::Introverted => { - "npc.speech.villager_introverted" - }, - PersonalityTrait::Agreeable => { - "npc.speech.villager_agreeable" - }, - PersonalityTrait::Sociable => { - "npc.speech.villager_sociable" - }, - PersonalityTrait::Disagreeable => { - "npc.speech.villager_disagreeable" - }, - PersonalityTrait::Neurotic => { - "npc.speech.villager_neurotic" - }, - PersonalityTrait::Seeker => "npc.speech.villager_seeker", - PersonalityTrait::SadLoner => { - "npc.speech.villager_sad_loner" - }, - PersonalityTrait::Worried => "npc.speech.villager_worried", - PersonalityTrait::Stable => "npc.speech.villager_stable", - }; - agent_data.chat_npc(msg, event_emitter); - } else { - agent_data.chat_npc("npc.speech.villager", event_emitter); - } - } - }, - Subject::Trade => { - if agent.behavior.can_trade() { - if !agent.behavior.is(BehaviorState::TRADING) { - controller.push_initiate_invite(by, InviteKind::Trade); - agent_data.chat_npc( - "npc.speech.merchant_advertisement", - event_emitter, - ); - } else { - agent_data.chat_npc("npc.speech.merchant_busy", event_emitter); - } - } else { - // TODO: maybe make some travellers willing to trade with - // simpler goods like potions - agent_data - .chat_npc("npc.speech.villager_decline_trade", event_emitter); - } - }, - Subject::Mood => { - if let Some(rtsim_entity) = agent_data.rtsim_entity { - if !rtsim_entity.brain.remembers_mood() { - // TODO: the following code will need a rework to - // implement more mood contexts - // This require that town NPCs becomes rtsim_entities to - // work fully. - match rand::random::() % 3 { - 0 => agent.rtsim_controller.events.push( - RtSimEvent::SetMood(Memory { - item: MemoryItem::Mood { - state: MoodState::Good( - MoodContext::GoodWeather, - ), - }, - time_to_forget: read_data.time.0 + 21200.0, - }), - ), - 1 => agent.rtsim_controller.events.push( - RtSimEvent::SetMood(Memory { - item: MemoryItem::Mood { - state: MoodState::Neutral( - MoodContext::EverydayLife, - ), - }, - time_to_forget: read_data.time.0 + 21200.0, - }), - ), - 2 => agent.rtsim_controller.events.push( - RtSimEvent::SetMood(Memory { - item: MemoryItem::Mood { - state: MoodState::Bad(MoodContext::GoodWeather), - }, - time_to_forget: read_data.time.0 + 86400.0, - }), - ), - _ => {}, // will never happen - } - } - if let Some(memory) = rtsim_entity.brain.get_mood() { - let msg = match &memory.item { - MemoryItem::Mood { state } => state.describe(), - _ => "".to_string(), - }; - agent_data.chat_npc(msg, event_emitter); - } - } - }, - Subject::Location(location) => { - if let Some(tgt_pos) = read_data.positions.get(target) { - let raw_dir = location.origin.as_::() - tgt_pos.0.xy(); - let dist = Distance::from_dir(raw_dir).name(); - let dir = Direction::from_dir(raw_dir).name(); - - let msg = format!( - "{} ? I think it's {} {} from here!", - location.name, dist, dir - ); - agent_data.chat_npc(msg, event_emitter); - } - }, - Subject::Person(person) => { - if let Some(src_pos) = read_data.positions.get(target) { - let msg = if let Some(person_pos) = person.origin { - let distance = - Distance::from_dir(person_pos.xy() - src_pos.0.xy()); - match distance { - Distance::NextTo | Distance::Near => { - format!( - "{} ? I think he's {} {} from here!", - person.name(), - distance.name(), - Direction::from_dir( - person_pos.xy() - src_pos.0.xy(), - ) - .name() - ) - }, - _ => { - format!( - "{} ? I think he's gone visiting another town. \ - Come back later!", - person.name() - ) - }, - } - } else { - format!( - "{} ? Sorry, I don't know where you can find him.", - person.name() - ) - }; - agent_data.chat_npc(msg, event_emitter); - } - }, - Subject::Work => {}, - } - } - } - } - } - true -} - -fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { - let BehaviorData { - agent, - agent_data, - read_data, - event_emitter, - controller, - .. - } = bdata; - - if !matches!(agent.inbox.front(), Some(AgentEvent::TradeInvite(_))) { - return false; - } - - if let Some(AgentEvent::TradeInvite(with)) = agent.inbox.pop_front() { - if agent.behavior.can_trade() { - if !agent.behavior.is(BehaviorState::TRADING) { - // stand still and looking towards the trading player - controller.push_action(ControlAction::Stand); - controller.push_action(ControlAction::Talk); - if let Some(target) = get_entity_by_id(with.id(), read_data) { - agent.target = Some(Target::new(target, false, read_data.time.0, false)); - } - controller.push_invite_response(InviteResponse::Accept); - agent.behavior.unset(BehaviorState::TRADING_ISSUER); - agent.behavior.set(BehaviorState::TRADING); - } else { - controller.push_invite_response(InviteResponse::Decline); - agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.merchant_busy", - agent, - event_emitter, - ); - } - } else { - // TODO: Provide a hint where to find the closest merchant? - controller.push_invite_response(InviteResponse::Decline); - agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.villager_decline_trade", - agent, - event_emitter, - ); - } - } - true -} - -fn handle_inbox_trade_accepted(bdata: &mut BehaviorData) -> bool { - let BehaviorData { - agent, read_data, .. - } = bdata; - - if !matches!(agent.inbox.front(), Some(AgentEvent::TradeAccepted(_))) { - return false; - } - - if let Some(AgentEvent::TradeAccepted(with)) = agent.inbox.pop_front() { - if !agent.behavior.is(BehaviorState::TRADING) { - if let Some(target) = get_entity_by_id(with.id(), read_data) { - agent.target = Some(Target::new(target, false, read_data.time.0, false)); - } - agent.behavior.set(BehaviorState::TRADING); - agent.behavior.set(BehaviorState::TRADING_ISSUER); - } - } - true -} - -fn handle_inbox_finished_trade(bdata: &mut BehaviorData) -> bool { - let BehaviorData { - agent, - agent_data, - event_emitter, - .. - } = bdata; - - if !matches!(agent.inbox.front(), Some(AgentEvent::FinishedTrade(_))) { - return false; - } - - if let Some(AgentEvent::FinishedTrade(result)) = agent.inbox.pop_front() { - if agent.behavior.is(BehaviorState::TRADING) { - match result { - TradeResult::Completed => { - agent_data.chat_npc("npc.speech.merchant_trade_successful", event_emitter); - }, - _ => { - agent_data.chat_npc("npc.speech.merchant_trade_declined", event_emitter); - }, - } - agent.behavior.unset(BehaviorState::TRADING); - } - } - true -} - -fn handle_inbox_update_pending_trade(bdata: &mut BehaviorData) -> bool { - let BehaviorData { - agent, - agent_data, - read_data, - event_emitter, - .. - } = bdata; - - if !matches!(agent.inbox.front(), Some(AgentEvent::UpdatePendingTrade(_))) { - return false; - } - - if let Some(AgentEvent::UpdatePendingTrade(boxval)) = agent.inbox.pop_front() { - let (tradeid, pending, prices, inventories) = *boxval; - if agent.behavior.is(BehaviorState::TRADING) { - let who: usize = if agent.behavior.is(BehaviorState::TRADING_ISSUER) { - 0 - } else { - 1 - }; - let balance0: f32 = prices.balance(&pending.offers, &inventories, 1 - who, true); - let balance1: f32 = prices.balance(&pending.offers, &inventories, who, false); - if balance0 >= balance1 { - // If the trade is favourable to us, only send an accept message if we're - // not already accepting (since otherwise, spam-clicking the accept button - // results in lagging and moving to the review phase of an unfavorable trade - // (although since the phase is included in the message, this shouldn't - // result in fully accepting an unfavourable trade)) - if !pending.accept_flags[who] && !pending.is_empty_trade() { - event_emitter.emit(ServerEvent::ProcessTradeAction( - *agent_data.entity, - tradeid, - TradeAction::Accept(pending.phase), - )); - tracing::trace!(?tradeid, ?balance0, ?balance1, "Accept Pending Trade"); - } - } else { - if balance1 > 0.0 { - let msg = format!( - "That only covers {:.0}% of my costs!", - (balance0 / balance1 * 100.0).floor() - ); - if let Some(tgt_data) = &agent.target { - // If talking with someone in particular, "tell" it only to them - if let Some(with) = read_data.uids.get(tgt_data.target) { - event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_tell( - *agent_data.uid, - *with, - msg, - ))); - } else { - event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( - *agent_data.uid, - msg, - ))); - } - } else { - event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( - *agent_data.uid, - msg, - ))); - } - } - if pending.phase != TradePhase::Mutate { - // we got into the review phase but without balanced goods, decline - agent.behavior.unset(BehaviorState::TRADING); - event_emitter.emit(ServerEvent::ProcessTradeAction( - *agent_data.entity, - tradeid, - TradeAction::Decline, - )); - } - } - } - } - true -} diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs new file mode 100644 index 0000000000..9b05d92c1c --- /dev/null +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -0,0 +1,611 @@ +use common::{ + comp::{ + agent::{AgentEvent, Target, TimerAction}, + compass::{Direction, Distance}, + dialogue::{MoodContext, MoodState, Subject}, + invite::{InviteKind, InviteResponse}, + BehaviorState, ControlAction, UnresolvedChatMsg, UtteranceKind, + }, + event::ServerEvent, + rtsim::{Memory, MemoryItem, RtSimEvent}, + trade::{TradeAction, TradePhase, TradeResult}, +}; +use rand::{thread_rng, Rng}; +use specs::saveload::Marker; + +use crate::{rtsim::entity::PersonalityTrait, sys::agent::util::get_entity_by_id}; + +use super::{BehaviorData, BehaviorTree}; + +/// Interact if incoming messages +pub fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { + if !bdata.agent.inbox.is_empty() { + if matches!( + bdata.agent.inbox.front(), + Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt) + ) { + let sound = bdata.agent.inbox.pop_front(); + match sound { + Some(AgentEvent::ServerSound(sound)) => { + bdata.agent.sounds_heard.push(sound); + }, + Some(AgentEvent::Hurt) => { + // Hurt utterances at random upon receiving damage + if bdata.rng.gen::() < 0.4 { + bdata.controller.push_utterance(UtteranceKind::Hurt); + } + }, + //Note: this should be unreachable + Some(_) | None => {}, + } + } else { + bdata.agent.action_state.timer = 0.1; + } + } + false +} + +/// If we receive a new interaction, start the interaction timer +pub fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { + if BehaviorTree::interaction(bdata.agent.behavior).run_with_behavior_data(bdata) { + bdata + .agent + .timer + .start(bdata.read_data.time.0, TimerAction::Interact); + } + false +} + +pub fn increment_timer_deltatime(bdata: &mut BehaviorData) -> bool { + bdata.agent.action_state.timer += bdata.read_data.dt.0; + false +} + +/// Handles Talk event if the front of the agent's inbox contains one +pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + controller, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::Talk(_, _))) { + return false; + } + + if let Some(AgentEvent::Talk(by, subject)) = agent.inbox.pop_front() { + if agent.allowed_to_speak() { + if let Some(target) = get_entity_by_id(by.id(), read_data) { + agent.target = Some(Target::new(target, false, read_data.time.0, false)); + + if agent_data.look_toward(controller, read_data, target) { + controller.push_action(ControlAction::Stand); + controller.push_action(ControlAction::Talk); + controller.push_utterance(UtteranceKind::Greeting); + + match subject { + Subject::Regular => { + if let (Some((_travel_to, destination_name)), Some(rtsim_entity)) = + (&agent.rtsim_controller.travel_to, &agent_data.rtsim_entity) + { + let personality = &rtsim_entity.brain.personality; + let standard_response_msg = || -> String { + if personality + .personality_traits + .contains(PersonalityTrait::Extroverted) + { + format!( + "I'm heading to {}! Want to come along?", + destination_name + ) + } else if personality + .personality_traits + .contains(PersonalityTrait::Disagreeable) + { + "Hrm.".to_string() + } else { + "Hello!".to_string() + } + }; + let msg = if let Some(tgt_stats) = read_data.stats.get(target) { + agent.rtsim_controller.events.push(RtSimEvent::AddMemory( + Memory { + item: MemoryItem::CharacterInteraction { + name: tgt_stats.name.clone(), + }, + time_to_forget: read_data.time.0 + 600.0, + }, + )); + if rtsim_entity.brain.remembers_character(&tgt_stats.name) { + if personality + .personality_traits + .contains(PersonalityTrait::Extroverted) + { + format!( + "Greetings fair {}! It has been far too long \ + since last I saw you. I'm going to {} right now.", + &tgt_stats.name, destination_name + ) + } else if personality + .personality_traits + .contains(PersonalityTrait::Disagreeable) + { + "Oh. It's you again.".to_string() + } else { + format!( + "Hi again {}! Unfortunately I'm in a hurry right \ + now. See you!", + &tgt_stats.name + ) + } + } else { + standard_response_msg() + } + } else { + standard_response_msg() + }; + agent_data.chat_npc(msg, event_emitter); + } else if agent.behavior.can_trade() { + if !agent.behavior.is(BehaviorState::TRADING) { + controller.push_initiate_invite(by, InviteKind::Trade); + agent_data.chat_npc( + "npc.speech.merchant_advertisement", + event_emitter, + ); + } else { + let default_msg = "npc.speech.merchant_busy"; + let msg = agent_data.rtsim_entity.map_or(default_msg, |e| { + if e.brain + .personality + .personality_traits + .contains(PersonalityTrait::Disagreeable) + { + "npc.speech.merchant_busy_rude" + } else { + default_msg + } + }); + agent_data.chat_npc(msg, event_emitter); + } + } else { + let mut rng = thread_rng(); + if let Some(extreme_trait) = agent_data + .rtsim_entity + .and_then(|e| e.brain.personality.random_chat_trait(&mut rng)) + { + let msg = match extreme_trait { + PersonalityTrait::Open => "npc.speech.villager_open", + PersonalityTrait::Adventurous => { + "npc.speech.villager_adventurous" + }, + PersonalityTrait::Closed => "npc.speech.villager_closed", + PersonalityTrait::Conscientious => { + "npc.speech.villager_conscientious" + }, + PersonalityTrait::Busybody => { + "npc.speech.villager_busybody" + }, + PersonalityTrait::Unconscientious => { + "npc.speech.villager_unconscientious" + }, + PersonalityTrait::Extroverted => { + "npc.speech.villager_extroverted" + }, + PersonalityTrait::Introverted => { + "npc.speech.villager_introverted" + }, + PersonalityTrait::Agreeable => { + "npc.speech.villager_agreeable" + }, + PersonalityTrait::Sociable => { + "npc.speech.villager_sociable" + }, + PersonalityTrait::Disagreeable => { + "npc.speech.villager_disagreeable" + }, + PersonalityTrait::Neurotic => { + "npc.speech.villager_neurotic" + }, + PersonalityTrait::Seeker => "npc.speech.villager_seeker", + PersonalityTrait::SadLoner => { + "npc.speech.villager_sad_loner" + }, + PersonalityTrait::Worried => "npc.speech.villager_worried", + PersonalityTrait::Stable => "npc.speech.villager_stable", + }; + agent_data.chat_npc(msg, event_emitter); + } else { + agent_data.chat_npc("npc.speech.villager", event_emitter); + } + } + }, + Subject::Trade => { + if agent.behavior.can_trade() { + if !agent.behavior.is(BehaviorState::TRADING) { + controller.push_initiate_invite(by, InviteKind::Trade); + agent_data.chat_npc( + "npc.speech.merchant_advertisement", + event_emitter, + ); + } else { + agent_data.chat_npc("npc.speech.merchant_busy", event_emitter); + } + } else { + // TODO: maybe make some travellers willing to trade with + // simpler goods like potions + agent_data + .chat_npc("npc.speech.villager_decline_trade", event_emitter); + } + }, + Subject::Mood => { + if let Some(rtsim_entity) = agent_data.rtsim_entity { + if !rtsim_entity.brain.remembers_mood() { + // TODO: the following code will need a rework to + // implement more mood contexts + // This require that town NPCs becomes rtsim_entities to + // work fully. + match rand::random::() % 3 { + 0 => agent.rtsim_controller.events.push( + RtSimEvent::SetMood(Memory { + item: MemoryItem::Mood { + state: MoodState::Good( + MoodContext::GoodWeather, + ), + }, + time_to_forget: read_data.time.0 + 21200.0, + }), + ), + 1 => agent.rtsim_controller.events.push( + RtSimEvent::SetMood(Memory { + item: MemoryItem::Mood { + state: MoodState::Neutral( + MoodContext::EverydayLife, + ), + }, + time_to_forget: read_data.time.0 + 21200.0, + }), + ), + 2 => agent.rtsim_controller.events.push( + RtSimEvent::SetMood(Memory { + item: MemoryItem::Mood { + state: MoodState::Bad(MoodContext::GoodWeather), + }, + time_to_forget: read_data.time.0 + 86400.0, + }), + ), + _ => {}, // will never happen + } + } + if let Some(memory) = rtsim_entity.brain.get_mood() { + let msg = match &memory.item { + MemoryItem::Mood { state } => state.describe(), + _ => "".to_string(), + }; + agent_data.chat_npc(msg, event_emitter); + } + } + }, + Subject::Location(location) => { + if let Some(tgt_pos) = read_data.positions.get(target) { + let raw_dir = location.origin.as_::() - tgt_pos.0.xy(); + let dist = Distance::from_dir(raw_dir).name(); + let dir = Direction::from_dir(raw_dir).name(); + + let msg = format!( + "{} ? I think it's {} {} from here!", + location.name, dist, dir + ); + agent_data.chat_npc(msg, event_emitter); + } + }, + Subject::Person(person) => { + if let Some(src_pos) = read_data.positions.get(target) { + let msg = if let Some(person_pos) = person.origin { + let distance = + Distance::from_dir(person_pos.xy() - src_pos.0.xy()); + match distance { + Distance::NextTo | Distance::Near => { + format!( + "{} ? I think he's {} {} from here!", + person.name(), + distance.name(), + Direction::from_dir( + person_pos.xy() - src_pos.0.xy(), + ) + .name() + ) + }, + _ => { + format!( + "{} ? I think he's gone visiting another town. \ + Come back later!", + person.name() + ) + }, + } + } else { + format!( + "{} ? Sorry, I don't know where you can find him.", + person.name() + ) + }; + agent_data.chat_npc(msg, event_emitter); + } + }, + Subject::Work => {}, + } + } + } + } + } + true +} + +pub fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + controller, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::TradeInvite(_))) { + return false; + } + + if let Some(AgentEvent::TradeInvite(with)) = agent.inbox.pop_front() { + if agent.behavior.can_trade() { + if !agent.behavior.is(BehaviorState::TRADING) { + // stand still and looking towards the trading player + controller.push_action(ControlAction::Stand); + controller.push_action(ControlAction::Talk); + if let Some(target) = get_entity_by_id(with.id(), read_data) { + agent.target = Some(Target::new(target, false, read_data.time.0, false)); + } + controller.push_invite_response(InviteResponse::Accept); + agent.behavior.unset(BehaviorState::TRADING_ISSUER); + agent.behavior.set(BehaviorState::TRADING); + } else { + controller.push_invite_response(InviteResponse::Decline); + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.merchant_busy", + agent, + event_emitter, + ); + } + } else { + // TODO: Provide a hint where to find the closest merchant? + controller.push_invite_response(InviteResponse::Decline); + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.villager_decline_trade", + agent, + event_emitter, + ); + } + } + true +} + +pub fn handle_inbox_trade_accepted(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, read_data, .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::TradeAccepted(_))) { + return false; + } + + if let Some(AgentEvent::TradeAccepted(with)) = agent.inbox.pop_front() { + if !agent.behavior.is(BehaviorState::TRADING) { + if let Some(target) = get_entity_by_id(with.id(), read_data) { + agent.target = Some(Target::new(target, false, read_data.time.0, false)); + } + agent.behavior.set(BehaviorState::TRADING); + agent.behavior.set(BehaviorState::TRADING_ISSUER); + } + } + true +} + +pub fn handle_inbox_finished_trade(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + event_emitter, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::FinishedTrade(_))) { + return false; + } + + if let Some(AgentEvent::FinishedTrade(result)) = agent.inbox.pop_front() { + if agent.behavior.is(BehaviorState::TRADING) { + match result { + TradeResult::Completed => { + agent_data.chat_npc("npc.speech.merchant_trade_successful", event_emitter); + }, + _ => { + agent_data.chat_npc("npc.speech.merchant_trade_declined", event_emitter); + }, + } + agent.behavior.unset(BehaviorState::TRADING); + } + } + true +} + +pub fn handle_inbox_update_pending_trade(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + read_data, + event_emitter, + .. + } = bdata; + + if !matches!(agent.inbox.front(), Some(AgentEvent::UpdatePendingTrade(_))) { + return false; + } + + if let Some(AgentEvent::UpdatePendingTrade(boxval)) = agent.inbox.pop_front() { + let (tradeid, pending, prices, inventories) = *boxval; + if agent.behavior.is(BehaviorState::TRADING) { + let who: usize = if agent.behavior.is(BehaviorState::TRADING_ISSUER) { + 0 + } else { + 1 + }; + let balance0: f32 = prices.balance(&pending.offers, &inventories, 1 - who, true); + let balance1: f32 = prices.balance(&pending.offers, &inventories, who, false); + if balance0 >= balance1 { + // If the trade is favourable to us, only send an accept message if we're + // not already accepting (since otherwise, spam-clicking the accept button + // results in lagging and moving to the review phase of an unfavorable trade + // (although since the phase is included in the message, this shouldn't + // result in fully accepting an unfavourable trade)) + if !pending.accept_flags[who] && !pending.is_empty_trade() { + event_emitter.emit(ServerEvent::ProcessTradeAction( + *agent_data.entity, + tradeid, + TradeAction::Accept(pending.phase), + )); + tracing::trace!(?tradeid, ?balance0, ?balance1, "Accept Pending Trade"); + } + } else { + if balance1 > 0.0 { + let msg = format!( + "That only covers {:.0}% of my costs!", + (balance0 / balance1 * 100.0).floor() + ); + if let Some(tgt_data) = &agent.target { + // If talking with someone in particular, "tell" it only to them + if let Some(with) = read_data.uids.get(tgt_data.target) { + event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_tell( + *agent_data.uid, + *with, + msg, + ))); + } else { + event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( + *agent_data.uid, + msg, + ))); + } + } else { + event_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg::npc_say( + *agent_data.uid, + msg, + ))); + } + } + if pending.phase != TradePhase::Mutate { + // we got into the review phase but without balanced goods, decline + agent.behavior.unset(BehaviorState::TRADING); + event_emitter.emit(ServerEvent::ProcessTradeAction( + *agent_data.entity, + tradeid, + TradeAction::Decline, + )); + } + } + } + } + true +} + +pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { + let BehaviorData { + agent, + agent_data, + event_emitter, + controller, + .. + } = bdata; + + if let Some(msg) = agent.inbox.front() { + let used = match msg { + AgentEvent::Talk(by, _) | AgentEvent::TradeAccepted(by) => { + if let (Some(target), Some(speaker)) = + (agent.target, get_entity_by_id(by.id(), bdata.read_data)) + { + // in combat, speak to players that aren't the current target + if !target.hostile || target.target != speaker { + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.villager_busy", + agent, + event_emitter, + ); + } + } + + true + }, + AgentEvent::TradeInvite(by) => { + controller.push_invite_response(InviteResponse::Decline); + if let (Some(target), Some(speaker)) = + (agent.target, get_entity_by_id(by.id(), bdata.read_data)) + { + // in combat, speak to players that aren't the current target + if !target.hostile || target.target != speaker { + if agent.behavior.can_trade() { + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.merchant_busy", + agent, + event_emitter, + ); + } else { + agent_data.chat_npc_if_allowed_to_speak( + "npc.speech.villager_busy", + agent, + event_emitter, + ); + } + } + } + true + }, + AgentEvent::FinishedTrade(result) => { + // copy pasted from recv_interaction + // because the trade is not cancellable in this state + if agent.behavior.is(BehaviorState::TRADING) { + match result { + TradeResult::Completed => { + agent_data + .chat_npc("npc.speech.merchant_trade_successful", event_emitter); + }, + _ => { + agent_data + .chat_npc("npc.speech.merchant_trade_declined", event_emitter); + }, + } + agent.behavior.unset(BehaviorState::TRADING); + } + true + }, + AgentEvent::UpdatePendingTrade(boxval) => { + // immediately cancel the trade + let (tradeid, _pending, _prices, _inventories) = &**boxval; + agent.behavior.unset(BehaviorState::TRADING); + event_emitter.emit(ServerEvent::ProcessTradeAction( + *agent_data.entity, + *tradeid, + TradeAction::Decline, + )); + agent_data.chat_npc("npc.speech.merchant_trade_cancelled_hostile", event_emitter); + true + }, + AgentEvent::ServerSound(_) | AgentEvent::Hurt => false, + }; + if used { + agent.inbox.pop_front(); + } + return used; + } + false +} From 3203051fc3061148b9ec460ea49fadc3d284d90e Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Sat, 6 Aug 2022 14:03:09 +0200 Subject: [PATCH 032/854] Move interaction-cancelling code in interaction behavior + includes missing fix from !3467 --- server/src/sys/agent/behavior_tree.rs | 32 +++++++++---------- .../sys/agent/behavior_tree/interaction.rs | 3 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index 16d042dda4..421009924d 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -3,8 +3,8 @@ use common::{ agent::{ AgentEvent, Target, TimerAction, DEFAULT_INTERACTION_TIME, TRADE_INTERACTION_TIME, }, - Agent, Alignment, Behavior, BehaviorCapability, BehaviorState, Body, BuffKind, - ControlAction, ControlEvent, Controller, InputKind, InventoryEvent, UtteranceKind, + Agent, Alignment, BehaviorCapability, BehaviorState, Body, BuffKind, ControlAction, + ControlEvent, Controller, InputKind, InventoryEvent, UtteranceKind, }, event::{Emitter, ServerEvent}, path::TraversalConfig, @@ -59,8 +59,9 @@ impl BehaviorTree { react_on_dangerous_fall, react_if_on_fire, target_if_attacked, - do_target_tree_if_target_else_do_idle_tree, + process_inbox_sound_and_hurt, process_inbox_interaction, + do_target_tree_if_target_else_do_idle_tree, ], } } @@ -84,8 +85,13 @@ impl BehaviorTree { } } - pub fn interaction(behavior: Behavior) -> Self { - if behavior.can(BehaviorCapability::SPEAK) { + pub fn interaction(agent: &Agent) -> Self { + let is_in_combat = if let Some(Target { hostile, .. }) = agent.target { + hostile + } else { + false + }; + if !is_in_combat && agent.behavior.can(BehaviorCapability::SPEAK) { Self { tree: vec![ increment_timer_deltatime, @@ -105,22 +111,13 @@ impl BehaviorTree { pub fn hostile() -> Self { Self { - tree: vec![ - handle_inbox_cancel_interactions, - heal_self_if_hurt, - hurt_utterance, - do_combat, - ], + tree: vec![heal_self_if_hurt, hurt_utterance, do_combat], } } pub fn idle() -> Self { Self { - tree: vec![ - set_owner_if_no_target, - process_inbox_sound_and_hurt, - handle_timer, - ], + tree: vec![set_owner_if_no_target, handle_timer], } } @@ -486,11 +483,12 @@ fn heal_self_if_hurt(bdata: &mut BehaviorData) -> bool { } fn hurt_utterance(bdata: &mut BehaviorData) -> bool { - if let Some(AgentEvent::Hurt) = bdata.agent.inbox.pop_front() { + if matches!(bdata.agent.inbox.front(), Some(AgentEvent::Hurt)) { // Hurt utterances at random upon receiving damage if bdata.rng.gen::() < 0.4 { bdata.controller.push_utterance(UtteranceKind::Hurt); } + bdata.agent.inbox.pop_front(); } false } diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index 9b05d92c1c..44271f4f13 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -47,7 +47,7 @@ pub fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { /// If we receive a new interaction, start the interaction timer pub fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { - if BehaviorTree::interaction(bdata.agent.behavior).run_with_behavior_data(bdata) { + if BehaviorTree::interaction(bdata.agent).run_with_behavior_data(bdata) { bdata .agent .timer @@ -605,7 +605,6 @@ pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { if used { agent.inbox.pop_front(); } - return used; } false } From 62568d2229fd0ed46460f7fc59ff2a62885e8526 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Sat, 6 Aug 2022 14:30:32 +0200 Subject: [PATCH 033/854] Add documentation --- server/src/sys/agent/behavior_tree.rs | 46 +++++++++++++++---- .../sys/agent/behavior_tree/interaction.rs | 12 +++++ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index 421009924d..e5879c0fe2 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -53,6 +53,9 @@ pub struct BehaviorTree { } impl BehaviorTree { + /// Base BehaviorTree + /// + /// React to immediate dangers (fire, fall & attacks) then call subtrees pub fn root() -> Self { Self { tree: vec![ @@ -66,6 +69,10 @@ impl BehaviorTree { } } + /// Target BehaviorTree + /// + /// React to the agent's target. + /// Either redirect to hostile or pet tree pub fn target() -> Self { Self { tree: vec![ @@ -79,12 +86,20 @@ impl BehaviorTree { } } + /// Pet BehaviorTree + /// + /// Follow the owner and attack ennemies pub fn pet() -> Self { Self { tree: vec![follow_if_far_away, attack_if_owner_hurt, do_idle_tree], } } + /// Interaction BehaviorTree + /// + /// Either process the inbox for talk and trade events if the agent can + /// talk. If not, or if we are in combat, deny all talk and trade + /// events. pub fn interaction(agent: &Agent) -> Self { let is_in_combat = if let Some(Target { hostile, .. }) = agent.target { hostile @@ -109,15 +124,19 @@ impl BehaviorTree { } } + /// Hostile BehaviorTree + /// + /// Attack the target, and heal self if applicable pub fn hostile() -> Self { Self { tree: vec![heal_self_if_hurt, hurt_utterance, do_combat], } } + /// Idle BehaviorTree pub fn idle() -> Self { Self { - tree: vec![set_owner_if_no_target, handle_timer], + tree: vec![set_owner_if_no_target, handle_timed_events], } } @@ -263,7 +282,8 @@ fn target_if_attacked(bdata: &mut BehaviorData) -> bool { } /// If the agent has a target, do the target tree, else do the idle tree -/// This function won't stop the behavior tree +/// +/// This function will never stop the BehaviorTree fn do_target_tree_if_target_else_do_idle_tree(bdata: &mut BehaviorData) -> bool { if bdata.agent.target.is_some() { BehaviorTree::target().run_with_behavior_data(bdata); @@ -273,9 +293,11 @@ fn do_target_tree_if_target_else_do_idle_tree(bdata: &mut BehaviorData) -> bool false } +/// Run the Idle BehaviorTree +/// +/// This function can stop the BehaviorTree fn do_idle_tree(bdata: &mut BehaviorData) -> bool { - BehaviorTree::idle().run_with_behavior_data(bdata); - true + BehaviorTree::idle().run_with_behavior_data(bdata) } /// If target is dead, forget them @@ -299,7 +321,7 @@ fn untarget_if_dead(bdata: &mut BehaviorData) -> bool { false } -/// If target is hostile, hostile tree +/// If target is hostile, do the hostile tree and stop the current BehaviorTree fn do_hostile_tree_if_hostile(bdata: &mut BehaviorData) -> bool { if let Some(Target { hostile, .. }) = bdata.agent.target { if hostile { @@ -310,7 +332,7 @@ fn do_hostile_tree_if_hostile(bdata: &mut BehaviorData) -> bool { false } -/// if owned, act as pet to them +/// if owned, do the pet tree and stop the current BehaviorTree fn do_pet_tree_if_owned(bdata: &mut BehaviorData) -> bool { if let (Some(Target { target, .. }), Some(Alignment::Owned(uid))) = (bdata.agent.target, bdata.agent_data.alignment) @@ -326,6 +348,7 @@ fn do_pet_tree_if_owned(bdata: &mut BehaviorData) -> bool { false } +/// If the target is an ItemDrop, go pick it up fn do_pickup_loot(bdata: &mut BehaviorData) -> bool { if let Some(Target { target, .. }) = bdata.agent.target { if matches!(bdata.read_data.bodies.get(target), Some(Body::ItemDrop(_))) { @@ -360,12 +383,15 @@ fn do_pickup_loot(bdata: &mut BehaviorData) -> bool { false } +/// Reset the agent's target +/// +/// This function will never stop the BehaviorTree fn untarget(bdata: &mut BehaviorData) -> bool { bdata.agent.target = None; false } -// If too far away, then follow +// If too far away, then follow the target fn follow_if_far_away(bdata: &mut BehaviorData) -> bool { if let Some(Target { target, .. }) = bdata.agent.target { if let Some(tgt_pos) = bdata.read_data.positions.get(target) { @@ -426,7 +452,8 @@ fn set_owner_if_no_target(bdata: &mut BehaviorData) -> bool { false } -fn handle_timer(bdata: &mut BehaviorData) -> bool { +/// Handle timed events, like looking at the player we are talking to +fn handle_timed_events(bdata: &mut BehaviorData) -> bool { let timeout = if bdata.agent.behavior.is(BehaviorState::TRADING) { TRADE_INTERACTION_TIME } else { @@ -470,6 +497,7 @@ fn handle_timer(bdata: &mut BehaviorData) -> bool { false } +/// Try to heal self if our damage went below a certain threshold fn heal_self_if_hurt(bdata: &mut BehaviorData) -> bool { if bdata.agent_data.damage < HEALING_ITEM_THRESHOLD && bdata @@ -482,9 +510,9 @@ fn heal_self_if_hurt(bdata: &mut BehaviorData) -> bool { false } +/// Hurt utterances at random upon receiving damage fn hurt_utterance(bdata: &mut BehaviorData) -> bool { if matches!(bdata.agent.inbox.front(), Some(AgentEvent::Hurt)) { - // Hurt utterances at random upon receiving damage if bdata.rng.gen::() < 0.4 { bdata.controller.push_utterance(UtteranceKind::Hurt); } diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index 44271f4f13..f04d237d99 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -56,6 +56,7 @@ pub fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { false } +/// Increment agent's action_state timer pub fn increment_timer_deltatime(bdata: &mut BehaviorData) -> bool { bdata.agent.action_state.timer += bdata.read_data.dt.0; false @@ -344,6 +345,7 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { true } +/// Handles TradeInvite event if the front of the agent's inbox contains one pub fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { let BehaviorData { agent, @@ -391,6 +393,7 @@ pub fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { true } +/// Handles TradeAccepted event if the front of the agent's inbox contains one pub fn handle_inbox_trade_accepted(bdata: &mut BehaviorData) -> bool { let BehaviorData { agent, read_data, .. @@ -412,6 +415,7 @@ pub fn handle_inbox_trade_accepted(bdata: &mut BehaviorData) -> bool { true } +/// Handles TradeFinished event if the front of the agent's inbox contains one pub fn handle_inbox_finished_trade(bdata: &mut BehaviorData) -> bool { let BehaviorData { agent, @@ -440,6 +444,8 @@ pub fn handle_inbox_finished_trade(bdata: &mut BehaviorData) -> bool { true } +/// Handles UpdatePendingTrade event if the front of the agent's inbox contains +/// one pub fn handle_inbox_update_pending_trade(bdata: &mut BehaviorData) -> bool { let BehaviorData { agent, @@ -519,6 +525,12 @@ pub fn handle_inbox_update_pending_trade(bdata: &mut BehaviorData) -> bool { true } +/// Deny any received interaction: +/// - `AgentEvent::Talk` and `AgentEvent::TradeAccepted` are cut short by an +/// "I'm busy" message +/// - `AgentEvent::TradeInvite` are denied +/// - `AgentEvent::FinishedTrade` are still handled +/// - `AgentEvent::UpdatePendingTrade` will immediately close the trade pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { let BehaviorData { agent, From b82da6acdb77c6bd5225d2ad1377ec4e515ce04a Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Sun, 7 Aug 2022 21:11:58 +0200 Subject: [PATCH 034/854] Reimplement !3508 --- .../sys/agent/behavior_tree/interaction.rs | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index f04d237d99..7f64015100 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -153,18 +153,18 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { if !agent.behavior.is(BehaviorState::TRADING) { controller.push_initiate_invite(by, InviteKind::Trade); agent_data.chat_npc( - "npc.speech.merchant_advertisement", + "npc-speech-merchant_advertisement", event_emitter, ); } else { - let default_msg = "npc.speech.merchant_busy"; + let default_msg = "npc-speech-merchant_busy"; let msg = agent_data.rtsim_entity.map_or(default_msg, |e| { if e.brain .personality .personality_traits .contains(PersonalityTrait::Disagreeable) { - "npc.speech.merchant_busy_rude" + "npc-speech-merchant_busy_rude" } else { default_msg } @@ -178,48 +178,48 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { .and_then(|e| e.brain.personality.random_chat_trait(&mut rng)) { let msg = match extreme_trait { - PersonalityTrait::Open => "npc.speech.villager_open", + PersonalityTrait::Open => "npc-speech-villager_open", PersonalityTrait::Adventurous => { - "npc.speech.villager_adventurous" + "npc-speech-villager_adventurous" }, PersonalityTrait::Closed => "npc.speech.villager_closed", PersonalityTrait::Conscientious => { - "npc.speech.villager_conscientious" + "npc-speech-villager_conscientious" }, PersonalityTrait::Busybody => { - "npc.speech.villager_busybody" + "npc-speech-villager_busybody" }, PersonalityTrait::Unconscientious => { - "npc.speech.villager_unconscientious" + "npc-speech-villager_unconscientious" }, PersonalityTrait::Extroverted => { - "npc.speech.villager_extroverted" + "npc-speech-villager_extroverted" }, PersonalityTrait::Introverted => { - "npc.speech.villager_introverted" + "npc-speech-villager_introverted" }, PersonalityTrait::Agreeable => { - "npc.speech.villager_agreeable" + "npc-speech-villager_agreeable" }, PersonalityTrait::Sociable => { - "npc.speech.villager_sociable" + "npc-speech-villager_sociable" }, PersonalityTrait::Disagreeable => { - "npc.speech.villager_disagreeable" + "npc-speech-villager_disagreeable" }, PersonalityTrait::Neurotic => { - "npc.speech.villager_neurotic" + "npc-speech-villager_neurotic" }, - PersonalityTrait::Seeker => "npc.speech.villager_seeker", + PersonalityTrait::Seeker => "npc-speech-villager_seeker", PersonalityTrait::SadLoner => { - "npc.speech.villager_sad_loner" + "npc-speech-villager_sad_loner" }, - PersonalityTrait::Worried => "npc.speech.villager_worried", - PersonalityTrait::Stable => "npc.speech.villager_stable", + PersonalityTrait::Worried => "npc-speech-villager_worried", + PersonalityTrait::Stable => "npc-speech-villager_stable", }; agent_data.chat_npc(msg, event_emitter); } else { - agent_data.chat_npc("npc.speech.villager", event_emitter); + agent_data.chat_npc("npc-speech-villager", event_emitter); } } }, @@ -228,17 +228,17 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { if !agent.behavior.is(BehaviorState::TRADING) { controller.push_initiate_invite(by, InviteKind::Trade); agent_data.chat_npc( - "npc.speech.merchant_advertisement", + "npc-speech-merchant_advertisement", event_emitter, ); } else { - agent_data.chat_npc("npc.speech.merchant_busy", event_emitter); + agent_data.chat_npc("npc-speech-merchant_busy", event_emitter); } } else { // TODO: maybe make some travellers willing to trade with // simpler goods like potions agent_data - .chat_npc("npc.speech.villager_decline_trade", event_emitter); + .chat_npc("npc-speech-villager_decline_trade", event_emitter); } }, Subject::Mood => { @@ -375,7 +375,7 @@ pub fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { } else { controller.push_invite_response(InviteResponse::Decline); agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.merchant_busy", + "npc-speech-merchant_busy", agent, event_emitter, ); @@ -384,7 +384,7 @@ pub fn handle_inbox_trade_invite(bdata: &mut BehaviorData) -> bool { // TODO: Provide a hint where to find the closest merchant? controller.push_invite_response(InviteResponse::Decline); agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.villager_decline_trade", + "npc-speech-villager_decline_trade", agent, event_emitter, ); @@ -432,10 +432,10 @@ pub fn handle_inbox_finished_trade(bdata: &mut BehaviorData) -> bool { if agent.behavior.is(BehaviorState::TRADING) { match result { TradeResult::Completed => { - agent_data.chat_npc("npc.speech.merchant_trade_successful", event_emitter); + agent_data.chat_npc("npc-speech-merchant_trade_successful", event_emitter); }, _ => { - agent_data.chat_npc("npc.speech.merchant_trade_declined", event_emitter); + agent_data.chat_npc("npc-speech-merchant_trade_declined", event_emitter); }, } agent.behavior.unset(BehaviorState::TRADING); @@ -549,7 +549,7 @@ pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { // in combat, speak to players that aren't the current target if !target.hostile || target.target != speaker { agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.villager_busy", + "npc-speech-villager_busy", agent, event_emitter, ); @@ -567,13 +567,13 @@ pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { if !target.hostile || target.target != speaker { if agent.behavior.can_trade() { agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.merchant_busy", + "npc-speech-merchant_busy", agent, event_emitter, ); } else { agent_data.chat_npc_if_allowed_to_speak( - "npc.speech.villager_busy", + "npc-speech-villager_busy", agent, event_emitter, ); @@ -589,11 +589,11 @@ pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { match result { TradeResult::Completed => { agent_data - .chat_npc("npc.speech.merchant_trade_successful", event_emitter); + .chat_npc("npc-speech-merchant_trade_successful", event_emitter); }, _ => { agent_data - .chat_npc("npc.speech.merchant_trade_declined", event_emitter); + .chat_npc("npc-speech-merchant_trade_declined", event_emitter); }, } agent.behavior.unset(BehaviorState::TRADING); @@ -609,7 +609,7 @@ pub fn handle_inbox_cancel_interactions(bdata: &mut BehaviorData) -> bool { *tradeid, TradeAction::Decline, )); - agent_data.chat_npc("npc.speech.merchant_trade_cancelled_hostile", event_emitter); + agent_data.chat_npc("npc-speech-merchant_trade_cancelled_hostile", event_emitter); true }, AgentEvent::ServerSound(_) | AgentEvent::Hurt => false, From c1dcb6e4122fc30328785a85e27e4144efd0c716 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Sun, 7 Aug 2022 21:16:31 +0200 Subject: [PATCH 035/854] Fix missing translation key in interaction --- server/src/sys/agent/behavior_tree/interaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index 7f64015100..042a7f4ece 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -182,7 +182,7 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { PersonalityTrait::Adventurous => { "npc-speech-villager_adventurous" }, - PersonalityTrait::Closed => "npc.speech.villager_closed", + PersonalityTrait::Closed => "npc-speech-villager_closed", PersonalityTrait::Conscientious => { "npc-speech-villager_conscientious" }, From d5b59c2bb7bdf9948458773c7f96b64a11e02fcd Mon Sep 17 00:00:00 2001 From: Imbris Date: Mon, 8 Aug 2022 00:38:20 -0400 Subject: [PATCH 036/854] Convert away from IdvStorage to mixture of VecStorage and DenseVecStorage --- Cargo.lock | 12 ------------ common/Cargo.toml | 1 - common/net/Cargo.toml | 1 - common/net/src/sync/interpolation.rs | 3 +-- common/src/comp/ability.rs | 3 +-- common/src/comp/admin.rs | 3 +-- common/src/comp/agent.rs | 5 ++--- common/src/comp/anchor.rs | 3 +-- common/src/comp/aura.rs | 5 ++--- common/src/comp/beam.rs | 5 ++--- common/src/comp/body.rs | 3 +-- common/src/comp/buff.rs | 6 ++---- common/src/comp/character_state.rs | 3 +-- common/src/comp/chat.rs | 7 +++---- common/src/comp/combo.rs | 5 ++--- common/src/comp/controller.rs | 3 +-- common/src/comp/energy.rs | 3 +-- common/src/comp/group.rs | 3 +-- common/src/comp/health.rs | 4 +--- common/src/comp/inputs.rs | 5 ++--- common/src/comp/inventory/item/mod.rs | 7 +++---- common/src/comp/inventory/mod.rs | 7 ++++--- common/src/comp/invite.rs | 5 ++--- common/src/comp/location.rs | 11 +++++------ common/src/comp/loot_owner.rs | 3 +-- common/src/comp/misc.rs | 3 +-- common/src/comp/ori.rs | 3 +-- common/src/comp/pet.rs | 11 ++++++----- common/src/comp/phys.rs | 28 +++++++++++---------------- common/src/comp/player.rs | 5 ++--- common/src/comp/poise.rs | 5 ++--- common/src/comp/projectile.rs | 5 ++--- common/src/comp/shockwave.rs | 7 +++---- common/src/comp/skillset/mod.rs | 4 ++-- common/src/comp/stats.rs | 3 +-- common/src/comp/visual.rs | 7 +++---- common/src/link.rs | 3 +-- common/src/rtsim.rs | 3 +-- server/Cargo.toml | 1 - server/src/client.rs | 3 +-- server/src/login_provider.rs | 3 +-- server/src/presence.rs | 8 ++++---- server/src/wiring.rs | 7 +++---- voxygen/Cargo.toml | 1 - voxygen/src/ecs/comp.rs | 7 +++---- 45 files changed, 88 insertions(+), 145 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a328b4794d..c5b7100f38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5643,14 +5643,6 @@ dependencies = [ "syn 1.0.98", ] -[[package]] -name = "specs-idvs" -version = "0.1.1" -source = "git+https://gitlab.com/veloren/specs-idvs.git?rev=c17abc638f23ef221ce7384c7dd77eef757b82f4#c17abc638f23ef221ce7384c7dd77eef757b82f4" -dependencies = [ - "specs", -] - [[package]] name = "spin" version = "0.5.2" @@ -6517,7 +6509,6 @@ dependencies = [ "slab", "slotmap 1.0.6", "specs", - "specs-idvs", "spin_sleep", "structopt", "strum", @@ -6587,7 +6578,6 @@ dependencies = [ "num-traits", "serde", "specs", - "specs-idvs", "sum_type", "tracing", "vek 0.15.8", @@ -6748,7 +6738,6 @@ dependencies = [ "serde_json", "slab", "specs", - "specs-idvs", "strum", "tokio", "tracing", @@ -6842,7 +6831,6 @@ dependencies = [ "shaderc", "slab", "specs", - "specs-idvs", "strum", "tokio", "tracing", diff --git a/common/Cargo.toml b/common/Cargo.toml index a137a7410c..e21c7c9b6f 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -79,7 +79,6 @@ slab = "0.4.2" # ECS specs = { version = "0.18", features = ["serde", "storage-event-control", "nightly"] } -specs-idvs = { git = "https://gitlab.com/veloren/specs-idvs.git", rev = "c17abc638f23ef221ce7384c7dd77eef757b82f4" } [dev-dependencies] #bench diff --git a/common/net/Cargo.toml b/common/net/Cargo.toml index ab9ae0dd4c..4b23bf1eaa 100644 --- a/common/net/Cargo.toml +++ b/common/net/Cargo.toml @@ -26,7 +26,6 @@ hashbrown = { version = "0.12", features = ["rayon", "serde", "nightly"] } # ECS specs = { version = "0.18", features = ["serde", "storage-event-control"] } -specs-idvs = { git = "https://gitlab.com/veloren/specs-idvs.git", rev = "c17abc638f23ef221ce7384c7dd77eef757b82f4" } # Serde serde = { version = "1.0.110", features = ["derive"] } diff --git a/common/net/src/sync/interpolation.rs b/common/net/src/sync/interpolation.rs index d183573d48..bc259dfd68 100644 --- a/common/net/src/sync/interpolation.rs +++ b/common/net/src/sync/interpolation.rs @@ -4,7 +4,6 @@ use super::InterpolatableComponent; use common::comp::{Ori, Pos, Vel}; use specs::Component; -use specs_idvs::IdvStorage; use tracing::warn; use vek::ops::{Lerp, Slerp}; @@ -53,7 +52,7 @@ impl InterpBuffer { } impl Component for InterpBuffer { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } // 0 is pure physics, 1 is pure extrapolation diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 4e74959cd5..2729790117 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -29,7 +29,6 @@ use crate::{ use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::{convert::TryFrom, time::Duration}; pub const MAX_ABILITIES: usize = 5; @@ -48,7 +47,7 @@ pub struct ActiveAbilities { } impl Component for ActiveAbilities { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } impl Default for ActiveAbilities { diff --git a/common/src/comp/admin.rs b/common/src/comp/admin.rs index b92e070501..137afce083 100644 --- a/common/src/comp/admin.rs +++ b/common/src/comp/admin.rs @@ -1,6 +1,5 @@ use clap::arg_enum; use specs::Component; -use specs_idvs::IdvStorage; arg_enum! { #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] @@ -14,5 +13,5 @@ arg_enum! { pub struct Admin(pub AdminRole); impl Component for Admin { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index b988a8b643..02768a9a49 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -10,7 +10,6 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage, Entity as EcsEntity}; -use specs_idvs::IdvStorage; use std::{collections::VecDeque, fmt}; use strum::{EnumIter, IntoEnumIterator}; use vek::*; @@ -80,7 +79,7 @@ impl Alignment { } impl Component for Alignment { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } bitflags::bitflags! { @@ -610,7 +609,7 @@ impl Agent { } impl Component for Agent { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } #[cfg(test)] diff --git a/common/src/comp/anchor.rs b/common/src/comp/anchor.rs index 07fc601fcf..f82b9b1881 100644 --- a/common/src/comp/anchor.rs +++ b/common/src/comp/anchor.rs @@ -1,5 +1,4 @@ use specs::{Component, Entity}; -use specs_idvs::IdvStorage; use vek::Vec2; /// This component exists in order to fix a bug that caused entities @@ -16,5 +15,5 @@ pub enum Anchor { } impl Component for Anchor { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } diff --git a/common/src/comp/aura.rs b/common/src/comp/aura.rs index 447cda6090..a66f719b59 100644 --- a/common/src/comp/aura.rs +++ b/common/src/comp/aura.rs @@ -5,8 +5,7 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use slotmap::{new_key_type, SlotMap}; -use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DerefFlaggedStorage, VecStorage}; use std::time::Duration; new_key_type! { pub struct AuraKey; } @@ -154,5 +153,5 @@ impl AuraBuffConstructor { } impl Component for Auras { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/beam.rs b/common/src/comp/beam.rs index 815e2685ea..95e501938b 100644 --- a/common/src/comp/beam.rs +++ b/common/src/comp/beam.rs @@ -1,7 +1,6 @@ use crate::{combat::Attack, uid::Uid}; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::time::Duration; #[derive(Clone, Debug, Serialize, Deserialize)] @@ -26,7 +25,7 @@ pub struct BeamSegment { } impl Component for BeamSegment { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } impl std::ops::Deref for BeamSegment { @@ -43,7 +42,7 @@ pub struct Beam { } impl Component for Beam { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index c46b4d3d64..53a7853fda 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -24,7 +24,6 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use strum::Display; use vek::*; @@ -942,5 +941,5 @@ impl Body { } impl Component for Body { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/buff.rs b/common/src/comp/buff.rs index 30ad7cc247..db2b4c32dc 100644 --- a/common/src/comp/buff.rs +++ b/common/src/comp/buff.rs @@ -5,9 +5,7 @@ use core::{cmp::Ordering, time::Duration}; use hashbrown::HashMap; use serde::{Deserialize, Serialize}; #[cfg(not(target_arch = "wasm32"))] -use specs::{Component, DerefFlaggedStorage}; -#[cfg(not(target_arch = "wasm32"))] -use specs_idvs::IdvStorage; +use specs::{Component, DerefFlaggedStorage, VecStorage}; use strum::EnumIter; /// De/buff Kind. @@ -529,5 +527,5 @@ pub type BuffId = u64; #[cfg(not(target_arch = "wasm32"))] impl Component for Buffs { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs index 6975bce212..0471e06687 100644 --- a/common/src/comp/character_state.rs +++ b/common/src/comp/character_state.rs @@ -13,7 +13,6 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::collections::BTreeMap; use strum::Display; @@ -401,5 +400,5 @@ impl Default for CharacterState { } impl Component for CharacterState { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/chat.rs b/common/src/comp/chat.rs index 6fc3717425..b31857638b 100644 --- a/common/src/comp/chat.rs +++ b/common/src/comp/chat.rs @@ -3,8 +3,7 @@ use crate::{ uid::Uid, }; use serde::{Deserialize, Serialize}; -use specs::Component; -use specs_idvs::IdvStorage; +use specs::{Component, DenseVecStorage}; use std::time::{Duration, Instant}; /// A player's current chat mode. These are chat types that can only be sent by @@ -26,7 +25,7 @@ pub enum ChatMode { } impl Component for ChatMode { - type Storage = IdvStorage; + type Storage = DenseVecStorage; } impl ChatMode { @@ -257,7 +256,7 @@ impl GenericChatMsg { #[derive(Clone, Debug)] pub struct Faction(pub String); impl Component for Faction { - type Storage = IdvStorage; + type Storage = DenseVecStorage; } impl From for Faction { fn from(s: String) -> Self { Faction(s) } diff --git a/common/src/comp/combo.rs b/common/src/comp/combo.rs index bca2cc5917..982697ddb7 100644 --- a/common/src/comp/combo.rs +++ b/common/src/comp/combo.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DerefFlaggedStorage, VecStorage}; pub const COMBO_DECAY_START: f64 = 7.5; // seconds @@ -37,5 +36,5 @@ impl Combo { } impl Component for Combo { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/controller.rs b/common/src/comp/controller.rs index 0a564593fa..9ceeb62c11 100644 --- a/common/src/comp/controller.rs +++ b/common/src/comp/controller.rs @@ -14,7 +14,6 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; use std::collections::BTreeMap; use vek::*; @@ -319,5 +318,5 @@ impl Controller { } impl Component for Controller { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } diff --git a/common/src/comp/energy.rs b/common/src/comp/energy.rs index 037d73e416..a98a2ce544 100644 --- a/common/src/comp/energy.rs +++ b/common/src/comp/energy.rs @@ -1,7 +1,6 @@ use crate::{comp, consts::ENERGY_PER_LEVEL}; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::ops::Mul; #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq)] @@ -125,5 +124,5 @@ impl Energy { } impl Component for Energy { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/group.rs b/common/src/comp/group.rs index b9fa5e218c..d3315b365a 100644 --- a/common/src/comp/group.rs +++ b/common/src/comp/group.rs @@ -3,7 +3,6 @@ use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use slab::Slab; use specs::{Component, DerefFlaggedStorage, Join}; -use specs_idvs::IdvStorage; use tracing::{error, warn}; // Primitive group system @@ -25,7 +24,7 @@ pub const ENEMY: Group = Group(u32::MAX); pub const NPC: Group = Group(u32::MAX - 1); impl Component for Group { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Clone, Debug)] diff --git a/common/src/comp/health.rs b/common/src/comp/health.rs index 329b66f92f..13eac4b7eb 100644 --- a/common/src/comp/health.rs +++ b/common/src/comp/health.rs @@ -8,8 +8,6 @@ use std::convert::TryFrom; use crate::{combat::DamageContributor, resources::Time}; #[cfg(not(target_arch = "wasm32"))] use specs::{Component, DerefFlaggedStorage}; -#[cfg(not(target_arch = "wasm32"))] -use specs_idvs::IdvStorage; use std::ops::Mul; /// Specifies what and how much changed current health @@ -230,7 +228,7 @@ impl Health { #[cfg(not(target_arch = "wasm32"))] impl Component for Health { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[cfg(test)] diff --git a/common/src/comp/inputs.rs b/common/src/comp/inputs.rs index 5d93e4247f..a3f93bb65e 100644 --- a/common/src/comp/inputs.rs +++ b/common/src/comp/inputs.rs @@ -1,8 +1,7 @@ use crate::depot::Id; use hashbrown::HashSet; use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DenseVecStorage, DerefFlaggedStorage}; use vek::geom::Aabb; #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] @@ -11,5 +10,5 @@ pub struct CanBuild { pub build_areas: HashSet>>, } impl Component for CanBuild { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/inventory/item/mod.rs b/common/src/comp/inventory/item/mod.rs index 428d5e7ce4..bff26293c9 100644 --- a/common/src/comp/inventory/item/mod.rs +++ b/common/src/comp/inventory/item/mod.rs @@ -21,8 +21,7 @@ use core::{ }; use crossbeam_utils::atomic::AtomicCell; use serde::{de, Deserialize, Serialize, Serializer}; -use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DenseVecStorage, DerefFlaggedStorage}; use std::{borrow::Cow, collections::hash_map::DefaultHasher, fmt, sync::Arc}; use strum::{EnumString, IntoStaticStr}; use tracing::error; @@ -1211,14 +1210,14 @@ impl ItemDesc for ItemDef { } impl Component for Item { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ItemDrop(pub Item); impl Component for ItemDrop { - type Storage = IdvStorage; + type Storage = DenseVecStorage; } impl<'a, T: ItemDesc + ?Sized> ItemDesc for &'a T { diff --git a/common/src/comp/inventory/mod.rs b/common/src/comp/inventory/mod.rs index e2454d763d..d08329ca11 100644 --- a/common/src/comp/inventory/mod.rs +++ b/common/src/comp/inventory/mod.rs @@ -1,7 +1,6 @@ use core::ops::Not; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::{convert::TryFrom, mem, ops::Range}; use tracing::{debug, trace, warn}; use vek::Vec3; @@ -820,7 +819,7 @@ impl Inventory { } impl Component for Inventory { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] @@ -871,5 +870,7 @@ impl InventoryUpdate { } impl Component for InventoryUpdate { - type Storage = IdvStorage; + // TODO: This could probabably be `DenseVecStorage` (except we call clear on + // this and that essentially leaks for `DenseVecStorage` atm afaict). + type Storage = specs::VecStorage; } diff --git a/common/src/comp/invite.rs b/common/src/comp/invite.rs index 049665bf10..194ec0974b 100644 --- a/common/src/comp/invite.rs +++ b/common/src/comp/invite.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub enum InviteKind { @@ -20,12 +19,12 @@ pub struct Invite { } impl Component for Invite { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } /// Pending invites that an entity currently has sent out /// (invited entity, instant when invite times out) pub struct PendingInvites(pub Vec<(specs::Entity, InviteKind, std::time::Instant)>); impl Component for PendingInvites { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } diff --git a/common/src/comp/location.rs b/common/src/comp/location.rs index 222cc2247d..62cfe9ce41 100644 --- a/common/src/comp/location.rs +++ b/common/src/comp/location.rs @@ -1,10 +1,9 @@ use crate::{resources::Time, uid::Uid}; use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; use vek::*; -#[derive(Copy, Clone, Debug, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug)] pub struct Waypoint { pos: Vec3, last_save: Time, @@ -28,7 +27,7 @@ impl Waypoint { } impl Component for Waypoint { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } #[derive(Copy, Clone, Debug, PartialEq)] @@ -39,7 +38,7 @@ impl WaypointArea { } impl Component for WaypointArea { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } impl Default for WaypointArea { @@ -48,11 +47,11 @@ impl Default for WaypointArea { /// Marker on the map, used for sharing waypoint with group and /// persisting it server side. -#[derive(Copy, Clone, Debug, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug)] pub struct MapMarker(pub Vec2); impl Component for MapMarker { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] diff --git a/common/src/comp/loot_owner.rs b/common/src/comp/loot_owner.rs index 7240b5e5f8..17f0fb7500 100644 --- a/common/src/comp/loot_owner.rs +++ b/common/src/comp/loot_owner.rs @@ -4,7 +4,6 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::{ ops::Add, time::{Duration, Instant}, @@ -72,7 +71,7 @@ impl LootOwner { } impl Component for LootOwner { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Debug, Copy, Clone, Serialize, Deserialize)] diff --git a/common/src/comp/misc.rs b/common/src/comp/misc.rs index 4702f99d09..35d8981afd 100644 --- a/common/src/comp/misc.rs +++ b/common/src/comp/misc.rs @@ -2,7 +2,6 @@ use super::item::Reagent; use crate::uid::Uid; use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub enum Object { @@ -16,5 +15,5 @@ pub enum Object { } impl Component for Object { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } diff --git a/common/src/comp/ori.rs b/common/src/comp/ori.rs index b06900a7cf..027be7d74c 100644 --- a/common/src/comp/ori.rs +++ b/common/src/comp/ori.rs @@ -2,7 +2,6 @@ use crate::util::{Dir, Plane, Projection}; use core::f32::consts::{FRAC_PI_2, PI, TAU}; use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; use vek::{Quaternion, Vec2, Vec3}; // Orientation @@ -435,7 +434,7 @@ impl From for SerdeOri { } impl Component for Ori { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } #[cfg(test)] diff --git a/common/src/comp/pet.rs b/common/src/comp/pet.rs index 8f56628911..63ab096063 100644 --- a/common/src/comp/pet.rs +++ b/common/src/comp/pet.rs @@ -1,15 +1,13 @@ use crate::comp::{body::Body, phys::Mass, quadruped_low, quadruped_medium, quadruped_small}; use crossbeam_utils::atomic::AtomicCell; -use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; use std::{num::NonZeroU64, sync::Arc}; pub type PetId = AtomicCell>; -#[derive(Clone, Debug, Serialize, Deserialize)] +// TODO: move to server crate +#[derive(Clone, Debug)] pub struct Pet { - #[serde(skip)] database_id: Arc, } @@ -99,5 +97,8 @@ pub fn is_mountable(mount: &Body, rider: Option<&Body>) -> bool { } impl Component for Pet { - type Storage = IdvStorage; + // Using `DenseVecStorage` has a u64 space overhead per entity and `Pet` just + // has an `Arc` pointer which is the same size on 64-bit platforms. So it + // isn't worth using `DenseVecStorage` here. + type Storage = specs::VecStorage; } diff --git a/common/src/comp/phys.rs b/common/src/comp/phys.rs index d020d8e089..6af6aaa929 100644 --- a/common/src/comp/phys.rs +++ b/common/src/comp/phys.rs @@ -7,8 +7,7 @@ use crate::{ }; use hashbrown::HashSet; use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage, NullStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DerefFlaggedStorage, NullStorage, VecStorage}; use std::sync::Arc; use vek::*; @@ -17,9 +16,7 @@ use vek::*; pub struct Pos(pub Vec3); impl Component for Pos { - // TODO: why not regular vec storage???? - // TODO: component occupancy metrics - type Storage = IdvStorage; + type Storage = VecStorage; } /// Velocity @@ -31,8 +28,7 @@ impl Vel { } impl Component for Vel { - // TODO: why not regular vec storage???? - type Storage = IdvStorage; + type Storage = VecStorage; } /// Used to defer writes to Pos/Vel in nested join loops @@ -44,8 +40,7 @@ pub struct PosVelOriDefer { } impl Component for PosVelOriDefer { - // TODO: why not regular vec storage???? - type Storage = IdvStorage; + type Storage = VecStorage; } /// Cache of Velocity (of last tick) * dt (of curent tick) @@ -71,8 +66,7 @@ pub struct PreviousPhysCache { } impl Component for PreviousPhysCache { - // TODO: why not regular vec storage???? - type Storage = IdvStorage; + type Storage = VecStorage; } // Scale @@ -80,7 +74,7 @@ impl Component for PreviousPhysCache { pub struct Scale(pub f32); impl Component for Scale { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } // Mass @@ -92,7 +86,7 @@ impl Default for Mass { } impl Component for Mass { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } /// The average density (specific mass) of an entity. @@ -105,7 +99,7 @@ impl Default for Density { } impl Component for Density { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } // Collider @@ -159,7 +153,7 @@ impl Collider { } impl Component for Collider { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Copy, Clone, Default, Debug, PartialEq, Serialize, Deserialize)] @@ -214,12 +208,12 @@ impl PhysicsState { } impl Component for PhysicsState { - type Storage = IdvStorage; + type Storage = VecStorage; } /// Used to forcefully update the position, velocity, and orientation of the /// client -#[derive(Copy, Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, Default)] pub struct ForceUpdate; impl Component for ForceUpdate { diff --git a/common/src/comp/player.rs b/common/src/comp/player.rs index 7236096e68..93c2afcb25 100644 --- a/common/src/comp/player.rs +++ b/common/src/comp/player.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage, NullStorage}; -use specs_idvs::IdvStorage; use uuid::Uuid; use crate::resources::{BattleMode, Time}; @@ -74,10 +73,10 @@ impl Player { } impl Component for Player { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } -#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, Default)] pub struct Respawn; impl Component for Respawn { type Storage = NullStorage; diff --git a/common/src/comp/poise.rs b/common/src/comp/poise.rs index fa36a0e452..37aaef64ba 100644 --- a/common/src/comp/poise.rs +++ b/common/src/comp/poise.rs @@ -10,8 +10,7 @@ use crate::{ util::Dir, }; use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DerefFlaggedStorage, VecStorage}; use std::{ops::Mul, time::Duration}; use vek::*; @@ -264,5 +263,5 @@ impl Poise { } impl Component for Poise { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/projectile.rs b/common/src/comp/projectile.rs index b424415841..532866b654 100644 --- a/common/src/comp/projectile.rs +++ b/common/src/comp/projectile.rs @@ -9,7 +9,6 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; use std::time::Duration; #[derive(Clone, Debug, Serialize, Deserialize)] @@ -22,7 +21,7 @@ pub enum Effect { Bonk, // Knock/dislodge/change objects on hit } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug)] pub struct Projectile { // TODO: use SmallVec for these effects pub hit_solid: Vec, @@ -40,7 +39,7 @@ pub struct Projectile { } impl Component for Projectile { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } #[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] diff --git a/common/src/comp/shockwave.rs b/common/src/comp/shockwave.rs index df6b666c6a..d04c40c1bd 100644 --- a/common/src/comp/shockwave.rs +++ b/common/src/comp/shockwave.rs @@ -1,7 +1,6 @@ use crate::{combat::Attack, uid::Uid}; use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::time::Duration; #[derive(Clone, Debug, Serialize, Deserialize)] @@ -27,7 +26,7 @@ pub struct Shockwave { } impl Component for Shockwave { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } impl std::ops::Deref for Shockwave { @@ -36,13 +35,13 @@ impl std::ops::Deref for Shockwave { fn deref(&self) -> &Properties { &self.properties } } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq)] pub struct ShockwaveHitEntities { pub hit_entities: Vec, } impl Component for ShockwaveHitEntities { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] diff --git a/common/src/comp/skillset/mod.rs b/common/src/comp/skillset/mod.rs index aa7861620e..d5f9d65bfa 100644 --- a/common/src/comp/skillset/mod.rs +++ b/common/src/comp/skillset/mod.rs @@ -10,7 +10,6 @@ use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::{collections::BTreeSet, hash::Hash}; use tracing::{trace, warn}; @@ -239,13 +238,14 @@ pub struct SkillSet { skills: HashMap, pub modify_health: bool, pub modify_energy: bool, + // TODO: why is this part of the component? /// Used to indicate to the frontend that there was an error in loading the /// skillset from the database pub persistence_load_error: Option, } impl Component for SkillSet { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } impl Default for SkillSet { diff --git a/common/src/comp/stats.rs b/common/src/comp/stats.rs index 5cc2406ed8..25b58effec 100644 --- a/common/src/comp/stats.rs +++ b/common/src/comp/stats.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; use std::{error::Error, fmt}; #[derive(Debug)] @@ -86,5 +85,5 @@ impl Stats { } impl Component for Stats { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } diff --git a/common/src/comp/visual.rs b/common/src/comp/visual.rs index 68877bde5f..d5c6bccc56 100644 --- a/common/src/comp/visual.rs +++ b/common/src/comp/visual.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DenseVecStorage, DerefFlaggedStorage}; use vek::*; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -23,7 +22,7 @@ impl Default for LightEmitter { } impl Component for LightEmitter { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -44,5 +43,5 @@ impl Default for LightAnimation { } impl Component for LightAnimation { - type Storage = IdvStorage; + type Storage = DenseVecStorage; } diff --git a/common/src/link.rs b/common/src/link.rs index 6ef53aa4a0..2575be4973 100644 --- a/common/src/link.rs +++ b/common/src/link.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use specs::{Component, DerefFlaggedStorage, SystemData}; -use specs_idvs::IdvStorage; use std::{ops::Deref, sync::Arc}; pub trait Link: Sized + Send + Sync + 'static { @@ -49,7 +48,7 @@ impl Component for Is where R::Link: Send + Sync + 'static, { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Serialize, Deserialize, Debug)] diff --git a/common/src/rtsim.rs b/common/src/rtsim.rs index 07c1340a00..d8ff8f0423 100644 --- a/common/src/rtsim.rs +++ b/common/src/rtsim.rs @@ -4,7 +4,6 @@ // module in `server`. use specs::Component; -use specs_idvs::IdvStorage; use vek::*; use crate::comp::dialogue::MoodState; @@ -15,7 +14,7 @@ pub type RtSimId = usize; pub struct RtSimEntity(pub RtSimId); impl Component for RtSimEntity { - type Storage = IdvStorage; + type Storage = specs::VecStorage; } #[derive(Clone, Debug)] diff --git a/server/Cargo.toml b/server/Cargo.toml index 03bf506937..8b7df44dfa 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -26,7 +26,6 @@ network = { package = "veloren-network", path = "../network", features = ["metri #inline_tweak = "1.0.8" specs = { version = "0.18", features = ["shred-derive"] } -specs-idvs = { git = "https://gitlab.com/veloren/specs-idvs.git", rev = "c17abc638f23ef221ce7384c7dd77eef757b82f4" } strum = { version = "0.24", features = ["derive"] } bincode = "1.3.2" diff --git a/server/src/client.rs b/server/src/client.rs index cd665dd371..e00aaca265 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -2,7 +2,6 @@ use common_net::msg::{ClientType, ServerGeneral, ServerMsg}; use network::{Message, Participant, Stream, StreamError, StreamParams}; use serde::{de::DeserializeOwned, Serialize}; use specs::Component; -use specs_idvs::IdvStorage; use std::sync::{atomic::AtomicBool, Mutex}; /// Client handles ALL network related information of everything that connects @@ -40,7 +39,7 @@ pub struct PreparedMsg { } impl Component for Client { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } impl Client { diff --git a/server/src/login_provider.rs b/server/src/login_provider.rs index b66d1481b1..96d4d8d69f 100644 --- a/server/src/login_provider.rs +++ b/server/src/login_provider.rs @@ -5,7 +5,6 @@ use common::comp::AdminRole; use common_net::msg::RegisterError; use hashbrown::HashMap; use specs::Component; -use specs_idvs::IdvStorage; use std::{str::FromStr, sync::Arc}; use tokio::{runtime::Runtime, sync::oneshot}; use tracing::{error, info}; @@ -44,7 +43,7 @@ impl PendingLogin { } impl Component for PendingLogin { - type Storage = IdvStorage; + type Storage = specs::DenseVecStorage; } pub struct LoginProvider { diff --git a/server/src/presence.rs b/server/src/presence.rs index 03a60d411d..fea7730441 100644 --- a/server/src/presence.rs +++ b/server/src/presence.rs @@ -1,8 +1,7 @@ use common_net::msg::PresenceKind; use hashbrown::HashSet; use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage, NullStorage}; -use specs_idvs::IdvStorage; +use specs::{Component, DenseVecStorage, DerefFlaggedStorage, NullStorage, VecStorage}; use vek::*; #[derive(Clone, Debug, Serialize, Deserialize)] @@ -23,7 +22,8 @@ impl Presence { } impl Component for Presence { - type Storage = DerefFlaggedStorage>; + // Presence seems <= 64 bits, so it isn't worth using DenseVecStorage. + type Storage = DerefFlaggedStorage>; } // Distance from fuzzy_chunk before snapping to current chunk @@ -38,7 +38,7 @@ pub struct RegionSubscription { } impl Component for RegionSubscription { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Copy, Clone, Debug, Default, Serialize, Deserialize)] diff --git a/server/src/wiring.rs b/server/src/wiring.rs index b8999d371f..bfe901be75 100644 --- a/server/src/wiring.rs +++ b/server/src/wiring.rs @@ -7,8 +7,7 @@ use common::{ }; use common_state::BlockChange; use hashbrown::HashMap; -use specs::{Component, Entity}; -use specs_idvs::IdvStorage; +use specs::{Component, DenseVecStorage, Entity}; use tracing::warn; use vek::{num_traits::ToPrimitive, Rgb, Vec3}; @@ -243,9 +242,9 @@ impl WireNode { } impl Component for WiringElement { - type Storage = IdvStorage; + type Storage = DenseVecStorage; } impl Component for Circuit { - type Storage = IdvStorage; + type Storage = DenseVecStorage; } diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index c06c510a5c..cce9a89b39 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -80,7 +80,6 @@ egui_winit_platform = {version = "0.8", optional = true } # ECS specs = { version = "0.18", features = ["serde", "storage-event-control", "derive"] } -specs-idvs = { git = "https://gitlab.com/veloren/specs-idvs.git", rev = "c17abc638f23ef221ce7384c7dd77eef757b82f4" } # Mathematics vek = {version = "0.15.8", features = ["serde"]} diff --git a/voxygen/src/ecs/comp.rs b/voxygen/src/ecs/comp.rs index d0f966aa30..ecc769ca93 100644 --- a/voxygen/src/ecs/comp.rs +++ b/voxygen/src/ecs/comp.rs @@ -1,6 +1,5 @@ use common::{comp::Ori, outcome::HealthChangeInfo}; -use specs::Component; -use specs_idvs::IdvStorage; +use specs::{Component, VecStorage}; use vek::*; // Floats over entity that has had a health change, rising up over time until it @@ -24,7 +23,7 @@ pub struct HpFloaterList { pub time_since_last_dmg_by_me: Option, } impl Component for HpFloaterList { - type Storage = IdvStorage; + type Storage = VecStorage; } // Used for smooth interpolation of visual elements that are tied to entity @@ -35,5 +34,5 @@ pub struct Interpolated { pub ori: Ori, } impl Component for Interpolated { - type Storage = IdvStorage; + type Storage = VecStorage; } From 5dd999131136bcc5ec9be85daf54c6300d58161f Mon Sep 17 00:00:00 2001 From: flo Date: Mon, 8 Aug 2022 09:58:18 +0000 Subject: [PATCH 037/854] DesertCity --- assets/voxygen/voxel/sprite_manifest.ron | 2 +- server/src/rtsim/mod.rs | 70 +- world/src/civ/mod.rs | 97 +- world/src/lib.rs | 2 +- world/src/site/economy/context.rs | 10 +- world/src/site/mod.rs | 32 +- world/src/site/namegen.rs | 4 +- world/src/site2/mod.rs | 102 +- world/src/site2/plot.rs | 7 +- world/src/site2/plot/desert_city_multiplot.rs | 2413 +++++++++++++++++ world/src/site2/plot/desert_city_temple.rs | 679 +++++ world/src/util/mod.rs | 7 + 12 files changed, 3368 insertions(+), 57 deletions(-) create mode 100644 world/src/site2/plot/desert_city_multiplot.rs create mode 100644 world/src/site2/plot/desert_city_temple.rs diff --git a/assets/voxygen/voxel/sprite_manifest.ron b/assets/voxygen/voxel/sprite_manifest.ron index ea021ba90c..c4439fba25 100644 --- a/assets/voxygen/voxel/sprite_manifest.ron +++ b/assets/voxygen/voxel/sprite_manifest.ron @@ -3329,7 +3329,7 @@ Lantern: Some(( ], wind_sway: 0.0, )), -// CliffTown Decor +// CliffTown & DesertCity Decor WindowArabic: Some(( variations: [ ( diff --git a/server/src/rtsim/mod.rs b/server/src/rtsim/mod.rs index fdbfdbee9c..690c9780f3 100644 --- a/server/src/rtsim/mod.rs +++ b/server/src/rtsim/mod.rs @@ -275,7 +275,6 @@ pub fn init( }); } }, - SiteKind::CliffTown(site2) => { for _ in 0..(site2.plazas().len() as f32 * 1.5) as usize { rtsim.entities.insert(Entity { @@ -300,6 +299,75 @@ pub fn init( }); } }, + SiteKind::DesertCity(site2) => { + // villagers + for _ in 0..(site2.plazas().len() as f32 * 1.5) as usize { + rtsim.entities.insert(Entity { + is_loaded: false, + pos: site2 + .plots() + .choose(&mut thread_rng()) + .map_or(site.get_origin(), |plot| { + site2.tile_center_wpos(plot.root_tile()) + }) + .with_z(0) + .map(|e| e as f32), + seed: thread_rng().gen(), + controller: RtSimController::default(), + last_time_ticked: 0.0, + kind: RtSimEntityKind::Villager, + brain: Brain::villager(site_id, &mut thread_rng()), + }); + } + + // guards + for _ in 0..site2.plazas().len() as usize { + rtsim.entities.insert(Entity { + is_loaded: false, + pos: site2 + .plazas() + .choose(&mut thread_rng()) + .map_or(site.get_origin(), |p| { + site2.tile_center_wpos(site2.plot(p).root_tile()) + + Vec2::new( + thread_rng().gen_range(-8..9), + thread_rng().gen_range(-8..9), + ) + }) + .with_z(0) + .map(|e| e as f32), + seed: thread_rng().gen(), + controller: RtSimController::default(), + last_time_ticked: 0.0, + kind: RtSimEntityKind::TownGuard, + brain: Brain::town_guard(site_id, &mut thread_rng()), + }); + } + + // merchants + for _ in 0..site2.plazas().len() as usize { + rtsim.entities.insert(Entity { + is_loaded: false, + pos: site2 + .plazas() + .choose(&mut thread_rng()) + .map_or(site.get_origin(), |p| { + site2.tile_center_wpos(site2.plot(p).root_tile()) + + Vec2::new( + thread_rng().gen_range(-8..9), + thread_rng().gen_range(-8..9), + ) + }) + .with_z(0) + .map(|e| e as f32), + seed: thread_rng().gen(), + controller: RtSimController::default(), + last_time_ticked: 0.0, + kind: RtSimEntityKind::Merchant, + brain: Brain::merchant(site_id, &mut thread_rng()), + }); + } + }, _ => {}, } } diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index 0ff8f76d7d..1aeb62eb53 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -170,6 +170,7 @@ impl Civs { SiteKind::Castle => (16i32, 5.0), SiteKind::Refactor => (32i32, 10.0), SiteKind::CliffTown => (32i32, 10.0), + SiteKind::DesertCity => (64i32, 25.0), SiteKind::Tree => (12i32, 8.0), SiteKind::GiantTree => (12i32, 8.0), SiteKind::Gnarling => (16i32, 10.0), @@ -231,42 +232,46 @@ impl Civs { }); let mut rng = ctx.reseed().rng; - let site = index.sites.insert(match &sim_site.kind { - SiteKind::Settlement => { - WorldSite::settlement(Settlement::generate(wpos, Some(ctx.sim), &mut rng)) - }, - SiteKind::Dungeon => WorldSite::dungeon(site2::Site::generate_dungeon( - &Land::from_sim(ctx.sim), - &mut rng, - wpos, - )), - SiteKind::Castle => { - WorldSite::castle(Castle::generate(wpos, Some(ctx.sim), &mut rng)) - }, - SiteKind::Refactor => WorldSite::refactor(site2::Site::generate_city( - &Land::from_sim(ctx.sim), - &mut rng, - wpos, - )), - SiteKind::CliffTown => WorldSite::cliff_town(site2::Site::generate_cliff_town( - &Land::from_sim(ctx.sim), - &mut rng, - wpos, - )), - SiteKind::Tree => { - WorldSite::tree(Tree::generate(wpos, &Land::from_sim(ctx.sim), &mut rng)) - }, - SiteKind::GiantTree => WorldSite::giant_tree(site2::Site::generate_giant_tree( - &Land::from_sim(ctx.sim), - &mut rng, - wpos, - )), - SiteKind::Gnarling => WorldSite::gnarling(site2::Site::generate_gnarling( - &Land::from_sim(ctx.sim), - &mut rng, - wpos, - )), - }); + let site = + index.sites.insert(match &sim_site.kind { + SiteKind::Settlement => { + WorldSite::settlement(Settlement::generate(wpos, Some(ctx.sim), &mut rng)) + }, + SiteKind::Dungeon => WorldSite::dungeon(site2::Site::generate_dungeon( + &Land::from_sim(ctx.sim), + &mut rng, + wpos, + )), + SiteKind::Castle => { + WorldSite::castle(Castle::generate(wpos, Some(ctx.sim), &mut rng)) + }, + SiteKind::Refactor => WorldSite::refactor(site2::Site::generate_city( + &Land::from_sim(ctx.sim), + &mut rng, + wpos, + )), + SiteKind::CliffTown => WorldSite::cliff_town(site2::Site::generate_cliff_town( + &Land::from_sim(ctx.sim), + &mut rng, + wpos, + )), + SiteKind::DesertCity => WorldSite::desert_city( + site2::Site::generate_desert_city(&Land::from_sim(ctx.sim), &mut rng, wpos), + ), + SiteKind::Tree => { + WorldSite::tree(Tree::generate(wpos, &Land::from_sim(ctx.sim), &mut rng)) + }, + SiteKind::GiantTree => WorldSite::giant_tree(site2::Site::generate_giant_tree( + &Land::from_sim(ctx.sim), + &mut rng, + wpos, + )), + SiteKind::Gnarling => WorldSite::gnarling(site2::Site::generate_gnarling( + &Land::from_sim(ctx.sim), + &mut rng, + wpos, + )), + }); sim_site.site_tmp = Some(site); let site_ref = &index.sites[site]; @@ -549,6 +554,7 @@ impl Civs { // TODO: specify SiteKind based on where a suitable location is found let kind = match ctx.rng.gen_range(0..64) { 0..=10 => SiteKind::CliffTown, + 11..=12 => SiteKind::DesertCity, _ => SiteKind::Refactor, }; let site = attempt(100, || { @@ -968,6 +974,7 @@ impl Civs { SiteKind::Refactor | SiteKind::Settlement | SiteKind::CliffTown + | SiteKind::DesertCity | SiteKind::Castle ) }) @@ -976,8 +983,11 @@ impl Civs { .collect::>(); nearby.sort_by_key(|(_, dist)| *dist as i32); - if let SiteKind::Refactor | SiteKind::Settlement | SiteKind::CliffTown | SiteKind::Castle = - self.sites[site].kind + if let SiteKind::Refactor + | SiteKind::Settlement + | SiteKind::CliffTown + | SiteKind::DesertCity + | SiteKind::Castle = self.sites[site].kind { for (nearby, _) in nearby.into_iter().take(5) { // Find a novel path @@ -1229,6 +1239,7 @@ pub enum SiteKind { Castle, Refactor, CliffTown, + DesertCity, Tree, GiantTree, Gnarling, @@ -1344,6 +1355,11 @@ impl SiteKind { && chunk.near_cliffs() && suitable_for_town(4.0) }, + SiteKind::DesertCity => { + (0.9..1.0).contains(&chunk.temp) + && !chunk.near_cliffs() + && suitable_for_town(4.0) + }, SiteKind::Castle => { if chunk.tree_density > 0.4 || chunk.river.near_water() || chunk.near_cliffs() { return false; @@ -1392,7 +1408,10 @@ impl Site { pub fn is_dungeon(&self) -> bool { matches!(self.kind, SiteKind::Dungeon) } pub fn is_settlement(&self) -> bool { - matches!(self.kind, SiteKind::Settlement | SiteKind::Refactor) + matches!( + self.kind, + SiteKind::Settlement | SiteKind::Refactor | SiteKind::CliffTown | SiteKind::DesertCity + ) } pub fn is_castle(&self) -> bool { matches!(self.kind, SiteKind::Castle) } diff --git a/world/src/lib.rs b/world/src/lib.rs index 9e43d3b5c1..717f04dcee 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -149,7 +149,7 @@ impl World { name: site.site_tmp.map(|id| index.sites[id].name().to_string()), // TODO: Probably unify these, at some point kind: match &site.kind { - civ::SiteKind::Settlement | civ::SiteKind::Refactor | civ::SiteKind::CliffTown => world_msg::SiteKind::Town, + civ::SiteKind::Settlement | civ::SiteKind::Refactor | civ::SiteKind::CliffTown | civ::SiteKind::DesertCity => world_msg::SiteKind::Town, civ::SiteKind::Dungeon => world_msg::SiteKind::Dungeon { difficulty: match site.site_tmp.map(|id| &index.sites[id].kind) { Some(SiteKind::Dungeon(d)) => d.dungeon_difficulty().unwrap_or(0), diff --git a/world/src/site/economy/context.rs b/world/src/site/economy/context.rs index 5c1ebe321e..8c8b3d2206 100644 --- a/world/src/site/economy/context.rs +++ b/world/src/site/economy/context.rs @@ -119,9 +119,10 @@ impl Environment { for site in index.sites.ids() { let site = &index.sites[site]; match site.kind { - SiteKind::Settlement(_) | SiteKind::Refactor(_) | SiteKind::CliffTown(_) => { - towns += site.economy.pop - }, + SiteKind::Settlement(_) + | SiteKind::Refactor(_) + | SiteKind::CliffTown(_) + | SiteKind::DesertCity(_) => towns += site.economy.pop, SiteKind::Dungeon(_) => dungeons += site.economy.pop, SiteKind::Castle(_) => castles += site.economy.pop, SiteKind::Tree(_) => (), @@ -383,7 +384,8 @@ mod tests { kind: match i.kind { crate::site::SiteKind::Settlement(_) | crate::site::SiteKind::Refactor(_) - | crate::site::SiteKind::CliffTown(_) => { + | crate::site::SiteKind::CliffTown(_) + | crate::site::SiteKind::DesertCity(_) => { common::terrain::site::SitesKind::Settlement }, crate::site::SiteKind::Dungeon(_) => { diff --git a/world/src/site/mod.rs b/world/src/site/mod.rs index 4cb4b43894..559130790f 100644 --- a/world/src/site/mod.rs +++ b/world/src/site/mod.rs @@ -66,6 +66,7 @@ pub enum SiteKind { Refactor(site2::Site), CliffTown(site2::Site), Tree(Tree), + DesertCity(site2::Site), GiantTree(site2::Site), Gnarling(site2::Site), } @@ -113,6 +114,13 @@ impl Site { } } + pub fn desert_city(dc: site2::Site) -> Self { + Self { + kind: SiteKind::DesertCity(dc), + economy: Economy::default(), + } + } + pub fn tree(t: Tree) -> Self { Self { kind: SiteKind::Tree(t), @@ -134,6 +142,7 @@ impl Site { SiteKind::Castle(c) => c.radius(), SiteKind::Refactor(s) => s.radius(), SiteKind::CliffTown(ct) => ct.radius(), + SiteKind::DesertCity(dc) => dc.radius(), SiteKind::Tree(t) => t.radius(), SiteKind::GiantTree(gt) => gt.radius(), SiteKind::Gnarling(g) => g.radius(), @@ -147,6 +156,7 @@ impl Site { SiteKind::Castle(c) => c.get_origin(), SiteKind::Refactor(s) => s.origin, SiteKind::CliffTown(ct) => ct.origin, + SiteKind::DesertCity(dc) => dc.origin, SiteKind::Tree(t) => t.origin, SiteKind::GiantTree(gt) => gt.origin, SiteKind::Gnarling(g) => g.origin, @@ -160,6 +170,7 @@ impl Site { SiteKind::Castle(c) => c.spawn_rules(wpos), SiteKind::Refactor(s) => s.spawn_rules(wpos), SiteKind::CliffTown(ct) => ct.spawn_rules(wpos), + SiteKind::DesertCity(dc) => dc.spawn_rules(wpos), SiteKind::Tree(t) => t.spawn_rules(wpos), SiteKind::GiantTree(gt) => gt.spawn_rules(wpos), SiteKind::Gnarling(g) => g.spawn_rules(wpos), @@ -173,6 +184,7 @@ impl Site { SiteKind::Castle(c) => c.name(), SiteKind::Refactor(s) => s.name(), SiteKind::CliffTown(ct) => ct.name(), + SiteKind::DesertCity(dc) => dc.name(), SiteKind::Tree(_) => "Giant Tree", SiteKind::GiantTree(gt) => gt.name(), SiteKind::Gnarling(g) => g.name(), @@ -184,12 +196,13 @@ impl Site { site_id: common::trade::SiteId, ) -> Option { match &self.kind { - SiteKind::Settlement(_) | SiteKind::Refactor(_) | SiteKind::CliffTown(_) => { - Some(common::trade::SiteInformation { - id: site_id, - unconsumed_stock: self.economy.get_available_stock(), - }) - }, + SiteKind::Settlement(_) + | SiteKind::Refactor(_) + | SiteKind::CliffTown(_) + | SiteKind::DesertCity(_) => Some(common::trade::SiteInformation { + id: site_id, + unconsumed_stock: self.economy.get_available_stock(), + }), _ => None, } } @@ -203,6 +216,7 @@ impl Site { SiteKind::Castle(c) => c.apply_to(canvas.index, canvas.wpos, get_col, canvas.chunk), SiteKind::Refactor(s) => s.render(canvas, dynamic_rng), SiteKind::CliffTown(ct) => ct.render(canvas, dynamic_rng), + SiteKind::DesertCity(dc) => dc.render(canvas, dynamic_rng), SiteKind::Tree(t) => t.render(canvas, dynamic_rng), SiteKind::GiantTree(gt) => gt.render(canvas, dynamic_rng), SiteKind::Gnarling(g) => g.render(canvas, dynamic_rng), @@ -229,6 +243,7 @@ impl Site { SiteKind::Castle(c) => c.apply_supplement(dynamic_rng, wpos2d, get_column, supplement), SiteKind::Refactor(_) => {}, SiteKind::CliffTown(_) => {}, + SiteKind::DesertCity(_) => {}, SiteKind::Tree(_) => {}, SiteKind::GiantTree(gt) => gt.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Gnarling(g) => g.apply_supplement(dynamic_rng, wpos2d, supplement), @@ -238,7 +253,10 @@ impl Site { pub fn do_economic_simulation(&self) -> bool { matches!( self.kind, - SiteKind::Refactor(_) | SiteKind::CliffTown(_) | SiteKind::Settlement(_) + SiteKind::Refactor(_) + | SiteKind::CliffTown(_) + | SiteKind::DesertCity(_) + | SiteKind::Settlement(_) ) } } diff --git a/world/src/site/namegen.rs b/world/src/site/namegen.rs index 1b0dda89f1..e043a390ce 100644 --- a/world/src/site/namegen.rs +++ b/world/src/site/namegen.rs @@ -623,8 +623,8 @@ impl<'a, R: Rng> NameGen<'a, R> { self.generate_theme_from_parts(&start, &middle, &vowel, &end) } - // arabic inspired location names for cliff towns - pub fn generate_cliff_town(mut self) -> String { + // arabic inspired location names for clifftown and desertcity + pub fn generate_arabic(mut self) -> String { let start = [ "zor", "el", "mas", "yaz", "ra", "boh", "mah", "ah", "lam", "mak", "mol", "wa", "bisk", "moj", "bis", "ay", "sha", "rez", "bakh", "ta", "je", "ki", "mos", "asj", "meh", diff --git a/world/src/site2/mod.rs b/world/src/site2/mod.rs index eb45e6f126..9ed7badcf8 100644 --- a/world/src/site2/mod.rs +++ b/world/src/site2/mod.rs @@ -747,7 +747,7 @@ impl Site { let mut site = Site { origin, - name: NameGen::location(&mut rng).generate_cliff_town(), + name: NameGen::location(&mut rng).generate_arabic(), ..Site::default() }; @@ -787,6 +787,100 @@ impl Site { site } + pub fn generate_desert_city(land: &Land, rng: &mut impl Rng, origin: Vec2) -> Self { + let mut rng = reseed(rng); + + let mut site = Site { + origin, + name: NameGen::location(&mut rng).generate_arabic(), + ..Site::default() + }; + + site.demarcate_obstacles(land); + + site.make_plaza(land, &mut rng); + + let build_chance = Lottery::from(vec![(20.0, 1), (10.0, 2)]); + + let mut temples = 0; + + for _ in 0..30 { + match *build_chance.choose_seeded(rng.gen()) { + // DesertCityMultiplot + 1 => { + let size = (9.0 + rng.gen::().powf(5.0) * 1.5).round() as u32; + if let Some((aabr, door_tile, door_dir)) = attempt(32, || { + site.find_roadside_aabr( + &mut rng, + 8..(size + 1).pow(2), + Extent2::broadcast(size), + ) + }) { + let desert_city_multi_plot = plot::DesertCityMultiPlot::generate( + land, + &mut reseed(&mut rng), + &site, + door_tile, + door_dir, + aabr, + ); + let desert_city_multi_plot_alt = desert_city_multi_plot.alt; + let plot = site.create_plot(Plot { + kind: PlotKind::DesertCityMultiPlot(desert_city_multi_plot), + root_tile: aabr.center(), + tiles: aabr_tiles(aabr).collect(), + seed: rng.gen(), + }); + + site.blit_aabr(aabr, Tile { + kind: TileKind::Building, + plot: Some(plot), + hard_alt: Some(desert_city_multi_plot_alt), + }); + } else { + site.make_plaza(land, &mut rng); + } + }, + // DesertCityTemple + 2 if temples < 1 => { + let size = (9.0 + rng.gen::().powf(5.0) * 1.5).round() as u32; + if let Some((aabr, door_tile, door_dir)) = attempt(32, || { + site.find_roadside_aabr( + &mut rng, + 8..(size + 1).pow(2), + Extent2::broadcast(size), + ) + }) { + let desert_city_temple = plot::DesertCityTemple::generate( + land, + &mut reseed(&mut rng), + &site, + door_tile, + door_dir, + aabr, + ); + let desert_city_temple_alt = desert_city_temple.alt; + let plot = site.create_plot(Plot { + kind: PlotKind::DesertCityTemple(desert_city_temple), + root_tile: aabr.center(), + tiles: aabr_tiles(aabr).collect(), + seed: rng.gen(), + }); + + site.blit_aabr(aabr, Tile { + kind: TileKind::Building, + plot: Some(plot), + hard_alt: Some(desert_city_temple_alt), + }); + temples += 1; + } + }, + _ => {}, + } + } + site + } + pub fn wpos_tile_pos(&self, wpos2d: Vec2) -> Vec2 { (wpos2d - self.origin).map(|e| e.div_euclid(TILE_SIZE as i32)) } @@ -1035,6 +1129,12 @@ impl Site { PlotKind::Gnarling(gnarling) => gnarling.render_collect(self, canvas), PlotKind::GiantTree(giant_tree) => giant_tree.render_collect(self, canvas), PlotKind::CliffTower(cliff_tower) => cliff_tower.render_collect(self, canvas), + PlotKind::DesertCityMultiPlot(desert_city_multi_plot) => { + desert_city_multi_plot.render_collect(self, canvas) + }, + PlotKind::DesertCityTemple(desert_city_temple) => { + desert_city_temple.render_collect(self, canvas) + }, _ => continue, }; diff --git a/world/src/site2/plot.rs b/world/src/site2/plot.rs index 9b6c2d4c4f..df70e74ac4 100644 --- a/world/src/site2/plot.rs +++ b/world/src/site2/plot.rs @@ -1,5 +1,7 @@ mod castle; mod cliff_tower; +mod desert_city_multiplot; +mod desert_city_temple; pub mod dungeon; mod giant_tree; mod gnarling; @@ -7,7 +9,8 @@ mod house; mod workshop; pub use self::{ - castle::Castle, cliff_tower::CliffTower, dungeon::Dungeon, giant_tree::GiantTree, + castle::Castle, cliff_tower::CliffTower, desert_city_multiplot::DesertCityMultiPlot, + desert_city_temple::DesertCityTemple, dungeon::Dungeon, giant_tree::GiantTree, gnarling::GnarlingFortification, house::House, workshop::Workshop, }; @@ -47,6 +50,8 @@ impl Plot { pub enum PlotKind { House(House), Workshop(Workshop), + DesertCityMultiPlot(DesertCityMultiPlot), + DesertCityTemple(DesertCityTemple), Plaza, Castle(Castle), Road(Path>), diff --git a/world/src/site2/plot/desert_city_multiplot.rs b/world/src/site2/plot/desert_city_multiplot.rs new file mode 100644 index 0000000000..7d5b36d07a --- /dev/null +++ b/world/src/site2/plot/desert_city_multiplot.rs @@ -0,0 +1,2413 @@ +use super::*; +use crate::{ + assets::AssetHandle, + site2::{gen::PrimitiveTransform, plot::dungeon::spiral_staircase}, + util::{RandomField, Sampler, DIAGONALS, NEIGHBORS}, + Land, +}; +use common::terrain::{ + Block, BlockKind, SpriteKind, Structure as PrefabStructure, StructuresGroup, +}; +use lazy_static::lazy_static; +use rand::prelude::*; +use std::sync::Arc; +use vek::*; + +enum PlotKind { + MarketHall { + floors: i32, + towers: [(WatchTower, Vec2); 4], + }, + Multiple { + subplots: Vec<(SubPlotKind, Vec2)>, + }, +} + +enum SubPlotKind { + WorkshopHouse { floors: i32 }, + Library, + WatchTower(WatchTower), + PalmTree, + AnimalShed, +} + +struct WatchTower { + length: i32, + height: i32, +} + +/// Represents house data generated by the `generate()` method +pub struct DesertCityMultiPlot { + /// Axis aligned bounding region for the house + bounds: Aabr, + /// Approximate altitude of the door tile + pub(crate) alt: i32, + diameter: i32, + plot_kind: PlotKind, +} + +impl DesertCityMultiPlot { + pub fn generate( + land: &Land, + rng: &mut impl Rng, + site: &Site, + door_tile: Vec2, + door_dir: Vec2, + tile_aabr: Aabr, + ) -> Self { + let bounds = Aabr { + min: site.tile_wpos(tile_aabr.min), + max: site.tile_wpos(tile_aabr.max), + }; + let diameter = 10 + (bounds.max.x - bounds.min.x).min(bounds.max.y - bounds.min.y); + let plot_kind = match rng.gen_range(0..5) { + 0 => { + let floors = rng.gen_range(2..5); + let towers = { + let center = bounds.center(); + let room_length = diameter / 4; + let tower_length = diameter / 14; + let mut tower = |i| { + let tower_center = center + + DIAGONALS[i] + * (Vec2::new( + room_length + tower_length + 1, + room_length + 2 * tower_length, + )); + let height = rng.gen_range(25..35); + ( + WatchTower { + length: tower_length, + height, + }, + tower_center, + ) + }; + [tower(0), tower(1), tower(2), tower(3)] + }; + PlotKind::MarketHall { floors, towers } + }, + _ => { + let mut subplot_kind = || match rng.gen_range(0..15) { + 0..=5 => SubPlotKind::WorkshopHouse { + floors: rng.gen_range(1..4), + }, + 6..=7 => SubPlotKind::Library, + 8..=9 => SubPlotKind::AnimalShed, + 10..=11 => SubPlotKind::WatchTower(WatchTower { + length: diameter / 14, + height: rng.gen_range(25..35), + }), + _ => SubPlotKind::PalmTree, + }; + let subplot_center = |i| { + let corner_pos = bounds.min + diameter / 5; + corner_pos + SQUARE_4[i] * (diameter / 2 - 5) + }; + + let sw_plot = (subplot_kind(), subplot_center(0)); + let se_plot = (subplot_kind(), subplot_center(1)); + let nw_plot = (subplot_kind(), subplot_center(2)); + let ne_plot = (subplot_kind(), subplot_center(3)); + + PlotKind::Multiple { + subplots: vec![ne_plot, se_plot, sw_plot, nw_plot], + } + }, + }; + Self { + bounds, + alt: land.get_alt_approx(site.tile_center_wpos(door_tile + door_dir)) as i32, + diameter, + plot_kind, + } + } +} + +impl Structure for DesertCityMultiPlot { + fn render(&self, _site: &Site, _land: &Land, painter: &Painter) { + let sandstone = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 37 { + 0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)), + 9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)), + 18..=26 => Block::new(BlockKind::Rock, Rgb::new(247, 216, 136)), + 27..=35 => Block::new(BlockKind::Rock, Rgb::new(248, 219, 142)), + _ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)), + }) + })); + let sandstone_broken = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 42 { + 0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)), + 9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)), + 18..=26 => Block::new(BlockKind::Rock, Rgb::new(247, 216, 136)), + 27..=35 => Block::new(BlockKind::Rock, Rgb::new(248, 219, 142)), + 36..=40 => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), + _ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)), + }) + })); + let wood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12); + let base = self.alt + 1; + let center = self.bounds.center(); + // Fence + painter + .aabb(Aabb { + min: (self.bounds.min + 1).with_z(base - 20), + max: (self.bounds.max).with_z(base + 2), + }) + .without(painter.aabb(Aabb { + min: (self.bounds.min + 2).with_z(base - 20), + max: (self.bounds.max - 1).with_z(base + 2), + })) + .fill(sandstone_broken.clone()); + // Gate1 + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 1, center.y - 3).with_z(base - 20), + max: Vec2::new(self.bounds.max.x, center.y + 3).with_z(base + 10), + }) + .fill(sandstone.clone()); + + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 1, center.y - 3).with_z(base + 9), + max: Vec2::new(self.bounds.max.x, center.y - 1).with_z(base + 10), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 1, center.y + 1).with_z(base + 9), + max: Vec2::new(self.bounds.max.x, center.y + 3).with_z(base + 10), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 2, center.y - 3).with_z(base + 8), + max: Vec2::new(self.bounds.max.x - 1, center.y + 3).with_z(base + 10), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 3, center.y - 3).with_z(base - 20), + max: Vec2::new(self.bounds.max.x - 2, center.y + 3).with_z(base + 10), + }) + .clear(); + // Gate2 + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, self.bounds.min.y + 1).with_z(base - 20), + max: Vec2::new(center.x + 4, self.bounds.max.y).with_z(base + 10), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x + 2, self.bounds.min.y + 1).with_z(base + 9), + max: Vec2::new(center.x + 4, self.bounds.max.y).with_z(base + 10), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, self.bounds.min.y + 1).with_z(base + 9), + max: Vec2::new(center.x, self.bounds.max.y).with_z(base + 10), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, self.bounds.min.y + 2).with_z(base + 8), + max: Vec2::new(center.x + 4, self.bounds.max.y - 1).with_z(base + 10), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, self.bounds.min.y + 3).with_z(base - 20), + max: Vec2::new(center.x + 4, self.bounds.max.y - 2).with_z(base + 10), + }) + .clear(); + // gate clear + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 1, center.y - 2).with_z(base), + max: Vec2::new(self.bounds.max.x, center.y + 2).with_z(base + 7), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 1, self.bounds.min.y + 1).with_z(base), + max: Vec2::new(center.x + 3, self.bounds.max.y).with_z(base + 7), + }) + .clear(); + // Foundation + painter + .aabb(Aabb { + min: (self.bounds.min + 1).with_z(base - 20), + max: (self.bounds.max).with_z(base), + }) + .fill(sandstone.clone()); + + // buildings + match &self.plot_kind { + // Market Hall with Watchtowers + PlotKind::MarketHall { floors, towers } => { + for floor in 0..*floors { + let room_height = self.diameter / 6; + let floor_level = base + (room_height * floor); + let room_length = (self.diameter / 4) - (2 * floor); + // Windowsills + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length - 1, center.y) + .with_z(floor_level + 1), + max: Vec2::new(center.x + room_length + 1, center.y + 2) + .with_z(floor_level + 2), + }) + .fill(wood.clone()); + // Room + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length, center.y - room_length + 3) + .with_z(floor_level), + max: Vec2::new(center.x + room_length, center.y + room_length - 1) + .with_z(floor_level + room_height), + }) + .fill(sandstone.clone()); + // Window Sprites + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length, center.y) + .with_z(floor_level + 2), + max: Vec2::new(center.x + room_length, center.y + 2) + .with_z(floor_level + 5), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), + )); + // Clear Room + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length + 1, center.y - room_length + 4) + .with_z(floor_level), + max: Vec2::new(center.x + room_length - 1, center.y + room_length - 2) + .with_z(floor_level + room_height - 2), + }) + .clear(); + // Overhang1 + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length + 1, center.y + room_length - 1) + .with_z(floor_level + room_height - 1), + max: Vec2::new(center.x + room_length - 1, center.y + room_length) + .with_z(floor_level + room_height), + }) + .fill(wood.clone()); + // Overhang2 + painter + .aabb(Aabb { + min: Vec2::new(center.x + room_length, center.y - room_length + 2) + .with_z(floor_level + room_height - 1), + max: Vec2::new(center.x + room_length + 1, center.y + room_length - 2) + .with_z(floor_level + room_height), + }) + .fill(wood.clone()); + // Overhang3 + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length - 1, center.y - room_length + 4) + .with_z(floor_level + room_height - 1), + max: Vec2::new(center.x - room_length, center.y + room_length - 2) + .with_z(floor_level + room_height), + }) + .fill(wood.clone()); + // Door Frame + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, center.y + room_length - 1) + .with_z(floor_level), + max: Vec2::new(center.x + 2, center.y + room_length) + .with_z(floor_level + 5), + }) + .fill(sandstone.clone()); + // Clear Door + painter + .aabb(Aabb { + min: Vec2::new(center.x - 1, center.y + room_length - 2) + .with_z(floor_level), + max: Vec2::new(center.x + 1, center.y + room_length) + .with_z(floor_level + 4), + }) + .clear(); + // Remove Terrain in front of doors + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, center.y + room_length) + .with_z(floor_level), + max: Vec2::new(center.x + 2, center.y + room_length + 4) + .with_z(floor_level + 5), + }) + .clear(); + // Stairs for each storey + painter + .ramp( + Aabb { + min: Vec2::new(center.x - room_length, center.y - room_length + 1) + .with_z(floor_level), + max: Vec2::new(center.x + room_length, center.y - room_length + 3) + .with_z(floor_level + room_height), + }, + 2 * room_length, + Dir::X, + ) + .fill(sandstone.clone()); + //interior room compartment with entries + painter + .aabb(Aabb { + min: Vec2::new( + center.x - (2 * room_length / 3) + 1, + center.y - (2 * room_length / 3) + 4, + ) + .with_z(floor_level), + max: Vec2::new( + center.x + (2 * room_length / 3) - 1, + center.y + (2 * room_length / 3) - 2, + ) + .with_z(floor_level + room_height - 2), + }) + .fill(sandstone.clone()); + + painter + .aabb(Aabb { + min: Vec2::new( + center.x - (2 * room_length / 3) + 2, + center.y - (2 * room_length / 3) + 5, + ) + .with_z(floor_level), + max: Vec2::new( + center.x + (2 * room_length / 3) - 2, + center.y + (2 * room_length / 3) - 3, + ) + .with_z(floor_level + room_height - 2), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new( + center.x - (room_length / 6), + center.y - (2 * room_length / 3) + 4, + ) + .with_z(floor_level), + max: Vec2::new( + center.x + (room_length / 6), + center.y + (2 * room_length / 3) - 2, + ) + .with_z(floor_level + 3), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + center.x - (2 * room_length / 3) + 1, + center.y + 1 + (room_length / 6), + ) + .with_z(floor_level), + max: Vec2::new( + center.x + (2 * room_length / 3) - 1, + center.y + 1 - (room_length / 6), + ) + .with_z(floor_level + 3), + }) + .clear(); + + // interior room Wall Lamps + painter + .aabb(Aabb { + min: Vec2::new(center.x - 1, center.y - (2 * room_length / 3) + 5) + .with_z(floor_level + 4), + max: Vec2::new(center.x + 1, center.y + (2 * room_length / 3) - 1) + .with_z(floor_level + 5), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new(center.x - 1, center.y - (2 * room_length / 3) + 6) + .with_z(floor_level + 4), + max: Vec2::new(center.x + 1, center.y + (2 * room_length / 3) - 2) + .with_z(floor_level + 5), + }), + ) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), + )); + + // Wall Lamps + painter + .aabb(Aabb { + min: Vec2::new(center.x - 1, center.y - room_length + 4) + .with_z(floor_level + 4), + max: Vec2::new(center.x + 1, center.y + room_length + 1) + .with_z(floor_level + 5), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new(center.x - 1, center.y - room_length + 5) + .with_z(floor_level + 4), + max: Vec2::new(center.x + 1, center.y + room_length) + .with_z(floor_level + 5), + }), + ) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), + )); + + // Floor specific stuff + match floor { + // Ground level room furniture - bank + 0 => { + for dir in NEIGHBORS { + let pos = center + dir * 4; + painter.sprite(pos.with_z(floor_level), SpriteKind::Crate); + } + for dir in NEIGHBORS { + let pos = center + dir * 8; + painter.sprite(pos.with_z(floor_level), SpriteKind::DrawerSmall); + } + + for dir in SQUARE_4 { + let corner_pos = + Vec2::new(center.x - 4, center.y - room_length + 4); + let planter_pos = Vec2::new( + corner_pos.x + dir.x * 7, + corner_pos.y + dir.y * ((2 * room_length) - 7), + ); + painter.rotated_sprite( + planter_pos.with_z(floor_level), + SpriteKind::DrawerMedium, + 4 - (4 * dir.y) as u8, + ); + } + }, + // First floor room furniture + 1 => { + for dir in NEIGHBORS { + let pos = center + dir * 7; + painter.sprite(pos.with_z(floor_level), SpriteKind::Planter); + } + + for dir in SQUARE_4 { + let corner_pos = + Vec2::new(center.x - 4, center.y - room_length + 4); + let planter_pos = Vec2::new( + corner_pos.x + dir.x * 7, + corner_pos.y + dir.y * ((2 * room_length) - 7), + ); + painter.rotated_sprite( + planter_pos.with_z(floor_level), + SpriteKind::DrawerSmall, + 4 - (4 * dir.y) as u8, + ); + } + }, + _ => {}, + } + // On top floor, carve the roof terrace + if floor == (*floors - 1) { + painter + .aabb(Aabb { + min: Vec2::new( + center.x - room_length + 1, + center.y - room_length + 4, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + center.x + room_length - 1, + center.y + room_length - 2, + ) + .with_z(floor_level + room_height), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + center.x + room_length - 3, + center.y - room_length + 1, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + center.x + room_length - 1, + center.y - room_length + 4, + ) + .with_z(floor_level + room_height), + }) + .clear(); + // Roof Ornament + painter + .aabb(Aabb { + min: Vec2::new(center.x - room_length, center.y + room_length - 2) + .with_z(floor_level + room_height), + max: Vec2::new(center.x + room_length, center.y + room_length - 1) + .with_z(floor_level + room_height + 2), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + center.x - room_length + 2, + center.y + room_length - 2, + ) + .with_z(floor_level + room_height + 2), + max: Vec2::new( + center.x + room_length - 2, + center.y + room_length - 1, + ) + .with_z(floor_level + room_height + 3), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, center.y + room_length - 2) + .with_z(floor_level + room_height + 3), + max: Vec2::new(center.x + 2, center.y + room_length - 1) + .with_z(floor_level + room_height + 4), + }) + .fill(sandstone.clone()); + // Wood Beams + for dir in SQUARE_4 { + let corner_pos = + Vec2::new(center.x - room_length + 3, center.y - room_length + 7); + let pos = Vec2::new( + corner_pos.x + dir.x * ((2 * room_length) - 8), + corner_pos.y + dir.y * ((2 * room_length) - 12), + ); + painter + .aabb(Aabb { + min: pos.with_z(floor_level + room_height - 1), + max: (pos + 1) + .with_z(floor_level + room_height + (room_height / 2)), + }) + .fill(wood.clone()); + } + painter + .aabb(Aabb { + min: Vec2::new( + center.x - room_length + 2, + center.y - room_length + 6, + ) + .with_z(floor_level + room_height + (room_height / 2) - 1), + max: Vec2::new( + center.x + room_length - 3, + center.y + room_length - 3, + ) + .with_z(floor_level + room_height + (room_height / 2)), + }) + .fill(wood.clone()); + + painter + .aabb(Aabb { + min: Vec2::new( + center.x - room_length + 3, + center.y - room_length + 7, + ) + .with_z(floor_level + room_height + (room_height / 2) - 1), + max: Vec2::new( + center.x + room_length - 4, + center.y + room_length - 4, + ) + .with_z(floor_level + room_height + (room_height / 2)), + }) + .clear(); + + for b in 0..(room_length - 3) { + painter + .aabb(Aabb { + min: Vec2::new( + center.x - room_length + 3 + (b * 2), + center.y - room_length + 5, + ) + .with_z(floor_level + room_height + (room_height / 2)), + max: Vec2::new( + center.x - room_length + 4 + (b * 2), + center.y + room_length - 2, + ) + .with_z(floor_level + room_height + (room_height / 2) + 1), + }) + .fill(wood.clone()); + } + // roof furniture + for d in 0..2 { + for dir in NEIGHBORS { + let pos = center + dir * (3 + d * 3); + painter.sprite( + pos.with_z(floor_level + room_height - 1), + SpriteKind::Planter, + ); + } + } + } + } + // WatchTowers + for (tower, tower_center) in towers { + // Tower Windowsills + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new( + tower_center.x - 1, + tower_center.y - tower.length - 1, + ) + .with_z(base + 8 + (h * (tower.height / 5))), + max: Vec2::new( + tower_center.x + 1, + tower_center.y + tower.length + 1, + ) + .with_z(base + 9 + (h * (tower.height / 5))), + }) + .fill(wood.clone()); + } + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new( + tower_center.x - tower.length - 1, + tower_center.y - 1, + ) + .with_z(base + 8 + (h * (tower.height / 5))), + max: Vec2::new( + tower_center.x + tower.length + 1, + tower_center.y + 1, + ) + .with_z(base + 9 + (h * (tower.height / 5))), + }) + .fill(wood.clone()); + } + // Tower base + painter + .aabb(Aabb { + min: (tower_center - tower.length - 1).with_z(base), + max: (tower_center + tower.length + 1).with_z(base + 6), + }) + .fill(sandstone.clone()); + // Tower + painter + .aabb(Aabb { + min: (tower_center - tower.length).with_z(base), + max: (tower_center + tower.length).with_z(base + tower.height), + }) + .fill(sandstone.clone()); + // Tower Windows + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - 1, tower_center.y - tower.length) + .with_z(base + 9 + (h * (tower.height / 5))), + max: Vec2::new(tower_center.x + 1, tower_center.y + tower.length) + .with_z(base + 12 + (h * (tower.height / 5))), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(2).unwrap(), + )); + } + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - tower.length, tower_center.y - 1) + .with_z(base + 9 + (h * (tower.height / 5))), + max: Vec2::new(tower_center.x + tower.length, tower_center.y + 1) + .with_z(base + 12 + (h * (tower.height / 5))), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), + )); + } + // Tower entries1 + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - tower.length - 2, tower_center.y - 2) + .with_z(base - 20), + max: Vec2::new(tower_center.x + tower.length + 2, tower_center.y + 2) + .with_z(base + 5), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - tower.length - 4, tower_center.y - 1) + .with_z(base), + max: Vec2::new(tower_center.x + tower.length + 4, tower_center.y + 1) + .with_z(base + 4), + }) + .clear(); + // Tower entries2 + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - 2, tower_center.y - tower.length - 2) + .with_z(base - 20), + max: Vec2::new(tower_center.x + 2, tower_center.y + tower.length + 2) + .with_z(base + 5), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - 1, tower_center.y - tower.length - 4) + .with_z(base), + max: Vec2::new(tower_center.x + 1, tower_center.y + tower.length + 4) + .with_z(base + 4), + }) + .clear(); + // Tower Entry Lamps + for d in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + tower_center.x - 1, + tower_center.y - tower.length - 3 + + (d * ((2 * tower.length) + 6)), + ) + .with_z(base + 4), + max: Vec2::new( + tower_center.x + 1, + tower_center.y - tower.length - 2 + + (d * ((2 * tower.length) + 4)), + ) + .with_z(base + 5), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall) + .with_ori(0 + (4 * d) as u8) + .unwrap(), + )); + } + // Platform + painter + .aabb(Aabb { + min: (tower_center - tower.length - 2).with_z(base + tower.height), + max: (tower_center + tower.length + 2).with_z(base + tower.height + 4), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: (tower_center - tower.length - 1).with_z(base + tower.height + 2), + max: (tower_center + tower.length + 1).with_z(base + tower.height + 4), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - tower.length - 2, tower_center.y - 2) + .with_z(base + tower.height + 3), + max: Vec2::new(tower_center.x + tower.length + 2, tower_center.y + 2) + .with_z(base + tower.height + 4), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(tower_center.x - 2, tower_center.y - tower.length - 2) + .with_z(base + tower.height + 3), + max: Vec2::new(tower_center.x + 2, tower_center.y + tower.length + 2) + .with_z(base + tower.height + 4), + }) + .clear(); + + // clear Tower + let tower_clear = painter.aabb(Aabb { + min: (tower_center - tower.length + 1).with_z(base), + max: (tower_center + tower.length - 1).with_z(base + tower.height + 3), + }); + tower_clear.clear(); + // stairway + let stair_radius = tower.length + 1; + let stairs_clear = painter.aabb(Aabb { + min: (tower_center - stair_radius as i32).with_z(base), + max: (tower_center + stair_radius as i32).with_z(base + tower.height + 2), + }); + stairs_clear + .sample(spiral_staircase( + tower_center.with_z(base + tower.height + 2), + stair_radius as f32, + 0.5, + (2 * tower.length) as f32, + )) + .intersect(tower_clear) + .fill(sandstone.clone()); + //make some room for base entries + painter + .aabb(Aabb { + min: (tower_center - tower.length).with_z(base), + max: (tower_center + tower.length).with_z(base + 5), + }) + .without(painter.aabb(Aabb { + min: (tower_center - tower.length + 1).with_z(base), + max: (tower_center + tower.length - 1).with_z(base + 5), + })) + .clear(); + // clear some steps at the bottom for tower entries + painter + .aabb(Aabb { + min: (tower_center - tower.length + 1).with_z(base + 1), + max: (tower_center + tower.length - 1).with_z(base + 2), + }) + .without(painter.aabb(Aabb { + min: (tower_center - tower.length + 2).with_z(base + 1), + max: (tower_center + tower.length - 2).with_z(base + 2), + })) + .clear(); + } + }, + PlotKind::Multiple { subplots } => { + // House, Workshop, Library, Palm, WatchTower + for (subplot_kind, subplot_center) in subplots { + match subplot_kind { + // House or Workshop (one storey house) + SubPlotKind::WorkshopHouse { floors } => { + for floor in 0..*floors { + let room_height = self.diameter / 6; + let floor_level = base + (room_height * floor); + let room_length = (self.diameter / 7) - (2 * floor); + // Windowsills + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length - 1, + subplot_center.y, + ) + .with_z(floor_level + 1), + max: Vec2::new( + subplot_center.x + room_length + 1, + subplot_center.y + 2, + ) + .with_z(floor_level + 2), + }) + .fill(wood.clone()); + // Room + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length, + subplot_center.y - room_length + 3, + ) + .with_z(floor_level), + max: Vec2::new( + subplot_center.x + room_length, + subplot_center.y + room_length - 1, + ) + .with_z(floor_level + room_height), + }) + .fill(sandstone.clone()); + // Window Sprites + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length, + subplot_center.y, + ) + .with_z(floor_level + 2), + max: Vec2::new( + subplot_center.x + room_length, + subplot_center.y + 2, + ) + .with_z(floor_level + 5), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), + )); + // Clear Room + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length + 1, + subplot_center.y - room_length + 4, + ) + .with_z(floor_level), + max: Vec2::new( + subplot_center.x + room_length - 1, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height - 2), + }) + .clear(); + // Overhang1 + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length + 1, + subplot_center.y + room_length - 1, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + subplot_center.x + room_length - 1, + subplot_center.y + room_length, + ) + .with_z(floor_level + room_height), + }) + .fill(wood.clone()); + // Overhang2 + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + room_length, + subplot_center.y - room_length + 2, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + subplot_center.x + room_length + 1, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height), + }) + .fill(wood.clone()); + // Overhang3 + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length - 1, + subplot_center.y - room_length + 4, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + subplot_center.x - room_length, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height), + }) + .fill(wood.clone()); + // Door Frame + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 2, + subplot_center.y + room_length - 1, + ) + .with_z(floor_level), + max: Vec2::new( + subplot_center.x + 2, + subplot_center.y + room_length, + ) + .with_z(floor_level + 5), + }) + .fill(sandstone.clone()); + // Clear Door + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y + room_length, + ) + .with_z(floor_level + 4), + }) + .clear(); + // Remove Terrain in front of doors + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 2, + subplot_center.y + room_length, + ) + .with_z(floor_level), + max: Vec2::new( + subplot_center.x + 2, + subplot_center.y + room_length + 4, + ) + .with_z(floor_level + 5), + }) + .clear(); + // Stairs for each storey + painter + .ramp( + Aabb { + min: Vec2::new( + subplot_center.x - room_length, + subplot_center.y - room_length + 1, + ) + .with_z(floor_level), + max: Vec2::new( + subplot_center.x + room_length, + subplot_center.y - room_length + 3, + ) + .with_z(floor_level + room_height), + }, + 2 * room_length, + Dir::X, + ) + .fill(sandstone.clone()); + // Carve Roof Terrace + if floor == floors - 1 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length + 1, + subplot_center.y - room_length + 4, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + subplot_center.x + room_length - 1, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + room_length - 3, + subplot_center.y - room_length + 1, + ) + .with_z(floor_level + room_height - 1), + max: Vec2::new( + subplot_center.x + room_length - 1, + subplot_center.y - room_length + 4, + ) + .with_z(floor_level + room_height), + }) + .clear(); + // Roof Ornament + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height), + max: Vec2::new( + subplot_center.x + room_length, + subplot_center.y + room_length - 1, + ) + .with_z(floor_level + room_height + 2), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - room_length + 2, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height + 2), + max: Vec2::new( + subplot_center.x + room_length - 2, + subplot_center.y + room_length - 1, + ) + .with_z(floor_level + room_height + 3), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 2, + subplot_center.y + room_length - 2, + ) + .with_z(floor_level + room_height + 3), + max: Vec2::new( + subplot_center.x + 2, + subplot_center.y + room_length - 1, + ) + .with_z(floor_level + room_height + 4), + }) + .fill(sandstone.clone()); + }; + // furniture + if *floors == 1 { + // Workshop in one-storey buildings + painter + .aabb(Aabb { + min: (subplot_center - 2).with_z(floor_level), + max: (subplot_center + 2) + .with_z(floor_level + room_height + 1), + }) + .fill(sandstone.clone()); + + painter + .aabb(Aabb { + min: (subplot_center - 2).with_z(floor_level + 1), + max: (subplot_center + 2) + .with_z(floor_level + room_height - 2), + }) + .clear(); + painter + .aabb(Aabb { + min: (subplot_center - 1).with_z(floor_level), + max: (subplot_center + 1) + .with_z(floor_level + room_height + 1), + }) + .clear(); + painter + .aabb(Aabb { + min: (subplot_center - 1).with_z(floor_level - 1), + max: (subplot_center + 1).with_z(floor_level), + }) + .fill(Fill::Block(Block::air(SpriteKind::Ember))); + let mut stations = vec![ + SpriteKind::CraftingBench, + SpriteKind::Forge, + SpriteKind::SpinningWheel, + SpriteKind::TanningRack, + SpriteKind::Loom, + SpriteKind::Anvil, + SpriteKind::DismantlingBench, + ]; + 'outer: for d in 0..2 { + for dir in NEIGHBORS { + if stations.is_empty() { + break 'outer; + } + let position = subplot_center + dir * (4 + d * 2); + let cr_station = stations.swap_remove( + RandomField::new(0).get(position.with_z(base)) + as usize + % stations.len(), + ); + painter + .sprite(position.with_z(floor_level), cr_station); + } + } + } else { + // kitchen, bath, living room in buildings with 2-3 storeys + match floor { + 0 => { + // kitchen + // cupboards / ovens / cushions / jugs + for d in 0..2 { + let a_pos = Vec2::new( + subplot_center.x + 3 - (d * 6), + subplot_center.y - room_length + 4, + ); + painter.rotated_sprite( + a_pos.with_z(floor_level), + match (RandomField::new(0) + .get(a_pos.with_z(floor_level))) + % 2 + { + 0 => SpriteKind::CupboardArabic, + _ => SpriteKind::OvenArabic, + }, + 4, + ); + let b_pos = Vec2::new( + subplot_center.x + 3 - (d * 6), + subplot_center.y + room_length - 3, + ); + painter.rotated_sprite( + b_pos.with_z(floor_level), + match (RandomField::new(0) + .get(b_pos.with_z(floor_level))) + % 4 + { + 0 => SpriteKind::CupboardArabic, + 1 => SpriteKind::OvenArabic, + 2 => SpriteKind::CushionArabic, + _ => SpriteKind::JugArabic, + }, + 0, + ); + // wall tables with varying items + let c_pos = Vec2::new( + subplot_center.x - room_length + + 1 + + (d * ((2 * room_length) - 3)), + subplot_center.y, + ); + painter.rotated_sprite( + c_pos.with_z(floor_level), + SpriteKind::WallTableArabic, + 6 - (4 * d) as u8, + ); + painter.rotated_sprite( + c_pos.with_z(floor_level + 1), + match (RandomField::new(0) + .get(c_pos.with_z(floor_level))) + % 5 + { + 0 => SpriteKind::MelonCut, + 1 => SpriteKind::JugAndBowlArabic, + 2 => SpriteKind::Bowl, + 3 => SpriteKind::JugArabic, + _ => SpriteKind::VialEmpty, + }, + 6 - (4 * d) as u8, + ); + } + // CookingPot, Cauldron + painter.sprite( + (subplot_center - 2).with_z(floor_level), + SpriteKind::CookingPot, + ); + painter.sprite( + (subplot_center + 2).with_z(floor_level), + SpriteKind::Cauldron, + ); + }, + 1 => { + // living room + // canapes + for d in 0..2 { + let a_pos = Vec2::new( + subplot_center.x - 4 + (d * 7), + subplot_center.y - room_length + + 5 + + (d * ((2 * room_length) - 9)), + ); + painter.rotated_sprite( + a_pos.with_z(floor_level), + SpriteKind::CanapeArabic, + (4 * d) as u8, + ); + + // other sprites + let b_pos = Vec2::new( + subplot_center.x + 3 - (d * 7), + subplot_center.y - room_length + + 5 + + (d * ((2 * room_length) - 9)), + ); + painter.sprite( + b_pos.with_z(floor_level), + match (RandomField::new(0) + .get(b_pos.with_z(floor_level - d))) + % 6 + { + 0 => SpriteKind::TableArabicLarge, + 1 => SpriteKind::DecorSetArabic, + 2 => SpriteKind::DrawerSmall, + 3 => SpriteKind::CoatRack, + 4 => SpriteKind::TableArabicSmall, + _ => SpriteKind::SepareArabic, + }, + ) + } + }, + _ => { + // bath + // wall tables with varying items + for d in 0..2 { + // wall tables with varying items + let a_pos = Vec2::new( + subplot_center.x - room_length + + 1 + + (d * ((2 * room_length) - 3)), + subplot_center.y, + ); + painter.rotated_sprite( + a_pos.with_z(floor_level), + SpriteKind::WallTableArabic, + 6 - (4 * d) as u8, + ); + painter.rotated_sprite( + a_pos.with_z(floor_level + 1), + match (RandomField::new(0) + .get(a_pos.with_z(floor_level))) + % 4 + { + 0 => SpriteKind::Bowl, + 1 => SpriteKind::VialEmpty, + 2 => SpriteKind::JugArabic, + _ => SpriteKind::JugAndBowlArabic, + }, + 6 - (4 * d) as u8, + ); + // fountain + painter.sprite( + subplot_center.with_z(floor_level), + SpriteKind::FountainArabic, + ) + } + }, + } + } + // Wall Lamps + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y - room_length + 4, + ) + .with_z(floor_level + 4), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y + room_length + 1, + ) + .with_z(floor_level + 5), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y - room_length + 5, + ) + .with_z(floor_level + 4), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y + room_length, + ) + .with_z(floor_level + 5), + }), + ) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), + )); + } + }, + SubPlotKind::Library => { + // Library with stairway + let tower_length = self.diameter / 14; + let tower_height = 23; + let bldg_a_center = Vec2::new( + subplot_center.x - (2 * tower_length) + 1, + subplot_center.y, + ); + let bldg_b_center = + Vec2::new(subplot_center.x + tower_length + 1, subplot_center.y); + // Library windowsills + let sq_corner = Vec2::new( + bldg_b_center.x - 3, + bldg_b_center.y - (2 * tower_length) + 1, + ); + for dir in SQUARE_4 { + for h in 0..2 { + for n in 0..2 { + let window_sill_pos = Vec2::new( + sq_corner.x - 1 + (dir.x * 7), + sq_corner.y - 2 + (dir.y * ((4 * tower_length) + 1)), + ); + painter + .aabb(Aabb { + min: Vec2::new( + window_sill_pos.x - 1, + window_sill_pos.y, + ) + .with_z( + base + 1 + (n * (tower_height / 2)) + (h * 4), + ), + max: Vec2::new( + window_sill_pos.x + 1, + window_sill_pos.y + 1, + ) + .with_z( + base + 2 + (n * (tower_height / 2)) + (h * 4), + ), + }) + .fill(wood.clone()); + } + } + } + for h in 0..2 { + for n in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + (2 * tower_length), + bldg_b_center.y - 4, + ) + .with_z(base + 1 + (n * (tower_height / 2)) + (h * 4)), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length) + 1, + bldg_b_center.y + 4, + ) + .with_z(base + 2 + (n * (tower_height / 2)) + (h * 4)), + }) + .fill(wood.clone()); + } + } + // Library + painter + .aabb(Aabb { + min: (bldg_b_center - (2 * tower_length)).with_z(base), + max: (bldg_b_center + (2 * tower_length)) + .with_z(base + tower_height), + }) + .fill(sandstone.clone()); + // Library windows + for dir in SQUARE_4 { + for h in 0..2 { + for n in 0..2 { + let window_pos = Vec2::new( + sq_corner.x - 1 + (dir.x * 7), + sq_corner.y - 1 + (dir.y * ((4 * tower_length) - 1)), + ); + painter + .aabb(Aabb { + min: Vec2::new(window_pos.x - 1, window_pos.y) + .with_z( + base + 2 + + (n * (tower_height / 2)) + + (h * 4), + ), + max: Vec2::new(window_pos.x + 1, window_pos.y + 1) + .with_z( + base + 5 + + (n * (tower_height / 2)) + + (h * 4), + ), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic) + .with_ori(2) + .unwrap(), + )); + } + } + } + for h in 0..2 { + for n in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 1, + bldg_b_center.y - 4, + ) + .with_z(base + 2 + (n * (tower_height / 2)) + (h * 4)), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length), + bldg_b_center.y + 4, + ) + .with_z(base + 5 + (n * (tower_height / 2)) + (h * 4)), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 1, + bldg_b_center.y - 2, + ) + .with_z( + base + 2 + (n * (tower_height / 2)) + (h * 4), + ), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length), + bldg_b_center.y + 2, + ) + .with_z( + base + 5 + (n * (tower_height / 2)) + (h * 4), + ), + }), + ) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic) + .with_ori(4) + .unwrap(), + )); + } + } + // roof carve out + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - (2 * tower_length) + 2, + bldg_b_center.y - (2 * tower_length) + 1, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 1, + bldg_b_center.y + (2 * tower_length) - 1, + ) + .with_z(base + tower_height), + }) + .clear(); + + // Clear Library + painter + .aabb(Aabb { + min: (bldg_b_center - (2 * tower_length) + 1).with_z(base), + max: (bldg_b_center + (2 * tower_length) - 1) + .with_z(base + tower_height - 2), + }) + .clear(); + // Library Floor + painter + .aabb(Aabb { + min: (bldg_b_center - (2 * tower_length)) + .with_z(base + (tower_height / 2) - 1), + max: (bldg_b_center + (2 * tower_length)) + .with_z(base + (tower_height / 2)), + }) + .fill(sandstone.clone()); + // furniture + for h in 0..2 { + for dir in NEIGHBORS { + let sprite_pos = (bldg_b_center + + (dir * ((2 * tower_length) - 4))) + .with_z(base + ((tower_height / 2) * h)); + painter.sprite( + sprite_pos, + match (RandomField::new(0).get(sprite_pos)) % 6 { + 0 => SpriteKind::DrawerSmall, + 1 => SpriteKind::ChairSingle, + 2 => SpriteKind::CoatRack, + 3 => SpriteKind::Bench, + 4 => SpriteKind::ChairDouble, + _ => SpriteKind::TableDining, + }, + ); + } + + for d in 0..2 { + for e in 0..2 { + // bookshelfs + let a_pos = Vec2::new( + bldg_b_center.x - 3 + (e * 6), + bldg_b_center.y - (2 * tower_length) + + 1 + + (d * ((2 * (2 * tower_length)) - 3)), + ); + painter.rotated_sprite( + a_pos.with_z(base + 1 + ((tower_height / 2) * h)), + SpriteKind::BookshelfArabic, + 4 - (4 * d) as u8, + ); + } + } + } + // Library Wall Lamps + for h in 0..2 { + for n in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 2, + bldg_b_center.y - 1, + ) + .with_z(base + 4 + (n * (tower_height / 2)) + (h * 4)), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 1, + bldg_b_center.y + 1, + ) + .with_z(base + 5 + (n * (tower_height / 2)) + (h * 4)), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall) + .with_ori(6) + .unwrap(), + )); + } + } + // Library Roof Overhangs + for d in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - (2 * tower_length) + 1, + bldg_b_center.y + (2 * tower_length) + - (d * ((4 * tower_length) + 1)), + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 1, + bldg_b_center.y + (2 * tower_length) + 1 + - (d * ((4 * tower_length) + 1)), + ) + .with_z(base + tower_height), + }) + .fill(wood.clone()); + } + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + (2 * tower_length), + bldg_b_center.y - (2 * tower_length) + 1, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length) + 1, + bldg_b_center.y + (2 * tower_length) - 1, + ) + .with_z(base + tower_height), + }) + .fill(wood.clone()); + // Stairs to Tower Top + painter + .ramp( + Aabb { + min: Vec2::new( + bldg_b_center.x - (2 * tower_length) + 2, + bldg_b_center.y - 1, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x - (2 * tower_length) + 4, + bldg_b_center.y + 1, + ) + .with_z(base + tower_height + 1), + }, + 2, + Dir::NegX, + ) + .fill(sandstone.clone()); + // Library Top Room + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - tower_length + 2, + bldg_b_center.y - tower_length, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + tower_length + 2, + bldg_b_center.y + tower_length, + ) + .with_z(base + tower_height + tower_length), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - tower_length + 3, + bldg_b_center.y - tower_length + 1, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + tower_length + 1, + bldg_b_center.y + tower_length - 1, + ) + .with_z(base + tower_height + tower_length - 2), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - tower_length + 3, + bldg_b_center.y - tower_length + 1, + ) + .with_z(base + tower_height + tower_length - 1), + max: Vec2::new( + bldg_b_center.x + tower_length + 1, + bldg_b_center.y + tower_length - 1, + ) + .with_z(base + tower_height + tower_length), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + 1, + bldg_b_center.y - tower_length - 1, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + 3, + bldg_b_center.y + tower_length + 1, + ) + .with_z(base + tower_height + 2), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - tower_length + 1, + bldg_b_center.y - 1, + ) + .with_z(base + tower_height - 1), + max: Vec2::new( + bldg_b_center.x + tower_length + 3, + bldg_b_center.y + 1, + ) + .with_z(base + tower_height + 2), + }) + .clear(); + + // Library Top Room Overhangs + for d in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x - tower_length + 3, + bldg_b_center.y + tower_length + - (d * ((2 * tower_length) + 1)), + ) + .with_z(base + tower_height + tower_length - 1), + max: Vec2::new( + bldg_b_center.x + tower_length + 1, + bldg_b_center.y + tower_length + 1 + - (d * ((2 * tower_length) + 1)), + ) + .with_z(base + tower_height + tower_length), + }) + .fill(wood.clone()); + } + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + tower_length + 2, + bldg_b_center.y - tower_length + 1, + ) + .with_z(base + tower_height + tower_length - 1), + max: Vec2::new( + bldg_b_center.x + tower_length + 3, + bldg_b_center.y + tower_length - 1, + ) + .with_z(base + tower_height + tower_length), + }) + .fill(wood.clone()); + // Library Top Room Roof Ornament + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + tower_length + 1, + bldg_b_center.y - tower_length, + ) + .with_z(base + tower_height + tower_length), + max: Vec2::new( + bldg_b_center.x + tower_length + 2, + bldg_b_center.y + tower_length, + ) + .with_z(base + tower_height + tower_length + 2), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + tower_length + 1, + bldg_b_center.y - tower_length + 2, + ) + .with_z(base + tower_height + tower_length + 2), + max: Vec2::new( + bldg_b_center.x + tower_length + 2, + bldg_b_center.y + tower_length - 2, + ) + .with_z(base + tower_height + tower_length + 3), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + tower_length + 1, + bldg_b_center.y - 1, + ) + .with_z(base + tower_height + tower_length + 3), + max: Vec2::new( + bldg_b_center.x + tower_length + 2, + bldg_b_center.y + 1, + ) + .with_z(base + tower_height + tower_length + 4), + }) + .fill(sandstone.clone()); + // Stairway Tower windowsills + for h in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x - 1, + bldg_a_center.y - tower_length - 1, + ) + .with_z(base + (tower_height / 2) - 4 + (h * 6)), + max: Vec2::new( + bldg_a_center.x + 1, + bldg_a_center.y + tower_length + 1, + ) + .with_z(base + (tower_height / 2) - 3 + (h * 6)), + }) + .fill(wood.clone()); + } + // Stairway Tower base + painter + .aabb(Aabb { + min: (bldg_a_center - tower_length - 1).with_z(base), + max: (bldg_a_center + tower_length + 1).with_z(base + 6), + }) + .fill(sandstone.clone()); + // Tower + painter + .aabb(Aabb { + min: (bldg_a_center - tower_length).with_z(base), + max: (bldg_a_center + tower_length).with_z(base + tower_height), + }) + .fill(sandstone.clone()); + // Stairway Tower windows + for h in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x - 1, + bldg_a_center.y - tower_length, + ) + .with_z(base + (tower_height / 2) - 3 + (h * 6)), + max: Vec2::new( + bldg_a_center.x + 1, + bldg_a_center.y + tower_length, + ) + .with_z(base + (tower_height / 2) + (h * 6)), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(2).unwrap(), + )); + } + // Stairway Tower entry + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x - 2, + bldg_a_center.y - tower_length - 2, + ) + .with_z(base), + max: Vec2::new( + bldg_a_center.x + 2, + bldg_a_center.y + tower_length + 2, + ) + .with_z(base + 5), + }) + .fill(sandstone.clone()); + // clear Stairway Tower entry + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x - 1, + bldg_a_center.y - tower_length - 5, + ) + .with_z(base), + max: Vec2::new( + bldg_a_center.x + 1, + bldg_a_center.y + tower_length + 5, + ) + .with_z(base + 4), + }) + .clear(); + // Stairway Tower Entry Lamps + for d in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x - 1, + bldg_a_center.y - tower_length - 3 + + (d * ((2 * tower_length) + 6)), + ) + .with_z(base + 4), + max: Vec2::new( + bldg_a_center.x + 1, + bldg_a_center.y - tower_length - 2 + + (d * ((2 * tower_length) + 4)), + ) + .with_z(base + 5), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall) + .with_ori(0 + (4 * d) as u8) + .unwrap(), + )); + } + // Library entries from Stairway Tower + for h in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x + tower_length - 1, + bldg_a_center.y - 1, + ) + .with_z(base + (h * (tower_height / 2))), + max: Vec2::new( + bldg_a_center.x + tower_length + 1, + bldg_a_center.y + 1, + ) + .with_z(base + (h * (tower_height / 2)) + 3), + }) + .clear(); + } + // Stairway Tower Platform + painter + .aabb(Aabb { + min: (bldg_a_center - tower_length - 2) + .with_z(base + tower_height), + max: (bldg_a_center + tower_length + 2) + .with_z(base + tower_height + 3), + }) + .fill(sandstone.clone()); + + painter + .aabb(Aabb { + min: (bldg_a_center - tower_length - 1) + .with_z(base + tower_height + 2), + max: (bldg_a_center + tower_length + 1) + .with_z(base + tower_height + 3), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new( + bldg_a_center.x + tower_length + 1, + bldg_a_center.y - 1, + ) + .with_z(base + tower_height + 2), + max: Vec2::new( + bldg_a_center.x + tower_length + 2, + bldg_a_center.y + 1, + ) + .with_z(base + tower_height + 3), + }) + .clear(); + // clear Tower + let tower_clear = painter.aabb(Aabb { + min: (bldg_a_center - tower_length + 1).with_z(base), + max: (bldg_a_center + tower_length - 1) + .with_z(base + tower_height + 3), + }); + tower_clear.clear(); + // stairway + let stair_radius = tower_length + 1; + let stairs_clear = painter.aabb(Aabb { + min: (bldg_a_center - stair_radius as i32).with_z(base), + max: (bldg_a_center + stair_radius as i32) + .with_z(base + tower_height + 2), + }); + stairs_clear + .sample(spiral_staircase( + bldg_a_center.with_z(base + tower_height + 2), + stair_radius as f32, + 0.5, + ((2 * tower_length) - 1) as f32, + )) + .intersect(tower_clear) + .fill(sandstone.clone()); + // make some room for base entries + painter + .aabb(Aabb { + min: (bldg_a_center - tower_length).with_z(base), + max: (bldg_a_center + tower_length).with_z(base + 5), + }) + .without(painter.aabb(Aabb { + min: (bldg_a_center - tower_length + 1).with_z(base), + max: (bldg_a_center + tower_length - 1).with_z(base + 5), + })) + .clear(); + }, + SubPlotKind::WatchTower(tower) => { + // WatchTower Windowsills + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y - tower.length - 1, + ) + .with_z(base + 8 + (h * (tower.height / 5))), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y + tower.length + 1, + ) + .with_z(base + 9 + (h * (tower.height / 5))), + }) + .fill(wood.clone()); + } + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - tower.length - 1, + subplot_center.y - 1, + ) + .with_z(base + 8 + (h * (tower.height / 5))), + max: Vec2::new( + subplot_center.x + tower.length + 1, + subplot_center.y + 1, + ) + .with_z(base + 9 + (h * (tower.height / 5))), + }) + .fill(wood.clone()); + } + // Watch Tower base + painter + .aabb(Aabb { + min: (subplot_center - tower.length - 1).with_z(base), + max: (subplot_center + tower.length + 1).with_z(base + 6), + }) + .fill(sandstone.clone()); + // WatchTower + painter + .aabb(Aabb { + min: (subplot_center - tower.length).with_z(base), + max: (subplot_center + tower.length) + .with_z(base + tower.height), + }) + .fill(sandstone.clone()); + // WatchTower Windows + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y - tower.length, + ) + .with_z(base + 9 + (h * (tower.height / 5))), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y + tower.length, + ) + .with_z(base + 12 + (h * (tower.height / 5))), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(2).unwrap(), + )); + } + for h in 0..4 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - tower.length, + subplot_center.y - 1, + ) + .with_z(base + 9 + (h * (tower.height / 5))), + max: Vec2::new( + subplot_center.x + tower.length, + subplot_center.y + 1, + ) + .with_z(base + 12 + (h * (tower.height / 5))), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), + )); + } + // Watch Tower entries + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 2, + subplot_center.y - tower.length - 2, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + 2, + subplot_center.y + tower.length + 2, + ) + .with_z(base + 5), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y - tower.length - 2, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y + tower.length + 2, + ) + .with_z(base + 4), + }) + .clear(); + // WatchTower Entry Lamps + for d in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y - tower.length - 3 + + (d * ((2 * tower.length) + 6)), + ) + .with_z(base + 4), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y - tower.length - 2 + + (d * ((2 * tower.length) + 4)), + ) + .with_z(base + 5), + }) + .fill(Fill::Block( + Block::air(SpriteKind::WallLampSmall) + .with_ori(0 + (4 * d) as u8) + .unwrap(), + )); + } + // Watchtower Platform + painter + .aabb(Aabb { + min: (subplot_center - tower.length - 2) + .with_z(base + tower.height), + max: (subplot_center + tower.length + 2) + .with_z(base + tower.height + 4), + }) + .fill(sandstone.clone()); + + painter + .aabb(Aabb { + min: (subplot_center - tower.length - 1) + .with_z(base + tower.height + 2), + max: (subplot_center + tower.length + 1) + .with_z(base + tower.height + 4), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - tower.length - 2, + subplot_center.y - 2, + ) + .with_z(base + tower.height + 3), + max: Vec2::new( + subplot_center.x + tower.length + 2, + subplot_center.y + 2, + ) + .with_z(base + tower.height + 4), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 2, + subplot_center.y - tower.length - 2, + ) + .with_z(base + tower.height + 3), + max: Vec2::new( + subplot_center.x + 2, + subplot_center.y + tower.length + 2, + ) + .with_z(base + tower.height + 4), + }) + .clear(); + + // clear Tower + let tower_clear = painter.aabb(Aabb { + min: (subplot_center - tower.length + 1).with_z(base), + max: (subplot_center + tower.length - 1) + .with_z(base + tower.height + 3), + }); + tower_clear.clear(); + // stairway + let stair_radius = tower.length + 1; + let stairs_clear = painter.aabb(Aabb { + min: (subplot_center - stair_radius as i32).with_z(base), + max: (subplot_center + stair_radius as i32) + .with_z(base + tower.height + 2), + }); + stairs_clear + .sample(spiral_staircase( + subplot_center.with_z(base + tower.height + 2), + stair_radius as f32, + 0.5, + (2 * tower.length) as f32, + )) + .intersect(tower_clear) + .fill(sandstone.clone()); + //make some room for base entries + painter + .aabb(Aabb { + min: (subplot_center - tower.length).with_z(base), + max: (subplot_center + tower.length).with_z(base + 5), + }) + .without(painter.aabb(Aabb { + min: (subplot_center - tower.length + 1).with_z(base), + max: (subplot_center + tower.length - 1).with_z(base + 5), + })) + .clear(); + // clear some steps at the bottom for tower entries + painter + .aabb(Aabb { + min: (subplot_center - tower.length + 1).with_z(base + 1), + max: (subplot_center + tower.length - 1).with_z(base + 2), + }) + .without(painter.aabb(Aabb { + min: (subplot_center - tower.length + 2).with_z(base + 1), + max: (subplot_center + tower.length - 2).with_z(base + 2), + })) + .clear(); + }, + SubPlotKind::AnimalShed => { + // fenced animal shed + let shed_length = self.diameter / 14; + // small fence + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - (2 * shed_length), + subplot_center.y - (2 * shed_length) - 1, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + (2 * shed_length) + 2, + subplot_center.y + (2 * shed_length) + 1, + ) + .with_z(base + 2), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new( + subplot_center.x - (2 * shed_length) + 1, + subplot_center.y - (2 * shed_length), + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + (2 * shed_length) + 1, + subplot_center.y + (2 * shed_length), + ) + .with_z(base + 2), + }), + ) + .fill(sandstone_broken.clone()); + // shed + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - shed_length + 2, + subplot_center.y - shed_length, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + shed_length + 2, + subplot_center.y + shed_length, + ) + .with_z(base + shed_length + 1), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - shed_length + 3, + subplot_center.y - shed_length + 1, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + shed_length + 1, + subplot_center.y + shed_length - 1, + ) + .with_z(base + shed_length - 1), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - shed_length + 3, + subplot_center.y - shed_length + 1, + ) + .with_z(base + shed_length), + max: Vec2::new( + subplot_center.x + shed_length + 1, + subplot_center.y + shed_length - 1, + ) + .with_z(base + shed_length + 1), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + 1, + subplot_center.y - shed_length - 1, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + 3, + subplot_center.y + shed_length + 1, + ) + .with_z(base + 3), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - shed_length + 1, + subplot_center.y - 1, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + shed_length + 3, + subplot_center.y + 1, + ) + .with_z(base + 3), + }) + .clear(); + // Shed Overhangs + for d in 0..2 { + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - shed_length + 3, + subplot_center.y + shed_length + - (d * ((2 * shed_length) + 1)), + ) + .with_z(base + shed_length - 1), + max: Vec2::new( + subplot_center.x + shed_length + 1, + subplot_center.y + shed_length + 1 + - (d * ((2 * shed_length) + 1)), + ) + .with_z(base + shed_length), + }) + .fill(wood.clone()); + } + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + shed_length + 2, + subplot_center.y - shed_length + 1, + ) + .with_z(base + shed_length - 1), + max: Vec2::new( + subplot_center.x + shed_length + 3, + subplot_center.y + shed_length - 1, + ) + .with_z(base + shed_length), + }) + .fill(wood.clone()); + // Shed Roof Ornament + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + shed_length + 1, + subplot_center.y - shed_length, + ) + .with_z(base + shed_length), + max: Vec2::new( + subplot_center.x + shed_length + 2, + subplot_center.y + shed_length, + ) + .with_z(base + shed_length + 2), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + shed_length + 1, + subplot_center.y - shed_length + 2, + ) + .with_z(base + shed_length + 2), + max: Vec2::new( + subplot_center.x + shed_length + 2, + subplot_center.y + shed_length - 2, + ) + .with_z(base + shed_length + 3), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x + shed_length + 1, + subplot_center.y - 1, + ) + .with_z(base + shed_length + 3), + max: Vec2::new( + subplot_center.x + shed_length + 2, + subplot_center.y + 1, + ) + .with_z(base + shed_length + 4), + }) + .fill(sandstone.clone()); + }, + SubPlotKind::PalmTree => { + // Palm + painter + .cylinder(Aabb { + min: (subplot_center - 8).with_z(base), + max: (subplot_center + 14).with_z(base + 1), + }) + .fill(sandstone.clone()); + painter + .cylinder(Aabb { + min: (subplot_center - 7).with_z(base), + max: (subplot_center + 13).with_z(base + 1), + }) + .fill(Fill::Brick(BlockKind::Rock, Rgb::new(235, 178, 99), 12)); + for p in 0..2 { + let palm_pos = (subplot_center + 3 + (2 * p)).with_z(base); + lazy_static! { + pub static ref PALM: AssetHandle = + PrefabStructure::load_group("trees.palms"); + } + let rng = RandomField::new(0).get(palm_pos) % 10; + let palm = PALM.read(); + let palm = palm[rng as usize % palm.len()].clone(); + painter + .prim(Primitive::Prefab(Box::new(palm.clone()))) + .translate(palm_pos) + .fill(Fill::Prefab(Box::new(palm), palm_pos, rng)); + } + }, + } + } + }, + } + } +} diff --git a/world/src/site2/plot/desert_city_temple.rs b/world/src/site2/plot/desert_city_temple.rs new file mode 100644 index 0000000000..c30e516808 --- /dev/null +++ b/world/src/site2/plot/desert_city_temple.rs @@ -0,0 +1,679 @@ +use super::*; +use crate::{ + util::{RandomField, Sampler}, + Land, +}; +use common::terrain::{Block, BlockKind}; +use rand::prelude::*; +use std::sync::Arc; +use vek::*; + +/// Represents house data generated by the `generate()` method +pub struct DesertCityTemple { + /// Axis aligned bounding region for the house + bounds: Aabr, + /// Approximate altitude of the door tile + pub(crate) alt: i32, +} + +impl DesertCityTemple { + pub fn generate( + land: &Land, + _rng: &mut impl Rng, + site: &Site, + door_tile: Vec2, + door_dir: Vec2, + tile_aabr: Aabr, + ) -> Self { + let bounds = Aabr { + min: site.tile_wpos(tile_aabr.min), + max: site.tile_wpos(tile_aabr.max), + }; + + Self { + bounds, + alt: land.get_alt_approx(site.tile_center_wpos(door_tile + door_dir)) as i32, + } + } +} + +impl Structure for DesertCityTemple { + fn render(&self, _site: &Site, _land: &Land, painter: &Painter) { + let sandstone = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 37 { + 0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)), + 9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)), + 18..=26 => Block::new(BlockKind::Rock, Rgb::new(247, 216, 136)), + 27..=35 => Block::new(BlockKind::Rock, Rgb::new(248, 219, 142)), + _ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)), + }) + })); + let sandstone_broken = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 42 { + 0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)), + 9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)), + 18..=26 => Block::new(BlockKind::Rock, Rgb::new(247, 216, 136)), + 27..=35 => Block::new(BlockKind::Rock, Rgb::new(248, 219, 142)), + 36..=40 => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), + _ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)), + }) + })); + let base = self.alt + 1; + let center = self.bounds.center(); + let diameter = + 10 + (self.bounds.max.x - self.bounds.min.x).min(self.bounds.max.y - self.bounds.min.y); + // Fence + painter + .aabb(Aabb { + min: (self.bounds.min + 1).with_z(base - 20), + max: (self.bounds.max).with_z(base + 2), + }) + .without(painter.aabb(Aabb { + min: (self.bounds.min + 2).with_z(base - 20), + max: (self.bounds.max - 1).with_z(base + 2), + })) + .fill(sandstone_broken); + painter + .aabb(Aabb { + min: Vec2::new(self.bounds.min.x + 1, center.y - 8).with_z(base), + max: Vec2::new(self.bounds.max.x, center.y + 8).with_z(base + 7), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 7, self.bounds.min.y + 1).with_z(base), + max: Vec2::new(center.x + 9, self.bounds.max.y).with_z(base + 7), + }) + .clear(); + // Foundation + painter + .aabb(Aabb { + min: (self.bounds.min + 1).with_z(base - 20), + max: (self.bounds.max).with_z(base), + }) + .fill(sandstone.clone()); + + // Temple + let temple_color = match (RandomField::new(0).get((center - 3).with_z(base))) % 2 { + 0 => Fill::Brick(BlockKind::Rock, Rgb::new(100, 101, 250), 3), + _ => Fill::Brick(BlockKind::Rock, Rgb::new(63, 49, 63), 24), + }; + let temple_size = diameter / 3; + let floaty_block = Fill::Brick(BlockKind::GlowingWeakRock, Rgb::new(253, 240, 149), 2); + let temple = Aabb { + min: (center - temple_size).with_z(base), + max: (center + temple_size - 1).with_z(base + temple_size + 1), + }; + + // temple with roof carve out + painter.aabb(temple).fill(sandstone.clone()); + // roof decoration + painter + .aabb(Aabb { + min: (center - temple_size - 1).with_z(base + temple_size + 1), + max: (center + temple_size).with_z(base + temple_size + 4), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: (center - temple_size).with_z(base + temple_size + 2), + max: (center + temple_size - 1).with_z(base + temple_size + 4), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size - 1, center.y - (temple_size / 4) - 2) + .with_z(base + temple_size + 3), + max: Vec2::new(center.x + temple_size, center.y + (temple_size / 4) + 1) + .with_z(base + temple_size + 4), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec2::new(center.x - (temple_size / 4) - 2, center.y - temple_size - 1) + .with_z(base + temple_size + 3), + max: Vec2::new(center.x + (temple_size / 4) + 1, center.y + temple_size) + .with_z(base + temple_size + 4), + }) + .clear(); + + // roof carve out + painter + .aabb(Aabb { + min: (center - temple_size + 1).with_z(base + temple_size), + max: (center + temple_size - 2).with_z(base + temple_size + 3), + }) + .clear(); + //corner pillars + for dir in SQUARE_4 { + let corner_pos = center - temple_size; + let pillar_center = corner_pos + (dir * ((2 * temple_size) - 1)); + // Pillar foot + painter + .aabb(Aabb { + min: (pillar_center - 4).with_z(base), + max: (pillar_center + 4).with_z(base + 4), + }) + .fill(sandstone.clone()); + + // Pillar + painter + .aabb(Aabb { + min: (pillar_center - 3).with_z(base + 4), + max: (pillar_center + 3).with_z(base + temple_size + 3), + }) + .fill(sandstone.clone()); + // Pillar Top + painter + .aabb(Aabb { + min: (pillar_center - 4).with_z(base + temple_size + 3), + max: (pillar_center + 4).with_z(base + temple_size + 6), + }) + .fill(sandstone.clone()); + + painter + .aabb(Aabb { + min: (pillar_center - 3).with_z(base + temple_size + 4), + max: (pillar_center + 3).with_z(base + temple_size + 6), + }) + .clear(); + + // clear parts of pillar top for roof carve out + painter + .aabb(Aabb { + min: (center - temple_size).with_z(base + temple_size + 3), + max: (center + temple_size - 1).with_z(base + temple_size + 6), + }) + .clear() + } + + // temple decor carve out + // apply three carve options (horizontal, vertical, none) with two spread + // options (for horizontal and vertical) + for s in 0..2 { + // decor carve out style + let spread_select = ((RandomField::new(0).get((center - 1).with_z(base))) % 2) as i32; + let spread = 3 * spread_select; + let carve_style = ((RandomField::new(0).get((center - 2 - s).with_z(base))) % 3) as i32; + match carve_style { + //vertical + 0 => { + // decor carve outs1 + for c in 0..(temple_size - 5) { + painter + .aabb(Aabb { + min: Vec2::new( + center.x - temple_size + 5 + (2 * c), + center.y - temple_size, + ) + .with_z(base + 2), + max: Vec2::new( + center.x - temple_size + 6 + (2 * c), + center.y + temple_size - 1, + ) + .with_z(base + temple_size - 1), + }) + .clear(); + } + for c in 0..(temple_size - 5) { + painter + .aabb(Aabb { + min: Vec2::new( + center.x - temple_size, + center.y - temple_size + 5 + (2 * c), + ) + .with_z(base + 2), + max: Vec2::new( + center.x + temple_size - 1, + center.y - temple_size + 6 + (2 * c), + ) + .with_z(base + temple_size - 1), + }) + .clear(); + } + }, + 1 => { + // horizontal + for c in 0..((temple_size / 2) - 2) { + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size + 5, center.y - temple_size) + .with_z(base + 2 + ((spread + 2) * c)), + max: Vec2::new( + center.x + temple_size - 6, + center.y + temple_size - 1, + ) + .with_z(base + 3 + ((spread + 2) * c) + spread_select), + }) + .clear(); + } + for c in 0..((temple_size / 2) - 2) { + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - temple_size + 5) + .with_z(base + 2 + ((spread + 2) * c)), + max: Vec2::new( + center.x + temple_size - 1, + center.y + temple_size - 6, + ) + .with_z(base + 3 + ((spread + 2) * c) + spread_select), + }) + .clear(); + } + }, + _ => {}, + } + } + // color inlays1 + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 2) + .with_z(base + 2), + max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 3) + .with_z(base + temple_size - 1), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 3) + .with_z(base + 2), + max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 4) + .with_z(base + temple_size - 1), + }), + ) + .fill(temple_color.clone()); + // color inlays2 + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 2) + .with_z(base + 2), + max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 3) + .with_z(base + temple_size - 1), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new(center.x - temple_size + 3, center.y - temple_size + 2) + .with_z(base + 2), + max: Vec2::new(center.x + temple_size - 4, center.y + temple_size - 3) + .with_z(base + temple_size - 1), + }), + ) + .fill(temple_color.clone()); + // carve outside plane1 + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size + 6, center.y - temple_size).with_z(base + 3), + max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 1) + .with_z(base + temple_size - 2), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new(center.x - temple_size + 6, center.y - temple_size + 1) + .with_z(base + 3), + max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 2) + .with_z(base + temple_size - 2), + }), + ) + .clear(); + // carve outside plane2 + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - temple_size + 6).with_z(base + 3), + max: Vec2::new(center.x + temple_size - 1, center.y + temple_size - 7) + .with_z(base + temple_size - 2), + }) + .without( + painter.aabb(Aabb { + min: Vec2::new(center.x - temple_size + 1, center.y - temple_size + 6) + .with_z(base + 3), + max: Vec2::new(center.x + temple_size - 2, center.y + temple_size - 7) + .with_z(base + temple_size - 2), + }), + ) + .clear(); + // Temple top + painter + .sphere(Aabb { + min: (center - temple_size + 3).with_z(base), + max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6), + }) + .without(painter.aabb(Aabb { + min: (center - temple_size + 2).with_z(base + 1), + max: (center + temple_size - 3).with_z(base + temple_size - 3), + })) + .without(painter.aabb(Aabb { + min: (center - temple_size + 1).with_z(base), + max: (center + temple_size - 1).with_z(base + temple_size), + })) + // carve temple top + .without(painter.sphere(Aabb { + min: (center - temple_size + 5).with_z(base + 2), + max: (center + temple_size - 6).with_z(base + (2 * temple_size) - 8), + })) + .fill(sandstone.clone()); + + // temple top decoration + // apply two decoration options (horizontal, vertical, none) with two spread + // options for hor/ver options + for s in 0..2 { + let top = painter + .sphere(Aabb { + min: (center - temple_size + 3).with_z(base), + max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6), + }) + .without(painter.sphere(Aabb { + min: (center - temple_size + 5).with_z(base + 2), + max: (center + temple_size - 6).with_z(base + (2 * temple_size) - 8), + })) + .without(painter.aabb(Aabb { + min: (center - temple_size + 1).with_z(base), + max: (center + temple_size - 2).with_z(base + temple_size + 1), + })); + // decor carve out style + let spread_select = + ((RandomField::new(0).get((center - 1 - s).with_z(base))) % 2) as i32; + let spread = 3 * spread_select; + let carve_style = ((RandomField::new(0).get((center - 2 - s).with_z(base))) % 3) as i32; + match carve_style { + //vertical + 0 => { + // decor carve outs1 + for c in 0..(temple_size - 2) { + painter + .aabb(Aabb { + min: Vec2::new( + center.x - temple_size + 2 + ((spread + 2) * c), + center.y - temple_size, + ) + .with_z(base + temple_size), + max: Vec2::new( + center.x - temple_size + 3 + ((spread + 2) * c) + spread_select, + center.y + temple_size - 1, + ) + .with_z(base + (2 * temple_size)), + }) + .intersect(top) + .fill(temple_color.clone()); + } + }, + 1 => { + for c in 0..(temple_size - 2) { + painter + .aabb(Aabb { + min: Vec2::new( + center.x - temple_size, + center.y - temple_size + 2 + ((spread + 2) * c), + ) + .with_z(base + temple_size), + max: Vec2::new( + center.x + temple_size - 1, + center.y - temple_size + 3 + ((spread + 2) * c) + spread_select, + ) + .with_z(base + (2 * temple_size)), + }) + .intersect(top) + .fill(temple_color.clone()); + } + }, + _ => {}, + } + } + + // round or rectangle entries + let entry_select = ((RandomField::new(0).get((center + 1).with_z(base))) % 2) as i32; + match entry_select { + 0 => { + //round Temple entries1 + painter + .aabb(Aabb { + min: Vec2::new(center.x - 5, center.y - temple_size).with_z(base), + max: Vec2::new(center.x + 4, center.y + temple_size - 1).with_z(base + 4), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 4, center.y - temple_size).with_z(base), + max: Vec2::new(center.x + 3, center.y + temple_size - 1).with_z(base + 4), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - 4, center.y - temple_size).with_z(base + 4), + max: Vec2::new(center.x + 3, center.y + temple_size - 1).with_z(base + 7), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base + 4), + max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 7), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base + 7), + max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 9), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, center.y - temple_size).with_z(base + 7), + max: Vec2::new(center.x + 1, center.y + temple_size - 1).with_z(base + 9), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - 2, center.y - temple_size).with_z(base + 9), + max: Vec2::new(center.x + 1, center.y + temple_size - 1).with_z(base + 10), + }) + .fill(sandstone.clone()); + + // round Temple entries2 + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 5).with_z(base), + max: Vec2::new(center.x + temple_size - 1, center.y + 4).with_z(base + 4), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 4).with_z(base), + max: Vec2::new(center.x + temple_size - 1, center.y + 3).with_z(base + 4), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 4).with_z(base + 4), + max: Vec2::new(center.x + temple_size - 1, center.y + 3).with_z(base + 7), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base + 4), + max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 7), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base + 7), + max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 9), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 2).with_z(base + 7), + max: Vec2::new(center.x + temple_size - 1, center.y + 1).with_z(base + 9), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 2).with_z(base + 9), + max: Vec2::new(center.x + temple_size - 1, center.y + 1).with_z(base + 10), + }) + .fill(sandstone.clone()); + }, + _ => { + //rectangle Temple entries1 + painter + .aabb(Aabb { + min: Vec2::new(center.x - 5, center.y - temple_size).with_z(base), + max: Vec2::new(center.x + 4, center.y + temple_size - 1).with_z(base + 8), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base), + max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 6), + }) + .clear(); + + //rectangle Temple entries1 + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 5).with_z(base), + max: Vec2::new(center.x + temple_size - 1, center.y + 4).with_z(base + 8), + }) + .fill(sandstone.clone()); + painter + .aabb(Aabb { + min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base), + max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 6), + }) + .clear(); + }, + } + // Temple Top Socket + painter + .cylinder(Aabb { + min: (center - temple_size + 3).with_z(base + temple_size), + max: (center + temple_size - 4).with_z(base + temple_size + 1), + }) + .without(painter.cylinder(Aabb { + min: (center - temple_size + 5).with_z(base + temple_size), + max: (center + temple_size - 6).with_z(base + temple_size + 1), + })) + .fill(sandstone.clone()); + + // carve temple + painter + .aabb(Aabb { + min: (center - temple_size + 4).with_z(base), + max: (center + temple_size - 5).with_z(base + temple_size - 1), + }) + .clear(); + // carve round opening to dome + painter + .cylinder(Aabb { + min: (center - temple_size + 6).with_z(base + temple_size - 1), + max: (center + temple_size - 7).with_z(base + temple_size), + }) + .clear(); + + // floating sculpture, placeholder for sun god + + painter + .sphere(Aabb { + min: (center - 3).with_z(base), + max: (center + 2).with_z(base + 5), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 3).with_z(base + 4), + max: (center + 2).with_z(base + 9), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 4).with_z(base + 8), + max: (center + 3).with_z(base + 13), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 4).with_z(base + 14), + max: (center + 3).with_z(base + 15), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 3).with_z(base + 16), + max: (center + 2).with_z(base + 21), + }) + .fill(floaty_block.clone()); + + // floating sculptures + for dir in SQUARE_4 { + let corner_pos = center - temple_size / 2; + let sclpt_center = corner_pos + (dir * (temple_size)); + + painter + .sphere(Aabb { + min: (sclpt_center - 2).with_z(base), + max: (sclpt_center + 1).with_z(base + 3), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (sclpt_center - 2).with_z(base + 2), + max: (sclpt_center + 1).with_z(base + 5), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (sclpt_center - 3).with_z(base + 5), + max: (sclpt_center + 2).with_z(base + 6), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (sclpt_center - 3).with_z(base + 7), + max: (sclpt_center + 2).with_z(base + 8), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (sclpt_center - 2).with_z(base + 9), + max: (sclpt_center + 1).with_z(base + 12), + }) + .fill(floaty_block.clone()); + } + + // floating sculpture, placeholder for sun god + + painter + .sphere(Aabb { + min: (center - 3).with_z(base), + max: (center + 2).with_z(base + 5), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 3).with_z(base + 4), + max: (center + 2).with_z(base + 9), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 4).with_z(base + 8), + max: (center + 3).with_z(base + 13), + }) + .fill(sandstone.clone()); + painter + .sphere(Aabb { + min: (center - 4).with_z(base + 14), + max: (center + 3).with_z(base + 15), + }) + .fill(sandstone); + painter + .sphere(Aabb { + min: (center - 3).with_z(base + 16), + max: (center + 2).with_z(base + 21), + }) + .fill(floaty_block); + } +} diff --git a/world/src/util/mod.rs b/world/src/util/mod.rs index 7c3c741bcc..aa5bdd79a9 100644 --- a/world/src/util/mod.rs +++ b/world/src/util/mod.rs @@ -54,6 +54,13 @@ pub const DIRS: [Vec2; 8] = [ Vec2::new(1, -1), ]; +pub const DIAGONALS: [Vec2; 4] = [ + Vec2::new(-1, -1), + Vec2::new(1, -1), + Vec2::new(-1, 1), + Vec2::new(1, 1), +]; + pub const NEIGHBORS: [Vec2; 8] = [ Vec2::new(1, 0), Vec2::new(1, 1), From 88b412f4c7fc420dfe3a6dc782c8ee7fd6061d3c Mon Sep 17 00:00:00 2001 From: loki Date: Mon, 8 Aug 2022 18:26:17 +0300 Subject: [PATCH 038/854] added romanian translation --- assets/voxygen/i18n/ro_RO/_manifest.ron | 32 +++ assets/voxygen/i18n/ro_RO/buff.ron | 55 ++++ assets/voxygen/i18n/ro_RO/char_selection.ron | 32 +++ assets/voxygen/i18n/ro_RO/common.ron | 133 +++++++++ assets/voxygen/i18n/ro_RO/esc_menu.ron | 13 + assets/voxygen/i18n/ro_RO/gameinput.ron | 77 ++++++ assets/voxygen/i18n/ro_RO/hud/ability.ron | 36 +++ assets/voxygen/i18n/ro_RO/hud/bag.ron | 49 ++++ assets/voxygen/i18n/ro_RO/hud/char_window.ron | 21 ++ assets/voxygen/i18n/ro_RO/hud/chat.ron | 49 ++++ assets/voxygen/i18n/ro_RO/hud/crafting.ron | 53 ++++ assets/voxygen/i18n/ro_RO/hud/group.ron | 24 ++ assets/voxygen/i18n/ro_RO/hud/map.ron | 41 +++ assets/voxygen/i18n/ro_RO/hud/misc.ron | 66 +++++ assets/voxygen/i18n/ro_RO/hud/sct.ron | 14 + assets/voxygen/i18n/ro_RO/hud/settings.ron | 153 +++++++++++ assets/voxygen/i18n/ro_RO/hud/skills.ron | 257 ++++++++++++++++++ assets/voxygen/i18n/ro_RO/hud/social.ron | 22 ++ assets/voxygen/i18n/ro_RO/hud/trade.ron | 32 +++ assets/voxygen/i18n/ro_RO/main.ron | 115 ++++++++ assets/voxygen/i18n/ro_RO/npc.ron | 248 +++++++++++++++++ assets/voxygen/i18n/ro_RO/template.ron | 12 + 22 files changed, 1534 insertions(+) create mode 100644 assets/voxygen/i18n/ro_RO/_manifest.ron create mode 100644 assets/voxygen/i18n/ro_RO/buff.ron create mode 100644 assets/voxygen/i18n/ro_RO/char_selection.ron create mode 100644 assets/voxygen/i18n/ro_RO/common.ron create mode 100644 assets/voxygen/i18n/ro_RO/esc_menu.ron create mode 100644 assets/voxygen/i18n/ro_RO/gameinput.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/ability.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/bag.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/char_window.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/chat.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/crafting.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/group.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/map.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/misc.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/sct.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/settings.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/skills.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/social.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/trade.ron create mode 100644 assets/voxygen/i18n/ro_RO/main.ron create mode 100644 assets/voxygen/i18n/ro_RO/npc.ron create mode 100644 assets/voxygen/i18n/ro_RO/template.ron diff --git a/assets/voxygen/i18n/ro_RO/_manifest.ron b/assets/voxygen/i18n/ro_RO/_manifest.ron new file mode 100644 index 0000000000..73a7e0deec --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/_manifest.ron @@ -0,0 +1,32 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + metadata: ( + language_name: "Română", + language_identifier: "ro_RO", + ), + convert_utf8_to_ascii: true, + fonts: { + "opensans": Font ( + asset_key: "voxygen.font.OpenSans-Regular", + scale_ratio: 1.0, + ), + "metamorph": Font ( + asset_key: "voxygen.font.Metamorphous-Regular", + scale_ratio: 1.0, + ), + "alkhemi": Font ( + asset_key: "voxygen.font.Alkhemikal", + scale_ratio: 1.0, + ), + "wizard": Font ( + asset_key: "voxygen.font.wizard", + scale_ratio: 1.0, + ), + "cyri": Font ( + asset_key: "voxygen.font.haxrcorp_4089_cyrillic_altgr_extended", + scale_ratio: 1.0, + ), + } +) diff --git a/assets/voxygen/i18n/ro_RO/buff.ron b/assets/voxygen/i18n/ro_RO/buff.ron new file mode 100644 index 0000000000..ed62c64fce --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/buff.ron @@ -0,0 +1,55 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + // Buffs + "buff.remove": "Clic pentru a elimina", + "buff.title.missing": "Lipsește Titlul", + "buff.desc.missing": "Lipsește Descrierea", + "buff.title.heal": "Vindecă", + "buff.desc.heal": "Primești viață pe parcurs.", + "buff.title.potion": "Poțiune", + "buff.desc.potion": "Bând...", + "buff.title.saturation": "Săturare", + "buff.desc.saturation": "Primești viața pe parcurs de la consumabile.", + "buff.title.campfire_heal": "Vindecare la foc de tabără", + "buff.desc.campfire_heal": "Stând la foc de tabără te vindecă {rate}% pe secundă.", + + "buff.title.invulnerability": "Invincibilitate", + "buff.desc.invulnerability": "Nu poți fi rănit de niciun atac.", + "buff.title.protectingward": "Scut Protector", + "buff.desc.protectingward": "Ești protejat, oarecum, de atacuri.", + "buff.title.frenzied": "Frenetic", + "buff.desc.frenzied": "Ești învăluit de viteză nefirească și poți ignora rănile minore.", + "buff.title.hastened": "Accelerat", + "buff.desc.hastened": "Mișcările și atacurile tale sunt mai rapide.", + // Debuffs + "buff.title.bleed": "Sângerare", + "buff.desc.bleed": "Provoacă daune normale.", + "buff.title.cursed": "Blestemat", + "buff.desc.cursed": "Ești blestemat.", + "buff.title.burn": "Înflăcărat", + "buff.desc.burn": "Arzi de viu", + "buff.title.crippled": "Amputare", + "buff.desc.crippled": "Mișcarea ta e paralizată, din cauza rănilor grave de pe picioare.", + "buff.title.frozen": "Înghețat", + "buff.desc.frozen": "Mișcările și atacurile tale sunt încetinite.", + "buff.title.wet": "Ud", + "buff.desc.wet": "Pământul îți respinge picioarele, ceea ce face dificil să te oprești.", + "buff.title.ensnared": "Captiv", + "buff.desc.ensnared": "Vinile te prind de picioare, împiedicându-ți mișcarea.", + // Buffs stats + "buff.stat.health": "Redă {str_total} Viață", + "buff.stat.increase_max_energy": "Mărește Energia cu {strength}", + "buff.stat.increase_max_health": "Mărește Viața cu {strength}", + "buff.stat.invulnerability": "Oferă Invincibilitate", + // Text + "buff.text.over_seconds": "peste {dur_secs} secunde", + "buff.text.for_seconds": "pentru {dur_secs} secunde", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/char_selection.ron b/assets/voxygen/i18n/ro_RO/char_selection.ron new file mode 100644 index 0000000000..69c5fc3591 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/char_selection.ron @@ -0,0 +1,32 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "char_selection.loading_characters": "Se încarcă Personajele...", + "char_selection.delete_permanently": "Vrei să ștergi acest Personaj pentru totdeauna?", + "char_selection.deleting_character": "Se șterge Personajul...", + "char_selection.change_server": "Schimbă Serverul", + "char_selection.enter_world": "Intră în lume", + "char_selection.logout": "Ieși din cont", + "char_selection.create_new_character": "Creează un Personaj Nou", + "char_selection.creating_character": "Se Creaază Personajul...", + "char_selection.character_creation": "Creearea Personajului", + "char_selection.human_default": "Om Inițial", + "char_selection.level_fmt": "Nivel {level_nb}", + "char_selection.uncanny_valley": "Pustietate", + "char_selection.plains_of_uncertainty": "Câmpiile Incertitudinii", + "char_selection.beard": "Barbă", + "char_selection.hair_style": "Stilul Părului", + "char_selection.hair_color": "Culoarea Parului", + "char_selection.eye_color": "Culoarea Ochilor", + "char_selection.skin": "Pielea", + "char_selection.eyeshape": "Detaliile Ochilor", + "char_selection.accessories": "Accesorii", + "char_selection.create_info_name": "Personajul tău are nevoie de nume!", + "char_selection.version_mismatch": "ATENȚIE! Acest server rulează o versiune de joc diferită, posibil incompatibilă. Te rog să actualizezi jocul.", + }, + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/common.ron b/assets/voxygen/i18n/ro_RO/common.ron new file mode 100644 index 0000000000..fc3f4c1081 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/common.ron @@ -0,0 +1,133 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM +/// Localization for Română (Romanian) + +/// NEEDS EDITING! + +( + string_map: { + // Texts used in multiple locations with the same formatting + "common.username": "Nume de utilizator", + "common.singleplayer": "Jucător Solo", + "common.multiplayer": "Mai mulți jucători", + "common.servers": "Servere", + "common.quit": "Ieși", + "common.settings": "Setări", + "common.languages": "Limbi", + "common.interface": "Interfață", + "common.gameplay": "Gameplay", + "common.controls": "Controale", + "common.video": "Grafici", + "common.sound": "Sunet", + "common.chat": "Chat", + "common.resume": "Continuă", + "common.characters": "Personaje", + "common.close": "Închide", + "common.yes": "Da", + "common.no": "Nu", + "common.back": "Înapoi", + "common.create": "Creează", + "common.okay": "Okay", + "common.add": "Adaugă", + "common.accept": "Acceptă", + "common.decline": "Refuză", + "common.disclaimer": "Atenție", + "common.cancel": "Renunță", + "common.none": "Nimic", + "common.error": "Eroare", + "common.fatal_error": "Eroare Fatală", + "common.you": "Tu", + "common.automatic": "Auto", + "common.random": "Aleatoriu", + "common.empty": "Gol", + "common.confirm": "Confirmă", + "common.delete_server": "Șterge Server", + + // Settings Window title + "common.interface_settings": "Setări Interfață", + "common.gameplay_settings": "Setări Gameplay", + "common.controls_settings": "Setări Controale", + "common.video_settings": "Setări Grafici", + "common.sound_settings": "Setări Sunet", + "common.language_settings": "Setări Limba", + "common.chat_settings": "Setări Chat", + + // Message when connection to the server is lost + "common.connection_lost": r#"Conexiune pierdută! +Sa repornit server-ul? +E clientul actualizat?"#, + + + + "common.species.orc": "Orc", + "common.species.human": "Om", + "common.species.dwarf": "Pitic", + "common.species.elf": "Elf", + "common.species.draugr": "Fantomă", + "common.species.danari": "Danari", + + "common.weapons.axe": "Topor", + "common.weapons.dagger": "Pumnal", + "common.weapons.greatsword": "Sabie Lungă", + "common.weapons.shortswords": "Săbii Scurte", + "common.weapons.sword": "Sabie", + "common.weapons.staff": "Toiag de Flăcări", + "common.weapons.bow": "Arc", + "common.weapons.hammer": "Ciocan", + "common.weapons.general": "Bătălie Generală", + "common.weapons.sceptre": "Spectru de Vindecare", + "common.weapons.shield": "Scut", + "common.weapons.spear": "Suliță", + "common.weapons.hammer_simple": "Ciocan Simplu", + "common.weapons.sword_simple": "Sabie Simplă", + "common.weapons.staff_simple": "Toiag Simplu", + "common.weapons.axe_simple": "Topor Simplu", + "common.weapons.bow_simple": "Arc Simplu", + "common.weapons.unique": "Unic", + "common.tool.debug": "Debug", + "common.tool.farming": "Unealtă de Agricultură", + "common.tool.pick": "Tărnacop", + "common.tool.mining": "Minează", + "common.kind.modular_component": "Componentă Modulară", + "common.kind.modular_component_partial": "Componentă", + "common.kind.glider": "Planor", + "common.kind.consumable": "Consumabilă", + "common.kind.throwable": "Se poate arunca", + "common.kind.utility": "Utilitară", + "common.kind.ingredient": "Ingredient", + "common.kind.lantern": "Lanternă", + "common.hands.one": "O mână", + "common.hands.two": "Două mâini", + + "common.rand_appearance": "Înfățișare aleatorie", + "common.rand_name": "Nume aleatoriu", + + "common.stats.combat_rating": "CR", + "common.stats.power": "Putere", + "common.stats.speed": "Viteză", + "common.stats.poise": "Poise", + "common.stats.range": "Distanță", + "common.stats.energy_efficiency": "Eficiența energiei", + "common.stats.buff_strength": "Buff/Debuff Strength", + "common.stats.crit_chance": "Șansă Crit", + "common.stats.crit_mult": "Multiplicator Crit", + "common.stats.armor": "Armură", + "common.stats.poise_res":"Stun Res", + "common.stats.energy_max": "Energie Maximă", + "common.stats.energy_reward": "Energy Reward", + "common.stats.crit_power": "Crit Power", + "common.stats.stealth": "Strecurare", + "common.stats.slots": "Sloturi", + + "common.material.metal": "Metal", + "common.material.wood": "Lemn", + "common.material.stone": "Piatră", + "common.material.cloth": "Pânză", + "common.material.hide": "Piele de animal", + + "common.sprite.chest": "Cufăr", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/esc_menu.ron b/assets/voxygen/i18n/ro_RO/esc_menu.ron new file mode 100644 index 0000000000..929b6556f3 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/esc_menu.ron @@ -0,0 +1,13 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "esc_menu.logout": "Deconectează-te", + "esc_menu.quit_game": "Părăsește jocul", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/gameinput.ron b/assets/voxygen/i18n/ro_RO/gameinput.ron new file mode 100644 index 0000000000..a1eed5e20a --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/gameinput.ron @@ -0,0 +1,77 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "gameinput.primary": "Atac de bază", + "gameinput.secondary": "Atac secundar", + "gameinput.block": "Blochează", + "gameinput.slot1": "Hotbar Slot 1", + "gameinput.slot2": "Hotbar Slot 2", + "gameinput.slot3": "Hotbar Slot 3", + "gameinput.slot4": "Hotbar Slot 4", + "gameinput.slot5": "Hotbar Slot 5", + "gameinput.slot6": "Hotbar Slot 6", + "gameinput.slot7": "Hotbar Slot 7", + "gameinput.slot8": "Hotbar Slot 8", + "gameinput.slot9": "Hotbar Slot 9", + "gameinput.slot10": "Hotbar Slot 10", + "gameinput.swaploadout": "Schimbă Loadout-ul", + "gameinput.togglecursor": "Comută Cursorul", + "gameinput.help": "Comută Fereastra de Ajutor", + "gameinput.toggleinterface": "Comută Interfața", + "gameinput.toggledebug": "Comută FPS și Debug Info", + "gameinput.toggle_egui_debug": "Comută EGUI Debug Info", + "gameinput.togglechat": "Comută Chat", + "gameinput.screenshot": "Ia o captură de ecran", + "gameinput.toggleingameui": "Comută Etichetele de Nume", + "gameinput.fullscreen": "Comută Ecran Complet", + "gameinput.moveforward": "Mișcă în Față", + "gameinput.moveleft": "Mișcă în Stânga", + "gameinput.moveright": "Mișcă în Dreapta", + "gameinput.moveback": "Mișcă în Spate", + "gameinput.jump": "Sari", + "gameinput.glide": "Planor", + "gameinput.roll": "Rostogolire", + "gameinput.climb": "Cățărare", + "gameinput.climbdown": "Coboară", + "gameinput.wallleap": "Salt pe Perete", + "gameinput.togglelantern": "Comută Lanterna", + "gameinput.mount": "Călărește", + "gameinput.chat": "Chat", + "gameinput.command": "Comandă", + "gameinput.escape": "Scapă", + "gameinput.map": "Hartă", + "gameinput.bag": "Rucsac", + "gameinput.trade": "Negocează", + "gameinput.social": "Social", + "gameinput.sit": "Asează-te", + "gameinput.spellbook": "Vrăji", + "gameinput.settings": "Setări", + "gameinput.respawn": "Reînvie", + "gameinput.charge": "Încarcă", + "gameinput.togglewield": "Cumută Mânuire", + "gameinput.interact": "Interacționează", + "gameinput.freelook": "Privire Liberă", + "gameinput.autowalk": "Mișcare/Înotare Automată", + "gameinput.cameraclamp": "Camera Clamp", + "gameinput.dance": "Dansează", + "gameinput.select": "Selecteaza Entitatea", + "gameinput.acceptgroupinvite": "Acceptă Invitația de Grup", + "gameinput.declinegroupinvite": "Refuză Invitația de Grup", + "gameinput.cyclecamera": "Schimbă Camera", + "gameinput.crafting": "Meșteșug", + "gameinput.fly": "Zboară", + "gameinput.sneak": "Furișează-te", + "gameinput.swimdown": "Înoată Înainte", + "gameinput.swimup": "Înoată Înapoi", + "gameinput.mapzoomin": "Mărește zoom-ul hărții", + "gameinput.mapzoomout": "Reduceți zoom-ul hărții", + "gameinput.greet": "Salută", + "gameinput.map.locationmarkerbutton": "Setează punct de referință pe hartă" + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/ability.ron b/assets/voxygen/i18n/ro_RO/hud/ability.ron new file mode 100644 index 0000000000..81861637ae --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/ability.ron @@ -0,0 +1,36 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + // Debug stick + "common.abilities.debug.possess.name": "Săgeată Manipulatoare", + "common.abilities.debug.possess.desc": "Trage o săgeată otrăvitoare care te lasă să controlezi inamicul.", + // Sword + "common.abilities.sword.spin.name": "Vârtej de vânt", + "common.abilities.sword.spin.desc": "Mișcă-te înainte în timp ce te rotești cu sabia.", + // Axe + "common.abilities.axe.leap.name": "Saltul Toporului", + "common.abilities.axe.leap.desc": "Un salt cu mișcare tăioasă la poziția cursorului.", + // Hammer + "common.abilities.hammer.leap.name": "Lovitura Morții", + "common.abilities.hammer.leap.desc": "Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului.", + // Bow + "common.abilities.bow.shotgun.name": "Burst", + "common.abilities.bow.shotgun.desc": "Trage rapid mai multe sageți", + // Staff + "common.abilities.staff.fireshockwave.name": "Inel de Foc", + "common.abilities.staff.fireshockwave.desc": "Aprinde pământul cu undă de șoc în flăcări.", + + // Sceptre + "common.abilities.sceptre.wardingaura.name": "Aură Protectoare", + "common.abilities.sceptre.wardingaura.desc": "Protejează aliații tăi împotriva atacutilor inamicilor", + // Unknown + "common.abilities.unknown.name": "Ablitatea nu are titlu", + "common.abilities.unknown.desc": "Ablitatea nu are descripție", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/bag.ron b/assets/voxygen/i18n/ro_RO/hud/bag.ron new file mode 100644 index 0000000000..cac9c6d9ec --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/bag.ron @@ -0,0 +1,49 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + // Inventory + "hud.bag.inventory": "Invetarul lui {playername}", + "hud.bag.stats_title": "Statisticile lui {playername}", + "hud.bag.exp": "Exp", + "hud.bag.armor": "Armura", + "hud.bag.stats": "Statistici", + "hud.bag.head": "Cap", + "hud.bag.neck": "Gât", + "hud.bag.tabard": "Tabard", + "hud.bag.shoulders": "Umeri", + "hud.bag.chest": "Piept", + "hud.bag.hands": "Mâini", + "hud.bag.lantern": "Lanternă", + "hud.bag.glider": "Planor", + "hud.bag.belt": "Curea", + "hud.bag.ring": "Inel", + "hud.bag.back": "Spate", + "hud.bag.legs": "Picioare", + "hud.bag.feet": "Talpă", + "hud.bag.mainhand": "Mâna Principală", + "hud.bag.offhand": "Mâna Secundară", + "hud.bag.inactive_mainhand": "Mâna Principală Inactivă", + "hud.bag.inactive_offhand": "Mâna Secundară Inactivă", + "hud.bag.swap_equipped_weapons_title": "Schimbă armele echipate", + "hud.bag.swap_equipped_weapons_desc": "Apasă {key}", + "hud.bag.bag": "Rucsac", + "hud.bag.health": "Viață", + "hud.bag.energy": "Energie", + "hud.bag.combat_rating": "Putere de Lupta", + "hud.bag.protection": "Protecție", + "hud.bag.stun_res": "Stun Resilience", + "hud.bag.stealth": "Strecurare", + "hud.bag.combat_rating_desc": "Calculat după \nechipamentul tău și viața ta.", + "hud.bag.protection_desc": "Reducerea daunelor prin armură", + "hud.bag.stun_res_desc": "Rezistența la a fi amețit de lovituri consecutive.\nSe regenerează ca Energia.", + "hud.bag.sort_by_name": "Sortează după Nume", + "hud.bag.sort_by_quality": "Sortează după Calitate", + "hud.bag.sort_by_category": "Sortează după Categorie", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/char_window.ron b/assets/voxygen/i18n/ro_RO/hud/char_window.ron new file mode 100644 index 0000000000..08cee4aa6d --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/char_window.ron @@ -0,0 +1,21 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "character_window.character_name": "Nume Personaj", + // Character stats + "character_window.character_stats": r#"Rezistență + +Fitness + +Voință + +Protecție +"#, + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/chat.ron b/assets/voxygen/i18n/ro_RO/hud/chat.ron new file mode 100644 index 0000000000..e2d4419b01 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/chat.ron @@ -0,0 +1,49 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.chat.all": "Toate", + "hud.chat.chat_tab_hover_tooltip": "Clic dreapta pentru setări", + + // Debuff outcomes + "hud.outcome.burning": "a murit prin: ardere", + "hud.outcome.curse": "a murit prin: blestem", + "hud.outcome.bleeding": "a murit prin: sângerare", + "hud.outcome.crippled": "a murit prin: amputare", + "hud.outcome.frozen": "a murit prin: înghețare", + + // Chat outputs + "hud.chat.online_msg": "[{name}] sa conectat", + "hud.chat.offline_msg": "[{name}] sa deconectat", + + "hud.chat.default_death_msg": "[{name}] a murit", + "hud.chat.environmental_kill_msg": "[{name}] a murit în {environment}", + "hud.chat.fall_kill_msg": "[{name}] a cazut de la înalțime", + "hud.chat.suicide_msg": "[{name}] a murit din cauza rănilor autoprovocate", + + "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} cauzat de [{attacker}]", + "hud.chat.pvp_melee_kill_msg": "[{attacker}] a învins [{victim}]", + "hud.chat.pvp_ranged_kill_msg": "[{attacker}] a tras în [{victim}]", + "hud.chat.pvp_explosion_kill_msg": "[{attacker}] a facut ca [{victim}] să explodeze", + "hud.chat.pvp_energy_kill_msg": "[{attacker}] a omorât [{victim}] cu magie", + + "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", + + "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} cauzat de {attacker}", + "hud.chat.npc_melee_kill_msg": "{attacker} a omorât [{victim}]", + "hud.chat.npc_ranged_kill_msg": "{attacker} a tras în [{victim}]", + "hud.chat.npc_explosion_kill_msg": "{attacker} a facut ca [{victim}] să explodeze", + "hud.chat.npc_energy_kill_msg": "{attacker} a omorât [{victim}] cu magie", + "hud.chat.npc_other_kill_msg": "{attacker} a omorât [{victim}]", + + "hud.chat.loot_msg": "Ai luat [{item}]", + "hud.chat.loot_fail": "Inventarul tău este plin!", + "hud.chat.goodbye": "Pe curând!", + "hud.chat.connection_lost": "Conexiune pierdută. Vei fi dat afară în {time} secunde.", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/crafting.ron b/assets/voxygen/i18n/ro_RO/hud/crafting.ron new file mode 100644 index 0000000000..a7f50e5ade --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/crafting.ron @@ -0,0 +1,53 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.crafting": "Meșteșug", + "hud.crafting.recipes": "Rețete", + "hud.crafting.ingredients": "Ingrediente:", + "hud.crafting.craft": "Craft", + "hud.crafting.tool_cata": "Necesită:", + // Crafting Stations + "hud.crafting.req_crafting_station": "Necesită:", + "hud.crafting.anvil": "Nicovală", + "hud.crafting.cauldron": "Cazan", + "hud.crafting.cooking_pot": "Oală de gătit", + "hud.crafting.crafting_bench": "Masă de meșteșug", + "hud.crafting.forge": "Forjă", + "hud.crafting.loom": "Tăbăcărie", + "hud.crafting.spinning_wheel": "Roată de Tors", + "hud.crafting.tanning_rack": "Război de Țesut", + "hud.crafting.salvaging_station": "Masă de Demontare", + "hud.crafting.campfire": "Foc de Tabară", + // Tabs + "hud.crafting.tabs.all": "Toate", + "hud.crafting.tabs.armor": "Armură", + "hud.crafting.tabs.dismantle": "Demontează", + "hud.crafting.tabs.food": "Hrană", + "hud.crafting.tabs.glider": "Planoare", + "hud.crafting.tabs.potion": "Poțiuni", + "hud.crafting.tabs.tool": "Unelte", + "hud.crafting.tabs.utility": "Utilitare", + "hud.crafting.tabs.weapon": "Arme", + "hud.crafting.tabs.bag": "Rucsacuri", + "hud.crafting.tabs.processed_material": "Materiale", + "hud.crafting.dismantle_title": "Demontare", + "hud.crafting.dismantle_explanation" : "Pune cursorul peste iteme ca\nsă vezi ce poți demonta.\n\nDublu-Clic pentru a începe demontarea.", + "hud.crafting.modular_desc": "Trage bucăți de iteme aici pentru a face o armă", + "hud.crafting.mod_weap_prim_slot_title": "Componentă Principală de Armă", + "hud.crafting.mod_weap_prim_slot_desc": "Plasează o componentă principală de armă aici (de ex. o lamă de sabie, capăt de topor, sau membre de arc).", + "hud.crafting.mod_weap_sec_slot_title": "Componentă Secundară de Armă", + "hud.crafting.mod_weap_sec_slot_desc": "Plasează o componentă secundară de armă aici (e.g. a mâner de sabie, mâner de arc, sau nucleu de toiag).", + "hud.crafting.mod_comp_metal_prim_slot_title": "Lingou de Metal", + "hud.crafting.mod_comp_metal_prim_slot_desc": "Plasează un lingou de metal aici, doar unele tipuri de lingouri pot fi folosite pentru arme.", + "hud.crafting.mod_comp_wood_prim_slot_title": "Lemn", + "hud.crafting.mod_comp_wood_prim_slot_desc": "Plasează un tip de lemn aici, doar unele tipuri de lemn pot fi folosite pentru arme.", + "hud.crafting.mod_comp_sec_slot_title": "Material de Animal", + "hud.crafting.mod_comp_sec_slot_desc": "(Optional) Plasează un ingredient de animal, doar unlete tipuri de ingrediente pot fi folosite pentru a augmenta arme.", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/group.ron b/assets/voxygen/i18n/ro_RO/hud/group.ron new file mode 100644 index 0000000000..3b79e07d01 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/group.ron @@ -0,0 +1,24 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.group": "Grup", + "hud.group.invite_to_join": "[{name}] te-a invitat în grupul lor!", + "hud.group.invite_to_trade": "[{name}] ar vrea să negocieze cu tine.", + "hud.group.invite": "Invită", + "hud.group.kick": "Dă afară", + "hud.group.assign_leader": "Desemnează lider", + "hud.group.leave": "Parasește Grupul", + "hud.group.dead" : "Mort", + "hud.group.out_of_range": "Prea departe", + "hud.group.add_friend": "Adaugă la Prieteni", + "hud.group.link_group": "Link Grupuri", + "hud.group.in_menu": "În meniu", + "hud.group.members": "Membri Grupului", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/map.ron b/assets/voxygen/i18n/ro_RO/hud/map.ron new file mode 100644 index 0000000000..c4a6b32742 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/map.ron @@ -0,0 +1,41 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + // Map and Questlog + "hud.map.map_title": "Hartă", + "hud.map.qlog_title": "Misiuni", + "hud.map.topo_map": "Topografic", + "hud.map.difficulty": "Dificultate", + "hud.map.towns": "Sate", + "hud.map.castles": "Castele", + "hud.map.dungeons": "Temnițe", + "hud.map.caves": "Perșteri", + "hud.map.cave": "Peșteră", + "hud.map.peaks": "Munți", + "hud.map.biomes": "Biomuri", + "hud.map.voxel_map": "Hartă Voxel", + "hud.map.trees": "Copaci Giganți", + "hud.map.tree": "Copac Gigant", + "hud.map.town": "Sat", + "hud.map.castle": "Castel", + "hud.map.dungeon": "Termință", + "hud.map.difficulty_dungeon": "Dificultatea\n\nTerminței: {difficulty}", + "hud.map.drag": "Trage", + "hud.map.zoom": "Zoom", + "hud.map.mid_click": "Setează Punct de Referință", + "hud.map.recenter": "Centrează", + "hud.map.marked_location": "Locație Marcată", + "hud.map.marked_location_remove": "Clic pentru a elimina", + "hud.map.change_map_mode": "Schimbă Modul Harții", + "hud.map.toggle_minimap_voxel": "Comută Voxel Harta-Miniatură", + "hud.map.zoom_minimap_explanation": "Măreste harta pentru a vedea o zonă în detailu", + "hud.map.gnarling": "Gnarling Fortification", + "hud.map.placed_by": "Plasat de {name}", + }, + + + vector_map: { + }, +) diff --git a/assets/voxygen/i18n/ro_RO/hud/misc.ron b/assets/voxygen/i18n/ro_RO/hud/misc.ron new file mode 100644 index 0000000000..9b0ba0f8c6 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/misc.ron @@ -0,0 +1,66 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.do_not_show_on_startup": "Nu arăta asta la pornire", + "hud.show_tips": "Arată Sfaturi", + "hud.quests": "Misiuni", + "hud.you_died": "Ai murit", + "hud.waypoint_saved": "Punct de referință salvat", + "hud.sp_arrow_txt": "PA", + "hud.inventory_full": "Inventar Plin", + "hud.someone_else": "alt cineva", + "hud.another_group": "alt grup", + "hud.owned_by_for_secs": "Deținut de {name} timp de {secs} secunde", + + "hud.press_key_to_show_keybindings_fmt": "[{key}] Taste", + "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lanternă", + "hud.press_key_to_show_debug_info_fmt": "Apasă {key} ca să arăți debug info", + "hud.press_key_to_toggle_keybindings_fmt": "Apasă {key} pentru a comuta tastele", + "hud.press_key_to_toggle_debug_info_fmt": "Apasă {key} pentru a comuta debug info", + + // Respawn message + "hud.press_key_to_respawn": r#"Apasă {key} pentru a reînvia la ultimul foc de tabără pe care l-ai vizitat."#, + + // Tutorial Button + "hud.tutorial_btn": r#"Tutorial"#, + "hud.tutorial_click_here": r#"Apasă [ {key} ] ca să-ți eliberezi cursorul și să apeși pe acest button!"#, + "hud.tutorial_elements": r#"Meșteșug"#, + +"hud.temp_quest_headline": r#"Salutări Călătorule!"#, +"hud.temp_quest_text": r#"Pentru a-ți începe aventura te-ai putea uita prin satul acesta și sa strângi niște resurse. + +Ești liber să iei orice vrei pentru aventura ta! + +Uită-te la colțul din dreapta jos al ecranului unde vei găsi rucsacul tău, meniul de meșteșug și harta. + +La statiile de mestesug poti face armura, arme, mancare si multe altele! + +Animalele sălbatice din jurul satului sunt o resursă bună de Piele de Animal pentru a crea puțină protecție împotriva pericolelor. + +Cănd te simți pregatit, încearcă să obți echipament și mai bun prin completarea provocărilor marcate pe hartă! +"#, + + "hud.spell": "Vrăji", + // Diary + "hud.diary": "Jurnal", + + "hud.free_look_indicator": "Privire liberă activată. Apasă {key} pentru a dezactiva.", + "hud.camera_clamp_indicator": "Camera vertical clamp active. Press {key} to disable.", + "hud.auto_walk_indicator": "Mișcă/Înoată automat activat", + "hud.collect": "Colectează", + "hud.pick_up": "Ia", + "hud.open": "Deschide", + "hud.use": "Folosește", + "hud.mine": "Minează", + "hud.talk": "Vorbește", + "hud.trade": "Negocează", + "hud.mount": "Calarește", + "hud.sit": "Așează-te", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/sct.ron b/assets/voxygen/i18n/ro_RO/hud/sct.ron new file mode 100644 index 0000000000..386e5f55d3 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/sct.ron @@ -0,0 +1,14 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + // SCT outputs + "hud.sct.experience": "{amount} Exp", + "hud.sct.block": "BLOCAT", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/settings.ron b/assets/voxygen/i18n/ro_RO/hud/settings.ron new file mode 100644 index 0000000000..fe954f90cd --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/settings.ron @@ -0,0 +1,153 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + // Settings + "hud.settings.general": "General", + "hud.settings.none": "Nimic", + "hud.settings.press_behavior.toggle": "Comută", + "hud.settings.press_behavior.hold": "Ține apăsat", + "hud.settings.help_window": "Fereastra de Ajutor", + "hud.settings.debug_info": "Debug Info", + "hud.settings.show_hitboxes": "Show hitboxes", + "hud.settings.show_chat": "Arată chat", + "hud.settings.show_hotkey_hints": "Afișează sugestii pentru taste rapide", + "hud.settings.tips_on_startup": "Sfaturi la Pornire", + "hud.settings.ui_scale": "Mărimea interfaței", + "hud.settings.relative_scaling": "Marime Relativă", + "hud.settings.custom_scaling": "Marire Personalizată", + "hud.settings.crosshair": "Cursor", + "hud.settings.opacity": "Opacitate", + "hud.settings.hotbar": "Bară", + "hud.settings.toggle_shortcuts": "Comută Taste Rapide", + "hud.settings.buffs_skillbar": "Buffs in dreptul bării de ablități ", + "hud.settings.buffs_mmap": "Buffs in dreptul Harții-Miniatură", + "hud.settings.toggle_bar_experience": "Comută Bara de Experiență", + "hud.settings.scrolling_combat_text": "Scrolling Combat Text", + "hud.settings.damage_accumulation_duration": "Damage Accumulation Duration", + "hud.settings.incoming_damage": "Incoming Damage", + "hud.settings.incoming_damage_accumulation_duration": "Incoming Damage Accumulation Duration", + "hud.settings.round_damage": "Round Damage", + "hud.settings.speech_bubble": "Speech Bubble", + "hud.settings.speech_bubble_self": "Show Own Speech Bubbles", + "hud.settings.speech_bubble_dark_mode": "Speech Bubble Dark Mode", + "hud.settings.speech_bubble_icon": "Speech Bubble Icon", + "hud.settings.energybar_numbers": "Energybar Numbers", + "hud.settings.always_show_bars": "Always show Energybars", + "hud.settings.experience_numbers": "Experience Numbers", + "hud.settings.accumulate_experience": "Accumulate Experience Numbers", + "hud.settings.values": "Valori", + "hud.settings.percentages": "Procente", + "hud.settings.chat": "Chat", + "hud.settings.background_opacity": "Opacitate Fundal", + "hud.settings.chat_character_name": "Character Names in Chat", + "hud.settings.loading_tips": "Sfaturi în Ecranul de Incarcare", + "hud.settings.reset_interface": "Resetează la starea inițială", + + "hud.settings.pan_sensitivity": "Pan Sensitivity", + "hud.settings.zoom_sensitivity": "Senzitivitate Zoom", + "hud.settings.camera_clamp_angle": "Angle for vertical camera clamp mode", + "hud.settings.invert_scroll_zoom": "Invert Scroll Zoom", + "hud.settings.invert_mouse_y_axis": "Invert Mouse Y Axis", + "hud.settings.invert_controller_y_axis": "Invert Controller Y Axis", + "hud.settings.enable_mouse_smoothing": "Camera Smoothing", + "hud.settings.free_look_behavior": "Free look behavior", + "hud.settings.auto_walk_behavior": "Auto walk behavior", + "hud.settings.camera_clamp_behavior": "Camera clamp behavior", + "hud.settings.player_physics_behavior": "Player physics (experimental)", + "hud.settings.stop_auto_walk_on_input": "Stop auto walk on movement", + "hud.settings.auto_camera": "Auto camera", + "hud.settings.bow_zoom": "Zoom in when charging bow", + "hud.settings.reset_gameplay": "Resetează la starea inițială", + + "hud.settings.view_distance": "Distanța Vizuală", + "hud.settings.lod_distance": "LoD Distance", + "hud.settings.sprites_view_distance": "Distanță Vizuală Sprites", + "hud.settings.figures_view_distance": "Distanță Vizuală Entități", + "hud.settings.maximum_fps": "Maximum de FPS", + "hud.settings.background_fps": "FPS în Fundal", + "hud.settings.present_mode": "Present Mode", + "hud.settings.present_mode.fifo": "Fifo", + "hud.settings.present_mode.mailbox": "Mailbox", + "hud.settings.present_mode.immediate": "Immediate", + "hud.settings.fov": "Câmp vizual (grade)", + "hud.settings.gamma": "Gamma", + "hud.settings.exposure": "Expunere", + "hud.settings.ambiance": "Luminozitatea ambianței", + "hud.settings.antialiasing_mode": "AntiAliasing Mode", + "hud.settings.upscale_factor": "Rezoluția Internă", + "hud.settings.cloud_rendering_mode": "Cloud Rendering Mode", + "hud.settings.fluid_rendering_mode": "Fluid Rendering Mode", + "hud.settings.fluid_rendering_mode.cheap": "Foarte Slab", + "hud.settings.fluid_rendering_mode.shiny": "Stralucitor", + "hud.settings.cloud_rendering_mode.minimal": "Minimal", + "hud.settings.cloud_rendering_mode.low": "Slab", + "hud.settings.cloud_rendering_mode.medium": "Mediu", + "hud.settings.cloud_rendering_mode.high": "Intensiv", + "hud.settings.cloud_rendering_mode.ultra": "Ultra", + "hud.settings.fullscreen": "Ecran Complet", + "hud.settings.fullscreen_mode": "Mod Ecran Complet", + "hud.settings.fullscreen_mode.exclusive": "Exclusiv", + "hud.settings.fullscreen_mode.borderless": "Fără margini", + "hud.settings.gpu_profiler": "Enable GPU timing (not supported everywhere)", + "hud.settings.particles": "Particule", + "hud.settings.lossy_terrain_compression": "Lossy terrain compression", + "hud.settings.weapon_trails": "Urme de Arme", + "hud.settings.flashing_lights": "Lumini intermitente", + "hud.settings.flashing_lights_info": "Disables all kinds of flashing, e.g. flickering or lightning strikes", + "hud.settings.resolution": "Rezoluție", + "hud.settings.bit_depth": "Adâncime biți", + "hud.settings.refresh_rate": "Rată de reîmprospătare", + "hud.settings.lighting_rendering_mode": "Modul de redare a luminii", + "hud.settings.lighting_rendering_mode.ashikhmin": "Tip A - Intensiv ", + "hud.settings.lighting_rendering_mode.blinnphong": "Tip B - Mediu", + "hud.settings.lighting_rendering_mode.lambertian": "Tip L - Slab", + "hud.settings.shadow_rendering_mode": "Shadow Rendering Mode", + "hud.settings.shadow_rendering_mode.none": "Nimic", + "hud.settings.shadow_rendering_mode.cheap": "Slab", + "hud.settings.shadow_rendering_mode.map": "Hartă", + "hud.settings.shadow_rendering_mode.map.resolution": "Rezoluție", + "hud.settings.rain_occlusion.resolution": "Rain Occlusion Resolution", + "hud.settings.lod_detail": "LoD Detail", + "hud.settings.save_window_size": "Salvează Mărimea Ferestrei", + "hud.settings.reset_graphics": "Resetează la starea inițială", + "hud.settings.bloom": "Strălucire", + "hud.settings.point_glow": "Point Glow", + + "hud.settings.master_volume": "Volum Principal", + "hud.settings.inactive_master_volume_perc": "Volum Fereastră Inactivă", + "hud.settings.music_volume": "Volum Muzică", + "hud.settings.sound_effect_volume": "Volum Efecte Sonore", + "hud.settings.ambience_volume": "Volum Ambianță", + "hud.settings.music_frequency": "Pauză între Muzică", + "hud.settings.audio_device": "Dispozitiv Audio", + "hud.settings.reset_sound": "Resetează la starea inițială", + + "hud.settings.english_fallback": "Afișează în Engleză pentru traduceri care lipsesc", + + "hud.settings.awaitingkey": "Apasă o tastă...", + "hud.settings.unbound": "Nimic", + "hud.settings.reset_keybinds": "Resetează la starea inițială", + + "hud.settings.chat_tabs": "Fereastre de Chat", + "hud.settings.label": "Eticheta:", + "hud.settings.delete": "Șterge", + "hud.settings.show_all": "Afișează toate", + "hud.settings.messages": "Mesaje", + "hud.settings.activity": "Activitate", + "hud.settings.death": "Moarte", + "hud.settings.group": "Grup", + "hud.settings.faction": "Facțiune", + "hud.settings.world": "Lume", + "hud.settings.region": "Regiune", + "hud.settings.say": "Spune", + "hud.settings.all": "Toate", + "hud.settings.group_only": "Doar în grup", + "hud.settings.reset_chat" : "Resetează la starea inițială", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/skills.ron b/assets/voxygen/i18n/ro_RO/hud/skills.ron new file mode 100644 index 0000000000..091de83428 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/skills.ron @@ -0,0 +1,257 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.rank_up": "Punct de Abilitate Nou", + "hud.skill.sp_available": "{number} PA valabile", + "hud.skill.not_unlocked": "Nedeblocat încă", + "hud.skill.req_sp": "\n\n Necesită {number} PA", + // Skills + // General + "hud.skill.inc_health_title": "Mărește Viața", + "hud.skill.inc_health": "Mărește capacitatea vietii cu {boost}{SP}", + "hud.skill.inc_energy_title": "Mărește Energia", + "hud.skill.inc_energy": "Marește capacitatea energiei cu {boost}{SP}", + "hud.skill.unlck_sword_title": "Deblochează Sabia", + "hud.skill.unlck_sword": "Deblochează copacul abilitaților pentru sabie{SP}", + "hud.skill.unlck_axe_title": "Deblochează Topor", + "hud.skill.unlck_axe": "Deblochează copacul abilitaților pentru topor{SP}", + "hud.skill.unlck_hammer_title": "Deblochează Ciocan", + "hud.skill.unlck_hammer": "Deblochează copacul abilitaților pentru ciocan{SP}", + "hud.skill.unlck_bow_title": "Deblochează Arc", + "hud.skill.unlck_bow": "Deblochează copacul abilitaților pentru arc{SP}", + "hud.skill.unlck_staff_title": "Deblochează Toiag", + "hud.skill.unlck_staff": "Deblochează copacul abilitaților pentru toiag{SP}", + "hud.skill.unlck_sceptre_title": "Deblochează Sceptru", + "hud.skill.unlck_sceptre": "Deblochează copacul abilitaților pentru sceptru{SP}", + "hud.skill.dodge_title": "Evită", + "hud.skill.dodge": "Rostogoliri evazive sunt efectuate cu clicul-mijlociu, și acordă imunitate temporară la atacurile corp la corp (iframes) în timp ce te rostogolești.", + "hud.skill.roll_energy_title": "Costul de Energie pentru Rostogolire", + "hud.skill.roll_energy": "Rostogolorea foloseste cu {boost}% mai putina energie{SP}", + "hud.skill.roll_speed_title": "Viteza Rostogolirii", + "hud.skill.roll_speed": "Rostogoleste-te de {boost}% mai repede{SP}", + "hud.skill.roll_dur_title": "Durata Rostogolirii", + "hud.skill.roll_dur": "Rotogoleste-te de {boost}% mai mult{SP}", + "hud.skill.climbing_title": "Cățărare", + "hud.skill.climbing": "Sarind mai sus", + "hud.skill.climbing_cost_title": "Costul Cățărării", + "hud.skill.climbing_cost": "Cățărarea folosește cu {boost}% mai puțină energie{SP}" , + "hud.skill.climbing_speed_title": "Viteza Cățărării", + "hud.skill.climbing_speed": "Cațără-te de {boost}% mai rapid{SP}", + "hud.skill.swim_title": "Înot", + "hud.skill.swim": "Mișcare în mediu ud", + "hud.skill.swim_speed_title": "Viteza Înotului", + "hud.skill.swim_speed": "Înoata de {boost}% mai repede{SP}", + // Sceptre + "hud.skill.sc_lifesteal_title": "Raza Furtilui de Viata", + "hud.skill.sc_lifesteal": "Extrage viata din sangele inamicilor tai", + "hud.skill.sc_lifesteal_damage_title": "Daune", + "hud.skill.sc_lifesteal_damage": "Provoaca cu {boost}% mai multe daune{SP}", + "hud.skill.sc_lifesteal_range_title": "Distanta", + "hud.skill.sc_lifesteal_range": "Raza ta ajunge cu {boost}% mai departe{SP}", + "hud.skill.sc_lifesteal_lifesteal_title": "Furt de Viata", + "hud.skill.sc_lifesteal_lifesteal": "Transforma cu {boost}% mai mult sange in viata{SP}", + "hud.skill.sc_lifesteal_regen_title": "Regenerare Energie", + "hud.skill.sc_lifesteal_regen": "Recupereaza-ti energia cu {boost}%{SP}", + "hud.skill.sc_heal_title": "Aura Vindecatoare", + "hud.skill.sc_heal": "Vindeca-ti aliatii folosing sangele inamicilor tai, iti trebuie combo pentru activare", + "hud.skill.sc_heal_heal_title": "Vindecare", + "hud.skill.sc_heal_heal": "Te vindeci de {boost}% mai mult{SP}", + "hud.skill.sc_heal_cost_title": "Costul de Energie", + "hud.skill.sc_heal_cost": "Vindecarea necesita cu {boost}% mai putina energie{SP}", + "hud.skill.sc_heal_duration_title": "Duratia", + "hud.skill.sc_heal_duration": "Efecetele aurii de vindecare dureaza cu {boost}% mai mult{SP}", + "hud.skill.sc_heal_range_title": "Raza", + "hud.skill.sc_heal_range": "Aura ta vindecatoare ajunge cu {boost}% mai departe{SP}", + "hud.skill.sc_wardaura_unlock_title": "Deblocheaza Aura Protectoare", + "hud.skill.sc_wardaura_unlock": "Te lasa sa-ti protejezi amici de atacurile inamicilor cu o aura protectoare{SP}", + "hud.skill.sc_wardaura_strength_title": "Putere", + "hud.skill.sc_wardaura_strength": "Mareste puterea protectiei cu {boost}%{SP}", + "hud.skill.sc_wardaura_duration_title": "Duratie", + "hud.skill.sc_wardaura_duration": "Efectele protectiei tale dureaza de {boost}% mai mult{SP}", + "hud.skill.sc_wardaura_range_title": "Raza", + "hud.skill.sc_wardaura_range": "Protectia ajunge de {boost}% mai departe{SP}", + "hud.skill.sc_wardaura_cost_title": "Costul de Energie", + "hud.skill.sc_wardaura_cost": "Creearea protectieti necisita de {boost}% mei putina enerigie{SP}", + // Staff + "hud.skill.st_shockwave_range_title" : "Raza Undei de Soc", + "hud.skill.st_shockwave_range" : "Mareste raza undei de soc cu {boost}%{SP}", + "hud.skill.st_shockwave_cost_title" : "Costul Undei de Soc", + "hud.skill.st_shockwave_cost" : "Scade pretul energiei pentru a arunca sateni neajutorati cu {boost}%{SP}", + "hud.skill.st_shockwave_knockback_title" : "Aruncarea Undei de Soc", + "hud.skill.st_shockwave_knockback" : "Mareste potentialul aruncarii cu {boost}%{SP}", + "hud.skill.st_shockwave_damage_title" : "Daunele Undei de Soc", + "hud.skill.st_shockwave_damage" : "Mareste daunele cauzare de unda de soc cu {boost}%{SP}", + "hud.skill.st_shockwave_unlock_title" : "Deblocheaza Unda de Soc", + "hud.skill.st_shockwave_unlock" : "Deblocheaza abilitatea de a arunca inamicii la distanta folosind flacari{SP}", + "hud.skill.st_flamethrower_title" : "Aruncator de Flacari", + "hud.skill.st_flamethrower" : "Arunca flacari, arde-i pe toti", + "hud.skill.st_flame_velocity_title" : "Velocitatea Flacarii", + "hud.skill.st_flame_velocity" : "Flacara ajunge de {boost}% mai repede la destinatie{SP}", + "hud.skill.st_flamethrower_range_title" : "Raza pentru Aruncator de Flacari", + "hud.skill.st_flamethrower_range" : "Pentru cand flacarile nu ajung, vor merge de {boost}% mai departe{SP}", + "hud.skill.st_energy_drain_title" : "Consumptia Energiei", + "hud.skill.st_energy_drain" : "Scade rata la care se consuma energia cu {boost}%{SP}", + "hud.skill.st_flamethrower_damage_title" : "Daune Aruncator de Flacari", + "hud.skill.st_flamethrower_damage" : "Mareste daunele cu {boost}%{SP}", + "hud.skill.st_explosion_radius_title" : "Raza exploziei", + "hud.skill.st_explosion_radius" : "Mai mare inseamna mai bine, mareste raza exploziei cu {boost}%{SP}", + "hud.skill.st_energy_regen_title" : "Regenerare Energie", + "hud.skill.st_energy_regen" : "Marsete extrasul de energie cu {boost}%{SP}", + "hud.skill.st_fireball_title" : "Minge in Flacari", + "hud.skill.st_fireball" : "Arunca o minge in flacari care explodeaza la impact", + "hud.skill.st_damage_title" : "Daune", + "hud.skill.st_damage" : "Mareste daunele cu {boost}%{SP}", + // Bow + "hud.skill.bow_projectile_speed_title" : "Viteza Proiectilei", + "hud.skill.bow_projectile_speed" : "Trage sageti de {boost}% mai departe, mai rapid{SP}", + "hud.skill.bow_charged_title" : "Sageata Incarcata", + "hud.skill.bow_charged" : "Pentru ca ai ajteptat mai mult", + "hud.skill.bow_charged_damage_title" : "Daune Incarcare", + "hud.skill.bow_charged_damage" : "Mareste daunele cu {boost}%{SP}", + "hud.skill.bow_charged_energy_regen_title" : "Regenerate Incarcare", + "hud.skill.bow_charged_energy_regen" : "Mareste recuperarea energiei cu {boost}%{SP}", + "hud.skill.bow_charged_knockback_title" : "Aruncare Incarcare", + "hud.skill.bow_charged_knockback" : "Arunca inamicii de {boost}% mai departe{SP}", + "hud.skill.bow_charged_speed_title" : "Charged Speed", + "hud.skill.bow_charged_speed" : "Increases the rate that you charge the attack by {boost}%{SP}", + "hud.skill.bow_charged_move_title" : "Charged Move Speed", + "hud.skill.bow_charged_move" : "Increases how fast you can shuffle while charging the attack by {boost}%{SP}", + "hud.skill.bow_repeater_title" : "Repeater", + "hud.skill.bow_repeater" : "Cu cat tragi mai mult cu atat trafi mai rapid", + "hud.skill.bow_repeater_damage_title" : "Daune Repeater", + "hud.skill.bow_repeater_damage" : "Mareste daunele cauzate cu {boost}%{SP}", + "hud.skill.bow_repeater_cost_title" : "Repeater Cost", + "hud.skill.bow_repeater_cost" : "Decreases the energy cost to become a repeater by {boost}%{SP}", + "hud.skill.bow_repeater_speed_title" : "Viteza Repeater", + "hud.skill.bow_repeater_speed" : "Increases the rate at which you fire arrows by {boost}%{SP}", + "hud.skill.bow_shotgun_unlock_title" : "Unlocks Shotgun", + "hud.skill.bow_shotgun_unlock" : "Unlocks ability to fire multiple arrows at once{SP}", + "hud.skill.bow_shotgun_damage_title" : "Shotgun Damage", + "hud.skill.bow_shotgun_damage" : "Increases the damage done by {boost}%{SP}", + "hud.skill.bow_shotgun_cost_title" : "Shotgun Cost", + "hud.skill.bow_shotgun_cost" : "Decreases the cost of shotgun by {boost}%{SP}", + "hud.skill.bow_shotgun_arrow_count_title" : "Shotgun Arrows", + "hud.skill.bow_shotgun_arrow_count" : "Increases the number of arrows in the burst by {boost}{SP}", + "hud.skill.bow_shotgun_spread_title" : "Shotgun Spread", + "hud.skill.bow_shotgun_spread" : "Decreases the spread of the arrows by {boost}%{SP}", + // Hammer + "hud.skill.hmr_leap_radius_title" : "Leap Radius", + "hud.skill.hmr_leap_radius" : "Increases attack radius on ground slam by {boost} meter{SP}", + "hud.skill.hmr_leap_distance_title" : "Leap Distance", + "hud.skill.hmr_leap_distance" : "Increases distance of leap by {boost}%{SP}", + "hud.skill.hmr_leap_cost_title" : "Leap Cost", + "hud.skill.hmr_leap_cost" : "Decreases cost of leap by {boost}%{SP}", + "hud.skill.hmr_leap_knockback_title" : "Leap Knockback", + "hud.skill.hmr_leap_knockback" : "Increases knockback from leap by {boost}%{SP}", + "hud.skill.hmr_leap_damage_title" : "Leap Damage", + "hud.skill.hmr_leap_damage" : "Increases damage of leap by {boost}%{SP}", + "hud.skill.hmr_unlock_leap_title" : "Unlock Leap", + "hud.skill.hmr_unlock_leap" : "Unlocks a leap{SP}", + "hud.skill.hmr_charged_melee_title" : "Charged Melee", + "hud.skill.hmr_charged_melee" : "Melee but with charge", + "hud.skill.hmr_charged_rate_title" : "Charge Rate", + "hud.skill.hmr_charged_rate" : "Increases the rate that you charge the swing by {boost}%{SP}", + "hud.skill.hmr_charged_melee_nrg_drain_title" : "Charged Melee Energy Drain", + "hud.skill.hmr_charged_melee_nrg_drain" : "Decreases the rate energy drains when charging by {boost}%{SP}", + "hud.skill.hmr_charged_melee_damage_title" : "Charged Melee Damage", + "hud.skill.hmr_charged_melee_damage" : "Increases the damage of the charged swing by {boost}%{SP}", + "hud.skill.hmr_charged_melee_knockback_title" : "Charged Melee Knockback", + "hud.skill.hmr_charged_melee_knockback" : "Massively increases throw potential of swing by {boost}%{SP}", + "hud.skill.hmr_single_strike_title" : "Single Strike", + "hud.skill.hmr_single_strike" : "As single as you are", + "hud.skill.hmr_single_strike_regen_title" : "Single Strike Regen", + "hud.skill.hmr_single_strike_regen" : "Increases energy gain with each successive strike{SP}", + "hud.skill.hmr_single_strike_speed_title" : "Single Strike Speed", + "hud.skill.hmr_single_strike_speed" : "Increases the attack speed with each successive strike{SP}", + "hud.skill.hmr_single_strike_damage_title" : "Single Strike Damage", + "hud.skill.hmr_single_strike_damage" : "Increases the damage with each successive strike{SP}", + "hud.skill.hmr_single_strike_knockback_title" : "Single Strike Knockback", + "hud.skill.hmr_single_strike_knockback" : "Increase throw potential of swings by {boost}%{SP}", + // Sword + "hud.skill.sw_trip_str_title": "Triple Strike", + "hud.skill.sw_trip_str": "Strike, up to three times", + "hud.skill.sw_trip_str_combo_title": "Triple Strike Combo", + "hud.skill.sw_trip_str_combo": "Unlocks combo scaling on triple strike{SP}", + "hud.skill.sw_trip_str_dmg_title": "Triple Strike Damage", + "hud.skill.sw_trip_str_dmg": "Increases the damage each successive strike does{SP}", + "hud.skill.sw_trip_str_sp_title": "Triple Strike Speed", + "hud.skill.sw_trip_str_sp": "Increases attack speed gained by each successive strike{SP}", + "hud.skill.sw_trip_str_reg_title": "Triple Strike Regen", + "hud.skill.sw_trip_str_reg": "Increases energy gain on each successive strike{SP}", + "hud.skill.sw_dash_title": "Dash", + "hud.skill.sw_dash": "Pin through your enemies", + "hud.skill.sw_dash_dmg_title": "Dash Damage", + "hud.skill.sw_dash_dmg": "Increases initial damage of the dash by {boost}%{SP}", + "hud.skill.sw_dash_drain_title": "Dash Drain", + "hud.skill.sw_dash_drain": "Decreases the rate energy is drained while dashing by {boost}%{SP}", + "hud.skill.sw_dash_cost_title": "Dash Cost", + "hud.skill.sw_dash_cost": "Decreases the initial cost of the dash by {boost}%{SP}", + "hud.skill.sw_dash_speed_title": "Dash Speed", + "hud.skill.sw_dash_speed": "Increases how fast you go while dashing by {boost}%{SP}", + "hud.skill.sw_dash_charge_through_title": "Charge Through", + "hud.skill.sw_dash_charge_through": "Allows you to charge through the first enemies you hit{SP}", + "hud.skill.sw_dash_scale_title": "Dash Scaling Damage", + "hud.skill.sw_dash_scale": "Increases the damage scaling from the dash by {boost}%{SP}", + "hud.skill.sw_spin_title": "Spin Unlock", + "hud.skill.sw_spin": "Unlocks the sword spin{SP}", + "hud.skill.sw_spin_dmg_title": "Spin Damage", + "hud.skill.sw_spin_dmg": "Increases the damage done by {boost}%{SP}", + "hud.skill.sw_spin_spd_title": "Spin Speed", + "hud.skill.sw_spin_spd": "Increase the speed at which you spin by {boost}%{SP}", + "hud.skill.sw_spin_cost_title": "Spin Cost", + "hud.skill.sw_spin_cost": "Decreases the energy cost of each spin by {boost}%{SP}", + "hud.skill.sw_spin_spins_title": "Spin Spins", + "hud.skill.sw_spin_spins": "Increases the number of times you can spin{SP}", + "hud.skill.sw_interrupt_title": "Interrupting Attacks", + "hud.skill.sw_interrupt": "Allows you to immediately cancel an attack with another attack{SP}", + // Axe + "hud.skill.axe_double_strike_title": "Lovitura Dubla", + "hud.skill.axe_double_strike": "Chop down those villains", + "hud.skill.axe_double_strike_combo_title": "Lovitura Dubla Combo", + "hud.skill.axe_double_strike_combo": "Unlocks a second strike{SP}", + "hud.skill.axe_double_strike_damage_title": "Daune Lovitura Dubla", + "hud.skill.axe_double_strike_damage": "Increases the damage dealt in each successive strike{SP}", + "hud.skill.axe_double_strike_speed_title": "Viteza Lvitura Dubla", + "hud.skill.axe_double_strike_speed": "Increases the attack speed with each successive strike{SP}", + "hud.skill.axe_double_strike_regen_title": "Regenerare Lovitura Dubla", + "hud.skill.axe_double_strike_regen": "Increases energy gain with each successive strike{SP}", + "hud.skill.axe_spin_title": "Axe Spin", + "hud.skill.axe_spin": "You spin it right round ...", + "hud.skill.axe_infinite_axe_spin_title": "Infinite Axe Spin", + "hud.skill.axe_infinite_axe_spin": "Spin for as long as you have energy{SP}", + "hud.skill.axe_spin_damage_title": "Spin Damage", + "hud.skill.axe_spin_damage": "Increases the damage each spin does by {boost}%{SP}", + "hud.skill.axe_spin_helicopter_title": "Spin Helicopter", + "hud.skill.axe_spin_helicopter": "You fall a little slower while spinning{SP}", + "hud.skill.axe_spin_speed_title": "Spin Speed", + "hud.skill.axe_spin_speed": "Increases your spin speed by {boost}%{SP}", + "hud.skill.axe_spin_cost_title": "Spin Cost", + "hud.skill.axe_spin_cost": "Decreases energy cost of spinning by {boost}%{SP}", + "hud.skill.axe_unlock_leap_title": "Unlock Leap", + "hud.skill.axe_unlock_leap": "Unlocks a leap spin{SP}", + "hud.skill.axe_leap_damage_title": "Leap Damage", + "hud.skill.axe_leap_damage": "Increases damage of leap by {boost}%{SP}", + "hud.skill.axe_leap_knockback_title": "Leap Knockback", + "hud.skill.axe_leap_knockback": "Increases knockback from leap by {boost}%{SP}", + "hud.skill.axe_leap_cost_title": "Leap Cost", + "hud.skill.axe_leap_cost": "Decreases cost of leap by {boost}%{SP}", + "hud.skill.axe_leap_distance_title": "Leap Distance", + "hud.skill.axe_leap_distance": "Increases distance of leap by {boost}%{SP}", + // Mining + "hud.skill.mining_title": "Minare", + "hud.skill.pick_strike_title": "Lovitură de Târnăcop", + "hud.skill.pick_strike": "Lovește roci cu târnăcopul pentru a primi minereu, gemuri și experiență", + "hud.skill.pick_strike_speed_title": "Viteza Lovituri de Târnăcop", + "hud.skill.pick_strike_speed": "Minează roci mai rapid{SP}", + "hud.skill.pick_strike_oregain_title": "Extras de minereuri", + "hud.skill.pick_strike_oregain": "Sansa sa primesti un minereu in plus ({boost}% per nivel){SP}", + "hud.skill.pick_strike_gemgain_title": "Extras de gemuri", + "hud.skill.pick_strike_gemgain": "Sansa sa primesti un gem in plus ({boost}% per nivel){SP}", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/hud/social.ron b/assets/voxygen/i18n/ro_RO/hud/social.ron new file mode 100644 index 0000000000..fad678ceb0 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/social.ron @@ -0,0 +1,22 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.social": "Alți jucători", + "hud.social.online": "Conectați:", + "hud.social.friends": "Prieteni", + "hud.social.not_yet_available": "Nu este valabil încă", + "hud.social.faction": "Facțiune", + "hud.social.play_online_fmt": "{nb_player} jucator(i) conectați", + "hud.social.name": "Numa", + "hud.social.level": "Nivel", + "hud.social.zone": "Zonă", + "hud.social.account": "Cont", + }, + + + vector_map: { + } +) + diff --git a/assets/voxygen/i18n/ro_RO/hud/trade.ron b/assets/voxygen/i18n/ro_RO/hud/trade.ron new file mode 100644 index 0000000000..d350ae7d23 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/trade.ron @@ -0,0 +1,32 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + "hud.trade.trade_window": "Negocează", + "hud.trade.phase1_description": "Trage itemele pe care vrei să le negociezi\n în locul potrivit.", + "hud.trade.phase2_description": "The trade is now locked to give you\n time to review it.", + /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness + "hud.trade.phase3_description": "Trade is being processed.", + "hud.trade.persons_offer": "Ofertă de la {playername}", + "hud.trade.has_accepted": "{playername}\nhas a acceptat", + "hud.trade.accept": "Accepta", + "hud.trade.decline": "Refuză", + "hud.trade.invite_sent": "Cerere de negociere a fost trimisă lui {playername}.", + "hud.trade.result.completed": "Negocierea sa terminat cu secces.", + "hud.trade.result.declined": "Negociere respinsă.", + "hud.trade.result.nospace": "Nu exista destul spațiu pentru a negocia.", + "hud.trade.buy_price": "Prețul de cumpărare", + "hud.trade.sell_price": "Prețul de vânzare", + "hud.trade.coin": "ban(i)", + "hud.trade.tooltip_hint_1": "", + "hud.trade.tooltip_hint_2": "", + "hud.trade.your_offer": "Oferta ta", + "hud.trade.their_offer": "Oferta lor", + "hud.trade.amount_input": "Selectează un item" + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/ro_RO/main.ron b/assets/voxygen/i18n/ro_RO/main.ron new file mode 100644 index 0000000000..d07368f15d --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/main.ron @@ -0,0 +1,115 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + /// Start Main screen section + "main.username": "Nume de utilizator", + "main.server": "Server", + "main.password": "Parola", + "main.connecting": "Se conectează", + "main.creating_world": "Se creează lumea", + "main.tip": "Sfat:", + "main.unbound_key_tip": "nelegat", + + // Welcome notice that appears the first time Veloren is started + "main.notice": r#"Bine ai venit în versiunea alfa de Veloren! + +Înainte să începi distracția, te rog să ții minte câteva lucruri: + +- Această versiune de joc este prematură. Așteaptă-te la erori, gameplay nefinisat, mecanisme nelustruite și caracteristici care lipsesc. + +- Dacă ai feedback constructiv sau rapoarte de erori, ne poți contacta pe Reddit, GitLab sau în serverul nostru de comunitate pe Discord. + +- Veloren este licențiat sub licența susră-deschisă(„open-source”) GPL 3. Asta înseamnă că ești liber să joci, să modifici și să redistribui jocul + după gustul tău (cu condiția ca munca derivată să fie sub GPL 3). + +- Veloren este un proiect non-profit al comunotații, iar cei care lucrează la el sunt voluntari. +Daca îți place ce vezi, ești binevenit să te alături echipelor de dezvoltare sau echipelor de artă! + +Îți mulțumim că ai citit acest anunț, sperăm că te vei distra! + +~ Dezvoltatorii Veloren"#, + + // Login process description + "main.login_process": r#"Informații privind procesul de autentificare: + +Ține minte că îți trebuie un cont +pentru a juca pe servere cu autentificarea activată. + +Poți să-ți faci un cont pe + +https://veloren.net/account/."#, + "main.login.server_not_found": "Serverul nu a fost găsit", + "main.login.authentication_error": "Eroare de autentificare pe server", + "main.login.internal_error": "Eroare internă pe client (cel mai probabil, personajul jucătorului a fost șters)", + "main.login.failed_auth_server_url_invalid": "Nu s-a putut conecta la serverul de autentificare", + "main.login.insecure_auth_scheme": "Schema de autentificare HTTP NU este acceptată. Este nesigur! În scopuri de dezvoltare, HTTP este permis pentru „localhost” sau versiuni de depanare", + "main.login.server_full": "Serverul este plin", + "main.login.untrusted_auth_server": "Serverul de autentificare nu este de încredere", + "main.login.outdated_client_or_server": "ServerWentMad: Probabil că versiunile sunt incompatibile, verifică pentru actualizări.", + "main.login.timeout": "Timeout: Serverul nu a răspuns la timp. (Probleme de supraîncărcare sau de rețea).", + "main.login.server_shut_down": "Serverul s-a oprit", + "main.login.network_error": "Eroare de rețea", + "main.login.network_wrong_version": "Versiunile de server și client sunt nepotrivite, te rog să-ți actualizezi clientul jocului.", + "main.login.failed_sending_request": "Solicitarea către serverul de autentificare a eșuat", + "main.login.invalid_character": "Caracterul selectat este invalid", + "main.login.client_crashed": "Aplicația a eșuat", + "main.login.not_on_whitelist": "Pentru a intra Trebuie să fii trecut pe Lista Albă de către un Admin", + "main.login.banned": "Ai fost interzis pentru urmatorul motiv", + "main.login.kicked": "Ai fost dat afară pentru urmatorul motiv", + "main.login.select_language": "Selectează o limbă", + "main.login.client_version": "Versiunea Aplicației", + "main.login.server_version": "Versiunea Serverului", + "main.login.client_init_failed": "Clientul nu sa putut initializa: {init_fail_reason}", + "main.login.username_bad_characters": "Numele de utilizator conține caractere invalide (Doar alfanumerice, '_' și '-' sunt permise)", + "main.login.username_too_long": "Numele de utilizator este prea lung! Lungimea maximă este: {max_len}", + "main.servers.select_server": "Selectează un server", + "main.servers.singleplayer_error": "Nu s-a putut conecta la serverul intern: {sp_error}", + "main.servers.network_error": "Eroare de rețea/socket de server: {raw_error}", + "main.servers.participant_error": "Eroare de protocol/participant deconectat: {raw_error}", + "main.servers.stream_error": "Eroare de conectare/compresare/(de)serializare a clientului: {raw_error}", + "main.servers.database_error": "Eroare în baza de date a serverului: {raw_error}", + "main.servers.persistence_error": "Eroare de persistență a serverului (probabil legată de active(„assets”)/datele de caractere): {raw_error}", + "main.servers.other_error": "Eroare generală de server: {raw_error}", + + // Credits screen + "main.credits": "Credite", + "main.credits.created_by": "creat de către", + "main.credits.music": "Muzică", + "main.credits.fonts": "Fonturi", + "main.credits.other_art": "Altă artă", + "main.credits.contributors": "Colaboratori", + + /// End Main screen section + }, + + + vector_map: { + // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum + "loading.tips": [ + "Apasă '{gameinput.togglelantern}' ca să-ți aprinzi lanterna.", + "Apasă '{gameinput.help}' ca să vezi toate tastele inițiale.", + "Poți scrie /say sau /s ca să vorbești cu jucătorii direct din jurul tău.", + "Poți scrie /region sau /r ca să vorbești doar cu jucătorii care sunt în jurul a câteva sute de blocuri.", + "Adminii pot folosi comanda /build pentru a intra în modul de construcție.", + "Poți scrie /group sau /g ca să vorbești cu jucatorii din grupul tău.", + "Pentru a trimite mesaje private scrie /tell urmat de numele jucătorului și mesajul tău.", + "Uită-te după hrană, cufăre și alte bunuri împrăștiate peste tot în lume!", + "Invetarul ți-e plin cu hrană? Încearcă să faci mâncare mai bună din ea!", + "Nu știi ce să faci? Încearcă una dintre temniţele marcate pe hartă!", + "Nu uita să ajustezi graficile pentru sistemul tău. Apasă '{gameinput.settings}' pentru a deschide setările.", + "Jucând cu alții e distractiv! Apasă '{gameinput.social}' ca să vezi cine e conectat.", + "Apasă '{gameinput.dance}' pentru a dansa. Petrecere!", + "Apasă '{gameinput.glide}' ca să-ți deschizi Planorul și să cucerești cerurile.", + "Veloren e înca în Pre-Alpha. Ne străduim să-l îmbunătățim în ficare zi!", + "Dacă vrei să te alături echipei de dezvoltare sau dacă doar vrei să vorbești cu noi, intră pe serverul nostru de Discord.", + "Puți comuta afișarea nivelului de sănătate pe bara de sănătate din setări", + "Așeazăte lângă un foc de tabară (cu tasta '{gameinput.sit}') ca să-ți vindeci rănile încetișor.", + "Ai nevoie de mai multe rucsacuri sau de armură mai bună ca să-ți continui aventura? Apasă '{gameinput.crafting}' pentru a deschide meniul de meșteșuguri!", + "Apasă '{gameinput.roll}' ca să te rostogolești. Rostogolindu-te poți să te miști mai repede și să eviți atacurile inamicilor.", + "Nu știi pentru ce folosești un item? Cauată 'input:' în meniul de meșteșuguri ca să vezi rețetele în care este folosit.", + "Ai găsit ceva interesant? Ia o captură de ecran cu '{gameinput.screenshot}'." + ], + } +) diff --git a/assets/voxygen/i18n/ro_RO/npc.ron b/assets/voxygen/i18n/ro_RO/npc.ron new file mode 100644 index 0000000000..432dd6a91c --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/npc.ron @@ -0,0 +1,248 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + }, + + vector_map: { + "npc.speech.villager": [ + "Iubesc brânza.", + ], + "npc.speech.villager_open": [ + "Mă gândesc la ce se gandește Catoblepas când manancă iarbă.", + "Ce crezi că fac ca Rămăsițele Strălucitoare să străluceasca?", + "Ai auzit vreodată de ferocii Rechini de Uscat? Cică trăiesc în deșerturi.", + "Mă intreb ce se află dincolo de munte.", + "I-am lăsat niște brânză fratelui meu. Acum nu știu dacă exista sau nu. O numesc brânza lui Schrödinger.", + "Ai prins vreodată un licurice?", + "Se spune că gemuri strălucitoare de toate felurile se găsesc în peșteri.", + "Nu pot să ințeleg de unde tot vin Sauroks ăia.", + ], + "npc.speech.villager_adventurous": [ + "Sper că am să-mi fac propriul planor cândva.", + "Mi-ar plăcea să fac speleologie într-o peșteră când voi fi mai puternic.", + ], + "npc.speech.villager_closed": [ + "Nu ești de prin părțile astea, nu-i așa?", + "Așa-i că satul nostru este cel mai bun?", + "Se spune că ciupercile sunt bune pentru sănătate. Personal, nu am mâncat niciodată.", + "A fi sau a nu fi? Cred voi fi un fermier.", + ], + "npc.speech.villager_conscientious": [ + "Mă țin ocupat. Tot timpul este câte ceva de facut.", + "Sper să plouă curând. Ar fi bine pentru plante.", + ], + "npc.speech.villager_busybody": [ + "Ar trebui ca oamenii să vorbească mai puțin și să muncească mai mult.", + ], + "npc.speech.villager_unconscientious": [ + "Cred că este timpul pentru un al doilea mic dejun!", + "I wish was my house wasn't such a mess. But then I'd have to tidy up! Haha!", + "Unde am lăsat chestia aia...", + ], + "npc.speech.villager_extroverted": [ + "Nu o sâ-ți vină sâ crezi ce am facut weekenul âsta!", + "Top of the morning to you!", + "Ce părere ai despre vremea asta?", + "I'm just crackers about cheese!", + "Nu uita de biscuiți!", + "Pur și simplu ador brânza dwarven. Mi-aș dori să o pot face.", + "Azi noapte am avut un vis minunat despre brânză. Ce ar putea să însemne?", + "Iubesc mierea! Și urăsc albinele.", + ], + "npc.speech.villager_sociable": [ + "Nu poftești înauntru? Noi chiar acum mâncăm niste brânză!", + "Ai vrea să-mi vezi grădina? Okay, poate alt dată.", + ], + "npc.speech.villager_introverted": [ + "Salut.", + "Oh eu? Nu sunt nimic special.", + ], + "npc.speech.villager_agreeable": [ + "Cum te simți azi?", + "Spune-mi daca ai nevoie de ceva.", + "Mi-ai văzut pisica pe undeva?", + ], + "npc.speech.villager_worried": [ + "Ai grijă de tine, înregulă? Sunt multe pericole în lume.", + ], + "npc.speech.villager_disagreeable": [ + "Eu o spun asa cum e. Destul de rău dacă oamenilor nu le place.", + "Oamenii se ofensează prea ușor.", + ], + "npc.speech.villager_neurotic": [ + "Gândindu-mă la temnițele alea mă sperie. Sper ca cineva să le curețe.", + "Cineva ar trebui să facă ceva despre cultiștii ăștia. Eu nu mă bag.", + "Am o presimțire că ceva rău se va întâmpla.", + "Mi-as dori ca cineva să țină lupii departe de sat.", + ], + "npc.speech.villager_sad_loner": [ + "Sunt atât de singur.", + "... scuze pentru liniștea asta incomodă. Nu mă pricep cu oamenii.", + ], + "npc.speech.villager_seeker": [ + "Vreau să văd lumea largă. Trebuie să fie mai multe decât satu ăsta.", + ], + "npc.speech.villager_stable": [ + "Nu e așa ca e o zi minunată?", + "Viața nu e așa de rea.", + "O zi minunată pentru o plimbare prin padure!", + ], + "npc.speech.villager_decline_trade": [ + "Imi pare rau, Nu am nimic de vândut.", + "Sa negociem? De parcă am ceva ce te poate interesa.", + "Ce e al meu e al meu, n-am să-l dau pentru nimic.", + ], + "npc.speech.merchant_advertisement": [ + "Te pot interesa intr-o negociere?", + "Vrei să negocieazi cu mine?", + "Am o gramadă de bunuri, vrei să arunci o privire?" + ], + "npc.speech.merchant_busy": [ + "Te rog să astepți, sunt singura persoană aici.", + "Un moment, lasă-mă să termin.", + "Sunt ocupat, revino mai târziu." + ], + "npc.speech.merchant_busy_rude": [ + "Hei, așteaptă-ți rândul.", + "Măcar vezi persoana din fața ta?", + "Nu tăia linia.", + ], + "npc.speech.merchant_trade_successful": [ + "Îți mulțumesc că ai negociat cu mine!", + "Mulțumesc!", + ], + "npc.speech.merchant_trade_declined": [ + "Poate data viitoare, să ai o zi frumoasa!", + "Destul de rău, poate data viitoare, atunci!" + ], + "npc.speech.villager_cultist_alarm": [ + "Aveți grija! Există un cultist în libertate!", + "La arme! Cultiștii atacă!", + "Cum își permit cultiștii ăștia să ne atace satul!", + "Moarte cultistilor!", + "Cultiștii nu vor fi telorați aici!", + "Cultist criminal!", + "Gustă din tăișul sabiei mele, cultist nenorocit!", + "Nimic nu poate curăța sângele de pe mâinile tale, cultistule!", + "Miliarde de barnacles albaștri! Un cultist printre noi!", + "Răutățile acestui cultist sunt pe cale să înceteze!", + "Cultistu ăsta-i al meu!", + "Pregatește-te să-ți întâlnești creatorul, cultist impuțit!", + "Văd un cultist! Prindeți-l!", + "Văd un cultist! Atacați!", + "Văd un cultist! Nu-l lăsați să evadeze!", + "I-ar placea unui cultist onorabil niște MOARTE?!", + "Nu ierta niciodată! Nu uita niciodata! Regretă, cultistule!", + "Mori, cultistule!", + "Domnia ta de teroare se va opri!", + "Uite ce primești pentru ce ai facut!", + "Nu primim oameni ca tine pe aici.", + "Ar fii trebuit să stai sub pământ!", + ], + "npc.speech.villager_under_attack": [ + "Ajutor, sunt atacat!", + "Ajutor! Sunt atacat!", + "Ouch! Sunt atacat!", + "Ouch! Sunt atacat! Ajutor!", + "Ajutați-mă! Sunt atacat!", + "Sunt atacat! Ajutor!", + "Sunt atacat! Ajutați-mă!", + "Ajutor!", + "Ajutor! Ajutor!", + "Ajutor! Ajutor! Ajutor!", + "sunt atacat!", + "AAAHHH! Sunt atacat!", + "AAAHHH! Sunt atacat! Ajutor!", + "Ajutor! Suntem atacați!", + "Ajutor! Ucigaș!", + "Ajutor! Un ucigaș se află în libertate!", + "Ajutor! Încearcă să mă omoare!", + "Gărzi, sunt atacat!", + "Gărzi! Sunt atacat", + "Sunt atacat! Gărzi!", + "Ajutor! Gărzi! Sunt atacat!", + "Gărzi! Veniți repede!", + "Gărzi! Gărzi!", + "Gărzi! Este un răufăcător care mă atacă!", + "Gărzi, ucideți acest răufăcător!", + "Gărzi! Este un ucigaș!", + "Gărzi! Ajutați-mă!", + "Nu ai să scapi cu asta! Gărzi!", + "Drac ce ești!", + "Ajută-mă!", + "Ajutor! Vă rog!", + "Au! Gărzi! Ajutor!", + "Vin după mine!", + "Ajutor! Ajutor! Sunt reprimat!", + "Ah, acum vedem violența esențială sistemului.", + "E doar o zgârietură!", + "Încetează!", + "Ce ți-am facut eu vreodată?!", + "Încetează a mă mai ataca!", + "Hei! Ai grijă unde țintești cu chestia aia!", + "Heinous wretch, be gone with you!", + "Incetează! Pleacă!", + "Now you're making me mad!", + "Mă! Cine te crezi?!", + "I'll have your head for that!", + "Oprește-te, te rog! Nu am nimic de valoare la mine!", + "Am să-l pun pe fratele meu pe tine, el e mai mare decât mine!", + "Nuuu, îi spun mamei!", + "Te blestem!", + "Te rog nu face asta.", + "Nu a fost prea frumos!", + "Îți funcionează arma, acum o poți pune deoparte!", + "Ai milă!", + "Te rog, am familie!", + "Sunt prea tânăr sa mor!", + "Putem să vorbim despre asta?", + "Violența nu e niciodată raspunsul!", + "Azi se dovedește a fi o zi foarte proastă...", + "Hei, a durut!", + "Eek!", + "Ce nesimțire!", + "Oprește-te, te implor!", + "Sper să cadă o variolă peste tine!", + "Nu e amuzant.", + "Cum îți permiți?!", + "Vei plăti pentru asta!", + "Continuă și vei regreta", + "Nu mă face să te lovesc!", + "Trebuie să fie o neînțelegere!", + "Nu e nevoie să faci asta!", + "Pleacă, dracului!", + "Chiar a durut!", + "De ce ai face asta?", + "Sfinte Sisoe, încetează!", + "Cred că m-ai confundat cu altcineva!", + "Nu merit așa ceva!", + "Te rog să nu mai faci aia.", + "Gărzi, aruncați monstru ăsta în lac!", + "Îmi voi pune tarasque pe tine!", + "De ce euuuuuu?", + ], + "npc.speech.villager_enemy_killed": [ + "Mi-am distrus inamicul!", + "În sfârșit, pace!", + "... bun, ce faceam?", + ], + "npc.speech.menacing": [ + "Te avertizez!", + "Dacă mai faci un pas am să te atac!", + "Nu mă sperii!", + "Pleacă de lângă mine!", + "Întoarcete dacă vrei să trăiești!", + "Nu ești bine venit aici!", + ], + "npc.speech.cultist_low_health_fleeing": [ + "Retreat for the cause!", + "Retragere!", + "Blestemat sa fii!", + "Am să te blestem în viața de dincolo!", + "Trebuie să mă odihnesc!", + "Sunt prea puternici!", + ] + } +) diff --git a/assets/voxygen/i18n/ro_RO/template.ron b/assets/voxygen/i18n/ro_RO/template.ron new file mode 100644 index 0000000000..7a3bc5c518 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/template.ron @@ -0,0 +1,12 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for Română (Romanian) +( + string_map: { + + }, + + + vector_map: { + } +) From 5d914c4577f56faad812d49b3bdb576abad19671 Mon Sep 17 00:00:00 2001 From: loki Date: Mon, 8 Aug 2022 19:01:34 +0300 Subject: [PATCH 039/854] changed folder to new format --- assets/voxygen/i18n/ro_RO.zip | Bin 0 -> 30720 bytes assets/voxygen/i18n/ro_RO/buff.ftl | 39 +++ assets/voxygen/i18n/ro_RO/buff.ron | 55 ---- assets/voxygen/i18n/ro_RO/char_selection.ftl | 22 ++ assets/voxygen/i18n/ro_RO/char_selection.ron | 32 --- assets/voxygen/i18n/ro_RO/common.ftl | 108 ++++++++ assets/voxygen/i18n/ro_RO/common.ron | 133 --------- assets/voxygen/i18n/ro_RO/esc_menu.ftl | 2 + assets/voxygen/i18n/ro_RO/esc_menu.ron | 13 - assets/voxygen/i18n/ro_RO/gameinput.ftl | 66 +++++ assets/voxygen/i18n/ro_RO/gameinput.ron | 77 ------ assets/voxygen/i18n/ro_RO/hud/ability.ftl | 16 ++ assets/voxygen/i18n/ro_RO/hud/ability.ron | 36 --- assets/voxygen/i18n/ro_RO/hud/bag.ftl | 41 +++ assets/voxygen/i18n/ro_RO/hud/bag.ron | 49 ---- assets/voxygen/i18n/ro_RO/hud/char_window.ftl | 9 + assets/voxygen/i18n/ro_RO/hud/char_window.ron | 21 -- assets/voxygen/i18n/ro_RO/hud/chat.ftl | 29 ++ assets/voxygen/i18n/ro_RO/hud/chat.ron | 49 ---- assets/voxygen/i18n/ro_RO/hud/crafting.ftl | 44 +++ assets/voxygen/i18n/ro_RO/hud/crafting.ron | 53 ---- assets/voxygen/i18n/ro_RO/hud/group.ftl | 13 + assets/voxygen/i18n/ro_RO/hud/group.ron | 24 -- assets/voxygen/i18n/ro_RO/hud/map.ftl | 32 +++ assets/voxygen/i18n/ro_RO/hud/map.ron | 41 --- assets/voxygen/i18n/ro_RO/hud/misc.ftl | 46 ++++ assets/voxygen/i18n/ro_RO/hud/misc.ron | 66 ----- assets/voxygen/i18n/ro_RO/hud/sct.ftl | 2 + assets/voxygen/i18n/ro_RO/hud/sct.ron | 14 - assets/voxygen/i18n/ro_RO/hud/settings.ftl | 135 +++++++++ assets/voxygen/i18n/ro_RO/hud/settings.ron | 153 ----------- assets/voxygen/i18n/ro_RO/hud/skills.ftl | 239 ++++++++++++++++ assets/voxygen/i18n/ro_RO/hud/skills.ron | 257 ------------------ assets/voxygen/i18n/ro_RO/hud/social.ftl | 10 + assets/voxygen/i18n/ro_RO/hud/social.ron | 22 -- assets/voxygen/i18n/ro_RO/hud/trade.ftl | 26 ++ assets/voxygen/i18n/ro_RO/hud/trade.ron | 32 --- assets/voxygen/i18n/ro_RO/main.ftl | 95 +++++++ assets/voxygen/i18n/ro_RO/main.ron | 115 -------- assets/voxygen/i18n/ro_RO/npc.ftl | 210 ++++++++++++++ assets/voxygen/i18n/ro_RO/npc.ron | 248 ----------------- assets/voxygen/i18n/ro_RO/template.ftl | 0 assets/voxygen/i18n/ro_RO/template.ron | 12 - 43 files changed, 1184 insertions(+), 1502 deletions(-) create mode 100644 assets/voxygen/i18n/ro_RO.zip create mode 100644 assets/voxygen/i18n/ro_RO/buff.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/buff.ron create mode 100644 assets/voxygen/i18n/ro_RO/char_selection.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/char_selection.ron create mode 100644 assets/voxygen/i18n/ro_RO/common.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/common.ron create mode 100644 assets/voxygen/i18n/ro_RO/esc_menu.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/esc_menu.ron create mode 100644 assets/voxygen/i18n/ro_RO/gameinput.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/gameinput.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/ability.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/ability.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/bag.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/bag.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/char_window.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/char_window.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/chat.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/chat.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/crafting.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/crafting.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/group.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/group.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/map.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/map.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/misc.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/misc.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/sct.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/sct.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/settings.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/settings.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/skills.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/skills.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/social.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/social.ron create mode 100644 assets/voxygen/i18n/ro_RO/hud/trade.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/hud/trade.ron create mode 100644 assets/voxygen/i18n/ro_RO/main.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/main.ron create mode 100644 assets/voxygen/i18n/ro_RO/npc.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/npc.ron create mode 100644 assets/voxygen/i18n/ro_RO/template.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/template.ron diff --git a/assets/voxygen/i18n/ro_RO.zip b/assets/voxygen/i18n/ro_RO.zip new file mode 100644 index 0000000000000000000000000000000000000000..b577d038b7f40f93ed3b73bade055213cebc58a2 GIT binary patch literal 30720 zcma&NV~}NCvn^bT0*!;&<%Rk!+)!dB3X+!i~RaX!Q zSO)T*|0#JTiezZa83&}PvDWy=QDNw8M$s_NMqg|J3=Z}y&s|gkFUS3N2wT5jcppi5 z)Hd^Wv8E(~n|bHB(e_Lwm7Vkoe!59f`AWs^k8;pHtYWFw89gPqd$mdFdLvsRG#_I8 zi=j9rFHEE0QFN5x;&%=3+t`^EdefdkcOO<4&!Tu#`^F zM$~=GbRviLlVET6H~Dx;jf#*}2FYx>s|#vT_#Ce|E_ok)C zt3;$p0KNsZW~50NJ*om1CY$LcHl?Jp4WmF0ODllrICMyuwZg^mQ*3@>0Lk4RKopSz zq1(k!<%i)NWpJ%T=nLT~|dtdVA-W-G8Kxxv3s^yfH(gt*#PJ|y-)MP?t)fQYT4^&mWDdtYi7D{@qCZK%+ZzP85sw4wAOJLi7?U!=J7upt z6@@0SIx*JHlmdTYXy?Eclk_JH2v0*|pwm9yDs5U^bY*=V&i0Yg3PyT7 zA0PY7t1%x-S`UJB9@>NvRdWX9sXAW1G##rlQwIVB>1=iL_(c-VbeS(9sw zc}1&&+}72_7mnT_%?-^60ON$B&57ZhrR^S)&Il?$TS%c3ISf6AId-XP<`;AB;Ik7{ z%{(2Wn*ZdMerC2(H@+?=l_fO_AvI3=(h`AzkL|S4Vr?bM)G4w!xk^oJ`hfi{aO-_E zJDaClQNF7NLd;S&iDdNz%6~_;ZW`IvF+qW#KU$Gxa9$x*5jrruQbyR)Z%=38MBNT} zMOJWmDM?>U+*j;#8z<^$mjkHU*o#ElseaWkxC_w~C->wiuKK<)e!AY2= zAna3hu9?nXLefi==^5WfAcn({2b=oZil0OS|X#n7qh^yzkQ z#41c3@bB9fhP(EO)Jkga6w=@aFw~;AUIyEtv4AX_CI#$6)~xJ6(D>pJlnLb!NCk7R z`T}e4WlEEKMv7v=U@$ba=0#nw!b{&Mg5=`1LScb62QvWKCc&@96NRrAiB|HQeZBbyZd)P^8A@jZKec23LDNX@%2_AXj0z7>^M+`FM zopa<`hDqj|0hHADEP)-;bSYOnARh({Pn-CCirAHb8-WEE2VaFkRf;X#+jWd^N++Sv z{PtY9ZB{r)e@9LJ4!JpmE%Dn-+fJ%MAZ8>ulNnq4N82L8I%2rpq1I;!ihV0UwVW7u zh_yjhJle2Um1yeH)25rt8-{moSpdn5wic3QqTUVqYN07eY(dB|FVQ^SQ9&>_F742x z-qWYyyanF;>uutOef&wvq%=z;|BmGpq1y@!$_SQ4!y0@(aKb`P(mHSCX#uCMR8#-4 zf-UYBW8xM}pd(D#oUb0{j$YrfpBIVhHYOGo>7t`4wIvTMycEW!tQ-$7idm~nWj8T~D6;7tQ8_IxO-W!09A{$3mI0f)1EqX*WfxbKp@(AR1 z>V&WkGn@g3{M8Du(I_Vkpx_*%vDBACfAD_UXA$KcMbDQu*Lmo6m*m<+yB)Rg30o?# zxoR0nB8Z{WxwBbha*(a&yWTWtPe)_ zgbxFCI~Hj=Fe0vA`c6Z?+=)6~RAlPl5u@G5B~3mu&n@Jbbe!$guuA?t*3(R33#!Ix>~E1^?4B(#rJIg( z_9MBVNtMSRnP@DJTVp5_ikI-hM>;j<)%kVH#!SB*Fq3+?!#~l&eXKvAi@iu2qCyxi zA-L$~+E%CuojiEy^T6ZW`Gc=(^_p;>(84a2;8-DiKHR#}zbH-kpRIx8hAZ!;9dWVO z-o3_z^GuoxE5bKn@pL!c`8^?Np@Da|$u*ue` zYLgvw$PACA9lK#P`mL1EiP7qL;_kF=5cWfu;r1FE4hqX+`)BhBovCus!%4;mJEE|# z!F`2FoP)Cz3q5_zAhN)3YTv;X49}L zCE*{7aLJoO-x~GkRyFsn3vQEv2cCA2ux#gd>$2-O!PrAmV7nnkI5{AnBEH-Hq4H2o z=IlCy_ZurxYW0TmE@h0_-R#!XrQFfvB?n5ApN&uZUtPvQm$pDWr7FuV!WfEh8{rtP z(JU6=MNjLuuayU$2k_u6R@ZI*gJ=s*(od(jKp2EiT3GB?j=%L_ZF^pVg{-S;_%5Pm z;g^jEJt``b`NhU!`GtsW`jRz1+pzN00v|7rek(|WL*zLNqh3G(0Q}|3|IDKQl5wQ} zuxJ-kTL&9M7t?>kq=Elf1c&(hf1tn1pXZ-#<;Imm(!*M+Vm-P zRwA+#tJmg0iqxTFtZs{6iYd1$YarP=o8G2?vT^AIxn4T6e}Bjauu{S7hO-@eKNxHc zaI_J>L;h)=cVX4|^TtSqO;1~cXrcN@<*uLNYg?VaYG0+gpW%iK?bdeuh1l(HrLXSa zRdzD0T)*DG)oL6FPUnSwOjWE@q>iA&?{XFAUDoQMl+D*nw9BS;E~thnt9AYSy7ue7 z1aRkNr*b|Sp`xRAEn}+L+1*WhX{+&lwSy|A<97Ggew}h_aq~cWZn>u}-jvB7-Gp=8 z3{~COU6ZrTsdU~pw6|MYXyj~FtZT!3-hI2c;=r}g^%r2#K|E&_mg|X^s?#&oq zG|_sIqbXwh)VO!tI&o2S5?flwwTRDIX8Gb$Szo!FTUCugmXR67wVgSrt%}uGN5`aJ zH9>vVpm&_bl-XyqX}N3_pX&RB_B%bY90gwA%-a1$e++>BNuCc<%_65}V;HJeDRjC( z#mvh)*XWeg#nQ)g_?=qWXvkp8!oDI59=ArrpaY^eOsi)A%kh0h$GrU|R$X>Gvd)Io zPUoITf85p~zGkWPx%PX3YVA9*fAMWZ!Q}I)mEy73&2KW%syEJvoQU|uhw=hdc zy#>0VZQioEr`3DI@ar3`f%xE_AWs{k-O&`5^D$x7y}(yo-sT&b+0x7BSX73adFVtwc~)hvKvqa0-W-Sw(yu0QU07ocyq0JUb%H>#2(ZYg{*6ur zPgrzo)eV@ix2qqTMycu-8?Dx^urzdiRjhREpQT>P0REwS@TK{UJ)aELffxnHEPzdFnRiG2|uczUcd%Coo-dAdcPRMhY`~- ztlj$kVim+A%2Qh%@nJ+&>H7dQkWu|qV6W0s@={%qn6eUG?_1$Z#c&PNG!L-IidB8T3QOqo%5m~54nI|E3R@~jFkNa_R#-<4c)gf zp?)W%Qbo`7v6N{6-VUV!ZeuO035&XCBMp#IFE+b0|8u*PZshLXtp-N)36Pq4(q+(Ap~<6!rzVGye|?V=B}C(n zgIH^K?GaH7FsKqCif2(&6|9|7G_AcgAB3hDC~9|ir++clmKKhsFvJd_Mj1$Vb!Hux zm)?T?gA<_;4lZ|*ai*Hb=|x9ZN&Nt+0r9GUt^_1VFD0IXukE_|fSx27TSy674uZL$ z`4iAUVCG=mL2uR;C;)8?6a`@mh+}7@^R-A^BY2n%LQ8gGiGkpAsO>#*K?zeK6i!dN z^gWriU#(*oxRgZmIsq_I(@Id52+lRUIZ#8uW6cuT32akA0tPNd!+NbCyb+-iWKym| zJ}C+lM*0L?^~U~9`F2reE=ykbO!eX}Iw|v3CISatn!_G>aRBXA!prFe*q})K3Z-EI z3;{``W(j*r-Sr23>LTreN$bh zO4cvI2oxW{LOf3cc2Fy^c1+vo0F{6uh>o#>VW|9SzgM~viW~E#Y(=F$T-=))&^Gi| zodjEOuL|doEgP;c8L-2wA2a7ZG^f=4QbXK1&(2aclMzO1?S@!accc+kY5|VQdBpOb zY))2?TuXXEK?XDeD944kl|cuCFh=0aJ^+DR(K$Gr@a&?XqA`gB(sv825*ZFYtC~xs zHn``H0}{Ab`Lx&Q5uPdQnThAQkenFmtmDDurPFVAQ8hVqu6O{5F&MnlIW1&4t8gk) zQbZfE$HHYHWa3+?%ga9;fd44$?(A?bq@>U}*tnX^7_4fpr=d}(=Fp8<#1W<22nieM z@!}s#CrROfc(aIF1=1}c988Pb8vM3~P~OL%a?RZ=2@2A2Y!IS_`h)4dj8++Qlz_)2 z-(sjNU3vky#y!}syAd66+c_nDd1+z?&rnOuz}GrOEG0tQU$Tq|_3*pGZPb94#p;qQ z!Sc#wcV26}AN=q!mdv%Ww^uL8P!ssMzj<&@CODJ9LYp$$pwQ_ za+m*@IChvCyJEf((zqe=#*C(xg;gbiB3{~E3M@H1I7AVv(e5(l)xuz?4I9zuY_VD< zFi*kP)#{kr?_WjS#Ib}=cd%skPlH%-GEf@r?2@K)7sMQ$-_0@jAkS3zxygz1Ogi(L zD%5IzYzJXHD1lM>+_^gE(F4u$rLAZLwH-NtBI;b!GSW^{M~-eIpVy&;Ucm?f-#YUAR*%}hF)oTnKN59xSy9R8Vw$fS_Bc?SB5Cvz%`45z0-Q+ z>5^LDGYTq!X~j(oy4OApEri-qHaIdK{RVHt7oD*^n09SAcfM`j!R2sqWo&u`ZY~QD zxH$6HUWbarCH^HbDmbd-^2>aX!Yt^ogcbU!88u;>i14EPTHasJ2Vddnr$hUT0pe*L zNia-i!jmih;WFO#0u~J%s6gQ6NY6A#$k8wf{8k83LWK-Ahl43fYgng>LwaI^;?&46 zU{aV{h}0%zwv{fO!XwYPsEfrhJdrph(8)21gq%DO%2A|F^a=}fa#D`Am*_Tr>u#=# z8N;%b=J5uREinZJU5eRclTCR9Ws^egKCO8=JXtzdbkEsO+;Zh<;n2uq82H{L%#PDE(@}n3$%eb&X~tN|@JV=hWZG_dPAN1!dnG`xKa2W6C_DSE zIgHF|mA`V0ymKnxKcH;Dj_~yva5yqOQt&^n?^xEEQAffZA8LVfS~KlJK$}26B-sV& zMqg;jV9LW&`38ZJahcdyIs0>b+%=NNo|_U~w2$LTate}8dkvdOKyJ<~h;oM$?~okm z1z{r3o_J&u*zO3v+guH)(A*Xu%9mkw(}YPKB>H>l6 zlOitw!V_E7aS-&24NU7t1}jiETwQIuT)7^2($;U)@SkcKEJN_1_3P?9Pauso{P(w- zkIH@4PA>dX zZL8=?e9*j5$VSTxJ)vVs#bqe`_i?il!J5y_waXM5F5z!$OV06iQIm$fX9jFC)Ke*H zgg^25VZXMD_PTp;di`2$A73|ue`!o&5Uvzz)Uc+YlR*p;T?=!oR0S6fX*O~PYzh^$ zD~;Bl9Hn1AfRVGeOj(CL-h-N3M%UoW$ALAR7^=mYcJVrI0arqRU`4*UYE+nl^X%<>#*$ST3331N{ zFelzTZVU3fxmYL$V%bSY$(@CvpG+$3`oltM!5TLi9vcvyaD>T^1^!z4vM!bh17bCr z6BNyy2|=gZ+~efMIuR`G6LjZx?LsXEb_ zv|7Iq0oqsszL+1%)US@_I&~;V%=mpR3$HY^VjgT6lkUH$?5mvlaJh{B*~#4NLCZ?n zmQtpARsdMEc?4~tT^0MHJ*e&+C9rztWWE(@mab}OzEEmvRcu^Y;N zEb%4-6RMzjOnL_}#m}MbXuwGJ%r4J((#VQ_TgePJRr>=3FsxR>pzn7uDE9~c zUo~5t;m-KH8-?1wX}0^b@?}%HdIa84uuh6+Zjrq-~inZ z8ckS;Kq;sQb07$|%1!-+quq8=cP7H7$sE7o5I~1WbE<)2Gr&e3MeVTmrK*#!Zi{&^ zWTIWbd*%n^C;Pn?4MfSAqKkv4_mjcrXojNJB03IRhy?{lZtDZ}q5Z3StSx};Ib-lG zt?S;;DEyy?VEzkx@>rji!Th#&UtqiTcjmC))dTtLua98<^LzAIpQgcmHh1c<-&NPM z#jS$zQX^nFt#g|KGTP%US)H5Ij!ClKg6KMphZUYeeyw@q;BHXETfrt38P-d+1~`S{ z8RNnz0|z__Puzy7guj3#Xg=ebY(IeA&UoDnY4jaikv6SK;gY}BVBAKJq2mO7Epc~y zKRkT$({+GTe?Azm^PMA3cef@w!wf<}#s!&^rAI9UcN8yJKvu~Fp+sjZ7`uERkkNF9 z6}bAzpCby7l9xBgSTv$@X!HT@GJmMp){!>Z`(Zi``&OrsE3v{Y-Kn`eCNtYa=*3>9 zd5$T&E-`USd}xKb2$+hV8b&>61geL+E>*=Z@-G@t1$z8o-As2o0n@7S!IZXAv$2`F zR;`{LqTAS%wbL~pP^VoBSjmc(7`H%z`-y4YBE<$D>uf}uhRiXZ*7<2baazQQx}~R{ z_$^hLme9NiQZ}3Tra&6OdO2wO zxQu-_7KHwX$Rhj2|$EcrsnraD$Uv&pWNME%oz$ zhKRN>lzX&PCt%9?`7>LGs7(pR9isJx?Qt|c&s4f?cRm$+aXpyemP@2?hc|xtH(4jS zj>6#t}}IOT|*c<=~f zdy9b<5_8oaq4X6wsu8ZQt~#Qu*DmrEn|-pa{e-?$>8oH7v#nFc#zBf*y1|dz9=n>W9)X7ljbQmju@B@ea?Ddi8I^D%9mY4p(e?z)=M*__0PZRlX;Qn(+ zr^5mOAp9q!jqPo1?f+dXSxwprn;l{M10@-_-YF(QOe&sE~=&eb`8@m&V%Otm$jT_RAv zp5dWcKu(bFmnk^)&wUu zkMiT6i_IY0kT1DXE>5FEVJh_b(XA-^ML*|ynm`qgQuwbEN6E;jCx=Xo>EV-kD-vj( zCh^VptzX)ty2NU~-Z!ggqv!JY$$DlBwzboF*6dabZXRhXbjhn9AP6D%5%(+82e!$* zx3*qd1C*AyC<)bg;Zp{+RJbLh@hB868y|j=Zw(JjlCnwxXQH5z1JZ_z)Zu7^a_KhC z!{wUjdR-A?DqUlG-5#YnKTG4YU_%tB8&|g{41KqVqhoemRs%C~00*Xw4PVYk8c3TT zDHIR$yRy$M5sJnv1{(4FjLmhYC zdYjAhbtPLl^(fx6e{_nY@Przo$xO9RV5<%nMIBp5B?l7U=?e0%2INEdZK;U-&h*f; zi&P&nXnfs$ER8X*cV1k2{b+PrqXI4tDz&xE%A`HW|KQRe3YC1m9@4^^&WtHan}KfVbCNw zh@`S$K*zzlT%Xc5)v_u1@U&tdNSmP}C^zmnpHUHl#w$VimaIKJnTMOvsFFPcI8{K0ywuHrf9$k8MSPkoK_bgL1 zb4EaR-Lc;IIO|jZ6WP*ytx1I4N8Sj(Qy?n6Tcp6Z$+s2kob_XeOAV?10hbW_E-aZx zS7`2vu;ESeSn_@e!MDz!Xf-8k6*oKr^!NgC4F0&hwqqB@dyTit!B7X2^%XV0p*iQK zk_UhFvuzdgcc1nTES~}t#o*0i?$nd2%*GgKz5Ec!!>XU#cq{K~cZ*@aexMJobZsX# zA1R%bum{Jh4Me1$G%We@l`o6z*ibU3X(So~~tB37S z4M`18*!F$5j9ImFr*Sf55HgE-L?SisQ|K2AX-21%RcU*`6{gW9ox{BMV~ID>k&=39 zAB=SoZI<$J%3BRLr$CaCIF!DmsGL9@RWqa}je6;mj&o4d!Hd_gyrHaa=Qaz*^9!(D zyDRtM8cOcaZX}G~Eg4Q@)|u&NA;|S$o@xt}RO5?HnM9zSHJ+|M0mBnHt|o_ngE!f! zPZYO{HkI}}LO10n_P-QI%=B%%JS{G!4_1k>O`0Nh$ItN4?n)pzwZF=Sg7-M%3`YkO zo;b38lbg$RCOSdI;vUFKXgWwEfQebz=gA=-x8pR=GjqUPTXf9>FFgn(U5uVvs%Cn? z2$7{yPJA5s4gELM0!QAMz<>e({LQEToM}D5|L>6Fb7-#FafrK6m3E!6ExofPe8osM8GjU6 zWZSwfe_ z4!ddk#XwUS5U1l> ziqanKlSBd>W zR#q>8S6hLt0AuZy7N1Mx9*Gv)t7q^zB!xCcnSBrk*1!j=LgY)b_YO^{_(!6NYkNFF8XqBHD+(gEZP^? z-;k>sjK)X*LvH>C)<1{b00;m8#{ZHV3qvP;XHy$fV;9SRNpe)A?T`ikh?c0RVI&{m z5CW6LSYt}WO~sCK8}+kuyr5Hxw@*K%r;_U4Dn0qU)W%#2$U<#sB*V?eDY0zQ zs*W3`bvVchF(KE};2OX_5nF&EfX0qQ!nOC7*~-16*8-5oF^_aHQ4qt|gQJ_0@JE8d zmxS4ypK%?t$-f|h`%mM3^MiXSEnj-PoLYtWD>lJpX2+OUTWLDBmX7}b^E z)^1p?qO9*YkkLPP&3BQ0XA3c(N_OtDnp}~>OcITgBpoOvY;LKhQ}a^|Bq1b}3U&N` zZL(CYDJV-?O)>0?%hD*CeMrLR+*=o?Z6uQ69_wEyVbj*ac{W^#3u4`Qzqw{gD`id~ zA81Twe1;kdUqZm{v+zs~B^p8&avZX)yhVm-)Sdi|U=+L@#aEH?^GksUqOEiTN( z>6WtiM6Ghq6Bu?=QbGFzYzyCo5^W`OuO(vz1l$MaHUwzj%{KwYAq@DlKSNLIPfPfJTg#@-#`?CVcCP;><4e=Z#m&l2Q!h`C%g@r&D%Pty zNXpL4O3Tto%2snNRBIzH&L#d!Tlysa)I6GcMW|CGyX}*n@a{h4& z90I99M_BZa8-HE-XD5CBM9=@~d3{?$J4-WDXBRprd%ORPl1BXVC~2uukK7Og!p%F-1_h zBU4xI_OOGwlF9?9CKham%29u61qu%`hmInc($L}1kq<~m11eKBX?mGid!BqS!Gl&G zX-w#_Nr=XrLlpwGIs*@G+o##{`nk@B=-_sjNw7H_yAUc^RSVi z_H7$ewymJooCVBDp4+YEDI{u(katRJ;3GAmVRr7Y10x1r=a(=h+hs+JZW``%xp!XW zZ*+j=q7o^$X8g8l(5hsa)$h8s>f+Nlmni+t7F~UfgOM`7fdeOwPNdiXB_`C0_WB?; z8Lr|P!<`_%JJ`R6)r@9PD+34s@b^gmzr*@-YX3Fz`}a50f0CJntI7Y44*x&KegFB; zVgIDd|3&6sJH{4<|Eh+Qo7!NvDF74p!UqcN;)+)w5MHF*1}BN zFqn)_tc_PdZwT*M{g8syO0p^0gi-(bh&-N8mTiMxCa789dqMU1eKqd`FSj1QPxDneX2 zURj*!a9)9IHL4(PGOO6NU97J-NXh9K6L-ZE&1RNab&0ZaWWKSD-)D7pzE6Pvj@)f5 zuezD40FApQwv5#T8Fsccex%4 zl0iC*@@^m|Y>{b$dO`Kvpmoy87x-)wvKh2Y53W1ke}c((q>(}qbdr{26@MgTBUx^# zbry*g2IT#`{Tgd5C4|f4jY|yKRd}w>;exJv#_@Vtffd`jyH^6a?FS7!u#iP&AaCjF zpNqAT;1v8 zorX4{DP3Oho7ts*2F6!4)clI3nIQJ&rLAo;)S>=2bMWMAwTbSwvu>=8-L(2{I&W$t zFfR_~L{WGJ_QRKAAJhQd?WE?bSXO7*-u3uwC)4B%&Ga&!G^flEhgls-nMqTU{T?{u z5{z2YAeQScj$3|Op|m7@`uNVmwEkbDqYTgM3H`~Pe{uNF2sQY_qY?iL=|+a;|0Z?% zstnj|GQjk_P`j+PdAp;;j<%ztn($d38?{uFTo!mg*ejy$yD>EXfgts$gL zV1}FsE$$IZexz6GuUr&p#T|(=0~(y0-2gsRLEPl1Upyj^d4?r|x5d(TI198X<6~+o zNK=wX23HQ)GGiX9RwUmPpdc_2WVUU1rzot)S13Q&sdFTv+6k(=BTIZ)Q)z?PSr;Vtfa2NiC{*!YyA zdkiew*mz=fKozMQ5=xg;39J%yP34jQcphMs+N85K=hS(Q7tI?RR|6EkC;y>_F^-_6 zE2Otx!#TzwOc{V+^Mk*JWlJ+F& zuPKf$yoaUQ&vpy2ua`CFuqG_X+S#w#^CL_?K1QOJ*yHL${Nf(=nJkcSCpUn;(YUNZ zI0DU>+mC5?1cq+#f5yjPvAW|W|KRj58vhxmal8NkDF201XKPCv8|Qxm)f(;TzgIDO zKPVxH0c{LOUqPKTB-o6GnLz4n2m}HE%d?qZ>t~4!Sb6sY)?`Yu@((B>8s#Q?e z`LD=6%uR>ZmjCEl;|4!Y-t<-TvKTq+&2qUBW-8bh{Br89phb97Forjr~96 zQStd>Bw}A*27sdU`##k_rrCG5{NBEy!G6!f8_r_4#Iwop7(w7y*PeqG&`e)c1hpfH@dMY8Jq z3GP(2noLY6Ur}1FR80legk}%-te4%m`k7M={ow^5y**%f$1;@CJXg?HgYk0ueeSMl zIfPZ1W0@JMnz%T-8`b=*-Z@Vu+AG~AOv$;8uD3c^vdo{nXG%5H2rVR-BPbjmU$w;7yM{Vl{YV>0s{hu6wk=DTxhI_;R!$pio1*JI?C z!50S3FZg=aR9liLqw^Nr4P~Z%oWT(}*phKbFc&2S6hz+Q16yz6J;e7#hDlGL0+3&= zecV)t%=${qUa#Reg4@rQaAyEsHh}v6mCA#u2mQf%!f|4?Gjm7Xf{`|2mGX1_2>YC z&+qe&>%vq*eBJotMaji^k+*FBiI3weB(gw}3i>XT(nhzxSGe9;KzFq7+)|$;ucKFQhfK z8W|<<*fVbKty#2isl2&xkLAmc$l%sntwRzDVaqu+j=cTBl3y#BaGGaSl3gka(#x6w zG!Y$IXep;S>6|^Jb#D}-yr(rtlg(?xn7+&1dzAcwqv6iNoYdNE5H52xg+3KmYP_!I z1Z!0O+Xq5Gf|OWxTUpN?=kpiVXz@0`p%~Va*<4o;z8Ur?KHsV_MRG#1cmRJRVPxrg z=^YWr71@G>JOKM2m_RI1wvvQRuEDh>fDS-Zq0EU~axjBxLBS9Sh;|1}3t~${f-I_S zfZAt(7*WiOsu}VAi0`}=f+DYzlx1u#V3Cdp4{8Wdaq`x>5h+o!%w+VRWeEG3`JgPa zK)eEFNZvBcMA8yFGu3BTG4*Imv`0z%hZbozt?wGVo_JPiRDQL zuxg=n!`WSBI)#>_lPj)#Fu4**(;LSnW4$KIDza;x6Ki!&aYJf`Lji7ZAaW#3JRPSV z4166~sW*^?{4=DtKjE2gntaLbA&(akmyxgoF-W`|Ko9tyma?}zLIh=(33u#?o$=kzrRP8%l?No%=d|O|hF7@!49p<)0P-E*d81SVUOjNJ4LfX4{}afT zwnE2bSS)cY%_-UbZJf%X(||Nx5cn68n~Q?vnO7lp@srR*&3U9`so6nvhAsu3FS>m@&t;731Qh>(mep0dw#B6pcHzJCz4hP6gMl{a9#NBMwc zL>ivMDZ>5zwj1*DJC#|2UjG3R-BFZ*?k`?$M{ESgpI4>4xdLZjp>}hL@O9*FMZ-pL z*{sCn573xgTfi6YFm)$K4wxW%L%I5V!_l z9M7qDg@C-yS-7Hw)>lN{(brsIzr;bQ-83DHI1n8Y4utH2kHI!1&VaATROZ;boPU(@ zzRdnAH+BEMCt8fyYFodZlK=tP7GqP5hbXX8H6iLw=DN=Y0Q>|`NB1;)hMX(~o82^y z9kb^GfNaBDob3)ndx``t(ghgPBWP81#%VK|bREfL9h3$Hpu_=pA!zrrffb0_qb+V? zV0d%_yNXNuV@3>WG9a>XgKe~D=|ll?M@D-I-vIVqMQ2i3+zir^g=ao07dE5T1a0FS z0}KWWAskxc^HU=NWBReaa~P5E0)2o)qGcN+aWUy3a#Sp3UecwuQ+~gjnV{zP*&p*o zvhY91i!XB-$leCCeY0rDmKw&t7V^HrT_lkXb0ps%mkv!NFBTp?@BpRsi(2}ZN#UyV ze|@Y8IVRj7VdcQUrzJ)rK@hiz^!DU8zN|IbFj{q6n$9c&`gZ&BU-THyCYodyXg&~5 z6}BUXhDt$gJMUUvi}N~;U^p#MD}Qzfp)HuOAM&g;KlaBuo)B>mhjy}BAFHa|7L>uX z6K2A{q^Ll#1CPw^J7l?t^#p*S9yk`T{&+qv#2Lnoy|YdAvcS4JsdHuePn91_ME;ms=S$D_I0z zw#1zy=x-wJRqS~1-waa67@DKvq^EL6FxE8nogv8J91Wp8MYePgkkel?rDz=|$Q)6e zO1Z%DJu~nbqUX4)q2o$}u_O*Q&vGKuSyurjZvvJWzcytl+MN7k)GM7Y0jRmpERzX_ zvgUNhQArA-sC5l75N7dARP5VZmVXb9aA_b;SYZdvz&i&5duv^) zlM`J^K+cd9<|E4yJfE6>I_Zi>7GSXA! zz#zhq@bYy($1gUOLo#36OA~QVtdxK1f)&O>M&1mWN_$d27(XtiqhI)JJgu-{epusv zB_`S8T&6((=*8Mq8U^?4I5Z$xubg&G$#?Z$7;lipw3cbt5ywzhLVU1v$rb(Bsp9T! z5uEYtehP_B_d&4Z3%^l}=f84!tWP1ozb8okFm@)T-|l2K8tQsDYFSP zM^kMaQI{eF6hhbELlyZc;923i6zo_ESPp6JEb%HEuGBW_dH5aND;0iAz#Crf6B)V? zY}bEz({N%DT^Fc|8V}34iqgi}(5soBY#1NrObr#wE||H&iJsVfyVHB$!Y%Vj2Dh_j zOMBxCIv#zB&vy9HG#b$nb~W0`UHwWvV@SaxHQQzn8tM`RmiOH>slLESJd6G+=^iPc z&zH*};W~Ih2geM%8&1xt$~;52nA1GK*|vc2Vz|?DXPv%`_RNO6ouq0c)U%aR401K3 zj%-f zOnC=S&+oAKdC;DbJ+Hi0tes7pm}=5qGvXKv`!&s_n#5nBtoN;mVo;&G^Wz56>5}j& zb_46>;0%Gk-|-4{J?2fPstbc+%QfD^Vnllk`RB34Amyfrb>_YQ&?leZ_?9Z;QM{r` zt;t@jK7T+pLnwQPK0Pt;vZ;bcF+H|9DFsifBO}U2w0Qf7M{#jCa|0$@V z{+FaOG_tg@bn*N*nkqI~)()EyCiI0Dl%AnO5S?xg0Mx2LV3Dq|n6-IG1PSzOEmR%w z1VwC~&M81|u<4G|DM{%tpKN+~%!~oybxi(NQ7i{}cQ1z4ylknNg*uu{LMlb+a2~Nc zyw10cV9FO<`4>*qPa2H#T+TW>N=#LKQ5^(`5@q!9hTAkA7C>eG%>E*@B_f6cXB25` zFf|~ypL*RnscJ}@WT4ODQ@5Mp8RuwPLC4Pnr%hSFTPg0?i|(;NHorYg`hEva(FI`k z7ny9>G6hp6G^5A$@4;LBxmCa!#)b~9jzof{{Tg!s@Gx!doPCL)o(ZP@9%owrlL$of z@rJxuZMgZC3&<&WM$u>FL38N>39$^RWdLGQd7d9<%3|;S`=!N$R6&`4X8dUMLq8SK z_&)XCsQqH|&8*RCA@)d=^XIeRrFf&4)|*W-5t!WoVKBAYqoh|wu=v6ZM?SlAT#4`0 zHdMMx&f9o$jd~}_BinYM0TPk-a%iu!>rWPA*5X&U+c`U8GmZR?Yi`{i9A<({C{872 zp$(>e0BdogkBwZWEScw=Wk004gh^UqM? z{!=gg?<$hB@xLl_PEyFu)5_7!%hpgx&`!uqOUtR&t5&EfNKQ@DPg5&as5;b8>`eqv zNllE)&wx#EzrAvEhyC>e90Dx{jFkP)zJK@rXRmnvTt-9tFMvCny0}={ng6S*L8|7o z-4+K@@2&D(2Iz`s0O<4FVIO3I91J&Py*D96B&}l>Qp>01Xzx3z8+)5)fM?|E-snc1 zMCEpoi99#N9Fe9fNwli|S3Bf#Wb)3BS~v2Rs}j_#uVCG>x;~ch$=q|26~0Qf)Wy^t zsZ$R^>;~nLJP+m7ED3p8?9aoYAH%Wps1o_#9x5UpxEV*#HqVb{Q6%0y}z+qxBd8Fov7w_!(YaOe}#V($pFH3L5w zuxQ7b{itsVS|3TATNLGgryk(J&@C-^mTJ&*+XFwg2b!q;s!CE8)O(7{j^n1UhUdk# zCHAS0vK*+5xlWnp2s)@mQQW;81^=N%i6KXDEynYeU?pW!il%pMVln{32zg+*YDwx} z!^B~~5wj)bMq0y+OLqJ7DpcA!$2z3Z1PIV&9XeAlWn$Ox$@vqBuL}u96XM`obWO*D zi4HDQTR*JgY+!0Fy<+(ivVFLW-i~tzkyIgps-gC-Nt=kg(ad?G#4v zNJw+itF*SVEZcD44O;E&Exz)rsu-zECqD{jSOl?E_y5z*RYpbGb#3YHkQ5jYX#wd@ z0qIge8XW0{A%!8NrBOOXq+>{Ffk8q-q(Q(z5b2OqzQO0^{ebm+YvJ#YJwN8(weR~n z``l}vefG7@)eJ1K_UYX}LIr;^_bKZJHj#i{$UzX*W!?&OSS%+An|bk#y)RBLcK0aV z#90`g-Lq#s(P~#&!k;@x8R!J6p^gw*gzYhgv07Wie|Pm;{X}kfGka>}Lm=ruh=DO3 zo-afAydTN!mIP3Cf`Uu3aRw&=fk{&eUpC+_t%JD4PKK|`N&_St$-Cv@EOOg?b1xlb zhPT8{eyeq|0vJUS43G`3jk2kB}rJ_!Oi2VgfGvApn< ziZN8SggKg6_j;@HbbqQ=x2*su^}FMYMV@~2syEUjrWKYX$LjW5I;yI zVJ-TArKHRxs8R9RbnMOLW?;xSoCp(Nr0-wvLkiRSl5Y=e$SPW)(%90aw6Oy%%g0A(02jEa& zTkk<2NyNnj$YwXWvvBM_%f)E;dQOT~grPmi6xTOvYsE+EGv@1q_B3IlHZG&_0x-AiS}#INuyNTb7ZCy&e1P>D-Wjh%9C-f+X*xG$e>(m5z3u zYmeYDiXzrF#9+2A+8Rqv-CS)R)49;ZPBJblN*h70cVp0_bfIw&Y(qg7Y&_IA7VzdH$;Hd?75GL8iImbj;tf{OQf+*8FBM4=xfJiDii zQcR%wI@g68NTCJT(K~#()LHZXaU&Rk)M(l7D`TAMmr`fq&UwPF9D0|`eMF`zg7SNx zN{?E+tog#ExNg@HyN@q?e)LV7jeN$nGpA+Ei#V{tlyL3{m!Rbv?j%;Xv`aVXS5Vis zZ)E*0?vsQnDOas09fqS99_lp|xU6I$);5jR_LRkL_jcRmA@b5&5DIo~5ShwzTN zZ|Okqv#Gsxw+F9Ry6~Be^9#n)zZPJOrnl98BnafQVfalMxBg>~tiUOSiogLM#f8UV zroi^r0|#E?4z<)(F#X+vghi4tql!`O-R-@STrsIEpk&7bm}toyAHurpN|wZ(hrf@J ztawU%y*DZw_;1B<2qTe_J?(x~Eb}@jEbV)~pliGzkw#B70+Ni6y6EHbxW;C#V_}sC z;IMZ;D2Xb?2)D7?+1w8lkL6o1yCXW>Bcf(Aa>A@-g0P?F1*8a^u+(!@G!1n;&ZC*z z@5)Kb{n=IOP^Nn_fBW!jFZ*FGGkxtVj<0kX$08-_Qv5~iFw>#;yig@J+zPX>G^&Zn zskcY@Hd!EM@hQ+)J`Toc(%z`4ou%v-wdcp3QxyZuF|znx-kD5^M>6&|a2r(Umcme1 zG!_qR6>T|tKx&d~>dk{_P8=v`tK0Z*gkWgH_^A$#EG2tIW<4aJ{phakfSLiXr1e_d zy@FJ7$zHMrAiZM7z0^+(fTr)g8lA*Pc;r1+@~;x{kjD-{Hy#&wB8eh$Yc))4jmzZ6 zgTX7qulV;EA2#KSl~wEvZ3@}@07EBq5b*f@Ct?=dCRkq>AQYrqa{dgD@q12a_! z#?D%rOVUx; ztP$&M3F-`CVmO!=%yvXFI`*3Bmis2Dy17F$_N}N~&VUWmgJ{>|p5ph%$je#EkVKW^ z#L0(s_O3vssZ0Pe1IeP0N!9?xhvJo%G|8Fk!PjDjoS zPZOJePkGkiY1;pG8Ju1?KXtNqb+}4KZyQst($0zf9F*QBU$lTj79Fi3Pg|a&X--k| zbV4X0#YLdqMOgT5tKt-n2&u|kE>)S}@8;v*X*RK?dN`JWtU8ty{d~~-9o)_gHv_zI z+497jT7qUJHtL_tle9@02mT6{uzsnD=QFVFE1I4C#)vVWla)>>m>Rt*3phbIi~+zh z_+4H;SyLylg8BAq{k^$PwlYc4L5Jj8lF_)x5$r*k0DL=~wQ)}r>w(leBAN3t8S8v@ zRYh8yGZENzcogAw@`FL0%n#m?!6HQ>^JBW%X5QUTVi4B%QnJMbKffnS$dOa#vbN6* za@$wQ_TB>6(JG*>d_gXPY2_o~sOD;Zv`X0OX9;colU)MSPwX+_WS$cG?^NT$v*C+5 zudT_Ih<4Rfgx{RvPcIVdyQE+dFXdq*bFj2n_;XYcbPnrKyrM~9oF0~aC@32vyhGU6 z23^J`iF5IzDC14%|FU;qlY)c2cWaeiHefm65Sy+^#6YQZ0Q42=?+VF*<@*ixH$4r= z66S;6pd3P>ws`Lw7b;HPoY(O@MEMY}#%!h9)oRS~o}*EDP#!?qiT*IvF?eKfv#xJq zF_q-`*Yyza$7pPG-^%fbvV?e!y06ZWMsYQD!*YBYnilIc0}XcXqH~)<3rmO`k|z5z z6{ZK!pC+J)w_;KB=j*(3mzJ5EW5-DfG7f#rqp1Dyh!B*u|7innJjPdrBzmUMXxSiV z%#5AfI39SM?@iNCv(m6Ax2a3vX)AC4ga9UnmS>TW`oc0FD=oMIb{#_eK>}}g(uFto|~vVagfA4$0x>U zx@05MVAvIH*A+K9O10linZJ0ltswj*9dA zp$Qq^z0oMsxKS>|U^X7Rz>tqH9{7$!Iq+h~U zmFGm+$N)EVw}Nkk_o-(oC7p01>Drg_i9NZ1rQsT)*eSlY0GQ~;=! z>09IqpXJu0R#@yEqrljo8MF7%8zPgjYGi&BPf{kxW5S$B>rG z(B$MzxkCUUYiX~z-To-jNlkM@3iE_sYRF1p2uUgq5VJ$)g;6eOj|6H7pq?Mpkyf59 zV-~cy7Wp#Spchc9 z3W-K7RI3CkSQ08ahnwM32_Ebm!XGb@>R3&Ghj(IX3s`!mB!;THu)+Lum5K*=kZPP~ zx0GL`GiyZFY2~;3tsmIbixJiJ9>v>jIx4wiuso)YN9<>QhZC8(-;&Zf=InXP;$!}h z>Ce`F-0cJpK^Sz`NAi{n$pCFUW$ zB&#q)*p03wgQzV@;-=2skxGJ`2mxklk0kU4l&aGSg)9Z1lHlM~08qBGv%W?6VZV0u z_Uc7WA-7z@39=Q{NTDIxl8CdGM`QU_O)WhYsy8pIVhE#NJ!w72tf-E=^EsAu*<${v z!^QJcI~~$i5v%bY9=*1l(|B0)PO!OZ2X44r2Pb+}Hm|wC$)7FwiqF5D2Hu=@y3zi9 z3x>n9fQyY~wwBIU8h8_=-KWC9j}I?vkTJ{AszxILLLq|{QWMG?h1!J^2A?!%tA&4) zBNDu+TWp$7MC(%I4E8AUeu9TxW)i^TQe#kZxLkPH-NQ|VleJ9;vLr95pM4k4{Ea(> zruWE{$!;VG+hkCH+d0G#(5ySJQ`OIXM<-pTJEiKNEK@&wc=Zd`ns| zat&7?It|$0ZTUKie>7 zBmXsmEAb+4g0jk&q-WH!VMj2Bg23R3%_~ej7Hhk;-Id=rVT!?Dq(b+SN{(w9WSUN( zrMW*n9huA=fdoY(+?vh00a#=K$z7e)F|QJ)Ec)Ov~i`$|<+6~<- zxMz?KAi-N6(4!cqk1C#IGa==-^YFpIBUwFN;K(CCI;^auCK%Om>$Xm&o0OGy5NH2> zLV3~#4@f)PPYP)`%Rwxfb-xn5V8$w+#uwTCE4+r=LH_eW5#cJ1uP3V_C7LdaHy z6VJ=uOd^paa*gK^_XyzwfEEHGoEuIiqf8r^REPm|W@06h%gq^O9C?Hq82F?CZ0sr8 z<{oTwW)?zY8NalnNw^0pCT6QaAyIt1(&ots^8g0<>9R;zIIF2vArPhJD=@9S-IPd| z%0I=)qUCKqTIVEEA#coW#yg^|$0|fQZ1c6cIg>;-i+)<9#y6JR@N=boxT)ewixXV< zgl0RAP1sv8jBiE`w9P4C2^;wbfj%Cp6z+>W7Q=LE=m_pY-DBDGnEzF^89vDrp zR!mZutkB@glJqNaMU@c|?reC-##QA187L$0N>(uhyrvP$|07_Ux5f42395-9gcXP% zHmY;@TBiBa41gQ;3Hr-4l{@=j=_&Fq1uf`=Mgdbw41+#RvltC(lO<4jgVaODKNn-d zefbDtml*)SL{2W04R3*lM7)LUr6aMt$_Gs~5W*%6V!Uwou-k4>fBAB$MVmT9uzx4-@nZv4!qS|ht#YVV96I48e^c0Pb` zgYELbE9BP=hqbOf2?eKVv%o*E*AIj*(>JiZBkZOw)yX z#{n4wZBLW7CDsZ8lN7joT?dU@429R(-2teoT`czAyyqQOKNZ+=o3ft z-6Zozb;he{F*|v(?5Q6RN4hX--s(cSB@zgRm(cIHi*~I4bTj37=(tLlL(?l|a2UTq zrDtSf^s1+XGv3z1fn{z)#Q!%m1d4xB;#FN{kw!cgMD%&Mz1+0aU_QGUosY#Qhb#wJ z&PRQOc*;@fLxQw6c$Rd^#J_W-1ZVK#am>ZZ#QaKA&s^dCm7gT=;r*50S`cuVt?D## z2_4x(oN5?IrzMDvMmB)YMec#^uhWH@Wp>FR4$yjT<2B5!b4>;3nGofF~V5qPpU8{^;HCZlb^NF^j@=a11!;EWhBFA++d%FFY-`Ly!!U71 zk-kS+T*NZg)M=>!ib^JaoQUd-$6UD>_Rz`?>dKuJ^rA;flOi-Xg;!a%L-prMn3pxJ zeA0uOXl;B5ZJ9wL*eu%~Pc%y2p<27QOU6B(B|A)h^&gQkj?>bj8HUi9p~y@2*O%!dSkhnN8n6=hO= zXY6!S1)3i&)XG@lhA}1n+a*|V*qy_xQgScWNO^v~kpx$}N2P#OwxQA9gSD{g$#%`h zNebtHQgIy)oB+M5<67mH>%Z@~8MKcOuGT#yZT5^JO?x3B95s=d6lNGMV5CR=*(E&p z_HQ&3pVT$u#mbQu4p@cqp66gBwl9A4w8QQ{l45=0(Am?Wcc)>brig$@jP!p`xQ55! zA6u0?{k!VC>whrMCSISP;&(dn`pj~{GXKTA>ip}o=RLzd#e%=eA3M!l&MX%khIRJ5 ze=`;EGXD9A3a3*5&ny?b@?ZQb&IG&+eO}ppx|`1|7hDf7#Qa0`Ukzxu?BKkh@l+sw zX1U)s>vtsw6+#nS-mTOfGKN z^Zor7iSfOFdsWrR*>j(5+Vg$cr?sv#%LUWjJ^$QS)C^pPKi{Kpno68mF8Bl2dHAch zdSCW%{_6U)*Wt`^!BpbsJ^V%I!(|ue@1ZYp^i=Y^i!0uUUxq(l^F1xPoLMgT*G2fh zxZ1w#<9xC6V*GEw1#SQA;=igTUv_Z5GIo)p$4ciNT(N?B8UB39>a@IeX1U-fmGkg_ zzC>3qwq15}{#br-DYR8DxcQ4}*kvE*^X`i~dQ9WIkEGS*9=@UaLvFq g1J?{(GjPqoH3QcSTr+UZz%>Kc3|uqt|AT@50izP=y8r+H literal 0 HcmV?d00001 diff --git a/assets/voxygen/i18n/ro_RO/buff.ftl b/assets/voxygen/i18n/ro_RO/buff.ftl new file mode 100644 index 0000000000..c8bedc6823 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/buff.ftl @@ -0,0 +1,39 @@ +buff-remove = Clic pentru a elimina +buff-title-missing = Lipsește Titlul +buff-desc-missing = Lipsește Descrierea +buff-title-heal = Vindecă +buff-desc-heal = Primești viață pe parcurs. +buff-title-potion = Poțiune +buff-desc-potion = Bând... +buff-title-saturation = Săturare +buff-desc-saturation = Primești viața pe parcurs de la consumabile. +buff-title-campfire_heal = Vindecare la foc de tabără +buff-desc-campfire_heal = Stând la foc de tabără te vindecă { $rate }% pe secundă. +buff-title-invulnerability = Invincibilitate +buff-desc-invulnerability = Nu poți fi rănit de niciun atac. +buff-title-protectingward = Scut Protector +buff-desc-protectingward = Ești protejat, oarecum, de atacuri. +buff-title-frenzied = Frenetic +buff-desc-frenzied = Ești învăluit de viteză nefirească și poți ignora rănile minore. +buff-title-hastened = Accelerat +buff-desc-hastened = Mișcările și atacurile tale sunt mai rapide. +buff-title-bleed = Sângerare +buff-desc-bleed = Provoacă daune normale. +buff-title-cursed = Blestemat +buff-desc-cursed = Ești blestemat. +buff-title-burn = Înflăcărat +buff-desc-burn = Arzi de viu +buff-title-crippled = Amputare +buff-desc-crippled = Mișcarea ta e paralizată, din cauza rănilor grave de pe picioare. +buff-title-frozen = Înghețat +buff-desc-frozen = Mișcările și atacurile tale sunt încetinite. +buff-title-wet = Ud +buff-desc-wet = Pământul îți respinge picioarele, ceea ce face dificil să te oprești. +buff-title-ensnared = Captiv +buff-desc-ensnared = Vinile te prind de picioare, împiedicându-ți mișcarea. +buff-stat-health = Redă { $str_total } Viață +buff-stat-increase_max_energy = Mărește Energia cu { $strength } +buff-stat-increase_max_health = Mărește Viața cu { $strength } +buff-stat-invulnerability = Oferă Invincibilitate +buff-text-over_seconds = peste { $dur_secs } secunde +buff-text-for_seconds = pentru { $dur_secs } secunde \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/buff.ron b/assets/voxygen/i18n/ro_RO/buff.ron deleted file mode 100644 index ed62c64fce..0000000000 --- a/assets/voxygen/i18n/ro_RO/buff.ron +++ /dev/null @@ -1,55 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - // Buffs - "buff.remove": "Clic pentru a elimina", - "buff.title.missing": "Lipsește Titlul", - "buff.desc.missing": "Lipsește Descrierea", - "buff.title.heal": "Vindecă", - "buff.desc.heal": "Primești viață pe parcurs.", - "buff.title.potion": "Poțiune", - "buff.desc.potion": "Bând...", - "buff.title.saturation": "Săturare", - "buff.desc.saturation": "Primești viața pe parcurs de la consumabile.", - "buff.title.campfire_heal": "Vindecare la foc de tabără", - "buff.desc.campfire_heal": "Stând la foc de tabără te vindecă {rate}% pe secundă.", - - "buff.title.invulnerability": "Invincibilitate", - "buff.desc.invulnerability": "Nu poți fi rănit de niciun atac.", - "buff.title.protectingward": "Scut Protector", - "buff.desc.protectingward": "Ești protejat, oarecum, de atacuri.", - "buff.title.frenzied": "Frenetic", - "buff.desc.frenzied": "Ești învăluit de viteză nefirească și poți ignora rănile minore.", - "buff.title.hastened": "Accelerat", - "buff.desc.hastened": "Mișcările și atacurile tale sunt mai rapide.", - // Debuffs - "buff.title.bleed": "Sângerare", - "buff.desc.bleed": "Provoacă daune normale.", - "buff.title.cursed": "Blestemat", - "buff.desc.cursed": "Ești blestemat.", - "buff.title.burn": "Înflăcărat", - "buff.desc.burn": "Arzi de viu", - "buff.title.crippled": "Amputare", - "buff.desc.crippled": "Mișcarea ta e paralizată, din cauza rănilor grave de pe picioare.", - "buff.title.frozen": "Înghețat", - "buff.desc.frozen": "Mișcările și atacurile tale sunt încetinite.", - "buff.title.wet": "Ud", - "buff.desc.wet": "Pământul îți respinge picioarele, ceea ce face dificil să te oprești.", - "buff.title.ensnared": "Captiv", - "buff.desc.ensnared": "Vinile te prind de picioare, împiedicându-ți mișcarea.", - // Buffs stats - "buff.stat.health": "Redă {str_total} Viață", - "buff.stat.increase_max_energy": "Mărește Energia cu {strength}", - "buff.stat.increase_max_health": "Mărește Viața cu {strength}", - "buff.stat.invulnerability": "Oferă Invincibilitate", - // Text - "buff.text.over_seconds": "peste {dur_secs} secunde", - "buff.text.for_seconds": "pentru {dur_secs} secunde", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/char_selection.ftl b/assets/voxygen/i18n/ro_RO/char_selection.ftl new file mode 100644 index 0000000000..f8ce01149d --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/char_selection.ftl @@ -0,0 +1,22 @@ +char_selection-loading_characters = Se încarcă Personajele... +char_selection-delete_permanently = Vrei să ștergi acest Personaj pentru totdeauna? +char_selection-deleting_character = Se șterge Personajul... +char_selection-change_server = Schimbă Serverul +char_selection-enter_world = Intră în lume +char_selection-logout = Ieși din cont +char_selection-create_new_character = Creează un Personaj Nou +char_selection-creating_character = Se Creaază Personajul... +char_selection-character_creation = Creearea Personajului +char_selection-human_default = Om Inițial +char_selection-level_fmt = Nivel { $level_nb } +char_selection-uncanny_valley = Pustietate +char_selection-plains_of_uncertainty = Câmpiile Incertitudinii +char_selection-beard = Barbă +char_selection-hair_style = Stilul Părului +char_selection-hair_color = Culoarea Parului +char_selection-eye_color = Culoarea Ochilor +char_selection-skin = Pielea +char_selection-eyeshape = Detaliile Ochilor +char_selection-accessories = Accesorii +char_selection-create_info_name = Personajul tău are nevoie de nume! +char_selection-version_mismatch = ATENȚIE! Acest server rulează o versiune de joc diferită, posibil incompatibilă. Te rog să actualizezi jocul. \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/char_selection.ron b/assets/voxygen/i18n/ro_RO/char_selection.ron deleted file mode 100644 index 69c5fc3591..0000000000 --- a/assets/voxygen/i18n/ro_RO/char_selection.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "char_selection.loading_characters": "Se încarcă Personajele...", - "char_selection.delete_permanently": "Vrei să ștergi acest Personaj pentru totdeauna?", - "char_selection.deleting_character": "Se șterge Personajul...", - "char_selection.change_server": "Schimbă Serverul", - "char_selection.enter_world": "Intră în lume", - "char_selection.logout": "Ieși din cont", - "char_selection.create_new_character": "Creează un Personaj Nou", - "char_selection.creating_character": "Se Creaază Personajul...", - "char_selection.character_creation": "Creearea Personajului", - "char_selection.human_default": "Om Inițial", - "char_selection.level_fmt": "Nivel {level_nb}", - "char_selection.uncanny_valley": "Pustietate", - "char_selection.plains_of_uncertainty": "Câmpiile Incertitudinii", - "char_selection.beard": "Barbă", - "char_selection.hair_style": "Stilul Părului", - "char_selection.hair_color": "Culoarea Parului", - "char_selection.eye_color": "Culoarea Ochilor", - "char_selection.skin": "Pielea", - "char_selection.eyeshape": "Detaliile Ochilor", - "char_selection.accessories": "Accesorii", - "char_selection.create_info_name": "Personajul tău are nevoie de nume!", - "char_selection.version_mismatch": "ATENȚIE! Acest server rulează o versiune de joc diferită, posibil incompatibilă. Te rog să actualizezi jocul.", - }, - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/common.ftl b/assets/voxygen/i18n/ro_RO/common.ftl new file mode 100644 index 0000000000..06b82873c7 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/common.ftl @@ -0,0 +1,108 @@ +common-username = Nume de utilizator +common-singleplayer = Jucător Solo +common-multiplayer = Mai mulți jucători +common-servers = Servere +common-quit = Ieși +common-settings = Setări +common-languages = Limbi +common-interface = Interfață +common-gameplay = Gameplay +common-controls = Controale +common-video = Grafici +common-sound = Sunet +common-chat = Chat +common-resume = Continuă +common-characters = Personaje +common-close = Închide +common-yes = Da +common-no = Nu +common-back = Înapoi +common-create = Creează +common-okay = Okay +common-add = Adaugă +common-accept = Acceptă +common-decline = Refuză +common-disclaimer = Atenție +common-cancel = Renunță +common-none = Nimic +common-error = Eroare +common-fatal_error = Eroare Fatală +common-you = Tu +common-automatic = Auto +common-random = Aleatoriu +common-empty = Gol +common-confirm = Confirmă +common-delete_server = Șterge Server +common-interface_settings = Setări Interfață +common-gameplay_settings = Setări Gameplay +common-controls_settings = Setări Controale +common-video_settings = Setări Grafici +common-sound_settings = Setări Sunet +common-language_settings = Setări Limba +common-chat_settings = Setări Chat +common-connection_lost = + Conexiune pierdută! + Sa repornit server-ul? + E clientul actualizat? +common-species-orc = Orc +common-species-human = Om +common-species-dwarf = Pitic +common-species-elf = Elf +common-species-draugr = Fantomă +common-species-danari = Danari +common-weapons-axe = Topor +common-weapons-dagger = Pumnal +common-weapons-greatsword = Sabie Lungă +common-weapons-shortswords = Săbii Scurte +common-weapons-sword = Sabie +common-weapons-staff = Toiag de Flăcări +common-weapons-bow = Arc +common-weapons-hammer = Ciocan +common-weapons-general = Bătălie Generală +common-weapons-sceptre = Spectru de Vindecare +common-weapons-shield = Scut +common-weapons-spear = Suliță +common-weapons-hammer_simple = Ciocan Simplu +common-weapons-sword_simple = Sabie Simplă +common-weapons-staff_simple = Toiag Simplu +common-weapons-axe_simple = Topor Simplu +common-weapons-bow_simple = Arc Simplu +common-weapons-unique = Unic +common-tool-debug = Debug +common-tool-farming = Unealtă de Agricultură +common-tool-pick = Tărnacop +common-tool-mining = Minează +common-kind-modular_component = Componentă Modulară +common-kind-modular_component_partial = Componentă +common-kind-glider = Planor +common-kind-consumable = Consumabilă +common-kind-throwable = Se poate arunca +common-kind-utility = Utilitară +common-kind-ingredient = Ingredient +common-kind-lantern = Lanternă +common-hands-one = O mână +common-hands-two = Două mâini +common-rand_appearance = Înfățișare aleatorie +common-rand_name = Nume aleatoriu +common-stats-combat_rating = CR +common-stats-power = Putere +common-stats-speed = Viteză +common-stats-poise = Poise +common-stats-range = Distanță +common-stats-energy_efficiency = Eficiența energiei +common-stats-buff_strength = Buff/Debuff Strength +common-stats-crit_chance = Șansă Crit +common-stats-crit_mult = Multiplicator Crit +common-stats-armor = Armură +common-stats-poise_res = Stun Res +common-stats-energy_max = Energie Maximă +common-stats-energy_reward = Energy Reward +common-stats-crit_power = Crit Power +common-stats-stealth = Strecurare +common-stats-slots = Sloturi +common-material-metal = Metal +common-material-wood = Lemn +common-material-stone = Piatră +common-material-cloth = Pânză +common-material-hide = Piele de animal +common-sprite-chest = Cufăr \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/common.ron b/assets/voxygen/i18n/ro_RO/common.ron deleted file mode 100644 index fc3f4c1081..0000000000 --- a/assets/voxygen/i18n/ro_RO/common.ron +++ /dev/null @@ -1,133 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM -/// Localization for Română (Romanian) - -/// NEEDS EDITING! - -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "Nume de utilizator", - "common.singleplayer": "Jucător Solo", - "common.multiplayer": "Mai mulți jucători", - "common.servers": "Servere", - "common.quit": "Ieși", - "common.settings": "Setări", - "common.languages": "Limbi", - "common.interface": "Interfață", - "common.gameplay": "Gameplay", - "common.controls": "Controale", - "common.video": "Grafici", - "common.sound": "Sunet", - "common.chat": "Chat", - "common.resume": "Continuă", - "common.characters": "Personaje", - "common.close": "Închide", - "common.yes": "Da", - "common.no": "Nu", - "common.back": "Înapoi", - "common.create": "Creează", - "common.okay": "Okay", - "common.add": "Adaugă", - "common.accept": "Acceptă", - "common.decline": "Refuză", - "common.disclaimer": "Atenție", - "common.cancel": "Renunță", - "common.none": "Nimic", - "common.error": "Eroare", - "common.fatal_error": "Eroare Fatală", - "common.you": "Tu", - "common.automatic": "Auto", - "common.random": "Aleatoriu", - "common.empty": "Gol", - "common.confirm": "Confirmă", - "common.delete_server": "Șterge Server", - - // Settings Window title - "common.interface_settings": "Setări Interfață", - "common.gameplay_settings": "Setări Gameplay", - "common.controls_settings": "Setări Controale", - "common.video_settings": "Setări Grafici", - "common.sound_settings": "Setări Sunet", - "common.language_settings": "Setări Limba", - "common.chat_settings": "Setări Chat", - - // Message when connection to the server is lost - "common.connection_lost": r#"Conexiune pierdută! -Sa repornit server-ul? -E clientul actualizat?"#, - - - - "common.species.orc": "Orc", - "common.species.human": "Om", - "common.species.dwarf": "Pitic", - "common.species.elf": "Elf", - "common.species.draugr": "Fantomă", - "common.species.danari": "Danari", - - "common.weapons.axe": "Topor", - "common.weapons.dagger": "Pumnal", - "common.weapons.greatsword": "Sabie Lungă", - "common.weapons.shortswords": "Săbii Scurte", - "common.weapons.sword": "Sabie", - "common.weapons.staff": "Toiag de Flăcări", - "common.weapons.bow": "Arc", - "common.weapons.hammer": "Ciocan", - "common.weapons.general": "Bătălie Generală", - "common.weapons.sceptre": "Spectru de Vindecare", - "common.weapons.shield": "Scut", - "common.weapons.spear": "Suliță", - "common.weapons.hammer_simple": "Ciocan Simplu", - "common.weapons.sword_simple": "Sabie Simplă", - "common.weapons.staff_simple": "Toiag Simplu", - "common.weapons.axe_simple": "Topor Simplu", - "common.weapons.bow_simple": "Arc Simplu", - "common.weapons.unique": "Unic", - "common.tool.debug": "Debug", - "common.tool.farming": "Unealtă de Agricultură", - "common.tool.pick": "Tărnacop", - "common.tool.mining": "Minează", - "common.kind.modular_component": "Componentă Modulară", - "common.kind.modular_component_partial": "Componentă", - "common.kind.glider": "Planor", - "common.kind.consumable": "Consumabilă", - "common.kind.throwable": "Se poate arunca", - "common.kind.utility": "Utilitară", - "common.kind.ingredient": "Ingredient", - "common.kind.lantern": "Lanternă", - "common.hands.one": "O mână", - "common.hands.two": "Două mâini", - - "common.rand_appearance": "Înfățișare aleatorie", - "common.rand_name": "Nume aleatoriu", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Putere", - "common.stats.speed": "Viteză", - "common.stats.poise": "Poise", - "common.stats.range": "Distanță", - "common.stats.energy_efficiency": "Eficiența energiei", - "common.stats.buff_strength": "Buff/Debuff Strength", - "common.stats.crit_chance": "Șansă Crit", - "common.stats.crit_mult": "Multiplicator Crit", - "common.stats.armor": "Armură", - "common.stats.poise_res":"Stun Res", - "common.stats.energy_max": "Energie Maximă", - "common.stats.energy_reward": "Energy Reward", - "common.stats.crit_power": "Crit Power", - "common.stats.stealth": "Strecurare", - "common.stats.slots": "Sloturi", - - "common.material.metal": "Metal", - "common.material.wood": "Lemn", - "common.material.stone": "Piatră", - "common.material.cloth": "Pânză", - "common.material.hide": "Piele de animal", - - "common.sprite.chest": "Cufăr", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/esc_menu.ftl b/assets/voxygen/i18n/ro_RO/esc_menu.ftl new file mode 100644 index 0000000000..76cf033dad --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/esc_menu.ftl @@ -0,0 +1,2 @@ +esc_menu-logout = Deconectează-te +esc_menu-quit_game = Părăsește jocul \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/esc_menu.ron b/assets/voxygen/i18n/ro_RO/esc_menu.ron deleted file mode 100644 index 929b6556f3..0000000000 --- a/assets/voxygen/i18n/ro_RO/esc_menu.ron +++ /dev/null @@ -1,13 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "esc_menu.logout": "Deconectează-te", - "esc_menu.quit_game": "Părăsește jocul", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/gameinput.ftl b/assets/voxygen/i18n/ro_RO/gameinput.ftl new file mode 100644 index 0000000000..1cf649d6ff --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/gameinput.ftl @@ -0,0 +1,66 @@ +gameinput-primary = Atac de bază +gameinput-secondary = Atac secundar +gameinput-block = Blochează +gameinput-slot1 = Hotbar Slot 1 +gameinput-slot2 = Hotbar Slot 2 +gameinput-slot3 = Hotbar Slot 3 +gameinput-slot4 = Hotbar Slot 4 +gameinput-slot5 = Hotbar Slot 5 +gameinput-slot6 = Hotbar Slot 6 +gameinput-slot7 = Hotbar Slot 7 +gameinput-slot8 = Hotbar Slot 8 +gameinput-slot9 = Hotbar Slot 9 +gameinput-slot10 = Hotbar Slot 10 +gameinput-swaploadout = Schimbă Loadout-ul +gameinput-togglecursor = Comută Cursorul +gameinput-help = Comută Fereastra de Ajutor +gameinput-toggleinterface = Comută Interfața +gameinput-toggledebug = Comută FPS și Debug Info +gameinput-toggle_egui_debug = Comută EGUI Debug Info +gameinput-togglechat = Comută Chat +gameinput-screenshot = Ia o captură de ecran +gameinput-toggleingameui = Comută Etichetele de Nume +gameinput-fullscreen = Comută Ecran Complet +gameinput-moveforward = Mișcă în Față +gameinput-moveleft = Mișcă în Stânga +gameinput-moveright = Mișcă în Dreapta +gameinput-moveback = Mișcă în Spate +gameinput-jump = Sari +gameinput-glide = Planor +gameinput-roll = Rostogolire +gameinput-climb = Cățărare +gameinput-climbdown = Coboară +gameinput-wallleap = Salt pe Perete +gameinput-togglelantern = Comută Lanterna +gameinput-mount = Călărește +gameinput-chat = Chat +gameinput-command = Comandă +gameinput-escape = Scapă +gameinput-map = Hartă +gameinput-bag = Rucsac +gameinput-trade = Negocează +gameinput-social = Social +gameinput-sit = Asează-te +gameinput-spellbook = Vrăji +gameinput-settings = Setări +gameinput-respawn = Reînvie +gameinput-charge = Încarcă +gameinput-togglewield = Cumută Mânuire +gameinput-interact = Interacționează +gameinput-freelook = Privire Liberă +gameinput-autowalk = Mișcare/Înotare Automată +gameinput-cameraclamp = Camera Clamp +gameinput-dance = Dansează +gameinput-select = Selecteaza Entitatea +gameinput-acceptgroupinvite = Acceptă Invitația de Grup +gameinput-declinegroupinvite = Refuză Invitația de Grup +gameinput-cyclecamera = Schimbă Camera +gameinput-crafting = Meșteșug +gameinput-fly = Zboară +gameinput-sneak = Furișează-te +gameinput-swimdown = Înoată Înainte +gameinput-swimup = Înoată Înapoi +gameinput-mapzoomin = Mărește zoom-ul hărții +gameinput-mapzoomout = Reduceți zoom-ul hărții +gameinput-greet = Salută +gameinput-map-locationmarkerbutton = Setează punct de referință pe hartă \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/gameinput.ron b/assets/voxygen/i18n/ro_RO/gameinput.ron deleted file mode 100644 index a1eed5e20a..0000000000 --- a/assets/voxygen/i18n/ro_RO/gameinput.ron +++ /dev/null @@ -1,77 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "gameinput.primary": "Atac de bază", - "gameinput.secondary": "Atac secundar", - "gameinput.block": "Blochează", - "gameinput.slot1": "Hotbar Slot 1", - "gameinput.slot2": "Hotbar Slot 2", - "gameinput.slot3": "Hotbar Slot 3", - "gameinput.slot4": "Hotbar Slot 4", - "gameinput.slot5": "Hotbar Slot 5", - "gameinput.slot6": "Hotbar Slot 6", - "gameinput.slot7": "Hotbar Slot 7", - "gameinput.slot8": "Hotbar Slot 8", - "gameinput.slot9": "Hotbar Slot 9", - "gameinput.slot10": "Hotbar Slot 10", - "gameinput.swaploadout": "Schimbă Loadout-ul", - "gameinput.togglecursor": "Comută Cursorul", - "gameinput.help": "Comută Fereastra de Ajutor", - "gameinput.toggleinterface": "Comută Interfața", - "gameinput.toggledebug": "Comută FPS și Debug Info", - "gameinput.toggle_egui_debug": "Comută EGUI Debug Info", - "gameinput.togglechat": "Comută Chat", - "gameinput.screenshot": "Ia o captură de ecran", - "gameinput.toggleingameui": "Comută Etichetele de Nume", - "gameinput.fullscreen": "Comută Ecran Complet", - "gameinput.moveforward": "Mișcă în Față", - "gameinput.moveleft": "Mișcă în Stânga", - "gameinput.moveright": "Mișcă în Dreapta", - "gameinput.moveback": "Mișcă în Spate", - "gameinput.jump": "Sari", - "gameinput.glide": "Planor", - "gameinput.roll": "Rostogolire", - "gameinput.climb": "Cățărare", - "gameinput.climbdown": "Coboară", - "gameinput.wallleap": "Salt pe Perete", - "gameinput.togglelantern": "Comută Lanterna", - "gameinput.mount": "Călărește", - "gameinput.chat": "Chat", - "gameinput.command": "Comandă", - "gameinput.escape": "Scapă", - "gameinput.map": "Hartă", - "gameinput.bag": "Rucsac", - "gameinput.trade": "Negocează", - "gameinput.social": "Social", - "gameinput.sit": "Asează-te", - "gameinput.spellbook": "Vrăji", - "gameinput.settings": "Setări", - "gameinput.respawn": "Reînvie", - "gameinput.charge": "Încarcă", - "gameinput.togglewield": "Cumută Mânuire", - "gameinput.interact": "Interacționează", - "gameinput.freelook": "Privire Liberă", - "gameinput.autowalk": "Mișcare/Înotare Automată", - "gameinput.cameraclamp": "Camera Clamp", - "gameinput.dance": "Dansează", - "gameinput.select": "Selecteaza Entitatea", - "gameinput.acceptgroupinvite": "Acceptă Invitația de Grup", - "gameinput.declinegroupinvite": "Refuză Invitația de Grup", - "gameinput.cyclecamera": "Schimbă Camera", - "gameinput.crafting": "Meșteșug", - "gameinput.fly": "Zboară", - "gameinput.sneak": "Furișează-te", - "gameinput.swimdown": "Înoată Înainte", - "gameinput.swimup": "Înoată Înapoi", - "gameinput.mapzoomin": "Mărește zoom-ul hărții", - "gameinput.mapzoomout": "Reduceți zoom-ul hărții", - "gameinput.greet": "Salută", - "gameinput.map.locationmarkerbutton": "Setează punct de referință pe hartă" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/ability.ftl b/assets/voxygen/i18n/ro_RO/hud/ability.ftl new file mode 100644 index 0000000000..1874c47748 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/ability.ftl @@ -0,0 +1,16 @@ +common-abilities-debug-possess-name = Săgeată Manipulatoare +common-abilities-debug-possess-desc = Trage o săgeată otrăvitoare care te lasă să controlezi inamicul. +common-abilities-sword-spin-name = Vârtej de vânt +common-abilities-sword-spin-desc = Mișcă-te înainte în timp ce te rotești cu sabia. +common-abilities-axe-leap-name = Saltul Toporului +common-abilities-axe-leap-desc = Un salt cu mișcare tăioasă la poziția cursorului. +common-abilities-hammer-leap-name = Lovitura Morții +common-abilities-hammer-leap-desc = Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului. +common-abilities-bow-shotgun-name = Burst +common-abilities-bow-shotgun-desc = Trage rapid mai multe sageți +common-abilities-staff-fireshockwave-name = Inel de Foc +common-abilities-staff-fireshockwave-desc = Aprinde pământul cu undă de șoc în flăcări. +common-abilities-sceptre-wardingaura-name = Aură Protectoare +common-abilities-sceptre-wardingaura-desc = Protejează aliații tăi împotriva atacutilor inamicilor +common-abilities-unknown-name = Ablitatea nu are titlu +common-abilities-unknown-desc = Ablitatea nu are descripție \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/ability.ron b/assets/voxygen/i18n/ro_RO/hud/ability.ron deleted file mode 100644 index 81861637ae..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/ability.ron +++ /dev/null @@ -1,36 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - // Debug stick - "common.abilities.debug.possess.name": "Săgeată Manipulatoare", - "common.abilities.debug.possess.desc": "Trage o săgeată otrăvitoare care te lasă să controlezi inamicul.", - // Sword - "common.abilities.sword.spin.name": "Vârtej de vânt", - "common.abilities.sword.spin.desc": "Mișcă-te înainte în timp ce te rotești cu sabia.", - // Axe - "common.abilities.axe.leap.name": "Saltul Toporului", - "common.abilities.axe.leap.desc": "Un salt cu mișcare tăioasă la poziția cursorului.", - // Hammer - "common.abilities.hammer.leap.name": "Lovitura Morții", - "common.abilities.hammer.leap.desc": "Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului.", - // Bow - "common.abilities.bow.shotgun.name": "Burst", - "common.abilities.bow.shotgun.desc": "Trage rapid mai multe sageți", - // Staff - "common.abilities.staff.fireshockwave.name": "Inel de Foc", - "common.abilities.staff.fireshockwave.desc": "Aprinde pământul cu undă de șoc în flăcări.", - - // Sceptre - "common.abilities.sceptre.wardingaura.name": "Aură Protectoare", - "common.abilities.sceptre.wardingaura.desc": "Protejează aliații tăi împotriva atacutilor inamicilor", - // Unknown - "common.abilities.unknown.name": "Ablitatea nu are titlu", - "common.abilities.unknown.desc": "Ablitatea nu are descripție", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/bag.ftl b/assets/voxygen/i18n/ro_RO/hud/bag.ftl new file mode 100644 index 0000000000..3e46c85975 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/bag.ftl @@ -0,0 +1,41 @@ +hud-bag-inventory = Invetarul lui { $playername } +hud-bag-stats_title = Statisticile lui { $playername } +hud-bag-exp = Exp +hud-bag-armor = Armura +hud-bag-stats = Statistici +hud-bag-head = Cap +hud-bag-neck = Gât +hud-bag-tabard = Tabard +hud-bag-shoulders = Umeri +hud-bag-chest = Piept +hud-bag-hands = Mâini +hud-bag-lantern = Lanternă +hud-bag-glider = Planor +hud-bag-belt = Curea +hud-bag-ring = Inel +hud-bag-back = Spate +hud-bag-legs = Picioare +hud-bag-feet = Talpă +hud-bag-mainhand = Mâna Principală +hud-bag-offhand = Mâna Secundară +hud-bag-inactive_mainhand = Mâna Principală Inactivă +hud-bag-inactive_offhand = Mâna Secundară Inactivă +hud-bag-swap_equipped_weapons_title = Schimbă armele echipate +hud-bag-swap_equipped_weapons_desc = Apasă { $key } +hud-bag-bag = Rucsac +hud-bag-health = Viață +hud-bag-energy = Energie +hud-bag-combat_rating = Putere de Lupta +hud-bag-protection = Protecție +hud-bag-stun_res = Stun Resilience +hud-bag-stealth = Strecurare +hud-bag-combat_rating_desc = + Calculat după + echipamentul tău și viața ta. +hud-bag-protection_desc = Reducerea daunelor prin armură +hud-bag-stun_res_desc = + Rezistența la a fi amețit de lovituri consecutive. + Se regenerează ca Energia. +hud-bag-sort_by_name = Sortează după Nume +hud-bag-sort_by_quality = Sortează după Calitate +hud-bag-sort_by_category = Sortează după Categorie \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/bag.ron b/assets/voxygen/i18n/ro_RO/hud/bag.ron deleted file mode 100644 index cac9c6d9ec..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/bag.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - // Inventory - "hud.bag.inventory": "Invetarul lui {playername}", - "hud.bag.stats_title": "Statisticile lui {playername}", - "hud.bag.exp": "Exp", - "hud.bag.armor": "Armura", - "hud.bag.stats": "Statistici", - "hud.bag.head": "Cap", - "hud.bag.neck": "Gât", - "hud.bag.tabard": "Tabard", - "hud.bag.shoulders": "Umeri", - "hud.bag.chest": "Piept", - "hud.bag.hands": "Mâini", - "hud.bag.lantern": "Lanternă", - "hud.bag.glider": "Planor", - "hud.bag.belt": "Curea", - "hud.bag.ring": "Inel", - "hud.bag.back": "Spate", - "hud.bag.legs": "Picioare", - "hud.bag.feet": "Talpă", - "hud.bag.mainhand": "Mâna Principală", - "hud.bag.offhand": "Mâna Secundară", - "hud.bag.inactive_mainhand": "Mâna Principală Inactivă", - "hud.bag.inactive_offhand": "Mâna Secundară Inactivă", - "hud.bag.swap_equipped_weapons_title": "Schimbă armele echipate", - "hud.bag.swap_equipped_weapons_desc": "Apasă {key}", - "hud.bag.bag": "Rucsac", - "hud.bag.health": "Viață", - "hud.bag.energy": "Energie", - "hud.bag.combat_rating": "Putere de Lupta", - "hud.bag.protection": "Protecție", - "hud.bag.stun_res": "Stun Resilience", - "hud.bag.stealth": "Strecurare", - "hud.bag.combat_rating_desc": "Calculat după \nechipamentul tău și viața ta.", - "hud.bag.protection_desc": "Reducerea daunelor prin armură", - "hud.bag.stun_res_desc": "Rezistența la a fi amețit de lovituri consecutive.\nSe regenerează ca Energia.", - "hud.bag.sort_by_name": "Sortează după Nume", - "hud.bag.sort_by_quality": "Sortează după Calitate", - "hud.bag.sort_by_category": "Sortează după Categorie", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/char_window.ftl b/assets/voxygen/i18n/ro_RO/hud/char_window.ftl new file mode 100644 index 0000000000..c5923b7c31 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/char_window.ftl @@ -0,0 +1,9 @@ +character_window-character_name = Nume Personaj +character_window-character_stats = + Rezistență + + Fitness + + Voință + + Protecție \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/char_window.ron b/assets/voxygen/i18n/ro_RO/hud/char_window.ron deleted file mode 100644 index 08cee4aa6d..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/char_window.ron +++ /dev/null @@ -1,21 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "character_window.character_name": "Nume Personaj", - // Character stats - "character_window.character_stats": r#"Rezistență - -Fitness - -Voință - -Protecție -"#, - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/chat.ftl b/assets/voxygen/i18n/ro_RO/hud/chat.ftl new file mode 100644 index 0000000000..8052048f4a --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/chat.ftl @@ -0,0 +1,29 @@ +hud-chat-all = Toate +hud-chat-chat_tab_hover_tooltip = Clic dreapta pentru setări +hud-outcome-burning = a murit prin: ardere +hud-outcome-curse = a murit prin: blestem +hud-outcome-bleeding = a murit prin: sângerare +hud-outcome-crippled = a murit prin: amputare +hud-outcome-frozen = a murit prin: înghețare +hud-chat-online_msg = [{ $name }] sa conectat +hud-chat-offline_msg = [{ $name }] sa deconectat +hud-chat-default_death_msg = [{ $name }] a murit +hud-chat-environmental_kill_msg = [{ $name }] a murit în { $environment } +hud-chat-fall_kill_msg = [{ $name }] a cazut de la înalțime +hud-chat-suicide_msg = [{ $name }] a murit din cauza rănilor autoprovocate +hud-chat-died_of_pvp_buff_msg = [{ $victim }] { $died_of_buff } cauzat de [{ $attacker }] +hud-chat-pvp_melee_kill_msg = [{ $attacker }] a învins [{ $victim }] +hud-chat-pvp_ranged_kill_msg = [{ $attacker }] a tras în [{ $victim }] +hud-chat-pvp_explosion_kill_msg = [{ $attacker }] a facut ca [{ $victim }] să explodeze +hud-chat-pvp_energy_kill_msg = [{ $attacker }] a omorât [{ $victim }] cu magie +hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } cauzat de { $attacker } +hud-chat-npc_melee_kill_msg = { $attacker } a omorât [{ $victim }] +hud-chat-npc_ranged_kill_msg = { $attacker } a tras în [{ $victim }] +hud-chat-npc_explosion_kill_msg = { $attacker } a facut ca [{ $victim }] să explodeze +hud-chat-npc_energy_kill_msg = { $attacker } a omorât [{ $victim }] cu magie +hud-chat-npc_other_kill_msg = { $attacker } a omorât [{ $victim }] +hud-chat-loot_msg = Ai luat [{ $item }] +hud-chat-loot_fail = Inventarul tău este plin! +hud-chat-goodbye = Pe curând! +hud-chat-connection_lost = Conexiune pierdută. Vei fi dat afară în { $time } secunde. \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/chat.ron b/assets/voxygen/i18n/ro_RO/hud/chat.ron deleted file mode 100644 index e2d4419b01..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/chat.ron +++ /dev/null @@ -1,49 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.chat.all": "Toate", - "hud.chat.chat_tab_hover_tooltip": "Clic dreapta pentru setări", - - // Debuff outcomes - "hud.outcome.burning": "a murit prin: ardere", - "hud.outcome.curse": "a murit prin: blestem", - "hud.outcome.bleeding": "a murit prin: sângerare", - "hud.outcome.crippled": "a murit prin: amputare", - "hud.outcome.frozen": "a murit prin: înghețare", - - // Chat outputs - "hud.chat.online_msg": "[{name}] sa conectat", - "hud.chat.offline_msg": "[{name}] sa deconectat", - - "hud.chat.default_death_msg": "[{name}] a murit", - "hud.chat.environmental_kill_msg": "[{name}] a murit în {environment}", - "hud.chat.fall_kill_msg": "[{name}] a cazut de la înalțime", - "hud.chat.suicide_msg": "[{name}] a murit din cauza rănilor autoprovocate", - - "hud.chat.died_of_pvp_buff_msg": "[{victim}] {died_of_buff} cauzat de [{attacker}]", - "hud.chat.pvp_melee_kill_msg": "[{attacker}] a învins [{victim}]", - "hud.chat.pvp_ranged_kill_msg": "[{attacker}] a tras în [{victim}]", - "hud.chat.pvp_explosion_kill_msg": "[{attacker}] a facut ca [{victim}] să explodeze", - "hud.chat.pvp_energy_kill_msg": "[{attacker}] a omorât [{victim}] cu magie", - - "hud.chat.died_of_buff_nonexistent_msg": "[{victim}] {died_of_buff}", - - "hud.chat.died_of_npc_buff_msg": "[{victim}] {died_of_buff} cauzat de {attacker}", - "hud.chat.npc_melee_kill_msg": "{attacker} a omorât [{victim}]", - "hud.chat.npc_ranged_kill_msg": "{attacker} a tras în [{victim}]", - "hud.chat.npc_explosion_kill_msg": "{attacker} a facut ca [{victim}] să explodeze", - "hud.chat.npc_energy_kill_msg": "{attacker} a omorât [{victim}] cu magie", - "hud.chat.npc_other_kill_msg": "{attacker} a omorât [{victim}]", - - "hud.chat.loot_msg": "Ai luat [{item}]", - "hud.chat.loot_fail": "Inventarul tău este plin!", - "hud.chat.goodbye": "Pe curând!", - "hud.chat.connection_lost": "Conexiune pierdută. Vei fi dat afară în {time} secunde.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/crafting.ftl b/assets/voxygen/i18n/ro_RO/hud/crafting.ftl new file mode 100644 index 0000000000..18b76a259e --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/crafting.ftl @@ -0,0 +1,44 @@ +hud-crafting = Meșteșug +hud-crafting-recipes = Rețete +hud-crafting-ingredients = Ingrediente: +hud-crafting-craft = Craft +hud-crafting-tool_cata = Necesită: +hud-crafting-req_crafting_station = Necesită: +hud-crafting-anvil = Nicovală +hud-crafting-cauldron = Cazan +hud-crafting-cooking_pot = Oală de gătit +hud-crafting-crafting_bench = Masă de meșteșug +hud-crafting-forge = Forjă +hud-crafting-loom = Tăbăcărie +hud-crafting-spinning_wheel = Roată de Tors +hud-crafting-tanning_rack = Război de Țesut +hud-crafting-salvaging_station = Masă de Demontare +hud-crafting-campfire = Foc de Tabară +hud-crafting-tabs-all = Toate +hud-crafting-tabs-armor = Armură +hud-crafting-tabs-dismantle = Demontează +hud-crafting-tabs-food = Hrană +hud-crafting-tabs-glider = Planoare +hud-crafting-tabs-potion = Poțiuni +hud-crafting-tabs-tool = Unelte +hud-crafting-tabs-utility = Utilitare +hud-crafting-tabs-weapon = Arme +hud-crafting-tabs-bag = Rucsacuri +hud-crafting-tabs-processed_material = Materiale +hud-crafting-dismantle_title = Demontare +hud-crafting-dismantle_explanation = + Pune cursorul peste iteme ca + să vezi ce poți demonta. + + Dublu-Clic pentru a începe demontarea. +hud-crafting-modular_desc = Trage bucăți de iteme aici pentru a face o armă +hud-crafting-mod_weap_prim_slot_title = Componentă Principală de Armă +hud-crafting-mod_weap_prim_slot_desc = Plasează o componentă principală de armă aici (de ex. o lamă de sabie, capăt de topor, sau membre de arc). +hud-crafting-mod_weap_sec_slot_title = Componentă Secundară de Armă +hud-crafting-mod_weap_sec_slot_desc = Plasează o componentă secundară de armă aici (e.g. a mâner de sabie, mâner de arc, sau nucleu de toiag). +hud-crafting-mod_comp_metal_prim_slot_title = Lingou de Metal +hud-crafting-mod_comp_metal_prim_slot_desc = Plasează un lingou de metal aici, doar unele tipuri de lingouri pot fi folosite pentru arme. +hud-crafting-mod_comp_wood_prim_slot_title = Lemn +hud-crafting-mod_comp_wood_prim_slot_desc = Plasează un tip de lemn aici, doar unele tipuri de lemn pot fi folosite pentru arme. +hud-crafting-mod_comp_sec_slot_title = Material de Animal +hud-crafting-mod_comp_sec_slot_desc = (Optional) Plasează un ingredient de animal, doar unlete tipuri de ingrediente pot fi folosite pentru a augmenta arme. \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/crafting.ron b/assets/voxygen/i18n/ro_RO/hud/crafting.ron deleted file mode 100644 index a7f50e5ade..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/crafting.ron +++ /dev/null @@ -1,53 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.crafting": "Meșteșug", - "hud.crafting.recipes": "Rețete", - "hud.crafting.ingredients": "Ingrediente:", - "hud.crafting.craft": "Craft", - "hud.crafting.tool_cata": "Necesită:", - // Crafting Stations - "hud.crafting.req_crafting_station": "Necesită:", - "hud.crafting.anvil": "Nicovală", - "hud.crafting.cauldron": "Cazan", - "hud.crafting.cooking_pot": "Oală de gătit", - "hud.crafting.crafting_bench": "Masă de meșteșug", - "hud.crafting.forge": "Forjă", - "hud.crafting.loom": "Tăbăcărie", - "hud.crafting.spinning_wheel": "Roată de Tors", - "hud.crafting.tanning_rack": "Război de Țesut", - "hud.crafting.salvaging_station": "Masă de Demontare", - "hud.crafting.campfire": "Foc de Tabară", - // Tabs - "hud.crafting.tabs.all": "Toate", - "hud.crafting.tabs.armor": "Armură", - "hud.crafting.tabs.dismantle": "Demontează", - "hud.crafting.tabs.food": "Hrană", - "hud.crafting.tabs.glider": "Planoare", - "hud.crafting.tabs.potion": "Poțiuni", - "hud.crafting.tabs.tool": "Unelte", - "hud.crafting.tabs.utility": "Utilitare", - "hud.crafting.tabs.weapon": "Arme", - "hud.crafting.tabs.bag": "Rucsacuri", - "hud.crafting.tabs.processed_material": "Materiale", - "hud.crafting.dismantle_title": "Demontare", - "hud.crafting.dismantle_explanation" : "Pune cursorul peste iteme ca\nsă vezi ce poți demonta.\n\nDublu-Clic pentru a începe demontarea.", - "hud.crafting.modular_desc": "Trage bucăți de iteme aici pentru a face o armă", - "hud.crafting.mod_weap_prim_slot_title": "Componentă Principală de Armă", - "hud.crafting.mod_weap_prim_slot_desc": "Plasează o componentă principală de armă aici (de ex. o lamă de sabie, capăt de topor, sau membre de arc).", - "hud.crafting.mod_weap_sec_slot_title": "Componentă Secundară de Armă", - "hud.crafting.mod_weap_sec_slot_desc": "Plasează o componentă secundară de armă aici (e.g. a mâner de sabie, mâner de arc, sau nucleu de toiag).", - "hud.crafting.mod_comp_metal_prim_slot_title": "Lingou de Metal", - "hud.crafting.mod_comp_metal_prim_slot_desc": "Plasează un lingou de metal aici, doar unele tipuri de lingouri pot fi folosite pentru arme.", - "hud.crafting.mod_comp_wood_prim_slot_title": "Lemn", - "hud.crafting.mod_comp_wood_prim_slot_desc": "Plasează un tip de lemn aici, doar unele tipuri de lemn pot fi folosite pentru arme.", - "hud.crafting.mod_comp_sec_slot_title": "Material de Animal", - "hud.crafting.mod_comp_sec_slot_desc": "(Optional) Plasează un ingredient de animal, doar unlete tipuri de ingrediente pot fi folosite pentru a augmenta arme.", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/group.ftl b/assets/voxygen/i18n/ro_RO/hud/group.ftl new file mode 100644 index 0000000000..7645d170f8 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/group.ftl @@ -0,0 +1,13 @@ +hud-group = Grup +hud-group-invite_to_join = [{ $name }] te-a invitat în grupul lor! +hud-group-invite_to_trade = [{ $name }] ar vrea să negocieze cu tine. +hud-group-invite = Invită +hud-group-kick = Dă afară +hud-group-assign_leader = Desemnează lider +hud-group-leave = Parasește Grupul +hud-group-dead = Mort +hud-group-out_of_range = Prea departe +hud-group-add_friend = Adaugă la Prieteni +hud-group-link_group = Link Grupuri +hud-group-in_menu = În meniu +hud-group-members = Membri Grupului \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/group.ron b/assets/voxygen/i18n/ro_RO/hud/group.ron deleted file mode 100644 index 3b79e07d01..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/group.ron +++ /dev/null @@ -1,24 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.group": "Grup", - "hud.group.invite_to_join": "[{name}] te-a invitat în grupul lor!", - "hud.group.invite_to_trade": "[{name}] ar vrea să negocieze cu tine.", - "hud.group.invite": "Invită", - "hud.group.kick": "Dă afară", - "hud.group.assign_leader": "Desemnează lider", - "hud.group.leave": "Parasește Grupul", - "hud.group.dead" : "Mort", - "hud.group.out_of_range": "Prea departe", - "hud.group.add_friend": "Adaugă la Prieteni", - "hud.group.link_group": "Link Grupuri", - "hud.group.in_menu": "În meniu", - "hud.group.members": "Membri Grupului", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/map.ftl b/assets/voxygen/i18n/ro_RO/hud/map.ftl new file mode 100644 index 0000000000..84d18c3679 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/map.ftl @@ -0,0 +1,32 @@ +hud-map-map_title = Hartă +hud-map-qlog_title = Misiuni +hud-map-topo_map = Topografic +hud-map-difficulty = Dificultate +hud-map-towns = Sate +hud-map-castles = Castele +hud-map-dungeons = Temnițe +hud-map-caves = Perșteri +hud-map-cave = Peșteră +hud-map-peaks = Munți +hud-map-biomes = Biomuri +hud-map-voxel_map = Hartă Voxel +hud-map-trees = Copaci Giganți +hud-map-tree = Copac Gigant +hud-map-town = Sat +hud-map-castle = Castel +hud-map-dungeon = Termință +hud-map-difficulty_dungeon = + Dificultatea + + Terminței: { $difficulty } +hud-map-drag = Trage +hud-map-zoom = Zoom +hud-map-mid_click = Setează Punct de Referință +hud-map-recenter = Centrează +hud-map-marked_location = Locație Marcată +hud-map-marked_location_remove = Clic pentru a elimina +hud-map-change_map_mode = Schimbă Modul Harții +hud-map-toggle_minimap_voxel = Comută Voxel Harta-Miniatură +hud-map-zoom_minimap_explanation = Măreste harta pentru a vedea o zonă în detailu +hud-map-gnarling = Gnarling Fortification +hud-map-placed_by = Plasat de { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/map.ron b/assets/voxygen/i18n/ro_RO/hud/map.ron deleted file mode 100644 index c4a6b32742..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/map.ron +++ /dev/null @@ -1,41 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - // Map and Questlog - "hud.map.map_title": "Hartă", - "hud.map.qlog_title": "Misiuni", - "hud.map.topo_map": "Topografic", - "hud.map.difficulty": "Dificultate", - "hud.map.towns": "Sate", - "hud.map.castles": "Castele", - "hud.map.dungeons": "Temnițe", - "hud.map.caves": "Perșteri", - "hud.map.cave": "Peșteră", - "hud.map.peaks": "Munți", - "hud.map.biomes": "Biomuri", - "hud.map.voxel_map": "Hartă Voxel", - "hud.map.trees": "Copaci Giganți", - "hud.map.tree": "Copac Gigant", - "hud.map.town": "Sat", - "hud.map.castle": "Castel", - "hud.map.dungeon": "Termință", - "hud.map.difficulty_dungeon": "Dificultatea\n\nTerminței: {difficulty}", - "hud.map.drag": "Trage", - "hud.map.zoom": "Zoom", - "hud.map.mid_click": "Setează Punct de Referință", - "hud.map.recenter": "Centrează", - "hud.map.marked_location": "Locație Marcată", - "hud.map.marked_location_remove": "Clic pentru a elimina", - "hud.map.change_map_mode": "Schimbă Modul Harții", - "hud.map.toggle_minimap_voxel": "Comută Voxel Harta-Miniatură", - "hud.map.zoom_minimap_explanation": "Măreste harta pentru a vedea o zonă în detailu", - "hud.map.gnarling": "Gnarling Fortification", - "hud.map.placed_by": "Plasat de {name}", - }, - - - vector_map: { - }, -) diff --git a/assets/voxygen/i18n/ro_RO/hud/misc.ftl b/assets/voxygen/i18n/ro_RO/hud/misc.ftl new file mode 100644 index 0000000000..c31707a0f4 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/misc.ftl @@ -0,0 +1,46 @@ +hud-do_not_show_on_startup = Nu arăta asta la pornire +hud-show_tips = Arată Sfaturi +hud-quests = Misiuni +hud-you_died = Ai murit +hud-waypoint_saved = Punct de referință salvat +hud-sp_arrow_txt = PA +hud-inventory_full = Inventar Plin +hud-someone_else = alt cineva +hud-another_group = alt grup +hud-owned_by_for_secs = Deținut de { $name } timp de { $secs } secunde +hud-press_key_to_show_keybindings_fmt = [{ $key }] Taste +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Lanternă +hud-press_key_to_show_debug_info_fmt = Apasă { $key } ca să arăți debug info +hud-press_key_to_toggle_keybindings_fmt = Apasă { $key } pentru a comuta tastele +hud-press_key_to_toggle_debug_info_fmt = Apasă { $key } pentru a comuta debug info +hud-press_key_to_respawn = Apasă { $key } pentru a reînvia la ultimul foc de tabără pe care l-ai vizitat. +hud-tutorial_btn = Tutorial +hud-tutorial_click_here = Apasă [ { $key } ] ca să-ți eliberezi cursorul și să apeși pe acest button! +hud-tutorial_elements = Meșteșug +hud-temp_quest_headline = Salutări Călătorule! +hud-temp_quest_text = + Pentru a-ți începe aventura te-ai putea uita prin satul acesta și sa strângi niște resurse. + + Ești liber să iei orice vrei pentru aventura ta! + + Uită-te la colțul din dreapta jos al ecranului unde vei găsi rucsacul tău, meniul de meșteșug și harta. + + La statiile de mestesug poti face armura, arme, mancare si multe altele! + + Animalele sălbatice din jurul satului sunt o resursă bună de Piele de Animal pentru a crea puțină protecție împotriva pericolelor. + + Cănd te simți pregatit, încearcă să obți echipament și mai bun prin completarea provocărilor marcate pe hartă! +hud-spell = Vrăji +hud-diary = Jurnal +hud-free_look_indicator = Privire liberă activată. Apasă { $key } pentru a dezactiva. +hud-camera_clamp_indicator = Camera vertical clamp active. Press { $key } to disable. +hud-auto_walk_indicator = Mișcă/Înoată automat activat +hud-collect = Colectează +hud-pick_up = Ia +hud-open = Deschide +hud-use = Folosește +hud-mine = Minează +hud-talk = Vorbește +hud-trade = Negocează +hud-mount = Calarește +hud-sit = Așează-te \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/misc.ron b/assets/voxygen/i18n/ro_RO/hud/misc.ron deleted file mode 100644 index 9b0ba0f8c6..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/misc.ron +++ /dev/null @@ -1,66 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.do_not_show_on_startup": "Nu arăta asta la pornire", - "hud.show_tips": "Arată Sfaturi", - "hud.quests": "Misiuni", - "hud.you_died": "Ai murit", - "hud.waypoint_saved": "Punct de referință salvat", - "hud.sp_arrow_txt": "PA", - "hud.inventory_full": "Inventar Plin", - "hud.someone_else": "alt cineva", - "hud.another_group": "alt grup", - "hud.owned_by_for_secs": "Deținut de {name} timp de {secs} secunde", - - "hud.press_key_to_show_keybindings_fmt": "[{key}] Taste", - "hud.press_key_to_toggle_lantern_fmt": "[{key}] Lanternă", - "hud.press_key_to_show_debug_info_fmt": "Apasă {key} ca să arăți debug info", - "hud.press_key_to_toggle_keybindings_fmt": "Apasă {key} pentru a comuta tastele", - "hud.press_key_to_toggle_debug_info_fmt": "Apasă {key} pentru a comuta debug info", - - // Respawn message - "hud.press_key_to_respawn": r#"Apasă {key} pentru a reînvia la ultimul foc de tabără pe care l-ai vizitat."#, - - // Tutorial Button - "hud.tutorial_btn": r#"Tutorial"#, - "hud.tutorial_click_here": r#"Apasă [ {key} ] ca să-ți eliberezi cursorul și să apeși pe acest button!"#, - "hud.tutorial_elements": r#"Meșteșug"#, - -"hud.temp_quest_headline": r#"Salutări Călătorule!"#, -"hud.temp_quest_text": r#"Pentru a-ți începe aventura te-ai putea uita prin satul acesta și sa strângi niște resurse. - -Ești liber să iei orice vrei pentru aventura ta! - -Uită-te la colțul din dreapta jos al ecranului unde vei găsi rucsacul tău, meniul de meșteșug și harta. - -La statiile de mestesug poti face armura, arme, mancare si multe altele! - -Animalele sălbatice din jurul satului sunt o resursă bună de Piele de Animal pentru a crea puțină protecție împotriva pericolelor. - -Cănd te simți pregatit, încearcă să obți echipament și mai bun prin completarea provocărilor marcate pe hartă! -"#, - - "hud.spell": "Vrăji", - // Diary - "hud.diary": "Jurnal", - - "hud.free_look_indicator": "Privire liberă activată. Apasă {key} pentru a dezactiva.", - "hud.camera_clamp_indicator": "Camera vertical clamp active. Press {key} to disable.", - "hud.auto_walk_indicator": "Mișcă/Înoată automat activat", - "hud.collect": "Colectează", - "hud.pick_up": "Ia", - "hud.open": "Deschide", - "hud.use": "Folosește", - "hud.mine": "Minează", - "hud.talk": "Vorbește", - "hud.trade": "Negocează", - "hud.mount": "Calarește", - "hud.sit": "Așează-te", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/sct.ftl b/assets/voxygen/i18n/ro_RO/hud/sct.ftl new file mode 100644 index 0000000000..f569e03779 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/sct.ftl @@ -0,0 +1,2 @@ +hud-sct-experience = { $amount } Exp +hud-sct-block = BLOCAT \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/sct.ron b/assets/voxygen/i18n/ro_RO/hud/sct.ron deleted file mode 100644 index 386e5f55d3..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/sct.ron +++ /dev/null @@ -1,14 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - // SCT outputs - "hud.sct.experience": "{amount} Exp", - "hud.sct.block": "BLOCAT", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/settings.ftl b/assets/voxygen/i18n/ro_RO/hud/settings.ftl new file mode 100644 index 0000000000..f185deb71b --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/settings.ftl @@ -0,0 +1,135 @@ +hud-settings-general = General +hud-settings-none = Nimic +hud-settings-press_behavior-toggle = Comută +hud-settings-press_behavior-hold = Ține apăsat +hud-settings-help_window = Fereastra de Ajutor +hud-settings-debug_info = Debug Info +hud-settings-show_hitboxes = Show hitboxes +hud-settings-show_chat = Arată chat +hud-settings-show_hotkey_hints = Afișează sugestii pentru taste rapide +hud-settings-tips_on_startup = Sfaturi la Pornire +hud-settings-ui_scale = Mărimea interfaței +hud-settings-relative_scaling = Marime Relativă +hud-settings-custom_scaling = Marire Personalizată +hud-settings-crosshair = Cursor +hud-settings-opacity = Opacitate +hud-settings-hotbar = Bară +hud-settings-toggle_shortcuts = Comută Taste Rapide +hud-settings-buffs_skillbar = Buffs in dreptul bării de ablități +hud-settings-buffs_mmap = Buffs in dreptul Harții-Miniatură +hud-settings-toggle_bar_experience = Comută Bara de Experiență +hud-settings-scrolling_combat_text = Scrolling Combat Text +hud-settings-damage_accumulation_duration = Damage Accumulation Duration +hud-settings-incoming_damage = Incoming Damage +hud-settings-incoming_damage_accumulation_duration = Incoming Damage Accumulation Duration +hud-settings-round_damage = Round Damage +hud-settings-speech_bubble = Speech Bubble +hud-settings-speech_bubble_self = Show Own Speech Bubbles +hud-settings-speech_bubble_dark_mode = Speech Bubble Dark Mode +hud-settings-speech_bubble_icon = Speech Bubble Icon +hud-settings-energybar_numbers = Energybar Numbers +hud-settings-always_show_bars = Always show Energybars +hud-settings-experience_numbers = Experience Numbers +hud-settings-accumulate_experience = Accumulate Experience Numbers +hud-settings-values = Valori +hud-settings-percentages = Procente +hud-settings-chat = Chat +hud-settings-background_opacity = Opacitate Fundal +hud-settings-chat_character_name = Character Names in Chat +hud-settings-loading_tips = Sfaturi în Ecranul de Incarcare +hud-settings-reset_interface = Resetează la starea inițială +hud-settings-pan_sensitivity = Pan Sensitivity +hud-settings-zoom_sensitivity = Senzitivitate Zoom +hud-settings-camera_clamp_angle = Angle for vertical camera clamp mode +hud-settings-invert_scroll_zoom = Invert Scroll Zoom +hud-settings-invert_mouse_y_axis = Invert Mouse Y Axis +hud-settings-invert_controller_y_axis = Invert Controller Y Axis +hud-settings-enable_mouse_smoothing = Camera Smoothing +hud-settings-free_look_behavior = Free look behavior +hud-settings-auto_walk_behavior = Auto walk behavior +hud-settings-camera_clamp_behavior = Camera clamp behavior +hud-settings-player_physics_behavior = Player physics (experimental) +hud-settings-stop_auto_walk_on_input = Stop auto walk on movement +hud-settings-auto_camera = Auto camera +hud-settings-bow_zoom = Zoom in when charging bow +hud-settings-reset_gameplay = Resetează la starea inițială +hud-settings-view_distance = Distanța Vizuală +hud-settings-lod_distance = LoD Distance +hud-settings-sprites_view_distance = Distanță Vizuală Sprites +hud-settings-figures_view_distance = Distanță Vizuală Entități +hud-settings-maximum_fps = Maximum de FPS +hud-settings-background_fps = FPS în Fundal +hud-settings-present_mode = Present Mode +hud-settings-present_mode-fifo = Fifo +hud-settings-present_mode-mailbox = Mailbox +hud-settings-present_mode-immediate = Immediate +hud-settings-fov = Câmp vizual (grade) +hud-settings-gamma = Gamma +hud-settings-exposure = Expunere +hud-settings-ambiance = Luminozitatea ambianței +hud-settings-antialiasing_mode = AntiAliasing Mode +hud-settings-upscale_factor = Rezoluția Internă +hud-settings-cloud_rendering_mode = Cloud Rendering Mode +hud-settings-fluid_rendering_mode = Fluid Rendering Mode +hud-settings-fluid_rendering_mode-cheap = Foarte Slab +hud-settings-fluid_rendering_mode-shiny = Stralucitor +hud-settings-cloud_rendering_mode-minimal = Minimal +hud-settings-cloud_rendering_mode-low = Slab +hud-settings-cloud_rendering_mode-medium = Mediu +hud-settings-cloud_rendering_mode-high = Intensiv +hud-settings-cloud_rendering_mode-ultra = Ultra +hud-settings-fullscreen = Ecran Complet +hud-settings-fullscreen_mode = Mod Ecran Complet +hud-settings-fullscreen_mode-exclusive = Exclusiv +hud-settings-fullscreen_mode-borderless = Fără margini +hud-settings-gpu_profiler = Enable GPU timing (not supported everywhere) +hud-settings-particles = Particule +hud-settings-lossy_terrain_compression = Lossy terrain compression +hud-settings-weapon_trails = Urme de Arme +hud-settings-flashing_lights = Lumini intermitente +hud-settings-flashing_lights_info = Disables all kinds of flashing, e.g. flickering or lightning strikes +hud-settings-resolution = Rezoluție +hud-settings-bit_depth = Adâncime biți +hud-settings-refresh_rate = Rată de reîmprospătare +hud-settings-lighting_rendering_mode = Modul de redare a luminii +hud-settings-lighting_rendering_mode-ashikhmin = Tip A - Intensiv +hud-settings-lighting_rendering_mode-blinnphong = Tip B - Mediu +hud-settings-lighting_rendering_mode-lambertian = Tip L - Slab +hud-settings-shadow_rendering_mode = Shadow Rendering Mode +hud-settings-shadow_rendering_mode-none = Nimic +hud-settings-shadow_rendering_mode-cheap = Slab +hud-settings-shadow_rendering_mode-map = Hartă +hud-settings-shadow_rendering_mode-map-resolution = Rezoluție +hud-settings-rain_occlusion-resolution = Rain Occlusion Resolution +hud-settings-lod_detail = LoD Detail +hud-settings-save_window_size = Salvează Mărimea Ferestrei +hud-settings-reset_graphics = Resetează la starea inițială +hud-settings-bloom = Strălucire +hud-settings-point_glow = Point Glow +hud-settings-master_volume = Volum Principal +hud-settings-inactive_master_volume_perc = Volum Fereastră Inactivă +hud-settings-music_volume = Volum Muzică +hud-settings-sound_effect_volume = Volum Efecte Sonore +hud-settings-ambience_volume = Volum Ambianță +hud-settings-music_frequency = Pauză între Muzică +hud-settings-audio_device = Dispozitiv Audio +hud-settings-reset_sound = Resetează la starea inițială +hud-settings-english_fallback = Afișează în Engleză pentru traduceri care lipsesc +hud-settings-awaitingkey = Apasă o tastă... +hud-settings-unbound = Nimic +hud-settings-reset_keybinds = Resetează la starea inițială +hud-settings-chat_tabs = Fereastre de Chat +hud-settings-label = Eticheta: +hud-settings-delete = Șterge +hud-settings-show_all = Afișează toate +hud-settings-messages = Mesaje +hud-settings-activity = Activitate +hud-settings-death = Moarte +hud-settings-group = Grup +hud-settings-faction = Facțiune +hud-settings-world = Lume +hud-settings-region = Regiune +hud-settings-say = Spune +hud-settings-all = Toate +hud-settings-group_only = Doar în grup +hud-settings-reset_chat = Resetează la starea inițială \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/settings.ron b/assets/voxygen/i18n/ro_RO/hud/settings.ron deleted file mode 100644 index fe954f90cd..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/settings.ron +++ /dev/null @@ -1,153 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - // Settings - "hud.settings.general": "General", - "hud.settings.none": "Nimic", - "hud.settings.press_behavior.toggle": "Comută", - "hud.settings.press_behavior.hold": "Ține apăsat", - "hud.settings.help_window": "Fereastra de Ajutor", - "hud.settings.debug_info": "Debug Info", - "hud.settings.show_hitboxes": "Show hitboxes", - "hud.settings.show_chat": "Arată chat", - "hud.settings.show_hotkey_hints": "Afișează sugestii pentru taste rapide", - "hud.settings.tips_on_startup": "Sfaturi la Pornire", - "hud.settings.ui_scale": "Mărimea interfaței", - "hud.settings.relative_scaling": "Marime Relativă", - "hud.settings.custom_scaling": "Marire Personalizată", - "hud.settings.crosshair": "Cursor", - "hud.settings.opacity": "Opacitate", - "hud.settings.hotbar": "Bară", - "hud.settings.toggle_shortcuts": "Comută Taste Rapide", - "hud.settings.buffs_skillbar": "Buffs in dreptul bării de ablități ", - "hud.settings.buffs_mmap": "Buffs in dreptul Harții-Miniatură", - "hud.settings.toggle_bar_experience": "Comută Bara de Experiență", - "hud.settings.scrolling_combat_text": "Scrolling Combat Text", - "hud.settings.damage_accumulation_duration": "Damage Accumulation Duration", - "hud.settings.incoming_damage": "Incoming Damage", - "hud.settings.incoming_damage_accumulation_duration": "Incoming Damage Accumulation Duration", - "hud.settings.round_damage": "Round Damage", - "hud.settings.speech_bubble": "Speech Bubble", - "hud.settings.speech_bubble_self": "Show Own Speech Bubbles", - "hud.settings.speech_bubble_dark_mode": "Speech Bubble Dark Mode", - "hud.settings.speech_bubble_icon": "Speech Bubble Icon", - "hud.settings.energybar_numbers": "Energybar Numbers", - "hud.settings.always_show_bars": "Always show Energybars", - "hud.settings.experience_numbers": "Experience Numbers", - "hud.settings.accumulate_experience": "Accumulate Experience Numbers", - "hud.settings.values": "Valori", - "hud.settings.percentages": "Procente", - "hud.settings.chat": "Chat", - "hud.settings.background_opacity": "Opacitate Fundal", - "hud.settings.chat_character_name": "Character Names in Chat", - "hud.settings.loading_tips": "Sfaturi în Ecranul de Incarcare", - "hud.settings.reset_interface": "Resetează la starea inițială", - - "hud.settings.pan_sensitivity": "Pan Sensitivity", - "hud.settings.zoom_sensitivity": "Senzitivitate Zoom", - "hud.settings.camera_clamp_angle": "Angle for vertical camera clamp mode", - "hud.settings.invert_scroll_zoom": "Invert Scroll Zoom", - "hud.settings.invert_mouse_y_axis": "Invert Mouse Y Axis", - "hud.settings.invert_controller_y_axis": "Invert Controller Y Axis", - "hud.settings.enable_mouse_smoothing": "Camera Smoothing", - "hud.settings.free_look_behavior": "Free look behavior", - "hud.settings.auto_walk_behavior": "Auto walk behavior", - "hud.settings.camera_clamp_behavior": "Camera clamp behavior", - "hud.settings.player_physics_behavior": "Player physics (experimental)", - "hud.settings.stop_auto_walk_on_input": "Stop auto walk on movement", - "hud.settings.auto_camera": "Auto camera", - "hud.settings.bow_zoom": "Zoom in when charging bow", - "hud.settings.reset_gameplay": "Resetează la starea inițială", - - "hud.settings.view_distance": "Distanța Vizuală", - "hud.settings.lod_distance": "LoD Distance", - "hud.settings.sprites_view_distance": "Distanță Vizuală Sprites", - "hud.settings.figures_view_distance": "Distanță Vizuală Entități", - "hud.settings.maximum_fps": "Maximum de FPS", - "hud.settings.background_fps": "FPS în Fundal", - "hud.settings.present_mode": "Present Mode", - "hud.settings.present_mode.fifo": "Fifo", - "hud.settings.present_mode.mailbox": "Mailbox", - "hud.settings.present_mode.immediate": "Immediate", - "hud.settings.fov": "Câmp vizual (grade)", - "hud.settings.gamma": "Gamma", - "hud.settings.exposure": "Expunere", - "hud.settings.ambiance": "Luminozitatea ambianței", - "hud.settings.antialiasing_mode": "AntiAliasing Mode", - "hud.settings.upscale_factor": "Rezoluția Internă", - "hud.settings.cloud_rendering_mode": "Cloud Rendering Mode", - "hud.settings.fluid_rendering_mode": "Fluid Rendering Mode", - "hud.settings.fluid_rendering_mode.cheap": "Foarte Slab", - "hud.settings.fluid_rendering_mode.shiny": "Stralucitor", - "hud.settings.cloud_rendering_mode.minimal": "Minimal", - "hud.settings.cloud_rendering_mode.low": "Slab", - "hud.settings.cloud_rendering_mode.medium": "Mediu", - "hud.settings.cloud_rendering_mode.high": "Intensiv", - "hud.settings.cloud_rendering_mode.ultra": "Ultra", - "hud.settings.fullscreen": "Ecran Complet", - "hud.settings.fullscreen_mode": "Mod Ecran Complet", - "hud.settings.fullscreen_mode.exclusive": "Exclusiv", - "hud.settings.fullscreen_mode.borderless": "Fără margini", - "hud.settings.gpu_profiler": "Enable GPU timing (not supported everywhere)", - "hud.settings.particles": "Particule", - "hud.settings.lossy_terrain_compression": "Lossy terrain compression", - "hud.settings.weapon_trails": "Urme de Arme", - "hud.settings.flashing_lights": "Lumini intermitente", - "hud.settings.flashing_lights_info": "Disables all kinds of flashing, e.g. flickering or lightning strikes", - "hud.settings.resolution": "Rezoluție", - "hud.settings.bit_depth": "Adâncime biți", - "hud.settings.refresh_rate": "Rată de reîmprospătare", - "hud.settings.lighting_rendering_mode": "Modul de redare a luminii", - "hud.settings.lighting_rendering_mode.ashikhmin": "Tip A - Intensiv ", - "hud.settings.lighting_rendering_mode.blinnphong": "Tip B - Mediu", - "hud.settings.lighting_rendering_mode.lambertian": "Tip L - Slab", - "hud.settings.shadow_rendering_mode": "Shadow Rendering Mode", - "hud.settings.shadow_rendering_mode.none": "Nimic", - "hud.settings.shadow_rendering_mode.cheap": "Slab", - "hud.settings.shadow_rendering_mode.map": "Hartă", - "hud.settings.shadow_rendering_mode.map.resolution": "Rezoluție", - "hud.settings.rain_occlusion.resolution": "Rain Occlusion Resolution", - "hud.settings.lod_detail": "LoD Detail", - "hud.settings.save_window_size": "Salvează Mărimea Ferestrei", - "hud.settings.reset_graphics": "Resetează la starea inițială", - "hud.settings.bloom": "Strălucire", - "hud.settings.point_glow": "Point Glow", - - "hud.settings.master_volume": "Volum Principal", - "hud.settings.inactive_master_volume_perc": "Volum Fereastră Inactivă", - "hud.settings.music_volume": "Volum Muzică", - "hud.settings.sound_effect_volume": "Volum Efecte Sonore", - "hud.settings.ambience_volume": "Volum Ambianță", - "hud.settings.music_frequency": "Pauză între Muzică", - "hud.settings.audio_device": "Dispozitiv Audio", - "hud.settings.reset_sound": "Resetează la starea inițială", - - "hud.settings.english_fallback": "Afișează în Engleză pentru traduceri care lipsesc", - - "hud.settings.awaitingkey": "Apasă o tastă...", - "hud.settings.unbound": "Nimic", - "hud.settings.reset_keybinds": "Resetează la starea inițială", - - "hud.settings.chat_tabs": "Fereastre de Chat", - "hud.settings.label": "Eticheta:", - "hud.settings.delete": "Șterge", - "hud.settings.show_all": "Afișează toate", - "hud.settings.messages": "Mesaje", - "hud.settings.activity": "Activitate", - "hud.settings.death": "Moarte", - "hud.settings.group": "Grup", - "hud.settings.faction": "Facțiune", - "hud.settings.world": "Lume", - "hud.settings.region": "Regiune", - "hud.settings.say": "Spune", - "hud.settings.all": "Toate", - "hud.settings.group_only": "Doar în grup", - "hud.settings.reset_chat" : "Resetează la starea inițială", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/skills.ftl b/assets/voxygen/i18n/ro_RO/hud/skills.ftl new file mode 100644 index 0000000000..1fc186df94 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/skills.ftl @@ -0,0 +1,239 @@ +hud-rank_up = Punct de Abilitate Nou +hud-skill-sp_available = { $number } PA valabile +hud-skill-not_unlocked = Nedeblocat încă +hud-skill-req_sp ={"\u000A"} + + Necesită { $number } PA +hud-skill-inc_health_title = Mărește Viața +hud-skill-inc_health = Mărește capacitatea vietii cu { $boost }{ $SP } +hud-skill-inc_energy_title = Mărește Energia +hud-skill-inc_energy = Marește capacitatea energiei cu { $boost }{ $SP } +hud-skill-unlck_sword_title = Deblochează Sabia +hud-skill-unlck_sword = Deblochează copacul abilitaților pentru sabie{ $SP } +hud-skill-unlck_axe_title = Deblochează Topor +hud-skill-unlck_axe = Deblochează copacul abilitaților pentru topor{ $SP } +hud-skill-unlck_hammer_title = Deblochează Ciocan +hud-skill-unlck_hammer = Deblochează copacul abilitaților pentru ciocan{ $SP } +hud-skill-unlck_bow_title = Deblochează Arc +hud-skill-unlck_bow = Deblochează copacul abilitaților pentru arc{ $SP } +hud-skill-unlck_staff_title = Deblochează Toiag +hud-skill-unlck_staff = Deblochează copacul abilitaților pentru toiag{ $SP } +hud-skill-unlck_sceptre_title = Deblochează Sceptru +hud-skill-unlck_sceptre = Deblochează copacul abilitaților pentru sceptru{ $SP } +hud-skill-dodge_title = Evită +hud-skill-dodge = Rostogoliri evazive sunt efectuate cu clicul-mijlociu, și acordă imunitate temporară la atacurile corp la corp (iframes) în timp ce te rostogolești. +hud-skill-roll_energy_title = Costul de Energie pentru Rostogolire +hud-skill-roll_energy = Rostogolorea foloseste cu { $boost }% mai putina energie{ $SP } +hud-skill-roll_speed_title = Viteza Rostogolirii +hud-skill-roll_speed = Rostogoleste-te de { $boost }% mai repede{ $SP } +hud-skill-roll_dur_title = Durata Rostogolirii +hud-skill-roll_dur = Rotogoleste-te de { $boost }% mai mult{ $SP } +hud-skill-climbing_title = Cățărare +hud-skill-climbing = Sarind mai sus +hud-skill-climbing_cost_title = Costul Cățărării +hud-skill-climbing_cost = Cățărarea folosește cu { $boost }% mai puțină energie{ $SP } +hud-skill-climbing_speed_title = Viteza Cățărării +hud-skill-climbing_speed = Cațără-te de { $boost }% mai rapid{ $SP } +hud-skill-swim_title = Înot +hud-skill-swim = Mișcare în mediu ud +hud-skill-swim_speed_title = Viteza Înotului +hud-skill-swim_speed = Înoata de { $boost }% mai repede{ $SP } +hud-skill-sc_lifesteal_title = Raza Furtilui de Viata +hud-skill-sc_lifesteal = Extrage viata din sangele inamicilor tai +hud-skill-sc_lifesteal_damage_title = Daune +hud-skill-sc_lifesteal_damage = Provoaca cu { $boost }% mai multe daune{ $SP } +hud-skill-sc_lifesteal_range_title = Distanta +hud-skill-sc_lifesteal_range = Raza ta ajunge cu { $boost }% mai departe{ $SP } +hud-skill-sc_lifesteal_lifesteal_title = Furt de Viata +hud-skill-sc_lifesteal_lifesteal = Transforma cu { $boost }% mai mult sange in viata{ $SP } +hud-skill-sc_lifesteal_regen_title = Regenerare Energie +hud-skill-sc_lifesteal_regen = Recupereaza-ti energia cu { $boost }%{ $SP } +hud-skill-sc_heal_title = Aura Vindecatoare +hud-skill-sc_heal = Vindeca-ti aliatii folosing sangele inamicilor tai, iti trebuie combo pentru activare +hud-skill-sc_heal_heal_title = Vindecare +hud-skill-sc_heal_heal = Te vindeci de { $boost }% mai mult{ $SP } +hud-skill-sc_heal_cost_title = Costul de Energie +hud-skill-sc_heal_cost = Vindecarea necesita cu { $boost }% mai putina energie{ $SP } +hud-skill-sc_heal_duration_title = Duratia +hud-skill-sc_heal_duration = Efecetele aurii de vindecare dureaza cu { $boost }% mai mult{ $SP } +hud-skill-sc_heal_range_title = Raza +hud-skill-sc_heal_range = Aura ta vindecatoare ajunge cu { $boost }% mai departe{ $SP } +hud-skill-sc_wardaura_unlock_title = Deblocheaza Aura Protectoare +hud-skill-sc_wardaura_unlock = Te lasa sa-ti protejezi amici de atacurile inamicilor cu o aura protectoare{ $SP } +hud-skill-sc_wardaura_strength_title = Putere +hud-skill-sc_wardaura_strength = Mareste puterea protectiei cu { $boost }%{ $SP } +hud-skill-sc_wardaura_duration_title = Duratie +hud-skill-sc_wardaura_duration = Efectele protectiei tale dureaza de { $boost }% mai mult{ $SP } +hud-skill-sc_wardaura_range_title = Raza +hud-skill-sc_wardaura_range = Protectia ajunge de { $boost }% mai departe{ $SP } +hud-skill-sc_wardaura_cost_title = Costul de Energie +hud-skill-sc_wardaura_cost = Creearea protectieti necisita de { $boost }% mei putina enerigie{ $SP } +hud-skill-st_shockwave_range_title = Raza Undei de Soc +hud-skill-st_shockwave_range = Mareste raza undei de soc cu { $boost }%{ $SP } +hud-skill-st_shockwave_cost_title = Costul Undei de Soc +hud-skill-st_shockwave_cost = Scade pretul energiei pentru a arunca sateni neajutorati cu { $boost }%{ $SP } +hud-skill-st_shockwave_knockback_title = Aruncarea Undei de Soc +hud-skill-st_shockwave_knockback = Mareste potentialul aruncarii cu { $boost }%{ $SP } +hud-skill-st_shockwave_damage_title = Daunele Undei de Soc +hud-skill-st_shockwave_damage = Mareste daunele cauzare de unda de soc cu { $boost }%{ $SP } +hud-skill-st_shockwave_unlock_title = Deblocheaza Unda de Soc +hud-skill-st_shockwave_unlock = Deblocheaza abilitatea de a arunca inamicii la distanta folosind flacari{ $SP } +hud-skill-st_flamethrower_title = Aruncator de Flacari +hud-skill-st_flamethrower = Arunca flacari, arde-i pe toti +hud-skill-st_flame_velocity_title = Velocitatea Flacarii +hud-skill-st_flame_velocity = Flacara ajunge de { $boost }% mai repede la destinatie{ $SP } +hud-skill-st_flamethrower_range_title = Raza pentru Aruncator de Flacari +hud-skill-st_flamethrower_range = Pentru cand flacarile nu ajung, vor merge de { $boost }% mai departe{ $SP } +hud-skill-st_energy_drain_title = Consumptia Energiei +hud-skill-st_energy_drain = Scade rata la care se consuma energia cu { $boost }%{ $SP } +hud-skill-st_flamethrower_damage_title = Daune Aruncator de Flacari +hud-skill-st_flamethrower_damage = Mareste daunele cu { $boost }%{ $SP } +hud-skill-st_explosion_radius_title = Raza exploziei +hud-skill-st_explosion_radius = Mai mare inseamna mai bine, mareste raza exploziei cu { $boost }%{ $SP } +hud-skill-st_energy_regen_title = Regenerare Energie +hud-skill-st_energy_regen = Marsete extrasul de energie cu { $boost }%{ $SP } +hud-skill-st_fireball_title = Minge in Flacari +hud-skill-st_fireball = Arunca o minge in flacari care explodeaza la impact +hud-skill-st_damage_title = Daune +hud-skill-st_damage = Mareste daunele cu { $boost }%{ $SP } +hud-skill-bow_projectile_speed_title = Viteza Proiectilei +hud-skill-bow_projectile_speed = Trage sageti de { $boost }% mai departe, mai rapid{ $SP } +hud-skill-bow_charged_title = Sageata Incarcata +hud-skill-bow_charged = Pentru ca ai ajteptat mai mult +hud-skill-bow_charged_damage_title = Daune Incarcare +hud-skill-bow_charged_damage = Mareste daunele cu { $boost }%{ $SP } +hud-skill-bow_charged_energy_regen_title = Regenerate Incarcare +hud-skill-bow_charged_energy_regen = Mareste recuperarea energiei cu { $boost }%{ $SP } +hud-skill-bow_charged_knockback_title = Aruncare Incarcare +hud-skill-bow_charged_knockback = Arunca inamicii de { $boost }% mai departe{ $SP } +hud-skill-bow_charged_speed_title = Charged Speed +hud-skill-bow_charged_speed = Increases the rate that you charge the attack by { $boost }%{ $SP } +hud-skill-bow_charged_move_title = Charged Move Speed +hud-skill-bow_charged_move = Increases how fast you can shuffle while charging the attack by { $boost }%{ $SP } +hud-skill-bow_repeater_title = Repeater +hud-skill-bow_repeater = Cu cat tragi mai mult cu atat trafi mai rapid +hud-skill-bow_repeater_damage_title = Daune Repeater +hud-skill-bow_repeater_damage = Mareste daunele cauzate cu { $boost }%{ $SP } +hud-skill-bow_repeater_cost_title = Repeater Cost +hud-skill-bow_repeater_cost = Decreases the energy cost to become a repeater by { $boost }%{ $SP } +hud-skill-bow_repeater_speed_title = Viteza Repeater +hud-skill-bow_repeater_speed = Increases the rate at which you fire arrows by { $boost }%{ $SP } +hud-skill-bow_shotgun_unlock_title = Unlocks Shotgun +hud-skill-bow_shotgun_unlock = Unlocks ability to fire multiple arrows at once{ $SP } +hud-skill-bow_shotgun_damage_title = Shotgun Damage +hud-skill-bow_shotgun_damage = Increases the damage done by { $boost }%{ $SP } +hud-skill-bow_shotgun_cost_title = Shotgun Cost +hud-skill-bow_shotgun_cost = Decreases the cost of shotgun by { $boost }%{ $SP } +hud-skill-bow_shotgun_arrow_count_title = Shotgun Arrows +hud-skill-bow_shotgun_arrow_count = Increases the number of arrows in the burst by { $boost }{ $SP } +hud-skill-bow_shotgun_spread_title = Shotgun Spread +hud-skill-bow_shotgun_spread = Decreases the spread of the arrows by { $boost }%{ $SP } +hud-skill-hmr_leap_radius_title = Leap Radius +hud-skill-hmr_leap_radius = Increases attack radius on ground slam by { $boost } meter{ $SP } +hud-skill-hmr_leap_distance_title = Leap Distance +hud-skill-hmr_leap_distance = Increases distance of leap by { $boost }%{ $SP } +hud-skill-hmr_leap_cost_title = Leap Cost +hud-skill-hmr_leap_cost = Decreases cost of leap by { $boost }%{ $SP } +hud-skill-hmr_leap_knockback_title = Leap Knockback +hud-skill-hmr_leap_knockback = Increases knockback from leap by { $boost }%{ $SP } +hud-skill-hmr_leap_damage_title = Leap Damage +hud-skill-hmr_leap_damage = Increases damage of leap by { $boost }%{ $SP } +hud-skill-hmr_unlock_leap_title = Unlock Leap +hud-skill-hmr_unlock_leap = Unlocks a leap{ $SP } +hud-skill-hmr_charged_melee_title = Charged Melee +hud-skill-hmr_charged_melee = Melee but with charge +hud-skill-hmr_charged_rate_title = Charge Rate +hud-skill-hmr_charged_rate = Increases the rate that you charge the swing by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_nrg_drain_title = Charged Melee Energy Drain +hud-skill-hmr_charged_melee_nrg_drain = Decreases the rate energy drains when charging by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_damage_title = Charged Melee Damage +hud-skill-hmr_charged_melee_damage = Increases the damage of the charged swing by { $boost }%{ $SP } +hud-skill-hmr_charged_melee_knockback_title = Charged Melee Knockback +hud-skill-hmr_charged_melee_knockback = Massively increases throw potential of swing by { $boost }%{ $SP } +hud-skill-hmr_single_strike_title = Single Strike +hud-skill-hmr_single_strike = As single as you are +hud-skill-hmr_single_strike_regen_title = Single Strike Regen +hud-skill-hmr_single_strike_regen = Increases energy gain with each successive strike{ $SP } +hud-skill-hmr_single_strike_speed_title = Single Strike Speed +hud-skill-hmr_single_strike_speed = Increases the attack speed with each successive strike{ $SP } +hud-skill-hmr_single_strike_damage_title = Single Strike Damage +hud-skill-hmr_single_strike_damage = Increases the damage with each successive strike{ $SP } +hud-skill-hmr_single_strike_knockback_title = Single Strike Knockback +hud-skill-hmr_single_strike_knockback = Increase throw potential of swings by { $boost }%{ $SP } +hud-skill-sw_trip_str_title = Triple Strike +hud-skill-sw_trip_str = Strike, up to three times +hud-skill-sw_trip_str_combo_title = Triple Strike Combo +hud-skill-sw_trip_str_combo = Unlocks combo scaling on triple strike{ $SP } +hud-skill-sw_trip_str_dmg_title = Triple Strike Damage +hud-skill-sw_trip_str_dmg = Increases the damage each successive strike does{ $SP } +hud-skill-sw_trip_str_sp_title = Triple Strike Speed +hud-skill-sw_trip_str_sp = Increases attack speed gained by each successive strike{ $SP } +hud-skill-sw_trip_str_reg_title = Triple Strike Regen +hud-skill-sw_trip_str_reg = Increases energy gain on each successive strike{ $SP } +hud-skill-sw_dash_title = Dash +hud-skill-sw_dash = Pin through your enemies +hud-skill-sw_dash_dmg_title = Dash Damage +hud-skill-sw_dash_dmg = Increases initial damage of the dash by { $boost }%{ $SP } +hud-skill-sw_dash_drain_title = Dash Drain +hud-skill-sw_dash_drain = Decreases the rate energy is drained while dashing by { $boost }%{ $SP } +hud-skill-sw_dash_cost_title = Dash Cost +hud-skill-sw_dash_cost = Decreases the initial cost of the dash by { $boost }%{ $SP } +hud-skill-sw_dash_speed_title = Dash Speed +hud-skill-sw_dash_speed = Increases how fast you go while dashing by { $boost }%{ $SP } +hud-skill-sw_dash_charge_through_title = Charge Through +hud-skill-sw_dash_charge_through = Allows you to charge through the first enemies you hit{ $SP } +hud-skill-sw_dash_scale_title = Dash Scaling Damage +hud-skill-sw_dash_scale = Increases the damage scaling from the dash by { $boost }%{ $SP } +hud-skill-sw_spin_title = Spin Unlock +hud-skill-sw_spin = Unlocks the sword spin{ $SP } +hud-skill-sw_spin_dmg_title = Spin Damage +hud-skill-sw_spin_dmg = Increases the damage done by { $boost }%{ $SP } +hud-skill-sw_spin_spd_title = Spin Speed +hud-skill-sw_spin_spd = Increase the speed at which you spin by { $boost }%{ $SP } +hud-skill-sw_spin_cost_title = Spin Cost +hud-skill-sw_spin_cost = Decreases the energy cost of each spin by { $boost }%{ $SP } +hud-skill-sw_spin_spins_title = Spin Spins +hud-skill-sw_spin_spins = Increases the number of times you can spin{ $SP } +hud-skill-sw_interrupt_title = Interrupting Attacks +hud-skill-sw_interrupt = Allows you to immediately cancel an attack with another attack{ $SP } +hud-skill-axe_double_strike_title = Lovitura Dubla +hud-skill-axe_double_strike = Chop down those villains +hud-skill-axe_double_strike_combo_title = Lovitura Dubla Combo +hud-skill-axe_double_strike_combo = Unlocks a second strike{ $SP } +hud-skill-axe_double_strike_damage_title = Daune Lovitura Dubla +hud-skill-axe_double_strike_damage = Increases the damage dealt in each successive strike{ $SP } +hud-skill-axe_double_strike_speed_title = Viteza Lvitura Dubla +hud-skill-axe_double_strike_speed = Increases the attack speed with each successive strike{ $SP } +hud-skill-axe_double_strike_regen_title = Regenerare Lovitura Dubla +hud-skill-axe_double_strike_regen = Increases energy gain with each successive strike{ $SP } +hud-skill-axe_spin_title = Axe Spin +hud-skill-axe_spin = You spin it right round ... +hud-skill-axe_infinite_axe_spin_title = Infinite Axe Spin +hud-skill-axe_infinite_axe_spin = Spin for as long as you have energy{ $SP } +hud-skill-axe_spin_damage_title = Spin Damage +hud-skill-axe_spin_damage = Increases the damage each spin does by { $boost }%{ $SP } +hud-skill-axe_spin_helicopter_title = Spin Helicopter +hud-skill-axe_spin_helicopter = You fall a little slower while spinning{ $SP } +hud-skill-axe_spin_speed_title = Spin Speed +hud-skill-axe_spin_speed = Increases your spin speed by { $boost }%{ $SP } +hud-skill-axe_spin_cost_title = Spin Cost +hud-skill-axe_spin_cost = Decreases energy cost of spinning by { $boost }%{ $SP } +hud-skill-axe_unlock_leap_title = Unlock Leap +hud-skill-axe_unlock_leap = Unlocks a leap spin{ $SP } +hud-skill-axe_leap_damage_title = Leap Damage +hud-skill-axe_leap_damage = Increases damage of leap by { $boost }%{ $SP } +hud-skill-axe_leap_knockback_title = Leap Knockback +hud-skill-axe_leap_knockback = Increases knockback from leap by { $boost }%{ $SP } +hud-skill-axe_leap_cost_title = Leap Cost +hud-skill-axe_leap_cost = Decreases cost of leap by { $boost }%{ $SP } +hud-skill-axe_leap_distance_title = Leap Distance +hud-skill-axe_leap_distance = Increases distance of leap by { $boost }%{ $SP } +hud-skill-mining_title = Minare +hud-skill-pick_strike_title = Lovitură de Târnăcop +hud-skill-pick_strike = Lovește roci cu târnăcopul pentru a primi minereu, gemuri și experiență +hud-skill-pick_strike_speed_title = Viteza Lovituri de Târnăcop +hud-skill-pick_strike_speed = Minează roci mai rapid{ $SP } +hud-skill-pick_strike_oregain_title = Extras de minereuri +hud-skill-pick_strike_oregain = Sansa sa primesti un minereu in plus ({ $boost }% per nivel){ $SP } +hud-skill-pick_strike_gemgain_title = Extras de gemuri +hud-skill-pick_strike_gemgain = Sansa sa primesti un gem in plus ({ $boost }% per nivel){ $SP } \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/skills.ron b/assets/voxygen/i18n/ro_RO/hud/skills.ron deleted file mode 100644 index 091de83428..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/skills.ron +++ /dev/null @@ -1,257 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.rank_up": "Punct de Abilitate Nou", - "hud.skill.sp_available": "{number} PA valabile", - "hud.skill.not_unlocked": "Nedeblocat încă", - "hud.skill.req_sp": "\n\n Necesită {number} PA", - // Skills - // General - "hud.skill.inc_health_title": "Mărește Viața", - "hud.skill.inc_health": "Mărește capacitatea vietii cu {boost}{SP}", - "hud.skill.inc_energy_title": "Mărește Energia", - "hud.skill.inc_energy": "Marește capacitatea energiei cu {boost}{SP}", - "hud.skill.unlck_sword_title": "Deblochează Sabia", - "hud.skill.unlck_sword": "Deblochează copacul abilitaților pentru sabie{SP}", - "hud.skill.unlck_axe_title": "Deblochează Topor", - "hud.skill.unlck_axe": "Deblochează copacul abilitaților pentru topor{SP}", - "hud.skill.unlck_hammer_title": "Deblochează Ciocan", - "hud.skill.unlck_hammer": "Deblochează copacul abilitaților pentru ciocan{SP}", - "hud.skill.unlck_bow_title": "Deblochează Arc", - "hud.skill.unlck_bow": "Deblochează copacul abilitaților pentru arc{SP}", - "hud.skill.unlck_staff_title": "Deblochează Toiag", - "hud.skill.unlck_staff": "Deblochează copacul abilitaților pentru toiag{SP}", - "hud.skill.unlck_sceptre_title": "Deblochează Sceptru", - "hud.skill.unlck_sceptre": "Deblochează copacul abilitaților pentru sceptru{SP}", - "hud.skill.dodge_title": "Evită", - "hud.skill.dodge": "Rostogoliri evazive sunt efectuate cu clicul-mijlociu, și acordă imunitate temporară la atacurile corp la corp (iframes) în timp ce te rostogolești.", - "hud.skill.roll_energy_title": "Costul de Energie pentru Rostogolire", - "hud.skill.roll_energy": "Rostogolorea foloseste cu {boost}% mai putina energie{SP}", - "hud.skill.roll_speed_title": "Viteza Rostogolirii", - "hud.skill.roll_speed": "Rostogoleste-te de {boost}% mai repede{SP}", - "hud.skill.roll_dur_title": "Durata Rostogolirii", - "hud.skill.roll_dur": "Rotogoleste-te de {boost}% mai mult{SP}", - "hud.skill.climbing_title": "Cățărare", - "hud.skill.climbing": "Sarind mai sus", - "hud.skill.climbing_cost_title": "Costul Cățărării", - "hud.skill.climbing_cost": "Cățărarea folosește cu {boost}% mai puțină energie{SP}" , - "hud.skill.climbing_speed_title": "Viteza Cățărării", - "hud.skill.climbing_speed": "Cațără-te de {boost}% mai rapid{SP}", - "hud.skill.swim_title": "Înot", - "hud.skill.swim": "Mișcare în mediu ud", - "hud.skill.swim_speed_title": "Viteza Înotului", - "hud.skill.swim_speed": "Înoata de {boost}% mai repede{SP}", - // Sceptre - "hud.skill.sc_lifesteal_title": "Raza Furtilui de Viata", - "hud.skill.sc_lifesteal": "Extrage viata din sangele inamicilor tai", - "hud.skill.sc_lifesteal_damage_title": "Daune", - "hud.skill.sc_lifesteal_damage": "Provoaca cu {boost}% mai multe daune{SP}", - "hud.skill.sc_lifesteal_range_title": "Distanta", - "hud.skill.sc_lifesteal_range": "Raza ta ajunge cu {boost}% mai departe{SP}", - "hud.skill.sc_lifesteal_lifesteal_title": "Furt de Viata", - "hud.skill.sc_lifesteal_lifesteal": "Transforma cu {boost}% mai mult sange in viata{SP}", - "hud.skill.sc_lifesteal_regen_title": "Regenerare Energie", - "hud.skill.sc_lifesteal_regen": "Recupereaza-ti energia cu {boost}%{SP}", - "hud.skill.sc_heal_title": "Aura Vindecatoare", - "hud.skill.sc_heal": "Vindeca-ti aliatii folosing sangele inamicilor tai, iti trebuie combo pentru activare", - "hud.skill.sc_heal_heal_title": "Vindecare", - "hud.skill.sc_heal_heal": "Te vindeci de {boost}% mai mult{SP}", - "hud.skill.sc_heal_cost_title": "Costul de Energie", - "hud.skill.sc_heal_cost": "Vindecarea necesita cu {boost}% mai putina energie{SP}", - "hud.skill.sc_heal_duration_title": "Duratia", - "hud.skill.sc_heal_duration": "Efecetele aurii de vindecare dureaza cu {boost}% mai mult{SP}", - "hud.skill.sc_heal_range_title": "Raza", - "hud.skill.sc_heal_range": "Aura ta vindecatoare ajunge cu {boost}% mai departe{SP}", - "hud.skill.sc_wardaura_unlock_title": "Deblocheaza Aura Protectoare", - "hud.skill.sc_wardaura_unlock": "Te lasa sa-ti protejezi amici de atacurile inamicilor cu o aura protectoare{SP}", - "hud.skill.sc_wardaura_strength_title": "Putere", - "hud.skill.sc_wardaura_strength": "Mareste puterea protectiei cu {boost}%{SP}", - "hud.skill.sc_wardaura_duration_title": "Duratie", - "hud.skill.sc_wardaura_duration": "Efectele protectiei tale dureaza de {boost}% mai mult{SP}", - "hud.skill.sc_wardaura_range_title": "Raza", - "hud.skill.sc_wardaura_range": "Protectia ajunge de {boost}% mai departe{SP}", - "hud.skill.sc_wardaura_cost_title": "Costul de Energie", - "hud.skill.sc_wardaura_cost": "Creearea protectieti necisita de {boost}% mei putina enerigie{SP}", - // Staff - "hud.skill.st_shockwave_range_title" : "Raza Undei de Soc", - "hud.skill.st_shockwave_range" : "Mareste raza undei de soc cu {boost}%{SP}", - "hud.skill.st_shockwave_cost_title" : "Costul Undei de Soc", - "hud.skill.st_shockwave_cost" : "Scade pretul energiei pentru a arunca sateni neajutorati cu {boost}%{SP}", - "hud.skill.st_shockwave_knockback_title" : "Aruncarea Undei de Soc", - "hud.skill.st_shockwave_knockback" : "Mareste potentialul aruncarii cu {boost}%{SP}", - "hud.skill.st_shockwave_damage_title" : "Daunele Undei de Soc", - "hud.skill.st_shockwave_damage" : "Mareste daunele cauzare de unda de soc cu {boost}%{SP}", - "hud.skill.st_shockwave_unlock_title" : "Deblocheaza Unda de Soc", - "hud.skill.st_shockwave_unlock" : "Deblocheaza abilitatea de a arunca inamicii la distanta folosind flacari{SP}", - "hud.skill.st_flamethrower_title" : "Aruncator de Flacari", - "hud.skill.st_flamethrower" : "Arunca flacari, arde-i pe toti", - "hud.skill.st_flame_velocity_title" : "Velocitatea Flacarii", - "hud.skill.st_flame_velocity" : "Flacara ajunge de {boost}% mai repede la destinatie{SP}", - "hud.skill.st_flamethrower_range_title" : "Raza pentru Aruncator de Flacari", - "hud.skill.st_flamethrower_range" : "Pentru cand flacarile nu ajung, vor merge de {boost}% mai departe{SP}", - "hud.skill.st_energy_drain_title" : "Consumptia Energiei", - "hud.skill.st_energy_drain" : "Scade rata la care se consuma energia cu {boost}%{SP}", - "hud.skill.st_flamethrower_damage_title" : "Daune Aruncator de Flacari", - "hud.skill.st_flamethrower_damage" : "Mareste daunele cu {boost}%{SP}", - "hud.skill.st_explosion_radius_title" : "Raza exploziei", - "hud.skill.st_explosion_radius" : "Mai mare inseamna mai bine, mareste raza exploziei cu {boost}%{SP}", - "hud.skill.st_energy_regen_title" : "Regenerare Energie", - "hud.skill.st_energy_regen" : "Marsete extrasul de energie cu {boost}%{SP}", - "hud.skill.st_fireball_title" : "Minge in Flacari", - "hud.skill.st_fireball" : "Arunca o minge in flacari care explodeaza la impact", - "hud.skill.st_damage_title" : "Daune", - "hud.skill.st_damage" : "Mareste daunele cu {boost}%{SP}", - // Bow - "hud.skill.bow_projectile_speed_title" : "Viteza Proiectilei", - "hud.skill.bow_projectile_speed" : "Trage sageti de {boost}% mai departe, mai rapid{SP}", - "hud.skill.bow_charged_title" : "Sageata Incarcata", - "hud.skill.bow_charged" : "Pentru ca ai ajteptat mai mult", - "hud.skill.bow_charged_damage_title" : "Daune Incarcare", - "hud.skill.bow_charged_damage" : "Mareste daunele cu {boost}%{SP}", - "hud.skill.bow_charged_energy_regen_title" : "Regenerate Incarcare", - "hud.skill.bow_charged_energy_regen" : "Mareste recuperarea energiei cu {boost}%{SP}", - "hud.skill.bow_charged_knockback_title" : "Aruncare Incarcare", - "hud.skill.bow_charged_knockback" : "Arunca inamicii de {boost}% mai departe{SP}", - "hud.skill.bow_charged_speed_title" : "Charged Speed", - "hud.skill.bow_charged_speed" : "Increases the rate that you charge the attack by {boost}%{SP}", - "hud.skill.bow_charged_move_title" : "Charged Move Speed", - "hud.skill.bow_charged_move" : "Increases how fast you can shuffle while charging the attack by {boost}%{SP}", - "hud.skill.bow_repeater_title" : "Repeater", - "hud.skill.bow_repeater" : "Cu cat tragi mai mult cu atat trafi mai rapid", - "hud.skill.bow_repeater_damage_title" : "Daune Repeater", - "hud.skill.bow_repeater_damage" : "Mareste daunele cauzate cu {boost}%{SP}", - "hud.skill.bow_repeater_cost_title" : "Repeater Cost", - "hud.skill.bow_repeater_cost" : "Decreases the energy cost to become a repeater by {boost}%{SP}", - "hud.skill.bow_repeater_speed_title" : "Viteza Repeater", - "hud.skill.bow_repeater_speed" : "Increases the rate at which you fire arrows by {boost}%{SP}", - "hud.skill.bow_shotgun_unlock_title" : "Unlocks Shotgun", - "hud.skill.bow_shotgun_unlock" : "Unlocks ability to fire multiple arrows at once{SP}", - "hud.skill.bow_shotgun_damage_title" : "Shotgun Damage", - "hud.skill.bow_shotgun_damage" : "Increases the damage done by {boost}%{SP}", - "hud.skill.bow_shotgun_cost_title" : "Shotgun Cost", - "hud.skill.bow_shotgun_cost" : "Decreases the cost of shotgun by {boost}%{SP}", - "hud.skill.bow_shotgun_arrow_count_title" : "Shotgun Arrows", - "hud.skill.bow_shotgun_arrow_count" : "Increases the number of arrows in the burst by {boost}{SP}", - "hud.skill.bow_shotgun_spread_title" : "Shotgun Spread", - "hud.skill.bow_shotgun_spread" : "Decreases the spread of the arrows by {boost}%{SP}", - // Hammer - "hud.skill.hmr_leap_radius_title" : "Leap Radius", - "hud.skill.hmr_leap_radius" : "Increases attack radius on ground slam by {boost} meter{SP}", - "hud.skill.hmr_leap_distance_title" : "Leap Distance", - "hud.skill.hmr_leap_distance" : "Increases distance of leap by {boost}%{SP}", - "hud.skill.hmr_leap_cost_title" : "Leap Cost", - "hud.skill.hmr_leap_cost" : "Decreases cost of leap by {boost}%{SP}", - "hud.skill.hmr_leap_knockback_title" : "Leap Knockback", - "hud.skill.hmr_leap_knockback" : "Increases knockback from leap by {boost}%{SP}", - "hud.skill.hmr_leap_damage_title" : "Leap Damage", - "hud.skill.hmr_leap_damage" : "Increases damage of leap by {boost}%{SP}", - "hud.skill.hmr_unlock_leap_title" : "Unlock Leap", - "hud.skill.hmr_unlock_leap" : "Unlocks a leap{SP}", - "hud.skill.hmr_charged_melee_title" : "Charged Melee", - "hud.skill.hmr_charged_melee" : "Melee but with charge", - "hud.skill.hmr_charged_rate_title" : "Charge Rate", - "hud.skill.hmr_charged_rate" : "Increases the rate that you charge the swing by {boost}%{SP}", - "hud.skill.hmr_charged_melee_nrg_drain_title" : "Charged Melee Energy Drain", - "hud.skill.hmr_charged_melee_nrg_drain" : "Decreases the rate energy drains when charging by {boost}%{SP}", - "hud.skill.hmr_charged_melee_damage_title" : "Charged Melee Damage", - "hud.skill.hmr_charged_melee_damage" : "Increases the damage of the charged swing by {boost}%{SP}", - "hud.skill.hmr_charged_melee_knockback_title" : "Charged Melee Knockback", - "hud.skill.hmr_charged_melee_knockback" : "Massively increases throw potential of swing by {boost}%{SP}", - "hud.skill.hmr_single_strike_title" : "Single Strike", - "hud.skill.hmr_single_strike" : "As single as you are", - "hud.skill.hmr_single_strike_regen_title" : "Single Strike Regen", - "hud.skill.hmr_single_strike_regen" : "Increases energy gain with each successive strike{SP}", - "hud.skill.hmr_single_strike_speed_title" : "Single Strike Speed", - "hud.skill.hmr_single_strike_speed" : "Increases the attack speed with each successive strike{SP}", - "hud.skill.hmr_single_strike_damage_title" : "Single Strike Damage", - "hud.skill.hmr_single_strike_damage" : "Increases the damage with each successive strike{SP}", - "hud.skill.hmr_single_strike_knockback_title" : "Single Strike Knockback", - "hud.skill.hmr_single_strike_knockback" : "Increase throw potential of swings by {boost}%{SP}", - // Sword - "hud.skill.sw_trip_str_title": "Triple Strike", - "hud.skill.sw_trip_str": "Strike, up to three times", - "hud.skill.sw_trip_str_combo_title": "Triple Strike Combo", - "hud.skill.sw_trip_str_combo": "Unlocks combo scaling on triple strike{SP}", - "hud.skill.sw_trip_str_dmg_title": "Triple Strike Damage", - "hud.skill.sw_trip_str_dmg": "Increases the damage each successive strike does{SP}", - "hud.skill.sw_trip_str_sp_title": "Triple Strike Speed", - "hud.skill.sw_trip_str_sp": "Increases attack speed gained by each successive strike{SP}", - "hud.skill.sw_trip_str_reg_title": "Triple Strike Regen", - "hud.skill.sw_trip_str_reg": "Increases energy gain on each successive strike{SP}", - "hud.skill.sw_dash_title": "Dash", - "hud.skill.sw_dash": "Pin through your enemies", - "hud.skill.sw_dash_dmg_title": "Dash Damage", - "hud.skill.sw_dash_dmg": "Increases initial damage of the dash by {boost}%{SP}", - "hud.skill.sw_dash_drain_title": "Dash Drain", - "hud.skill.sw_dash_drain": "Decreases the rate energy is drained while dashing by {boost}%{SP}", - "hud.skill.sw_dash_cost_title": "Dash Cost", - "hud.skill.sw_dash_cost": "Decreases the initial cost of the dash by {boost}%{SP}", - "hud.skill.sw_dash_speed_title": "Dash Speed", - "hud.skill.sw_dash_speed": "Increases how fast you go while dashing by {boost}%{SP}", - "hud.skill.sw_dash_charge_through_title": "Charge Through", - "hud.skill.sw_dash_charge_through": "Allows you to charge through the first enemies you hit{SP}", - "hud.skill.sw_dash_scale_title": "Dash Scaling Damage", - "hud.skill.sw_dash_scale": "Increases the damage scaling from the dash by {boost}%{SP}", - "hud.skill.sw_spin_title": "Spin Unlock", - "hud.skill.sw_spin": "Unlocks the sword spin{SP}", - "hud.skill.sw_spin_dmg_title": "Spin Damage", - "hud.skill.sw_spin_dmg": "Increases the damage done by {boost}%{SP}", - "hud.skill.sw_spin_spd_title": "Spin Speed", - "hud.skill.sw_spin_spd": "Increase the speed at which you spin by {boost}%{SP}", - "hud.skill.sw_spin_cost_title": "Spin Cost", - "hud.skill.sw_spin_cost": "Decreases the energy cost of each spin by {boost}%{SP}", - "hud.skill.sw_spin_spins_title": "Spin Spins", - "hud.skill.sw_spin_spins": "Increases the number of times you can spin{SP}", - "hud.skill.sw_interrupt_title": "Interrupting Attacks", - "hud.skill.sw_interrupt": "Allows you to immediately cancel an attack with another attack{SP}", - // Axe - "hud.skill.axe_double_strike_title": "Lovitura Dubla", - "hud.skill.axe_double_strike": "Chop down those villains", - "hud.skill.axe_double_strike_combo_title": "Lovitura Dubla Combo", - "hud.skill.axe_double_strike_combo": "Unlocks a second strike{SP}", - "hud.skill.axe_double_strike_damage_title": "Daune Lovitura Dubla", - "hud.skill.axe_double_strike_damage": "Increases the damage dealt in each successive strike{SP}", - "hud.skill.axe_double_strike_speed_title": "Viteza Lvitura Dubla", - "hud.skill.axe_double_strike_speed": "Increases the attack speed with each successive strike{SP}", - "hud.skill.axe_double_strike_regen_title": "Regenerare Lovitura Dubla", - "hud.skill.axe_double_strike_regen": "Increases energy gain with each successive strike{SP}", - "hud.skill.axe_spin_title": "Axe Spin", - "hud.skill.axe_spin": "You spin it right round ...", - "hud.skill.axe_infinite_axe_spin_title": "Infinite Axe Spin", - "hud.skill.axe_infinite_axe_spin": "Spin for as long as you have energy{SP}", - "hud.skill.axe_spin_damage_title": "Spin Damage", - "hud.skill.axe_spin_damage": "Increases the damage each spin does by {boost}%{SP}", - "hud.skill.axe_spin_helicopter_title": "Spin Helicopter", - "hud.skill.axe_spin_helicopter": "You fall a little slower while spinning{SP}", - "hud.skill.axe_spin_speed_title": "Spin Speed", - "hud.skill.axe_spin_speed": "Increases your spin speed by {boost}%{SP}", - "hud.skill.axe_spin_cost_title": "Spin Cost", - "hud.skill.axe_spin_cost": "Decreases energy cost of spinning by {boost}%{SP}", - "hud.skill.axe_unlock_leap_title": "Unlock Leap", - "hud.skill.axe_unlock_leap": "Unlocks a leap spin{SP}", - "hud.skill.axe_leap_damage_title": "Leap Damage", - "hud.skill.axe_leap_damage": "Increases damage of leap by {boost}%{SP}", - "hud.skill.axe_leap_knockback_title": "Leap Knockback", - "hud.skill.axe_leap_knockback": "Increases knockback from leap by {boost}%{SP}", - "hud.skill.axe_leap_cost_title": "Leap Cost", - "hud.skill.axe_leap_cost": "Decreases cost of leap by {boost}%{SP}", - "hud.skill.axe_leap_distance_title": "Leap Distance", - "hud.skill.axe_leap_distance": "Increases distance of leap by {boost}%{SP}", - // Mining - "hud.skill.mining_title": "Minare", - "hud.skill.pick_strike_title": "Lovitură de Târnăcop", - "hud.skill.pick_strike": "Lovește roci cu târnăcopul pentru a primi minereu, gemuri și experiență", - "hud.skill.pick_strike_speed_title": "Viteza Lovituri de Târnăcop", - "hud.skill.pick_strike_speed": "Minează roci mai rapid{SP}", - "hud.skill.pick_strike_oregain_title": "Extras de minereuri", - "hud.skill.pick_strike_oregain": "Sansa sa primesti un minereu in plus ({boost}% per nivel){SP}", - "hud.skill.pick_strike_gemgain_title": "Extras de gemuri", - "hud.skill.pick_strike_gemgain": "Sansa sa primesti un gem in plus ({boost}% per nivel){SP}", - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/hud/social.ftl b/assets/voxygen/i18n/ro_RO/hud/social.ftl new file mode 100644 index 0000000000..0cfd1575a0 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/social.ftl @@ -0,0 +1,10 @@ +hud-social = Alți jucători +hud-social-online = Conectați: +hud-social-friends = Prieteni +hud-social-not_yet_available = Nu este valabil încă +hud-social-faction = Facțiune +hud-social-play_online_fmt = { $nb_player } jucator(i) conectați +hud-social-name = Numa +hud-social-level = Nivel +hud-social-zone = Zonă +hud-social-account = Cont \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/social.ron b/assets/voxygen/i18n/ro_RO/hud/social.ron deleted file mode 100644 index fad678ceb0..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/social.ron +++ /dev/null @@ -1,22 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.social": "Alți jucători", - "hud.social.online": "Conectați:", - "hud.social.friends": "Prieteni", - "hud.social.not_yet_available": "Nu este valabil încă", - "hud.social.faction": "Facțiune", - "hud.social.play_online_fmt": "{nb_player} jucator(i) conectați", - "hud.social.name": "Numa", - "hud.social.level": "Nivel", - "hud.social.zone": "Zonă", - "hud.social.account": "Cont", - }, - - - vector_map: { - } -) - diff --git a/assets/voxygen/i18n/ro_RO/hud/trade.ftl b/assets/voxygen/i18n/ro_RO/hud/trade.ftl new file mode 100644 index 0000000000..de1fbf7e64 --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/hud/trade.ftl @@ -0,0 +1,26 @@ +hud-trade-trade_window = Negocează +hud-trade-phase1_description = + Trage itemele pe care vrei să le negociezi + în locul potrivit. +hud-trade-phase2_description = + The trade is now locked to give you + time to review it. +hud-trade-phase3_description = Trade is being processed. +hud-trade-persons_offer = Ofertă de la { $playername } +hud-trade-has_accepted = + { $playername } + has a acceptat +hud-trade-accept = Accepta +hud-trade-decline = Refuză +hud-trade-invite_sent = Cerere de negociere a fost trimisă lui { $playername }. +hud-trade-result-completed = Negocierea sa terminat cu secces. +hud-trade-result-declined = Negociere respinsă. +hud-trade-result-nospace = Nu exista destul spațiu pentru a negocia. +hud-trade-buy_price = Prețul de cumpărare +hud-trade-sell_price = Prețul de vânzare +hud-trade-coin = ban(i) +hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_2 = +hud-trade-your_offer = Oferta ta +hud-trade-their_offer = Oferta lor +hud-trade-amount_input = Selectează un item \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/hud/trade.ron b/assets/voxygen/i18n/ro_RO/hud/trade.ron deleted file mode 100644 index d350ae7d23..0000000000 --- a/assets/voxygen/i18n/ro_RO/hud/trade.ron +++ /dev/null @@ -1,32 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - "hud.trade.trade_window": "Negocează", - "hud.trade.phase1_description": "Trage itemele pe care vrei să le negociezi\n în locul potrivit.", - "hud.trade.phase2_description": "The trade is now locked to give you\n time to review it.", - /// Phase3 should only be visible for a few milliseconds if everything is working properly, but is included for completeness - "hud.trade.phase3_description": "Trade is being processed.", - "hud.trade.persons_offer": "Ofertă de la {playername}", - "hud.trade.has_accepted": "{playername}\nhas a acceptat", - "hud.trade.accept": "Accepta", - "hud.trade.decline": "Refuză", - "hud.trade.invite_sent": "Cerere de negociere a fost trimisă lui {playername}.", - "hud.trade.result.completed": "Negocierea sa terminat cu secces.", - "hud.trade.result.declined": "Negociere respinsă.", - "hud.trade.result.nospace": "Nu exista destul spațiu pentru a negocia.", - "hud.trade.buy_price": "Prețul de cumpărare", - "hud.trade.sell_price": "Prețul de vânzare", - "hud.trade.coin": "ban(i)", - "hud.trade.tooltip_hint_1": "", - "hud.trade.tooltip_hint_2": "", - "hud.trade.your_offer": "Oferta ta", - "hud.trade.their_offer": "Oferta lor", - "hud.trade.amount_input": "Selectează un item" - }, - - - vector_map: { - } -) diff --git a/assets/voxygen/i18n/ro_RO/main.ftl b/assets/voxygen/i18n/ro_RO/main.ftl new file mode 100644 index 0000000000..895ee4304d --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/main.ftl @@ -0,0 +1,95 @@ +main-username = Nume de utilizator +main-server = Server +main-password = Parola +main-connecting = Se conectează +main-creating_world = Se creează lumea +main-tip = Sfat: +main-unbound_key_tip = nelegat +main-notice = + Bine ai venit în versiunea alfa de Veloren! + + Înainte să începi distracția, te rog să ții minte câteva lucruri: + + - Această versiune de joc este prematură. Așteaptă-te la erori, gameplay nefinisat, mecanisme nelustruite și caracteristici care lipsesc. + + - Dacă ai feedback constructiv sau rapoarte de erori, ne poți contacta pe Reddit, GitLab sau în serverul nostru de comunitate pe Discord. + + - Veloren este licențiat sub licența susră-deschisă(„open-source”) GPL 3. Asta înseamnă că ești liber să joci, să modifici și să redistribui jocul + după gustul tău (cu condiția ca munca derivată să fie sub GPL 3). + + - Veloren este un proiect non-profit al comunotații, iar cei care lucrează la el sunt voluntari. + Daca îți place ce vezi, ești binevenit să te alături echipelor de dezvoltare sau echipelor de artă! + + Îți mulțumim că ai citit acest anunț, sperăm că te vei distra! + + ~ Dezvoltatorii Veloren +main-login_process = + Informații privind procesul de autentificare: + + Ține minte că îți trebuie un cont + pentru a juca pe servere cu autentificarea activată. + + Poți să-ți faci un cont pe + + https://veloren.net/account/. +main-login-server_not_found = Serverul nu a fost găsit +main-login-authentication_error = Eroare de autentificare pe server +main-login-internal_error = Eroare internă pe client (cel mai probabil, personajul jucătorului a fost șters) +main-login-failed_auth_server_url_invalid = Nu s-a putut conecta la serverul de autentificare +main-login-insecure_auth_scheme = Schema de autentificare HTTP NU este acceptată. Este nesigur! În scopuri de dezvoltare, HTTP este permis pentru „localhost” sau versiuni de depanare +main-login-server_full = Serverul este plin +main-login-untrusted_auth_server = Serverul de autentificare nu este de încredere +main-login-outdated_client_or_server = ServerWentMad: Probabil că versiunile sunt incompatibile, verifică pentru actualizări. +main-login-timeout = Timeout: Serverul nu a răspuns la timp. (Probleme de supraîncărcare sau de rețea). +main-login-server_shut_down = Serverul s-a oprit +main-login-network_error = Eroare de rețea +main-login-network_wrong_version = Versiunile de server și client sunt nepotrivite, te rog să-ți actualizezi clientul jocului. +main-login-failed_sending_request = Solicitarea către serverul de autentificare a eșuat +main-login-invalid_character = Caracterul selectat este invalid +main-login-client_crashed = Aplicația a eșuat +main-login-not_on_whitelist = Pentru a intra Trebuie să fii trecut pe Lista Albă de către un Admin +main-login-banned = Ai fost interzis pentru urmatorul motiv +main-login-kicked = Ai fost dat afară pentru urmatorul motiv +main-login-select_language = Selectează o limbă +main-login-client_version = Versiunea Aplicației +main-login-server_version = Versiunea Serverului +main-login-client_init_failed = Clientul nu sa putut initializa: { $init_fail_reason } +main-login-username_bad_characters = Numele de utilizator conține caractere invalide (Doar alfanumerice, '_' și '-' sunt permise) +main-login-username_too_long = Numele de utilizator este prea lung! Lungimea maximă este: { $max_len } +main-servers-select_server = Selectează un server +main-servers-singleplayer_error = Nu s-a putut conecta la serverul intern: { $sp_error } +main-servers-network_error = Eroare de rețea/socket de server: { $raw_error } +main-servers-participant_error = Eroare de protocol/participant deconectat: { $raw_error } +main-servers-stream_error = Eroare de conectare/compresare/(de)serializare a clientului: { $raw_error } +main-servers-database_error = Eroare în baza de date a serverului: { $raw_error } +main-servers-persistence_error = Eroare de persistență a serverului (probabil legată de active(„assets”)/datele de caractere): { $raw_error } +main-servers-other_error = Eroare generală de server: { $raw_error } +main-credits = Credite +main-credits-created_by = creat de către +main-credits-music = Muzică +main-credits-fonts = Fonturi +main-credits-other_art = Altă artă +main-credits-contributors = Colaboratori +loading-tips = + .a0 = Apasă '{ $gameinput-togglelantern }' ca să-ți aprinzi lanterna. + .a1 = Apasă '{ $gameinput-help }' ca să vezi toate tastele inițiale. + .a2 = Poți scrie /say sau /s ca să vorbești cu jucătorii direct din jurul tău. + .a3 = Poți scrie /region sau /r ca să vorbești doar cu jucătorii care sunt în jurul a câteva sute de blocuri. + .a4 = Adminii pot folosi comanda /build pentru a intra în modul de construcție. + .a5 = Poți scrie /group sau /g ca să vorbești cu jucatorii din grupul tău. + .a6 = Pentru a trimite mesaje private scrie /tell urmat de numele jucătorului și mesajul tău. + .a7 = Uită-te după hrană, cufăre și alte bunuri împrăștiate peste tot în lume! + .a8 = Invetarul ți-e plin cu hrană? Încearcă să faci mâncare mai bună din ea! + .a9 = Nu știi ce să faci? Încearcă una dintre temniţele marcate pe hartă! + .a10 = Nu uita să ajustezi graficile pentru sistemul tău. Apasă '{ $gameinput-settings }' pentru a deschide setările. + .a11 = Jucând cu alții e distractiv! Apasă '{ $gameinput-social }' ca să vezi cine e conectat. + .a12 = Apasă '{ $gameinput-dance }' pentru a dansa. Petrecere! + .a13 = Apasă '{ $gameinput-glide }' ca să-ți deschizi Planorul și să cucerești cerurile. + .a14 = Veloren e înca în Pre-Alpha. Ne străduim să-l îmbunătățim în ficare zi! + .a15 = Dacă vrei să te alături echipei de dezvoltare sau dacă doar vrei să vorbești cu noi, intră pe serverul nostru de Discord. + .a16 = Puți comuta afișarea nivelului de sănătate pe bara de sănătate din setări + .a17 = Așeazăte lângă un foc de tabară (cu tasta '{ $gameinput-sit }') ca să-ți vindeci rănile încetișor. + .a18 = Ai nevoie de mai multe rucsacuri sau de armură mai bună ca să-ți continui aventura? Apasă '{ $gameinput-crafting }' pentru a deschide meniul de meșteșuguri! + .a19 = Apasă '{ $gameinput-roll }' ca să te rostogolești. Rostogolindu-te poți să te miști mai repede și să eviți atacurile inamicilor. + .a20 = Nu știi pentru ce folosești un item? Cauată 'input:' în meniul de meșteșuguri ca să vezi rețetele în care este folosit. + .a21 = Ai găsit ceva interesant? Ia o captură de ecran cu '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/main.ron b/assets/voxygen/i18n/ro_RO/main.ron deleted file mode 100644 index d07368f15d..0000000000 --- a/assets/voxygen/i18n/ro_RO/main.ron +++ /dev/null @@ -1,115 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - /// Start Main screen section - "main.username": "Nume de utilizator", - "main.server": "Server", - "main.password": "Parola", - "main.connecting": "Se conectează", - "main.creating_world": "Se creează lumea", - "main.tip": "Sfat:", - "main.unbound_key_tip": "nelegat", - - // Welcome notice that appears the first time Veloren is started - "main.notice": r#"Bine ai venit în versiunea alfa de Veloren! - -Înainte să începi distracția, te rog să ții minte câteva lucruri: - -- Această versiune de joc este prematură. Așteaptă-te la erori, gameplay nefinisat, mecanisme nelustruite și caracteristici care lipsesc. - -- Dacă ai feedback constructiv sau rapoarte de erori, ne poți contacta pe Reddit, GitLab sau în serverul nostru de comunitate pe Discord. - -- Veloren este licențiat sub licența susră-deschisă(„open-source”) GPL 3. Asta înseamnă că ești liber să joci, să modifici și să redistribui jocul - după gustul tău (cu condiția ca munca derivată să fie sub GPL 3). - -- Veloren este un proiect non-profit al comunotații, iar cei care lucrează la el sunt voluntari. -Daca îți place ce vezi, ești binevenit să te alături echipelor de dezvoltare sau echipelor de artă! - -Îți mulțumim că ai citit acest anunț, sperăm că te vei distra! - -~ Dezvoltatorii Veloren"#, - - // Login process description - "main.login_process": r#"Informații privind procesul de autentificare: - -Ține minte că îți trebuie un cont -pentru a juca pe servere cu autentificarea activată. - -Poți să-ți faci un cont pe - -https://veloren.net/account/."#, - "main.login.server_not_found": "Serverul nu a fost găsit", - "main.login.authentication_error": "Eroare de autentificare pe server", - "main.login.internal_error": "Eroare internă pe client (cel mai probabil, personajul jucătorului a fost șters)", - "main.login.failed_auth_server_url_invalid": "Nu s-a putut conecta la serverul de autentificare", - "main.login.insecure_auth_scheme": "Schema de autentificare HTTP NU este acceptată. Este nesigur! În scopuri de dezvoltare, HTTP este permis pentru „localhost” sau versiuni de depanare", - "main.login.server_full": "Serverul este plin", - "main.login.untrusted_auth_server": "Serverul de autentificare nu este de încredere", - "main.login.outdated_client_or_server": "ServerWentMad: Probabil că versiunile sunt incompatibile, verifică pentru actualizări.", - "main.login.timeout": "Timeout: Serverul nu a răspuns la timp. (Probleme de supraîncărcare sau de rețea).", - "main.login.server_shut_down": "Serverul s-a oprit", - "main.login.network_error": "Eroare de rețea", - "main.login.network_wrong_version": "Versiunile de server și client sunt nepotrivite, te rog să-ți actualizezi clientul jocului.", - "main.login.failed_sending_request": "Solicitarea către serverul de autentificare a eșuat", - "main.login.invalid_character": "Caracterul selectat este invalid", - "main.login.client_crashed": "Aplicația a eșuat", - "main.login.not_on_whitelist": "Pentru a intra Trebuie să fii trecut pe Lista Albă de către un Admin", - "main.login.banned": "Ai fost interzis pentru urmatorul motiv", - "main.login.kicked": "Ai fost dat afară pentru urmatorul motiv", - "main.login.select_language": "Selectează o limbă", - "main.login.client_version": "Versiunea Aplicației", - "main.login.server_version": "Versiunea Serverului", - "main.login.client_init_failed": "Clientul nu sa putut initializa: {init_fail_reason}", - "main.login.username_bad_characters": "Numele de utilizator conține caractere invalide (Doar alfanumerice, '_' și '-' sunt permise)", - "main.login.username_too_long": "Numele de utilizator este prea lung! Lungimea maximă este: {max_len}", - "main.servers.select_server": "Selectează un server", - "main.servers.singleplayer_error": "Nu s-a putut conecta la serverul intern: {sp_error}", - "main.servers.network_error": "Eroare de rețea/socket de server: {raw_error}", - "main.servers.participant_error": "Eroare de protocol/participant deconectat: {raw_error}", - "main.servers.stream_error": "Eroare de conectare/compresare/(de)serializare a clientului: {raw_error}", - "main.servers.database_error": "Eroare în baza de date a serverului: {raw_error}", - "main.servers.persistence_error": "Eroare de persistență a serverului (probabil legată de active(„assets”)/datele de caractere): {raw_error}", - "main.servers.other_error": "Eroare generală de server: {raw_error}", - - // Credits screen - "main.credits": "Credite", - "main.credits.created_by": "creat de către", - "main.credits.music": "Muzică", - "main.credits.fonts": "Fonturi", - "main.credits.other_art": "Altă artă", - "main.credits.contributors": "Colaboratori", - - /// End Main screen section - }, - - - vector_map: { - // The keybinding names can be found in voxygen/src/game_input.rs in the GameInput enum - "loading.tips": [ - "Apasă '{gameinput.togglelantern}' ca să-ți aprinzi lanterna.", - "Apasă '{gameinput.help}' ca să vezi toate tastele inițiale.", - "Poți scrie /say sau /s ca să vorbești cu jucătorii direct din jurul tău.", - "Poți scrie /region sau /r ca să vorbești doar cu jucătorii care sunt în jurul a câteva sute de blocuri.", - "Adminii pot folosi comanda /build pentru a intra în modul de construcție.", - "Poți scrie /group sau /g ca să vorbești cu jucatorii din grupul tău.", - "Pentru a trimite mesaje private scrie /tell urmat de numele jucătorului și mesajul tău.", - "Uită-te după hrană, cufăre și alte bunuri împrăștiate peste tot în lume!", - "Invetarul ți-e plin cu hrană? Încearcă să faci mâncare mai bună din ea!", - "Nu știi ce să faci? Încearcă una dintre temniţele marcate pe hartă!", - "Nu uita să ajustezi graficile pentru sistemul tău. Apasă '{gameinput.settings}' pentru a deschide setările.", - "Jucând cu alții e distractiv! Apasă '{gameinput.social}' ca să vezi cine e conectat.", - "Apasă '{gameinput.dance}' pentru a dansa. Petrecere!", - "Apasă '{gameinput.glide}' ca să-ți deschizi Planorul și să cucerești cerurile.", - "Veloren e înca în Pre-Alpha. Ne străduim să-l îmbunătățim în ficare zi!", - "Dacă vrei să te alături echipei de dezvoltare sau dacă doar vrei să vorbești cu noi, intră pe serverul nostru de Discord.", - "Puți comuta afișarea nivelului de sănătate pe bara de sănătate din setări", - "Așeazăte lângă un foc de tabară (cu tasta '{gameinput.sit}') ca să-ți vindeci rănile încetișor.", - "Ai nevoie de mai multe rucsacuri sau de armură mai bună ca să-ți continui aventura? Apasă '{gameinput.crafting}' pentru a deschide meniul de meșteșuguri!", - "Apasă '{gameinput.roll}' ca să te rostogolești. Rostogolindu-te poți să te miști mai repede și să eviți atacurile inamicilor.", - "Nu știi pentru ce folosești un item? Cauată 'input:' în meniul de meșteșuguri ca să vezi rețetele în care este folosit.", - "Ai găsit ceva interesant? Ia o captură de ecran cu '{gameinput.screenshot}'." - ], - } -) diff --git a/assets/voxygen/i18n/ro_RO/npc.ftl b/assets/voxygen/i18n/ro_RO/npc.ftl new file mode 100644 index 0000000000..3774cfeabb --- /dev/null +++ b/assets/voxygen/i18n/ro_RO/npc.ftl @@ -0,0 +1,210 @@ +npc-speech-villager = + .a0 = Iubesc brânza. +npc-speech-villager_open = + .a0 = Mă gândesc la ce se gandește Catoblepas când manancă iarbă. + .a1 = Ce crezi că fac ca Rămăsițele Strălucitoare să străluceasca? + .a2 = Ai auzit vreodată de ferocii Rechini de Uscat? Cică trăiesc în deșerturi. + .a3 = Mă intreb ce se află dincolo de munte. + .a4 = I-am lăsat niște brânză fratelui meu. Acum nu știu dacă exista sau nu. O numesc brânza lui Schrödinger. + .a5 = Ai prins vreodată un licurice? + .a6 = Se spune că gemuri strălucitoare de toate felurile se găsesc în peșteri. + .a7 = Nu pot să ințeleg de unde tot vin Sauroks ăia. +npc-speech-villager_adventurous = + .a0 = Sper că am să-mi fac propriul planor cândva. + .a1 = Mi-ar plăcea să fac speleologie într-o peșteră când voi fi mai puternic. +npc-speech-villager_closed = + .a0 = Nu ești de prin părțile astea, nu-i așa? + .a1 = Așa-i că satul nostru este cel mai bun? + .a2 = Se spune că ciupercile sunt bune pentru sănătate. Personal, nu am mâncat niciodată. + .a3 = A fi sau a nu fi? Cred voi fi un fermier. +npc-speech-villager_conscientious = + .a0 = Mă țin ocupat. Tot timpul este câte ceva de facut. + .a1 = Sper să plouă curând. Ar fi bine pentru plante. +npc-speech-villager_busybody = + .a0 = Ar trebui ca oamenii să vorbească mai puțin și să muncească mai mult. +npc-speech-villager_unconscientious = + .a0 = Cred că este timpul pentru un al doilea mic dejun! + .a1 = I wish was my house wasn't such a mess. But then I'd have to tidy up! Haha! + .a2 = Unde am lăsat chestia aia... +npc-speech-villager_extroverted = + .a0 = Nu o sâ-ți vină sâ crezi ce am facut weekenul âsta! + .a1 = Top of the morning to you! + .a2 = Ce părere ai despre vremea asta? + .a3 = I'm just crackers about cheese! + .a4 = Nu uita de biscuiți! + .a5 = Pur și simplu ador brânza dwarven. Mi-aș dori să o pot face. + .a6 = Azi noapte am avut un vis minunat despre brânză. Ce ar putea să însemne? + .a7 = Iubesc mierea! Și urăsc albinele. +npc-speech-villager_sociable = + .a0 = Nu poftești înauntru? Noi chiar acum mâncăm niste brânză! + .a1 = Ai vrea să-mi vezi grădina? Okay, poate alt dată. +npc-speech-villager_introverted = + .a0 = Salut. + .a1 = Oh eu? Nu sunt nimic special. +npc-speech-villager_agreeable = + .a0 = Cum te simți azi? + .a1 = Spune-mi daca ai nevoie de ceva. + .a2 = Mi-ai văzut pisica pe undeva? +npc-speech-villager_worried = + .a0 = Ai grijă de tine, înregulă? Sunt multe pericole în lume. +npc-speech-villager_disagreeable = + .a0 = Eu o spun asa cum e. Destul de rău dacă oamenilor nu le place. + .a1 = Oamenii se ofensează prea ușor. +npc-speech-villager_neurotic = + .a0 = Gândindu-mă la temnițele alea mă sperie. Sper ca cineva să le curețe. + .a1 = Cineva ar trebui să facă ceva despre cultiștii ăștia. Eu nu mă bag. + .a2 = Am o presimțire că ceva rău se va întâmpla. + .a3 = Mi-as dori ca cineva să țină lupii departe de sat. +npc-speech-villager_sad_loner = + .a0 = Sunt atât de singur. + .a1 = ... scuze pentru liniștea asta incomodă. Nu mă pricep cu oamenii. +npc-speech-villager_seeker = + .a0 = Vreau să văd lumea largă. Trebuie să fie mai multe decât satu ăsta. +npc-speech-villager_stable = + .a0 = Nu e așa ca e o zi minunată? + .a1 = Viața nu e așa de rea. + .a2 = O zi minunată pentru o plimbare prin padure! +npc-speech-villager_decline_trade = + .a0 = Imi pare rau, Nu am nimic de vândut. + .a1 = Sa negociem? De parcă am ceva ce te poate interesa. + .a2 = Ce e al meu e al meu, n-am să-l dau pentru nimic. +npc-speech-merchant_advertisement = + .a0 = Te pot interesa intr-o negociere? + .a1 = Vrei să negocieazi cu mine? + .a2 = Am o gramadă de bunuri, vrei să arunci o privire? +npc-speech-merchant_busy = + .a0 = Te rog să astepți, sunt singura persoană aici. + .a1 = Un moment, lasă-mă să termin. + .a2 = Sunt ocupat, revino mai târziu. +npc-speech-merchant_busy_rude = + .a0 = Hei, așteaptă-ți rândul. + .a1 = Măcar vezi persoana din fața ta? + .a2 = Nu tăia linia. +npc-speech-merchant_trade_successful = + .a0 = Îți mulțumesc că ai negociat cu mine! + .a1 = Mulțumesc! +npc-speech-merchant_trade_declined = + .a0 = Poate data viitoare, să ai o zi frumoasa! + .a1 = Destul de rău, poate data viitoare, atunci! +npc-speech-villager_cultist_alarm = + .a0 = Aveți grija! Există un cultist în libertate! + .a1 = La arme! Cultiștii atacă! + .a2 = Cum își permit cultiștii ăștia să ne atace satul! + .a3 = Moarte cultistilor! + .a4 = Cultiștii nu vor fi telorați aici! + .a5 = Cultist criminal! + .a6 = Gustă din tăișul sabiei mele, cultist nenorocit! + .a7 = Nimic nu poate curăța sângele de pe mâinile tale, cultistule! + .a8 = Miliarde de barnacles albaștri! Un cultist printre noi! + .a9 = Răutățile acestui cultist sunt pe cale să înceteze! + .a10 = Cultistu ăsta-i al meu! + .a11 = Pregatește-te să-ți întâlnești creatorul, cultist impuțit! + .a12 = Văd un cultist! Prindeți-l! + .a13 = Văd un cultist! Atacați! + .a14 = Văd un cultist! Nu-l lăsați să evadeze! + .a15 = I-ar placea unui cultist onorabil niște MOARTE?! + .a16 = Nu ierta niciodată! Nu uita niciodata! Regretă, cultistule! + .a17 = Mori, cultistule! + .a18 = Domnia ta de teroare se va opri! + .a19 = Uite ce primești pentru ce ai facut! + .a20 = Nu primim oameni ca tine pe aici. + .a21 = Ar fii trebuit să stai sub pământ! +npc-speech-villager_under_attack = + .a0 = Ajutor, sunt atacat! + .a1 = Ajutor! Sunt atacat! + .a2 = Ouch! Sunt atacat! + .a3 = Ouch! Sunt atacat! Ajutor! + .a4 = Ajutați-mă! Sunt atacat! + .a5 = Sunt atacat! Ajutor! + .a6 = Sunt atacat! Ajutați-mă! + .a7 = Ajutor! + .a8 = Ajutor! Ajutor! + .a9 = Ajutor! Ajutor! Ajutor! + .a10 = sunt atacat! + .a11 = AAAHHH! Sunt atacat! + .a12 = AAAHHH! Sunt atacat! Ajutor! + .a13 = Ajutor! Suntem atacați! + .a14 = Ajutor! Ucigaș! + .a15 = Ajutor! Un ucigaș se află în libertate! + .a16 = Ajutor! Încearcă să mă omoare! + .a17 = Gărzi, sunt atacat! + .a18 = Gărzi! Sunt atacat + .a19 = Sunt atacat! Gărzi! + .a20 = Ajutor! Gărzi! Sunt atacat! + .a21 = Gărzi! Veniți repede! + .a22 = Gărzi! Gărzi! + .a23 = Gărzi! Este un răufăcător care mă atacă! + .a24 = Gărzi, ucideți acest răufăcător! + .a25 = Gărzi! Este un ucigaș! + .a26 = Gărzi! Ajutați-mă! + .a27 = Nu ai să scapi cu asta! Gărzi! + .a28 = Drac ce ești! + .a29 = Ajută-mă! + .a30 = Ajutor! Vă rog! + .a31 = Au! Gărzi! Ajutor! + .a32 = Vin după mine! + .a33 = Ajutor! Ajutor! Sunt reprimat! + .a34 = Ah, acum vedem violența esențială sistemului. + .a35 = E doar o zgârietură! + .a36 = Încetează! + .a37 = Ce ți-am facut eu vreodată?! + .a38 = Încetează a mă mai ataca! + .a39 = Hei! Ai grijă unde țintești cu chestia aia! + .a40 = Heinous wretch, be gone with you! + .a41 = Incetează! Pleacă! + .a42 = Now you're making me mad! + .a43 = Mă! Cine te crezi?! + .a44 = I'll have your head for that! + .a45 = Oprește-te, te rog! Nu am nimic de valoare la mine! + .a46 = Am să-l pun pe fratele meu pe tine, el e mai mare decât mine! + .a47 = Nuuu, îi spun mamei! + .a48 = Te blestem! + .a49 = Te rog nu face asta. + .a50 = Nu a fost prea frumos! + .a51 = Îți funcionează arma, acum o poți pune deoparte! + .a52 = Ai milă! + .a53 = Te rog, am familie! + .a54 = Sunt prea tânăr sa mor! + .a55 = Putem să vorbim despre asta? + .a56 = Violența nu e niciodată raspunsul! + .a57 = Azi se dovedește a fi o zi foarte proastă... + .a58 = Hei, a durut! + .a59 = Eek! + .a60 = Ce nesimțire! + .a61 = Oprește-te, te implor! + .a62 = Sper să cadă o variolă peste tine! + .a63 = Nu e amuzant. + .a64 = Cum îți permiți?! + .a65 = Vei plăti pentru asta! + .a66 = Continuă și vei regreta + .a67 = Nu mă face să te lovesc! + .a68 = Trebuie să fie o neînțelegere! + .a69 = Nu e nevoie să faci asta! + .a70 = Pleacă, dracului! + .a71 = Chiar a durut! + .a72 = De ce ai face asta? + .a73 = Sfinte Sisoe, încetează! + .a74 = Cred că m-ai confundat cu altcineva! + .a75 = Nu merit așa ceva! + .a76 = Te rog să nu mai faci aia. + .a77 = Gărzi, aruncați monstru ăsta în lac! + .a78 = Îmi voi pune tarasque pe tine! + .a79 = De ce euuuuuu? +npc-speech-villager_enemy_killed = + .a0 = Mi-am distrus inamicul! + .a1 = În sfârșit, pace! + .a2 = ... bun, ce faceam? +npc-speech-menacing = + .a0 = Te avertizez! + .a1 = Dacă mai faci un pas am să te atac! + .a2 = Nu mă sperii! + .a3 = Pleacă de lângă mine! + .a4 = Întoarcete dacă vrei să trăiești! + .a5 = Nu ești bine venit aici! +npc-speech-cultist_low_health_fleeing = + .a0 = Retreat for the cause! + .a1 = Retragere! + .a2 = Blestemat sa fii! + .a3 = Am să te blestem în viața de dincolo! + .a4 = Trebuie să mă odihnesc! + .a5 = Sunt prea puternici! \ No newline at end of file diff --git a/assets/voxygen/i18n/ro_RO/npc.ron b/assets/voxygen/i18n/ro_RO/npc.ron deleted file mode 100644 index 432dd6a91c..0000000000 --- a/assets/voxygen/i18n/ro_RO/npc.ron +++ /dev/null @@ -1,248 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - }, - - vector_map: { - "npc.speech.villager": [ - "Iubesc brânza.", - ], - "npc.speech.villager_open": [ - "Mă gândesc la ce se gandește Catoblepas când manancă iarbă.", - "Ce crezi că fac ca Rămăsițele Strălucitoare să străluceasca?", - "Ai auzit vreodată de ferocii Rechini de Uscat? Cică trăiesc în deșerturi.", - "Mă intreb ce se află dincolo de munte.", - "I-am lăsat niște brânză fratelui meu. Acum nu știu dacă exista sau nu. O numesc brânza lui Schrödinger.", - "Ai prins vreodată un licurice?", - "Se spune că gemuri strălucitoare de toate felurile se găsesc în peșteri.", - "Nu pot să ințeleg de unde tot vin Sauroks ăia.", - ], - "npc.speech.villager_adventurous": [ - "Sper că am să-mi fac propriul planor cândva.", - "Mi-ar plăcea să fac speleologie într-o peșteră când voi fi mai puternic.", - ], - "npc.speech.villager_closed": [ - "Nu ești de prin părțile astea, nu-i așa?", - "Așa-i că satul nostru este cel mai bun?", - "Se spune că ciupercile sunt bune pentru sănătate. Personal, nu am mâncat niciodată.", - "A fi sau a nu fi? Cred voi fi un fermier.", - ], - "npc.speech.villager_conscientious": [ - "Mă țin ocupat. Tot timpul este câte ceva de facut.", - "Sper să plouă curând. Ar fi bine pentru plante.", - ], - "npc.speech.villager_busybody": [ - "Ar trebui ca oamenii să vorbească mai puțin și să muncească mai mult.", - ], - "npc.speech.villager_unconscientious": [ - "Cred că este timpul pentru un al doilea mic dejun!", - "I wish was my house wasn't such a mess. But then I'd have to tidy up! Haha!", - "Unde am lăsat chestia aia...", - ], - "npc.speech.villager_extroverted": [ - "Nu o sâ-ți vină sâ crezi ce am facut weekenul âsta!", - "Top of the morning to you!", - "Ce părere ai despre vremea asta?", - "I'm just crackers about cheese!", - "Nu uita de biscuiți!", - "Pur și simplu ador brânza dwarven. Mi-aș dori să o pot face.", - "Azi noapte am avut un vis minunat despre brânză. Ce ar putea să însemne?", - "Iubesc mierea! Și urăsc albinele.", - ], - "npc.speech.villager_sociable": [ - "Nu poftești înauntru? Noi chiar acum mâncăm niste brânză!", - "Ai vrea să-mi vezi grădina? Okay, poate alt dată.", - ], - "npc.speech.villager_introverted": [ - "Salut.", - "Oh eu? Nu sunt nimic special.", - ], - "npc.speech.villager_agreeable": [ - "Cum te simți azi?", - "Spune-mi daca ai nevoie de ceva.", - "Mi-ai văzut pisica pe undeva?", - ], - "npc.speech.villager_worried": [ - "Ai grijă de tine, înregulă? Sunt multe pericole în lume.", - ], - "npc.speech.villager_disagreeable": [ - "Eu o spun asa cum e. Destul de rău dacă oamenilor nu le place.", - "Oamenii se ofensează prea ușor.", - ], - "npc.speech.villager_neurotic": [ - "Gândindu-mă la temnițele alea mă sperie. Sper ca cineva să le curețe.", - "Cineva ar trebui să facă ceva despre cultiștii ăștia. Eu nu mă bag.", - "Am o presimțire că ceva rău se va întâmpla.", - "Mi-as dori ca cineva să țină lupii departe de sat.", - ], - "npc.speech.villager_sad_loner": [ - "Sunt atât de singur.", - "... scuze pentru liniștea asta incomodă. Nu mă pricep cu oamenii.", - ], - "npc.speech.villager_seeker": [ - "Vreau să văd lumea largă. Trebuie să fie mai multe decât satu ăsta.", - ], - "npc.speech.villager_stable": [ - "Nu e așa ca e o zi minunată?", - "Viața nu e așa de rea.", - "O zi minunată pentru o plimbare prin padure!", - ], - "npc.speech.villager_decline_trade": [ - "Imi pare rau, Nu am nimic de vândut.", - "Sa negociem? De parcă am ceva ce te poate interesa.", - "Ce e al meu e al meu, n-am să-l dau pentru nimic.", - ], - "npc.speech.merchant_advertisement": [ - "Te pot interesa intr-o negociere?", - "Vrei să negocieazi cu mine?", - "Am o gramadă de bunuri, vrei să arunci o privire?" - ], - "npc.speech.merchant_busy": [ - "Te rog să astepți, sunt singura persoană aici.", - "Un moment, lasă-mă să termin.", - "Sunt ocupat, revino mai târziu." - ], - "npc.speech.merchant_busy_rude": [ - "Hei, așteaptă-ți rândul.", - "Măcar vezi persoana din fața ta?", - "Nu tăia linia.", - ], - "npc.speech.merchant_trade_successful": [ - "Îți mulțumesc că ai negociat cu mine!", - "Mulțumesc!", - ], - "npc.speech.merchant_trade_declined": [ - "Poate data viitoare, să ai o zi frumoasa!", - "Destul de rău, poate data viitoare, atunci!" - ], - "npc.speech.villager_cultist_alarm": [ - "Aveți grija! Există un cultist în libertate!", - "La arme! Cultiștii atacă!", - "Cum își permit cultiștii ăștia să ne atace satul!", - "Moarte cultistilor!", - "Cultiștii nu vor fi telorați aici!", - "Cultist criminal!", - "Gustă din tăișul sabiei mele, cultist nenorocit!", - "Nimic nu poate curăța sângele de pe mâinile tale, cultistule!", - "Miliarde de barnacles albaștri! Un cultist printre noi!", - "Răutățile acestui cultist sunt pe cale să înceteze!", - "Cultistu ăsta-i al meu!", - "Pregatește-te să-ți întâlnești creatorul, cultist impuțit!", - "Văd un cultist! Prindeți-l!", - "Văd un cultist! Atacați!", - "Văd un cultist! Nu-l lăsați să evadeze!", - "I-ar placea unui cultist onorabil niște MOARTE?!", - "Nu ierta niciodată! Nu uita niciodata! Regretă, cultistule!", - "Mori, cultistule!", - "Domnia ta de teroare se va opri!", - "Uite ce primești pentru ce ai facut!", - "Nu primim oameni ca tine pe aici.", - "Ar fii trebuit să stai sub pământ!", - ], - "npc.speech.villager_under_attack": [ - "Ajutor, sunt atacat!", - "Ajutor! Sunt atacat!", - "Ouch! Sunt atacat!", - "Ouch! Sunt atacat! Ajutor!", - "Ajutați-mă! Sunt atacat!", - "Sunt atacat! Ajutor!", - "Sunt atacat! Ajutați-mă!", - "Ajutor!", - "Ajutor! Ajutor!", - "Ajutor! Ajutor! Ajutor!", - "sunt atacat!", - "AAAHHH! Sunt atacat!", - "AAAHHH! Sunt atacat! Ajutor!", - "Ajutor! Suntem atacați!", - "Ajutor! Ucigaș!", - "Ajutor! Un ucigaș se află în libertate!", - "Ajutor! Încearcă să mă omoare!", - "Gărzi, sunt atacat!", - "Gărzi! Sunt atacat", - "Sunt atacat! Gărzi!", - "Ajutor! Gărzi! Sunt atacat!", - "Gărzi! Veniți repede!", - "Gărzi! Gărzi!", - "Gărzi! Este un răufăcător care mă atacă!", - "Gărzi, ucideți acest răufăcător!", - "Gărzi! Este un ucigaș!", - "Gărzi! Ajutați-mă!", - "Nu ai să scapi cu asta! Gărzi!", - "Drac ce ești!", - "Ajută-mă!", - "Ajutor! Vă rog!", - "Au! Gărzi! Ajutor!", - "Vin după mine!", - "Ajutor! Ajutor! Sunt reprimat!", - "Ah, acum vedem violența esențială sistemului.", - "E doar o zgârietură!", - "Încetează!", - "Ce ți-am facut eu vreodată?!", - "Încetează a mă mai ataca!", - "Hei! Ai grijă unde țintești cu chestia aia!", - "Heinous wretch, be gone with you!", - "Incetează! Pleacă!", - "Now you're making me mad!", - "Mă! Cine te crezi?!", - "I'll have your head for that!", - "Oprește-te, te rog! Nu am nimic de valoare la mine!", - "Am să-l pun pe fratele meu pe tine, el e mai mare decât mine!", - "Nuuu, îi spun mamei!", - "Te blestem!", - "Te rog nu face asta.", - "Nu a fost prea frumos!", - "Îți funcionează arma, acum o poți pune deoparte!", - "Ai milă!", - "Te rog, am familie!", - "Sunt prea tânăr sa mor!", - "Putem să vorbim despre asta?", - "Violența nu e niciodată raspunsul!", - "Azi se dovedește a fi o zi foarte proastă...", - "Hei, a durut!", - "Eek!", - "Ce nesimțire!", - "Oprește-te, te implor!", - "Sper să cadă o variolă peste tine!", - "Nu e amuzant.", - "Cum îți permiți?!", - "Vei plăti pentru asta!", - "Continuă și vei regreta", - "Nu mă face să te lovesc!", - "Trebuie să fie o neînțelegere!", - "Nu e nevoie să faci asta!", - "Pleacă, dracului!", - "Chiar a durut!", - "De ce ai face asta?", - "Sfinte Sisoe, încetează!", - "Cred că m-ai confundat cu altcineva!", - "Nu merit așa ceva!", - "Te rog să nu mai faci aia.", - "Gărzi, aruncați monstru ăsta în lac!", - "Îmi voi pune tarasque pe tine!", - "De ce euuuuuu?", - ], - "npc.speech.villager_enemy_killed": [ - "Mi-am distrus inamicul!", - "În sfârșit, pace!", - "... bun, ce faceam?", - ], - "npc.speech.menacing": [ - "Te avertizez!", - "Dacă mai faci un pas am să te atac!", - "Nu mă sperii!", - "Pleacă de lângă mine!", - "Întoarcete dacă vrei să trăiești!", - "Nu ești bine venit aici!", - ], - "npc.speech.cultist_low_health_fleeing": [ - "Retreat for the cause!", - "Retragere!", - "Blestemat sa fii!", - "Am să te blestem în viața de dincolo!", - "Trebuie să mă odihnesc!", - "Sunt prea puternici!", - ] - } -) diff --git a/assets/voxygen/i18n/ro_RO/template.ftl b/assets/voxygen/i18n/ro_RO/template.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/assets/voxygen/i18n/ro_RO/template.ron b/assets/voxygen/i18n/ro_RO/template.ron deleted file mode 100644 index 7a3bc5c518..0000000000 --- a/assets/voxygen/i18n/ro_RO/template.ron +++ /dev/null @@ -1,12 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for Română (Romanian) -( - string_map: { - - }, - - - vector_map: { - } -) From a559645679ffae9f35310111e55689d4e81f18ea Mon Sep 17 00:00:00 2001 From: loki Date: Mon, 8 Aug 2022 19:03:20 +0300 Subject: [PATCH 040/854] deleted .zip folder --- assets/voxygen/i18n/ro_RO.zip | Bin 30720 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/voxygen/i18n/ro_RO.zip diff --git a/assets/voxygen/i18n/ro_RO.zip b/assets/voxygen/i18n/ro_RO.zip deleted file mode 100644 index b577d038b7f40f93ed3b73bade055213cebc58a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30720 zcma&NV~}NCvn^bT0*!;&<%Rk!+)!dB3X+!i~RaX!Q zSO)T*|0#JTiezZa83&}PvDWy=QDNw8M$s_NMqg|J3=Z}y&s|gkFUS3N2wT5jcppi5 z)Hd^Wv8E(~n|bHB(e_Lwm7Vkoe!59f`AWs^k8;pHtYWFw89gPqd$mdFdLvsRG#_I8 zi=j9rFHEE0QFN5x;&%=3+t`^EdefdkcOO<4&!Tu#`^F zM$~=GbRviLlVET6H~Dx;jf#*}2FYx>s|#vT_#Ce|E_ok)C zt3;$p0KNsZW~50NJ*om1CY$LcHl?Jp4WmF0ODllrICMyuwZg^mQ*3@>0Lk4RKopSz zq1(k!<%i)NWpJ%T=nLT~|dtdVA-W-G8Kxxv3s^yfH(gt*#PJ|y-)MP?t)fQYT4^&mWDdtYi7D{@qCZK%+ZzP85sw4wAOJLi7?U!=J7upt z6@@0SIx*JHlmdTYXy?Eclk_JH2v0*|pwm9yDs5U^bY*=V&i0Yg3PyT7 zA0PY7t1%x-S`UJB9@>NvRdWX9sXAW1G##rlQwIVB>1=iL_(c-VbeS(9sw zc}1&&+}72_7mnT_%?-^60ON$B&57ZhrR^S)&Il?$TS%c3ISf6AId-XP<`;AB;Ik7{ z%{(2Wn*ZdMerC2(H@+?=l_fO_AvI3=(h`AzkL|S4Vr?bM)G4w!xk^oJ`hfi{aO-_E zJDaClQNF7NLd;S&iDdNz%6~_;ZW`IvF+qW#KU$Gxa9$x*5jrruQbyR)Z%=38MBNT} zMOJWmDM?>U+*j;#8z<^$mjkHU*o#ElseaWkxC_w~C->wiuKK<)e!AY2= zAna3hu9?nXLefi==^5WfAcn({2b=oZil0OS|X#n7qh^yzkQ z#41c3@bB9fhP(EO)Jkga6w=@aFw~;AUIyEtv4AX_CI#$6)~xJ6(D>pJlnLb!NCk7R z`T}e4WlEEKMv7v=U@$ba=0#nw!b{&Mg5=`1LScb62QvWKCc&@96NRrAiB|HQeZBbyZd)P^8A@jZKec23LDNX@%2_AXj0z7>^M+`FM zopa<`hDqj|0hHADEP)-;bSYOnARh({Pn-CCirAHb8-WEE2VaFkRf;X#+jWd^N++Sv z{PtY9ZB{r)e@9LJ4!JpmE%Dn-+fJ%MAZ8>ulNnq4N82L8I%2rpq1I;!ihV0UwVW7u zh_yjhJle2Um1yeH)25rt8-{moSpdn5wic3QqTUVqYN07eY(dB|FVQ^SQ9&>_F742x z-qWYyyanF;>uutOef&wvq%=z;|BmGpq1y@!$_SQ4!y0@(aKb`P(mHSCX#uCMR8#-4 zf-UYBW8xM}pd(D#oUb0{j$YrfpBIVhHYOGo>7t`4wIvTMycEW!tQ-$7idm~nWj8T~D6;7tQ8_IxO-W!09A{$3mI0f)1EqX*WfxbKp@(AR1 z>V&WkGn@g3{M8Du(I_Vkpx_*%vDBACfAD_UXA$KcMbDQu*Lmo6m*m<+yB)Rg30o?# zxoR0nB8Z{WxwBbha*(a&yWTWtPe)_ zgbxFCI~Hj=Fe0vA`c6Z?+=)6~RAlPl5u@G5B~3mu&n@Jbbe!$guuA?t*3(R33#!Ix>~E1^?4B(#rJIg( z_9MBVNtMSRnP@DJTVp5_ikI-hM>;j<)%kVH#!SB*Fq3+?!#~l&eXKvAi@iu2qCyxi zA-L$~+E%CuojiEy^T6ZW`Gc=(^_p;>(84a2;8-DiKHR#}zbH-kpRIx8hAZ!;9dWVO z-o3_z^GuoxE5bKn@pL!c`8^?Np@Da|$u*ue` zYLgvw$PACA9lK#P`mL1EiP7qL;_kF=5cWfu;r1FE4hqX+`)BhBovCus!%4;mJEE|# z!F`2FoP)Cz3q5_zAhN)3YTv;X49}L zCE*{7aLJoO-x~GkRyFsn3vQEv2cCA2ux#gd>$2-O!PrAmV7nnkI5{AnBEH-Hq4H2o z=IlCy_ZurxYW0TmE@h0_-R#!XrQFfvB?n5ApN&uZUtPvQm$pDWr7FuV!WfEh8{rtP z(JU6=MNjLuuayU$2k_u6R@ZI*gJ=s*(od(jKp2EiT3GB?j=%L_ZF^pVg{-S;_%5Pm z;g^jEJt``b`NhU!`GtsW`jRz1+pzN00v|7rek(|WL*zLNqh3G(0Q}|3|IDKQl5wQ} zuxJ-kTL&9M7t?>kq=Elf1c&(hf1tn1pXZ-#<;Imm(!*M+Vm-P zRwA+#tJmg0iqxTFtZs{6iYd1$YarP=o8G2?vT^AIxn4T6e}Bjauu{S7hO-@eKNxHc zaI_J>L;h)=cVX4|^TtSqO;1~cXrcN@<*uLNYg?VaYG0+gpW%iK?bdeuh1l(HrLXSa zRdzD0T)*DG)oL6FPUnSwOjWE@q>iA&?{XFAUDoQMl+D*nw9BS;E~thnt9AYSy7ue7 z1aRkNr*b|Sp`xRAEn}+L+1*WhX{+&lwSy|A<97Ggew}h_aq~cWZn>u}-jvB7-Gp=8 z3{~COU6ZrTsdU~pw6|MYXyj~FtZT!3-hI2c;=r}g^%r2#K|E&_mg|X^s?#&oq zG|_sIqbXwh)VO!tI&o2S5?flwwTRDIX8Gb$Szo!FTUCugmXR67wVgSrt%}uGN5`aJ zH9>vVpm&_bl-XyqX}N3_pX&RB_B%bY90gwA%-a1$e++>BNuCc<%_65}V;HJeDRjC( z#mvh)*XWeg#nQ)g_?=qWXvkp8!oDI59=ArrpaY^eOsi)A%kh0h$GrU|R$X>Gvd)Io zPUoITf85p~zGkWPx%PX3YVA9*fAMWZ!Q}I)mEy73&2KW%syEJvoQU|uhw=hdc zy#>0VZQioEr`3DI@ar3`f%xE_AWs{k-O&`5^D$x7y}(yo-sT&b+0x7BSX73adFVtwc~)hvKvqa0-W-Sw(yu0QU07ocyq0JUb%H>#2(ZYg{*6ur zPgrzo)eV@ix2qqTMycu-8?Dx^urzdiRjhREpQT>P0REwS@TK{UJ)aELffxnHEPzdFnRiG2|uczUcd%Coo-dAdcPRMhY`~- ztlj$kVim+A%2Qh%@nJ+&>H7dQkWu|qV6W0s@={%qn6eUG?_1$Z#c&PNG!L-IidB8T3QOqo%5m~54nI|E3R@~jFkNa_R#-<4c)gf zp?)W%Qbo`7v6N{6-VUV!ZeuO035&XCBMp#IFE+b0|8u*PZshLXtp-N)36Pq4(q+(Ap~<6!rzVGye|?V=B}C(n zgIH^K?GaH7FsKqCif2(&6|9|7G_AcgAB3hDC~9|ir++clmKKhsFvJd_Mj1$Vb!Hux zm)?T?gA<_;4lZ|*ai*Hb=|x9ZN&Nt+0r9GUt^_1VFD0IXukE_|fSx27TSy674uZL$ z`4iAUVCG=mL2uR;C;)8?6a`@mh+}7@^R-A^BY2n%LQ8gGiGkpAsO>#*K?zeK6i!dN z^gWriU#(*oxRgZmIsq_I(@Id52+lRUIZ#8uW6cuT32akA0tPNd!+NbCyb+-iWKym| zJ}C+lM*0L?^~U~9`F2reE=ykbO!eX}Iw|v3CISatn!_G>aRBXA!prFe*q})K3Z-EI z3;{``W(j*r-Sr23>LTreN$bh zO4cvI2oxW{LOf3cc2Fy^c1+vo0F{6uh>o#>VW|9SzgM~viW~E#Y(=F$T-=))&^Gi| zodjEOuL|doEgP;c8L-2wA2a7ZG^f=4QbXK1&(2aclMzO1?S@!accc+kY5|VQdBpOb zY))2?TuXXEK?XDeD944kl|cuCFh=0aJ^+DR(K$Gr@a&?XqA`gB(sv825*ZFYtC~xs zHn``H0}{Ab`Lx&Q5uPdQnThAQkenFmtmDDurPFVAQ8hVqu6O{5F&MnlIW1&4t8gk) zQbZfE$HHYHWa3+?%ga9;fd44$?(A?bq@>U}*tnX^7_4fpr=d}(=Fp8<#1W<22nieM z@!}s#CrROfc(aIF1=1}c988Pb8vM3~P~OL%a?RZ=2@2A2Y!IS_`h)4dj8++Qlz_)2 z-(sjNU3vky#y!}syAd66+c_nDd1+z?&rnOuz}GrOEG0tQU$Tq|_3*pGZPb94#p;qQ z!Sc#wcV26}AN=q!mdv%Ww^uL8P!ssMzj<&@CODJ9LYp$$pwQ_ za+m*@IChvCyJEf((zqe=#*C(xg;gbiB3{~E3M@H1I7AVv(e5(l)xuz?4I9zuY_VD< zFi*kP)#{kr?_WjS#Ib}=cd%skPlH%-GEf@r?2@K)7sMQ$-_0@jAkS3zxygz1Ogi(L zD%5IzYzJXHD1lM>+_^gE(F4u$rLAZLwH-NtBI;b!GSW^{M~-eIpVy&;Ucm?f-#YUAR*%}hF)oTnKN59xSy9R8Vw$fS_Bc?SB5Cvz%`45z0-Q+ z>5^LDGYTq!X~j(oy4OApEri-qHaIdK{RVHt7oD*^n09SAcfM`j!R2sqWo&u`ZY~QD zxH$6HUWbarCH^HbDmbd-^2>aX!Yt^ogcbU!88u;>i14EPTHasJ2Vddnr$hUT0pe*L zNia-i!jmih;WFO#0u~J%s6gQ6NY6A#$k8wf{8k83LWK-Ahl43fYgng>LwaI^;?&46 zU{aV{h}0%zwv{fO!XwYPsEfrhJdrph(8)21gq%DO%2A|F^a=}fa#D`Am*_Tr>u#=# z8N;%b=J5uREinZJU5eRclTCR9Ws^egKCO8=JXtzdbkEsO+;Zh<;n2uq82H{L%#PDE(@}n3$%eb&X~tN|@JV=hWZG_dPAN1!dnG`xKa2W6C_DSE zIgHF|mA`V0ymKnxKcH;Dj_~yva5yqOQt&^n?^xEEQAffZA8LVfS~KlJK$}26B-sV& zMqg;jV9LW&`38ZJahcdyIs0>b+%=NNo|_U~w2$LTate}8dkvdOKyJ<~h;oM$?~okm z1z{r3o_J&u*zO3v+guH)(A*Xu%9mkw(}YPKB>H>l6 zlOitw!V_E7aS-&24NU7t1}jiETwQIuT)7^2($;U)@SkcKEJN_1_3P?9Pauso{P(w- zkIH@4PA>dX zZL8=?e9*j5$VSTxJ)vVs#bqe`_i?il!J5y_waXM5F5z!$OV06iQIm$fX9jFC)Ke*H zgg^25VZXMD_PTp;di`2$A73|ue`!o&5Uvzz)Uc+YlR*p;T?=!oR0S6fX*O~PYzh^$ zD~;Bl9Hn1AfRVGeOj(CL-h-N3M%UoW$ALAR7^=mYcJVrI0arqRU`4*UYE+nl^X%<>#*$ST3331N{ zFelzTZVU3fxmYL$V%bSY$(@CvpG+$3`oltM!5TLi9vcvyaD>T^1^!z4vM!bh17bCr z6BNyy2|=gZ+~efMIuR`G6LjZx?LsXEb_ zv|7Iq0oqsszL+1%)US@_I&~;V%=mpR3$HY^VjgT6lkUH$?5mvlaJh{B*~#4NLCZ?n zmQtpARsdMEc?4~tT^0MHJ*e&+C9rztWWE(@mab}OzEEmvRcu^Y;N zEb%4-6RMzjOnL_}#m}MbXuwGJ%r4J((#VQ_TgePJRr>=3FsxR>pzn7uDE9~c zUo~5t;m-KH8-?1wX}0^b@?}%HdIa84uuh6+Zjrq-~inZ z8ckS;Kq;sQb07$|%1!-+quq8=cP7H7$sE7o5I~1WbE<)2Gr&e3MeVTmrK*#!Zi{&^ zWTIWbd*%n^C;Pn?4MfSAqKkv4_mjcrXojNJB03IRhy?{lZtDZ}q5Z3StSx};Ib-lG zt?S;;DEyy?VEzkx@>rji!Th#&UtqiTcjmC))dTtLua98<^LzAIpQgcmHh1c<-&NPM z#jS$zQX^nFt#g|KGTP%US)H5Ij!ClKg6KMphZUYeeyw@q;BHXETfrt38P-d+1~`S{ z8RNnz0|z__Puzy7guj3#Xg=ebY(IeA&UoDnY4jaikv6SK;gY}BVBAKJq2mO7Epc~y zKRkT$({+GTe?Azm^PMA3cef@w!wf<}#s!&^rAI9UcN8yJKvu~Fp+sjZ7`uERkkNF9 z6}bAzpCby7l9xBgSTv$@X!HT@GJmMp){!>Z`(Zi``&OrsE3v{Y-Kn`eCNtYa=*3>9 zd5$T&E-`USd}xKb2$+hV8b&>61geL+E>*=Z@-G@t1$z8o-As2o0n@7S!IZXAv$2`F zR;`{LqTAS%wbL~pP^VoBSjmc(7`H%z`-y4YBE<$D>uf}uhRiXZ*7<2baazQQx}~R{ z_$^hLme9NiQZ}3Tra&6OdO2wO zxQu-_7KHwX$Rhj2|$EcrsnraD$Uv&pWNME%oz$ zhKRN>lzX&PCt%9?`7>LGs7(pR9isJx?Qt|c&s4f?cRm$+aXpyemP@2?hc|xtH(4jS zj>6#t}}IOT|*c<=~f zdy9b<5_8oaq4X6wsu8ZQt~#Qu*DmrEn|-pa{e-?$>8oH7v#nFc#zBf*y1|dz9=n>W9)X7ljbQmju@B@ea?Ddi8I^D%9mY4p(e?z)=M*__0PZRlX;Qn(+ zr^5mOAp9q!jqPo1?f+dXSxwprn;l{M10@-_-YF(QOe&sE~=&eb`8@m&V%Otm$jT_RAv zp5dWcKu(bFmnk^)&wUu zkMiT6i_IY0kT1DXE>5FEVJh_b(XA-^ML*|ynm`qgQuwbEN6E;jCx=Xo>EV-kD-vj( zCh^VptzX)ty2NU~-Z!ggqv!JY$$DlBwzboF*6dabZXRhXbjhn9AP6D%5%(+82e!$* zx3*qd1C*AyC<)bg;Zp{+RJbLh@hB868y|j=Zw(JjlCnwxXQH5z1JZ_z)Zu7^a_KhC z!{wUjdR-A?DqUlG-5#YnKTG4YU_%tB8&|g{41KqVqhoemRs%C~00*Xw4PVYk8c3TT zDHIR$yRy$M5sJnv1{(4FjLmhYC zdYjAhbtPLl^(fx6e{_nY@Przo$xO9RV5<%nMIBp5B?l7U=?e0%2INEdZK;U-&h*f; zi&P&nXnfs$ER8X*cV1k2{b+PrqXI4tDz&xE%A`HW|KQRe3YC1m9@4^^&WtHan}KfVbCNw zh@`S$K*zzlT%Xc5)v_u1@U&tdNSmP}C^zmnpHUHl#w$VimaIKJnTMOvsFFPcI8{K0ywuHrf9$k8MSPkoK_bgL1 zb4EaR-Lc;IIO|jZ6WP*ytx1I4N8Sj(Qy?n6Tcp6Z$+s2kob_XeOAV?10hbW_E-aZx zS7`2vu;ESeSn_@e!MDz!Xf-8k6*oKr^!NgC4F0&hwqqB@dyTit!B7X2^%XV0p*iQK zk_UhFvuzdgcc1nTES~}t#o*0i?$nd2%*GgKz5Ec!!>XU#cq{K~cZ*@aexMJobZsX# zA1R%bum{Jh4Me1$G%We@l`o6z*ibU3X(So~~tB37S z4M`18*!F$5j9ImFr*Sf55HgE-L?SisQ|K2AX-21%RcU*`6{gW9ox{BMV~ID>k&=39 zAB=SoZI<$J%3BRLr$CaCIF!DmsGL9@RWqa}je6;mj&o4d!Hd_gyrHaa=Qaz*^9!(D zyDRtM8cOcaZX}G~Eg4Q@)|u&NA;|S$o@xt}RO5?HnM9zSHJ+|M0mBnHt|o_ngE!f! zPZYO{HkI}}LO10n_P-QI%=B%%JS{G!4_1k>O`0Nh$ItN4?n)pzwZF=Sg7-M%3`YkO zo;b38lbg$RCOSdI;vUFKXgWwEfQebz=gA=-x8pR=GjqUPTXf9>FFgn(U5uVvs%Cn? z2$7{yPJA5s4gELM0!QAMz<>e({LQEToM}D5|L>6Fb7-#FafrK6m3E!6ExofPe8osM8GjU6 zWZSwfe_ z4!ddk#XwUS5U1l> ziqanKlSBd>W zR#q>8S6hLt0AuZy7N1Mx9*Gv)t7q^zB!xCcnSBrk*1!j=LgY)b_YO^{_(!6NYkNFF8XqBHD+(gEZP^? z-;k>sjK)X*LvH>C)<1{b00;m8#{ZHV3qvP;XHy$fV;9SRNpe)A?T`ikh?c0RVI&{m z5CW6LSYt}WO~sCK8}+kuyr5Hxw@*K%r;_U4Dn0qU)W%#2$U<#sB*V?eDY0zQ zs*W3`bvVchF(KE};2OX_5nF&EfX0qQ!nOC7*~-16*8-5oF^_aHQ4qt|gQJ_0@JE8d zmxS4ypK%?t$-f|h`%mM3^MiXSEnj-PoLYtWD>lJpX2+OUTWLDBmX7}b^E z)^1p?qO9*YkkLPP&3BQ0XA3c(N_OtDnp}~>OcITgBpoOvY;LKhQ}a^|Bq1b}3U&N` zZL(CYDJV-?O)>0?%hD*CeMrLR+*=o?Z6uQ69_wEyVbj*ac{W^#3u4`Qzqw{gD`id~ zA81Twe1;kdUqZm{v+zs~B^p8&avZX)yhVm-)Sdi|U=+L@#aEH?^GksUqOEiTN( z>6WtiM6Ghq6Bu?=QbGFzYzyCo5^W`OuO(vz1l$MaHUwzj%{KwYAq@DlKSNLIPfPfJTg#@-#`?CVcCP;><4e=Z#m&l2Q!h`C%g@r&D%Pty zNXpL4O3Tto%2snNRBIzH&L#d!Tlysa)I6GcMW|CGyX}*n@a{h4& z90I99M_BZa8-HE-XD5CBM9=@~d3{?$J4-WDXBRprd%ORPl1BXVC~2uukK7Og!p%F-1_h zBU4xI_OOGwlF9?9CKham%29u61qu%`hmInc($L}1kq<~m11eKBX?mGid!BqS!Gl&G zX-w#_Nr=XrLlpwGIs*@G+o##{`nk@B=-_sjNw7H_yAUc^RSVi z_H7$ewymJooCVBDp4+YEDI{u(katRJ;3GAmVRr7Y10x1r=a(=h+hs+JZW``%xp!XW zZ*+j=q7o^$X8g8l(5hsa)$h8s>f+Nlmni+t7F~UfgOM`7fdeOwPNdiXB_`C0_WB?; z8Lr|P!<`_%JJ`R6)r@9PD+34s@b^gmzr*@-YX3Fz`}a50f0CJntI7Y44*x&KegFB; zVgIDd|3&6sJH{4<|Eh+Qo7!NvDF74p!UqcN;)+)w5MHF*1}BN zFqn)_tc_PdZwT*M{g8syO0p^0gi-(bh&-N8mTiMxCa789dqMU1eKqd`FSj1QPxDneX2 zURj*!a9)9IHL4(PGOO6NU97J-NXh9K6L-ZE&1RNab&0ZaWWKSD-)D7pzE6Pvj@)f5 zuezD40FApQwv5#T8Fsccex%4 zl0iC*@@^m|Y>{b$dO`Kvpmoy87x-)wvKh2Y53W1ke}c((q>(}qbdr{26@MgTBUx^# zbry*g2IT#`{Tgd5C4|f4jY|yKRd}w>;exJv#_@Vtffd`jyH^6a?FS7!u#iP&AaCjF zpNqAT;1v8 zorX4{DP3Oho7ts*2F6!4)clI3nIQJ&rLAo;)S>=2bMWMAwTbSwvu>=8-L(2{I&W$t zFfR_~L{WGJ_QRKAAJhQd?WE?bSXO7*-u3uwC)4B%&Ga&!G^flEhgls-nMqTU{T?{u z5{z2YAeQScj$3|Op|m7@`uNVmwEkbDqYTgM3H`~Pe{uNF2sQY_qY?iL=|+a;|0Z?% zstnj|GQjk_P`j+PdAp;;j<%ztn($d38?{uFTo!mg*ejy$yD>EXfgts$gL zV1}FsE$$IZexz6GuUr&p#T|(=0~(y0-2gsRLEPl1Upyj^d4?r|x5d(TI198X<6~+o zNK=wX23HQ)GGiX9RwUmPpdc_2WVUU1rzot)S13Q&sdFTv+6k(=BTIZ)Q)z?PSr;Vtfa2NiC{*!YyA zdkiew*mz=fKozMQ5=xg;39J%yP34jQcphMs+N85K=hS(Q7tI?RR|6EkC;y>_F^-_6 zE2Otx!#TzwOc{V+^Mk*JWlJ+F& zuPKf$yoaUQ&vpy2ua`CFuqG_X+S#w#^CL_?K1QOJ*yHL${Nf(=nJkcSCpUn;(YUNZ zI0DU>+mC5?1cq+#f5yjPvAW|W|KRj58vhxmal8NkDF201XKPCv8|Qxm)f(;TzgIDO zKPVxH0c{LOUqPKTB-o6GnLz4n2m}HE%d?qZ>t~4!Sb6sY)?`Yu@((B>8s#Q?e z`LD=6%uR>ZmjCEl;|4!Y-t<-TvKTq+&2qUBW-8bh{Br89phb97Forjr~96 zQStd>Bw}A*27sdU`##k_rrCG5{NBEy!G6!f8_r_4#Iwop7(w7y*PeqG&`e)c1hpfH@dMY8Jq z3GP(2noLY6Ur}1FR80legk}%-te4%m`k7M={ow^5y**%f$1;@CJXg?HgYk0ueeSMl zIfPZ1W0@JMnz%T-8`b=*-Z@Vu+AG~AOv$;8uD3c^vdo{nXG%5H2rVR-BPbjmU$w;7yM{Vl{YV>0s{hu6wk=DTxhI_;R!$pio1*JI?C z!50S3FZg=aR9liLqw^Nr4P~Z%oWT(}*phKbFc&2S6hz+Q16yz6J;e7#hDlGL0+3&= zecV)t%=${qUa#Reg4@rQaAyEsHh}v6mCA#u2mQf%!f|4?Gjm7Xf{`|2mGX1_2>YC z&+qe&>%vq*eBJotMaji^k+*FBiI3weB(gw}3i>XT(nhzxSGe9;KzFq7+)|$;ucKFQhfK z8W|<<*fVbKty#2isl2&xkLAmc$l%sntwRzDVaqu+j=cTBl3y#BaGGaSl3gka(#x6w zG!Y$IXep;S>6|^Jb#D}-yr(rtlg(?xn7+&1dzAcwqv6iNoYdNE5H52xg+3KmYP_!I z1Z!0O+Xq5Gf|OWxTUpN?=kpiVXz@0`p%~Va*<4o;z8Ur?KHsV_MRG#1cmRJRVPxrg z=^YWr71@G>JOKM2m_RI1wvvQRuEDh>fDS-Zq0EU~axjBxLBS9Sh;|1}3t~${f-I_S zfZAt(7*WiOsu}VAi0`}=f+DYzlx1u#V3Cdp4{8Wdaq`x>5h+o!%w+VRWeEG3`JgPa zK)eEFNZvBcMA8yFGu3BTG4*Imv`0z%hZbozt?wGVo_JPiRDQL zuxg=n!`WSBI)#>_lPj)#Fu4**(;LSnW4$KIDza;x6Ki!&aYJf`Lji7ZAaW#3JRPSV z4166~sW*^?{4=DtKjE2gntaLbA&(akmyxgoF-W`|Ko9tyma?}zLIh=(33u#?o$=kzrRP8%l?No%=d|O|hF7@!49p<)0P-E*d81SVUOjNJ4LfX4{}afT zwnE2bSS)cY%_-UbZJf%X(||Nx5cn68n~Q?vnO7lp@srR*&3U9`so6nvhAsu3FS>m@&t;731Qh>(mep0dw#B6pcHzJCz4hP6gMl{a9#NBMwc zL>ivMDZ>5zwj1*DJC#|2UjG3R-BFZ*?k`?$M{ESgpI4>4xdLZjp>}hL@O9*FMZ-pL z*{sCn573xgTfi6YFm)$K4wxW%L%I5V!_l z9M7qDg@C-yS-7Hw)>lN{(brsIzr;bQ-83DHI1n8Y4utH2kHI!1&VaATROZ;boPU(@ zzRdnAH+BEMCt8fyYFodZlK=tP7GqP5hbXX8H6iLw=DN=Y0Q>|`NB1;)hMX(~o82^y z9kb^GfNaBDob3)ndx``t(ghgPBWP81#%VK|bREfL9h3$Hpu_=pA!zrrffb0_qb+V? zV0d%_yNXNuV@3>WG9a>XgKe~D=|ll?M@D-I-vIVqMQ2i3+zir^g=ao07dE5T1a0FS z0}KWWAskxc^HU=NWBReaa~P5E0)2o)qGcN+aWUy3a#Sp3UecwuQ+~gjnV{zP*&p*o zvhY91i!XB-$leCCeY0rDmKw&t7V^HrT_lkXb0ps%mkv!NFBTp?@BpRsi(2}ZN#UyV ze|@Y8IVRj7VdcQUrzJ)rK@hiz^!DU8zN|IbFj{q6n$9c&`gZ&BU-THyCYodyXg&~5 z6}BUXhDt$gJMUUvi}N~;U^p#MD}Qzfp)HuOAM&g;KlaBuo)B>mhjy}BAFHa|7L>uX z6K2A{q^Ll#1CPw^J7l?t^#p*S9yk`T{&+qv#2Lnoy|YdAvcS4JsdHuePn91_ME;ms=S$D_I0z zw#1zy=x-wJRqS~1-waa67@DKvq^EL6FxE8nogv8J91Wp8MYePgkkel?rDz=|$Q)6e zO1Z%DJu~nbqUX4)q2o$}u_O*Q&vGKuSyurjZvvJWzcytl+MN7k)GM7Y0jRmpERzX_ zvgUNhQArA-sC5l75N7dARP5VZmVXb9aA_b;SYZdvz&i&5duv^) zlM`J^K+cd9<|E4yJfE6>I_Zi>7GSXA! zz#zhq@bYy($1gUOLo#36OA~QVtdxK1f)&O>M&1mWN_$d27(XtiqhI)JJgu-{epusv zB_`S8T&6((=*8Mq8U^?4I5Z$xubg&G$#?Z$7;lipw3cbt5ywzhLVU1v$rb(Bsp9T! z5uEYtehP_B_d&4Z3%^l}=f84!tWP1ozb8okFm@)T-|l2K8tQsDYFSP zM^kMaQI{eF6hhbELlyZc;923i6zo_ESPp6JEb%HEuGBW_dH5aND;0iAz#Crf6B)V? zY}bEz({N%DT^Fc|8V}34iqgi}(5soBY#1NrObr#wE||H&iJsVfyVHB$!Y%Vj2Dh_j zOMBxCIv#zB&vy9HG#b$nb~W0`UHwWvV@SaxHQQzn8tM`RmiOH>slLESJd6G+=^iPc z&zH*};W~Ih2geM%8&1xt$~;52nA1GK*|vc2Vz|?DXPv%`_RNO6ouq0c)U%aR401K3 zj%-f zOnC=S&+oAKdC;DbJ+Hi0tes7pm}=5qGvXKv`!&s_n#5nBtoN;mVo;&G^Wz56>5}j& zb_46>;0%Gk-|-4{J?2fPstbc+%QfD^Vnllk`RB34Amyfrb>_YQ&?leZ_?9Z;QM{r` zt;t@jK7T+pLnwQPK0Pt;vZ;bcF+H|9DFsifBO}U2w0Qf7M{#jCa|0$@V z{+FaOG_tg@bn*N*nkqI~)()EyCiI0Dl%AnO5S?xg0Mx2LV3Dq|n6-IG1PSzOEmR%w z1VwC~&M81|u<4G|DM{%tpKN+~%!~oybxi(NQ7i{}cQ1z4ylknNg*uu{LMlb+a2~Nc zyw10cV9FO<`4>*qPa2H#T+TW>N=#LKQ5^(`5@q!9hTAkA7C>eG%>E*@B_f6cXB25` zFf|~ypL*RnscJ}@WT4ODQ@5Mp8RuwPLC4Pnr%hSFTPg0?i|(;NHorYg`hEva(FI`k z7ny9>G6hp6G^5A$@4;LBxmCa!#)b~9jzof{{Tg!s@Gx!doPCL)o(ZP@9%owrlL$of z@rJxuZMgZC3&<&WM$u>FL38N>39$^RWdLGQd7d9<%3|;S`=!N$R6&`4X8dUMLq8SK z_&)XCsQqH|&8*RCA@)d=^XIeRrFf&4)|*W-5t!WoVKBAYqoh|wu=v6ZM?SlAT#4`0 zHdMMx&f9o$jd~}_BinYM0TPk-a%iu!>rWPA*5X&U+c`U8GmZR?Yi`{i9A<({C{872 zp$(>e0BdogkBwZWEScw=Wk004gh^UqM? z{!=gg?<$hB@xLl_PEyFu)5_7!%hpgx&`!uqOUtR&t5&EfNKQ@DPg5&as5;b8>`eqv zNllE)&wx#EzrAvEhyC>e90Dx{jFkP)zJK@rXRmnvTt-9tFMvCny0}={ng6S*L8|7o z-4+K@@2&D(2Iz`s0O<4FVIO3I91J&Py*D96B&}l>Qp>01Xzx3z8+)5)fM?|E-snc1 zMCEpoi99#N9Fe9fNwli|S3Bf#Wb)3BS~v2Rs}j_#uVCG>x;~ch$=q|26~0Qf)Wy^t zsZ$R^>;~nLJP+m7ED3p8?9aoYAH%Wps1o_#9x5UpxEV*#HqVb{Q6%0y}z+qxBd8Fov7w_!(YaOe}#V($pFH3L5w zuxQ7b{itsVS|3TATNLGgryk(J&@C-^mTJ&*+XFwg2b!q;s!CE8)O(7{j^n1UhUdk# zCHAS0vK*+5xlWnp2s)@mQQW;81^=N%i6KXDEynYeU?pW!il%pMVln{32zg+*YDwx} z!^B~~5wj)bMq0y+OLqJ7DpcA!$2z3Z1PIV&9XeAlWn$Ox$@vqBuL}u96XM`obWO*D zi4HDQTR*JgY+!0Fy<+(ivVFLW-i~tzkyIgps-gC-Nt=kg(ad?G#4v zNJw+itF*SVEZcD44O;E&Exz)rsu-zECqD{jSOl?E_y5z*RYpbGb#3YHkQ5jYX#wd@ z0qIge8XW0{A%!8NrBOOXq+>{Ffk8q-q(Q(z5b2OqzQO0^{ebm+YvJ#YJwN8(weR~n z``l}vefG7@)eJ1K_UYX}LIr;^_bKZJHj#i{$UzX*W!?&OSS%+An|bk#y)RBLcK0aV z#90`g-Lq#s(P~#&!k;@x8R!J6p^gw*gzYhgv07Wie|Pm;{X}kfGka>}Lm=ruh=DO3 zo-afAydTN!mIP3Cf`Uu3aRw&=fk{&eUpC+_t%JD4PKK|`N&_St$-Cv@EOOg?b1xlb zhPT8{eyeq|0vJUS43G`3jk2kB}rJ_!Oi2VgfGvApn< ziZN8SggKg6_j;@HbbqQ=x2*su^}FMYMV@~2syEUjrWKYX$LjW5I;yI zVJ-TArKHRxs8R9RbnMOLW?;xSoCp(Nr0-wvLkiRSl5Y=e$SPW)(%90aw6Oy%%g0A(02jEa& zTkk<2NyNnj$YwXWvvBM_%f)E;dQOT~grPmi6xTOvYsE+EGv@1q_B3IlHZG&_0x-AiS}#INuyNTb7ZCy&e1P>D-Wjh%9C-f+X*xG$e>(m5z3u zYmeYDiXzrF#9+2A+8Rqv-CS)R)49;ZPBJblN*h70cVp0_bfIw&Y(qg7Y&_IA7VzdH$;Hd?75GL8iImbj;tf{OQf+*8FBM4=xfJiDii zQcR%wI@g68NTCJT(K~#()LHZXaU&Rk)M(l7D`TAMmr`fq&UwPF9D0|`eMF`zg7SNx zN{?E+tog#ExNg@HyN@q?e)LV7jeN$nGpA+Ei#V{tlyL3{m!Rbv?j%;Xv`aVXS5Vis zZ)E*0?vsQnDOas09fqS99_lp|xU6I$);5jR_LRkL_jcRmA@b5&5DIo~5ShwzTN zZ|Okqv#Gsxw+F9Ry6~Be^9#n)zZPJOrnl98BnafQVfalMxBg>~tiUOSiogLM#f8UV zroi^r0|#E?4z<)(F#X+vghi4tql!`O-R-@STrsIEpk&7bm}toyAHurpN|wZ(hrf@J ztawU%y*DZw_;1B<2qTe_J?(x~Eb}@jEbV)~pliGzkw#B70+Ni6y6EHbxW;C#V_}sC z;IMZ;D2Xb?2)D7?+1w8lkL6o1yCXW>Bcf(Aa>A@-g0P?F1*8a^u+(!@G!1n;&ZC*z z@5)Kb{n=IOP^Nn_fBW!jFZ*FGGkxtVj<0kX$08-_Qv5~iFw>#;yig@J+zPX>G^&Zn zskcY@Hd!EM@hQ+)J`Toc(%z`4ou%v-wdcp3QxyZuF|znx-kD5^M>6&|a2r(Umcme1 zG!_qR6>T|tKx&d~>dk{_P8=v`tK0Z*gkWgH_^A$#EG2tIW<4aJ{phakfSLiXr1e_d zy@FJ7$zHMrAiZM7z0^+(fTr)g8lA*Pc;r1+@~;x{kjD-{Hy#&wB8eh$Yc))4jmzZ6 zgTX7qulV;EA2#KSl~wEvZ3@}@07EBq5b*f@Ct?=dCRkq>AQYrqa{dgD@q12a_! z#?D%rOVUx; ztP$&M3F-`CVmO!=%yvXFI`*3Bmis2Dy17F$_N}N~&VUWmgJ{>|p5ph%$je#EkVKW^ z#L0(s_O3vssZ0Pe1IeP0N!9?xhvJo%G|8Fk!PjDjoS zPZOJePkGkiY1;pG8Ju1?KXtNqb+}4KZyQst($0zf9F*QBU$lTj79Fi3Pg|a&X--k| zbV4X0#YLdqMOgT5tKt-n2&u|kE>)S}@8;v*X*RK?dN`JWtU8ty{d~~-9o)_gHv_zI z+497jT7qUJHtL_tle9@02mT6{uzsnD=QFVFE1I4C#)vVWla)>>m>Rt*3phbIi~+zh z_+4H;SyLylg8BAq{k^$PwlYc4L5Jj8lF_)x5$r*k0DL=~wQ)}r>w(leBAN3t8S8v@ zRYh8yGZENzcogAw@`FL0%n#m?!6HQ>^JBW%X5QUTVi4B%QnJMbKffnS$dOa#vbN6* za@$wQ_TB>6(JG*>d_gXPY2_o~sOD;Zv`X0OX9;colU)MSPwX+_WS$cG?^NT$v*C+5 zudT_Ih<4Rfgx{RvPcIVdyQE+dFXdq*bFj2n_;XYcbPnrKyrM~9oF0~aC@32vyhGU6 z23^J`iF5IzDC14%|FU;qlY)c2cWaeiHefm65Sy+^#6YQZ0Q42=?+VF*<@*ixH$4r= z66S;6pd3P>ws`Lw7b;HPoY(O@MEMY}#%!h9)oRS~o}*EDP#!?qiT*IvF?eKfv#xJq zF_q-`*Yyza$7pPG-^%fbvV?e!y06ZWMsYQD!*YBYnilIc0}XcXqH~)<3rmO`k|z5z z6{ZK!pC+J)w_;KB=j*(3mzJ5EW5-DfG7f#rqp1Dyh!B*u|7innJjPdrBzmUMXxSiV z%#5AfI39SM?@iNCv(m6Ax2a3vX)AC4ga9UnmS>TW`oc0FD=oMIb{#_eK>}}g(uFto|~vVagfA4$0x>U zx@05MVAvIH*A+K9O10linZJ0ltswj*9dA zp$Qq^z0oMsxKS>|U^X7Rz>tqH9{7$!Iq+h~U zmFGm+$N)EVw}Nkk_o-(oC7p01>Drg_i9NZ1rQsT)*eSlY0GQ~;=! z>09IqpXJu0R#@yEqrljo8MF7%8zPgjYGi&BPf{kxW5S$B>rG z(B$MzxkCUUYiX~z-To-jNlkM@3iE_sYRF1p2uUgq5VJ$)g;6eOj|6H7pq?Mpkyf59 zV-~cy7Wp#Spchc9 z3W-K7RI3CkSQ08ahnwM32_Ebm!XGb@>R3&Ghj(IX3s`!mB!;THu)+Lum5K*=kZPP~ zx0GL`GiyZFY2~;3tsmIbixJiJ9>v>jIx4wiuso)YN9<>QhZC8(-;&Zf=InXP;$!}h z>Ce`F-0cJpK^Sz`NAi{n$pCFUW$ zB&#q)*p03wgQzV@;-=2skxGJ`2mxklk0kU4l&aGSg)9Z1lHlM~08qBGv%W?6VZV0u z_Uc7WA-7z@39=Q{NTDIxl8CdGM`QU_O)WhYsy8pIVhE#NJ!w72tf-E=^EsAu*<${v z!^QJcI~~$i5v%bY9=*1l(|B0)PO!OZ2X44r2Pb+}Hm|wC$)7FwiqF5D2Hu=@y3zi9 z3x>n9fQyY~wwBIU8h8_=-KWC9j}I?vkTJ{AszxILLLq|{QWMG?h1!J^2A?!%tA&4) zBNDu+TWp$7MC(%I4E8AUeu9TxW)i^TQe#kZxLkPH-NQ|VleJ9;vLr95pM4k4{Ea(> zruWE{$!;VG+hkCH+d0G#(5ySJQ`OIXM<-pTJEiKNEK@&wc=Zd`ns| zat&7?It|$0ZTUKie>7 zBmXsmEAb+4g0jk&q-WH!VMj2Bg23R3%_~ej7Hhk;-Id=rVT!?Dq(b+SN{(w9WSUN( zrMW*n9huA=fdoY(+?vh00a#=K$z7e)F|QJ)Ec)Ov~i`$|<+6~<- zxMz?KAi-N6(4!cqk1C#IGa==-^YFpIBUwFN;K(CCI;^auCK%Om>$Xm&o0OGy5NH2> zLV3~#4@f)PPYP)`%Rwxfb-xn5V8$w+#uwTCE4+r=LH_eW5#cJ1uP3V_C7LdaHy z6VJ=uOd^paa*gK^_XyzwfEEHGoEuIiqf8r^REPm|W@06h%gq^O9C?Hq82F?CZ0sr8 z<{oTwW)?zY8NalnNw^0pCT6QaAyIt1(&ots^8g0<>9R;zIIF2vArPhJD=@9S-IPd| z%0I=)qUCKqTIVEEA#coW#yg^|$0|fQZ1c6cIg>;-i+)<9#y6JR@N=boxT)ewixXV< zgl0RAP1sv8jBiE`w9P4C2^;wbfj%Cp6z+>W7Q=LE=m_pY-DBDGnEzF^89vDrp zR!mZutkB@glJqNaMU@c|?reC-##QA187L$0N>(uhyrvP$|07_Ux5f42395-9gcXP% zHmY;@TBiBa41gQ;3Hr-4l{@=j=_&Fq1uf`=Mgdbw41+#RvltC(lO<4jgVaODKNn-d zefbDtml*)SL{2W04R3*lM7)LUr6aMt$_Gs~5W*%6V!Uwou-k4>fBAB$MVmT9uzx4-@nZv4!qS|ht#YVV96I48e^c0Pb` zgYELbE9BP=hqbOf2?eKVv%o*E*AIj*(>JiZBkZOw)yX z#{n4wZBLW7CDsZ8lN7joT?dU@429R(-2teoT`czAyyqQOKNZ+=o3ft z-6Zozb;he{F*|v(?5Q6RN4hX--s(cSB@zgRm(cIHi*~I4bTj37=(tLlL(?l|a2UTq zrDtSf^s1+XGv3z1fn{z)#Q!%m1d4xB;#FN{kw!cgMD%&Mz1+0aU_QGUosY#Qhb#wJ z&PRQOc*;@fLxQw6c$Rd^#J_W-1ZVK#am>ZZ#QaKA&s^dCm7gT=;r*50S`cuVt?D## z2_4x(oN5?IrzMDvMmB)YMec#^uhWH@Wp>FR4$yjT<2B5!b4>;3nGofF~V5qPpU8{^;HCZlb^NF^j@=a11!;EWhBFA++d%FFY-`Ly!!U71 zk-kS+T*NZg)M=>!ib^JaoQUd-$6UD>_Rz`?>dKuJ^rA;flOi-Xg;!a%L-prMn3pxJ zeA0uOXl;B5ZJ9wL*eu%~Pc%y2p<27QOU6B(B|A)h^&gQkj?>bj8HUi9p~y@2*O%!dSkhnN8n6=hO= zXY6!S1)3i&)XG@lhA}1n+a*|V*qy_xQgScWNO^v~kpx$}N2P#OwxQA9gSD{g$#%`h zNebtHQgIy)oB+M5<67mH>%Z@~8MKcOuGT#yZT5^JO?x3B95s=d6lNGMV5CR=*(E&p z_HQ&3pVT$u#mbQu4p@cqp66gBwl9A4w8QQ{l45=0(Am?Wcc)>brig$@jP!p`xQ55! zA6u0?{k!VC>whrMCSISP;&(dn`pj~{GXKTA>ip}o=RLzd#e%=eA3M!l&MX%khIRJ5 ze=`;EGXD9A3a3*5&ny?b@?ZQb&IG&+eO}ppx|`1|7hDf7#Qa0`Ukzxu?BKkh@l+sw zX1U)s>vtsw6+#nS-mTOfGKN z^Zor7iSfOFdsWrR*>j(5+Vg$cr?sv#%LUWjJ^$QS)C^pPKi{Kpno68mF8Bl2dHAch zdSCW%{_6U)*Wt`^!BpbsJ^V%I!(|ue@1ZYp^i=Y^i!0uUUxq(l^F1xPoLMgT*G2fh zxZ1w#<9xC6V*GEw1#SQA;=igTUv_Z5GIo)p$4ciNT(N?B8UB39>a@IeX1U-fmGkg_ zzC>3qwq15}{#br-DYR8DxcQ4}*kvE*^X`i~dQ9WIkEGS*9=@UaLvFq g1J?{(GjPqoH3QcSTr+UZz%>Kc3|uqt|AT@50izP=y8r+H From fe1ea00246e5c25ef593e8d498db43c4b6cace04 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Tue, 9 Aug 2022 14:40:26 +0300 Subject: [PATCH 041/854] Fix died_of_buff typo bug --- voxygen/src/hud/chat.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index d07638a976..adc2541cf8 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -437,7 +437,7 @@ impl<'a> Widget for Chat<'a> { .get_msg_ctx(template_key, &i18n::fluent_args! { "attacker" => "{attacker}", "name" => "{name}", - "died_from_buff" => "{died_from_buff}", + "died_of_buff" => "{died_of_buff}", "victim" => "{victim}", "environment" => "{environment}", }) @@ -808,7 +808,7 @@ fn insert_killing_buff(buff: BuffKind, localized_strings: &Localization, templat }, }; - template.replace("{died_from_buff}", &localized_strings.get_msg(buff_outcome)) + template.replace("{died_of_buff}", &localized_strings.get_msg(buff_outcome)) } fn get_chat_template_key(chat_type: &ChatType) -> Option<&str> { From 56dc4909036d8a336eb82eda6a7d0025a96ca757 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Tue, 9 Aug 2022 18:31:46 +0300 Subject: [PATCH 042/854] Fix tutorial key i18n --- voxygen/src/hud/mod.rs | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 8ca4fd781e..b651e9ec8a 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -3783,31 +3783,29 @@ impl Hud { self.show.intro = true; self.show.want_grab = true; } + let tutorial_click_msg = + i18n.get_msg_ctx("hud-tutorial_click_here", &i18n::fluent_args! { + "key" => toggle_cursor_key.display_string(key_layout), + }); Image::new(self.imgs.sp_indicator_arrow) .w_h(20.0, 11.0) .mid_top_with_margin_on(self.ids.intro_button, -20.0 + arrow_ani as f64) .color(Some(QUALITY_LEGENDARY)) .set(self.ids.tut_arrow, ui_widgets); - Text::new(&i18n.get("hud.tutorial_click_here").replace( - "{key}", - toggle_cursor_key.display_string(key_layout).as_str(), - )) - .mid_top_with_margin_on(self.ids.tut_arrow, -40.0) - .font_id(self.fonts.cyri.conrod_id) - .font_size(self.fonts.cyri.scale(14)) - .center_justify() - .color(BLACK) - .set(self.ids.tut_arrow_txt_bg, ui_widgets); - Text::new(&i18n.get("hud.tutorial_click_here").replace( - "{key}", - toggle_cursor_key.display_string(key_layout).as_str(), - )) - .bottom_right_with_margins_on(self.ids.tut_arrow_txt_bg, 1.0, 1.0) - .center_justify() - .font_id(self.fonts.cyri.conrod_id) - .font_size(self.fonts.cyri.scale(14)) - .color(QUALITY_LEGENDARY) - .set(self.ids.tut_arrow_txt, ui_widgets); + Text::new(&tutorial_click_msg) + .mid_top_with_margin_on(self.ids.tut_arrow, -40.0) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(14)) + .center_justify() + .color(BLACK) + .set(self.ids.tut_arrow_txt_bg, ui_widgets); + Text::new(&tutorial_click_msg) + .bottom_right_with_margins_on(self.ids.tut_arrow_txt_bg, 1.0, 1.0) + .center_justify() + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(14)) + .color(QUALITY_LEGENDARY) + .set(self.ids.tut_arrow_txt, ui_widgets); }, Intro::Never => { self.show.intro = false; From 0471e78f41f412f0379f146042d6d50dbd5c62af Mon Sep 17 00:00:00 2001 From: Isse Date: Tue, 5 Jul 2022 17:01:22 +0200 Subject: [PATCH 043/854] spectate mode :D --- assets/voxygen/i18n/en/char_selection.ftl | 1 + client/src/lib.rs | 41 +++++++++++- common/net/src/msg/client.rs | 5 +- common/net/src/msg/server.rs | 9 ++- common/src/event.rs | 1 + server/src/client.rs | 6 +- server/src/cmd.rs | 31 +++++++-- server/src/events/entity_creation.rs | 5 ++ server/src/events/mod.rs | 4 +- server/src/state_ext.rs | 28 +++++++++ server/src/sys/msg/character_screen.rs | 59 +++++++++++------- server/src/sys/msg/in_game.rs | 13 +++- voxygen/src/hud/mod.rs | 2 +- voxygen/src/menu/char_selection/mod.rs | 12 ++++ voxygen/src/menu/char_selection/ui/mod.rs | 76 +++++++++++++++-------- voxygen/src/scene/camera.rs | 51 +++++++++------ voxygen/src/scene/mod.rs | 8 ++- voxygen/src/session/mod.rs | 21 +++++-- 18 files changed, 281 insertions(+), 92 deletions(-) diff --git a/assets/voxygen/i18n/en/char_selection.ftl b/assets/voxygen/i18n/en/char_selection.ftl index c2ebc0cbaf..ab23cff563 100644 --- a/assets/voxygen/i18n/en/char_selection.ftl +++ b/assets/voxygen/i18n/en/char_selection.ftl @@ -3,6 +3,7 @@ char_selection-delete_permanently = Permanently delete this Character? char_selection-deleting_character = Deleting Character... char_selection-change_server = Change Server char_selection-enter_world = Enter World +char_selection-spectate = Spectate World char_selection-logout = Logout char_selection-create_new_character = Create New Character char_selection-creating_character = Creating Character... diff --git a/client/src/lib.rs b/client/src/lib.rs index a0f04ecf5d..42122d1c68 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -30,7 +30,7 @@ use common::{ slot::{EquipSlot, InvSlotId, Slot}, CharacterState, ChatMode, ControlAction, ControlEvent, Controller, ControllerInputs, GroupManip, InputKind, InventoryAction, InventoryEvent, InventoryUpdateEvent, - MapMarkerChange, UtteranceKind, + MapMarkerChange, Pos, UtteranceKind, }, event::{EventBus, LocalEvent}, grid::Grid, @@ -107,6 +107,7 @@ pub enum Event { CharacterEdited(CharacterId), CharacterError(String), MapMarker(comp::MapMarkerUpdate), + SpectatePosition(Vec3), } pub struct WorldData { @@ -816,7 +817,8 @@ impl Client { | ClientGeneral::RequestPlayerPhysics { .. } | ClientGeneral::RequestLossyTerrainCompression { .. } | ClientGeneral::AcknowledgePersistenceLoadError - | ClientGeneral::UpdateMapMarker(_) => { + | ClientGeneral::UpdateMapMarker(_) + | ClientGeneral::SpectatePosition(_) => { #[cfg(feature = "tracy")] { ingame = 1.0; @@ -881,6 +883,14 @@ impl Client { self.presence = Some(PresenceKind::Character(character_id)); } + /// Request a state transition to `ClientState::Spectate`. + pub fn request_spectate(&mut self) { + self.send_msg(ClientGeneral::Spectate); + + //Assume we are in_game unless server tells us otherwise + self.presence = Some(PresenceKind::Spectator); + } + /// Load the current players character list pub fn load_character_list(&mut self) { self.character_list.loading = true; @@ -1334,6 +1344,18 @@ impl Client { self.send_msg(ClientGeneral::UpdateMapMarker(event)); } + pub fn spectate_position(&mut self, pos: Vec3) { + if let Some(position) = self + .state + .ecs() + .write_storage::() + .get_mut(self.entity()) + { + position.0 = pos; + } + self.send_msg(ClientGeneral::SpectatePosition(pos)); + } + /// Checks whether a player can swap their weapon+ability `Loadout` settings /// and sends the `ControlAction` event that signals to do the swap. pub fn swap_loadout(&mut self) { self.control_action(ControlAction::SwapEquippedWeapons) } @@ -2256,6 +2278,9 @@ impl Client { ServerGeneral::WeatherUpdate(weather) => { self.weather.weather_update(weather); }, + ServerGeneral::SpectatePosition(pos) => { + frontend_events.push(Event::SpectatePosition(pos)); + }, _ => unreachable!("Not a in_game message"), } Ok(()) @@ -2319,6 +2344,18 @@ impl Client { self.set_view_distance(vd); } }, + ServerGeneral::SpectatorSuccess(spawn_point) => { + if let Some(vd) = self.view_distance { + self.state + .ecs() + .write_storage() + .insert(self.entity(), Pos(spawn_point)) + .expect("This shouldn't exist"); + events.push(Event::SpectatePosition(spawn_point)); + debug!("client is now in ingame state on server"); + self.set_view_distance(vd); + } + }, _ => unreachable!("Not a character_screen msg"), } Ok(()) diff --git a/common/net/src/msg/client.rs b/common/net/src/msg/client.rs index 05efe1f407..2cdf77201c 100644 --- a/common/net/src/msg/client.rs +++ b/common/net/src/msg/client.rs @@ -79,6 +79,8 @@ pub enum ClientGeneral { UnlockSkillGroup(SkillGroupKind), RequestSiteInfo(SiteId), UpdateMapMarker(comp::MapMarkerChange), + + SpectatePosition(Vec3), //Only in Game, via terrain stream TerrainChunkRequest { key: Vec2, @@ -138,7 +140,8 @@ impl ClientMsg { | ClientGeneral::RequestPlayerPhysics { .. } | ClientGeneral::RequestLossyTerrainCompression { .. } | ClientGeneral::AcknowledgePersistenceLoadError - | ClientGeneral::UpdateMapMarker(_) => { + | ClientGeneral::UpdateMapMarker(_) + | ClientGeneral::SpectatePosition(_) => { c_type == ClientType::Game && presence.is_some() }, //Always possible diff --git a/common/net/src/msg/server.rs b/common/net/src/msg/server.rs index f0849271c4..2c7241614f 100644 --- a/common/net/src/msg/server.rs +++ b/common/net/src/msg/server.rs @@ -140,6 +140,7 @@ pub enum ServerGeneral { CharacterCreated(character::CharacterId), CharacterEdited(character::CharacterId), CharacterSuccess, + SpectatorSuccess(Vec3), //Ingame related GroupUpdate(comp::group::ChangeNotification), /// Indicate to the client that they are invited to join a group @@ -199,6 +200,9 @@ pub enum ServerGeneral { SiteEconomy(EconomyInfo), MapMarker(comp::MapMarkerUpdate), WeatherUpdate(WeatherGrid), + /// Suggest the client to spectate a position. Called after client has + /// requested teleport etc. + SpectatePosition(Vec3), } impl ServerGeneral { @@ -292,7 +296,7 @@ impl ServerMsg { | ServerGeneral::CharacterCreated(_) => { c_type != ClientType::ChatOnly && presence.is_none() }, - ServerGeneral::CharacterSuccess => { + ServerGeneral::CharacterSuccess | ServerGeneral::SpectatorSuccess(_) => { c_type == ClientType::Game && presence.is_none() }, //Ingame related @@ -312,7 +316,8 @@ impl ServerMsg { | ServerGeneral::FinishedTrade(_) | ServerGeneral::SiteEconomy(_) | ServerGeneral::MapMarker(_) - | ServerGeneral::WeatherUpdate(_) => { + | ServerGeneral::WeatherUpdate(_) + | ServerGeneral::SpectatePosition(_) => { c_type == ClientType::Game && presence.is_some() }, // Always possible diff --git a/common/src/event.rs b/common/src/event.rs index 46b5a15787..d540b80b5d 100644 --- a/common/src/event.rs +++ b/common/src/event.rs @@ -108,6 +108,7 @@ pub enum ServerEvent { entity: EcsEntity, character_id: CharacterId, }, + InitSpectator(EcsEntity), UpdateCharacterData { entity: EcsEntity, components: ( diff --git a/server/src/client.rs b/server/src/client.rs index e00aaca265..bd031c4681 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -171,7 +171,8 @@ impl Client { | ServerGeneral::CharacterActionError(_) | ServerGeneral::CharacterCreated(_) | ServerGeneral::CharacterEdited(_) - | ServerGeneral::CharacterSuccess => { + | ServerGeneral::CharacterSuccess + | ServerGeneral::SpectatorSuccess(_) => { PreparedMsg::new(1, &g, &self.character_screen_stream_params) }, //In-game related @@ -188,7 +189,8 @@ impl Client { | ServerGeneral::UpdatePendingTrade(_, _, _) | ServerGeneral::FinishedTrade(_) | ServerGeneral::MapMarker(_) - | ServerGeneral::WeatherUpdate(_) => { + | ServerGeneral::WeatherUpdate(_) + | ServerGeneral::SpectatePosition(_) => { PreparedMsg::new(2, &g, &self.in_game_stream_params) }, //In-game related, terrain diff --git a/server/src/cmd.rs b/server/src/cmd.rs index e5838becf6..f6dc922479 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -6,6 +6,7 @@ use crate::{ client::Client, location::Locations, login_provider::LoginProvider, + presence::Presence, settings::{ Ban, BanAction, BanInfo, EditableSetting, SettingError, WhitelistInfo, WhitelistRecord, }, @@ -49,7 +50,7 @@ use common::{ weather, Damage, DamageKind, DamageSource, Explosion, LoadoutBuilder, RadiusEffect, }; use common_net::{ - msg::{DisconnectReason, Notification, PlayerListUpdate, ServerGeneral}, + msg::{DisconnectReason, Notification, PlayerListUpdate, PresenceKind, ServerGeneral}, sync::WorldSyncExt, }; use common_state::{BuildAreaError, BuildAreas}; @@ -231,19 +232,37 @@ fn position_mut( }) .unwrap_or(entity); + let mut maybe_pos = None; + let res = server .state .ecs() .write_storage::() .get_mut(entity) - .map(f) + .map(|pos| { + let res = f(pos); + maybe_pos = Some(pos.0); + res + }) .ok_or_else(|| format!("Cannot get position for {:?}!", descriptor)); - if res.is_ok() { - let _ = server + + if let Some(pos) = maybe_pos { + if server .state .ecs() - .write_storage::() - .insert(entity, comp::ForceUpdate); + .read_storage::() + .get(entity) + .map(|presence| presence.kind == PresenceKind::Spectator) + .unwrap_or(false) + { + server.notify_client(entity, ServerGeneral::SpectatePosition(pos)); + } else { + let _ = server + .state + .ecs() + .write_storage::() + .insert(entity, comp::ForceUpdate); + } } res } diff --git a/server/src/events/entity_creation.rs b/server/src/events/entity_creation.rs index 1524d3a517..4afac192c5 100644 --- a/server/src/events/entity_creation.rs +++ b/server/src/events/entity_creation.rs @@ -33,6 +33,11 @@ pub fn handle_initialize_character( server.state.initialize_character_data(entity, character_id); } +pub fn handle_initialize_spectator(server: &mut Server, entity: EcsEntity) { + server.state.initialize_spectator_data(entity); + sys::subscription::initialize_region_subscription(server.state.ecs(), entity); +} + pub fn handle_loaded_character_data( server: &mut Server, entity: EcsEntity, diff --git a/server/src/events/mod.rs b/server/src/events/mod.rs index d8870b9c4e..62f3bf0873 100644 --- a/server/src/events/mod.rs +++ b/server/src/events/mod.rs @@ -6,7 +6,8 @@ use common::event::{EventBus, ServerEvent, ServerEventDiscriminants}; use common_base::span; use entity_creation::{ handle_beam, handle_create_npc, handle_create_ship, handle_create_waypoint, - handle_initialize_character, handle_loaded_character_data, handle_shockwave, handle_shoot, + handle_initialize_character, handle_initialize_spectator, handle_loaded_character_data, + handle_shockwave, handle_shoot, }; use entity_manipulation::{ handle_aura, handle_bonk, handle_buff, handle_change_ability, handle_combo_change, @@ -139,6 +140,7 @@ impl Server { entity, character_id, } => handle_initialize_character(self, entity, character_id), + ServerEvent::InitSpectator(entity) => handle_initialize_spectator(self, entity), ServerEvent::UpdateCharacterData { entity, components } => { let ( body, diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 8a9f47a112..265a48ad98 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -107,6 +107,8 @@ pub trait StateExt { ) -> EcsEntityBuilder; /// Insert common/default components for a new character joining the server fn initialize_character_data(&mut self, entity: EcsEntity, character_id: CharacterId); + /// Insert common/default components for a new spectator joining the server + fn initialize_spectator_data(&mut self, entity: EcsEntity); /// Update the components associated with the entity's current character. /// Performed after loading component data from the database fn update_character_data(&mut self, entity: EcsEntity, components: PersistedComponents); @@ -523,6 +525,32 @@ impl StateExt for State { } } + fn initialize_spectator_data(&mut self, entity: EcsEntity) { + let spawn_point = self.ecs().read_resource::().0; + + if self.read_component_copied::(entity).is_some() { + // NOTE: By fetching the player_uid, we validated that the entity exists, and we + // call nothing that can delete it in any of the subsequent + // commands, so we can assume that all of these calls succeed, + // justifying ignoring the result of insertion. + self.write_component_ignore_entity_dead(entity, comp::Pos(spawn_point)); + + // Make sure physics components are updated + self.write_component_ignore_entity_dead(entity, comp::ForceUpdate); + + const INITIAL_VD: u32 = 5; //will be changed after login + self.write_component_ignore_entity_dead( + entity, + Presence::new(INITIAL_VD, PresenceKind::Spectator), + ); + + // Tell the client its request was successful. + if let Some(client) = self.ecs().read_storage::().get(entity) { + client.send_fallible(ServerGeneral::SpectatorSuccess(spawn_point)); + } + } + } + fn update_character_data(&mut self, entity: EcsEntity, components: PersistedComponents) { let PersistedComponents { body, diff --git a/server/src/sys/msg/character_screen.rs b/server/src/sys/msg/character_screen.rs index 296abb3da0..7190a5a91a 100644 --- a/server/src/sys/msg/character_screen.rs +++ b/server/src/sys/msg/character_screen.rs @@ -7,7 +7,7 @@ use crate::{ EditableSettings, }; use common::{ - comp::{ChatType, Player, UnresolvedChatMsg}, + comp::{Admin, AdminRole, ChatType, Player, UnresolvedChatMsg}, event::{EventBus, ServerEvent}, uid::Uid, }; @@ -15,7 +15,7 @@ use common_ecs::{Job, Origin, Phase, System}; use common_net::msg::{ClientGeneral, ServerGeneral}; use specs::{Entities, Join, Read, ReadExpect, ReadStorage, WriteExpect}; use std::sync::atomic::Ordering; -use tracing::{debug, warn}; +use tracing::debug; impl Sys { fn handle_client_character_screen_msg( @@ -26,18 +26,43 @@ impl Sys { character_updater: &mut WriteExpect<'_, CharacterUpdater>, uids: &ReadStorage<'_, Uid>, players: &ReadStorage<'_, Player>, + admins: &ReadStorage<'_, Admin>, presences: &ReadStorage<'_, Presence>, editable_settings: &ReadExpect<'_, EditableSettings>, alias_validator: &ReadExpect<'_, AliasValidator>, msg: ClientGeneral, ) -> Result<(), crate::error::Error> { + let mut send_join_messages = || -> Result<(), crate::error::Error> { + // Give the player a welcome message + if !editable_settings.server_description.is_empty() { + client.send(ServerGeneral::server_msg( + ChatType::CommandInfo, + &*editable_settings.server_description, + ))?; + } + + if !client.login_msg_sent.load(Ordering::Relaxed) { + if let Some(player_uid) = uids.get(entity) { + server_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg { + chat_type: ChatType::Online(*player_uid), + message: "".to_string(), + })); + + client.login_msg_sent.store(true, Ordering::Relaxed); + } + } + Ok(()) + }; match msg { // Request spectator state ClientGeneral::Spectate => { - if players.contains(entity) { - warn!("Spectator mode not yet implemented on server"); + if let Some(admin) = admins.get(entity) && admin.0 >= AdminRole::Moderator { + send_join_messages()?; + + server_emitter.emit(ServerEvent::InitSpectator(entity)); + } else { - debug!("dropped Spectate msg from unregistered client") + debug!("dropped Spectate msg from unprivileged client") } }, ClientGeneral::Character(character_id) => { @@ -76,31 +101,14 @@ impl Sys { character_id, ); + send_join_messages()?; + // Start inserting non-persisted/default components for the entity // while we load the DB data server_emitter.emit(ServerEvent::InitCharacterData { entity, character_id, }); - - // Give the player a welcome message - if !editable_settings.server_description.is_empty() { - client.send(ServerGeneral::server_msg( - ChatType::CommandInfo, - &*editable_settings.server_description, - ))?; - } - - if !client.login_msg_sent.load(Ordering::Relaxed) { - if let Some(player_uid) = uids.get(entity) { - server_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg { - chat_type: ChatType::Online(*player_uid), - message: "".to_string(), - })); - - client.login_msg_sent.store(true, Ordering::Relaxed); - } - } } } else { debug!("Client is not yet registered"); @@ -199,6 +207,7 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, Uid>, ReadStorage<'a, Client>, ReadStorage<'a, Player>, + ReadStorage<'a, Admin>, ReadStorage<'a, Presence>, ReadExpect<'a, EditableSettings>, ReadExpect<'a, AliasValidator>, @@ -218,6 +227,7 @@ impl<'a> System<'a> for Sys { uids, clients, players, + admins, presences, editable_settings, alias_validator, @@ -235,6 +245,7 @@ impl<'a> System<'a> for Sys { &mut character_updater, &uids, &players, + &admins, &presences, &editable_settings, &alias_validator, diff --git a/server/src/sys/msg/in_game.rs b/server/src/sys/msg/in_game.rs index 6ceb6da12a..65f3d69e07 100644 --- a/server/src/sys/msg/in_game.rs +++ b/server/src/sys/msg/in_game.rs @@ -3,8 +3,8 @@ use crate::TerrainPersistence; use crate::{client::Client, presence::Presence, Settings}; use common::{ comp::{ - Admin, CanBuild, ControlEvent, Controller, ForceUpdate, Health, Ori, Player, Pos, SkillSet, - Vel, + Admin, AdminRole, CanBuild, ControlEvent, Controller, ForceUpdate, Health, Ori, Player, + Pos, SkillSet, Vel, }, event::{EventBus, ServerEvent}, link::Is, @@ -14,7 +14,7 @@ use common::{ vol::ReadVol, }; use common_ecs::{Job, Origin, Phase, System}; -use common_net::msg::{ClientGeneral, ServerGeneral}; +use common_net::msg::{ClientGeneral, PresenceKind, ServerGeneral}; use common_state::{BlockChange, BuildAreas}; use specs::{Entities, Join, Read, ReadExpect, ReadStorage, Write, WriteStorage}; use tracing::{debug, trace, warn}; @@ -288,6 +288,13 @@ impl Sys { ClientGeneral::UpdateMapMarker(update) => { server_emitter.emit(ServerEvent::UpdateMapMarker { entity, update }); }, + ClientGeneral::SpectatePosition(pos) => { + if let Some(admin) = maybe_admin && admin.0 >= AdminRole::Moderator && presence.kind == PresenceKind::Spectator { + if let Some(position) = positions.get_mut(entity) { + position.0 = pos; + } + } + }, ClientGeneral::RequestCharacterList | ClientGeneral::CreateCharacter { .. } | ClientGeneral::EditCharacter { .. } diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index b651e9ec8a..38ba33e1c9 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1136,7 +1136,7 @@ impl Hud { let character_id = match client.presence().unwrap() { PresenceKind::Character(id) => Some(id), - PresenceKind::Spectator => unreachable!("HUD creation in Spectator mode!"), + PresenceKind::Spectator => None, PresenceKind::Possessor => None, }; diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index 73fa288619..d0b83f2566 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -144,6 +144,18 @@ impl PlayState for CharSelectionState { Rc::clone(&self.client), ))); }, + ui::Event::Spectate => { + { + let mut c = self.client.borrow_mut(); + c.request_spectate(); + c.set_view_distance(global_state.settings.graphics.view_distance); + c.set_lod_distance(global_state.settings.graphics.lod_distance); + } + return PlayStateResult::Switch(Box::new(SessionState::new( + global_state, + Rc::clone(&self.client), + ))); + }, ui::Event::ClearCharacterListError => { self.char_selection_ui.error = None; }, diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index 049364bb78..cb05e6ed36 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -127,6 +127,7 @@ image_ids_ice! { pub enum Event { Logout, Play(CharacterId), + Spectate, AddCharacter { alias: String, mainhand: Option, @@ -152,6 +153,7 @@ enum Mode { new_character_button: button::State, logout_button: button::State, enter_world_button: button::State, + spectate_button: button::State, yes_button: button::State, no_button: button::State, }, @@ -185,6 +187,7 @@ impl Mode { new_character_button: Default::default(), logout_button: Default::default(), enter_world_button: Default::default(), + spectate_button: Default::default(), yes_button: Default::default(), no_button: Default::default(), } @@ -283,6 +286,7 @@ enum Message { Back, Logout, EnterWorld, + Spectate, Select(CharacterId), Delete(usize), Edit(usize), @@ -397,6 +401,7 @@ impl Controls { ref mut new_character_button, ref mut logout_button, ref mut enter_world_button, + ref mut spectate_button, ref mut yes_button, ref mut no_button, } => { @@ -676,36 +681,52 @@ impl Controls { .padding(15) .width(Length::Fill) .height(Length::Fill); + let mut bottom_content = vec![ + Container::new(neat_button( + logout_button, + i18n.get("char_selection.logout").into_owned(), + FILL_FRAC_ONE, + button_style, + Some(Message::Logout), + )) + .width(Length::Fill) + .height(Length::Units(SMALL_BUTTON_HEIGHT)) + .into(), + ]; - let logout = neat_button( - logout_button, - i18n.get("char_selection.logout").into_owned(), - FILL_FRAC_ONE, - button_style, - Some(Message::Logout), - ); - - let enter_world = neat_button( - enter_world_button, - i18n.get("char_selection.enter_world").into_owned(), - FILL_FRAC_TWO, - button_style, - selected.map(|_| Message::EnterWorld), - ); - - let bottom = Row::with_children(vec![ - Container::new(logout) - .width(Length::Fill) - .height(Length::Units(SMALL_BUTTON_HEIGHT)) - .into(), - Container::new(enter_world) + if client.is_moderator() { + bottom_content.push( + Container::new(neat_button( + spectate_button, + i18n.get("char_selection.spectate").into_owned(), + FILL_FRAC_TWO, + button_style, + Some(Message::Spectate), + )) .width(Length::Fill) .height(Length::Units(52)) .center_x() .into(), - Space::new(Length::Fill, Length::Shrink).into(), - ]) - .align_items(Align::End); + ); + } + + bottom_content.push( + Container::new(neat_button( + enter_world_button, + i18n.get("char_selection.enter_world").into_owned(), + FILL_FRAC_TWO, + button_style, + selected.map(|_| Message::EnterWorld), + )) + .width(Length::Fill) + .height(Length::Units(52)) + .center_x() + .into(), + ); + + bottom_content.push(Space::new(Length::Fill, Length::Shrink).into()); + + let bottom = Row::with_children(bottom_content).align_items(Align::End); let content = Column::with_children(vec![top.into(), bottom.into()]) .width(Length::Fill) @@ -1410,6 +1431,11 @@ impl Controls { events.push(Event::Play(selected)); } }, + Message::Spectate => { + if matches!(self.mode, Mode::Select { .. }) { + events.push(Event::Spectate); + } + }, Message::Select(id) => { if let Mode::Select { .. } = &mut self.mode { self.selected = Some(id); diff --git a/voxygen/src/scene/camera.rs b/voxygen/src/scene/camera.rs index c93d3474c7..c0ab43b928 100644 --- a/voxygen/src/scene/camera.rs +++ b/voxygen/src/scene/camera.rs @@ -130,11 +130,7 @@ fn clamp_and_modulate(ori: Vec3) -> Vec3 { /// e = floor(ln(near/(far - near))/ln(2)) /// db/dz = 2^(2-e) / ((1 / far - 1 / near) * (far)^2) /// ``` -/// -/// Then the maximum precision you can safely use to get a change in the -/// integer representation of the mantissa (assuming 32-bit floating points) -/// is around: -/// +///CameraMode::ThirdPerson /// ```ignore /// abs(2^(-23) / (db/dz)). /// ``` @@ -320,13 +316,18 @@ impl Camera { // Make sure aspect is valid let aspect = if aspect.is_normal() { aspect } else { 1.0 }; + let dist = match mode { + CameraMode::ThirdPerson => 10.0, + CameraMode::FirstPerson | CameraMode::Freefly => MIN_ZOOM, + }; + Self { tgt_focus: Vec3::unit_z() * 10.0, focus: Vec3::unit_z() * 10.0, tgt_ori: Vec3::zero(), ori: Vec3::zero(), - tgt_dist: 10.0, - dist: 10.0, + tgt_dist: dist, + dist, tgt_fov: 1.1, fov: 1.1, tgt_fixate: 1.0, @@ -652,6 +653,12 @@ impl Camera { /// Set the focus position of the camera. pub fn set_focus_pos(&mut self, focus: Vec3) { self.tgt_focus = focus; } + /// Set the focus position of the camera, without lerping. + pub fn force_focus_pos(&mut self, focus: Vec3) { + self.tgt_focus = focus; + self.focus = focus; + } + /// Get the aspect ratio of the camera. pub fn get_aspect_ratio(&self) -> f32 { self.aspect } @@ -695,7 +702,7 @@ impl Camera { self.set_distance(MIN_ZOOM); }, CameraMode::Freefly => { - self.zoom_by(0.0, None); + self.set_distance(MIN_ZOOM); }, } } @@ -714,18 +721,22 @@ impl Camera { /// Cycle the camera to its next valid mode. If is_admin is false then only /// modes which are accessible without admin access will be cycled to. - pub fn next_mode(&mut self, is_admin: bool) { - self.set_mode(match self.mode { - CameraMode::ThirdPerson => CameraMode::FirstPerson, - CameraMode::FirstPerson => { - if is_admin { - CameraMode::Freefly - } else { - CameraMode::ThirdPerson - } - }, - CameraMode::Freefly => CameraMode::ThirdPerson, - }); + pub fn next_mode(&mut self, is_admin: bool, is_spectator: bool) { + if is_spectator && is_admin { + self.set_mode(CameraMode::Freefly); + } else { + self.set_mode(match self.mode { + CameraMode::ThirdPerson => CameraMode::FirstPerson, + CameraMode::FirstPerson => { + if is_admin { + CameraMode::Freefly + } else { + CameraMode::ThirdPerson + } + }, + CameraMode::Freefly => CameraMode::ThirdPerson, + }); + } } /// Return a unit vector in the forward direction for the current camera diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 78ae2622cb..7ea99c2930 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -37,6 +37,7 @@ use common::{ vol::ReadVol, }; use common_base::{prof_span, span}; +use common_net::msg::PresenceKind; use common_state::State; use comp::item::Reagent; use hashbrown::HashMap; @@ -299,10 +300,15 @@ impl Scene { let terrain = Terrain::new(renderer, &data, lod.get_data(), sprite_render_context); + let camera_mode = match client.presence() { + Some(PresenceKind::Spectator) => CameraMode::Freefly, + _ => CameraMode::ThirdPerson, + }; + Self { data, globals_bind_group, - camera: Camera::new(resolution.x / resolution.y, CameraMode::ThirdPerson), + camera: Camera::new(resolution.x / resolution.y, camera_mode), camera_input_state: Vec2::zero(), event_lights: Vec::new(), diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 2ada0a5b28..f5839e4748 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -358,6 +358,9 @@ impl SessionState { client::Event::MapMarker(event) => { self.hud.show.update_map_markers(event); }, + client::Event::SpectatePosition(pos) => { + self.scene.camera_mut().force_focus_pos(pos); + }, } } @@ -386,14 +389,13 @@ impl PlayState for SessionState { fn tick(&mut self, global_state: &mut GlobalState, events: Vec) -> PlayStateResult { span!(_guard, "tick", "::tick"); // TODO: let mut client = self.client.borrow_mut(); - // TODO: can this be a method on the session or are there borrowcheck issues? let (client_presence, client_registered) = { let client = self.client.borrow(); (client.presence(), client.registered()) }; - if client_presence.is_some() { + if let Some(presence) = client_presence { let camera = self.scene.camera_mut(); // Clamp camera's vertical angle if the toggle is enabled @@ -425,7 +427,7 @@ impl PlayState for SessionState { } // Compute camera data - camera.compute_dependents(&*self.client.borrow().state().terrain()); + camera.compute_dependents(&*client.state().terrain()); let camera::Dependents { cam_pos, cam_dir, .. } = self.scene.camera().dependents(); @@ -480,6 +482,10 @@ impl PlayState for SessionState { drop(client); + if presence == PresenceKind::Spectator { + self.client.borrow_mut().spectate_position(cam_pos); + } + // Nearest block to consider with GameInput primary or secondary key. let nearest_block_dist = find_shortest_distance(&[ mine_target.filter(|_| is_mining).map(|t| t.distance), @@ -887,7 +893,14 @@ impl PlayState for SessionState { // The server should do its own filtering of which entities are sent // to clients to prevent abuse. let camera = self.scene.camera_mut(); - camera.next_mode(self.client.borrow().is_moderator()); + let client = self.client.borrow(); + camera.next_mode( + client.is_moderator(), + client + .presence() + .map(|presence| presence == PresenceKind::Spectator) + .unwrap_or(false), + ); }, GameInput::Select => { if !state { From bf44ebd12b76f4cc337c21cd44a3e233a8fd4c94 Mon Sep 17 00:00:00 2001 From: IsseW Date: Tue, 5 Jul 2022 17:23:37 +0200 Subject: [PATCH 044/854] spectate speedup key --- assets/voxygen/i18n/en/gameinput.ftl | 3 ++- voxygen/src/game_input.rs | 2 ++ voxygen/src/session/mod.rs | 9 ++++++++- voxygen/src/settings/control.rs | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/i18n/en/gameinput.ftl b/assets/voxygen/i18n/en/gameinput.ftl index 65cffbdea7..d5d33853e3 100644 --- a/assets/voxygen/i18n/en/gameinput.ftl +++ b/assets/voxygen/i18n/en/gameinput.ftl @@ -63,4 +63,5 @@ gameinput-swimup = Swim upwards gameinput-mapzoomin = Increase map zoom gameinput-mapzoomout = Decrease map zoom gameinput-greet = Greet -gameinput-map-locationmarkerbutton = Set a waypoint in the Map \ No newline at end of file +gameinput-map-locationmarkerbutton = Set a waypoint in the Map +gameinput-spectatespeedboost = Spectate speed boost \ No newline at end of file diff --git a/voxygen/src/game_input.rs b/voxygen/src/game_input.rs index 65638f6c30..1b6e808a55 100644 --- a/voxygen/src/game_input.rs +++ b/voxygen/src/game_input.rs @@ -148,6 +148,8 @@ pub enum GameInput { MapZoomOut, #[strum(serialize = "gameinput.map.locationmarkerbutton")] MapSetMarker, + #[strum(serialize = "gameinput.spectatespeedboost")] + SpectateSpeedBoost, } impl GameInput { diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index f5839e4748..229ddb2fb8 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -1046,6 +1046,7 @@ impl PlayState for SessionState { const FREEFLY_ACCEL: f32 = 120.0; const FREEFLY_DAMPING: f32 = 80.0; const FREEFLY_MAX_SPEED: f32 = 50.0; + const FREEFLY_SPEED_BOOST: f32 = 5.0; let forward = self.scene.camera().forward(); let right = self.scene.camera().right(); @@ -1067,10 +1068,16 @@ impl PlayState for SessionState { } } + let boost = if self.inputs_state.contains(&GameInput::SpectateSpeedBoost) { + FREEFLY_SPEED_BOOST + } else { + 1.0 + }; + let pos = self.scene.camera().get_focus_pos(); self.scene .camera_mut() - .set_focus_pos(pos + self.freefly_vel * dt); + .set_focus_pos(pos + self.freefly_vel * dt * boost); // Do not apply any movement to the player character self.inputs.move_dir = Vec2::zero(); diff --git a/voxygen/src/settings/control.rs b/voxygen/src/settings/control.rs index f7a18230c9..344a0c4c22 100644 --- a/voxygen/src/settings/control.rs +++ b/voxygen/src/settings/control.rs @@ -189,6 +189,7 @@ impl ControlSettings { GameInput::MapZoomIn => KeyMouse::Key(VirtualKeyCode::Plus), GameInput::MapZoomOut => KeyMouse::Key(VirtualKeyCode::Minus), GameInput::MapSetMarker => KeyMouse::Mouse(MouseButton::Middle), + GameInput::SpectateSpeedBoost => KeyMouse::Key(VirtualKeyCode::LControl), } } } From a165bc09bce1cdbbd2c2881924c728c456ec361c Mon Sep 17 00:00:00 2001 From: IsseW Date: Wed, 6 Jul 2022 11:20:18 +0200 Subject: [PATCH 045/854] character viewpoint --- assets/voxygen/i18n/en/gameinput.ftl | 3 +- voxygen/src/game_input.rs | 2 + voxygen/src/hud/bag.rs | 10 +- voxygen/src/hud/buttons.rs | 7 +- voxygen/src/hud/crafting.rs | 6 +- voxygen/src/hud/hotbar.rs | 10 +- voxygen/src/hud/loot_scroller.rs | 6 +- voxygen/src/hud/mod.rs | 125 ++++++------- voxygen/src/hud/skillbar.rs | 8 +- voxygen/src/hud/trade.rs | 6 +- voxygen/src/scene/camera.rs | 16 +- voxygen/src/scene/figure/mod.rs | 84 ++++----- voxygen/src/scene/mod.rs | 156 +++++++++------- voxygen/src/scene/particle.rs | 2 +- voxygen/src/session/mod.rs | 235 +++++++++++++++---------- voxygen/src/settings/control.rs | 1 + voxygen/src/ui/graphic/mod.rs | 1 - voxygen/src/ui/widgets/item_tooltip.rs | 7 +- 18 files changed, 398 insertions(+), 287 deletions(-) diff --git a/assets/voxygen/i18n/en/gameinput.ftl b/assets/voxygen/i18n/en/gameinput.ftl index d5d33853e3..0328cf93a0 100644 --- a/assets/voxygen/i18n/en/gameinput.ftl +++ b/assets/voxygen/i18n/en/gameinput.ftl @@ -64,4 +64,5 @@ gameinput-mapzoomin = Increase map zoom gameinput-mapzoomout = Decrease map zoom gameinput-greet = Greet gameinput-map-locationmarkerbutton = Set a waypoint in the Map -gameinput-spectatespeedboost = Spectate speed boost \ No newline at end of file +gameinput-spectatespeedboost = Spectate speed boost +gameinput-spectateviewpoint = Spectate viewpoint \ No newline at end of file diff --git a/voxygen/src/game_input.rs b/voxygen/src/game_input.rs index 1b6e808a55..3d418bad52 100644 --- a/voxygen/src/game_input.rs +++ b/voxygen/src/game_input.rs @@ -150,6 +150,8 @@ pub enum GameInput { MapSetMarker, #[strum(serialize = "gameinput.spectatespeedboost")] SpectateSpeedBoost, + #[strum(serialize = "gameinput.spectateviewpoint")] + SpectateViewpoint, } impl GameInput { diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index 1eef107e70..14fb7d12c0 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -3,7 +3,7 @@ use super::{ img_ids::{Imgs, ImgsRot}, item_imgs::ItemImgs, slots::{ArmorSlot, EquipSlot, InventorySlot, SlotManager}, - Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, + HudInfo, Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, }; use crate::{ game_input::GameInput, @@ -563,6 +563,7 @@ widget_ids! { #[derive(WidgetCommon)] pub struct Bag<'a> { client: &'a Client, + info: &'a HudInfo, global_state: &'a GlobalState, imgs: &'a Imgs, item_imgs: &'a ItemImgs, @@ -589,6 +590,7 @@ impl<'a> Bag<'a> { #[allow(clippy::too_many_arguments)] pub fn new( client: &'a Client, + info: &'a HudInfo, global_state: &'a GlobalState, imgs: &'a Imgs, item_imgs: &'a ItemImgs, @@ -610,6 +612,7 @@ impl<'a> Bag<'a> { ) -> Self { Self { client, + info, global_state, imgs, item_imgs, @@ -695,7 +698,7 @@ impl<'a> Widget for Bag<'a> { .font_id(self.fonts.cyri.conrod_id) .desc_text_color(TEXT_COLOR); let inventories = self.client.inventories(); - let inventory = match inventories.get(self.client.entity()) { + let inventory = match inventories.get(self.info.viewpoint_entity) { Some(l) => l, None => return None, }; @@ -733,6 +736,7 @@ impl<'a> Widget for Bag<'a> { ) }, self.client, + self.info, self.imgs, self.item_imgs, self.pulse, @@ -759,7 +763,7 @@ impl<'a> Widget for Bag<'a> { true, &item_tooltip, self.stats.name.to_string(), - self.client.entity(), + self.info.viewpoint_entity, true, inventory, &state.bg_ids, diff --git a/voxygen/src/hud/buttons.rs b/voxygen/src/hud/buttons.rs index a92d5cc406..2e14c09ba0 100644 --- a/voxygen/src/hud/buttons.rs +++ b/voxygen/src/hud/buttons.rs @@ -1,6 +1,6 @@ use super::{ img_ids::{Imgs, ImgsRot}, - BLACK, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_LEGENDARY, TEXT_COLOR, + HudInfo, BLACK, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_LEGENDARY, TEXT_COLOR, }; use crate::{ game_input::GameInput, @@ -51,6 +51,7 @@ widget_ids! { #[derive(WidgetCommon)] pub struct Buttons<'a> { client: &'a Client, + info: &'a HudInfo, show_bag: bool, imgs: &'a Imgs, fonts: &'a Fonts, @@ -68,6 +69,7 @@ pub struct Buttons<'a> { impl<'a> Buttons<'a> { pub fn new( client: &'a Client, + info: &'a HudInfo, show_bag: bool, imgs: &'a Imgs, fonts: &'a Fonts, @@ -81,6 +83,7 @@ impl<'a> Buttons<'a> { ) -> Self { Self { client, + info, show_bag, imgs, fonts, @@ -192,7 +195,7 @@ impl<'a> Widget for Buttons<'a> { ); } let invs = self.client.inventories(); - let inventory = match invs.get(self.client.entity()) { + let inventory = match invs.get(self.info.viewpoint_entity) { Some(inv) => inv, None => return None, }; diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 3fc5fb9fab..9de2389392 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -3,7 +3,7 @@ use super::{ img_ids::{Imgs, ImgsRot}, item_imgs::{animate_by_pulse, ItemImgs}, slots::{CraftSlot, CraftSlotInfo, SlotManager}, - Show, TEXT_COLOR, TEXT_DULL_RED_COLOR, TEXT_GRAY_COLOR, UI_HIGHLIGHT_0, UI_MAIN, + HudInfo, Show, TEXT_COLOR, TEXT_DULL_RED_COLOR, TEXT_GRAY_COLOR, UI_HIGHLIGHT_0, UI_MAIN, }; use crate::ui::{ fonts::Fonts, @@ -137,6 +137,7 @@ impl Default for CraftingShow { #[derive(WidgetCommon)] pub struct Crafting<'a> { client: &'a Client, + info: &'a HudInfo, imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, @@ -156,6 +157,7 @@ pub struct Crafting<'a> { impl<'a> Crafting<'a> { pub fn new( client: &'a Client, + info: &'a HudInfo, imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, @@ -171,6 +173,7 @@ impl<'a> Crafting<'a> { ) -> Self { Self { client, + info, imgs, fonts, localized_strings, @@ -321,6 +324,7 @@ impl<'a> Widget for Crafting<'a> { ) }, self.client, + self.info, self.imgs, self.item_imgs, self.pulse, diff --git a/voxygen/src/hud/hotbar.rs b/voxygen/src/hud/hotbar.rs index 14f36db0df..c59e0c8f5c 100644 --- a/voxygen/src/hud/hotbar.rs +++ b/voxygen/src/hud/hotbar.rs @@ -4,6 +4,8 @@ use common::comp::{ }; use serde::{Deserialize, Serialize}; +use super::HudInfo; + #[derive(Clone, Copy, Debug, PartialEq)] pub enum Slot { One = 0, @@ -63,22 +65,22 @@ impl State { // TODO: remove pending UI // Adds ability slots if missing and should be present // Removes ability slots if not there and shouldn't be present - pub fn maintain_abilities(&mut self, client: &client::Client) { + pub fn maintain_abilities(&mut self, client: &client::Client, info: &HudInfo) { use specs::WorldExt; if let Some(active_abilities) = client .state() .ecs() .read_storage::() - .get(client.entity()) + .get(info.viewpoint_entity) { use common::comp::ability::AuxiliaryAbility; for ((i, ability), hotbar_slot) in active_abilities .auxiliary_set( - client.inventories().get(client.entity()), + client.inventories().get(info.viewpoint_entity), client .state() .read_storage::() - .get(client.entity()), + .get(info.viewpoint_entity), ) .iter() .enumerate() diff --git a/voxygen/src/hud/loot_scroller.rs b/voxygen/src/hud/loot_scroller.rs index 5ae39a6eea..87143869ca 100644 --- a/voxygen/src/hud/loot_scroller.rs +++ b/voxygen/src/hud/loot_scroller.rs @@ -2,7 +2,7 @@ use super::{ animate_by_pulse, get_quality_col, img_ids::{Imgs, ImgsRot}, item_imgs::ItemImgs, - Show, Windows, TEXT_COLOR, + HudInfo, Show, Windows, TEXT_COLOR, }; use crate::ui::{fonts::Fonts, ImageFrame, ItemTooltip, ItemTooltipManager, ItemTooltipable}; use client::Client; @@ -51,6 +51,7 @@ pub struct LootScroller<'a> { new_messages: &'a mut VecDeque, client: &'a Client, + info: &'a HudInfo, show: &'a Show, imgs: &'a Imgs, item_imgs: &'a ItemImgs, @@ -68,6 +69,7 @@ impl<'a> LootScroller<'a> { pub fn new( new_messages: &'a mut VecDeque, client: &'a Client, + info: &'a HudInfo, show: &'a Show, imgs: &'a Imgs, item_imgs: &'a ItemImgs, @@ -81,6 +83,7 @@ impl<'a> LootScroller<'a> { Self { new_messages, client, + info, show, imgs, item_imgs, @@ -143,6 +146,7 @@ impl<'a> Widget for LootScroller<'a> { ) }, self.client, + self.info, self.imgs, self.item_imgs, self.pulse, diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 38ba33e1c9..1f4520b767 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -501,6 +501,8 @@ pub struct DebugInfo { pub struct HudInfo { pub is_aiming: bool, pub is_first_person: bool, + pub viewpoint_entity: specs::Entity, + pub mutable_viewpoint: bool, pub target_entity: Option, pub selected_entity: Option<(specs::Entity, Instant)>, } @@ -1278,7 +1280,7 @@ impl Hud { let players = ecs.read_storage::(); let msm = ecs.read_resource::(); let entities = ecs.entities(); - let me = client.entity(); + let me = info.viewpoint_entity; let poises = ecs.read_storage::(); let alignments = ecs.read_storage::(); let is_mount = ecs.read_storage::>(); @@ -2585,7 +2587,7 @@ impl Hud { // Bag button and nearby icons let ecs = client.state().ecs(); - let entity = client.entity(); + let entity = info.viewpoint_entity; let stats = ecs.read_storage::(); let skill_sets = ecs.read_storage::(); let buffs = ecs.read_storage::(); @@ -2593,6 +2595,7 @@ impl Hud { if let (Some(player_stats), Some(skill_set)) = (stats.get(entity), skill_sets.get(entity)) { match Buttons::new( client, + &info, self.show.bag, &self.imgs, &self.fonts, @@ -2705,14 +2708,12 @@ impl Hud { // Skillbar // Get player stats let ecs = client.state().ecs(); - let entity = client.entity(); + let entity = info.viewpoint_entity; let healths = ecs.read_storage::(); let inventories = ecs.read_storage::(); let energies = ecs.read_storage::(); let skillsets = ecs.read_storage::(); let active_abilities = ecs.read_storage::(); - let character_states = ecs.read_storage::(); - let controllers = ecs.read_storage::(); let bodies = ecs.read_storage::(); let poises = ecs.read_storage::(); // Combo floater stuffs @@ -2722,25 +2723,16 @@ impl Hud { }); self.floaters.combo_floater = self.floaters.combo_floater.filter(|f| f.timer > 0_f64); - if let ( - Some(health), - Some(inventory), - Some(energy), - Some(skillset), - Some(body), - Some(_character_state), - Some(_controller), - ) = ( + if let (Some(health), Some(inventory), Some(energy), Some(skillset), Some(body)) = ( healths.get(entity), inventories.get(entity), energies.get(entity), skillsets.get(entity), bodies.get(entity), - character_states.get(entity), - controllers.get(entity).map(|c| &c.inputs), ) { Skillbar::new( client, + &info, global_state, &self.imgs, &self.item_imgs, @@ -2775,8 +2767,8 @@ impl Hud { Some(body), Some(poise), ) = ( - stats.get(client.entity()), - skill_sets.get(client.entity()), + stats.get(info.viewpoint_entity), + skill_sets.get(info.viewpoint_entity), healths.get(entity), energies.get(entity), bodies.get(entity), @@ -2784,6 +2776,7 @@ impl Hud { ) { match Bag::new( client, + &info, global_state, &self.imgs, &self.item_imgs, @@ -2828,6 +2821,7 @@ impl Hud { if self.show.trade { if let Some(action) = Trade::new( client, + &info, &self.imgs, &self.item_imgs, &self.fonts, @@ -2871,14 +2865,10 @@ impl Hud { } // Buffs - let ecs = client.state().ecs(); - let entity = client.entity(); - let health = ecs.read_storage::(); - let energy = ecs.read_storage::(); if let (Some(player_buffs), Some(health), Some(energy)) = ( - buffs.get(client.entity()), - health.get(entity), - energy.get(entity), + buffs.get(info.viewpoint_entity), + healths.get(entity), + energies.get(entity), ) { for event in BuffsBar::new( &self.imgs, @@ -2905,6 +2895,7 @@ impl Hud { for event in Crafting::new( //&self.show, client, + &info, &self.imgs, &self.fonts, &*i18n, @@ -3038,6 +3029,7 @@ impl Hud { LootScroller::new( &mut self.new_loot_messages, client, + &info, &self.show, &self.imgs, &self.item_imgs, @@ -3107,49 +3099,45 @@ impl Hud { if self.show.social { let ecs = client.state().ecs(); let _stats = ecs.read_storage::(); - let me = client.entity(); - if let Some(_stats) = stats.get(me) { - for event in Social::new( - &self.show, - client, - &self.imgs, - &self.fonts, - i18n, - info.selected_entity, - &self.rot_imgs, - tooltip_manager, - ) - .set(self.ids.social_window, ui_widgets) - { - match event { - social::Event::Close => { - self.show.social(false); - if !self.show.bag { - self.show.want_grab = true; - self.force_ungrab = false; - } else { - self.force_ungrab = true - }; - }, - social::Event::Focus(widget_id) => { - self.to_focus = Some(Some(widget_id)); - }, - social::Event::Invite(uid) => events.push(Event::InviteMember(uid)), - social::Event::SearchPlayers(search_key) => { - self.show.search_social_players(search_key) - }, - } + for event in Social::new( + &self.show, + client, + &self.imgs, + &self.fonts, + i18n, + info.selected_entity, + &self.rot_imgs, + tooltip_manager, + ) + .set(self.ids.social_window, ui_widgets) + { + match event { + social::Event::Close => { + self.show.social(false); + if !self.show.bag { + self.show.want_grab = true; + self.force_ungrab = false; + } else { + self.force_ungrab = true + }; + }, + social::Event::Focus(widget_id) => { + self.to_focus = Some(Some(widget_id)); + }, + social::Event::Invite(uid) => events.push(Event::InviteMember(uid)), + social::Event::SearchPlayers(search_key) => { + self.show.search_social_players(search_key) + }, } } } // Diary if self.show.diary { - let entity = client.entity(); + let entity = info.viewpoint_entity; let skill_sets = ecs.read_storage::(); if let ( Some(skill_set), - Some(active_abilities), Some(inventory), Some(health), Some(energy), @@ -3157,7 +3145,6 @@ impl Hud { Some(poise), ) = ( skill_sets.get(entity), - active_abilities.get(entity), inventories.get(entity), healths.get(entity), energies.get(entity), @@ -3169,7 +3156,7 @@ impl Hud { client, global_state, skill_set, - active_abilities, + active_abilities.get(entity).unwrap_or(&Default::default()), inventory, health, energy, @@ -3386,7 +3373,7 @@ impl Hud { ) = (a, b) { if let Some(item) = inventories - .get(client.entity()) + .get(info.viewpoint_entity) .and_then(|inv| inv.get(slot)) { self.hotbar.add_inventory_link(h, item); @@ -3423,7 +3410,7 @@ impl Hud { events.push(Event::ChangeAbility(index, ability)); }, (AbilitySlot::Slot(a), AbilitySlot::Slot(b)) => { - let me = client.entity(); + let me = info.viewpoint_entity; if let Some(active_abilities) = active_abilities.get(me) { let ability_a = active_abilities .auxiliary_set(inventories.get(me), skill_sets.get(me)) @@ -3447,7 +3434,7 @@ impl Hud { } else if let (Inventory(i), Crafting(c)) = (a, b) { // Add item to crafting input if inventories - .get(client.entity()) + .get(info.viewpoint_entity) .and_then(|inv| inv.get(i.slot)) .map_or(false, |item| { (c.requirement)(item, client.component_recipe_book(), c.info) @@ -3508,7 +3495,7 @@ impl Hud { }); } else if let (Inventory(i), Hotbar(h)) = (a, b) { if let Some(item) = inventories - .get(client.entity()) + .get(info.viewpoint_entity) .and_then(|inv| inv.get(i.slot)) { self.hotbar.add_inventory_link(h, item); @@ -3545,7 +3532,7 @@ impl Hud { events.push(Event::ChangeAbility(index, ability)); }, (AbilitySlot::Slot(a), AbilitySlot::Slot(b)) => { - let me = client.entity(); + let me = info.viewpoint_entity; if let Some(active_abilities) = active_abilities.get(me) { let ability_a = active_abilities .auxiliary_set(inventories.get(me), skill_sets.get(me)) @@ -3592,7 +3579,7 @@ impl Hud { // Used from hotbar self.hotbar.get(h).map(|s| match s { hotbar::SlotContents::Inventory(i, _) => { - if let Some(inv) = inventories.get(client.entity()) { + if let Some(inv) = inventories.get(info.viewpoint_entity) { // If the item in the inactive main hand is the same as the item // pressed in the hotbar, then swap active and inactive hands // instead of looking for @@ -3643,7 +3630,7 @@ impl Hud { }; } let who = match ecs - .uid_from_entity(client.entity()) + .uid_from_entity(info.viewpoint_entity) .and_then(|uid| trade.which_party(uid)) { Some(who) => who, @@ -3752,7 +3739,7 @@ impl Hud { }, } } - self.hotbar.maintain_abilities(client); + self.hotbar.maintain_abilities(client, &info); // Temporary Example Quest let arrow_ani = (self.pulse * 4.0/* speed factor */).cos() * 0.5 + 0.8; //Animation timer diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index 53b9a6f43d..b71577d4dd 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -2,8 +2,8 @@ use super::{ hotbar, img_ids::{Imgs, ImgsRot}, item_imgs::ItemImgs, - slots, util, BarNumbers, ShortcutNumbers, BLACK, CRITICAL_HP_COLOR, HP_COLOR, LOW_HP_COLOR, - QUALITY_EPIC, STAMINA_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, + slots, util, BarNumbers, HudInfo, ShortcutNumbers, BLACK, CRITICAL_HP_COLOR, HP_COLOR, + LOW_HP_COLOR, QUALITY_EPIC, STAMINA_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, }; use crate::{ game_input::GameInput, @@ -242,6 +242,7 @@ fn slot_entries(state: &State, slot_offset: f64) -> [SlotEntry; 10] { #[derive(WidgetCommon)] pub struct Skillbar<'a> { client: &'a Client, + info: &'a HudInfo, global_state: &'a GlobalState, imgs: &'a Imgs, item_imgs: &'a ItemImgs, @@ -271,6 +272,7 @@ impl<'a> Skillbar<'a> { #[allow(clippy::too_many_arguments)] pub fn new( client: &'a Client, + info: &'a HudInfo, global_state: &'a GlobalState, imgs: &'a Imgs, item_imgs: &'a ItemImgs, @@ -295,6 +297,7 @@ impl<'a> Skillbar<'a> { ) -> Self { Self { client, + info, global_state, imgs, item_imgs, @@ -576,6 +579,7 @@ impl<'a> Skillbar<'a> { ) }, self.client, + self.info, self.imgs, self.item_imgs, self.pulse, diff --git a/voxygen/src/hud/trade.rs b/voxygen/src/hud/trade.rs index 39ed389338..6a3b299e8b 100644 --- a/voxygen/src/hud/trade.rs +++ b/voxygen/src/hud/trade.rs @@ -31,7 +31,7 @@ use super::{ img_ids::{Imgs, ImgsRot}, item_imgs::ItemImgs, slots::{SlotKind, SlotManager, TradeSlot}, - Hud, Show, TradeAmountInput, TEXT_COLOR, TEXT_GRAY_COLOR, UI_HIGHLIGHT_0, UI_MAIN, + Hud, HudInfo, Show, TradeAmountInput, TEXT_COLOR, TEXT_GRAY_COLOR, UI_HIGHLIGHT_0, UI_MAIN, }; use std::borrow::Cow; @@ -75,6 +75,7 @@ widget_ids! { #[derive(WidgetCommon)] pub struct Trade<'a> { client: &'a Client, + info: &'a HudInfo, imgs: &'a Imgs, item_imgs: &'a ItemImgs, fonts: &'a Fonts, @@ -92,6 +93,7 @@ pub struct Trade<'a> { impl<'a> Trade<'a> { pub fn new( client: &'a Client, + info: &'a HudInfo, imgs: &'a Imgs, item_imgs: &'a ItemImgs, fonts: &'a Fonts, @@ -105,6 +107,7 @@ impl<'a> Trade<'a> { ) -> Self { Self { client, + info, imgs, item_imgs, fonts, @@ -313,6 +316,7 @@ impl<'a> Trade<'a> { ) }, self.client, + self.info, self.imgs, self.item_imgs, self.pulse, diff --git a/voxygen/src/scene/camera.rs b/voxygen/src/scene/camera.rs index c0ab43b928..26ed0a74a7 100644 --- a/voxygen/src/scene/camera.rs +++ b/voxygen/src/scene/camera.rs @@ -16,7 +16,7 @@ const CLIPPING_MODE_DISTANCE: f32 = 20.0; pub const MIN_ZOOM: f32 = 0.1; // Possible TODO: Add more modes -#[derive(PartialEq, Clone, Copy, Eq, Hash)] +#[derive(PartialEq, Debug, Clone, Copy, Eq, Hash)] pub enum CameraMode { FirstPerson = 0, ThirdPerson = 1, @@ -130,7 +130,11 @@ fn clamp_and_modulate(ori: Vec3) -> Vec3 { /// e = floor(ln(near/(far - near))/ln(2)) /// db/dz = 2^(2-e) / ((1 / far - 1 / near) * (far)^2) /// ``` -///CameraMode::ThirdPerson +/// +/// Then the maximum precision you can safely use to get a change in the +/// integer representation of the mantissa (assuming 32-bit floating points) +/// is around: +/// /// ```ignore /// abs(2^(-23) / (db/dz)). /// ``` @@ -721,10 +725,8 @@ impl Camera { /// Cycle the camera to its next valid mode. If is_admin is false then only /// modes which are accessible without admin access will be cycled to. - pub fn next_mode(&mut self, is_admin: bool, is_spectator: bool) { - if is_spectator && is_admin { - self.set_mode(CameraMode::Freefly); - } else { + pub fn next_mode(&mut self, is_admin: bool, has_target: bool) { + if has_target { self.set_mode(match self.mode { CameraMode::ThirdPerson => CameraMode::FirstPerson, CameraMode::FirstPerson => { @@ -736,6 +738,8 @@ impl Camera { }, CameraMode::Freefly => CameraMode::ThirdPerson, }); + } else { + self.set_mode(CameraMode::Freefly); } } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index da39d7d68d..4047e8a142 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -707,7 +707,7 @@ impl FigureMgr { // Get player position. let player_pos = ecs .read_storage::() - .get(scene_data.player_entity) + .get(scene_data.viewpoint_entity) .map_or(anim::vek::Vec3::zero(), |pos| anim::vek::Vec3::from(pos.0)); let visible_aabb = anim::vek::Aabb { min: player_pos - 2.0, @@ -716,7 +716,7 @@ impl FigureMgr { let camera_mode = camera.get_mode(); let character_state_storage = state.read_storage::(); let slow_jobs = state.slow_job_pool(); - let character_state = character_state_storage.get(scene_data.player_entity); + let character_state = character_state_storage.get(scene_data.viewpoint_entity); let focus_pos = anim::vek::Vec3::::from(camera.get_focus_pos()); @@ -771,13 +771,13 @@ impl FigureMgr { let rel_vel = anim::vek::Vec3::::from(vel.0 - physics.ground_vel); let look_dir = controller.map(|c| c.inputs.look_dir).unwrap_or_default(); - let is_player = scene_data.player_entity == entity; - let player_camera_mode = if is_player { + let is_viewpoint = scene_data.viewpoint_entity == entity; + let viewpoint_camera_mode = if is_viewpoint { camera_mode } else { CameraMode::default() }; - let player_character_state = if is_player { character_state } else { None }; + let viewpoint_character_state = if is_viewpoint { character_state } else { None }; let (pos, ori) = interpolated .map(|i| { @@ -941,7 +941,7 @@ impl FigureMgr { dt, _lpindex: lpindex, _visible: in_frustum, - is_player, + is_player: is_viewpoint, _camera: camera, terrain, ground_vel: physics.ground_vel, @@ -956,8 +956,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -1856,8 +1856,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -2056,8 +2056,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -2373,8 +2373,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -2730,8 +2730,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -2834,8 +2834,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -2917,8 +2917,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -3444,8 +3444,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -3531,8 +3531,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -3710,8 +3710,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -4002,8 +4002,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -4325,8 +4325,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -4408,8 +4408,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -5030,8 +5030,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -5271,8 +5271,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -5393,8 +5393,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, item_key, ); @@ -5453,8 +5453,8 @@ impl FigureMgr { inventory, Arc::clone(vol), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ); @@ -5484,8 +5484,8 @@ impl FigureMgr { inventory, (), tick, - player_camera_mode, - player_character_state, + viewpoint_camera_mode, + viewpoint_character_state, &slow_jobs, None, ) diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 7ea99c2930..ecfe524e3e 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -116,7 +116,8 @@ pub struct Scene { pub struct SceneData<'a> { pub client: &'a Client, pub state: &'a State, - pub player_entity: specs::Entity, + pub viewpoint_entity: specs::Entity, + pub mutable_viewpoint: bool, pub target_entity: Option, pub loaded_distance: f32, pub view_distance: u32, @@ -502,71 +503,104 @@ impl Scene { let dt = ecs.fetch::().0; - let player_pos = ecs - .read_storage::() - .get(scene_data.player_entity) - .map_or(Vec3::zero(), |pos| pos.0); + let positions = ecs.read_storage::(); - let player_rolling = ecs - .read_storage::() - .get(scene_data.player_entity) - .map_or(false, |cs| cs.is_dodge()); + let viewpoint_pos = if let Some(viewpoint_pos) = + positions.get(scene_data.viewpoint_entity).map(|pos| pos.0) + { + let viewpoint_ori = ecs + .read_storage::() + .get(scene_data.viewpoint_entity) + .map_or(Quaternion::identity(), |ori| ori.to_quat()); - let is_running = ecs - .read_storage::() - .get(scene_data.player_entity) - .map(|v| v.0.magnitude_squared() > RUNNING_THRESHOLD.powi(2)) - .unwrap_or(false); + let viewpoint_rolling = ecs + .read_storage::() + .get(scene_data.viewpoint_entity) + .map_or(false, |cs| cs.is_dodge()); - let on_ground = ecs - .read_storage::() - .get(scene_data.player_entity) - .map(|p| p.on_ground.is_some()); + let is_running = ecs + .read_storage::() + .get(scene_data.viewpoint_entity) + .map(|v| v.0.magnitude_squared() > RUNNING_THRESHOLD.powi(2)) + .unwrap_or(false); - let (player_height, player_eye_height) = scene_data - .state - .ecs() - .read_storage::() - .get(scene_data.player_entity) - .map_or((1.0, 0.0), |b| (b.height(), b.eye_height())); + let on_ground = ecs + .read_storage::() + .get(scene_data.viewpoint_entity) + .map(|p| p.on_ground.is_some()); - // Add the analog input to camera - self.camera - .rotate_by(Vec3::from([self.camera_input_state.x, 0.0, 0.0])); - self.camera - .rotate_by(Vec3::from([0.0, self.camera_input_state.y, 0.0])); + let (viewpoint_height, viewpoint_eye_height) = scene_data + .state + .ecs() + .read_storage::() + .get(scene_data.viewpoint_entity) + .map_or((1.0, 0.0), |b| (b.height(), b.eye_height())); - // Alter camera position to match player. - let tilt = self.camera.get_orientation().y; - let dist = self.camera.get_distance(); + if scene_data.mutable_viewpoint || matches!(self.camera.get_mode(), CameraMode::Freefly) + { + // Add the analog input to camera if it's a mutable viewpoint + self.camera + .rotate_by(Vec3::from([self.camera_input_state.x, 0.0, 0.0])); + self.camera + .rotate_by(Vec3::from([0.0, self.camera_input_state.y, 0.0])); + } else { + // Otherwise set the cameras rotation to the viewpoints + let q = viewpoint_ori; + let sinr_cosp = 2.0 * (q.w * q.x + q.y * q.z); + let cosr_cosp = 1.0 - 2.0 * (q.x * q.x + q.y * q.y); + let roll = sinr_cosp.atan2(cosr_cosp); - let up = match self.camera.get_mode() { - CameraMode::FirstPerson => { - if player_rolling { - player_height * 0.42 - } else if is_running && on_ground.unwrap_or(false) { - player_eye_height + (scene_data.state.get_time() as f32 * 17.0).sin() * 0.05 + let sinp = 2.0 * (q.w * q.y - q.z * q.x); + let pitch = if sinp.abs() >= 1.0 { + std::f32::consts::FRAC_PI_2.copysign(sinp) } else { - player_eye_height - } - }, - CameraMode::ThirdPerson if scene_data.is_aiming => player_height * 1.16, - CameraMode::ThirdPerson => player_eye_height, - CameraMode::Freefly => 0.0, - }; + sinp.asin() + }; - match self.camera.get_mode() { - CameraMode::FirstPerson | CameraMode::ThirdPerson => { - self.camera.set_focus_pos( - player_pos + Vec3::unit_z() * (up - tilt.min(0.0).sin() * dist * 0.6), - ); - }, - CameraMode::Freefly => {}, - }; + let siny_cosp = 2.0 * (q.w * q.z + q.x * q.y); + let cosy_cosp = 1.0 - 2.0 * (q.y * q.y + q.z * q.z); + let yaw = siny_cosp.atan2(cosy_cosp); - // Tick camera for interpolation. - self.camera - .update(scene_data.state.get_time(), dt, scene_data.mouse_smoothing); + self.camera + .set_orientation_instant(Vec3::new(yaw, pitch, -roll)); + } + + // Alter camera position to match player. + let tilt = self.camera.get_orientation().y; + let dist = self.camera.get_distance(); + + let up = match self.camera.get_mode() { + CameraMode::FirstPerson => { + if viewpoint_rolling { + viewpoint_height * 0.42 + } else if is_running && on_ground.unwrap_or(false) { + viewpoint_eye_height + + (scene_data.state.get_time() as f32 * 17.0).sin() * 0.05 + } else { + viewpoint_eye_height + } + }, + CameraMode::ThirdPerson if scene_data.is_aiming => viewpoint_height * 1.16, + CameraMode::ThirdPerson => viewpoint_eye_height, + CameraMode::Freefly => 0.0, + }; + + match self.camera.get_mode() { + CameraMode::FirstPerson | CameraMode::ThirdPerson => { + self.camera.set_focus_pos( + viewpoint_pos + Vec3::unit_z() * (up - tilt.min(0.0).sin() * dist * 0.6), + ); + }, + CameraMode::Freefly => {}, + }; + + // Tick camera for interpolation. + self.camera + .update(scene_data.state.get_time(), dt, scene_data.mouse_smoothing); + viewpoint_pos + } else { + Vec3::zero() + }; // Compute camera matrices. self.camera.compute_dependents(&*scene_data.state.terrain()); @@ -617,7 +651,7 @@ impl Scene { .filter(|(pos, _, light_anim, h)| { light_anim.col != Rgb::zero() && light_anim.strength > 0.0 - && (pos.0.distance_squared(player_pos) as f32) + && (pos.0.distance_squared(viewpoint_pos) as f32) < loaded_distance.powi(2) + LIGHT_DIST_RADIUS && h.map_or(true, |h| !h.is_dead) }) @@ -632,7 +666,7 @@ impl Scene { .map(|el| el.light.with_strength((el.fadeout)(el.timeout))), ), ); - lights.sort_by_key(|light| light.get_pos().distance_squared(player_pos) as i32); + lights.sort_by_key(|light| light.get_pos().distance_squared(viewpoint_pos) as i32); lights.truncate(MAX_LIGHT_COUNT); renderer.update_consts(&mut self.data.lights, lights); @@ -657,7 +691,7 @@ impl Scene { .join() .filter(|(_, _, _, _, health)| !health.is_dead) .filter(|(pos, _, _, _, _)| { - (pos.0.distance_squared(player_pos) as f32) + (pos.0.distance_squared(viewpoint_pos) as f32) < (loaded_distance.min(SHADOW_MAX_DIST) + SHADOW_DIST_RADIUS).powi(2) }) .map(|(pos, interpolated, scale, _, _)| { @@ -668,7 +702,7 @@ impl Scene { ) }) .collect::>(); - shadows.sort_by_key(|shadow| shadow.get_pos().distance_squared(player_pos) as i32); + shadows.sort_by_key(|shadow| shadow.get_pos().distance_squared(viewpoint_pos) as i32); shadows.truncate(MAX_SHADOW_COUNT); renderer.update_consts(&mut self.data.shadows, &shadows); @@ -1139,7 +1173,7 @@ impl Scene { self.sfx_mgr.maintain( audio, scene_data.state, - scene_data.player_entity, + scene_data.viewpoint_entity, &self.camera, &self.terrain, client, diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index a0739d3e63..3f7d4814b7 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -1166,7 +1166,7 @@ impl ParticleMgr { let time = scene_data.state.get_time(); let player_pos = scene_data .state - .read_component_copied::(scene_data.player_entity) + .read_component_copied::(scene_data.viewpoint_entity) .map(|i| i.pos) .unwrap_or_default(); let player_chunk = player_pos.xy().map2(TerrainChunk::RECT_SIZE, |e, sz| { diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 229ddb2fb8..60b682073b 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -88,6 +88,7 @@ pub struct SessionState { is_aiming: bool, target_entity: Option, selected_entity: Option<(specs::Entity, std::time::Instant)>, + viewpoint_entity: Option, interactable: Option, #[cfg(not(target_os = "macos"))] mumble_link: SharedLink, @@ -149,6 +150,7 @@ impl SessionState { is_aiming: false, target_entity: None, selected_entity: None, + viewpoint_entity: None, interactable: None, #[cfg(not(target_os = "macos"))] mumble_link, @@ -162,6 +164,14 @@ impl SessionState { self.key_state.auto_walk = false; } + /// Gets the entity that is the current viewpoint, and a bool if the client + /// is allowed to edit it's data. + fn viewpoint_entity(&self) -> (specs::Entity, bool) { + self.viewpoint_entity + .map(|e| (e, false)) + .unwrap_or_else(|| (self.client.borrow().entity(), true)) + } + /// Tick the session (and the client attached to it). fn tick( &mut self, @@ -548,12 +558,11 @@ impl PlayState for SessionState { if !self.inputs_state.insert(input) { self.inputs_state.remove(&input); } - match input { GameInput::Primary => { let mut client = self.client.borrow_mut(); - // Mine and build targets can be the same block. make building take - // precedence. + // Mine and build targets can be the same block. make building + // take precedence. // Order of precedence: build, then mining, then attack. if let Some(build_target) = build_target.filter(|bt| { state && can_build && nearest_block_dist == Some(bt.distance) @@ -890,16 +899,18 @@ impl PlayState for SessionState { // Prevent accessing camera modes which aren't available in // multiplayer unless you are an // admin. This is an easily bypassed clientside check. - // The server should do its own filtering of which entities are sent - // to clients to prevent abuse. + // The server should do its own filtering of which entities are + // sent to clients to + // prevent abuse. let camera = self.scene.camera_mut(); let client = self.client.borrow(); camera.next_mode( client.is_moderator(), client .presence() - .map(|presence| presence == PresenceKind::Spectator) - .unwrap_or(false), + .map(|presence| presence != PresenceKind::Spectator) + .unwrap_or(true) + || self.viewpoint_entity.is_some(), ); }, GameInput::Select => { @@ -920,6 +931,24 @@ impl PlayState for SessionState { client.decline_invite(); } }, + GameInput::SpectateViewpoint if state => { + if self.viewpoint_entity.is_some() { + self.viewpoint_entity = None; + self.scene.camera_mut().set_mode(CameraMode::Freefly); + } else if let Some(interactable) = self.interactable { + if self.scene.camera().get_mode() == CameraMode::Freefly { + match interactable { + Interactable::Block(_, _, _) => {}, + Interactable::Entity(entity) => { + self.viewpoint_entity = Some(entity); + self.scene + .camera_mut() + .set_mode(CameraMode::FirstPerson); + }, + } + } + } + }, _ => {}, } }, @@ -949,97 +978,121 @@ impl PlayState for SessionState { } } - // If auto-gliding, point camera into the wind - if let Some(dir) = self - .auto_walk - .then_some(self.client.borrow()) - .filter(|client| client.is_gliding()) - .and_then(|client| { - let ecs = client.state().ecs(); - let entity = client.entity(); - let fluid = ecs - .read_storage::() - .get(entity)? - .in_fluid?; - ecs.read_storage::() - .get(entity) - .map(|vel| fluid.relative_flow(vel).0) - .map(|rel_flow| { - let is_wind_downwards = rel_flow.dot(Vec3::unit_z()).is_sign_negative(); - if !self.free_look { - if is_wind_downwards { - self.scene.camera().forward_xy().into() - } else { - let windwards = rel_flow - * self - .scene - .camera() - .forward_xy() - .dot(rel_flow.xy()) - .signum(); - Plane::from(Dir::new(self.scene.camera().right())) - .projection(windwards) - } - } else if is_wind_downwards { - Vec3::from(-rel_flow.xy()) - } else { - -rel_flow - } - }) - .and_then(Dir::from_unnormalized) - }) - { - self.key_state.auto_walk = false; - self.inputs.move_dir = Vec2::zero(); - self.inputs.look_dir = dir; - } else { - self.key_state.auto_walk = self.auto_walk; - if !self.free_look { - self.walk_forward_dir = self.scene.camera().forward_xy(); - self.walk_right_dir = self.scene.camera().right_xy(); - self.inputs.look_dir = - Dir::from_unnormalized(cam_dir + aim_dir_offset).unwrap(); - } + if self.viewpoint_entity.map_or(false, |entity| { + !self + .client + .borrow() + .state() + .ecs() + .read_storage::() + .contains(entity) + }) { + self.viewpoint_entity = None; + self.scene.camera_mut().set_mode(CameraMode::Freefly); } - self.inputs.strafing = matches!( - self.scene.camera().get_mode(), - camera::CameraMode::FirstPerson - ); + + let (viewpoint_entity, mutable_viewpoint) = self.viewpoint_entity(); // Get the current state of movement related inputs let input_vec = self.key_state.dir_vec(); let (axis_right, axis_up) = (input_vec[0], input_vec[1]); let dt = global_state.clock.get_stable_dt().as_secs_f32(); - // Auto camera mode - if global_state.settings.gameplay.auto_camera - && matches!( + if mutable_viewpoint { + // If auto-gliding, point camera into the wind + if let Some(dir) = self + .auto_walk + .then_some(self.client.borrow()) + .filter(|client| client.is_gliding()) + .and_then(|client| { + let ecs = client.state().ecs(); + let entity = client.entity(); + let fluid = ecs + .read_storage::() + .get(entity)? + .in_fluid?; + ecs.read_storage::() + .get(entity) + .map(|vel| fluid.relative_flow(vel).0) + .map(|rel_flow| { + let is_wind_downwards = + rel_flow.dot(Vec3::unit_z()).is_sign_negative(); + if !self.free_look { + if is_wind_downwards { + self.scene.camera().forward_xy().into() + } else { + let windwards = rel_flow + * self + .scene + .camera() + .forward_xy() + .dot(rel_flow.xy()) + .signum(); + Plane::from(Dir::new(self.scene.camera().right())) + .projection(windwards) + } + } else if is_wind_downwards { + Vec3::from(-rel_flow.xy()) + } else { + -rel_flow + } + }) + .and_then(Dir::from_unnormalized) + }) + { + self.key_state.auto_walk = false; + self.inputs.move_dir = Vec2::zero(); + self.inputs.look_dir = dir; + } else { + self.key_state.auto_walk = self.auto_walk; + if !self.free_look { + self.walk_forward_dir = self.scene.camera().forward_xy(); + self.walk_right_dir = self.scene.camera().right_xy(); + self.inputs.look_dir = + Dir::from_unnormalized(cam_dir + aim_dir_offset).unwrap(); + } + } + self.inputs.strafing = matches!( self.scene.camera().get_mode(), - camera::CameraMode::ThirdPerson | camera::CameraMode::FirstPerson - ) - && input_vec.magnitude_squared() > 0.0 - { - let camera = self.scene.camera_mut(); - let ori = camera.get_orientation(); - camera.set_orientation_instant(Vec3::new( - ori.x - + input_vec.x - * (3.0 - input_vec.y * 1.5 * if is_aiming { 1.5 } else { 1.0 }) - * dt, - std::f32::consts::PI * if is_aiming { 0.015 } else { 0.1 }, - 0.0, - )); + camera::CameraMode::FirstPerson + ); + + // Auto camera mode + if global_state.settings.gameplay.auto_camera + && matches!( + self.scene.camera().get_mode(), + camera::CameraMode::ThirdPerson | camera::CameraMode::FirstPerson + ) + && input_vec.magnitude_squared() > 0.0 + { + let camera = self.scene.camera_mut(); + let ori = camera.get_orientation(); + camera.set_orientation_instant(Vec3::new( + ori.x + + input_vec.x + * (3.0 - input_vec.y * 1.5 * if is_aiming { 1.5 } else { 1.0 }) + * dt, + std::f32::consts::PI * if is_aiming { 0.015 } else { 0.1 }, + 0.0, + )); + } + + self.inputs.climb = self.key_state.climb(); + self.inputs.move_z = + self.key_state.swim_up as i32 as f32 - self.key_state.swim_down as i32 as f32; } match self.scene.camera().get_mode() { CameraMode::FirstPerson | CameraMode::ThirdPerson => { - // Move the player character based on their walking direction. - // This could be different from the camera direction if free look is enabled. - self.inputs.move_dir = - self.walk_right_dir * axis_right + self.walk_forward_dir * axis_up; + if mutable_viewpoint { + // Move the player character based on their walking direction. + // This could be different from the camera direction if free look is + // enabled. + self.inputs.move_dir = + self.walk_right_dir * axis_right + self.walk_forward_dir * axis_up; + } self.freefly_vel = Vec3::zero(); }, - CameraMode::Freefly => { // Move the camera freely in 3d space. Apply acceleration so that // the movement feels more natural and controlled. @@ -1084,10 +1137,6 @@ impl PlayState for SessionState { }, }; - self.inputs.climb = self.key_state.climb(); - self.inputs.move_z = - self.key_state.swim_up as i32 as f32 - self.key_state.swim_down as i32 as f32; - let mut outcomes = Vec::new(); // Runs if either in a multiplayer server or the singleplayer server is unpaused @@ -1177,6 +1226,8 @@ impl PlayState for SessionState { self.scene.camera().get_mode(), camera::CameraMode::FirstPerson ), + viewpoint_entity, + mutable_viewpoint, target_entity: self.target_entity, selected_entity: self.selected_entity, }, @@ -1608,7 +1659,8 @@ impl PlayState for SessionState { let scene_data = SceneData { client: &client, state: client.state(), - player_entity: client.entity(), + viewpoint_entity, + mutable_viewpoint: mutable_viewpoint || self.free_look, // Only highlight if interactable target_entity: self.interactable.and_then(Interactable::entity), loaded_distance: client.loaded_distance(), @@ -1688,10 +1740,13 @@ impl PlayState for SessionState { let client = self.client.borrow(); + let (viewpoint_entity, mutable_viewpoint) = self.viewpoint_entity(); + let scene_data = SceneData { client: &client, state: client.state(), - player_entity: client.entity(), + viewpoint_entity, + mutable_viewpoint, // Only highlight if interactable target_entity: self.interactable.and_then(Interactable::entity), loaded_distance: client.loaded_distance(), diff --git a/voxygen/src/settings/control.rs b/voxygen/src/settings/control.rs index 344a0c4c22..6ed306bc90 100644 --- a/voxygen/src/settings/control.rs +++ b/voxygen/src/settings/control.rs @@ -190,6 +190,7 @@ impl ControlSettings { GameInput::MapZoomOut => KeyMouse::Key(VirtualKeyCode::Minus), GameInput::MapSetMarker => KeyMouse::Mouse(MouseButton::Middle), GameInput::SpectateSpeedBoost => KeyMouse::Key(VirtualKeyCode::LControl), + GameInput::SpectateViewpoint => KeyMouse::Mouse(MouseButton::Middle), } } } diff --git a/voxygen/src/ui/graphic/mod.rs b/voxygen/src/ui/graphic/mod.rs index 1ece067e4f..b49fbacdfd 100644 --- a/voxygen/src/ui/graphic/mod.rs +++ b/voxygen/src/ui/graphic/mod.rs @@ -1,6 +1,5 @@ mod pixel_art; mod renderer; - pub use renderer::{SampleStrat, Transform}; use crate::{ diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 37a5ca9062..5be0f77d18 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -3,7 +3,7 @@ use crate::hud::{ get_quality_col, img_ids::Imgs, item_imgs::{animate_by_pulse, ItemImgs}, - util, + util, HudInfo, }; use client::Client; use common::{ @@ -291,6 +291,7 @@ pub struct ItemTooltip<'a> { transparency: f32, image_frame: ImageFrame, client: &'a Client, + info: &'a HudInfo, imgs: &'a Imgs, item_imgs: &'a ItemImgs, pulse: f32, @@ -352,6 +353,7 @@ impl<'a> ItemTooltip<'a> { pub fn new( image_frame: ImageFrame, client: &'a Client, + info: &'a HudInfo, imgs: &'a Imgs, item_imgs: &'a ItemImgs, pulse: f32, @@ -369,6 +371,7 @@ impl<'a> ItemTooltip<'a> { image: None, image_dims: None, client, + info, imgs, item_imgs, pulse, @@ -448,7 +451,7 @@ impl<'a> Widget for ItemTooltip<'a> { let i18n = &self.localized_strings; let inventories = self.client.inventories(); - let inventory = match inventories.get(self.client.entity()) { + let inventory = match inventories.get(self.info.viewpoint_entity) { Some(l) => l, None => return, }; From 87821d5c1d504e70e25c646b1e54ebb5219bf23f Mon Sep 17 00:00:00 2001 From: IsseW Date: Sun, 31 Jul 2022 23:01:10 +0200 Subject: [PATCH 046/854] force update counter --- client/src/lib.rs | 14 +++++++-- common/net/src/msg/client.rs | 1 + common/net/src/msg/server.rs | 4 +-- common/src/comp/phys.rs | 29 +++++++++++++++++-- common/src/mounting.rs | 4 ++- server/src/client.rs | 2 +- server/src/cmd.rs | 7 +++-- server/src/events/entity_manipulation.rs | 36 +++++++++--------------- server/src/events/player.rs | 2 +- server/src/state_ext.rs | 6 ++-- server/src/sys/entity_sync.rs | 25 +++++++++++----- server/src/sys/msg/in_game.rs | 4 +-- server/src/sys/terrain.rs | 4 ++- 13 files changed, 89 insertions(+), 49 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 42122d1c68..9a583bcb05 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -217,6 +217,7 @@ pub struct Client { available_recipes: HashMap>, lod_zones: HashMap, lod::Zone>, lod_last_requested: Option, + force_update_counter: u64, max_group_size: u32, // Client has received an invite (inviter uid, time out instant) @@ -679,6 +680,8 @@ impl Client { lod_zones: HashMap::new(), lod_last_requested: None, + force_update_counter: 0, + max_group_size, invite: None, group_leader: None, @@ -1754,8 +1757,12 @@ impl Client { self.state.read_storage().get(self.entity()).cloned(), self.state.read_storage().get(self.entity()).cloned(), ) { - self.in_game_stream - .send(ClientGeneral::PlayerPhysics { pos, vel, ori })?; + self.in_game_stream.send(ClientGeneral::PlayerPhysics { + pos, + vel, + ori, + force_counter: self.force_update_counter, + })?; } } @@ -2071,7 +2078,8 @@ impl Client { .ecs_mut() .apply_entity_sync_package(entity_sync_package); }, - ServerGeneral::CompSync(comp_sync_package) => { + ServerGeneral::CompSync(comp_sync_package, force_counter) => { + self.force_update_counter = force_counter; self.state .ecs_mut() .apply_comp_sync_package(comp_sync_package); diff --git a/common/net/src/msg/client.rs b/common/net/src/msg/client.rs index 2cdf77201c..f373593b5c 100644 --- a/common/net/src/msg/client.rs +++ b/common/net/src/msg/client.rs @@ -74,6 +74,7 @@ pub enum ClientGeneral { pos: comp::Pos, vel: comp::Vel, ori: comp::Ori, + force_counter: u64, }, UnlockSkill(Skill), UnlockSkillGroup(SkillGroupKind), diff --git a/common/net/src/msg/server.rs b/common/net/src/msg/server.rs index 2c7241614f..9fecc4361b 100644 --- a/common/net/src/msg/server.rs +++ b/common/net/src/msg/server.rs @@ -188,7 +188,7 @@ pub enum ServerGeneral { SetPlayerEntity(Uid), TimeOfDay(TimeOfDay, Calendar), EntitySync(sync::EntitySyncPackage), - CompSync(sync::CompSyncPackage), + CompSync(sync::CompSyncPackage, u64), CreateEntity(sync::EntityPackage), DeleteEntity(Uid), Disconnect(DisconnectReason), @@ -327,7 +327,7 @@ impl ServerMsg { | ServerGeneral::SetPlayerEntity(_) | ServerGeneral::TimeOfDay(_, _) | ServerGeneral::EntitySync(_) - | ServerGeneral::CompSync(_) + | ServerGeneral::CompSync(_, _) | ServerGeneral::CreateEntity(_) | ServerGeneral::DeleteEntity(_) | ServerGeneral::Disconnect(_) diff --git a/common/src/comp/phys.rs b/common/src/comp/phys.rs index 6af6aaa929..4df06ea57f 100644 --- a/common/src/comp/phys.rs +++ b/common/src/comp/phys.rs @@ -213,9 +213,32 @@ impl Component for PhysicsState { /// Used to forcefully update the position, velocity, and orientation of the /// client -#[derive(Copy, Clone, Debug, Default)] -pub struct ForceUpdate; +#[derive(Copy, Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +pub struct ForceUpdate { + flag: bool, + counter: u64, +} + +impl ForceUpdate { + pub fn forced() -> Self { + Self { + flag: true, + counter: 0, + } + } + + pub fn update(&mut self) { + self.flag = true; + self.counter = self.counter.wrapping_add(1); + } + + pub fn clear(&mut self) { self.flag = false; } + + pub fn is_forced(&self) -> bool { self.flag } + + pub fn counter(&self) -> u64 { self.counter } +} impl Component for ForceUpdate { - type Storage = NullStorage; + type Storage = VecStorage; } diff --git a/common/src/mounting.rs b/common/src/mounting.rs index 96b586cf69..6d95da5fd0 100644 --- a/common/src/mounting.rs +++ b/common/src/mounting.rs @@ -148,7 +148,9 @@ impl Link for Mounting { .map(|p| p.0.map(|e| e.floor())) .unwrap_or_else(|| terrain.find_space(old_pos).map(|e| e as f32)) + Vec3::new(0.5, 0.5, 0.0); - let _ = force_update.insert(rider, comp::ForceUpdate); + if let Some(force_update) = force_update.get_mut(rider) { + force_update.update(); + } }); } } diff --git a/server/src/client.rs b/server/src/client.rs index bd031c4681..6db1dc479a 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -206,7 +206,7 @@ impl Client { | ServerGeneral::SetPlayerEntity(_) | ServerGeneral::TimeOfDay(_, _) | ServerGeneral::EntitySync(_) - | ServerGeneral::CompSync(_) + | ServerGeneral::CompSync(_, _) | ServerGeneral::CreateEntity(_) | ServerGeneral::DeleteEntity(_) | ServerGeneral::Disconnect(_) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index f6dc922479..948d451959 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -257,11 +257,12 @@ fn position_mut( { server.notify_client(entity, ServerGeneral::SpectatePosition(pos)); } else { - let _ = server + server .state .ecs() .write_storage::() - .insert(entity, comp::ForceUpdate); + .get_mut(entity) + .map(|force_update| force_update.update()); } } res @@ -2077,7 +2078,7 @@ fn handle_light( .ecs_mut() .create_entity_synced() .with(pos) - .with(comp::ForceUpdate) + .with(comp::ForceUpdate::forced()) .with(light_emitter); if let Some(light_offset) = light_offset_opt { builder.with(light_offset).build(); diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 32fb838add..13fb62a1b1 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -410,10 +410,9 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt .map(|e| error!(?e, ?entity, "Failed to set zero vel on dead client")); state .ecs() - .write_storage() - .insert(entity, comp::ForceUpdate) - .err() - .map(|e| error!(?e, ?entity, "Failed to insert ForceUpdate on dead client")); + .write_storage::() + .get_mut(entity) + .map(|force_update| force_update.update()); state .ecs() .write_storage::() @@ -648,15 +647,14 @@ pub fn handle_respawn(server: &Server, entity: EcsEntity) { .map(|pos| pos.0 = respawn_point); state .ecs() - .write_storage() - .insert(entity, comp::ForceUpdate) - .err() - .map(|e| { - error!( - ?e, - "Error inserting ForceUpdate component when respawning client" - ) - }); + .write_storage::() + .get_mut(entity) + .map(|phys_state| phys_state.reset()); + state + .ecs() + .write_storage::() + .get_mut(entity) + .map(|force_update| force_update.update()); } } @@ -1259,15 +1257,9 @@ pub fn handle_teleport_to(server: &Server, entity: EcsEntity, target: Uid, max_r if let (Some(pos), Some(target_pos)) = (positions.get_mut(entity), target_pos) { if max_range.map_or(true, |r| pos.0.distance_squared(target_pos.0) < r.powi(2)) { *pos = target_pos; - ecs.write_storage() - .insert(entity, comp::ForceUpdate) - .err() - .map(|e| { - error!( - ?e, - "Error inserting ForceUpdate component when teleporting client" - ) - }); + ecs.write_storage::() + .get_mut(entity) + .map(|force_update| force_update.update()); } } } diff --git a/server/src/events/player.rs b/server/src/events/player.rs index d894ad996e..12be12d221 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -486,7 +486,7 @@ pub fn handle_possess(server: &mut Server, possessor_uid: Uid, possessee_uid: Ui possessee, ); if !comp_sync_package.is_empty() { - client.send_fallible(ServerGeneral::CompSync(comp_sync_package)); + client.send_fallible(ServerGeneral::CompSync(comp_sync_package, 0)); // TODO: Check if this should be zero } } diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 265a48ad98..42bc324286 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -510,7 +510,7 @@ impl StateExt for State { self.write_component_ignore_entity_dead(entity, comp::Combo::default()); // Make sure physics components are updated - self.write_component_ignore_entity_dead(entity, comp::ForceUpdate); + self.write_component_ignore_entity_dead(entity, comp::ForceUpdate::forced()); const INITIAL_VD: u32 = 5; //will be changed after login self.write_component_ignore_entity_dead( @@ -536,7 +536,7 @@ impl StateExt for State { self.write_component_ignore_entity_dead(entity, comp::Pos(spawn_point)); // Make sure physics components are updated - self.write_component_ignore_entity_dead(entity, comp::ForceUpdate); + self.write_component_ignore_entity_dead(entity, comp::ForceUpdate::forced()); const INITIAL_VD: u32 = 5; //will be changed after login self.write_component_ignore_entity_dead( @@ -604,7 +604,7 @@ impl StateExt for State { self.write_component_ignore_entity_dead(entity, waypoint); self.write_component_ignore_entity_dead(entity, comp::Pos(waypoint.get_pos())); self.write_component_ignore_entity_dead(entity, comp::Vel(Vec3::zero())); - self.write_component_ignore_entity_dead(entity, comp::ForceUpdate); + self.write_component_ignore_entity_dead(entity, comp::ForceUpdate::forced()); } if let Some(map_marker) = map_marker { diff --git a/server/src/sys/entity_sync.rs b/server/src/sys/entity_sync.rs index f090ab8c03..ceff297429 100644 --- a/server/src/sys/entity_sync.rs +++ b/server/src/sys/entity_sync.rs @@ -208,12 +208,15 @@ impl<'a> System<'a> for Sys { // We lazily initialize the the synchronization messages in case there are no // clients. let mut entity_comp_sync = Either::Left((entity_sync_package, comp_sync_package)); - for (client, _, _, _) in &mut subscribers { + for (client, _, client_entity, _) in &mut subscribers { let msg = entity_comp_sync.right_or_else( |(entity_sync_package, comp_sync_package)| { ( client.prepare(ServerGeneral::EntitySync(entity_sync_package)), - client.prepare(ServerGeneral::CompSync(comp_sync_package)), + client.prepare(ServerGeneral::CompSync( + comp_sync_package, + force_updates.get(*client_entity).map_or(0, |f| f.counter()), + )), ) }, ); @@ -234,7 +237,7 @@ impl<'a> System<'a> for Sys { (&positions, last_pos.mask().maybe()), (&velocities, last_vel.mask().maybe()).maybe(), (&orientations, last_vel.mask().maybe()).maybe(), - force_updates.mask().maybe(), + force_updates.maybe(), colliders.maybe(), ) .join() @@ -250,7 +253,7 @@ impl<'a> System<'a> for Sys { // Don't send client physics updates about itself unless force update is // set or the client is subject to // server-authoritative physics - force_update.is_some() + force_update.map_or(false, |f| f.is_forced()) || player_physics_setting.server_authoritative() || is_rider.get(entity).is_some() } else if matches!(collider, Some(Collider::Voxel { .. })) { @@ -305,7 +308,10 @@ impl<'a> System<'a> for Sys { } } - client.send_fallible(ServerGeneral::CompSync(comp_sync_package)); + client.send_fallible(ServerGeneral::CompSync( + comp_sync_package, + force_updates.get(*client_entity).map_or(0, |f| f.counter()), + )); } }, ); @@ -363,7 +369,10 @@ impl<'a> System<'a> for Sys { let comp_sync_package = trackers.create_sync_from_client_package(&tracked_storages, entity); if !comp_sync_package.is_empty() { - client.send_fallible(ServerGeneral::CompSync(comp_sync_package)); + client.send_fallible(ServerGeneral::CompSync( + comp_sync_package, + force_updates.get(entity).map_or(0, |f| f.counter()), + )); } } @@ -392,7 +401,9 @@ impl<'a> System<'a> for Sys { } // Remove all force flags. - force_updates.clear(); + for force_update in (&mut force_updates).join() { + force_update.clear(); + } inventory_updates.clear(); // Sync resources diff --git a/server/src/sys/msg/in_game.rs b/server/src/sys/msg/in_game.rs index 65f3d69e07..474d16a902 100644 --- a/server/src/sys/msg/in_game.rs +++ b/server/src/sys/msg/in_game.rs @@ -111,7 +111,7 @@ impl Sys { } } }, - ClientGeneral::PlayerPhysics { pos, vel, ori } => { + ClientGeneral::PlayerPhysics { pos, vel, ori, force_counter } => { let player_physics_setting = maybe_player.map(|p| { player_physics_settings .settings @@ -120,7 +120,7 @@ impl Sys { }); if presence.kind.controlling_char() - && force_updates.get(entity).is_none() + && force_updates.get(entity).map_or(true, |force_update| force_update.counter() == force_counter) && healths.get(entity).map_or(true, |h| !h.is_dead) && is_rider.get(entity).is_none() && player_physics_setting diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs index e1efa23541..9bf2ecf288 100644 --- a/server/src/sys/terrain.rs +++ b/server/src/sys/terrain.rs @@ -243,7 +243,9 @@ impl<'a> System<'a> for Sys { .map(|x| x.as_::()) .unwrap_or_else(|| chunk.find_accessible_pos(pos.0.xy().as_::(), false)); repositioned.push(entity); - let _ = force_update.insert(entity, ForceUpdate); + force_update + .get_mut(entity) + .map(|force_update| force_update.update()); let _ = waypoints.insert(entity, Waypoint::new(pos.0, *time)); } } From e2368075599ed1953e12cb36963b732b07726e43 Mon Sep 17 00:00:00 2001 From: IsseW Date: Wed, 6 Jul 2022 12:22:56 +0200 Subject: [PATCH 047/854] Add to changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cf08cc39a..e6b08e2be0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Cave biomes - Updated the Polish translation - Setting for disabling flashing lights +- Spectate mode for moderators. ### Changed @@ -101,6 +102,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Modular weapons now have a selling price - Closing a subwindow now only regrabs the cursor if no other subwindow requires it. - Fixed npc not handling interactions while fighting (especially merchants in trade) +- Fixed bug where you would still be burning after dying in lava. ## [0.12.0] - 2022-02-19 From 02c78c28f43aa703724ff57f9350ae4c69734795 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Wed, 10 Aug 2022 01:06:17 +0300 Subject: [PATCH 048/854] Force no digits after dot printing for boosts --- voxygen/src/hud/diary.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index ddc7cc705b..ebe074b1a4 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -3466,7 +3466,7 @@ impl<'a> SkillStrings<'a> { let title = i18n.get(title); let args = i18n::fluent_args! { - "boost" => percentage, + "boost" => format!("{percentage:.0}"), "SP" => sp(i18n, skill_set, skill), }; let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); From 0cd4d71d001206d43320390818b21d9f96b63078 Mon Sep 17 00:00:00 2001 From: IsseW Date: Wed, 10 Aug 2022 11:03:22 +0200 Subject: [PATCH 049/854] Add town music to cliff towns and desert cities --- world/src/lib.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/world/src/lib.rs b/world/src/lib.rs index 717f04dcee..8478859664 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -304,10 +304,12 @@ impl World { sim_chunk.river.velocity, sim_chunk.temp, sim_chunk.humidity, - sim_chunk - .sites - .iter() - .any(|site| matches!(index.sites[*site].kind, SiteKind::Refactor(_))), + sim_chunk.sites.iter().any(|site| { + matches!( + index.sites[*site].kind, + SiteKind::Refactor(_) | SiteKind::CliffTown(_) | SiteKind::DesertCity(_) + ) + }), sim_chunk .sites .iter() From 177fbcb0bc3812e37004de02230c351bec006012 Mon Sep 17 00:00:00 2001 From: Julio Cezar Silva Date: Thu, 11 Aug 2022 00:12:42 +0000 Subject: [PATCH 050/854] Login screen's first detected tab triggers username focus --- CHANGELOG.md | 1 + voxygen/src/menu/main/ui/mod.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6b08e2be0..21c8828676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Use fluent for translations +- First tab on Login screen triggers username focus ### Removed diff --git a/voxygen/src/menu/main/ui/mod.rs b/voxygen/src/menu/main/ui/mod.rs index 12c5d2ded4..f68ffabafc 100644 --- a/voxygen/src/menu/main/ui/mod.rs +++ b/voxygen/src/menu/main/ui/mod.rs @@ -501,6 +501,9 @@ impl Controls { screen.banner.server = text_input::State::new(); screen.banner.username = text_input::State::focused(); screen.banner.username.move_cursor_to_end(); + } else { + screen.banner.username = text_input::State::focused(); + screen.banner.username.move_cursor_to_end(); } } } From 258feee6340d1f489477449840e4d53f6123ec02 Mon Sep 17 00:00:00 2001 From: DaforLynx Date: Thu, 11 Aug 2022 02:56:40 +0000 Subject: [PATCH 051/854] Fix crash when Gap Between Songs is set to 0.0; changed name to Music Spacing --- assets/voxygen/i18n/en/hud/settings.ftl | 2 +- voxygen/src/audio/mod.rs | 8 ++-- voxygen/src/audio/music.rs | 51 +++++++++++++----------- voxygen/src/hud/settings_window/sound.rs | 10 ++--- voxygen/src/session/settings_change.rs | 4 +- voxygen/src/settings/audio.rs | 4 +- 6 files changed, 41 insertions(+), 38 deletions(-) diff --git a/assets/voxygen/i18n/en/hud/settings.ftl b/assets/voxygen/i18n/en/hud/settings.ftl index 237f222772..635299cc8b 100644 --- a/assets/voxygen/i18n/en/hud/settings.ftl +++ b/assets/voxygen/i18n/en/hud/settings.ftl @@ -111,7 +111,7 @@ hud-settings-inactive_master_volume_perc = Inactive Window Volume hud-settings-music_volume = Music Volume hud-settings-sound_effect_volume = Sound Effects Volume hud-settings-ambience_volume = Ambience Volume -hud-settings-music_frequency = Gap Between Songs +hud-settings-music_spacing = Music Spacing hud-settings-audio_device = Audio Device hud-settings-reset_sound = Reset to Defaults hud-settings-english_fallback = Display English for missing translations diff --git a/voxygen/src/audio/mod.rs b/voxygen/src/audio/mod.rs index ad23c7e8ab..0b3869c5c8 100644 --- a/voxygen/src/audio/mod.rs +++ b/voxygen/src/audio/mod.rs @@ -55,7 +55,7 @@ pub struct AudioFrontend { ambience_volume: f32, music_volume: f32, master_volume: f32, - music_frequency: f32, + music_spacing: f32, listener: Listener, mtm: AssetHandle, @@ -108,7 +108,7 @@ impl AudioFrontend { ambience_volume: 1.0, music_volume: 1.0, master_volume: 1.0, - music_frequency: 1.0, + music_spacing: 1.0, listener: Listener::default(), mtm: AssetExt::load_expect("voxygen.audio.music_transition_manifest"), } @@ -140,7 +140,7 @@ impl AudioFrontend { ambience_volume: 1.0, music_volume: 1.0, master_volume: 1.0, - music_frequency: 1.0, + music_spacing: 1.0, listener: Listener::default(), mtm, } @@ -516,7 +516,7 @@ impl AudioFrontend { } } - pub fn set_music_frequency(&mut self, multiplier: f32) { self.music_frequency = multiplier } + pub fn set_music_spacing(&mut self, multiplier: f32) { self.music_spacing = multiplier } /// Updates master volume in all channels pub fn set_master_volume(&mut self, master_volume: f32) { diff --git a/voxygen/src/audio/music.rs b/voxygen/src/audio/music.rs index 33a4b61013..0b9b55845c 100644 --- a/voxygen/src/audio/music.rs +++ b/voxygen/src/audio/music.rs @@ -341,30 +341,33 @@ impl MusicMgr { // a town, or exploring. // TODO: make this something that is decided when a song ends, instead of when // it begins - let frequency_multipler = audio.music_frequency; - let silence_between_tracks_seconds: f32 = - if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) - && matches!(client.current_site(), SitesKind::Settlement) - { - rng.gen_range(120.0 * frequency_multipler..180.0 * frequency_multipler) - } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) - && matches!(client.current_site(), SitesKind::Dungeon) - { - rng.gen_range(10.0 * frequency_multipler..20.0 * frequency_multipler) - } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) - && matches!(client.current_site(), SitesKind::Cave) - { - rng.gen_range(20.0 * frequency_multipler..40.0 * frequency_multipler) - } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) { - rng.gen_range(120.0 * frequency_multipler..240.0 * frequency_multipler) - } else if matches!( - music_state, - MusicState::Activity(MusicActivity::Combat(_)) | MusicState::Transition(_, _) - ) { - 0.0 - } else { - rng.gen_range(30.0 * frequency_multipler..60.0 * frequency_multipler) - }; + let spacing_multiplier = audio.music_spacing; + let mut silence_between_tracks_seconds: f32 = 0.0; + if spacing_multiplier > f32::EPSILON { + silence_between_tracks_seconds = + if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) + && matches!(client.current_site(), SitesKind::Settlement) + { + rng.gen_range(120.0 * spacing_multiplier..180.0 * spacing_multiplier) + } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) + && matches!(client.current_site(), SitesKind::Dungeon) + { + rng.gen_range(10.0 * spacing_multiplier..20.0 * spacing_multiplier) + } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) + && matches!(client.current_site(), SitesKind::Cave) + { + rng.gen_range(20.0 * spacing_multiplier..40.0 * spacing_multiplier) + } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) { + rng.gen_range(120.0 * spacing_multiplier..240.0 * spacing_multiplier) + } else if matches!( + music_state, + MusicState::Activity(MusicActivity::Combat(_)) | MusicState::Transition(_, _) + ) { + 0.0 + } else { + rng.gen_range(30.0 * spacing_multiplier..60.0 * spacing_multiplier) + }; + } let is_dark = (state.get_day_period().is_dark()) as bool; let current_period_of_day = Self::get_current_day_period(is_dark); diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index 54d3837bcd..e02bf118b1 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -289,16 +289,16 @@ impl<'a> Widget for Sound<'a> { .color(TEXT_COLOR) .set(state.ids.ambience_volume_number, ui); - // Music frequency (actually gap between songs) + // Music spacing Text::new(&self.localized_strings.get("hud.settings.music_frequency")) .down_from(state.ids.ambience_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.music_frequency_text, ui); - // Music frequency Slider + // Music spacing Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.music_frequency, + self.global_state.settings.audio.music_spacing, 0.0, 2.0, self.imgs.slider_indicator, @@ -313,10 +313,10 @@ impl<'a> Widget for Sound<'a> { { events.push(AdjustMusicFrequency(new_val)); } - // Music frequency Number + // Music spacing Number Text::new(&format!( "{:1.2}x", - self.global_state.settings.audio.music_frequency + self.global_state.settings.audio.music_spacing )) .right_from(state.ids.music_frequency_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 2a3d8275b7..aefaaec8b3 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -210,9 +210,9 @@ impl SettingsChange { settings.audio.ambience_volume = ambience_volume; }, Audio::AdjustMusicFrequency(multiplier) => { - global_state.audio.set_music_frequency(multiplier); + global_state.audio.set_music_spacing(multiplier); - settings.audio.music_frequency = multiplier; + settings.audio.music_spacing = multiplier; }, //Audio::ChangeAudioDevice(name) => { // global_state.audio.set_device(name.clone()); diff --git a/voxygen/src/settings/audio.rs b/voxygen/src/settings/audio.rs index a46d55da53..11758daa9f 100644 --- a/voxygen/src/settings/audio.rs +++ b/voxygen/src/settings/audio.rs @@ -28,7 +28,7 @@ pub struct AudioSettings { pub ambience_volume: f32, pub num_sfx_channels: usize, pub num_ui_channels: usize, - pub music_frequency: f32, + pub music_spacing: f32, /// Audio Device that Voxygen will use to play audio. pub output: AudioOutput, @@ -44,7 +44,7 @@ impl Default for AudioSettings { ambience_volume: 0.6, num_sfx_channels: 60, num_ui_channels: 10, - music_frequency: 1.0, + music_spacing: 1.0, output: AudioOutput::Automatic, } } From 52bd7b2485b48c508ba91af3ee5920c3245743ec Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 7 Aug 2022 15:47:23 +0100 Subject: [PATCH 052/854] Added automod --- Cargo.lock | 10 ++ client/src/lib.rs | 19 +--- common/net/src/msg/mod.rs | 15 --- server/Cargo.toml | 1 + server/src/automod.rs | 132 +++++++++++++++++++++++++ server/src/lib.rs | 13 ++- server/src/settings.rs | 25 ++++- server/src/sys/msg/character_screen.rs | 13 +++ server/src/sys/msg/general.rs | 72 +++++++++++--- voxygen/src/hud/chat.rs | 9 +- 10 files changed, 254 insertions(+), 55 deletions(-) create mode 100644 server/src/automod.rs diff --git a/Cargo.lock b/Cargo.lock index c5b7100f38..db53b9c45f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -553,6 +553,15 @@ dependencies = [ "jobserver", ] +[[package]] +name = "censor" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5563d2728feef9a6186acdd148bccbe850dad63c5ba55a3b3355abc9137cb3eb" +dependencies = [ + "once_cell", +] + [[package]] name = "cesu8" version = "1.1.0" @@ -6711,6 +6720,7 @@ dependencies = [ "atomicwrites", "authc", "bincode", + "censor", "chrono", "chrono-tz", "crossbeam-channel", diff --git a/client/src/lib.rs b/client/src/lib.rs index 9a583bcb05..d79b949c79 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -54,12 +54,11 @@ use common::{ use common_base::{prof_span, span}; use common_net::{ msg::{ - self, validate_chat_msg, + self, world_msg::{EconomyInfo, PoiInfo, SiteId, SiteInfo}, - ChatMsgValidationError, ClientGeneral, ClientMsg, ClientRegister, ClientType, - DisconnectReason, InviteAnswer, Notification, PingMsg, PlayerInfo, PlayerListUpdate, - PresenceKind, RegisterError, ServerGeneral, ServerInit, ServerRegisterAnswer, - MAX_BYTES_CHAT_MSG, + ClientGeneral, ClientMsg, ClientRegister, ClientType, DisconnectReason, InviteAnswer, + Notification, PingMsg, PlayerInfo, PlayerListUpdate, PresenceKind, RegisterError, + ServerGeneral, ServerInit, ServerRegisterAnswer, }, sync::WorldSyncExt, }; @@ -1551,15 +1550,7 @@ impl Client { pub fn inventories(&self) -> ReadStorage { self.state.read_storage() } /// Send a chat message to the server. - pub fn send_chat(&mut self, message: String) { - match validate_chat_msg(&message) { - Ok(()) => self.send_msg(ClientGeneral::ChatMsg(message)), - Err(ChatMsgValidationError::TooLong) => warn!( - "Attempted to send a message that's too long (Over {} bytes)", - MAX_BYTES_CHAT_MSG - ), - } - } + pub fn send_chat(&mut self, message: String) { self.send_msg(ClientGeneral::ChatMsg(message)); } /// Send a command to the server. pub fn send_command(&mut self, name: String, args: Vec) { diff --git a/common/net/src/msg/mod.rs b/common/net/src/msg/mod.rs index 087f94452a..c2162a356e 100644 --- a/common/net/src/msg/mod.rs +++ b/common/net/src/msg/mod.rs @@ -41,18 +41,3 @@ pub enum PingMsg { Ping, Pong, } - -pub const MAX_BYTES_CHAT_MSG: usize = 256; - -pub enum ChatMsgValidationError { - TooLong, -} - -pub fn validate_chat_msg(msg: &str) -> Result<(), ChatMsgValidationError> { - // TODO: Consider using grapheme cluster count instead of size in bytes - if msg.len() <= MAX_BYTES_CHAT_MSG { - Ok(()) - } else { - Err(ChatMsgValidationError::TooLong) - } -} diff --git a/server/Cargo.toml b/server/Cargo.toml index 8b7df44dfa..1f4c91b95d 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -58,6 +58,7 @@ slab = "0.4" rand_distr = "0.4.0" enumset = "1.0.8" noise = { version = "0.7", default-features = false } +censor = "0.2" rusqlite = { version = "0.24.2", features = ["array", "vtab", "bundled", "trace"] } refinery = { git = "https://gitlab.com/veloren/refinery.git", rev = "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", features = ["rusqlite"] } diff --git a/server/src/automod.rs b/server/src/automod.rs new file mode 100644 index 0000000000..822dc7f87d --- /dev/null +++ b/server/src/automod.rs @@ -0,0 +1,132 @@ +use crate::settings::ModerationSettings; +use authc::Uuid; +use censor::Censor; +use common::comp::AdminRole; +use hashbrown::HashMap; +use std::time::{Duration, Instant}; +use tracing::info; + +pub const MAX_BYTES_CHAT_MSG: usize = 256; + +pub enum ActionNote { + SpamWarn, +} + +pub enum ActionErr { + BannedWord, + TooLong, + SpamMuted(Duration), +} + +pub struct AutoMod { + settings: ModerationSettings, + censor: Censor, + players: HashMap, +} + +impl AutoMod { + pub fn new(settings: &ModerationSettings, banned_words: Vec) -> Self { + if settings.automod { + info!( + "Automod enabled, players{} will be subject to automated spam/content filters", + if settings.admins_exempt { + "" + } else { + " (and admins)" + } + ); + } else { + info!("Automod disabled"); + } + + Self { + settings: settings.clone(), + censor: Censor::Custom(banned_words.into_iter().collect()), + players: HashMap::default(), + } + } + + pub fn enabled(&self) -> bool { self.settings.automod } + + fn player_mut(&mut self, player: Uuid) -> &mut PlayerState { + self.players.entry(player).or_default() + } + + pub fn validate_chat_msg( + &mut self, + player: Uuid, + role: Option, + now: Instant, + msg: &str, + ) -> Result, ActionErr> { + // TODO: Consider using grapheme cluster count instead of size in bytes + if msg.len() > MAX_BYTES_CHAT_MSG { + Err(ActionErr::TooLong) + } else if !self.settings.automod || (role.is_some() && self.settings.admins_exempt) { + Ok(None) + } else if self.censor.check(msg) { + Err(ActionErr::BannedWord) + } else { + let volume = self.player_mut(player).enforce_message_volume(now); + + if let Some(until) = self.player_mut(player).muted_until { + Err(ActionErr::SpamMuted(until.saturating_duration_since(now))) + } else if volume > 0.75 { + Ok(Some(ActionNote::SpamWarn)) + } else { + Ok(None) + } + } + } +} + +/// The period, in seconds, over which chat volume should be tracked to detect +/// spam. +const CHAT_VOLUME_PERIOD: f32 = 30.0; +/// The maximum permitted average number of chat messages over the chat volume +/// period. +const MAX_AVG_MSG_PER_SECOND: f32 = 1.0 / 7.0; // No more than a message every 7 seconds on average +/// The period for which a player should be muted when they exceed the message +/// spam threshold. +const SPAM_MUTE_PERIOD: Duration = Duration::from_secs(180); + +#[derive(Default)] +pub struct PlayerState { + last_msg_time: Option, + /// The average number of messages per second over the last N seconds. + chat_volume: f32, + muted_until: Option, +} + +impl PlayerState { + // 0.0 => message is permitted, nothing unusual + // >=1.0 => message is not permitted, chat volume exceeded + pub fn enforce_message_volume(&mut self, now: Instant) -> f32 { + if self.muted_until.map_or(false, |u| u <= now) { + self.muted_until = None; + } + + if let Some(time_since_last) = self + .last_msg_time + .map(|last| now.saturating_duration_since(last).as_secs_f32()) + { + let time_proportion = (time_since_last / CHAT_VOLUME_PERIOD).min(1.0); + self.chat_volume = self.chat_volume * (1.0 - time_proportion) + + (1.0 / time_since_last) * time_proportion; + } else { + self.chat_volume = 0.0; + } + self.last_msg_time = Some(now); + + let min_level = 1.0 / CHAT_VOLUME_PERIOD; + let max_level = MAX_AVG_MSG_PER_SECOND; + + let volume = ((self.chat_volume - min_level) / (max_level - min_level)).max(0.0); + + if volume > 1.0 && self.muted_until.is_none() { + self.muted_until = now.checked_add(SPAM_MUTE_PERIOD); + } + + volume + } +} diff --git a/server/src/lib.rs b/server/src/lib.rs index 4aa7c134c0..5896c68fd7 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -15,6 +15,7 @@ #![cfg_attr(not(feature = "worldgen"), feature(const_panic))] pub mod alias_validator; +pub mod automod; mod character_creator; pub mod chunk_generator; mod chunk_serialize; @@ -55,6 +56,7 @@ pub use crate::{ use crate::terrain_persistence::TerrainPersistence; use crate::{ alias_validator::AliasValidator, + automod::AutoMod, chunk_generator::ChunkGenerator, client::Client, cmd::ChatCommandExt, @@ -339,7 +341,7 @@ impl Server { state.ecs_mut().register::(); //Alias validator - let banned_words_paths = &settings.banned_words_files; + let banned_words_paths = &settings.moderation.banned_words_files; let mut banned_words = Vec::new(); for path in banned_words_paths { let mut list = match std::fs::File::open(&path) { @@ -367,7 +369,14 @@ impl Server { let banned_words_count = banned_words.len(); debug!(?banned_words_count); trace!(?banned_words); - state.ecs_mut().insert(AliasValidator::new(banned_words)); + state + .ecs_mut() + .insert(AliasValidator::new(banned_words.clone())); + + // Init automod + state + .ecs_mut() + .insert(AutoMod::new(&settings.moderation, banned_words)); #[cfg(feature = "worldgen")] let (world, index) = World::generate( diff --git a/server/src/settings.rs b/server/src/settings.rs index ecabef5284..44d503713d 100644 --- a/server/src/settings.rs +++ b/server/src/settings.rs @@ -95,6 +95,26 @@ impl Default for GameplaySettings { } } +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ModerationSettings { + #[serde(default)] + pub banned_words_files: Vec, + #[serde(default)] + pub automod: bool, + #[serde(default)] + pub admins_exempt: bool, +} + +impl Default for ModerationSettings { + fn default() -> Self { + Self { + banned_words_files: Vec::new(), + automod: false, + admins_exempt: true, + } + } +} + #[derive(Clone, Debug, Serialize, Deserialize)] pub enum CalendarMode { None, @@ -132,7 +152,6 @@ pub struct Settings { /// uses the value of the file options to decide how to proceed. pub map_file: Option, pub max_view_distance: Option, - pub banned_words_files: Vec, pub max_player_group_size: u32, pub client_timeout: Duration, pub spawn_town: Option, @@ -146,6 +165,8 @@ pub struct Settings { #[serde(default)] pub gameplay: GameplaySettings, + #[serde(default)] + pub moderation: ModerationSettings, } impl Default for Settings { @@ -167,7 +188,6 @@ impl Default for Settings { start_time: 9.0 * 3600.0, map_file: None, max_view_distance: Some(65), - banned_words_files: Vec::new(), max_player_group_size: 6, calendar_mode: CalendarMode::Auto, client_timeout: Duration::from_secs(40), @@ -175,6 +195,7 @@ impl Default for Settings { max_player_for_kill_broadcast: None, experimental_terrain_persistence: false, gameplay: GameplaySettings::default(), + moderation: ModerationSettings::default(), } } } diff --git a/server/src/sys/msg/character_screen.rs b/server/src/sys/msg/character_screen.rs index 7190a5a91a..389bbbdf9a 100644 --- a/server/src/sys/msg/character_screen.rs +++ b/server/src/sys/msg/character_screen.rs @@ -1,5 +1,6 @@ use crate::{ alias_validator::AliasValidator, + automod::AutoMod, character_creator, client::Client, persistence::{character_loader::CharacterLoader, character_updater::CharacterUpdater}, @@ -30,6 +31,7 @@ impl Sys { presences: &ReadStorage<'_, Presence>, editable_settings: &ReadExpect<'_, EditableSettings>, alias_validator: &ReadExpect<'_, AliasValidator>, + automod: &AutoMod, msg: ClientGeneral, ) -> Result<(), crate::error::Error> { let mut send_join_messages = || -> Result<(), crate::error::Error> { @@ -41,6 +43,14 @@ impl Sys { ))?; } + // Warn them about automod + if automod.enabled() { + client.send(ServerGeneral::server_msg( + ChatType::CommandInfo, + "Automatic moderation is enabled: play nice and have fun!", + ))?; + } + if !client.login_msg_sent.load(Ordering::Relaxed) { if let Some(player_uid) = uids.get(entity) { server_emitter.emit(ServerEvent::Chat(UnresolvedChatMsg { @@ -211,6 +221,7 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, Presence>, ReadExpect<'a, EditableSettings>, ReadExpect<'a, AliasValidator>, + ReadExpect<'a, AutoMod>, ); const NAME: &'static str = "msg::character_screen"; @@ -231,6 +242,7 @@ impl<'a> System<'a> for Sys { presences, editable_settings, alias_validator, + automod, ): Self::SystemData, ) { let mut server_emitter = server_event_bus.emitter(); @@ -249,6 +261,7 @@ impl<'a> System<'a> for Sys { &presences, &editable_settings, &alias_validator, + &automod, msg, ) }); diff --git a/server/src/sys/msg/general.rs b/server/src/sys/msg/general.rs index 0527da7dcf..27a207ffb8 100644 --- a/server/src/sys/msg/general.rs +++ b/server/src/sys/msg/general.rs @@ -1,32 +1,37 @@ -use crate::client::Client; +use crate::{ + automod::{self, AutoMod}, + client::Client, +}; use common::{ - comp::{ChatMode, Player}, + comp::{Admin, AdminRole, ChatMode, ChatType, Player}, event::{EventBus, ServerEvent}, resources::Time, uid::Uid, }; use common_ecs::{Job, Origin, Phase, System}; -use common_net::msg::{ - validate_chat_msg, ChatMsgValidationError, ClientGeneral, MAX_BYTES_CHAT_MSG, -}; -use specs::{Entities, Join, Read, ReadStorage}; +use common_net::msg::{ClientGeneral, ServerGeneral}; +use specs::{Entities, Join, Read, ReadStorage, WriteExpect}; +use std::time::Instant; use tracing::{debug, error, warn}; impl Sys { fn handle_general_msg( server_emitter: &mut common::event::Emitter<'_, ServerEvent>, entity: specs::Entity, - _client: &Client, + client: &Client, player: Option<&Player>, + admin_role: Option, uids: &ReadStorage<'_, Uid>, chat_modes: &ReadStorage<'_, ChatMode>, msg: ClientGeneral, + now: Instant, + automod: &mut AutoMod, ) -> Result<(), crate::error::Error> { match msg { ClientGeneral::ChatMsg(message) => { - if player.is_some() { - match validate_chat_msg(&message) { - Ok(()) => { + if let Some(player) = player { + match automod.validate_chat_msg(player.uuid(), admin_role, now, &message) { + Ok(note) => { if let Some(from) = uids.get(entity) { const CHAT_MODE_DEFAULT: &ChatMode = &ChatMode::default(); let mode = chat_modes.get(entity).unwrap_or(CHAT_MODE_DEFAULT); @@ -36,13 +41,42 @@ impl Sys { } else { error!("Could not send message. Missing player uid"); } + + match note { + None => {}, + Some(automod::ActionNote::SpamWarn) => { + let _ = client.send(ServerGeneral::server_msg( + ChatType::CommandError, + "You've sent a lot of messages recently. Make sure to \ + reduce the rate of messages or you will be automatically \ + muted.", + )); + }, + } }, - Err(ChatMsgValidationError::TooLong) => { - let max = MAX_BYTES_CHAT_MSG; + Err(automod::ActionErr::TooLong) => { let len = message.len(); - warn!(?len, ?max, "Received a chat message that's too long") + warn!(?len, "Received a chat message that's too long"); + }, + Err(automod::ActionErr::BannedWord) => { + let _ = client.send(ServerGeneral::server_msg( + ChatType::CommandError, + "Your message contained a banned word. If you think this is a \ + false positive, please open a bug report.", + )); + }, + Err(automod::ActionErr::SpamMuted(dur)) => { + let _ = client.send(ServerGeneral::server_msg( + ChatType::CommandError, + format!( + "You have sent too many messages and are muted for {} seconds.", + dur.as_secs_f32() as u64 + ), + )); }, } + } else { + warn!("Received a chat message from an unregistered client"); } }, ClientGeneral::Command(name, args) => { @@ -81,6 +115,8 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, ChatMode>, ReadStorage<'a, Player>, ReadStorage<'a, Client>, + ReadStorage<'a, Admin>, + WriteExpect<'a, AutoMod>, ); const NAME: &'static str = "msg::general"; @@ -89,20 +125,26 @@ impl<'a> System<'a> for Sys { fn run( _job: &mut Job, - (entities, server_event_bus, time, uids, chat_modes, players, clients): Self::SystemData, + (entities, server_event_bus, time, uids, chat_modes, players, clients, admins, mut automod): Self::SystemData, ) { let mut server_emitter = server_event_bus.emitter(); - for (entity, client, player) in (&entities, &clients, (&players).maybe()).join() { + let now = Instant::now(); + for (entity, client, player, admin) in + (&entities, &clients, players.maybe(), admins.maybe()).join() + { let res = super::try_recv_all(client, 3, |client, msg| { Self::handle_general_msg( &mut server_emitter, entity, client, player, + admin.map(|a| a.0), &uids, &chat_modes, msg, + now, + &mut automod, ) }); diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index adc2541cf8..dbdffb21cb 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -9,7 +9,6 @@ use common::comp::{ group::Role, BuffKind, ChatMode, ChatMsg, ChatType, }; -use common_net::msg::validate_chat_msg; use conrod_core::{ color, input::Key, @@ -120,9 +119,7 @@ impl<'a> Chat<'a> { } pub fn input(mut self, input: String) -> Self { - if let Ok(()) = validate_chat_msg(&input) { - self.force_input = Some(input); - } + self.force_input = Some(input); self } @@ -388,9 +385,7 @@ impl<'a> Widget for Chat<'a> { .set(state.ids.chat_input, ui) { input.retain(|c| c != '\n'); - if let Ok(()) = validate_chat_msg(&input) { - state.update(|s| s.input.message = input); - } + state.update(|s| s.input.message = input); } } From 4d110a542c61bd419b88def73f7e8ed5fcc0d22f Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 7 Aug 2022 17:09:12 +0100 Subject: [PATCH 053/854] Improved banned words loading --- server/src/lib.rs | 30 ++---------------------------- server/src/settings.rs | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/server/src/lib.rs b/server/src/lib.rs index 5896c68fd7..74d10c43a7 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -340,35 +340,9 @@ impl Server { state.ecs_mut().register::(); state.ecs_mut().register::(); + let banned_words = settings.moderation.load_banned_words(data_dir); + //Alias validator - let banned_words_paths = &settings.moderation.banned_words_files; - let mut banned_words = Vec::new(); - for path in banned_words_paths { - let mut list = match std::fs::File::open(&path) { - Ok(file) => match ron::de::from_reader(&file) { - Ok(vec) => vec, - Err(error) => { - warn!(?error, ?file, "Couldn't deserialize banned words file"); - return Err(Error::Other(format!( - "Couldn't read banned words file \"{}\"", - path.to_string_lossy() - ))); - }, - }, - Err(error) => { - warn!(?error, ?path, "Couldn't open banned words file"); - return Err(Error::Other(format!( - "Couldn't open banned words file \"{}\". Error: {}", - path.to_string_lossy(), - error - ))); - }, - }; - banned_words.append(&mut list); - } - let banned_words_count = banned_words.len(); - debug!(?banned_words_count); - trace!(?banned_words); state .ecs_mut() .insert(AliasValidator::new(banned_words.clone())); diff --git a/server/src/settings.rs b/server/src/settings.rs index 44d503713d..896dc8df7f 100644 --- a/server/src/settings.rs +++ b/server/src/settings.rs @@ -105,6 +105,24 @@ pub struct ModerationSettings { pub admins_exempt: bool, } +impl ModerationSettings { + pub fn load_banned_words(&self, data_dir: &Path) -> Vec { + let mut banned_words = Vec::new(); + for fname in self.banned_words_files.iter() { + let mut path = with_config_dir(data_dir); + path.push(fname); + match std::fs::File::open(&path) { + Ok(file) => match ron::de::from_reader(&file) { + Ok(mut words) => banned_words.append(&mut words), + Err(error) => error!(?error, ?file, "Couldn't read banned words file"), + }, + Err(error) => error!(?error, ?path, "Couldn't open banned words file"), + } + } + banned_words + } +} + impl Default for ModerationSettings { fn default() -> Self { Self { @@ -286,7 +304,7 @@ impl Settings { } } -fn with_config_dir(path: &Path) -> PathBuf { +pub fn with_config_dir(path: &Path) -> PathBuf { let mut path = PathBuf::from(path); path.push(CONFIG_DIR); path From 4e103c433fab4d841915d2f815756b59640b4b73 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 7 Aug 2022 17:55:05 +0100 Subject: [PATCH 054/854] Simplified and improved alias validation --- server/src/alias_validator.rs | 139 ------------------------- server/src/automod.rs | 11 +- server/src/lib.rs | 13 +-- server/src/sys/msg/character_screen.rs | 29 +++--- 4 files changed, 29 insertions(+), 163 deletions(-) delete mode 100644 server/src/alias_validator.rs diff --git a/server/src/alias_validator.rs b/server/src/alias_validator.rs deleted file mode 100644 index 7eb27ea3f3..0000000000 --- a/server/src/alias_validator.rs +++ /dev/null @@ -1,139 +0,0 @@ -use common::character::MAX_NAME_LENGTH; -use std::fmt::{self, Display}; - -#[derive(Debug, Default)] -pub struct AliasValidator { - banned_substrings: Vec, -} - -impl AliasValidator { - pub fn new(banned_substrings: Vec) -> Self { - let banned_substrings = banned_substrings - .iter() - .map(|string| string.to_lowercase()) - .collect(); - - AliasValidator { banned_substrings } - } - - pub fn validate(&self, alias: &str) -> Result<(), ValidatorError> { - if alias.len() > MAX_NAME_LENGTH { - return Err(ValidatorError::TooLong(alias.to_owned(), alias.len())); - } - - let lowercase_alias = alias.to_lowercase(); - - for banned_word in self.banned_substrings.iter() { - if lowercase_alias.contains(banned_word) { - return Err(ValidatorError::Forbidden( - alias.to_owned(), - banned_word.to_owned(), - )); - } - } - Ok(()) - } -} - -#[derive(Debug, PartialEq)] -pub enum ValidatorError { - Forbidden(String, String), - TooLong(String, usize), -} - -impl Display for ValidatorError { - fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Forbidden(name, _) => write!( - formatter, - "Character name \"{}\" contains a banned word", - name - ), - Self::TooLong(name, _) => write!(formatter, "Character name \"{}\" too long", name), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn multiple_matches() { - let banned_substrings = vec!["bad".to_owned(), "worse".to_owned()]; - let validator = AliasValidator::new(banned_substrings); - - let bad_alias = "BadplayerMcWorseFace"; - let result = validator.validate(bad_alias); - - assert_eq!( - result, - Err(ValidatorError::Forbidden( - bad_alias.to_owned(), - "bad".to_owned() - )) - ); - } - - #[test] - fn single_lowercase_match() { - let banned_substrings = vec!["blue".to_owned()]; - let validator = AliasValidator::new(banned_substrings); - - let bad_alias = "blueName"; - let result = validator.validate(bad_alias); - - assert_eq!( - result, - Err(ValidatorError::Forbidden( - bad_alias.to_owned(), - "blue".to_owned() - )) - ); - } - - #[test] - fn single_case_insensitive_match() { - let banned_substrings = vec!["GrEEn".to_owned()]; - let validator = AliasValidator::new(banned_substrings); - - let bad_alias = "gReenName"; - let result = validator.validate(bad_alias); - - assert_eq!( - result, - Err(ValidatorError::Forbidden( - bad_alias.to_owned(), - "green".to_owned() - )) - ); - } - - #[test] - fn mp_matches() { - let banned_substrings = vec!["orange".to_owned()]; - let validator = AliasValidator::new(banned_substrings); - - let good_alias = "ReasonableName"; - let result = validator.validate(good_alias); - - assert_eq!(result, Ok(())); - } - - #[test] - fn too_long() { - let banned_substrings = vec!["orange".to_owned()]; - let validator = AliasValidator::new(banned_substrings); - - let bad_alias = "Thisnameistoolong Muchtoolong MuchTooLongByFar"; - let result = validator.validate(bad_alias); - - assert_eq!( - result, - Err(ValidatorError::TooLong( - bad_alias.to_owned(), - bad_alias.chars().count() - )) - ); - } -} diff --git a/server/src/automod.rs b/server/src/automod.rs index 822dc7f87d..27780e8a8f 100644 --- a/server/src/automod.rs +++ b/server/src/automod.rs @@ -3,7 +3,10 @@ use authc::Uuid; use censor::Censor; use common::comp::AdminRole; use hashbrown::HashMap; -use std::time::{Duration, Instant}; +use std::{ + sync::Arc, + time::{Duration, Instant}, +}; use tracing::info; pub const MAX_BYTES_CHAT_MSG: usize = 256; @@ -20,12 +23,12 @@ pub enum ActionErr { pub struct AutoMod { settings: ModerationSettings, - censor: Censor, + censor: Arc, players: HashMap, } impl AutoMod { - pub fn new(settings: &ModerationSettings, banned_words: Vec) -> Self { + pub fn new(settings: &ModerationSettings, censor: Arc) -> Self { if settings.automod { info!( "Automod enabled, players{} will be subject to automated spam/content filters", @@ -41,7 +44,7 @@ impl AutoMod { Self { settings: settings.clone(), - censor: Censor::Custom(banned_words.into_iter().collect()), + censor, players: HashMap::default(), } } diff --git a/server/src/lib.rs b/server/src/lib.rs index 74d10c43a7..85c2e3a1ad 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -14,7 +14,6 @@ )] #![cfg_attr(not(feature = "worldgen"), feature(const_panic))] -pub mod alias_validator; pub mod automod; mod character_creator; pub mod chunk_generator; @@ -55,7 +54,6 @@ pub use crate::{ #[cfg(feature = "persistent_world")] use crate::terrain_persistence::TerrainPersistence; use crate::{ - alias_validator::AliasValidator, automod::AutoMod, chunk_generator::ChunkGenerator, client::Client, @@ -70,6 +68,7 @@ use crate::{ state_ext::StateExt, sys::sentinel::{DeletedEntities, TrackedStorages}, }; +use censor::Censor; #[cfg(not(feature = "worldgen"))] use common::grid::Grid; use common::{ @@ -340,17 +339,15 @@ impl Server { state.ecs_mut().register::(); state.ecs_mut().register::(); + // Load banned words list let banned_words = settings.moderation.load_banned_words(data_dir); - - //Alias validator - state - .ecs_mut() - .insert(AliasValidator::new(banned_words.clone())); + let censor = Arc::new(Censor::Custom(banned_words.into_iter().collect())); + state.ecs_mut().insert(Arc::clone(&censor)); // Init automod state .ecs_mut() - .insert(AutoMod::new(&settings.moderation, banned_words)); + .insert(AutoMod::new(&settings.moderation, censor)); #[cfg(feature = "worldgen")] let (world, index) = World::generate( diff --git a/server/src/sys/msg/character_screen.rs b/server/src/sys/msg/character_screen.rs index 389bbbdf9a..d9a12f58f0 100644 --- a/server/src/sys/msg/character_screen.rs +++ b/server/src/sys/msg/character_screen.rs @@ -1,5 +1,4 @@ use crate::{ - alias_validator::AliasValidator, automod::AutoMod, character_creator, client::Client, @@ -15,7 +14,7 @@ use common::{ use common_ecs::{Job, Origin, Phase, System}; use common_net::msg::{ClientGeneral, ServerGeneral}; use specs::{Entities, Join, Read, ReadExpect, ReadStorage, WriteExpect}; -use std::sync::atomic::Ordering; +use std::sync::{atomic::Ordering, Arc}; use tracing::debug; impl Sys { @@ -30,7 +29,7 @@ impl Sys { admins: &ReadStorage<'_, Admin>, presences: &ReadStorage<'_, Presence>, editable_settings: &ReadExpect<'_, EditableSettings>, - alias_validator: &ReadExpect<'_, AliasValidator>, + censor: &ReadExpect<'_, Arc>, automod: &AutoMod, msg: ClientGeneral, ) -> Result<(), crate::error::Error> { @@ -138,9 +137,12 @@ impl Sys { offhand, body, } => { - if let Err(error) = alias_validator.validate(&alias) { - debug!(?error, ?alias, "denied alias as it contained a banned word"); - client.send(ServerGeneral::CharacterActionError(error.to_string()))?; + if censor.check(&alias) { + debug!(?alias, "denied alias as it contained a banned word"); + client.send(ServerGeneral::CharacterActionError(format!( + "Alias '{}' contains a banned word", + alias + )))?; } else if let Some(player) = players.get(entity) { if let Err(error) = character_creator::create_character( entity, @@ -163,9 +165,12 @@ impl Sys { } }, ClientGeneral::EditCharacter { id, alias, body } => { - if let Err(error) = alias_validator.validate(&alias) { - debug!(?error, ?alias, "denied alias as it contained a banned word"); - client.send(ServerGeneral::CharacterActionError(error.to_string()))?; + if censor.check(&alias) { + debug!(?alias, "denied alias as it contained a banned word"); + client.send(ServerGeneral::CharacterActionError(format!( + "Alias '{}' contains a banned word", + alias + )))?; } else if let Some(player) = players.get(entity) { if let Err(error) = character_creator::edit_character( entity, @@ -220,7 +225,7 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, Admin>, ReadStorage<'a, Presence>, ReadExpect<'a, EditableSettings>, - ReadExpect<'a, AliasValidator>, + ReadExpect<'a, Arc>, ReadExpect<'a, AutoMod>, ); @@ -241,7 +246,7 @@ impl<'a> System<'a> for Sys { admins, presences, editable_settings, - alias_validator, + censor, automod, ): Self::SystemData, ) { @@ -260,7 +265,7 @@ impl<'a> System<'a> for Sys { &admins, &presences, &editable_settings, - &alias_validator, + &censor, &automod, msg, ) From 602de267b1f5d9acce33158a96996716372f3275 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 7 Aug 2022 19:50:51 +0100 Subject: [PATCH 055/854] Perform validation on all kinds of chat message --- common/src/comp/chat.rs | 44 +++-- server/src/automod.rs | 35 ++++ server/src/state_ext.rs | 355 +++++++++++++++++++--------------- server/src/sys/msg/general.rs | 82 ++------ 4 files changed, 277 insertions(+), 239 deletions(-) diff --git a/common/src/comp/chat.rs b/common/src/comp/chat.rs index b31857638b..791e47580c 100644 --- a/common/src/comp/chat.rs +++ b/common/src/comp/chat.rs @@ -124,6 +124,28 @@ impl ChatType { message: msg.into(), } } + + pub fn uid(&self) -> Option { + match self { + ChatType::Online(_) => None, + ChatType::Offline(_) => None, + ChatType::CommandInfo => None, + ChatType::CommandError => None, + ChatType::FactionMeta(_) => None, + ChatType::GroupMeta(_) => None, + ChatType::Kill(_, _) => None, + ChatType::Tell(u, _t) => Some(*u), + ChatType::Say(u) => Some(*u), + ChatType::Group(u, _s) => Some(*u), + ChatType::Faction(u, _s) => Some(*u), + ChatType::Region(u) => Some(*u), + ChatType::World(u) => Some(*u), + ChatType::Npc(u, _r) => Some(*u), + ChatType::NpcSay(u, _r) => Some(*u), + ChatType::NpcTell(u, _t, _r) => Some(*u), + ChatType::Meta => None, + } + } } // Stores chat text, type @@ -226,27 +248,7 @@ impl GenericChatMsg { } } - pub fn uid(&self) -> Option { - match &self.chat_type { - ChatType::Online(_) => None, - ChatType::Offline(_) => None, - ChatType::CommandInfo => None, - ChatType::CommandError => None, - ChatType::FactionMeta(_) => None, - ChatType::GroupMeta(_) => None, - ChatType::Kill(_, _) => None, - ChatType::Tell(u, _t) => Some(*u), - ChatType::Say(u) => Some(*u), - ChatType::Group(u, _s) => Some(*u), - ChatType::Faction(u, _s) => Some(*u), - ChatType::Region(u) => Some(*u), - ChatType::World(u) => Some(*u), - ChatType::Npc(u, _r) => Some(*u), - ChatType::NpcSay(u, _r) => Some(*u), - ChatType::NpcTell(u, _t, _r) => Some(*u), - ChatType::Meta => None, - } - } + pub fn uid(&self) -> Option { self.chat_type.uid() } } /// Player factions are used to coordinate pvp vs hostile factions or segment diff --git a/server/src/automod.rs b/server/src/automod.rs index 27780e8a8f..c9bc3b16e8 100644 --- a/server/src/automod.rs +++ b/server/src/automod.rs @@ -4,6 +4,7 @@ use censor::Censor; use common::comp::AdminRole; use hashbrown::HashMap; use std::{ + fmt, sync::Arc, time::{Duration, Instant}, }; @@ -15,12 +16,46 @@ pub enum ActionNote { SpamWarn, } +impl fmt::Display for ActionNote { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ActionNote::SpamWarn => write!( + f, + "You've sent a lot of messages recently. Make sure to reduce the rate of messages \ + or you will be automatically muted." + ), + } + } +} + pub enum ActionErr { BannedWord, TooLong, SpamMuted(Duration), } +impl fmt::Display for ActionErr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ActionErr::BannedWord => write!( + f, + "Your message contained a banned word. If you think this is a mistake, please let \ + a moderator know." + ), + ActionErr::TooLong => write!( + f, + "Your message was too long, no more than {} characters are permitted.", + MAX_BYTES_CHAT_MSG + ), + ActionErr::SpamMuted(dur) => write!( + f, + "You have sent too many messages and are muted for {} seconds.", + dur.as_secs_f32() as u64 + ), + } + } +} + pub struct AutoMod { settings: ModerationSettings, censor: Arc, diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 42bc324286..237f891849 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -1,4 +1,5 @@ use crate::{ + automod::AutoMod, client::Client, events::update_map_markers, persistence::PersistedComponents, @@ -17,7 +18,7 @@ use common::{ self, item::MaterialStatManifest, skills::{GeneralSkill, Skill}, - Group, Inventory, Item, Poise, + ChatType, Group, Inventory, Item, Player, Poise, }, effect::Effect, link::{Link, LinkHandle}, @@ -36,7 +37,7 @@ use specs::{ saveload::MarkerAllocator, Builder, Entity as EcsEntity, EntityBuilder as EcsEntityBuilder, Join, WorldExt, }; -use std::time::Duration; +use std::time::{Duration, Instant}; use tracing::{trace, warn}; use vek::*; @@ -113,6 +114,7 @@ pub trait StateExt { /// Performed after loading component data from the database fn update_character_data(&mut self, entity: EcsEntity, components: PersistedComponents); /// Iterates over registered clients and send each `ServerMsg` + fn validate_chat_msg(&self, player: EcsEntity, msg: &str) -> bool; fn send_chat(&self, msg: comp::UnresolvedChatMsg); fn notify_players(&self, msg: ServerGeneral); fn notify_in_game_clients(&self, msg: ServerGeneral); @@ -674,6 +676,39 @@ impl StateExt for State { } } + fn validate_chat_msg(&self, entity: EcsEntity, msg: &str) -> bool { + let mut automod = self.ecs().write_resource::(); + let Some(client) = self.ecs().read_storage::().get(entity) else { return true }; + let Some(player) = self.ecs().read_storage::().get(entity) else { return true }; + + match automod.validate_chat_msg( + player.uuid(), + self.ecs() + .read_storage::() + .get(entity) + .map(|a| a.0), + Instant::now(), + msg, + ) { + Ok(note) => { + if let Some(note) = note { + let _ = client.send(ServerGeneral::server_msg( + ChatType::CommandInfo, + format!("{}", note), + )); + } + true + }, + Err(err) => { + let _ = client.send(ServerGeneral::server_msg( + ChatType::CommandError, + format!("{}", err), + )); + false + }, + } + } + /// Send the chat message to the proper players. Say and region are limited /// by location. Faction and group are limited by component. fn send_chat(&self, msg: comp::UnresolvedChatMsg) { @@ -689,165 +724,183 @@ impl StateExt for State { .clone() .map_group(|_| group_info.map_or_else(|| "???".to_string(), |i| i.name.clone())); - match &msg.chat_type { - comp::ChatType::Offline(_) - | comp::ChatType::CommandInfo - | comp::ChatType::CommandError - | comp::ChatType::Meta - | comp::ChatType::World(_) => self.notify_players(ServerGeneral::ChatMsg(resolved_msg)), - comp::ChatType::Online(u) => { - for (client, uid) in - (&ecs.read_storage::(), &ecs.read_storage::()).join() - { - if uid != u { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + if msg.chat_type.uid().map_or(true, |sender| { + (*ecs.read_resource::()) + .retrieve_entity_internal(sender.0) + .map_or(false, |e| self.validate_chat_msg(e, &msg.message)) + }) { + match &msg.chat_type { + comp::ChatType::Offline(_) + | comp::ChatType::CommandInfo + | comp::ChatType::CommandError + | comp::ChatType::Meta + | comp::ChatType::World(_) => { + self.notify_players(ServerGeneral::ChatMsg(resolved_msg)) + }, + comp::ChatType::Online(u) => { + for (client, uid) in + (&ecs.read_storage::(), &ecs.read_storage::()).join() + { + if uid != u { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } } - } - }, - comp::ChatType::Tell(u, t) => { - for (client, uid) in - (&ecs.read_storage::(), &ecs.read_storage::()).join() - { - if uid == u || uid == t { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - }, - comp::ChatType::Kill(kill_source, uid) => { - let comp::chat::GenericChatMsg { message, .. } = msg; - let clients = ecs.read_storage::(); - let clients_count = clients.count(); - // Avoid chat spam, send kill message only to group or nearby players if a - // certain amount of clients are online - if clients_count - > ecs - .fetch::() - .max_player_for_kill_broadcast - .unwrap_or_default() - { - // Send kill message to the dead player's group - let killed_entity = - (*ecs.read_resource::()).retrieve_entity_internal(uid.0); - let groups = ecs.read_storage::(); - let killed_group = killed_entity.and_then(|e| groups.get(e)); - if let Some(g) = &killed_group { - send_to_group(g, ecs, &resolved_msg); + }, + comp::ChatType::Tell(from, to) => { + for (client, uid) in + (&ecs.read_storage::(), &ecs.read_storage::()).join() + { + if uid == from || uid == to { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } } + }, + comp::ChatType::Kill(kill_source, uid) => { + let comp::chat::GenericChatMsg { message, .. } = msg; + let clients = ecs.read_storage::(); + let clients_count = clients.count(); + // Avoid chat spam, send kill message only to group or nearby players if a + // certain amount of clients are online + if clients_count + > ecs + .fetch::() + .max_player_for_kill_broadcast + .unwrap_or_default() + { + // Send kill message to the dead player's group + let killed_entity = + (*ecs.read_resource::()).retrieve_entity_internal(uid.0); + let groups = ecs.read_storage::(); + let killed_group = killed_entity.and_then(|e| groups.get(e)); + if let Some(g) = &killed_group { + send_to_group(g, ecs, &resolved_msg); + } - // Send kill message to nearby players that aren't part of the deceased's group - let positions = ecs.read_storage::(); - if let Some(died_player_pos) = killed_entity.and_then(|e| positions.get(e)) { - for (ent, client, pos) in (&*ecs.entities(), &clients, &positions).join() { - let client_group = groups.get(ent); - let is_different_group = - !(killed_group == client_group && client_group.is_some()); - if is_within(comp::ChatMsg::SAY_DISTANCE, pos, died_player_pos) - && is_different_group + // Send kill message to nearby players that aren't part of the deceased's + // group + let positions = ecs.read_storage::(); + if let Some(died_player_pos) = killed_entity.and_then(|e| positions.get(e)) + { + for (ent, client, pos) in + (&*ecs.entities(), &clients, &positions).join() { + let client_group = groups.get(ent); + let is_different_group = + !(killed_group == client_group && client_group.is_some()); + if is_within(comp::ChatMsg::SAY_DISTANCE, pos, died_player_pos) + && is_different_group + { + client.send_fallible(ServerGeneral::ChatMsg( + resolved_msg.clone(), + )); + } + } + } + } else { + self.notify_players(ServerGeneral::server_msg( + comp::ChatType::Kill(kill_source.clone(), *uid), + message, + )) + } + }, + comp::ChatType::Say(uid) => { + let entity_opt = + (*ecs.read_resource::()).retrieve_entity_internal(uid.0); + + let positions = ecs.read_storage::(); + if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { + for (client, pos) in (&ecs.read_storage::(), &positions).join() { + if is_within(comp::ChatMsg::SAY_DISTANCE, pos, speaker_pos) { client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); } } } - } else { - self.notify_players(ServerGeneral::server_msg( - comp::ChatType::Kill(kill_source.clone(), *uid), - message, - )) - } - }, - comp::ChatType::Say(uid) => { - let entity_opt = - (*ecs.read_resource::()).retrieve_entity_internal(uid.0); - let positions = ecs.read_storage::(); - if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { - for (client, pos) in (&ecs.read_storage::(), &positions).join() { - if is_within(comp::ChatMsg::SAY_DISTANCE, pos, speaker_pos) { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - } - }, - comp::ChatType::Region(uid) => { - let entity_opt = - (*ecs.read_resource::()).retrieve_entity_internal(uid.0); - let positions = ecs.read_storage::(); - if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { - for (client, pos) in (&ecs.read_storage::(), &positions).join() { - if is_within(comp::ChatMsg::REGION_DISTANCE, pos, speaker_pos) { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - } - }, - comp::ChatType::Npc(uid, _r) => { - let entity_opt = - (*ecs.read_resource::()).retrieve_entity_internal(uid.0); - let positions = ecs.read_storage::(); - if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { - for (client, pos) in (&ecs.read_storage::(), &positions).join() { - if is_within(comp::ChatMsg::NPC_DISTANCE, pos, speaker_pos) { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - } - }, - comp::ChatType::NpcSay(uid, _r) => { - let entity_opt = - (*ecs.read_resource::()).retrieve_entity_internal(uid.0); - let positions = ecs.read_storage::(); - if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { - for (client, pos) in (&ecs.read_storage::(), &positions).join() { - if is_within(comp::ChatMsg::NPC_SAY_DISTANCE, pos, speaker_pos) { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - } - }, - comp::ChatType::NpcTell(from, to, _r) => { - for (client, uid) in - (&ecs.read_storage::(), &ecs.read_storage::()).join() - { - if uid == from || uid == to { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - }, - comp::ChatType::FactionMeta(s) | comp::ChatType::Faction(_, s) => { - for (client, faction) in ( - &ecs.read_storage::(), - &ecs.read_storage::(), - ) - .join() - { - if s == &faction.0 { - client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); - } - } - }, - comp::ChatType::Group(from, g) => { - if group_info.is_none() { - // group not found, reply with command error - let reply = comp::ChatMsg { - chat_type: comp::ChatType::CommandError, - message: "You are using group chat but do not belong to a group. Use \ - /world or /region to change chat." - .into(), - }; + }, + comp::ChatType::Region(uid) => { + let entity_opt = + (*ecs.read_resource::()).retrieve_entity_internal(uid.0); - if let Some((client, _)) = - (&ecs.read_storage::(), &ecs.read_storage::()) - .join() - .find(|(_, uid)| *uid == from) - { - client.send_fallible(ServerGeneral::ChatMsg(reply)); + let positions = ecs.read_storage::(); + if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { + for (client, pos) in (&ecs.read_storage::(), &positions).join() { + if is_within(comp::ChatMsg::REGION_DISTANCE, pos, speaker_pos) { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } + } } - return; - } - send_to_group(g, ecs, &resolved_msg); - }, - comp::ChatType::GroupMeta(g) => { - send_to_group(g, ecs, &resolved_msg); - }, + }, + comp::ChatType::Npc(uid, _r) => { + let entity_opt = + (*ecs.read_resource::()).retrieve_entity_internal(uid.0); + + let positions = ecs.read_storage::(); + if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { + for (client, pos) in (&ecs.read_storage::(), &positions).join() { + if is_within(comp::ChatMsg::NPC_DISTANCE, pos, speaker_pos) { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } + } + } + }, + comp::ChatType::NpcSay(uid, _r) => { + let entity_opt = + (*ecs.read_resource::()).retrieve_entity_internal(uid.0); + + let positions = ecs.read_storage::(); + if let Some(speaker_pos) = entity_opt.and_then(|e| positions.get(e)) { + for (client, pos) in (&ecs.read_storage::(), &positions).join() { + if is_within(comp::ChatMsg::NPC_SAY_DISTANCE, pos, speaker_pos) { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } + } + } + }, + comp::ChatType::NpcTell(from, to, _r) => { + for (client, uid) in + (&ecs.read_storage::(), &ecs.read_storage::()).join() + { + if uid == from || uid == to { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } + } + }, + comp::ChatType::FactionMeta(s) | comp::ChatType::Faction(_, s) => { + for (client, faction) in ( + &ecs.read_storage::(), + &ecs.read_storage::(), + ) + .join() + { + if s == &faction.0 { + client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone())); + } + } + }, + comp::ChatType::Group(from, g) => { + if group_info.is_none() { + // group not found, reply with command error + let reply = comp::ChatMsg { + chat_type: comp::ChatType::CommandError, + message: "You are using group chat but do not belong to a group. Use \ + /world or /region to change chat." + .into(), + }; + + if let Some((client, _)) = + (&ecs.read_storage::(), &ecs.read_storage::()) + .join() + .find(|(_, uid)| *uid == from) + { + client.send_fallible(ServerGeneral::ChatMsg(reply)); + } + return; + } + send_to_group(g, ecs, &resolved_msg); + }, + comp::ChatType::GroupMeta(g) => { + send_to_group(g, ecs, &resolved_msg); + }, + } } } diff --git a/server/src/sys/msg/general.rs b/server/src/sys/msg/general.rs index 27a207ffb8..0588308b96 100644 --- a/server/src/sys/msg/general.rs +++ b/server/src/sys/msg/general.rs @@ -1,79 +1,35 @@ -use crate::{ - automod::{self, AutoMod}, - client::Client, -}; +use crate::client::Client; use common::{ - comp::{Admin, AdminRole, ChatMode, ChatType, Player}, + comp::{ChatMode, Player}, event::{EventBus, ServerEvent}, resources::Time, uid::Uid, }; use common_ecs::{Job, Origin, Phase, System}; -use common_net::msg::{ClientGeneral, ServerGeneral}; -use specs::{Entities, Join, Read, ReadStorage, WriteExpect}; -use std::time::Instant; +use common_net::msg::ClientGeneral; +use specs::{Entities, Join, Read, ReadStorage}; use tracing::{debug, error, warn}; impl Sys { fn handle_general_msg( server_emitter: &mut common::event::Emitter<'_, ServerEvent>, entity: specs::Entity, - client: &Client, + _client: &Client, player: Option<&Player>, - admin_role: Option, uids: &ReadStorage<'_, Uid>, chat_modes: &ReadStorage<'_, ChatMode>, msg: ClientGeneral, - now: Instant, - automod: &mut AutoMod, ) -> Result<(), crate::error::Error> { match msg { ClientGeneral::ChatMsg(message) => { - if let Some(player) = player { - match automod.validate_chat_msg(player.uuid(), admin_role, now, &message) { - Ok(note) => { - if let Some(from) = uids.get(entity) { - const CHAT_MODE_DEFAULT: &ChatMode = &ChatMode::default(); - let mode = chat_modes.get(entity).unwrap_or(CHAT_MODE_DEFAULT); - // Send chat message - server_emitter - .emit(ServerEvent::Chat(mode.new_message(*from, message))); - } else { - error!("Could not send message. Missing player uid"); - } - - match note { - None => {}, - Some(automod::ActionNote::SpamWarn) => { - let _ = client.send(ServerGeneral::server_msg( - ChatType::CommandError, - "You've sent a lot of messages recently. Make sure to \ - reduce the rate of messages or you will be automatically \ - muted.", - )); - }, - } - }, - Err(automod::ActionErr::TooLong) => { - let len = message.len(); - warn!(?len, "Received a chat message that's too long"); - }, - Err(automod::ActionErr::BannedWord) => { - let _ = client.send(ServerGeneral::server_msg( - ChatType::CommandError, - "Your message contained a banned word. If you think this is a \ - false positive, please open a bug report.", - )); - }, - Err(automod::ActionErr::SpamMuted(dur)) => { - let _ = client.send(ServerGeneral::server_msg( - ChatType::CommandError, - format!( - "You have sent too many messages and are muted for {} seconds.", - dur.as_secs_f32() as u64 - ), - )); - }, + if player.is_some() { + if let Some(from) = uids.get(entity) { + const CHAT_MODE_DEFAULT: &ChatMode = &ChatMode::default(); + let mode = chat_modes.get(entity).unwrap_or(CHAT_MODE_DEFAULT); + // Send chat message + server_emitter.emit(ServerEvent::Chat(mode.new_message(*from, message))); + } else { + error!("Could not send message. Missing player uid"); } } else { warn!("Received a chat message from an unregistered client"); @@ -115,8 +71,6 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, ChatMode>, ReadStorage<'a, Player>, ReadStorage<'a, Client>, - ReadStorage<'a, Admin>, - WriteExpect<'a, AutoMod>, ); const NAME: &'static str = "msg::general"; @@ -125,26 +79,20 @@ impl<'a> System<'a> for Sys { fn run( _job: &mut Job, - (entities, server_event_bus, time, uids, chat_modes, players, clients, admins, mut automod): Self::SystemData, + (entities, server_event_bus, time, uids, chat_modes, players, clients): Self::SystemData, ) { let mut server_emitter = server_event_bus.emitter(); - let now = Instant::now(); - for (entity, client, player, admin) in - (&entities, &clients, players.maybe(), admins.maybe()).join() - { + for (entity, client, player) in (&entities, &clients, players.maybe()).join() { let res = super::try_recv_all(client, 3, |client, msg| { Self::handle_general_msg( &mut server_emitter, entity, client, player, - admin.map(|a| a.0), &uids, &chat_modes, msg, - now, - &mut automod, ) }); From b1baa09815ccd4e641289b3a434bea48c80b7203 Mon Sep 17 00:00:00 2001 From: Vincent Foulon Date: Thu, 11 Aug 2022 21:15:46 +0200 Subject: [PATCH 056/854] Address review comments --- server/src/sys/agent.rs | 18 +++--- server/src/sys/agent/behavior_tree.rs | 60 ++++++------------- .../sys/agent/behavior_tree/interaction.rs | 2 +- 3 files changed, 28 insertions(+), 52 deletions(-) diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index ac0d34f8e6..490a03b495 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -7,7 +7,7 @@ pub mod util; use crate::{ rtsim::RtSim, sys::agent::{ - behavior_tree::BehaviorTree, + behavior_tree::{BehaviorData, BehaviorTree}, consts::{ AVG_FOLLOW_DIST, DEFAULT_ATTACK_RANGE, IDLE_HEALING_ITEM_THRESHOLD, PARTIAL_PATH_DIST, SEPARATION_BIAS, SEPARATION_DIST, @@ -122,7 +122,7 @@ impl<'a> System<'a> for Sys { _, )| { let mut event_emitter = event_bus.emitter(); - // let mut rng = thread_rng(); + let mut rng = thread_rng(); // Hack, replace with better system when groups are more sophisticated // Override alignment if in a group unless entity is owned already @@ -245,14 +245,16 @@ impl<'a> System<'a> for Sys { // also methods on the `AgentData` struct. Action nodes // are the only parts of this tree that should provide // inputs. - - BehaviorTree::root().run( + let mut behavior_data = BehaviorData { agent, - data, - &read_data, - &mut event_emitter, + agent_data: data, + read_data: &read_data, + event_emitter: &mut event_emitter, controller, - ); + rng: &mut rng, + }; + + BehaviorTree::root().run(&mut behavior_data); debug_assert!(controller.inputs.move_dir.map(|e| !e.is_nan()).reduce_and()); debug_assert!(controller.inputs.look_dir.map(|e| !e.is_nan()).reduce_and()); diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index e5879c0fe2..e4b6dc79ca 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -9,7 +9,7 @@ use common::{ event::{Emitter, ServerEvent}, path::TraversalConfig, }; -use rand::{prelude::ThreadRng, thread_rng, Rng}; +use rand::{prelude::ThreadRng, Rng}; use specs::saveload::{Marker, MarkerAllocator}; use vek::Vec2; @@ -32,12 +32,12 @@ mod interaction; /// Struct containing essential data for running a behavior tree pub struct BehaviorData<'a, 'b, 'c> { - agent: &'a mut Agent, - agent_data: AgentData<'a>, - read_data: &'a ReadData<'a>, - event_emitter: &'a mut Emitter<'c, ServerEvent>, - controller: &'a mut Controller, - rng: &'b mut ThreadRng, + pub agent: &'a mut Agent, + pub agent_data: AgentData<'a>, + pub read_data: &'a ReadData<'a>, + pub event_emitter: &'a mut Emitter<'c, ServerEvent>, + pub controller: &'a mut Controller, + pub rng: &'b mut ThreadRng, } /// Behavior function @@ -88,7 +88,7 @@ impl BehaviorTree { /// Pet BehaviorTree /// - /// Follow the owner and attack ennemies + /// Follow the owner and attack enemies pub fn pet() -> Self { Self { tree: vec![follow_if_far_away, attack_if_owner_hurt, do_idle_tree], @@ -101,11 +101,7 @@ impl BehaviorTree { /// talk. If not, or if we are in combat, deny all talk and trade /// events. pub fn interaction(agent: &Agent) -> Self { - let is_in_combat = if let Some(Target { hostile, .. }) = agent.target { - hostile - } else { - false - }; + let is_in_combat = agent.target.map_or(false, |t| t.hostile); if !is_in_combat && agent.behavior.can(BehaviorCapability::SPEAK) { Self { tree: vec![ @@ -141,29 +137,9 @@ impl BehaviorTree { } /// Run the behavior tree until an event has been handled - pub fn run<'a, 'b>( - &self, - agent: &'a mut Agent, - agent_data: AgentData<'a>, - read_data: &'a ReadData, - event_emitter: &'a mut Emitter<'b, ServerEvent>, - controller: &'a mut Controller, - ) -> bool { - let mut behavior_data = BehaviorData { - agent, - agent_data, - read_data, - event_emitter, - controller, - rng: &mut thread_rng(), - }; - - self.run_with_behavior_data(&mut behavior_data) - } - - fn run_with_behavior_data(&self, bdata: &mut BehaviorData) -> bool { + pub fn run(&self, behavior_data: &mut BehaviorData) -> bool { for behavior_fn in self.tree.iter() { - if behavior_fn(bdata) { + if behavior_fn(behavior_data) { return true; } } @@ -286,9 +262,9 @@ fn target_if_attacked(bdata: &mut BehaviorData) -> bool { /// This function will never stop the BehaviorTree fn do_target_tree_if_target_else_do_idle_tree(bdata: &mut BehaviorData) -> bool { if bdata.agent.target.is_some() { - BehaviorTree::target().run_with_behavior_data(bdata); + BehaviorTree::target().run(bdata); } else { - BehaviorTree::idle().run_with_behavior_data(bdata); + BehaviorTree::idle().run(bdata); } false } @@ -296,9 +272,7 @@ fn do_target_tree_if_target_else_do_idle_tree(bdata: &mut BehaviorData) -> bool /// Run the Idle BehaviorTree /// /// This function can stop the BehaviorTree -fn do_idle_tree(bdata: &mut BehaviorData) -> bool { - BehaviorTree::idle().run_with_behavior_data(bdata) -} +fn do_idle_tree(bdata: &mut BehaviorData) -> bool { BehaviorTree::idle().run(bdata) } /// If target is dead, forget them fn untarget_if_dead(bdata: &mut BehaviorData) -> bool { @@ -325,7 +299,7 @@ fn untarget_if_dead(bdata: &mut BehaviorData) -> bool { fn do_hostile_tree_if_hostile(bdata: &mut BehaviorData) -> bool { if let Some(Target { hostile, .. }) = bdata.agent.target { if hostile { - BehaviorTree::hostile().run_with_behavior_data(bdata); + BehaviorTree::hostile().run(bdata); return true; } } @@ -338,10 +312,10 @@ fn do_pet_tree_if_owned(bdata: &mut BehaviorData) -> bool { (bdata.agent.target, bdata.agent_data.alignment) { if bdata.read_data.uids.get(target) == Some(uid) { - BehaviorTree::pet().run_with_behavior_data(bdata); + BehaviorTree::pet().run(bdata); } else { bdata.agent.target = None; - BehaviorTree::idle().run_with_behavior_data(bdata); + BehaviorTree::idle().run(bdata); } return true; } diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index 042a7f4ece..f0216ab0b6 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -47,7 +47,7 @@ pub fn process_inbox_sound_and_hurt(bdata: &mut BehaviorData) -> bool { /// If we receive a new interaction, start the interaction timer pub fn process_inbox_interaction(bdata: &mut BehaviorData) -> bool { - if BehaviorTree::interaction(bdata.agent).run_with_behavior_data(bdata) { + if BehaviorTree::interaction(bdata.agent).run(bdata) { bdata .agent .timer From e81dade43fc920d5ad7eea63d17df878a06301d6 Mon Sep 17 00:00:00 2001 From: Isse Date: Thu, 11 Aug 2022 20:27:25 +0000 Subject: [PATCH 057/854] Fix compilation with worldgen turned off. --- server/src/lib.rs | 16 ++++++++++------ server/src/weather/mod.rs | 1 + voxygen/src/scene/lod.rs | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/server/src/lib.rs b/server/src/lib.rs index 85c2e3a1ad..8af72f1c0e 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -12,7 +12,6 @@ option_zip, unwrap_infallible )] -#![cfg_attr(not(feature = "worldgen"), feature(const_panic))] pub mod automod; mod character_creator; @@ -39,7 +38,9 @@ pub mod sys; #[cfg(feature = "persistent_world")] pub mod terrain_persistence; #[cfg(not(feature = "worldgen"))] mod test_world; + mod weather; + pub mod wiring; // Reexports @@ -546,12 +547,13 @@ impl Server { // Initiate real-time world simulation #[cfg(feature = "worldgen")] - rtsim::init(&mut state, &world, index.as_index_ref(), spawn_point); + { + rtsim::init(&mut state, &world, index.as_index_ref(), spawn_point); + weather::init(&mut state, &world); + } #[cfg(not(feature = "worldgen"))] rtsim::init(&mut state); - weather::init(&mut state, &world); - let this = Self { state, world, @@ -689,8 +691,10 @@ impl Server { sys::msg::add_server_systems(dispatcher_builder); sys::add_server_systems(dispatcher_builder); #[cfg(feature = "worldgen")] - rtsim::add_server_systems(dispatcher_builder); - weather::add_server_systems(dispatcher_builder); + { + rtsim::add_server_systems(dispatcher_builder); + weather::add_server_systems(dispatcher_builder); + } }, false, ); diff --git a/server/src/weather/mod.rs b/server/src/weather/mod.rs index 46ad28540c..3d36d15d59 100644 --- a/server/src/weather/mod.rs +++ b/server/src/weather/mod.rs @@ -20,6 +20,7 @@ pub fn add_server_systems(dispatch_builder: &mut DispatcherBuilder) { dispatch::(dispatch_builder, &[&tick::Sys::sys_name()]); } +#[cfg(feature = "worldgen")] pub fn init(state: &mut State, world: &world::World) { let weather_size = world.sim().get_size() / CHUNKS_PER_CELL; let sim = WeatherSim::new(weather_size, world); diff --git a/voxygen/src/scene/lod.rs b/voxygen/src/scene/lod.rs index dc7044a8b1..83ace9d18e 100644 --- a/voxygen/src/scene/lod.rs +++ b/voxygen/src/scene/lod.rs @@ -53,7 +53,7 @@ impl Lod { client.world_data().lod_base.raw(), client.world_data().lod_alt.raw(), client.world_data().lod_horizon.raw(), - client.world_data().chunk_size().as_() / weather::CHUNKS_PER_CELL, + (client.world_data().chunk_size().as_() / weather::CHUNKS_PER_CELL).map(|e| e.max(1)), settings.graphics.lod_detail.max(100).min(2500), /* TODO: figure out how we want to do this without color borders? * water_color().into_array().into(), */ From 9315482fc473297b3a8129ea4018105c07ffbe8f Mon Sep 17 00:00:00 2001 From: Julio Cezar Silva Date: Fri, 12 Aug 2022 00:47:48 +0000 Subject: [PATCH 058/854] Craft all --- CHANGELOG.md | 1 + assets/voxygen/i18n/ca_CA/hud/crafting.ftl | 1 + assets/voxygen/i18n/en/hud/crafting.ftl | 1 + assets/voxygen/i18n/es_ES/hud/crafting.ftl | 1 + assets/voxygen/i18n/fr_FR/hud/crafting.ftl | 1 + assets/voxygen/i18n/pt_BR/hud/crafting.ftl | 3 +- client/src/lib.rs | 10 ++-- common/src/comp/controller.rs | 1 + common/src/recipe.rs | 45 ++++++++++++++- server/src/events/inventory_manip.rs | 28 +++++++--- voxygen/src/hud/crafting.rs | 64 ++++++++++++++++++++-- voxygen/src/hud/mod.rs | 11 +++- voxygen/src/session/mod.rs | 21 ++++--- 13 files changed, 158 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21c8828676..801043bcc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Currently playing music track and artist now shows in the debug menu. - Added a setting to influence the gap between music track plays. +- Added a Craft All button. ### Changed - Use fluent for translations diff --git a/assets/voxygen/i18n/ca_CA/hud/crafting.ftl b/assets/voxygen/i18n/ca_CA/hud/crafting.ftl index 9d0fb2a7dd..985787479d 100644 --- a/assets/voxygen/i18n/ca_CA/hud/crafting.ftl +++ b/assets/voxygen/i18n/ca_CA/hud/crafting.ftl @@ -2,6 +2,7 @@ hud-crafting = Elaborar hud-crafting-recipes = Receptes hud-crafting-ingredients = Ingredients: hud-crafting-craft = Elaborar +hud-crafting-craft_all = Elaborar Tot hud-crafting-tool_cata = Requereix: hud-crafting-req_crafting_station = Requereix: hud-crafting-anvil = Enclusa diff --git a/assets/voxygen/i18n/en/hud/crafting.ftl b/assets/voxygen/i18n/en/hud/crafting.ftl index 8e72a2476a..a549ae11b3 100644 --- a/assets/voxygen/i18n/en/hud/crafting.ftl +++ b/assets/voxygen/i18n/en/hud/crafting.ftl @@ -2,6 +2,7 @@ hud-crafting = Crafting hud-crafting-recipes = Recipes hud-crafting-ingredients = Ingredients: hud-crafting-craft = Craft +hud-crafting-craft_all = Craft All hud-crafting-tool_cata = Requires: hud-crafting-req_crafting_station = Requires: hud-crafting-anvil = Anvil diff --git a/assets/voxygen/i18n/es_ES/hud/crafting.ftl b/assets/voxygen/i18n/es_ES/hud/crafting.ftl index fdb35bef08..4b09d5cd30 100644 --- a/assets/voxygen/i18n/es_ES/hud/crafting.ftl +++ b/assets/voxygen/i18n/es_ES/hud/crafting.ftl @@ -2,6 +2,7 @@ hud-crafting = Fabricación hud-crafting-recipes = Recetas hud-crafting-ingredients = Ingredientes: hud-crafting-craft = Fabricar +hud-crafting-craft_all = Fabricar Todo hud-crafting-tool_cata = Requisitos: hud-crafting-req_crafting_station = Requisitos: hud-crafting-anvil = Yunque diff --git a/assets/voxygen/i18n/fr_FR/hud/crafting.ftl b/assets/voxygen/i18n/fr_FR/hud/crafting.ftl index 3fc546d361..8d6735d715 100644 --- a/assets/voxygen/i18n/fr_FR/hud/crafting.ftl +++ b/assets/voxygen/i18n/fr_FR/hud/crafting.ftl @@ -2,6 +2,7 @@ hud-crafting = Fabrication hud-crafting-recipes = Recettes hud-crafting-ingredients = Ingrédients : hud-crafting-craft = Fabriquer +hud-crafting-craft_all = Tout Fabriquer hud-crafting-tool_cata = Nécessite : hud-crafting-req_crafting_station = Nécessite: hud-crafting-anvil = Enclume diff --git a/assets/voxygen/i18n/pt_BR/hud/crafting.ftl b/assets/voxygen/i18n/pt_BR/hud/crafting.ftl index 0f63973ac5..12b78d6981 100644 --- a/assets/voxygen/i18n/pt_BR/hud/crafting.ftl +++ b/assets/voxygen/i18n/pt_BR/hud/crafting.ftl @@ -1,7 +1,8 @@ hud-crafting = Criação hud-crafting-recipes = Receitas hud-crafting-ingredients = Ingredientes: -hud-crafting-craft = Criar +hud-crafting-craft = Forjar +hud-crafting-craft_all = Forjar Tudo hud-crafting-tool_cata = Requer: hud-crafting-req_crafting_station = Requer: hud-crafting-anvil = Bigorna diff --git a/client/src/lib.rs b/client/src/lib.rs index 9a583bcb05..711639cc65 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -1074,13 +1074,13 @@ impl Client { /// Returns whether the specified recipe can be crafted and the sprite, if /// any, that is required to do so. - pub fn can_craft_recipe(&self, recipe: &str) -> (bool, Option) { + pub fn can_craft_recipe(&self, recipe: &str, amount: u32) -> (bool, Option) { self.recipe_book .get(recipe) .zip(self.inventories().get(self.entity())) .map(|(recipe, inv)| { ( - recipe.inventory_contains_ingredients(inv).is_ok(), + recipe.inventory_contains_ingredients(inv, amount).is_ok(), recipe.craft_sprite, ) }) @@ -1092,8 +1092,9 @@ impl Client { recipe: &str, slots: Vec<(u32, InvSlotId)>, craft_sprite: Option<(Vec3, SpriteKind)>, + amount: u32, ) -> bool { - let (can_craft, required_sprite) = self.can_craft_recipe(recipe); + let (can_craft, required_sprite) = self.can_craft_recipe(recipe, amount); let has_sprite = required_sprite.map_or(true, |s| Some(s) == craft_sprite.map(|(_, s)| s)); if can_craft && has_sprite { self.send_msg(ClientGeneral::ControlEvent(ControlEvent::InventoryEvent( @@ -1101,6 +1102,7 @@ impl Client { craft_event: CraftEvent::Simple { recipe: recipe.to_string(), slots, + amount, }, craft_sprite: craft_sprite.map(|(pos, _)| pos), }, @@ -1213,7 +1215,7 @@ impl Client { .iter() .map(|(name, _)| name.clone()) .filter_map(|name| { - let (can_craft, required_sprite) = self.can_craft_recipe(&name); + let (can_craft, required_sprite) = self.can_craft_recipe(&name, 1); if can_craft { Some((name, required_sprite)) } else { diff --git a/common/src/comp/controller.rs b/common/src/comp/controller.rs index 9ceeb62c11..6c87700846 100644 --- a/common/src/comp/controller.rs +++ b/common/src/comp/controller.rs @@ -98,6 +98,7 @@ pub enum CraftEvent { Simple { recipe: String, slots: Vec<(u32, InvSlotId)>, + amount: u32, }, Salvage(InvSlotId), // TODO: Maybe look at making this more general when there are more modular recipes? diff --git a/common/src/recipe.rs b/common/src/recipe.rs index 079f00ff1b..4bc704e895 100644 --- a/common/src/recipe.rs +++ b/common/src/recipe.rs @@ -164,13 +164,52 @@ impl Recipe { pub fn inventory_contains_ingredients( &self, inv: &Inventory, + recipe_amount: u32, ) -> Result, Vec<(&RecipeInput, u32)>> { inventory_contains_ingredients( self.inputs() .map(|(input, amount, _is_modular)| (input, amount)), inv, + recipe_amount, ) } + + /// Calculates the maximum number of items craftable given the current + /// inventory state. + pub fn max_from_ingredients(&self, inv: &Inventory) -> u32 { + let mut max_recipes = None; + + for (input, amount) in self + .inputs() + .map(|(input, amount, _is_modular)| (input, amount)) + { + let needed = amount as f32; + let mut input_max = HashMap::::new(); + + // Checks through every slot, filtering to only those that contain items that + // can satisfy the input. + for (inv_slot_id, slot) in inv.slots_with_id() { + if let Some(item) = slot + .as_ref() + .filter(|item| item.matches_recipe_input(&*input, amount)) + { + *input_max.entry(inv_slot_id).or_insert(0) += item.amount(); + } + } + + // Updates maximum craftable amount based on least recipe-proportional + // availability. + let max_item_proportion = + ((input_max.values().sum::() as f32) / needed).floor() as u32; + max_recipes = Some(match max_recipes { + None => max_item_proportion, + Some(max_recipes) if (max_item_proportion < max_recipes) => max_item_proportion, + Some(n) => n, + }); + } + + max_recipes.unwrap_or(0) + } } /// Determine whether the inventory contains the ingredients for a recipe. @@ -183,6 +222,7 @@ impl Recipe { fn inventory_contains_ingredients<'a, I: Iterator>( ingredients: I, inv: &Inventory, + recipe_amount: u32, ) -> Result, Vec<(&'a RecipeInput, u32)>> { // Hashmap tracking the quantity that needs to be removed from each slot (so // that it doesn't think a slot can provide more items than it contains) @@ -194,7 +234,7 @@ fn inventory_contains_ingredients<'a, I: Iterator let mut missing = Vec::<(&RecipeInput, u32)>::new(); for (i, (input, amount)) in ingredients.enumerate() { - let mut needed = amount; + let mut needed = amount * recipe_amount; let mut contains_any = false; // Checks through every slot, filtering to only those that contain items that // can satisfy the input @@ -358,7 +398,7 @@ impl RecipeBook { pub fn get_available(&self, inv: &Inventory) -> Vec<(String, Recipe)> { self.recipes .iter() - .filter(|(_, recipe)| recipe.inventory_contains_ingredients(inv).is_ok()) + .filter(|(_, recipe)| recipe.inventory_contains_ingredients(inv, 1).is_ok()) .map(|(name, recipe)| (name.clone(), recipe.clone())) .collect() } @@ -654,6 +694,7 @@ impl ComponentRecipe { .iter() .map(|(input, amount)| (input, *amount)), inv, + 1, ) } diff --git a/server/src/events/inventory_manip.rs b/server/src/events/inventory_manip.rs index 70a806a731..618339160c 100644 --- a/server/src/events/inventory_manip.rs +++ b/server/src/events/inventory_manip.rs @@ -672,7 +672,11 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv }; let crafted_items = match craft_event { - CraftEvent::Simple { recipe, slots } => recipe_book + CraftEvent::Simple { + recipe, + slots, + amount, + } => recipe_book .get(&recipe) .filter(|r| { if let Some(needed_sprite) = r.craft_sprite { @@ -683,13 +687,21 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv } }) .and_then(|r| { - r.craft_simple( - &mut inventory, - slots, - &state.ecs().read_resource::(), - &state.ecs().read_resource::(), - ) - .ok() + let items = (0..amount) + .into_iter() + .filter_map(|_| { + r.craft_simple( + &mut inventory, + slots.clone(), + &state.ecs().read_resource::(), + &state.ecs().read_resource::(), + ) + .ok() + }) + .flatten() + .collect::>(); + + if items.is_empty() { None } else { Some(items) } }), CraftEvent::Salvage(slot) => { let sprite = get_craft_sprite(state, craft_sprite); diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 9de2389392..c8c91e01e7 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -38,7 +38,7 @@ use hashbrown::HashMap; use i18n::Localization; use std::{borrow::Cow, collections::BTreeMap, sync::Arc}; use strum::{EnumIter, IntoEnumIterator}; -use tracing::warn; +use tracing::{error, warn}; use vek::*; widget_ids! { @@ -61,6 +61,7 @@ widget_ids! { align_ing, scrollbar_ing, btn_craft, + btn_craft_all, recipe_list_btns[], recipe_list_labels[], recipe_list_quality_indicators[], @@ -96,7 +97,10 @@ widget_ids! { } pub enum Event { - CraftRecipe(String), + CraftRecipe { + recipe_name: String, + amount: u32, + }, CraftModularWeapon { primary_slot: InvSlotId, secondary_slot: InvSlotId, @@ -1355,7 +1359,7 @@ impl<'a> Widget for Crafting<'a> { .label_font_size(self.fonts.cyri.scale(12)) .label_font_id(self.fonts.cyri.conrod_id) .image_color(can_perform.then_some(TEXT_COLOR).unwrap_or(TEXT_GRAY_COLOR)) - .mid_bottom_with_margin_on(state.ids.align_ing, -31.0) + .bottom_left_with_margins_on(state.ids.align_ing, -31.0, 15.0) .parent(state.ids.window_frame) .set(state.ids.btn_craft, ui) .was_clicked() @@ -1381,10 +1385,62 @@ impl<'a> Widget for Crafting<'a> { }); } }, - RecipeKind::Simple => events.push(Event::CraftRecipe(recipe_name)), + RecipeKind::Simple => events.push(Event::CraftRecipe { + recipe_name, + amount: 1, + }), } } + // Craft All button + let can_perform_all = can_perform && matches!(recipe_kind, RecipeKind::Simple); + if Button::image(self.imgs.button) + .w_h(105.0, 25.0) + .hover_image( + can_perform + .then_some(self.imgs.button_hover) + .unwrap_or(self.imgs.button), + ) + .press_image( + can_perform + .then_some(self.imgs.button_press) + .unwrap_or(self.imgs.button), + ) + .label(&self.localized_strings.get("hud.crafting.craft_all")) + .label_y(conrod_core::position::Relative::Scalar(1.0)) + .label_color( + can_perform_all + .then_some(TEXT_COLOR) + .unwrap_or(TEXT_GRAY_COLOR), + ) + .label_font_size(self.fonts.cyri.scale(12)) + .label_font_id(self.fonts.cyri.conrod_id) + .image_color( + can_perform_all + .then_some(TEXT_COLOR) + .unwrap_or(TEXT_GRAY_COLOR), + ) + .bottom_right_with_margins_on(state.ids.align_ing, -31.0, 15.0) + .parent(state.ids.window_frame) + .set(state.ids.btn_craft_all, ui) + .was_clicked() + && can_perform_all + { + if let (RecipeKind::Simple, Some(selected_recipe)) = + (recipe_kind, &state.selected_recipe) + { + let amount = recipe.max_from_ingredients(self.inventory); + if amount > 0 { + events.push(Event::CraftRecipe { + recipe_name: selected_recipe.to_string(), + amount, + }); + } + } else { + error!("State shows no selected recipe when trying to craft multiple."); + } + }; + // Crafting Station Info if recipe.craft_sprite.is_some() { Text::new( diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 1f4520b767..3c7f322347 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -538,8 +538,9 @@ pub enum Event { Quit, CraftRecipe { - recipe: String, + recipe_name: String, craft_sprite: Option<(Vec3, SpriteKind)>, + amount: u32, }, SalvageItem { slot: InvSlotId, @@ -2912,10 +2913,14 @@ impl Hud { .set(self.ids.crafting_window, ui_widgets) { match event { - crafting::Event::CraftRecipe(recipe) => { + crafting::Event::CraftRecipe { + recipe_name, + amount, + } => { events.push(Event::CraftRecipe { - recipe, + recipe_name, craft_sprite: self.show.crafting_fields.craft_sprite, + amount, }); }, crafting::Event::CraftModularWeapon { diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 60b682073b..21e97b1dec 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -1541,26 +1541,30 @@ impl PlayState for SessionState { }, HudEvent::CraftRecipe { - recipe, + recipe_name: recipe, craft_sprite, + amount, } => { let slots = { let client = self.client.borrow(); if let Some(recipe) = client.recipe_book().get(&recipe) { - client - .inventories() - .get(client.entity()) - .and_then(|inv| recipe.inventory_contains_ingredients(inv).ok()) + client.inventories().get(client.entity()).and_then(|inv| { + recipe.inventory_contains_ingredients(inv, 1).ok() + }) } else { None } }; if let Some(slots) = slots { - self.client - .borrow_mut() - .craft_recipe(&recipe, slots, craft_sprite); + self.client.borrow_mut().craft_recipe( + &recipe, + slots, + craft_sprite, + amount, + ); } }, + HudEvent::CraftModularWeapon { primary_slot, secondary_slot, @@ -1572,6 +1576,7 @@ impl PlayState for SessionState { craft_sprite, ); }, + HudEvent::CraftModularWeaponComponent { toolkind, material, From 4ccec12dc788c282abb3dce073074ace7138a7f5 Mon Sep 17 00:00:00 2001 From: flo Date: Fri, 12 Aug 2022 11:34:40 +0000 Subject: [PATCH 059/854] DesertCity small fix --- world/src/site2/plot/desert_city_multiplot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/world/src/site2/plot/desert_city_multiplot.rs b/world/src/site2/plot/desert_city_multiplot.rs index 7d5b36d07a..d44df5ff28 100644 --- a/world/src/site2/plot/desert_city_multiplot.rs +++ b/world/src/site2/plot/desert_city_multiplot.rs @@ -679,7 +679,7 @@ impl Structure for DesertCityMultiPlot { // Tower base painter .aabb(Aabb { - min: (tower_center - tower.length - 1).with_z(base), + min: (tower_center - tower.length - 1).with_z(base - 10), max: (tower_center + tower.length + 1).with_z(base + 6), }) .fill(sandstone.clone()); From 50274fbc0c78ae25609408dbc57a954c58d931cb Mon Sep 17 00:00:00 2001 From: IsseW Date: Fri, 12 Aug 2022 20:26:16 +0200 Subject: [PATCH 060/854] add newline to flashing lights option --- voxygen/src/render/renderer/pipeline_creation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/render/renderer/pipeline_creation.rs b/voxygen/src/render/renderer/pipeline_creation.rs index 4ffbff967f..c755caa829 100644 --- a/voxygen/src/render/renderer/pipeline_creation.rs +++ b/voxygen/src/render/renderer/pipeline_creation.rs @@ -212,7 +212,7 @@ impl ShaderModules { } if pipeline_modes.flashing_lights_enabled { - constants += "#define FLASHING_LIGHTS_ENABLED"; + constants += "#define FLASHING_LIGHTS_ENABLED\n"; } for shader in pipeline_modes.experimental_shaders.iter() { From daadf3abdb0138eca58bbdf6833f77fa55ea4fc8 Mon Sep 17 00:00:00 2001 From: DaforLynx Date: Sun, 14 Aug 2022 01:57:58 +0000 Subject: [PATCH 061/854] Gnarling Fort music; more specific sites; fix music spacing; new sfx --- assets/voxygen/audio/ambience/cave.ogg | 3 + assets/voxygen/audio/ambience/leaves.ogg | 4 +- assets/voxygen/audio/ambience/rain.ogg | 4 +- assets/voxygen/audio/ambience/thunder.ogg | 4 +- assets/voxygen/audio/ambience/wind.ogg | 4 +- assets/voxygen/audio/ambient.ron | 5 + .../audio/music_transition_manifest.ron | 2 +- assets/voxygen/audio/sfx.ron | 24 +- .../audio/sfx/abilities/minotaur_smash_1.ogg | 4 +- .../audio/sfx/abilities/minotaur_smash_2.ogg | 4 +- .../audio/sfx/abilities/sceptre_aura.ogg | 2 +- assets/voxygen/audio/sfx/weapon/sword_in.ogg | 4 +- assets/voxygen/audio/sfx/weapon/sword_out.ogg | 4 +- assets/voxygen/audio/sfx/weapon/weapon_in.ogg | 3 + .../voxygen/audio/sfx/weapon/weapon_out.ogg | 3 + assets/voxygen/audio/soundtrack.ron | 250 ++++++++++++------ .../soundtrack/town/fiesta_del_pueblo.ogg | 4 +- client/src/lib.rs | 25 +- common/src/terrain/mod.rs | 18 +- common/src/terrain/site.rs | 23 +- voxygen/src/audio/ambient.rs | 33 ++- voxygen/src/audio/channel.rs | 1 + voxygen/src/audio/music.rs | 24 +- voxygen/src/hud/settings_window/sound.rs | 22 +- voxygen/src/main.rs | 1 + voxygen/src/session/settings_change.rs | 4 +- world/src/lib.rs | 9 +- world/src/site/economy/context.rs | 31 +-- world/src/site/mod.rs | 17 ++ 29 files changed, 343 insertions(+), 193 deletions(-) create mode 100644 assets/voxygen/audio/ambience/cave.ogg create mode 100644 assets/voxygen/audio/sfx/weapon/weapon_in.ogg create mode 100644 assets/voxygen/audio/sfx/weapon/weapon_out.ogg diff --git a/assets/voxygen/audio/ambience/cave.ogg b/assets/voxygen/audio/ambience/cave.ogg new file mode 100644 index 0000000000..bb34ed0105 --- /dev/null +++ b/assets/voxygen/audio/ambience/cave.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3294852d2d03198c758054a44b74fd82f914b2d7a16a9de654b5beebddda850 +size 864823 diff --git a/assets/voxygen/audio/ambience/leaves.ogg b/assets/voxygen/audio/ambience/leaves.ogg index c9579003e9..e5913ea56e 100644 --- a/assets/voxygen/audio/ambience/leaves.ogg +++ b/assets/voxygen/audio/ambience/leaves.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ddab0aace204faf42c8832a7f7819c8f44e89f075673347762460d0d4f0ab1c -size 454229 +oid sha256:a6bfc0f7b39fdda422c4e6cd3808ccb1212ee3344d01dbaf0094f9645da96ca8 +size 456305 diff --git a/assets/voxygen/audio/ambience/rain.ogg b/assets/voxygen/audio/ambience/rain.ogg index f8d3570d79..7191df4cc1 100644 --- a/assets/voxygen/audio/ambience/rain.ogg +++ b/assets/voxygen/audio/ambience/rain.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8a6062ad150d11cd40439f3e87881448069092b9f26a1ef3a60cb710a5b5320 -size 328599 +oid sha256:84acdfcf00650c82a437e89e2f25bc8c2acd82de315f7d131ca80c3f73d9347e +size 330675 diff --git a/assets/voxygen/audio/ambience/thunder.ogg b/assets/voxygen/audio/ambience/thunder.ogg index 3a214838cb..d1ed8e6301 100644 --- a/assets/voxygen/audio/ambience/thunder.ogg +++ b/assets/voxygen/audio/ambience/thunder.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c1d9844b1eefb7ae0d3fdeea6407ed1c2da54fc7e4b89f2d57db38e16f17d3d -size 269156 +oid sha256:9ca77de5adcb89616fa887cf1aef6b77a04a483daf1c3e3b10857b2db9f40501 +size 271232 diff --git a/assets/voxygen/audio/ambience/wind.ogg b/assets/voxygen/audio/ambience/wind.ogg index 4f450abcff..7529ae49c7 100644 --- a/assets/voxygen/audio/ambience/wind.ogg +++ b/assets/voxygen/audio/ambience/wind.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6f415e8d7699ca5e89c0aaa778717b56a250301e6daff626e1a42337fdc1d6c -size 257436 +oid sha256:4affdf3e9dfbc426cca20355c7ce6eaf6e8affb1327e89d43a45c35a44689c95 +size 259512 diff --git a/assets/voxygen/audio/ambient.ron b/assets/voxygen/audio/ambient.ron index 768f2ab049..052e1c6d5f 100644 --- a/assets/voxygen/audio/ambient.ron +++ b/assets/voxygen/audio/ambient.ron @@ -20,5 +20,10 @@ length: 26.0, tag: Leaves, ), + ( + path:"voxygen.audio.ambience.cave", + length: 75.5, + tag: Cave, + ) ] ) diff --git a/assets/voxygen/audio/music_transition_manifest.ron b/assets/voxygen/audio/music_transition_manifest.ron index c205d8d667..252d3626ef 100644 --- a/assets/voxygen/audio/music_transition_manifest.ron +++ b/assets/voxygen/audio/music_transition_manifest.ron @@ -1,6 +1,6 @@ ( combat_nearby_radius: 25.0, - combat_health_factor: 50.0, + combat_health_factor: 70.0, combat_nearby_high_thresh: 4, combat_nearby_low_thresh: 4, fade_timings: { diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index 68059aaa3f..ecd3f5bb22 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -348,13 +348,13 @@ // Wield(Hammer): ( files: [ - "voxygen.audio.sfx.weapon.sword_out", + "voxygen.audio.sfx.weapon.weapon_out", ], threshold: 0.5, ), Unwield(Hammer): ( files: [ - "voxygen.audio.sfx.weapon.sword_in", + "voxygen.audio.sfx.weapon.weapon_in", ], threshold: 0.5, ), @@ -388,13 +388,13 @@ // Wield(Axe): ( files: [ - "voxygen.audio.sfx.weapon.sword_out", + "voxygen.audio.sfx.weapon.weapon_out", ], threshold: 0.5, ), Unwield(Axe): ( files: [ - "voxygen.audio.sfx.weapon.sword_in", + "voxygen.audio.sfx.weapon.weapon_in", ], threshold: 0.5, ), @@ -434,13 +434,13 @@ // Wield(Staff): ( files: [ - "voxygen.audio.sfx.weapon.sword_out", + "voxygen.audio.sfx.weapon.staff_out", ], threshold: 0.5, ), Unwield(Staff): ( files: [ - "voxygen.audio.sfx.weapon.sword_in", + "voxygen.audio.sfx.weapon.staff_in", ], threshold: 0.5, ), @@ -468,13 +468,13 @@ // Wield(Bow): ( files: [ - "voxygen.audio.sfx.weapon.sword_out", + "voxygen.audio.sfx.weapon.weapon_out", ], threshold: 0.5, ), Unwield(Bow): ( files: [ - "voxygen.audio.sfx.weapon.sword_in", + "voxygen.audio.sfx.weapon.weapon_in", ], threshold: 0.5, ), @@ -496,13 +496,13 @@ // Wield(Sceptre): ( files: [ - "voxygen.audio.sfx.weapon.sword_out", + "voxygen.audio.sfx.weapon.staff_out", ], threshold: 0.5, ), Unwield(Sceptre): ( files: [ - "voxygen.audio.sfx.weapon.sword_in", + "voxygen.audio.sfx.weapon.staff_in", ], threshold: 0.5, ), @@ -514,7 +514,7 @@ ), Inventory(CollectedTool(Sceptre)): ( files: [ - "voxygen.audio.sfx.inventory.add_item", + "voxygen.audio.sfx.inventory.pickup_staff", ], threshold: 0.3, ), @@ -564,7 +564,7 @@ ), Unwield(Shield): ( files: [ - "voxygen.audio.sfx.weapon.sword_in", + "voxygen.audio.sfx.weapon.weapon_in", ], threshold: 0.5, ), diff --git a/assets/voxygen/audio/sfx/abilities/minotaur_smash_1.ogg b/assets/voxygen/audio/sfx/abilities/minotaur_smash_1.ogg index bd31e209d4..ad55edf7c0 100644 --- a/assets/voxygen/audio/sfx/abilities/minotaur_smash_1.ogg +++ b/assets/voxygen/audio/sfx/abilities/minotaur_smash_1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9972ac391a94b0e815d667c7efeb49d5dda09f6e6eaaebd5f4989defa49b1573 -size 15485 +oid sha256:2dc7014e26b172e71e6852044f954d4cd3a68416954c44ccf5c4cf4433ca51b9 +size 17561 diff --git a/assets/voxygen/audio/sfx/abilities/minotaur_smash_2.ogg b/assets/voxygen/audio/sfx/abilities/minotaur_smash_2.ogg index 35f4af1a45..147061fe8d 100644 --- a/assets/voxygen/audio/sfx/abilities/minotaur_smash_2.ogg +++ b/assets/voxygen/audio/sfx/abilities/minotaur_smash_2.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a89ff1f4324fda9e415adbcac2b5ea5c14c8c2c441f034ee6a0b61d1fcebffbc -size 15723 +oid sha256:494b1d27832d1914018d3a836beb68c7a87b327ac8a0b8677bf8709f075e394f +size 17799 diff --git a/assets/voxygen/audio/sfx/abilities/sceptre_aura.ogg b/assets/voxygen/audio/sfx/abilities/sceptre_aura.ogg index a7a73fc64a..0b1adfc0f8 100644 --- a/assets/voxygen/audio/sfx/abilities/sceptre_aura.ogg +++ b/assets/voxygen/audio/sfx/abilities/sceptre_aura.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b77307ab81bbe75aba8d7769cd3fd655c29e504007acfe13be0625771c71d38d +oid sha256:cdea478be085a7dcecf61ed37f1b0bdd14d06b83923d8482d641bd3e8a5b2bb9 size 41869 diff --git a/assets/voxygen/audio/sfx/weapon/sword_in.ogg b/assets/voxygen/audio/sfx/weapon/sword_in.ogg index 1bbd8002e4..79ceb41a36 100644 --- a/assets/voxygen/audio/sfx/weapon/sword_in.ogg +++ b/assets/voxygen/audio/sfx/weapon/sword_in.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0c64e54b5edc7cfe276904c9127031adc14e5ae13ae94c9338ec570a463a5cd -size 8581 +oid sha256:820afbeaa4572ff8346a6728b413c0f429f6d6ac050875a7b9cfb097c4293cc4 +size 10336 diff --git a/assets/voxygen/audio/sfx/weapon/sword_out.ogg b/assets/voxygen/audio/sfx/weapon/sword_out.ogg index e3c5da409e..26adf17d44 100644 --- a/assets/voxygen/audio/sfx/weapon/sword_out.ogg +++ b/assets/voxygen/audio/sfx/weapon/sword_out.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:68470c859ca239508ee44fa6b9c140221bd63620157dd8973df19aef92d5a19c -size 8523 +oid sha256:1127184858bbf1c0b87d72c2aaaa7074a7027669700334731e0971d57d5b3bcf +size 16252 diff --git a/assets/voxygen/audio/sfx/weapon/weapon_in.ogg b/assets/voxygen/audio/sfx/weapon/weapon_in.ogg new file mode 100644 index 0000000000..1bbd8002e4 --- /dev/null +++ b/assets/voxygen/audio/sfx/weapon/weapon_in.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0c64e54b5edc7cfe276904c9127031adc14e5ae13ae94c9338ec570a463a5cd +size 8581 diff --git a/assets/voxygen/audio/sfx/weapon/weapon_out.ogg b/assets/voxygen/audio/sfx/weapon/weapon_out.ogg new file mode 100644 index 0000000000..e3c5da409e --- /dev/null +++ b/assets/voxygen/audio/sfx/weapon/weapon_out.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68470c859ca239508ee44fa6b9c140221bd63620157dd8973df19aef92d5a19c +size 8523 diff --git a/assets/voxygen/audio/soundtrack.ron b/assets/voxygen/audio/soundtrack.ron index c776cf6436..2f20c0d2b9 100644 --- a/assets/voxygen/audio/soundtrack.ron +++ b/assets/voxygen/audio/soundtrack.ron @@ -1,15 +1,17 @@ -// Times: Some(Day), Some(Night), None [both] +// Times: Some(Day or Night) or None [both] +// Weathers: Some(Clear, Cloudy, Rain, or Storm) or None [any weather] // Biomes: Grassland, Forest, Desert, Snowland, Lake, Mountain, Ocean, Jungle, Savannah, Taiga // planned biomes: Swamp -// Number after biome indicates weighting -// Sites: Some(Settlement), Some(Cave), Some(Dungeon), Some(Void) [none] -// Music states: Activity(Explore), Activity(Combat) +// Number after biome indicates weighting; higher numbers are less frequent +// Sites: Settlement(Default, Cliff, or Desert), Cave, Dungeon(Old or Gnarling), or Void [none] +// Music states: Activity(Explore or Combat) // Combat music is looped. Needs three files: start, loop, and end. Start contains leadup to the loop. // It's recommended to also have appropriate metadata for those who listen via the game files :) ( tracks: - [ + [ + // Overworld exploration tracks Individual(( @@ -17,10 +19,11 @@ path: "voxygen.audio.soundtrack.overworld.the_undergrowth", length: 165.0, timing: None, + weather: None, biomes: [ (Jungle, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Oolnokk", )), @@ -29,11 +32,12 @@ path: "voxygen.audio.soundtrack.overworld.moonlit_canopy", length: 170.0, timing: Some(Night), + weather: None, biomes: [ - (Forest, 2), + (Forest, 1), (Taiga, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "GeekyGami", )), @@ -42,11 +46,12 @@ path: "voxygen.audio.soundtrack.overworld.adventurous_soul", length: 184.0, timing: Some(Night), + weather: None, biomes: [ (Mountain, 1), (Snowland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Crow", )), @@ -55,59 +60,62 @@ path: "voxygen.audio.soundtrack.overworld.stargazing", length: 216.0, timing: Some(Night), + weather: None, biomes: [ (Taiga, 1), (Grassland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "GeekyGami", )), Individual(( title: "The Heavens Weep", path: "voxygen.audio.soundtrack.overworld.the_heavens_weep", - length: 209.0, + length: 210.0, timing: None, weather: Some(Rain), biomes: [], - site: None, + sites: [Void], music_state: Activity(Explore), artist: "Oolnokk", )), Individual(( title: "A Hero's Sorrow", path: "voxygen.audio.soundtrack.overworld.a_heros_sorrow", - length: 251.0, + length: 252.0, timing: None, weather: Some(Rain), biomes: [], - site: None, + sites: [Void], music_state: Activity(Explore), artist: "Oolnokk", )), Individual(( title: "Follow the Signs", - path: "voxygen.audio.soundtrack.town.follow_the_signs", + path: "voxygen.audio.soundtrack.overworld.follow_the_signs", length: 154.0, timing: Some(Night), + weather: None, biomes: [ - (Forest, 1), - (Taiga, 1), + (Forest, 2), + (Taiga, 2), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Oolnokk", )), Individual(( title: "Travel By Night", - path: "voxygen.audio.soundtrack.town.travel_by_night", + path: "voxygen.audio.soundtrack.overworld.travel_by_night", length: 66.0, timing: Some(Night), + weather: None, biomes: [ - (Forest, 2), + (Forest, 1), (Taiga, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Oolnokk", )), @@ -116,11 +124,12 @@ path: "voxygen.audio.soundtrack.overworld.raising_below_like_thunder", length: 120.0, timing: Some(Night), + weather: None, biomes: [ (Desert, 1), (Savannah, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Rarnage", )), @@ -133,7 +142,7 @@ biomes: [ (Mountain, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Ultimafounding; mixed by Robotnik", )), @@ -144,9 +153,9 @@ timing: Some(Day), weather: None, biomes: [ - (Forest, 2), + (Forest, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "DaforLynx", )), @@ -159,7 +168,7 @@ biomes: [ (Jungle, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "badbbad", )), @@ -172,7 +181,7 @@ biomes: [ (Mountain, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -186,7 +195,7 @@ (Ocean, 1), (Lake, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -200,7 +209,7 @@ (Desert, 1), (Savannah, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "badbbad", )), @@ -213,7 +222,7 @@ biomes: [ (Grassland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -227,7 +236,7 @@ (Grassland, 1), (Savannah, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Ultimafounding", )), @@ -241,7 +250,7 @@ (Lake, 1), (Ocean, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "DaforLynx", )), @@ -254,7 +263,7 @@ biomes: [ (Snowland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "DaforLynx", )), @@ -268,7 +277,7 @@ (Desert, 1), (Mountain, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Ap1evideogame", )), @@ -282,7 +291,7 @@ (Lake, 1), (Ocean, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Eden", )), @@ -293,10 +302,10 @@ timing: Some(Night), weather: None, biomes: [ - (Forest, 2), + (Forest, 1), (Taiga, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Eden", )), @@ -307,9 +316,9 @@ timing: Some(Night), weather: None, biomes: [ - (Forest, 2), + (Forest, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -321,9 +330,9 @@ weather: None, biomes: [ (Grassland, 1), - (Forest, 2), + (Forest, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -336,7 +345,7 @@ biomes: [ (Grassland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -349,7 +358,7 @@ biomes: [ (Snowland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -362,7 +371,7 @@ biomes: [ (Snowland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -375,7 +384,7 @@ biomes: [ (Grassland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "Aeronic", )), @@ -388,7 +397,7 @@ biomes: [ (Grassland, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "badbbad", )), @@ -399,10 +408,10 @@ timing: Some(Night), weather: None, biomes: [ - (Forest, 2), + (Forest, 1), (Taiga, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "badbbad", )), @@ -416,7 +425,7 @@ (Mountain, 1), (Taiga, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "badbbad", )), @@ -427,10 +436,10 @@ timing: Some(Day), weather: None, biomes: [ - (Forest, 2), + (Forest, 1), (Taiga, 1), ], - site: Some(Void), + sites: [Void], music_state: Activity(Explore), artist: "badbbad", )), @@ -442,11 +451,15 @@ path: "voxygen.audio.soundtrack.town.life_of_a_background_mob", length: 234.0, timing: Some(Day), + weather: None, biomes: [ - (Forest, 2), + (Forest, 1), (Grassland, 1), ], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + ], music_state: Activity(Explore), artist: "GeekyGami", )), @@ -455,8 +468,13 @@ path: "voxygen.audio.soundtrack.town.warmth_of_the_hearth", length: 156.0, timing: Some(Night), + weather: None, biomes:[], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + Settlement(Desert), + ], music_state: Activity(Explore), artist: "Crow", )), @@ -465,8 +483,13 @@ path: "voxygen.audio.soundtrack.town.the_quiet_after_the_battle", length: 240.0, timing: Some(Night), + weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + Settlement(Desert), + ], music_state: Activity(Explore), artist: "Tobias Thy - (Thy SFX)", )), @@ -475,8 +498,12 @@ path: "voxygen.audio.soundtrack.town.a_rest_under_the_sunset", length: 83.0, timing: Some(Day), + weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + ], music_state: Activity(Explore), artist: "phoenix13032005", )), @@ -485,8 +512,13 @@ path: "voxygen.audio.soundtrack.town.a_tale_worth_telling", length: 279.0, timing: Some(Night), + weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + Settlement(Desert), + ], music_state: Activity(Explore), artist: "Oolnokk; mixed by cereal7", )), @@ -495,8 +527,12 @@ path: "voxygen.audio.soundtrack.town.bustle_and_bloom", length: 155.0, timing: Some(Day), + weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + ], music_state: Activity(Explore), artist: "DaforLynx", )), @@ -505,21 +541,26 @@ path: "voxygen.audio.soundtrack.town.starlit_pathways", length: 132.0, timing: Some(Night), + weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + Settlement(Desert), + ], music_state: Activity(Explore), artist: "DaforLynx", )), Individual(( title: "Fiesta Del Pueblo", path: "voxygen.audio.soundtrack.town.fiesta_del_pueblo", - length: 183.0, + length: 96.0, timing: Some(Day), weather: None, - biomes: [ - (Desert, 1) + biomes: [], + sites: [ + Settlement(Desert), ], - site: Some(Settlement), music_state: Activity(Explore), artist: "Aeronic; mixed by Robotnik", )), @@ -530,7 +571,10 @@ timing: Some(Day), weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + ], music_state: Activity(Explore), artist: "badbbad", )), @@ -541,7 +585,10 @@ timing: Some(Night), weather: None, biomes: [], - site: Some(Settlement), + sites: [ + Settlement(Default), + Settlement(Cliff), + ], music_state: Activity(Explore), artist: "badbbad", )), @@ -553,8 +600,9 @@ path: "voxygen.audio.soundtrack.cave.stars_like_stalactites", length: 130.0, timing: None, + weather: None, biomes: [], - site: Some(Cave), + sites: [Cave], music_state: Activity(Explore), artist: "DragonDee", )), @@ -563,8 +611,9 @@ path: "voxygen.audio.soundtrack.cave.cavernous_hollow", length: 256.0, timing: None, + weather: None, biomes: [], - site: Some(Cave), + sites: [Cave], music_state: Activity(Explore), artist: "GeekyGami", )), @@ -575,7 +624,7 @@ timing: None, weather: None, biomes: [], - site: Some(Cave), + sites: [Cave], music_state: Activity(Explore), artist: "Flashbang", )), @@ -586,7 +635,7 @@ timing: None, weather: None, biomes: [], - site: Some(Cave), + sites: [Cave], music_state: Activity(Explore), artist: "Aeronic", )), @@ -597,19 +646,23 @@ timing: None, weather: None, biomes: [], - site: Some(Cave), + sites: [Cave], music_state: Activity(Explore), artist: "badbbad", )), // Dungeon music + Individual(( title: "Mysty Temple", path: "voxygen.audio.soundtrack.dungeon.mysty_temple", length: 183.0, timing: None, + weather: None, biomes:[], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], music_state: Activity(Explore), artist: "Tiny", )), @@ -618,8 +671,11 @@ path: "voxygen.audio.soundtrack.dungeon.cobbled_halls", length: 240.0, timing: None, + weather: None, biomes:[], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], music_state: Activity(Explore), artist: "Crow", )), @@ -630,7 +686,9 @@ timing: None, weather: None, biomes: [], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], music_state: Activity(Explore), artist: "Aeronic", )), @@ -641,7 +699,9 @@ timing: None, weather: None, biomes: [], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], music_state: Activity(Explore), artist: "Aeronic", )), @@ -652,7 +712,9 @@ timing: None, weather: None, biomes: [], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], music_state: Activity(Explore), artist: "Aeronic", )), @@ -663,10 +725,38 @@ timing: None, weather: None, biomes: [], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], music_state: Activity(Explore), artist: "Aeronic", )), + Individual(( + title: "The Undergrowth", + path: "voxygen.audio.soundtrack.overworld.the_undergrowth", + length: 165.0, + timing: None, + weather: None, + biomes: [], + sites: [ + Dungeon(Gnarling), + ], + music_state: Activity(Explore), + artist: "Oolnokk", + )), + Individual(( + title: "Jungle Ambient", + path: "voxygen.audio.soundtrack.overworld.jungle_ambient", + length: 218.0, + timing: None, + weather: None, + biomes: [], + sites: [ + Dungeon(Gnarling), + ], + music_state: Activity(Explore), + artist: "badbbad", + )), // Combat Music @@ -675,7 +765,9 @@ timing: None, weather: None, biomes: [], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], segments: [ ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-start", 56.0, Transition(Explore, Combat(High)), Some(Combat(High))), ("voxygen.audio.soundtrack.combat.barred_paths.barred_paths-loop", 54.0, Activity(Combat(High)), None), @@ -688,7 +780,9 @@ timing: None, weather: None, biomes: [], - site: Some(Dungeon), + sites: [ + Dungeon(Old), + ], segments: [ ("voxygen.audio.soundtrack.combat.reversal.reversal-start", 60.0, Transition(Explore, Combat(High)), Some(Combat(High))), ("voxygen.audio.soundtrack.combat.reversal.reversal-loop", 60.0, Activity(Combat(High)), None), diff --git a/assets/voxygen/audio/soundtrack/town/fiesta_del_pueblo.ogg b/assets/voxygen/audio/soundtrack/town/fiesta_del_pueblo.ogg index b57f961d37..0f8a6f8833 100644 --- a/assets/voxygen/audio/soundtrack/town/fiesta_del_pueblo.ogg +++ b/assets/voxygen/audio/soundtrack/town/fiesta_del_pueblo.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7869931bfb6c1fc657a4f1ee4476d4c365a1983e655bd96ad8d3fc785b9598bc -size 1966645 +oid sha256:823fea48fbf34547b279e753e70e76cfbc00c5f637f3eedab4067f9a17aab876 +size 1804826 diff --git a/client/src/lib.rs b/client/src/lib.rs index a0a8240f21..861582512f 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -42,8 +42,8 @@ use common::{ resources::{PlayerEntity, TimeOfDay}, spiral::Spiral2d, terrain::{ - block::Block, map::MapConfig, neighbors, BiomeKind, SitesKind, SpriteKind, TerrainChunk, - TerrainChunkSize, + block::Block, map::MapConfig, neighbors, site::DungeonKindMeta, BiomeKind, SiteKindMeta, + SpriteKind, TerrainChunk, TerrainChunkSize, }, trade::{PendingTrade, SitePrices, TradeAction, TradeId, TradeResult}, uid::{Uid, UidAllocator}, @@ -1517,31 +1517,30 @@ impl Client { } } - pub fn current_site(&self) -> SitesKind { + pub fn current_site(&self) -> SiteKindMeta { let mut player_alt = 0.0; if let Some(position) = self.current::() { player_alt = position.0.z; } //let mut contains_cave = false; let mut terrain_alt = 0.0; - let mut contains_dungeon = false; - let mut contains_settlement = false; + let mut site = None; if let Some(chunk) = self.current_chunk() { terrain_alt = chunk.meta().alt(); //contains_cave = chunk.meta().contains_cave(); - contains_dungeon = chunk.meta().contains_dungeon(); - contains_settlement = chunk.meta().contains_settlement(); + site = chunk.meta().site(); } if player_alt < terrain_alt - 40.0 { - if contains_dungeon { - SitesKind::Dungeon + if let Some(SiteKindMeta::Dungeon(dungeon)) = site { + SiteKindMeta::Dungeon(dungeon) } else { - SitesKind::Cave + SiteKindMeta::Cave } - } else if contains_settlement { - SitesKind::Settlement + } else if matches!(site, Some(SiteKindMeta::Dungeon(DungeonKindMeta::Old))) { + // If the player is in a dungeon chunk but aboveground, pass Void instead + SiteKindMeta::Void } else { - SitesKind::Void + site.unwrap_or_default() } } diff --git a/common/src/terrain/mod.rs b/common/src/terrain/mod.rs index 79645b4d30..c49cdf7968 100644 --- a/common/src/terrain/mod.rs +++ b/common/src/terrain/mod.rs @@ -11,7 +11,7 @@ pub use self::{ biome::BiomeKind, block::{Block, BlockKind}, map::MapSizeLg, - site::SitesKind, + site::SiteKindMeta, sprite::SpriteKind, structure::{Structure, StructuresGroup}, }; @@ -89,8 +89,7 @@ pub struct TerrainChunkMeta { river_velocity: Vec3, temp: f32, humidity: f32, - contains_settlement: bool, - contains_dungeon: bool, + site: Option, } impl TerrainChunkMeta { @@ -104,8 +103,7 @@ impl TerrainChunkMeta { river_velocity: Vec3, temp: f32, humidity: f32, - contains_settlement: bool, - contains_dungeon: bool, + site: Option, ) -> Self { Self { name, @@ -117,8 +115,7 @@ impl TerrainChunkMeta { river_velocity, temp, humidity, - contains_settlement, - contains_dungeon, + site, } } @@ -133,8 +130,7 @@ impl TerrainChunkMeta { river_velocity: Vec3::zero(), temp: 0.0, humidity: 0.0, - contains_settlement: false, - contains_dungeon: false, + site: None, } } @@ -152,9 +148,7 @@ impl TerrainChunkMeta { pub fn river_velocity(&self) -> Vec3 { self.river_velocity } - pub fn contains_settlement(&self) -> bool { self.contains_settlement } - - pub fn contains_dungeon(&self) -> bool { self.contains_dungeon } + pub fn site(&self) -> Option { self.site } pub fn temp(&self) -> f32 { self.temp } diff --git a/common/src/terrain/site.rs b/common/src/terrain/site.rs index 2156de3664..b1652df67c 100644 --- a/common/src/terrain/site.rs +++ b/common/src/terrain/site.rs @@ -1,10 +1,27 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] -pub enum SitesKind { - Dungeon, +pub enum SiteKindMeta { + Dungeon(DungeonKindMeta), Cave, - Settlement, + Settlement(SettlementKindMeta), Castle, Void, } + +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +pub enum DungeonKindMeta { + Old, + Gnarling, +} + +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +pub enum SettlementKindMeta { + Default, + Cliff, + Desert, +} + +impl Default for SiteKindMeta { + fn default() -> SiteKindMeta { SiteKindMeta::Void } +} diff --git a/voxygen/src/audio/ambient.rs b/voxygen/src/audio/ambient.rs index a2d90b71de..9dcce968b4 100644 --- a/voxygen/src/audio/ambient.rs +++ b/voxygen/src/audio/ambient.rs @@ -6,6 +6,7 @@ use crate::{ use client::Client; use common::{ assets::{self, AssetExt, AssetHandle}, + terrain::site::SiteKindMeta, vol::ReadVol, }; use common_state::State; @@ -57,6 +58,7 @@ impl AmbientMgr { AmbientChannelTag::Rain => 0.1, AmbientChannelTag::Thunder => 0.1, AmbientChannelTag::Leaves => 0.05, + AmbientChannelTag::Cave => 0.1, } && audio.get_ambient_channel(tag).is_none() { @@ -109,10 +111,11 @@ impl AmbientMgr { impl AmbientChannelTag { pub fn tag_max_volume(tag: AmbientChannelTag) -> f32 { match tag { - AmbientChannelTag::Wind => 1.15, + AmbientChannelTag::Wind => 1.0, AmbientChannelTag::Rain => 0.95, AmbientChannelTag::Thunder => 1.33, AmbientChannelTag::Leaves => 1.33, + AmbientChannelTag::Cave => 1.0, } } @@ -205,6 +208,25 @@ impl AmbientChannelTag { 0.0 } }, + AmbientChannelTag::Cave => { + let focus_off = camera.get_focus_pos().map(f32::trunc); + let cam_pos = camera.dependents().cam_pos + focus_off; + + let terrain_alt = if let Some(chunk) = client.current_chunk() { + chunk.meta().alt() + } else { + 0.0 + }; + + // When the camera is roughly above ground, don't play cave sounds + let camera_multiplier = (-(cam_pos.z - terrain_alt) / 100.0).max(0.0); + + if client.current_site() == SiteKindMeta::Cave { + camera_multiplier + } else { + 0.0 + } + }, } } } @@ -237,8 +259,13 @@ fn get_target_volume( } // Is the camera underneath the terrain? Fade out the lower it goes beneath. - (volume_multiplier * ((cam_pos.z - terrain_alt) / 40.0 + 1.0).clamped(0.0, 1.0)) - .min(AmbientChannelTag::tag_max_volume(tag)) + // Unless, of course, the player is in a cave. + if tag != AmbientChannelTag::Cave { + (volume_multiplier * ((cam_pos.z - terrain_alt) / 50.0 + 1.0).clamped(0.0, 1.0)) + .min(AmbientChannelTag::tag_max_volume(tag)) + } else { + volume_multiplier.min(AmbientChannelTag::tag_max_volume(tag)) + } } pub fn load_ambience_items() -> AssetHandle { diff --git a/voxygen/src/audio/channel.rs b/voxygen/src/audio/channel.rs index d446a431dd..8e82f45e9d 100644 --- a/voxygen/src/audio/channel.rs +++ b/voxygen/src/audio/channel.rs @@ -165,6 +165,7 @@ pub enum AmbientChannelTag { Rain, Thunder, Leaves, + Cave, } /// A AmbientChannel uses a non-positional audio sink designed to play sounds diff --git a/voxygen/src/audio/music.rs b/voxygen/src/audio/music.rs index 0b9b55845c..9dc682f4d4 100644 --- a/voxygen/src/audio/music.rs +++ b/voxygen/src/audio/music.rs @@ -47,7 +47,7 @@ use crate::audio::{AudioFrontend, MusicChannelTag}; use client::Client; use common::{ assets::{self, AssetExt, AssetHandle}, - terrain::{BiomeKind, SitesKind}, + terrain::{BiomeKind, SiteKindMeta}, weather::WeatherKind, }; use common_state::State; @@ -84,7 +84,7 @@ pub struct SoundtrackItem { /// What biomes this track should play in with chance of play biomes: Vec<(BiomeKind, u8)>, /// Whether this track should play in a specific site - site: Option, + sites: Vec, /// What the player is doing when the track is played (i.e. exploring, /// combat) music_state: MusicState, @@ -105,7 +105,7 @@ enum RawSoundtrackItem { timing: Option, weather: Option, biomes: Vec<(BiomeKind, u8)>, - site: Option, + sites: Vec, segments: Vec<(String, f32, MusicState, Option)>, artist: String, }, @@ -346,15 +346,15 @@ impl MusicMgr { if spacing_multiplier > f32::EPSILON { silence_between_tracks_seconds = if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) - && matches!(client.current_site(), SitesKind::Settlement) + && matches!(client.current_site(), SiteKindMeta::Settlement(_)) { rng.gen_range(120.0 * spacing_multiplier..180.0 * spacing_multiplier) } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) - && matches!(client.current_site(), SitesKind::Dungeon) + && matches!(client.current_site(), SiteKindMeta::Dungeon(_)) { rng.gen_range(10.0 * spacing_multiplier..20.0 * spacing_multiplier) } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) - && matches!(client.current_site(), SitesKind::Cave) + && matches!(client.current_site(), SiteKindMeta::Cave) { rng.gen_range(20.0 * spacing_multiplier..40.0 * spacing_multiplier) } else if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) { @@ -389,14 +389,12 @@ impl MusicMgr { (match &track.timing { Some(period_of_day) => period_of_day == ¤t_period_of_day, None => true, - }) && match &track.site { - Some(site) => site == ¤t_site, - None => true, - } && match &track.weather { + }) && match &track.weather { Some(weather) => weather == ¤t_weather.get_kind(), None => true, } }) + .filter(|track| track.sites.iter().any(|s| s == ¤t_site)) .filter(|track| { track.biomes.is_empty() || track.biomes.iter().any(|b| b.0 == current_biome) }) @@ -444,7 +442,7 @@ impl MusicMgr { .biomes .iter() .find(|b| b.0 == current_biome) - .map_or(1, |b| b.1) + .map_or(1.0, |b| (1.0_f32 / (b.1 as f32))) }); debug!( "selecting new track for {:?}: {:?}", @@ -515,7 +513,7 @@ impl assets::Compound for SoundtrackCollection { timing, weather, biomes, - site, + sites, segments, artist, } => { @@ -527,7 +525,7 @@ impl assets::Compound for SoundtrackCollection { timing: timing.clone(), weather, biomes: biomes.clone(), - site, + sites: sites.clone(), music_state, activity_override, artist: artist.clone(), diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index e02bf118b1..0ce9c106bc 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -34,9 +34,9 @@ widget_ids! { ambience_volume_text, ambience_volume_slider, ambience_volume_number, - music_frequency_text, - music_frequency_slider, - music_frequency_number, + music_spacing_text, + music_spacing_slider, + music_spacing_number, //audio_device_list, //audio_device_text, reset_sound_button, @@ -290,12 +290,12 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.ambience_volume_number, ui); // Music spacing - Text::new(&self.localized_strings.get("hud.settings.music_frequency")) + Text::new(&self.localized_strings.get("hud.settings.music_spacing")) .down_from(state.ids.ambience_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) - .set(state.ids.music_frequency_text, ui); + .set(state.ids.music_spacing_text, ui); // Music spacing Slider if let Some(new_val) = ImageSlider::continuous( self.global_state.settings.audio.music_spacing, @@ -305,24 +305,24 @@ impl<'a> Widget for Sound<'a> { self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.music_frequency_text, 10.0) + .down_from(state.ids.music_spacing_text, 10.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) - .set(state.ids.music_frequency_slider, ui) + .set(state.ids.music_spacing_slider, ui) { - events.push(AdjustMusicFrequency(new_val)); + events.push(AdjustMusicSpacing(new_val)); } // Music spacing Number Text::new(&format!( "{:1.2}x", self.global_state.settings.audio.music_spacing )) - .right_from(state.ids.music_frequency_slider, 8.0) + .right_from(state.ids.music_spacing_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) - .set(state.ids.music_frequency_number, ui); + .set(state.ids.music_spacing_number, ui); // Audio Device Selector // -------------------------------------------- @@ -356,7 +356,7 @@ impl<'a> Widget for Sound<'a> { .w_h(RESET_BUTTONS_WIDTH, RESET_BUTTONS_HEIGHT) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .down_from(state.ids.music_frequency_slider, 12.0) + .down_from(state.ids.music_spacing_slider, 12.0) .label(&self.localized_strings.get("hud.settings.reset_sound")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 7d5567889b..5fea8fbaec 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -234,6 +234,7 @@ fn main() { audio.set_music_volume(settings.audio.music_volume); audio.set_sfx_volume(settings.audio.sfx_volume); audio.set_ambience_volume(settings.audio.ambience_volume); + audio.set_music_spacing(settings.audio.music_spacing); // Load the profile. let profile = Profile::load(&config_dir); diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index aefaaec8b3..cfbe3e89f4 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -23,7 +23,7 @@ pub enum Audio { AdjustMusicVolume(f32), AdjustSfxVolume(f32), AdjustAmbienceVolume(f32), - AdjustMusicFrequency(f32), + AdjustMusicSpacing(f32), //ChangeAudioDevice(String), ResetAudioSettings, } @@ -209,7 +209,7 @@ impl SettingsChange { settings.audio.ambience_volume = ambience_volume; }, - Audio::AdjustMusicFrequency(multiplier) => { + Audio::AdjustMusicSpacing(multiplier) => { global_state.audio.set_music_spacing(multiplier); settings.audio.music_spacing = multiplier; diff --git a/world/src/lib.rs b/world/src/lib.rs index 8478859664..7ce7e3defc 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -39,6 +39,7 @@ pub use crate::{ }; pub use block::BlockGen; pub use column::ColumnSample; +pub use common::terrain::site::{DungeonKindMeta, SettlementKindMeta}; pub use index::{IndexOwned, IndexRef}; use crate::{ @@ -304,16 +305,10 @@ impl World { sim_chunk.river.velocity, sim_chunk.temp, sim_chunk.humidity, - sim_chunk.sites.iter().any(|site| { - matches!( - index.sites[*site].kind, - SiteKind::Refactor(_) | SiteKind::CliffTown(_) | SiteKind::DesertCity(_) - ) - }), sim_chunk .sites .iter() - .any(|site| matches!(index.sites[*site].kind, SiteKind::Dungeon(_))), + .find_map(|site| index.sites[*site].kind.convert_to_meta()), ); let mut chunk = TerrainChunk::new(base_z, stone, air, meta); diff --git a/world/src/site/economy/context.rs b/world/src/site/economy/context.rs index 8c8b3d2206..4d6f2250db 100644 --- a/world/src/site/economy/context.rs +++ b/world/src/site/economy/context.rs @@ -262,7 +262,14 @@ fn tick(index: &mut Index, dt: f32, _env: &mut Environment) { #[cfg(test)] mod tests { use crate::{sim, util::seed_expan}; - use common::{store::Id, terrain::BiomeKind, trade::Good}; + use common::{ + store::Id, + terrain::{ + site::{DungeonKindMeta, SiteKindMeta}, + BiomeKind, + }, + trade::Good, + }; use hashbrown::HashMap; use rand::SeedableRng; use rand_chacha::ChaChaRng; @@ -294,7 +301,7 @@ mod tests { struct EconomySetup { name: String, position: (i32, i32), - kind: common::terrain::site::SitesKind, + kind: common::terrain::site::SiteKindMeta, neighbors: Vec, // id resources: Vec, } @@ -381,21 +388,7 @@ mod tests { position: (i.get_origin().x, i.get_origin().y), resources, neighbors, - kind: match i.kind { - crate::site::SiteKind::Settlement(_) - | crate::site::SiteKind::Refactor(_) - | crate::site::SiteKind::CliffTown(_) - | crate::site::SiteKind::DesertCity(_) => { - common::terrain::site::SitesKind::Settlement - }, - crate::site::SiteKind::Dungeon(_) => { - common::terrain::site::SitesKind::Dungeon - }, - crate::site::SiteKind::Castle(_) => { - common::terrain::site::SitesKind::Castle - }, - _ => common::terrain::site::SitesKind::Void, - }, + kind: i.kind.convert_to_meta().unwrap_or_default(), }; outarr.push(val); } @@ -419,10 +412,10 @@ mod tests { // loading on demand using the public API. There is no way to set // the name, do we care? let mut settlement = match i.kind { - common::terrain::site::SitesKind::Castle => crate::site::Site::castle( + SiteKindMeta::Castle => crate::site::Site::castle( crate::site::Castle::generate(wpos, None, &mut rng), ), - common::terrain::site::SitesKind::Dungeon => { + SiteKindMeta::Dungeon(DungeonKindMeta::Old) => { crate::site::Site::dungeon(crate::site2::Site::generate_dungeon( &crate::Land::empty(), &mut rng, diff --git a/world/src/site/mod.rs b/world/src/site/mod.rs index 559130790f..3665f9f375 100644 --- a/world/src/site/mod.rs +++ b/world/src/site/mod.rs @@ -10,6 +10,8 @@ pub use self::{ block_mask::BlockMask, castle::Castle, economy::Economy, settlement::Settlement, tree::Tree, }; +pub use common::terrain::site::{DungeonKindMeta, SettlementKindMeta, SiteKindMeta}; + use crate::{column::ColumnSample, site2, Canvas}; use common::generation::ChunkSupplement; use rand::Rng; @@ -260,3 +262,18 @@ impl Site { ) } } + +impl SiteKind { + pub fn convert_to_meta(&self) -> Option { + match self { + SiteKind::Refactor(_) | SiteKind::Settlement(_) => { + Some(SiteKindMeta::Settlement(SettlementKindMeta::Default)) + }, + SiteKind::CliffTown(_) => Some(SiteKindMeta::Settlement(SettlementKindMeta::Cliff)), + SiteKind::DesertCity(_) => Some(SiteKindMeta::Settlement(SettlementKindMeta::Desert)), + SiteKind::Dungeon(_) => Some(SiteKindMeta::Dungeon(DungeonKindMeta::Old)), + SiteKind::Gnarling(_) => Some(SiteKindMeta::Dungeon(DungeonKindMeta::Gnarling)), + _ => None, + } + } +} From 4c49cb933ef733f333dd073ef7a4101ed0a1e52d Mon Sep 17 00:00:00 2001 From: flo Date: Sun, 14 Aug 2022 20:22:30 +0000 Subject: [PATCH 062/854] add campfires to clifftown and desertcity --- world/src/site2/mod.rs | 10 ++++++++-- world/src/site2/plot/cliff_tower.rs | 8 ++++++++ world/src/site2/plot/desert_city_multiplot.rs | 13 +++++++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/world/src/site2/mod.rs b/world/src/site2/mod.rs index 9ed7badcf8..eb12c761c0 100644 --- a/world/src/site2/mod.rs +++ b/world/src/site2/mod.rs @@ -744,17 +744,17 @@ impl Site { pub fn generate_cliff_town(land: &Land, rng: &mut impl Rng, origin: Vec2) -> Self { let mut rng = reseed(rng); - let mut site = Site { origin, name: NameGen::location(&mut rng).generate_arabic(), ..Site::default() }; - + let mut campfires = 0; site.make_plaza(land, &mut rng); for _ in 0..30 { // CliffTower let size = (6.0 + rng.gen::().powf(5.0) * 1.0).round() as u32; + let campfire = campfires < 4; if let Some((aabr, door_tile, door_dir)) = attempt(32, || { site.find_roadside_aabr(&mut rng, 6..(size + 1).pow(2), Extent2::broadcast(size)) }) { @@ -765,6 +765,7 @@ impl Site { door_tile, door_dir, aabr, + campfire, ); let cliff_tower_alt = cliff_tower.alt; let plot = site.create_plot(Plot { @@ -779,6 +780,7 @@ impl Site { plot: Some(plot), hard_alt: Some(cliff_tower_alt), }); + campfires += 1; } else { site.make_plaza(land, &mut rng); } @@ -803,12 +805,14 @@ impl Site { let build_chance = Lottery::from(vec![(20.0, 1), (10.0, 2)]); let mut temples = 0; + let mut campfires = 0; for _ in 0..30 { match *build_chance.choose_seeded(rng.gen()) { // DesertCityMultiplot 1 => { let size = (9.0 + rng.gen::().powf(5.0) * 1.5).round() as u32; + let campfire = campfires < 4; if let Some((aabr, door_tile, door_dir)) = attempt(32, || { site.find_roadside_aabr( &mut rng, @@ -823,6 +827,7 @@ impl Site { door_tile, door_dir, aabr, + campfire, ); let desert_city_multi_plot_alt = desert_city_multi_plot.alt; let plot = site.create_plot(Plot { @@ -837,6 +842,7 @@ impl Site { plot: Some(plot), hard_alt: Some(desert_city_multi_plot_alt), }); + campfires += 1; } else { site.make_plaza(land, &mut rng); } diff --git a/world/src/site2/plot/cliff_tower.rs b/world/src/site2/plot/cliff_tower.rs index 648a989f25..90ecd5c784 100644 --- a/world/src/site2/plot/cliff_tower.rs +++ b/world/src/site2/plot/cliff_tower.rs @@ -17,6 +17,7 @@ pub struct CliffTower { bounds: Aabr, /// Approximate altitude of the door tile pub(crate) alt: i32, + campfire: bool, } impl CliffTower { @@ -27,6 +28,7 @@ impl CliffTower { door_tile: Vec2, door_dir: Vec2, tile_aabr: Aabr, + campfire: bool, ) -> Self { let bounds = Aabr { min: site.tile_wpos(tile_aabr.min), @@ -35,6 +37,7 @@ impl CliffTower { Self { bounds, alt: land.get_alt_approx(site.tile_center_wpos(door_tile + door_dir)) as i32, + campfire, } } } @@ -894,5 +897,10 @@ impl Structure for CliffTower { mem::swap(&mut length, &mut width); mem::swap(&mut stair_pos1, &mut stair_pos2); } + // spawn campfire next to some clifftowers + if self.campfire { + let campfire_pos = (center - 20).with_z(self.alt + 18); + painter.spawn(EntityInfo::at(campfire_pos.map(|e| e as f32)).into_waypoint()); + } } } diff --git a/world/src/site2/plot/desert_city_multiplot.rs b/world/src/site2/plot/desert_city_multiplot.rs index d44df5ff28..7325b12168 100644 --- a/world/src/site2/plot/desert_city_multiplot.rs +++ b/world/src/site2/plot/desert_city_multiplot.rs @@ -5,8 +5,9 @@ use crate::{ util::{RandomField, Sampler, DIAGONALS, NEIGHBORS}, Land, }; -use common::terrain::{ - Block, BlockKind, SpriteKind, Structure as PrefabStructure, StructuresGroup, +use common::{ + generation::EntityInfo, + terrain::{Block, BlockKind, SpriteKind, Structure as PrefabStructure, StructuresGroup}, }; use lazy_static::lazy_static; use rand::prelude::*; @@ -44,6 +45,7 @@ pub struct DesertCityMultiPlot { pub(crate) alt: i32, diameter: i32, plot_kind: PlotKind, + campfire: bool, } impl DesertCityMultiPlot { @@ -54,6 +56,7 @@ impl DesertCityMultiPlot { door_tile: Vec2, door_dir: Vec2, tile_aabr: Aabr, + campfire: bool, ) -> Self { let bounds = Aabr { min: site.tile_wpos(tile_aabr.min), @@ -120,6 +123,7 @@ impl DesertCityMultiPlot { alt: land.get_alt_approx(site.tile_center_wpos(door_tile + door_dir)) as i32, diameter, plot_kind, + campfire, } } } @@ -2407,6 +2411,11 @@ impl Structure for DesertCityMultiPlot { }, } } + // spawn campfire in some multiplots that are not markethall + let campfire_pos = (center).with_z(base + 1); + if self.campfire { + painter.spawn(EntityInfo::at(campfire_pos.map(|e| e as f32)).into_waypoint()) + } }, } } From 689376ec70ae03e413d58f3576546f955fda64c4 Mon Sep 17 00:00:00 2001 From: IsseW Date: Fri, 12 Aug 2022 10:52:11 +0200 Subject: [PATCH 063/854] save spectate position --- client/src/lib.rs | 27 +++++++++++++++------------ voxygen/src/profile.rs | 38 ++++++++++++++++++++++++++++++++++++++ voxygen/src/session/mod.rs | 33 +++++++++++++++++++++++++++------ 3 files changed, 80 insertions(+), 18 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 861582512f..72e3fe913d 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -30,7 +30,7 @@ use common::{ slot::{EquipSlot, InvSlotId, Slot}, CharacterState, ChatMode, ControlAction, ControlEvent, Controller, ControllerInputs, GroupManip, InputKind, InventoryAction, InventoryEvent, InventoryUpdateEvent, - MapMarkerChange, Pos, UtteranceKind, + MapMarkerChange, UtteranceKind, }, event::{EventBus, LocalEvent}, grid::Grid, @@ -106,6 +106,7 @@ pub enum Event { CharacterEdited(CharacterId), CharacterError(String), MapMarker(comp::MapMarkerUpdate), + StartSpectate(Vec3), SpectatePosition(Vec3), } @@ -881,7 +882,7 @@ impl Client { pub fn request_character(&mut self, character_id: CharacterId) { self.send_msg(ClientGeneral::Character(character_id)); - //Assume we are in_game unless server tells us otherwise + // Assume we are in_game unless server tells us otherwise self.presence = Some(PresenceKind::Character(character_id)); } @@ -889,7 +890,6 @@ impl Client { pub fn request_spectate(&mut self) { self.send_msg(ClientGeneral::Spectate); - //Assume we are in_game unless server tells us otherwise self.presence = Some(PresenceKind::Spectator); } @@ -1348,16 +1348,24 @@ impl Client { self.send_msg(ClientGeneral::UpdateMapMarker(event)); } - pub fn spectate_position(&mut self, pos: Vec3) { - if let Some(position) = self + /// Set the current position to spectate, returns true if the client's + /// player has a Pos component to write to. + pub fn spectate_position(&mut self, pos: Vec3) -> bool { + let write = if let Some(position) = self .state .ecs() .write_storage::() .get_mut(self.entity()) { position.0 = pos; + true + } else { + false + }; + if write { + self.send_msg(ClientGeneral::SpectatePosition(pos)); } - self.send_msg(ClientGeneral::SpectatePosition(pos)); + write } /// Checks whether a player can swap their weapon+ability `Loadout` settings @@ -2346,12 +2354,7 @@ impl Client { }, ServerGeneral::SpectatorSuccess(spawn_point) => { if let Some(vd) = self.view_distance { - self.state - .ecs() - .write_storage() - .insert(self.entity(), Pos(spawn_point)) - .expect("This shouldn't exist"); - events.push(Event::SpectatePosition(spawn_point)); + events.push(Event::StartSpectate(spawn_point)); debug!("client is now in ingame state on server"); self.set_view_distance(vd); } diff --git a/voxygen/src/profile.rs b/voxygen/src/profile.rs index 226e132243..3cd2c54676 100644 --- a/voxygen/src/profile.rs +++ b/voxygen/src/profile.rs @@ -37,6 +37,8 @@ pub struct ServerProfile { pub characters: HashMap, /// Selected character in the chararacter selection screen pub selected_character: Option, + /// Last spectate position + pub spectate_position: Option>, } impl Default for ServerProfile { @@ -44,6 +46,7 @@ impl Default for ServerProfile { ServerProfile { characters: HashMap::new(), selected_character: None, + spectate_position: None, } } } @@ -192,6 +195,41 @@ impl Profile { .selected_character = selected_character; } + /// Get the selected_character for the provided server. + /// + /// if the server does not exist then the default spectate_position (None) + /// is returned. + /// + /// # Arguments + /// + /// * server - current server the player is on. + pub fn get_spectate_position(&self, server: &str) -> Option> { + self.servers + .get(server) + .map(|s| s.spectate_position) + .unwrap_or_default() + } + + /// Set the spectate_position for the provided server. + /// + /// If the server does not exist then the appropriate fields + /// will be initialised and the selected_character added. + /// + /// # Arguments + /// + /// * server - current server the player is on. + /// * spectate_position - option containing the position we're spectating + pub fn set_spectate_position( + &mut self, + server: &str, + spectate_position: Option>, + ) { + self.servers + .entry(server.to_string()) + .or_insert(ServerProfile::default()) + .spectate_position = spectate_position; + } + /// Save the current profile to disk. fn save_to_file(&self, config_dir: &Path) -> std::io::Result<()> { let path = Profile::get_path(config_dir); diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 21e97b1dec..40d5ed54ae 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -368,6 +368,22 @@ impl SessionState { client::Event::MapMarker(event) => { self.hud.show.update_map_markers(event); }, + client::Event::StartSpectate(spawn_point) => { + let server_name = &client.server_info().name; + let spawn_point = global_state + .profile + .get_spectate_position(server_name) + .unwrap_or(spawn_point); + + client + .state() + .ecs() + .write_storage() + .insert(client.entity(), Pos(spawn_point)) + .expect("This shouldn't exist"); + + self.scene.camera_mut().force_focus_pos(spawn_point); + }, client::Event::SpectatePosition(pos) => { self.scene.camera_mut().force_focus_pos(pos); }, @@ -493,7 +509,14 @@ impl PlayState for SessionState { drop(client); if presence == PresenceKind::Spectator { - self.client.borrow_mut().spectate_position(cam_pos); + let mut client = self.client.borrow_mut(); + if client.spectate_position(cam_pos) { + let server_name = &client.server_info().name; + global_state.profile.set_spectate_position( + server_name, + Some(self.scene.camera().get_focus_pos()), + ); + } } // Nearest block to consider with GameInput primary or secondary key. @@ -906,11 +929,9 @@ impl PlayState for SessionState { let client = self.client.borrow(); camera.next_mode( client.is_moderator(), - client - .presence() - .map(|presence| presence != PresenceKind::Spectator) - .unwrap_or(true) - || self.viewpoint_entity.is_some(), + client.presence().map_or(true, |presence| { + presence != PresenceKind::Spectator + }) || self.viewpoint_entity.is_some(), ); }, GameInput::Select => { From 9b7a67c80e82e2893c3a44dd9c781239af1b92ec Mon Sep 17 00:00:00 2001 From: IsseW Date: Fri, 12 Aug 2022 11:12:19 +0200 Subject: [PATCH 064/854] fix viewpoint rotation --- voxygen/src/scene/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index ecfe524e3e..4dfb0efd9d 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -562,7 +562,7 @@ impl Scene { let yaw = siny_cosp.atan2(cosy_cosp); self.camera - .set_orientation_instant(Vec3::new(yaw, pitch, -roll)); + .set_orientation_instant(Vec3::new(-yaw, pitch, roll)); } // Alter camera position to match player. From f77cce68d5a3f8452e0ead2894b085cfea935f99 Mon Sep 17 00:00:00 2001 From: IsseW Date: Fri, 12 Aug 2022 11:51:21 +0200 Subject: [PATCH 065/854] fix viewpoint meshing --- voxygen/src/scene/figure/mod.rs | 44 ++++++++++++++++----------------- voxygen/src/scene/mod.rs | 8 +++--- voxygen/src/session/mod.rs | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 4047e8a142..4d1684dbc6 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -5706,7 +5706,7 @@ impl FigureMgr { } } - pub fn render_player<'a>( + pub fn render_viewpoint<'a>( &'a self, drawer: &mut FigureDrawer<'_, 'a>, state: &State, @@ -5774,7 +5774,7 @@ impl FigureMgr { entity: EcsEntity, body: &Body, inventory: Option<&Inventory>, - is_player: bool, + is_viewpoint: bool, pos: Vec3, figure_lod_render_distance: f32, mut_count: usize, @@ -5783,14 +5783,14 @@ impl FigureMgr { ) -> Option { let body = *body; - let player_camera_mode = if is_player { + let viewpoint_camera_mode = if is_viewpoint { camera.get_mode() } else { CameraMode::default() }; let focus_pos = camera.get_focus_pos(); let cam_pos = camera.dependents().cam_pos + focus_pos.map(|e| e.trunc()); - let character_state = if is_player { character_state } else { None }; + let character_state = if is_viewpoint { character_state } else { None }; let FigureMgr { col_lights: ref col_lights_, @@ -5847,7 +5847,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5864,7 +5864,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5881,7 +5881,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5898,7 +5898,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5915,7 +5915,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5932,7 +5932,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5949,7 +5949,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5966,7 +5966,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -5983,7 +5983,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6000,7 +6000,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6017,7 +6017,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6034,7 +6034,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6051,7 +6051,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6068,7 +6068,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6085,7 +6085,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6102,7 +6102,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, item_key, ), @@ -6121,7 +6121,7 @@ impl FigureMgr { body, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), @@ -6139,7 +6139,7 @@ impl FigureMgr { VolumeKey { entity, mut_count }, inventory, tick, - player_camera_mode, + viewpoint_camera_mode, character_state, None, ), diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 4dfb0efd9d..a059025a47 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -1192,7 +1192,7 @@ impl Scene { &'a self, drawer: &mut Drawer<'a>, state: &State, - player_entity: EcsEntity, + viewpoint_entity: EcsEntity, tick: u64, scene_data: &SceneData, ) { @@ -1251,10 +1251,10 @@ impl Scene { prof_span!(guard, "main pass"); if let Some(mut first_pass) = drawer.first_pass() { - self.figure_mgr.render_player( + self.figure_mgr.render_viewpoint( &mut first_pass.draw_figures(), state, - player_entity, + viewpoint_entity, tick, camera_data, ); @@ -1264,7 +1264,7 @@ impl Scene { self.figure_mgr.render( &mut first_pass.draw_figures(), state, - player_entity, + viewpoint_entity, tick, camera_data, ); diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 40d5ed54ae..d2d65bbb8b 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -1794,7 +1794,7 @@ impl PlayState for SessionState { self.scene.render( drawer, client.state(), - client.entity(), + viewpoint_entity, client.get_tick(), &scene_data, ); From 911be0113db197c791c9341b1aa1e5646d993099 Mon Sep 17 00:00:00 2001 From: IsseW Date: Fri, 12 Aug 2022 12:12:21 +0200 Subject: [PATCH 066/854] camera movement changes --- voxygen/src/session/mod.rs | 44 ++++++++++++-------------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index d2d65bbb8b..fe8320d78e 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -81,7 +81,6 @@ pub struct SessionState { selected_block: Block, walk_forward_dir: Vec2, walk_right_dir: Vec2, - freefly_vel: Vec3, free_look: bool, auto_walk: bool, camera_clamp: bool, @@ -143,7 +142,6 @@ impl SessionState { selected_block: Block::new(BlockKind::Misc, Rgb::broadcast(255)), walk_forward_dir, walk_right_dir, - freefly_vel: Vec3::zero(), free_look: false, auto_walk: false, camera_clamp: false, @@ -1112,46 +1110,32 @@ impl PlayState for SessionState { self.inputs.move_dir = self.walk_right_dir * axis_right + self.walk_forward_dir * axis_up; } - self.freefly_vel = Vec3::zero(); }, CameraMode::Freefly => { // Move the camera freely in 3d space. Apply acceleration so that // the movement feels more natural and controlled. - const FREEFLY_ACCEL: f32 = 120.0; - const FREEFLY_DAMPING: f32 = 80.0; - const FREEFLY_MAX_SPEED: f32 = 50.0; + const FREEFLY_SPEED: f32 = 50.0; const FREEFLY_SPEED_BOOST: f32 = 5.0; - let forward = self.scene.camera().forward(); - let right = self.scene.camera().right(); - let dir = right * axis_right + forward * axis_up; + let forward = self.scene.camera().forward().with_z(0.0).normalized(); + let right = self.scene.camera().right().with_z(0.0).normalized(); + let up = Vec3::unit_z(); + let up_axis = self.key_state.swim_up as i32 as f32 + - self.key_state.swim_down as i32 as f32; - if self.freefly_vel.magnitude_squared() > 0.01 { - let new_vel = self.freefly_vel - - self.freefly_vel.normalized() * (FREEFLY_DAMPING * dt); - if self.freefly_vel.dot(new_vel) > 0.0 { - self.freefly_vel = new_vel; + let dir = (right * axis_right + forward * axis_up + up * up_axis).normalized(); + + let speed = FREEFLY_SPEED + * if self.inputs_state.contains(&GameInput::SpectateSpeedBoost) { + FREEFLY_SPEED_BOOST } else { - self.freefly_vel = Vec3::zero(); - } - } - if dir.magnitude_squared() > 0.01 { - self.freefly_vel += dir * (FREEFLY_ACCEL * dt); - if self.freefly_vel.magnitude() > FREEFLY_MAX_SPEED { - self.freefly_vel = self.freefly_vel.normalized() * FREEFLY_MAX_SPEED; - } - } - - let boost = if self.inputs_state.contains(&GameInput::SpectateSpeedBoost) { - FREEFLY_SPEED_BOOST - } else { - 1.0 - }; + 1.0 + }; let pos = self.scene.camera().get_focus_pos(); self.scene .camera_mut() - .set_focus_pos(pos + self.freefly_vel * dt * boost); + .set_focus_pos(pos + dir * dt * speed); // Do not apply any movement to the player character self.inputs.move_dir = Vec2::zero(); From ba87a405af1a0d7ce525e919d21b4e98b79ffdbd Mon Sep 17 00:00:00 2001 From: AldanTanneo Date: Mon, 15 Aug 2022 15:58:37 +0000 Subject: [PATCH 067/854] Discord Activity --- Cargo.lock | 53 +++ assets/voxygen/i18n/en/common.ftl | 4 +- assets/voxygen/i18n/en/hud/settings.ftl | 4 +- server/src/settings.rs | 2 +- voxygen/Cargo.toml | 6 +- voxygen/src/discord.rs | 304 ++++++++++++++++++ voxygen/src/hud/settings_window/gameplay.rs | 39 --- voxygen/src/hud/settings_window/mod.rs | 15 + voxygen/src/hud/settings_window/networking.rs | 263 +++++++++++++++ voxygen/src/hud/settings_window/video.rs | 42 +-- voxygen/src/lib.rs | 4 + voxygen/src/main.rs | 9 + voxygen/src/menu/char_selection/mod.rs | 3 + voxygen/src/menu/main/mod.rs | 3 + voxygen/src/run.rs | 4 + voxygen/src/session/mod.rs | 32 +- voxygen/src/session/settings_change.rs | 80 +++-- voxygen/src/settings/gameplay.rs | 2 - voxygen/src/settings/graphics.rs | 2 - voxygen/src/settings/networking.rs | 6 + 20 files changed, 767 insertions(+), 110 deletions(-) create mode 100644 voxygen/src/discord.rs create mode 100644 voxygen/src/hud/settings_window/networking.rs diff --git a/Cargo.lock b/Cargo.lock index db53b9c45f..806adaee44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,6 +128,24 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "anyhow" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8" + +[[package]] +name = "app_dirs2" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3564c46eaa62f4a4e50c98e2c698cbb95f95c08501bd2e3baf6ea73773ab9fc" +dependencies = [ + "jni", + "ndk-context", + "winapi 0.3.9", + "xdg", +] + [[package]] name = "approx" version = "0.3.2" @@ -1567,6 +1585,31 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" +[[package]] +name = "discord-sdk" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e314b59ba110cb4fad80073f5276eb62cda4cc3caabe998f5d664b19fd6a7be0" +dependencies = [ + "anyhow", + "app_dirs2", + "async-trait", + "base64", + "bitflags", + "crossbeam-channel", + "num-traits", + "parking_lot 0.12.0", + "serde", + "serde_json", + "serde_repr", + "thiserror", + "time 0.3.9", + "tokio", + "tracing", + "url", + "winreg", +] + [[package]] name = "dispatch" version = "0.1.4" @@ -6806,6 +6849,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-utils 0.8.8", "directories-next", + "discord-sdk", "dispatch 0.1.4", "dot_vox", "egui", @@ -7797,6 +7841,15 @@ dependencies = [ "x11-dl", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winres" version = "0.1.12" diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl index f3ff34b9b8..8314927865 100644 --- a/assets/voxygen/i18n/en/common.ftl +++ b/assets/voxygen/i18n/en/common.ftl @@ -11,6 +11,7 @@ common-controls = Controls common-video = Graphics common-sound = Sound common-chat = Chat +common-networking = Networking common-resume = Resume common-characters = Characters common-close = Close @@ -40,6 +41,7 @@ common-video_settings = Graphics Settings common-sound_settings = Sound Settings common-language_settings = Language Settings common-chat_settings = Chat Settings +common-networking_settings = Networking Settings common-connection_lost = Connection lost! Did the server restart? @@ -105,4 +107,4 @@ common-material-wood = Wood common-material-stone = Stone common-material-cloth = Cloth common-material-hide = Hide -common-sprite-chest = Chest \ No newline at end of file +common-sprite-chest = Chest diff --git a/assets/voxygen/i18n/en/hud/settings.ftl b/assets/voxygen/i18n/en/hud/settings.ftl index 635299cc8b..97d5df9064 100644 --- a/assets/voxygen/i18n/en/hud/settings.ftl +++ b/assets/voxygen/i18n/en/hud/settings.ftl @@ -132,4 +132,6 @@ hud-settings-region = Region hud-settings-say = Say hud-settings-all = All hud-settings-group_only = Group only -hud-settings-reset_chat = Reset to Defaults \ No newline at end of file +hud-settings-reset_chat = Reset to Defaults +hud-settings-third_party_integrations = Third-party Integrations +hud-settings-enable_discord_integration = Enable Discord Integration diff --git a/server/src/settings.rs b/server/src/settings.rs index 896dc8df7f..b762f1f2ba 100644 --- a/server/src/settings.rs +++ b/server/src/settings.rs @@ -201,7 +201,7 @@ impl Default for Settings { metrics_address: SocketAddr::from((Ipv4Addr::LOCALHOST, 14005)), auth_server_address: Some("https://auth.veloren.net".into()), world_seed: DEFAULT_WORLD_SEED, - server_name: "Veloren Alpha".into(), + server_name: "Veloren Server".into(), max_players: 100, start_time: 9.0 * 3600.0, map_file: None, diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index cce9a89b39..ab62c523cf 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -32,9 +32,10 @@ tracy-memory = ["tracy"] # enables heap profiling with tracy plugins = ["client/plugins"] egui-ui = ["voxygen-egui", "egui", "egui_wgpu_backend", "egui_winit_platform"] shaderc-from-source = ["shaderc/build-from-source"] +discord = ["discord-sdk"] # We don't ship egui with published release builds so a separate feature is required that excludes it. -default-publish = ["singleplayer", "native-dialog", "plugins", "simd"] +default-publish = ["singleplayer", "native-dialog", "plugins", "simd", "discord"] # Temp for bug on current wgpu version that has access violation in vulkan when constructing egui pipeline default-no-egui = ["default-publish", "hot-reloading", "shaderc-from-source"] default = ["default-no-egui", "egui-ui"] @@ -131,6 +132,9 @@ itertools = "0.10.0" tracing = "0.1" profiling = { version = "1.0.6", default-features = false, optional = true } +# Discord RPC +discord-sdk = { version = "0.3.0", optional = true } + [target.'cfg(target_os = "macos")'.dependencies] dispatch = "0.1.4" diff --git a/voxygen/src/discord.rs b/voxygen/src/discord.rs new file mode 100644 index 0000000000..434024625f --- /dev/null +++ b/voxygen/src/discord.rs @@ -0,0 +1,304 @@ +use std::time::{Duration, SystemTime}; + +use common::terrain::SiteKindMeta; +use discord_sdk::{ + self as ds, activity, + activity::{ActivityArgs, ActivityBuilder}, +}; +use tokio::{ + sync::mpsc::{unbounded_channel, UnboundedSender}, + time::{interval, MissedTickBehavior}, +}; +use tracing::{debug, info, warn}; + +/// Discord app id +/// +/// **Note:** currently a private app created for testing purposes, can be +/// shared to a team or replaced entirely later on +const DISCORD_APP_ID: ds::AppId = 1006661232465563698; + +/// Discord presence update command +#[derive(Debug, Clone)] +pub enum ActivityUpdate { + /// Clear the current Discord activity and exit the activity task + Clear, + /// Set the activity to "In Main Menu" + MainMenu, + /// Set the activity to "In Character Selection" + CharacterSelection, + /// Set the activity to "Playing Singleplayer" + JoinSingleplayer, + /// Set the activity to "Playing Multiplayer" + JoinServer(String), + /// Set the large asset text to the location name + NewLocation { + chunk_name: String, + site: SiteKindMeta, + }, +} + +impl ActivityUpdate { + /// Rich Presence asset keys: the backgrounds used in the main menu and + /// loading screen + /// + /// TODO: randomize images? use them according to the current biome? + const ASSETS: [&'static str; 15] = [ + "bg_main", "bg_1", "bg_2", "bg_3", "bg_4", "bg_5", "bg_6", "bg_7", "bg_8", "bg_9", "bg_10", + "bg_11", "bg_12", "bg_13", "bg_14", + ]; + /// Rich Presence character screen asset key + const CHARACTER_SCREEN_ASSET: &'static str = "character_screen"; + /// Rich Presence logo asset key + const LOGO_ASSET: &'static str = "logo"; + + /// Edit the current activity args according to the command in `self`. + /// + /// - For `MainMenu`, `CharacterSelection`, `JoinSingleplayer` and + /// `JoinServer(name)`: create a new activity and discard the previous one + /// - For `NewLocation` and `LevelUp`: update the current activity + fn edit_activity(self, args: &mut ActivityArgs) { + use ActivityUpdate::*; + + match self { + Clear => (), + MainMenu => { + *args = ActivityBuilder::default() + .start_timestamp(SystemTime::now()) + .state("Idle") + .details("In Main Menu") + .assets( + activity::Assets::default().large(Self::LOGO_ASSET, Option::<&str>::None), + ) + .into(); + }, + CharacterSelection => { + *args = ActivityBuilder::default() + .start_timestamp(SystemTime::now()) + .state("Idle") + .details("In Character Selection") + .assets( + activity::Assets::default() + .large(Self::CHARACTER_SCREEN_ASSET, Option::<&str>::None) + .small(Self::LOGO_ASSET, Option::<&str>::None), + ) + .into(); + }, + JoinSingleplayer => { + *args = ActivityBuilder::default() + .start_timestamp(SystemTime::now()) + .details("Playing Singleplayer") + .assets( + activity::Assets::default() + .large(Self::ASSETS[9], Option::<&str>::None) + .small(Self::LOGO_ASSET, Option::<&str>::None), + ) + .into(); + }, + JoinServer(server_name) => { + *args = ActivityBuilder::default() + .start_timestamp(SystemTime::now()) + .state(format!("On {server_name}")) + .details("Playing Multiplayer") + .assets( + activity::Assets::default() + .large(Self::ASSETS[1], Option::<&str>::None) + .small(Self::LOGO_ASSET, Option::<&str>::None), + ) + .into(); + }, + NewLocation { chunk_name, site } => { + use common::terrain::site::{ + DungeonKindMeta::*, SettlementKindMeta::*, SiteKindMeta::*, + }; + + let location = match site { + Dungeon(Old) => format!("Battling evil in {chunk_name}"), + Dungeon(Gnarling) => format!("Hunting Gnarlings in {chunk_name}"), + Cave => "In a Cave".to_string(), + Settlement(Default) => format!("Visiting {chunk_name}"), + Settlement(Cliff) => format!("Climbing the towers of {chunk_name}"), + Settlement(Desert) => format!("Hiding from the sun in {chunk_name}"), + _ => format!("In {chunk_name}"), + }; + + args.activity.as_mut().map(|a| { + a.assets.as_mut().map(|assets| { + assets.large_text = Some(location); + }) + }); + }, + } + } +} + +/// A channel to the background task that updates the Discord activity. +pub enum Discord { + /// Active state, receiving updates + Active { + /// The channel to communicate with the tokio task + channel: UnboundedSender, + /// Current chunk name, cached to check for updates + current_chunk_name: Option, + /// Current site, cached to check for updates + current_site: SiteKindMeta, + }, + /// Inactive state: either the Discord app could not be contacted, is not + /// installed, or was disconnected + Inactive, +} + +impl Discord { + /// Start a background [tokio task](tokio::task) that will update the + /// Discord activity every 4 seconds (due to rate limits) if it has + /// changed. + /// + /// The [`update`](Discord::update) method can be used on the returned + /// struct to update the Discord activity via a channel command + pub fn start(rt: &tokio::runtime::Runtime) -> Self { + let (sender, mut receiver) = unbounded_channel::(); + + rt.spawn(async move { + let (wheel, handler) = ds::wheel::Wheel::new(Box::new(|err| { + warn!(error = ?err, "Encountered an error while connecting to Discord"); + })); + + let mut user = wheel.user(); + + let discord = match ds::Discord::new( + ds::DiscordApp::PlainId(DISCORD_APP_ID), + ds::Subscriptions::ACTIVITY, + Box::new(handler), + ) { + Ok(ds) => { + if let Err(err) = user.0.changed().await { + warn!(err = ?err, "Could not execute handshake to Discord"); + // If no handshake is received, exit the task immediately + return; + } + info!("Connected to Discord"); + ds + }, + Err(err) => { + info!(err = ?err, "Could not connect to Discord app"); + // If no Discord app was found, exit the task immediately + return; + }, + }; + + let mut args = ActivityArgs::default(); + let mut has_changed = false; + let mut interval = interval(Duration::from_secs(4)); + interval.set_missed_tick_behavior(MissedTickBehavior::Delay); + + loop { + // Check every four seconds if the activity needs to change + tokio::select! { + biased; // to save the CPU cost of selecting a random branch + + _ = interval.tick(), if has_changed => { + has_changed = false; + let activity = args.activity.clone(); + match discord.update_activity(args).await { + Err(err) => { + warn!(error = ?err, "Could not update Discord activity"); + } + Ok(Some(new_activity)) => { + debug!(new_activity = ?new_activity, "Updated Discord activity"); + }, + Ok(None) => () + } + args = ActivityArgs::default(); + args.activity = activity; + } + update = receiver.recv() => match update { + None | Some(ActivityUpdate::Clear) => { + match discord.clear_activity().await { + Ok(_) => { + info!("Cleared Discord activity"); + }, + Err(err) => { + warn!(error = ?err, "Failed to clear Discord activity") + } + } + return; + }, + Some(update) => { + update.edit_activity(&mut args); + has_changed = true; + }, + } + } + } + }); + + Self::Active { + channel: sender, + current_chunk_name: None, + current_site: SiteKindMeta::Void, + } + } + + /// Send an activity update to the background task + #[inline] + fn update(&mut self, update: ActivityUpdate) { + if let Self::Active { channel, .. } = self { + // On error, turn itself into inactive to avoid sending unecessary updates + if channel.send(update).is_err() { + *self = Self::Inactive; + } + } + } + + /// Clear the Discord activity + #[inline] + pub fn clear_activity(&mut self) { + self.update(ActivityUpdate::Clear); + *self = Discord::Inactive; + } + + /// Sets the current Discord activity to Main Menu + #[inline] + pub fn enter_main_menu(&mut self) { self.update(ActivityUpdate::MainMenu); } + + /// Sets the current Discord activity to Character Selection + #[inline] + pub fn enter_character_selection(&mut self) { self.update(ActivityUpdate::CharacterSelection); } + + /// Sets the current Discord activity to Singleplayer + #[inline] + pub fn join_singleplayer(&mut self) { self.update(ActivityUpdate::JoinSingleplayer); } + + /// Sets the current Discord activity to Multiplayer with the corresponding + /// server name + #[inline] + pub fn join_server(&mut self, server_name: String) { + self.update(ActivityUpdate::JoinServer(server_name)); + } + + /// Check the current location name and update it if it has changed + #[inline] + pub fn update_location(&mut self, chunk_name: &str, site: SiteKindMeta) { + if let Self::Active { + current_chunk_name, + current_site, + .. + } = self + { + let different_name = current_chunk_name.as_deref() != Some(chunk_name); + if different_name || *current_site != site { + if different_name { + *current_chunk_name = Some(chunk_name.to_string()); + } + *current_site = site; + self.update(ActivityUpdate::NewLocation { + chunk_name: chunk_name.to_string(), + site, + }); + } + } + } + + /// Check wether the Discord activity is active and receiving updates + #[inline] + pub fn is_active(&self) -> bool { matches!(self, Self::Active { .. }) } +} diff --git a/voxygen/src/hud/settings_window/gameplay.rs b/voxygen/src/hud/settings_window/gameplay.rs index ed79f54f9c..dbffc915cb 100644 --- a/voxygen/src/hud/settings_window/gameplay.rs +++ b/voxygen/src/hud/settings_window/gameplay.rs @@ -44,8 +44,6 @@ widget_ids! { auto_walk_behavior_list, camera_clamp_behavior_text, camera_clamp_behavior_list, - player_physics_behavior_text, - player_physics_behavior_list, stop_auto_walk_on_input_button, stop_auto_walk_on_input_label, auto_camera_button, @@ -440,43 +438,6 @@ impl<'a> Widget for Gameplay<'a> { } } - // Player physics behavior - Text::new( - &self - .localized_strings - .get("hud.settings.player_physics_behavior"), - ) - .down_from(state.ids.auto_walk_behavior_list, 10.0) - .right_from(state.ids.camera_clamp_behavior_text, 118.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.player_physics_behavior_text, ui); - - let player_physics_selected = - self.global_state.settings.gameplay.player_physics_behavior as usize; - - if let Some(clicked) = DropDownList::new( - &["Client-authoritative", "Server-authoritative"], - Some(player_physics_selected), - ) - .w_h(200.0, 30.0) - .color(MENU_BG) - .label_color(TEXT_COLOR) - .label_font_id(self.fonts.cyri.conrod_id) - .down_from(state.ids.player_physics_behavior_text, 8.0) - .set(state.ids.player_physics_behavior_list, ui) - { - match clicked { - 0 => events.push(ChangePlayerPhysicsBehavior { - server_authoritative: false, - }), - _ => events.push(ChangePlayerPhysicsBehavior { - server_authoritative: true, - }), - } - } - // Stop autowalk on input toggle let stop_auto_walk_on_input_toggle = ToggleButton::new( self.global_state.settings.gameplay.stop_auto_walk_on_input, diff --git a/voxygen/src/hud/settings_window/mod.rs b/voxygen/src/hud/settings_window/mod.rs index e5b96980a4..0e4f7d93fe 100644 --- a/voxygen/src/hud/settings_window/mod.rs +++ b/voxygen/src/hud/settings_window/mod.rs @@ -3,6 +3,7 @@ mod controls; mod gameplay; mod interface; mod language; +mod networking; mod sound; mod video; @@ -39,6 +40,7 @@ widget_ids! { sound, language, chat, + networking, } } @@ -54,6 +56,7 @@ pub enum SettingsTab { Gameplay, Controls, Lang, + Networking, } impl SettingsTab { fn name_key(&self) -> &str { @@ -65,6 +68,7 @@ impl SettingsTab { SettingsTab::Video => "common.video", SettingsTab::Sound => "common.sound", SettingsTab::Lang => "common.languages", + SettingsTab::Networking => "common.networking", } } @@ -77,6 +81,7 @@ impl SettingsTab { SettingsTab::Video => "common.video_settings", SettingsTab::Sound => "common.sound_settings", SettingsTab::Lang => "common.language_settings", + SettingsTab::Networking => "common.networking_settings", } } } @@ -321,6 +326,16 @@ impl<'a> Widget for SettingsWindow<'a> { events.push(Event::SettingsChange(change.into())); } }, + SettingsTab::Networking => { + for change in + networking::Networking::new(global_state, imgs, fonts, localized_strings) + .top_left_with_margins_on(state.ids.settings_content_align, 0.0, 0.0) + .wh_of(state.ids.settings_content_align) + .set(state.ids.networking, ui) + { + events.push(Event::SettingsChange(change.into())); + } + }, } events diff --git a/voxygen/src/hud/settings_window/networking.rs b/voxygen/src/hud/settings_window/networking.rs new file mode 100644 index 0000000000..ceb58e9c38 --- /dev/null +++ b/voxygen/src/hud/settings_window/networking.rs @@ -0,0 +1,263 @@ +use crate::{ + hud::{img_ids::Imgs, MENU_BG, TEXT_COLOR}, + session::settings_change::{Networking as NetworkingChange, Networking::*}, + ui::{fonts::Fonts, ImageSlider, ToggleButton}, + GlobalState, +}; +use conrod_core::{ + color, + widget::{self, DropDownList, Rectangle, Text}, + widget_ids, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon, +}; +use i18n::Localization; + +widget_ids! { + struct Ids { + window, + window_r, + vd_text, + vd_slider, + vd_value, + player_physics_behavior_text, + player_physics_behavior_list, + lossy_terrain_compression_button, + lossy_terrain_compression_label, + third_party_integrations_title, + enable_discord_integration_text, + enable_discord_integration_button + } +} + +#[derive(WidgetCommon)] +pub struct Networking<'a> { + global_state: &'a GlobalState, + imgs: &'a Imgs, + fonts: &'a Fonts, + localized_strings: &'a Localization, + #[conrod(common_builder)] + common: widget::CommonBuilder, +} +impl<'a> Networking<'a> { + pub fn new( + global_state: &'a GlobalState, + imgs: &'a Imgs, + fonts: &'a Fonts, + localized_strings: &'a Localization, + ) -> Self { + Self { + global_state, + imgs, + fonts, + localized_strings, + common: widget::CommonBuilder::default(), + } + } +} + +pub struct State { + ids: Ids, +} + +impl<'a> Widget for Networking<'a> { + type Event = Vec; + type State = State; + type Style = (); + + fn init_state(&self, id_gen: widget::id::Generator) -> Self::State { + State { + ids: Ids::new(id_gen), + } + } + + fn style(&self) -> Self::Style {} + + fn update(self, args: widget::UpdateArgs) -> Self::Event { + common_base::prof_span!("Networking::update"); + let widget::UpdateArgs { state, ui, .. } = args; + + let mut events = Vec::new(); + + Rectangle::fill_with(args.rect.dim(), color::TRANSPARENT) + .xy(args.rect.xy()) + .graphics_for(args.id) + .scroll_kids() + .scroll_kids_vertically() + .set(state.ids.window, ui); + Rectangle::fill_with([args.rect.w() / 2.0, args.rect.h()], color::TRANSPARENT) + .top_right() + .parent(state.ids.window) + .set(state.ids.window_r, ui); + + // View Distance + Text::new(&self.localized_strings.get("hud.settings.view_distance")) + .top_left_with_margins_on(state.ids.window, 10.0, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.vd_text, ui); + + if let Some(new_val) = ImageSlider::discrete( + self.global_state.settings.graphics.view_distance, + 1, + 65, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .down_from(state.ids.vd_text, 8.0) + .track_breadth(12.0) + .slider_length(10.0) + .pad_track((5.0, 5.0)) + .set(state.ids.vd_slider, ui) + { + events.push(NetworkingChange::AdjustViewDistance(new_val)); + } + + Text::new(&format!( + "{}", + self.global_state.settings.graphics.view_distance + )) + .right_from(state.ids.vd_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.vd_value, ui); + + // Player physics behavior + Text::new( + &self + .localized_strings + .get("hud.settings.player_physics_behavior"), + ) + .down_from(state.ids.vd_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.player_physics_behavior_text, ui); + + let player_physics_selected = self + .global_state + .settings + .networking + .player_physics_behavior as usize; + + if let Some(clicked) = DropDownList::new( + &["Client-authoritative", "Server-authoritative"], + Some(player_physics_selected), + ) + .w_h(200.0, 30.0) + .color(MENU_BG) + .label_color(TEXT_COLOR) + .label_font_id(self.fonts.cyri.conrod_id) + .down_from(state.ids.player_physics_behavior_text, 8.0) + .set(state.ids.player_physics_behavior_list, ui) + { + match clicked { + 0 => events.push(ChangePlayerPhysicsBehavior { + server_authoritative: false, + }), + _ => events.push(ChangePlayerPhysicsBehavior { + server_authoritative: true, + }), + } + } + + // Lossy terrain compression + Text::new( + &self + .localized_strings + .get("hud.settings.lossy_terrain_compression"), + ) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .right_from(state.ids.player_physics_behavior_text, 64.0) + .color(TEXT_COLOR) + .set(state.ids.lossy_terrain_compression_label, ui); + + let lossy_terrain_compression = ToggleButton::new( + self.global_state + .settings + .networking + .lossy_terrain_compression, + self.imgs.checkbox, + self.imgs.checkbox_checked, + ) + .w_h(18.0, 18.0) + .right_from(state.ids.lossy_terrain_compression_label, 10.0) + .hover_images(self.imgs.checkbox_mo, self.imgs.checkbox_checked_mo) + .press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked) + .set(state.ids.lossy_terrain_compression_button, ui); + + if self + .global_state + .settings + .networking + .lossy_terrain_compression + != lossy_terrain_compression + { + events.push(NetworkingChange::ToggleLossyTerrainCompression( + lossy_terrain_compression, + )); + } + + #[cfg(feature = "discord")] + { + // Third party integrations + Text::new( + &self + .localized_strings + .get("hud.settings.third_party_integrations"), + ) + .down_from(state.ids.player_physics_behavior_list, 16.0) + .font_size(self.fonts.cyri.scale(18)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.third_party_integrations_title, ui); + + // Toggle Discord integration + let enable_discord_integration = ToggleButton::new( + self.global_state + .settings + .networking + .enable_discord_integration, + self.imgs.checkbox, + self.imgs.checkbox_checked, + ) + .w_h(18.0, 18.0) + .down_from(state.ids.third_party_integrations_title, 8.0) + .hover_images(self.imgs.checkbox_mo, self.imgs.checkbox_checked_mo) + .press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked) + .set(state.ids.enable_discord_integration_button, ui); + + if self + .global_state + .settings + .networking + .enable_discord_integration + != enable_discord_integration + { + events.push(ToggleDiscordIntegration( + !self + .global_state + .settings + .networking + .enable_discord_integration, + )); + } + + Text::new( + &self + .localized_strings + .get("hud.settings.enable_discord_integration"), + ) + .right_from(state.ids.enable_discord_integration_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.enable_discord_integration_button) + .color(TEXT_COLOR) + .set(state.ids.enable_discord_integration_text, ui); + } + + events + } +} diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index dd155743f4..037d4eb515 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -102,8 +102,6 @@ widget_ids! { // particles_button, particles_label, - lossy_terrain_compression_button, - lossy_terrain_compression_label, weapon_trails_button, weapon_trails_label, flashing_lights_button, @@ -1219,49 +1217,11 @@ impl<'a> Widget for Video<'a> { events.push(GraphicsChange::ToggleParticlesEnabled(particles_enabled)); } - // Lossy terrain compression - Text::new( - &self - .localized_strings - .get("hud.settings.lossy_terrain_compression"), - ) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .right_from(state.ids.particles_label, 64.0) - .color(TEXT_COLOR) - .set(state.ids.lossy_terrain_compression_label, ui); - - let lossy_terrain_compression = ToggleButton::new( - self.global_state - .settings - .graphics - .lossy_terrain_compression, - self.imgs.checkbox, - self.imgs.checkbox_checked, - ) - .w_h(18.0, 18.0) - .right_from(state.ids.lossy_terrain_compression_label, 10.0) - .hover_images(self.imgs.checkbox_mo, self.imgs.checkbox_checked_mo) - .press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked) - .set(state.ids.lossy_terrain_compression_button, ui); - - if self - .global_state - .settings - .graphics - .lossy_terrain_compression - != lossy_terrain_compression - { - events.push(GraphicsChange::ToggleLossyTerrainCompression( - lossy_terrain_compression, - )); - } - // Weapon trails Text::new(&self.localized_strings.get("hud.settings.weapon_trails")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) - .right_from(state.ids.lossy_terrain_compression_label, 64.0) + .right_from(state.ids.particles_label, 64.0) .color(TEXT_COLOR) .set(state.ids.weapon_trails_label, ui); diff --git a/voxygen/src/lib.rs b/voxygen/src/lib.rs index e74d85ff69..644dccf3eb 100644 --- a/voxygen/src/lib.rs +++ b/voxygen/src/lib.rs @@ -22,6 +22,7 @@ pub mod audio; pub mod cmd; pub mod controller; mod credits; +#[cfg(feature = "discord")] pub mod discord; mod ecs; pub mod error; pub mod game_input; @@ -83,6 +84,9 @@ pub struct GlobalState { pub client_error: Option, // Used to clear the shadow textures when entering a PlayState that doesn't utilise shadows pub clear_shadows_next_frame: bool, + /// A channel that sends Discord activity updates to a background task + #[cfg(feature = "discord")] + pub discord: crate::discord::Discord, } impl GlobalState { diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 5fea8fbaec..4e3f8ae100 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -285,6 +285,13 @@ fn main() { #[cfg(feature = "egui-ui")] let egui_state = EguiState::new(&window); + #[cfg(feature = "discord")] + let discord = if settings.networking.enable_discord_integration { + veloren_voxygen::discord::Discord::start(&tokio_runtime) + } else { + veloren_voxygen::discord::Discord::Inactive + }; + let global_state = GlobalState { userdata_dir, config_dir, @@ -306,6 +313,8 @@ fn main() { clipboard, client_error: None, clear_shadows_next_frame: false, + #[cfg(feature = "discord")] + discord, }; run::run(global_state, event_loop); diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index d0b83f2566..00ec248e99 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -74,6 +74,9 @@ impl PlayState for CharSelectionState { // Clear shadow textures since we don't render to them here global_state.clear_shadows_next_frame = true; + + #[cfg(feature = "discord")] + global_state.discord.enter_character_selection(); } fn tick(&mut self, global_state: &mut GlobalState, events: Vec) -> PlayStateResult { diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 1353fdbdb4..772631e4a0 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -82,6 +82,9 @@ impl PlayState for MainMenuState { // Set scale mode in case it was change self.main_menu_ui .set_scale_mode(global_state.settings.interface.ui_scale); + + #[cfg(feature = "discord")] + global_state.discord.enter_main_menu(); } #[allow(clippy::single_match)] // TODO: remove when event match has multiple arms diff --git a/voxygen/src/run.rs b/voxygen/src/run.rs index 13fd444657..64a09ecd09 100644 --- a/voxygen/src/run.rs +++ b/voxygen/src/run.rs @@ -151,6 +151,10 @@ fn handle_main_events_cleared( break; }, PlayStateResult::Shutdown => { + // Clear the Discord activity before shutting down + #[cfg(feature = "discord")] + global_state.discord.clear_activity(); + debug!("Shutting down all states..."); while states.last().is_some() { states.pop().map(|old_state| { diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 21e97b1dec..1f217f4090 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -114,9 +114,9 @@ impl SessionState { let mut mumble_link = SharedLink::new("veloren", "veloren-voxygen"); { let mut client = client.borrow_mut(); - client.request_player_physics(global_state.settings.gameplay.player_physics_behavior); + client.request_player_physics(global_state.settings.networking.player_physics_behavior); client.request_lossy_terrain_compression( - global_state.settings.graphics.lossy_terrain_compression, + global_state.settings.networking.lossy_terrain_compression, ); #[cfg(not(target_os = "macos"))] if let Some(uid) = client.uid() { @@ -394,6 +394,23 @@ impl PlayState for SessionState { self.client.borrow_mut().send_chat(cmd.to_string()); } } + + #[cfg(feature = "discord")] + { + // Update the Discord activity on client initialization + #[cfg(feature = "singleplayer")] + let singleplayer = global_state.singleplayer.is_some(); + #[cfg(not(feature = "singleplayer"))] + let singleplayer = false; + + if singleplayer { + global_state.discord.join_singleplayer(); + } else { + global_state + .discord + .join_server(self.client.borrow().server_info().name.clone()); + } + } } fn tick(&mut self, global_state: &mut GlobalState, events: Vec) -> PlayStateResult { @@ -420,6 +437,17 @@ impl PlayState for SessionState { let client = self.client.borrow(); let player_entity = client.entity(); + #[cfg(feature = "discord")] + if global_state.discord.is_active() { + if let Some(chunk) = client.current_chunk() { + if let Some(location_name) = chunk.meta().name() { + global_state + .discord + .update_location(location_name, client.current_site()); + } + } + } + if global_state.settings.gameplay.bow_zoom { let mut fov_scaling = 1.0; if let Some(comp::CharacterState::ChargedRanged(cr)) = client diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index cfbe3e89f4..4870820688 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -62,7 +62,6 @@ pub enum Gameplay { ChangeFreeLookBehavior(PressBehavior), ChangeAutoWalkBehavior(PressBehavior), ChangeCameraClampBehavior(PressBehavior), - ChangePlayerPhysicsBehavior { server_authoritative: bool }, ChangeStopAutoWalkOnInput(bool), ChangeAutoCamera(bool), ChangeBowZoom(bool), @@ -89,7 +88,6 @@ pub enum Graphics { ChangeFullscreenMode(FullScreenSettings), ToggleParticlesEnabled(bool), - ToggleLossyTerrainCompression(bool), ToggleWeaponTrailsEnabled(bool), AdjustWindowSize([u16; 2]), @@ -148,7 +146,16 @@ pub enum Language { ToggleEnglishFallback(bool), } #[derive(Clone)] -pub enum Networking {} +pub enum Networking { + AdjustViewDistance(u32), + ChangePlayerPhysicsBehavior { + server_authoritative: bool, + }, + ToggleLossyTerrainCompression(bool), + + #[cfg(feature = "discord")] + ToggleDiscordIntegration(bool), +} #[derive(Clone)] pub enum SettingsChange { @@ -319,15 +326,6 @@ impl SettingsChange { Gameplay::ChangeCameraClampBehavior(behavior) => { settings.gameplay.camera_clamp_behavior = behavior; }, - Gameplay::ChangePlayerPhysicsBehavior { - server_authoritative, - } => { - settings.gameplay.player_physics_behavior = server_authoritative; - session_state - .client - .borrow_mut() - .request_player_physics(server_authoritative); - }, Gameplay::ChangeStopAutoWalkOnInput(state) => { settings.gameplay.stop_auto_walk_on_input = state; }, @@ -424,13 +422,6 @@ impl SettingsChange { Graphics::ToggleParticlesEnabled(particles_enabled) => { settings.graphics.particles_enabled = particles_enabled; }, - Graphics::ToggleLossyTerrainCompression(lossy_terrain_compression) => { - settings.graphics.lossy_terrain_compression = lossy_terrain_compression; - session_state - .client - .borrow_mut() - .request_lossy_terrain_compression(lossy_terrain_compression); - }, Graphics::ToggleWeaponTrailsEnabled(weapon_trails_enabled) => { settings.graphics.weapon_trails_enabled = weapon_trails_enabled; }, @@ -612,7 +603,56 @@ impl SettingsChange { .set_english_fallback(settings.language.use_english_fallback); }, }, - SettingsChange::Networking(networking_change) => match networking_change {}, + SettingsChange::Networking(networking_change) => match networking_change { + Networking::AdjustViewDistance(view_distance) => { + session_state + .client + .borrow_mut() + .set_view_distance(view_distance); + settings.graphics.view_distance = view_distance; + }, + Networking::ChangePlayerPhysicsBehavior { + server_authoritative, + } => { + settings.networking.player_physics_behavior = server_authoritative; + session_state + .client + .borrow_mut() + .request_player_physics(server_authoritative); + }, + Networking::ToggleLossyTerrainCompression(lossy_terrain_compression) => { + settings.networking.lossy_terrain_compression = lossy_terrain_compression; + session_state + .client + .borrow_mut() + .request_lossy_terrain_compression(lossy_terrain_compression); + }, + #[cfg(feature = "discord")] + Networking::ToggleDiscordIntegration(enabled) => { + use crate::discord::Discord; + + settings.networking.enable_discord_integration = enabled; + if enabled { + global_state.discord = Discord::start(&global_state.tokio_runtime); + + #[cfg(feature = "singleplayer")] + let singleplayer = global_state.singleplayer.is_some(); + #[cfg(not(feature = "singleplayer"))] + let singleplayer = false; + + if singleplayer { + global_state.discord.join_singleplayer(); + } else { + global_state.discord.join_server( + session_state.client.borrow().server_info().name.clone(), + ); + } + } else { + global_state.discord.clear_activity(); + global_state.discord = Discord::Inactive; + } + }, + }, } settings.save_to_file_warn(&global_state.config_dir); } diff --git a/voxygen/src/settings/gameplay.rs b/voxygen/src/settings/gameplay.rs index e453f65c1a..20a94a6a0e 100644 --- a/voxygen/src/settings/gameplay.rs +++ b/voxygen/src/settings/gameplay.rs @@ -14,7 +14,6 @@ pub struct GameplaySettings { pub free_look_behavior: PressBehavior, pub auto_walk_behavior: PressBehavior, pub camera_clamp_behavior: PressBehavior, - pub player_physics_behavior: bool, pub stop_auto_walk_on_input: bool, pub auto_camera: bool, pub bow_zoom: bool, @@ -32,7 +31,6 @@ impl Default for GameplaySettings { free_look_behavior: PressBehavior::Toggle, auto_walk_behavior: PressBehavior::Toggle, camera_clamp_behavior: PressBehavior::Toggle, - player_physics_behavior: false, stop_auto_walk_on_input: true, auto_camera: false, bow_zoom: true, diff --git a/voxygen/src/settings/graphics.rs b/voxygen/src/settings/graphics.rs index 708821252b..b2a1b4858c 100644 --- a/voxygen/src/settings/graphics.rs +++ b/voxygen/src/settings/graphics.rs @@ -33,7 +33,6 @@ pub struct GraphicsSettings { pub lod_distance: u32, pub sprite_render_distance: u32, pub particles_enabled: bool, - pub lossy_terrain_compression: bool, pub weapon_trails_enabled: bool, pub figure_lod_render_distance: u32, pub max_fps: Fps, @@ -55,7 +54,6 @@ impl Default for GraphicsSettings { lod_distance: 200, sprite_render_distance: 100, particles_enabled: true, - lossy_terrain_compression: false, weapon_trails_enabled: true, figure_lod_render_distance: 300, max_fps: Fps::Max(60), diff --git a/voxygen/src/settings/networking.rs b/voxygen/src/settings/networking.rs index 402fb5f4e4..6b4af2ef9a 100644 --- a/voxygen/src/settings/networking.rs +++ b/voxygen/src/settings/networking.rs @@ -10,6 +10,9 @@ pub struct NetworkingSettings { pub default_server: String, pub trusted_auth_servers: HashSet, pub use_quic: bool, + pub player_physics_behavior: bool, + pub lossy_terrain_compression: bool, + pub enable_discord_integration: bool, } impl Default for NetworkingSettings { @@ -23,6 +26,9 @@ impl Default for NetworkingSettings { .map(|s| s.to_string()) .collect(), use_quic: false, + player_physics_behavior: false, + lossy_terrain_compression: false, + enable_discord_integration: true, } } } From 50701620e634579ac4fdd73da779dacf15b9d277 Mon Sep 17 00:00:00 2001 From: Monty Marz Date: Tue, 16 Aug 2022 12:16:45 +0000 Subject: [PATCH 068/854] Temporary invincible merchants --- assets/common/loadout/village/merchant.ron | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/common/loadout/village/merchant.ron b/assets/common/loadout/village/merchant.ron index d5336dfd8f..be52cd5da1 100644 --- a/assets/common/loadout/village/merchant.ron +++ b/assets/common/loadout/village/merchant.ron @@ -11,4 +11,5 @@ legs: Item("common.items.armor.merchant.pants"), feet: Item("common.items.armor.merchant.foot"), lantern: Item("common.items.lantern.black_0"), + tabard: Item("common.items.debug.admin"), ) \ No newline at end of file From 1ce4cb4901cfa02a025bbea6ebb90911f9e2ecc3 Mon Sep 17 00:00:00 2001 From: tygyh <32486062+tygyh@users.noreply.github.com> Date: Wed, 17 Aug 2022 11:33:46 +0200 Subject: [PATCH 069/854] Update swedish translations --- assets/voxygen/i18n/sv_SE/buff.ftl | 2 ++ assets/voxygen/i18n/sv_SE/common.ftl | 4 ++++ assets/voxygen/i18n/sv_SE/hud/ability.ftl | 16 ++++++++++++++++ assets/voxygen/i18n/sv_SE/hud/bag.ftl | 1 + assets/voxygen/i18n/sv_SE/hud/skills.ftl | 2 ++ assets/voxygen/i18n/sv_SE/hud/trade.ftl | 3 ++- 6 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 assets/voxygen/i18n/sv_SE/hud/ability.ftl diff --git a/assets/voxygen/i18n/sv_SE/buff.ftl b/assets/voxygen/i18n/sv_SE/buff.ftl index 2118a12e0f..d5262b0eb3 100644 --- a/assets/voxygen/i18n/sv_SE/buff.ftl +++ b/assets/voxygen/i18n/sv_SE/buff.ftl @@ -15,6 +15,8 @@ buff-title-protectingward = Skyddsbesvärjelse buff-desc-protectingward = Du skyddas, någorlunda, från attacker. buff-title-frenzied = Rasande buff-desc-frenzied = Du är uppfylld av en onaturlig hastighet och kan ignorera mindre skador. +buff-title-hastened = Förhastad +buff-desc-hastened = Dina rörelser och attacker är snabbare. buff-title-bleed = Blödande buff-desc-bleed = Orsakar vanlig skada. buff-title-cursed = Förbannad diff --git a/assets/voxygen/i18n/sv_SE/common.ftl b/assets/voxygen/i18n/sv_SE/common.ftl index 40327740ff..4b73e45cba 100644 --- a/assets/voxygen/i18n/sv_SE/common.ftl +++ b/assets/voxygen/i18n/sv_SE/common.ftl @@ -73,6 +73,7 @@ common-tool-farming = Jordbruksredskap common-tool-pick = Hacka common-tool-mining = Gruvgrävande common-kind-modular_component = Modulär komponent +common-kind-modular_component_partial = Komponent common-kind-glider = Glidare common-kind-consumable = Förbrukningsvara common-kind-throwable = Kan kastas @@ -87,6 +88,9 @@ common-stats-combat_rating = Stridsduglighet common-stats-power = Kraft common-stats-speed = Hastighet common-stats-poise = Allmäntillstånd +common-stats-range = Räckvidd +common-stats-energy_efficiency = Energieffektivitet +common-stats-buff_strength = Buff/Debuff-styrka common-stats-crit_chance = Kritisk chans common-stats-crit_mult = Kritisk multi common-stats-armor = Rustning diff --git a/assets/voxygen/i18n/sv_SE/hud/ability.ftl b/assets/voxygen/i18n/sv_SE/hud/ability.ftl new file mode 100644 index 0000000000..5b9ef08ce2 --- /dev/null +++ b/assets/voxygen/i18n/sv_SE/hud/ability.ftl @@ -0,0 +1,16 @@ +common-abilities-debug-possess-name = Besittningspil +common-abilities-debug-possess-desc = Skjuter en förgiftad pil. Låter dig kontrollera ditt mål. +common-abilities-sword-spin-name = Virvelvind +common-abilities-sword-spin-desc = Flytta dig framåt medan du snurrar med ditt svärd. +common-abilities-axe-leap-name = Yxhopp +common-abilities-axe-leap-desc = Ett hopp med det skärande språnget riktat mot pekarens position. +common-abilities-hammer-leap-name = Nederslag +common-abilities-hammer-leap-desc = En attack som träffar ett område och knuffar fiender. Hoppar mot pekarens position. +common-abilities-bow-shotgun-name = Pilskur +common-abilities-bow-shotgun-desc = Skjuter iväg en skur av pilar. +common-abilities-staff-fireshockwave-name = Eldens ring +common-abilities-staff-fireshockwave-desc = Tänder eld på marken med en eldig stötvåg. +common-abilities-sceptre-wardingaura-name = Vårdande Aura +common-abilities-sceptre-wardingaura-desc = Skyddar dina allierade mot fiendens attacker. +common-abilities-unknown-name = Förmågan har ingen titel +common-abilities-unknown-desc = Förmågan har ingen beskrivning \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/bag.ftl b/assets/voxygen/i18n/sv_SE/hud/bag.ftl index e36d1f7768..6b09f4f43f 100644 --- a/assets/voxygen/i18n/sv_SE/hud/bag.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/bag.ftl @@ -28,6 +28,7 @@ hud-bag-energy = Energi hud-bag-combat_rating = Stridsduglighet hud-bag-protection = Skydd hud-bag-stun_res = Motståndskraft mot att bli överväldigad +hud-bag-stealth = Smygning hud-bag-combat_rating_desc = Beräknas från din utrustning och hälsa. diff --git a/assets/voxygen/i18n/sv_SE/hud/skills.ftl b/assets/voxygen/i18n/sv_SE/hud/skills.ftl index 7b575dbbdd..f6e34d3226 100644 --- a/assets/voxygen/i18n/sv_SE/hud/skills.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/skills.ftl @@ -151,6 +151,7 @@ hud-skill-hmr_charged_melee_damage = Ökar skadan från den laddade slaget med { hud-skill-hmr_charged_melee_knockback_title = Laddad närstridsknuffning hud-skill-hmr_charged_melee_knockback = Ökar massivt slagens kastningspotential med { $boost }%{ $SP } hud-skill-hmr_single_strike_title = Enkelslag +hud-skill-hmr_single_strike = Enklare än så blir det inte hud-skill-hmr_single_strike_regen_title = Enkelslagsåterhämtning hud-skill-hmr_single_strike_regen = Ökar uthållighetsökningen för varje successivt slag{ $SP } hud-skill-hmr_single_strike_speed_title = Enkelslagshastighet @@ -206,6 +207,7 @@ hud-skill-axe_double_strike_speed = Ökar attackhastigheten från varje successi hud-skill-axe_double_strike_regen_title = Dubbelslagsregeneration hud-skill-axe_double_strike_regen = Ökar uthållighetsökningen från varje successiv träff{ $SP } hud-skill-axe_spin_title = Yxsnurrning +hud-skill-axe_spin = Snurra runt och runt igen ... hud-skill-axe_infinite_axe_spin_title = Oändlig Yxsnurrning hud-skill-axe_infinite_axe_spin = Snurra så länge du har energi{ $SP } hud-skill-axe_spin_damage_title = Snurrningsskada diff --git a/assets/voxygen/i18n/sv_SE/hud/trade.ftl b/assets/voxygen/i18n/sv_SE/hud/trade.ftl index 20bcfc34c4..bafec0b5f7 100644 --- a/assets/voxygen/i18n/sv_SE/hud/trade.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/trade.ftl @@ -22,4 +22,5 @@ hud-trade-coin = mynt hud-trade-tooltip_hint_1 = hud-trade-tooltip_hint_2 = hud-trade-your_offer = Ditt erbjudande -hud-trade-their_offer = Deras erbjudande \ No newline at end of file +hud-trade-their_offer = Deras erbjudande +hud-trade-amount_input = Välj ett föremål \ No newline at end of file From 021a8be62eb036786c4e6a3ef243d2e11ea78aa7 Mon Sep 17 00:00:00 2001 From: Saverio Miroddi Date: Wed, 10 Aug 2022 21:41:29 +0200 Subject: [PATCH 070/854] Server: Vacuum database on startup Runs after the migrations. In some cases, it can reclaim a significant amount of space (reported 30%). --- CHANGELOG.md | 1 + server/src/lib.rs | 4 ++++ server/src/persistence/mod.rs | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 801043bcc6..c24ad07e6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Currently playing music track and artist now shows in the debug menu. - Added a setting to influence the gap between music track plays. - Added a Craft All button. +- Server: Vacuum database on startup ### Changed - Use fluent for translations diff --git a/server/src/lib.rs b/server/src/lib.rs index 8af72f1c0e..bcc50f13e0 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -230,6 +230,10 @@ impl Server { debug!("Running DB migrations..."); persistence::run_migrations(&database_settings); + // Vacuum database + debug!("Vacuuming database..."); + persistence::vacuum_database(&database_settings); + let database_settings = Arc::new(RwLock::new(database_settings)); let registry = Arc::new(Registry::new()); diff --git a/server/src/persistence/mod.rs b/server/src/persistence/mod.rs index 1c0c9e4773..c84f5e1675 100644 --- a/server/src/persistence/mod.rs +++ b/server/src/persistence/mod.rs @@ -172,6 +172,18 @@ pub fn run_migrations(settings: &DatabaseSettings) { info!("Applied {} database migrations", applied_migrations); } +/// Runs after the migrations. In some cases, it can reclaim a significant +/// amount of space (reported 30%) +pub fn vacuum_database(settings: &DatabaseSettings) { + let conn = establish_connection(settings, ConnectionMode::ReadWrite); + + // The params type is phony; it's required, but not meaningful. + conn.execute::<&[u32]>("VACUUM main", &[]) + .expect("Database vacuuming failed, server startup aborted"); + + info!("Database vacuumed"); +} + // These callbacks use info logging because they are never enabled by default, // only when explicitly turned on via CLI arguments or interactive CLI commands. // Setting them to anything other than info would remove the ability to get SQL From 847ee1c1b1480292fb556a3f269e4dbf386b262d Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Tue, 9 Aug 2022 13:33:34 +0300 Subject: [PATCH 071/854] Implement i18n-tooling * Working csv export * Working i18n-check --- .gitlab/scripts/translation.sh | 9 +- Cargo.lock | 2 + common/assets/src/walk.rs | 60 +++++++++++- voxygen/i18n/Cargo.toml | 11 +++ voxygen/i18n/src/analysis.rs | 148 +++++++++++++++++++++++++++++ voxygen/i18n/src/bin/i18n-check.rs | 39 ++++++++ voxygen/i18n/src/error.rs | 75 +++++++++++++++ voxygen/i18n/src/lib.rs | 124 +++++++++++------------- 8 files changed, 391 insertions(+), 77 deletions(-) create mode 100644 voxygen/i18n/src/analysis.rs create mode 100644 voxygen/i18n/src/bin/i18n-check.rs create mode 100644 voxygen/i18n/src/error.rs diff --git a/.gitlab/scripts/translation.sh b/.gitlab/scripts/translation.sh index e6393c5933..4410ae57bb 100755 --- a/.gitlab/scripts/translation.sh +++ b/.gitlab/scripts/translation.sh @@ -1,3 +1,8 @@ #!/bin/bash -export VELOREN_ASSETS="$(pwd)/assets" -time cargo test --package veloren-voxygen-i18n --lib test_all_localizations -- --nocapture --ignored +VELOREN_ASSETS="$(pwd)/assets" +export VELOREN_ASSETS + +time cargo test --package veloren-voxygen-i18n \ + --lib test_all_localizations \ + --features="stat" \ + -- --nocapture --ignored diff --git a/Cargo.lock b/Cargo.lock index c5b7100f38..4376986dca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6908,9 +6908,11 @@ dependencies = [ name = "veloren-voxygen-i18n" version = "0.13.0" dependencies = [ + "clap 3.1.10", "deunicode", "fluent", "fluent-bundle", + "fluent-syntax", "hashbrown 0.12.0", "intl-memoizer", "ron 0.7.0", diff --git a/common/assets/src/walk.rs b/common/assets/src/walk.rs index 976e325f85..b1c7ecbf0c 100644 --- a/common/assets/src/walk.rs +++ b/common/assets/src/walk.rs @@ -3,16 +3,54 @@ use std::{ path::{Path, PathBuf}, }; -/// Read `walk_tree` -#[derive(Debug)] +/// Represent tree of directory, result of [generate_tree]. +/// +/// Note that paths are always relative to root it was generated from. +#[derive(Debug, Clone)] pub enum Walk { + /// Represents file node, path is relative to directory root Walk was + /// generated from. File(PathBuf), + /// Represents directory subtree, path is relative to directory root Walk + /// was generated from. Dir { path: PathBuf, content: Vec }, } -/// Utility function to build a tree of directory, recursively -/// -/// At first iteration, use path to your directory as dir and root +impl Walk { + /// Utility function to build a tree of directory, recursively + /// + /// Path needs to be absolute. + pub fn generate(root: &Path) -> io::Result { + let trees = walk_tree(root, root); + Ok(Walk::Dir { + path: Path::new("").to_owned(), + content: trees?, + }) + } + + // TODO: implement iterator? + pub fn for_each_file(&self, root: &Path, f: &mut F) + where + F: FnMut(&Path), + { + match self { + Self::File(filepath) => { + let path = root.join(filepath); + f(&path); + }, + Self::Dir { + path: _, + content: files, + } => { + for path in files { + path.for_each_file(root, f); + } + }, + } + } +} + +/// Helper function to [Walk::generate()], prefer using it instead. pub fn walk_tree(dir: &Path, root: &Path) -> io::Result> { let mut buff = Vec::new(); for entry in std::fs::read_dir(dir)? { @@ -37,3 +75,15 @@ pub fn walk_tree(dir: &Path, root: &Path) -> io::Result> { Ok(buff) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn trie() { + let root = crate::find_root().unwrap(); + let assets = Path::new(&root).join("assets/"); + Walk::generate(&assets).unwrap(); + } +} diff --git a/voxygen/i18n/Cargo.toml b/voxygen/i18n/Cargo.toml index 89c784aa73..c5ff1c56d7 100644 --- a/voxygen/i18n/Cargo.toml +++ b/voxygen/i18n/Cargo.toml @@ -19,3 +19,14 @@ fluent-bundle = { git = "https://github.com/juliancoffee/fluent-rs.git", branch hashbrown = { version = "0.12", features = ["serde", "nightly"] } deunicode = "1.0" tracing = "0.1" +# Bin +clap = { version = "3.1.8", features = ["suggestions", "std"], default-features = false, optional = true } +fluent-syntax = { git = "https://github.com/juliancoffee/fluent-rs.git", branch = "patched"} + +[[bin]] +name = "i18n-check" +required-features = ["bin"] + +[features] +bin = ["clap"] +stat = [] diff --git a/voxygen/i18n/src/analysis.rs b/voxygen/i18n/src/analysis.rs new file mode 100644 index 0000000000..396bc1b292 --- /dev/null +++ b/voxygen/i18n/src/analysis.rs @@ -0,0 +1,148 @@ +use crate::{assets::Walk, error::ResourceErr}; +use fluent_syntax::{ast, parser}; +use std::{ + fs, io, + path::{Path, PathBuf}, +}; + +/// Generate tree of i18n files, path should be absolute. +/// We assume that all i18n directories should have the same tree structure, +/// so that we can generate tree once and reuse for all languages. +fn i18n_tree(reference: &Path) -> io::Result { Walk::generate(reference) } + +/// Grab keys from one file +fn keys_from_file(filepath: &Path) -> Vec { + use ast::Entry; + + let file = format!("{}", filepath.display()); + + let content = match fs::read_to_string(filepath) { + Ok(content) => content, + Err(e) => { + eprintln!("failed to read from {filepath:?}. err={e}"); + return Vec::new(); + }, + }; + + let ast = parser::parse(&*content).unwrap_or_else(|(_parsed, errs)| { + panic!( + "{}", + ResourceErr::parsing_error(errs, file.clone(), &content) + ) + }); + let mut keys = Vec::new(); + for entry in ast.body { + match entry { + Entry::Message(m) => { + keys.push(MsgId { + key: m.id.name.to_owned(), + file: Some(file.clone()), + }); + }, + Entry::Term(_) + | Entry::Comment(_) + | Entry::GroupComment(_) + | Entry::ResourceComment(_) + | Entry::Junk { .. } => { + // these are not part of "public" API so do nothing + // comments linked to message are part of Message entry + // and we are not interested in global comments either, for now + }, + } + } + keys +} + +/// Grab keys from one language sitting at `from`. +/// +/// Tree of files assumed to have only .ftl files. +fn keys(from: &Path, tree: &Walk) -> Vec { + let mut keys = Vec::new(); + + tree.for_each_file(from, &mut |filepath| { + if !filepath.ends_with("_manifest.ron") { + keys.extend(keys_from_file(filepath)); + } + }); + + keys +} + +// TODO: +// Add versioning +// TODO: +// Do something with attributes? +// +// For some messages it makes sense to require that all attributes +// should match ones in reference language. +// For some it doesn't as of now. +#[derive(Clone, Debug)] +pub struct MsgId { + pub key: String, + pub file: Option, +} + +// TODO: +// Add versioning +#[derive(Debug)] +pub struct Stats { + pub up_to_date: Vec, + pub not_found: Vec, + pub unused: Vec, +} + +pub struct ReferenceLanguage { + /// All keys. + pub keys: Vec, + /// Cached tree of files. + tree: Walk, +} + +impl ReferenceLanguage { + /// Generate reference language, path should be absolute. + pub fn at(path: &Path) -> Self { + let tree = i18n_tree(path) + .unwrap_or_else(|e| panic!("{path:?}\nfailed to build file tree\n{e:?}")); + let keys = keys(path, &tree); + Self { keys, tree } + } + + /// Compare with other language + pub fn compare_with(&self, lang: &Language) -> Stats { + let keys = keys(&lang.path, &self.tree); + + let mut stats = Stats { + up_to_date: Vec::new(), + not_found: Vec::new(), + unused: Vec::new(), + }; + + for ref_key in &self.keys { + if let Some(key) = keys.iter().find(|MsgId { key, .. }| &ref_key.key == key) { + stats.up_to_date.push(key.clone()); + } else { + stats.not_found.push(MsgId { + key: ref_key.key.clone(), + file: None, + }); + } + } + + for key in &keys { + if !self + .keys + .iter() + .any(|MsgId { key: ref_key, .. }| ref_key == &key.key) + { + stats.unused.push(key.clone()) + } + } + + stats + } +} + +pub struct Language { + pub code: String, + pub path: PathBuf, +} diff --git a/voxygen/i18n/src/bin/i18n-check.rs b/voxygen/i18n/src/bin/i18n-check.rs new file mode 100644 index 0000000000..002d76e9a2 --- /dev/null +++ b/voxygen/i18n/src/bin/i18n-check.rs @@ -0,0 +1,39 @@ +use clap::{Arg, Command}; +use common_assets::find_root; +use veloren_voxygen_i18n::{ + analysis::{Language, ReferenceLanguage}, + REFERENCE_LANG, +}; + +fn main() { + let args = Command::new("i18n-check") + .about("Tool to check your Veloren localisation for correctness and missing keys") + .arg( + Arg::new("CODE") + .required(true) + .help("Run diagnostic for specific language code (de_DE, for example)"), + ) + .get_matches(); + + let root = find_root().unwrap(); + let i18n_directory = root.join("assets/voxygen/i18n"); + let reference = ReferenceLanguage::at(&i18n_directory.join(REFERENCE_LANG)); + + let code = args.value_of("CODE").expect("arg is required"); + let lang = Language { + code: code.to_owned(), + path: root.join(i18n_directory.join(code)), + }; + let stats = reference.compare_with(&lang); + println!("\t[Not found]: {}", stats.not_found.len()); + for key in stats.not_found { + let key = &key.key; + println!("{key}"); + } + + println!("\n\t[Unused]: {}", stats.unused.len()); + for key in stats.unused { + let key = &key.key; + println!("{key}") + } +} diff --git a/voxygen/i18n/src/error.rs b/voxygen/i18n/src/error.rs new file mode 100644 index 0000000000..99f47bada3 --- /dev/null +++ b/voxygen/i18n/src/error.rs @@ -0,0 +1,75 @@ +use fluent_syntax::parser::ParserError; +use std::{error::Error, fmt, ops::Range}; + +#[derive(Debug)] +struct Pos { + line: usize, + character: usize, +} + +impl fmt::Display for Pos { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{};{}", self.line, self.character) + } +} + +fn unspan(src: &str, span: Range) -> Range { + let count = |idx| { + let mut line = 1; + let mut character = 1; + for ch in src.bytes().take(idx) { + // Count characters + character += 1; + + // Count newlines + if ch == b'\n' { + line += 1; + // If found new line, reset character count + character = 1; + } + } + Pos { line, character } + }; + let Range { start, end } = span; + count(start)..count(end) +} + +// TODO: +// Ideally we wouldn't write this code, check this issue in fluent-rs. +// https://github.com/projectfluent/fluent-rs/issues/176 +#[derive(Debug)] +pub enum ResourceErr { + ParsingError { + #[allow(dead_code)] // false-positive + file: String, + #[allow(dead_code)] // false-positive + err: String, + }, + BundleError(String), +} + +impl ResourceErr { + pub fn parsing_error(errs: Vec, file: String, src: &str) -> Self { + let errs = errs + .into_iter() + .map(|e| { + let Range { + start: from, + end: to, + } = unspan(src, e.pos); + format!("{from}..{to}, kind {:?}", e.kind) + }) + .collect::>(); + + Self::ParsingError { + file, + err: format!("{errs:?}"), + } + } +} + +impl fmt::Display for ResourceErr { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{self:#?}") } +} + +impl Error for ResourceErr {} diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 1fff103e18..5c36c7eb6f 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -1,5 +1,11 @@ +mod error; mod raw; +use error::ResourceErr; + +#[cfg(any(feature = "bin", feature = "stat"))] +pub mod analysis; + use fluent_bundle::{bundle::FluentBundle, FluentResource}; use intl_memoizer::concurrent::IntlLangMemoizer; use unic_langid::LanguageIdentifier; @@ -147,74 +153,10 @@ impl assets::Compound for Language { match cache.load(id) { Ok(handle) => { - use std::{error::Error, fmt, ops::Range}; - - #[derive(Debug)] - struct Pos { - #[allow(dead_code)] // false-positive - line: usize, - #[allow(dead_code)] // false-positive - character: usize, - } - - fn unspan(src: &str, span: Range) -> Range { - let count = |idx| { - let mut line = 1; - let mut character = 1; - for ch in src.bytes().take(idx) { - // Count characters - character += 1; - - // Count newlines - if ch == b'\n' { - line += 1; - // If found new line, reset character count - character = 1; - } - } - Pos { line, character } - }; - let Range { start, end } = span; - count(start)..count(end) - } - - // TODO: - // better error handling? - #[derive(Debug)] - enum ResourceErr { - ParsingError { - #[allow(dead_code)] // false-positive - file: String, - #[allow(dead_code)] // false-positive - err: String, - }, - BundleError(String), - } - - impl fmt::Display for ResourceErr { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{self:?}") - } - } - - impl Error for ResourceErr {} - let source: &raw::Resource = &*handle.read(); let resource = FluentResource::try_new(source.src.clone()).map_err(|(_ast, errs)| { - let file = id.to_owned(); - let errs = errs - .into_iter() - .map(|e| { - let pos = unspan(&source.src, e.pos); - format!("{pos:?}, kind {:?}", e.kind) - }) - .collect::>(); - - ResourceErr::ParsingError { - file, - err: format!("{errs:?}"), - } + ResourceErr::parsing_error(errs, id.to_owned(), &source.src) })?; bundle @@ -505,14 +447,15 @@ mod tests { #[test] #[ignore] + #[cfg(feature = "stat")] // Generate translation stats fn test_all_localizations() { - // FIXME (i18n translation stats): - use std::{fs, io::Write}; + use analysis::{Language, ReferenceLanguage}; + use assets::find_root; + use std::{fs, io::Write, path::Path}; - let output = assets::find_root() - .unwrap() - .join("translation_analysis.csv"); + let root = find_root().unwrap(); + let output = root.join("translation_analysis.csv"); let mut f = fs::File::create(output).expect("couldn't write csv file"); writeln!( @@ -520,5 +463,46 @@ mod tests { "country_code,file_name,translation_key,status,git_commit" ) .unwrap(); + + let i18n_directory = root.join("assets/voxygen/i18n"); + let reference = ReferenceLanguage::at(&i18n_directory.join(REFERENCE_LANG)); + + let list = list_localizations(); + let file = |filename: Option| { + let file = filename + .as_ref() + .map(|s| Path::new(s)) + .and_then(|p| p.file_name()) + .and_then(|s| s.to_str()) + .unwrap_or("None"); + + format!("{file}") + }; + for meta in list { + let code = meta.language_identifier; + let lang = Language { + code: code.clone(), + path: i18n_directory.join(code.clone()), + }; + let stats = reference.compare_with(&lang); + for key in stats.up_to_date { + let code = &code; + let filename = &file(key.file); + let key = &key.key; + writeln!(f, "{code},{filename},{key},UpToDate,None").unwrap(); + } + for key in stats.not_found { + let code = &code; + let filename = &file(key.file); + let key = &key.key; + writeln!(f, "{code},{filename},{key},NotFound,None").unwrap(); + } + for key in stats.unused { + let code = &code; + let filename = &file(key.file); + let key = &key.key; + writeln!(f, "{code},{filename},{key},Unused,None").unwrap(); + } + } } } From 3860b3ece32592180aaff4b1d8c022fb6d2c8e89 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 12 Aug 2022 20:57:43 +0300 Subject: [PATCH 072/854] Remove template.ftl file They are empty anyway --- assets/voxygen/i18n/ar_SA/template.ftl | 0 assets/voxygen/i18n/be_BY/template.ftl | 0 assets/voxygen/i18n/ca_CA/template.ftl | 0 assets/voxygen/i18n/de_DE/template.ftl | 0 assets/voxygen/i18n/en/template.ftl | 0 assets/voxygen/i18n/eu/template.ftl | 0 assets/voxygen/i18n/ro_RO/template.ftl | 0 assets/voxygen/i18n/sr_SR/template.ftl | 0 assets/voxygen/i18n/th_TH/template.ftl | 0 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/voxygen/i18n/ar_SA/template.ftl delete mode 100644 assets/voxygen/i18n/be_BY/template.ftl delete mode 100644 assets/voxygen/i18n/ca_CA/template.ftl delete mode 100644 assets/voxygen/i18n/de_DE/template.ftl delete mode 100644 assets/voxygen/i18n/en/template.ftl delete mode 100644 assets/voxygen/i18n/eu/template.ftl delete mode 100644 assets/voxygen/i18n/ro_RO/template.ftl delete mode 100644 assets/voxygen/i18n/sr_SR/template.ftl delete mode 100644 assets/voxygen/i18n/th_TH/template.ftl diff --git a/assets/voxygen/i18n/ar_SA/template.ftl b/assets/voxygen/i18n/ar_SA/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/be_BY/template.ftl b/assets/voxygen/i18n/be_BY/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/ca_CA/template.ftl b/assets/voxygen/i18n/ca_CA/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/de_DE/template.ftl b/assets/voxygen/i18n/de_DE/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/en/template.ftl b/assets/voxygen/i18n/en/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/eu/template.ftl b/assets/voxygen/i18n/eu/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/ro_RO/template.ftl b/assets/voxygen/i18n/ro_RO/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/sr_SR/template.ftl b/assets/voxygen/i18n/sr_SR/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/assets/voxygen/i18n/th_TH/template.ftl b/assets/voxygen/i18n/th_TH/template.ftl deleted file mode 100644 index e69de29bb2..0000000000 From 753a51e6831c1c2128bcaf54b1f6f31223ce80c3 Mon Sep 17 00:00:00 2001 From: "Tormod G. Hellen" Date: Tue, 14 Jun 2022 23:14:42 +0200 Subject: [PATCH 073/854] Make selfish bastards ambush people when they're alone. --- CHANGELOG.md | 1 + server/src/rtsim/entity.rs | 4 +++ server/src/sys/agent.rs | 52 +++++++++++++++++++++++++++++++++----- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c24ad07e6b..58e1c16c3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Use fluent for translations - First tab on Login screen triggers username focus +- Certain NPCs will now attack when alone with victim ### Removed diff --git a/server/src/rtsim/entity.rs b/server/src/rtsim/entity.rs index 077d9c6628..25a25f9785 100644 --- a/server/src/rtsim/entity.rs +++ b/server/src/rtsim/entity.rs @@ -706,6 +706,8 @@ impl PersonalityBase { * don't want everyone to be completely weird. */ pub fn to_personality(&self) -> Personality { + let will_ambush = self.agreeableness < Personality::LOW_THRESHOLD + && self.conscientiousness < Personality::LOW_THRESHOLD; let mut chat_traits: EnumSet = EnumSet::new(); if self.openness > Personality::HIGH_THRESHOLD { chat_traits.insert(PersonalityTrait::Open); @@ -752,12 +754,14 @@ impl PersonalityBase { } Personality { personality_traits: chat_traits, + will_ambush, } } } pub struct Personality { pub personality_traits: EnumSet, + pub will_ambush: bool, } #[derive(EnumSetType)] diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 490a03b495..d336a01676 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -48,6 +48,7 @@ use common::{ }; use common_base::prof_span; use common_ecs::{Job, Origin, ParMode, Phase, System}; +use itertools::Itertools; use rand::{thread_rng, Rng}; use rayon::iter::ParallelIterator; use specs::{Entity as EcsEntity, Join, ParJoin, Read, WriteExpect, WriteStorage}; @@ -748,11 +749,44 @@ impl<'a> AgentData<'a> { agent.action_state.timer = 0.0; let mut aggro_on = false; + // Search the area. + // TODO: choose target by more than just distance + let common::CachedSpatialGrid(grid) = self.cached_spatial_grid; + + let entities_nearby = grid + .in_circle_aabr(self.pos.0.xy(), agent.psyche.search_dist()) + .collect_vec(); + + let can_ambush = |entity: EcsEntity, read_data: &ReadData| { + let self_different_from_entity = || { + read_data + .uids + .get(entity) + .map_or(false, |eu| eu != self.uid) + }; + if self.will_ambush() + && self_different_from_entity() + && !self.passive_towards(entity, read_data) + { + let surrounding_humanoids = entities_nearby + .iter() + .filter(|e| read_data.bodies.get(**e).map_or(false, |b| b.is_humanoid())) + .collect_vec(); + surrounding_humanoids.len() == 2 + && surrounding_humanoids.iter().any(|e| **e == entity) + } else { + false + } + }; + let get_pos = |entity| read_data.positions.get(entity); let get_enemy = |(entity, attack_target): (EcsEntity, bool)| { if attack_target { if self.is_enemy(entity, read_data) { Some((entity, true)) + } else if can_ambush(entity, read_data) { + aggro_on = true; + Some((entity, true)) } else if self.should_defend(entity, read_data) { if let Some(attacker) = get_attacker(entity, read_data) { if !self.passive_towards(attacker, read_data) { @@ -822,13 +856,9 @@ impl<'a> AgentData<'a> { || self.can_see_entity(agent, controller, entity, e_pos, read_data) }; - // Search the area. - // TODO: choose target by more than just distance - let common::CachedSpatialGrid(grid) = self.cached_spatial_grid; - - let target = grid - .in_circle_aabr(self.pos.0.xy(), agent.psyche.search_dist()) - .filter_map(is_valid_target) + let target = entities_nearby + .iter() + .filter_map(|e| is_valid_target(*e)) .filter_map(get_enemy) .filter_map(|(entity, attack_target)| { get_pos(entity).map(|pos| (entity, pos, attack_target)) @@ -1632,6 +1662,14 @@ impl<'a> AgentData<'a> { || (is_villager(self.alignment) && is_dressed_as_cultist(entity, read_data))) } + fn will_ambush(&self) -> bool { + self.health + .map_or(false, |h| h.current() / h.maximum() > 0.7) + && self + .rtsim_entity + .map_or(false, |re| re.brain.personality.will_ambush) + } + fn should_defend(&self, entity: EcsEntity, read_data: &ReadData) -> bool { let entity_alignment = read_data.alignments.get(entity); From e306b3bfe35a5353e6985ae64436c651cb291385 Mon Sep 17 00:00:00 2001 From: Tormod Gjeitnes Hellen Date: Tue, 12 Jul 2022 22:16:12 +0200 Subject: [PATCH 074/854] Have the ambushers say something. Very unsure about the way I did this... --- assets/voxygen/i18n/en/npc.ftl | 3 +++ common/src/comp/controller.rs | 1 + server/src/sys/agent.rs | 14 +++++++++++++- server/src/sys/agent/behavior_tree.rs | 11 +++++++---- server/src/sys/agent/behavior_tree/interaction.rs | 12 ++++++++++-- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/assets/voxygen/i18n/en/npc.ftl b/assets/voxygen/i18n/en/npc.ftl index 708e649d7b..5d85c35b37 100644 --- a/assets/voxygen/i18n/en/npc.ftl +++ b/assets/voxygen/i18n/en/npc.ftl @@ -92,6 +92,9 @@ npc-speech-merchant_trade_declined = npc-speech-merchant_trade_cancelled_hostile = .a0 = Sorry to cut it short, we have a problem to solve here! .a1 = We'll trade later, I need to take care of this first! +npc-speech-ambush = + .a0 = It's unwise to travel alone! + .a1 = Like stealing candy from a baby! npc-speech-villager_cultist_alarm = .a0 = Lookout! There is a cultist on the loose! .a1 = To arms! The cultists are attacking! diff --git a/common/src/comp/controller.rs b/common/src/comp/controller.rs index 6c87700846..3396f22016 100644 --- a/common/src/comp/controller.rs +++ b/common/src/comp/controller.rs @@ -130,6 +130,7 @@ pub enum UtteranceKind { Hurt, Greeting, Scream, + Ambush, /* Death, * TODO: Wait for more post-death features (i.e. animations) before implementing death * sounds */ diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index d336a01676..b172d040b6 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -745,7 +745,13 @@ impl<'a> AgentData<'a> { } } - fn choose_target(&self, agent: &mut Agent, controller: &mut Controller, read_data: &ReadData) { + fn choose_target( + &self, + agent: &mut Agent, + controller: &mut Controller, + read_data: &ReadData, + event_emitter: &mut Emitter, + ) { agent.action_state.timer = 0.0; let mut aggro_on = false; @@ -785,6 +791,12 @@ impl<'a> AgentData<'a> { if self.is_enemy(entity, read_data) { Some((entity, true)) } else if can_ambush(entity, read_data) { + controller.clone().push_utterance(UtteranceKind::Ambush); + self.chat_npc_if_allowed_to_speak( + "npc-speech-ambush".to_string(), + agent, + event_emitter, + ); aggro_on = true; Some((entity, true)) } else if self.should_defend(entity, read_data) { diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index e4b6dc79ca..d6e42217b0 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -455,9 +455,12 @@ fn handle_timed_events(bdata: &mut BehaviorData) -> bool { } if bdata.rng.gen::() < 0.1 { - bdata - .agent_data - .choose_target(bdata.agent, bdata.controller, bdata.read_data); + bdata.agent_data.choose_target( + bdata.agent, + bdata.controller, + bdata.read_data, + bdata.event_emitter, + ); } else { bdata.agent_data.handle_sounds_heard( bdata.agent, @@ -577,7 +580,7 @@ fn do_combat(bdata: &mut BehaviorData) -> bool { read_data.time.0 - selected_at > RETARGETING_THRESHOLD_SECONDS; if !in_aggro_range && is_time_to_retarget { - agent_data.choose_target(agent, controller, read_data); + agent_data.choose_target(agent, controller, read_data, event_emitter); } if aggro_on { diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index f0216ab0b6..b49a4bdc31 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -94,7 +94,13 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { { let personality = &rtsim_entity.brain.personality; let standard_response_msg = || -> String { - if personality + if personality.will_ambush { + format!( + "I'm heading to {}! Want to come along? We'll make \ + great travel buddies, hehe.", + destination_name + ) + } else if personality .personality_traits .contains(PersonalityTrait::Extroverted) { @@ -121,7 +127,9 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { }, )); if rtsim_entity.brain.remembers_character(&tgt_stats.name) { - if personality + if personality.will_ambush { + "Just follow me a bit more, hehe.".to_string() + } else if personality .personality_traits .contains(PersonalityTrait::Extroverted) { From fdaaa24338a66f4fa4e7679cf85f9fd46015b842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 18 Aug 2022 09:00:16 +0200 Subject: [PATCH 075/854] fix coverage --- voxygen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index ab62c523cf..d956487fff 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -35,7 +35,7 @@ shaderc-from-source = ["shaderc/build-from-source"] discord = ["discord-sdk"] # We don't ship egui with published release builds so a separate feature is required that excludes it. -default-publish = ["singleplayer", "native-dialog", "plugins", "simd", "discord"] +default-publish = ["singleplayer", "native-dialog", "plugins", "discord", "simd"] # keep simd the last in this list # Temp for bug on current wgpu version that has access violation in vulkan when constructing egui pipeline default-no-egui = ["default-publish", "hot-reloading", "shaderc-from-source"] default = ["default-no-egui", "egui-ui"] From c968e5c748c09c26bd8c246d9ae2e63d1dad230c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 18 Aug 2022 12:38:17 +0200 Subject: [PATCH 076/854] Initial reproduction of the slowjob freezen with par_iter and slowjob, See that we spawn 2 jobs in the first loop, the loop seems to NOT complete until those jobs are executed Next step is to do everything with plain rayon coding --- common/src/slowjob.rs | 106 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/common/src/slowjob.rs b/common/src/slowjob.rs index 414d4888f8..6e3f267f76 100644 --- a/common/src/slowjob.rs +++ b/common/src/slowjob.rs @@ -399,6 +399,8 @@ impl SlowJobPool { #[cfg(test)] mod tests { + use std::sync::Barrier; + use std::sync::atomic::AtomicU64; use super::*; fn mock_pool( @@ -746,4 +748,108 @@ mod tests { let baz = metrics.get("BAZ").expect("BAZ doesn't exist in metrics"); assert_eq!(baz.len(), 1); } + + + fn busy_work(ms: u64) { + let x = Instant::now(); + while x.elapsed() < std::time::Duration::from_millis(ms) { + } + } + + use std::time::Duration; + use std::sync::atomic::Ordering; + + fn work_barrier2(counter: Arc, ms: u64) -> () { + println!(".{}..", ms); + busy_work(ms); + println!(".{}..Done", ms); + counter.fetch_add(1, Ordering::SeqCst); + } + + fn work_barrier(counter: &Arc, ms: u64) -> impl std::ops::FnOnce() -> () { + let counter = Arc::clone(&counter); + println!("Create work_barrier"); + move || work_barrier2(counter, ms) + } + + #[test] + fn ffffff() { + let threadpool = Arc::new(rayon::ThreadPoolBuilder::new() + .num_threads(2) + .build() + .unwrap()); + let pool = SlowJobPool::new(2, 100, threadpool.clone()); + pool.configure("FOO", |x| x ); + pool.configure("BAR", |x| x / 2); + pool.configure("BAZ", |_| 1); + let pool2 = SlowJobPool::new(2, 100, threadpool.clone()); + pool2.configure("FOO", |x| x ); + pool2.configure("BAR", |x| x / 2); + pool2.configure("BAZ", |_| 1); + let counter = Arc::new(AtomicU64::new(0)); + let start = Instant::now(); + //pool.spawn("BAZ", work_barrier(&counter, 1000)); + //for _ in 0..600 { + // pool.spawn("FOO", work_barrier(&counter, 10)); + //} + + threadpool.install(|| { + use rayon::prelude::*; + let mut iter = Vec::new(); + for i in 0..1000 { + iter.push((i, work_barrier(&counter, 10))); + } + let mut iter2 = Vec::new(); + for i in 0..1000 { + iter2.push((i, work_barrier(&counter, 10))); + } + iter.into_par_iter().map(|(i, task)| { + task(); + if i == 900 { + println!("Spawning task"); + pool.spawn("BAZ", work_barrier(&counter, 1000)); + pool2.spawn("BAZ", work_barrier(&counter, 10000)); + println!("Spawned tasks"); + } + if i == 999 { + println!("The first ITER end"); + } + }).collect::>(); + println!("The first ITER finished"); + //pool2.spawn("BAZ", work_barrier(&counter, 1000)); + //pool2.spawn("BAZ", work_barrier(&counter, 1000)); + //pool2.spawn("BAZ", work_barrier(&counter, 1000)); + iter2.into_par_iter().map(|(i, task)| { + if i == 0 { + println!("The second ITER started"); + } + task(); + }).collect::>(); + + }); + + + //pool.spawn("FOO", work_barrier(&barrier, 1)); + + + + + println!("wait for test finish"); + const TIMEOUT: Duration = Duration::from_secs(2); + let mut last_n_time = (0, start); + loop { + let now = Instant::now(); + let n = counter.load(Ordering::SeqCst); + if n != last_n_time.0 { + last_n_time = (n, now); + } else if now.duration_since(last_n_time.1) > TIMEOUT { + break; + } + } + let d = last_n_time.1.duration_since(start); + println!("=============="); + println!("Time Passed: {}ms", d.as_millis()); + println!("Jobs finished: {}", last_n_time.0); + + } } From d26422dc293c0e749fb9a4d2fe5c935b45e4d255 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 19 Aug 2022 00:09:39 +0300 Subject: [PATCH 077/854] Resurrect convert_utf8_to_ascii --- voxygen/i18n/src/lib.rs | 24 +++++++++++++----------- voxygen/i18n/src/raw.rs | 31 +++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 5c36c7eb6f..bcd931df4d 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -10,6 +10,8 @@ use fluent_bundle::{bundle::FluentBundle, FluentResource}; use intl_memoizer::concurrent::IntlLangMemoizer; use unic_langid::LanguageIdentifier; +use deunicode::deunicode; + use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use std::{borrow::Cow, io}; @@ -65,15 +67,9 @@ pub type Fonts = HashMap; struct Language { /// The bundle storing all localized texts pub(crate) bundle: FluentBundle, - /// Whether to convert the input text encoded in UTF-8 - /// into a ASCII version by using the `deunicode` crate. - // FIXME (i18n convert_utf8_to_ascii): - #[allow(dead_code)] - convert_utf8_to_ascii: bool, /// Font configuration is stored here pub(crate) fonts: Fonts, - pub(crate) metadata: LanguageMetadata, } @@ -154,10 +150,17 @@ impl assets::Compound for Language { match cache.load(id) { Ok(handle) => { let source: &raw::Resource = &*handle.read(); - let resource = - FluentResource::try_new(source.src.clone()).map_err(|(_ast, errs)| { - ResourceErr::parsing_error(errs, id.to_owned(), &source.src) - })?; + let src = source.src.clone(); + + let src = if convert_utf8_to_ascii { + deunicode(&src) + } else { + src + }; + + let resource = FluentResource::try_new(src).map_err(|(_ast, errs)| { + ResourceErr::parsing_error(errs, id.to_owned(), &source.src) + })?; bundle .add_resource(resource) @@ -172,7 +175,6 @@ impl assets::Compound for Language { Ok(Self { bundle, - convert_utf8_to_ascii, fonts, metadata, }) diff --git a/voxygen/i18n/src/raw.rs b/voxygen/i18n/src/raw.rs index d869203582..7956675a52 100644 --- a/voxygen/i18n/src/raw.rs +++ b/voxygen/i18n/src/raw.rs @@ -1,12 +1,15 @@ -use crate::{Fonts, LanguageMetadata}; +use crate::{ + assets::{loader, StringLoader}, + Fonts, LanguageMetadata, +}; use serde::{Deserialize, Serialize}; -use std::str::FromStr; - /// Localization metadata from manifest file /// See `Language` for more info on each attributes #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub(crate) struct Manifest { + /// Whether to convert the input text encoded in UTF-8 + /// into a ASCII version by using the `deunicode` crate. pub(crate) convert_utf8_to_ascii: bool, pub(crate) fonts: Fonts, pub(crate) metadata: LanguageMetadata, @@ -18,19 +21,31 @@ impl crate::assets::Asset for Manifest { const EXTENSION: &'static str = "ron"; } +// Newtype wrapper representing fluent resource. +// +// NOTE: +// We store String, that later converted to FluentResource. +// We can't do it at load time, because we might want to do ut8 to ascii +// conversion and we know it only after we've loaded language manifest. +// +// Alternative solution is to make it hold Rc/Arc around FluentResource, +// implement methods that give us mutable control around resource entries, +// but doing it to eliminate Clone that happens N per programm life seems as +// overengineering. +// +// N is time of fluent files, so about 20 for English and the same for target +// localisation. #[derive(Clone)] pub(crate) struct Resource { pub(crate) src: String, } -impl FromStr for Resource { - type Err = std::convert::Infallible; - - fn from_str(s: &str) -> Result { Ok(Self { src: s.to_owned() }) } +impl From for Resource { + fn from(src: String) -> Self { Self { src } } } impl crate::assets::Asset for Resource { - type Loader = crate::assets::loader::ParseLoader; + type Loader = loader::LoadFrom; const EXTENSION: &'static str = "ftl"; } From f104085a8566d0ad94ff3bbf3fe9e525c6c03faa Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 19 Aug 2022 01:46:41 +0300 Subject: [PATCH 078/854] Adress review 1) Add NOTE about brute-force deunicode 2) Fix ut8 -> utf8 typo in comment --- voxygen/i18n/src/lib.rs | 5 +++++ voxygen/i18n/src/raw.rs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index bcd931df4d..3a4f2b4835 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -152,6 +152,11 @@ impl assets::Compound for Language { let source: &raw::Resource = &*handle.read(); let src = source.src.clone(); + // NOTE: + // This deunicode whole file, which mean it may break if + // we have non-ascii keys. + // I don't consider this a problem, because having + // non-ascii keys is quite exotic. let src = if convert_utf8_to_ascii { deunicode(&src) } else { diff --git a/voxygen/i18n/src/raw.rs b/voxygen/i18n/src/raw.rs index 7956675a52..4c3d3d8d68 100644 --- a/voxygen/i18n/src/raw.rs +++ b/voxygen/i18n/src/raw.rs @@ -25,7 +25,7 @@ impl crate::assets::Asset for Manifest { // // NOTE: // We store String, that later converted to FluentResource. -// We can't do it at load time, because we might want to do ut8 to ascii +// We can't do it at load time, because we might want to do utf8 to ascii // conversion and we know it only after we've loaded language manifest. // // Alternative solution is to make it hold Rc/Arc around FluentResource, From 25d9e5b27e9f9377ddbc7967fe7007e1630b0f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 18 Aug 2022 19:57:30 +0200 Subject: [PATCH 079/854] workaround for https://github.com/rayon-rs/rayon/issues/969 Unfortuatly rayon has a bug that if you Threadpool.spawn from inside a parallel iterator from inside a Threadpool.install, that the parallel iterator will BLOCK till the Threadpool.spawn finished, which causes many many lag spikes. I assume this might be the case for the pictures in the gantt chart where a system took unusual long or had a long pause that was unexplained. I also raise the number of threads by 1, as this rayon thread will prob be useless in all cases and have no real work to do. EDIT: it turns out the tests are sporadicly failing and this soluction doesnt work --- CHANGELOG.md | 3 +- common/src/slowjob.rs | 179 ++++++++++++++++---------------------- common/state/src/state.rs | 2 +- 3 files changed, 76 insertions(+), 108 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c24ad07e6b..52210a5847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,7 +105,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Modular weapons now have a selling price - Closing a subwindow now only regrabs the cursor if no other subwindow requires it. - Fixed npc not handling interactions while fighting (especially merchants in trade) -- Fixed bug where you would still be burning after dying in lava. +- Fixed bug where you would still be burning after dying in lava. +- Workaround for rayon bug that caused lag spikes in slowjobs ## [0.12.0] - 2022-02-19 diff --git a/common/src/slowjob.rs b/common/src/slowjob.rs index 6e3f267f76..a7cb2d88dc 100644 --- a/common/src/slowjob.rs +++ b/common/src/slowjob.rs @@ -55,16 +55,18 @@ pub struct SlowJob { id: u64, } +type JobType = Box; + struct InternalSlowJobPool { next_id: u64, queue: HashMap>, + dispatch_sender: std::sync::mpsc::Sender, configs: HashMap, last_spawned_configs: Vec, global_spawned_and_running: u64, global_limit: u64, jobs_metrics_cnt: usize, jobs_metrics: HashMap>, - threadpool: Arc, internal: Option>>, } @@ -77,7 +79,7 @@ struct Config { struct Queue { id: u64, name: String, - task: Box, + task: JobType, } pub struct JobMetrics { @@ -124,16 +126,18 @@ impl InternalSlowJobPool { jobs_metrics_cnt: usize, threadpool: Arc, ) -> Arc> { + let (dispatch_sender, dispatch_receiver) = std::sync::mpsc::channel(); + Self::dispatcher(threadpool, dispatch_receiver); let link = Arc::new(Mutex::new(Self { next_id: 0, queue: HashMap::new(), + dispatch_sender, configs: HashMap::new(), last_spawned_configs: Vec::new(), global_spawned_and_running: 0, global_limit: global_limit.max(1), jobs_metrics_cnt, jobs_metrics: HashMap::new(), - threadpool, internal: None, })); @@ -144,6 +148,20 @@ impl InternalSlowJobPool { link } + pub fn dispatcher( + threadpool: Arc, + dispatch_receiver: std::sync::mpsc::Receiver, + ) { + let dispatch_receiver = Mutex::new(dispatch_receiver); + let threadpool2 = Arc::clone(&threadpool); + threadpool.spawn(move || { + let dispatch_receiver = dispatch_receiver.lock().unwrap(); + for task in dispatch_receiver.iter() { + threadpool2.spawn(task) + } + }); + } + /// returns order of configuration which are queued next fn calc_queued_order( &self, @@ -307,7 +325,9 @@ impl InternalSlowJobPool { .position(|e| e == &queue.name) .map(|i| self.last_spawned_configs.remove(i)); self.last_spawned_configs.push(queue.name.to_owned()); - self.threadpool.spawn(queue.task); + if let Err(e) = self.dispatch_sender.send(queue.task) { + error!(?e, "dispatcher thread seems to have crashed"); + }; }, None => error!( "internal calculation is wrong, we extected a schedulable job to be \ @@ -399,9 +419,14 @@ impl SlowJobPool { #[cfg(test)] mod tests { - use std::sync::Barrier; - use std::sync::atomic::AtomicU64; use super::*; + use std::{ + sync::{ + atomic::{AtomicBool, AtomicU64, Ordering}, + Barrier, + }, + time::Duration, + }; fn mock_pool( pool_threads: usize, @@ -654,10 +679,9 @@ mod tests { #[test] fn try_run_exhausted() { - use std::{thread::sleep, time::Duration}; let pool = mock_pool(8, 8, 0, 4, 2, 0); let func = || loop { - sleep(Duration::from_secs(1)) + std::thread::sleep(Duration::from_secs(1)) }; pool.try_run("FOO", func).unwrap(); pool.try_run("BAR", func).unwrap(); @@ -675,7 +699,7 @@ mod tests { #[test] fn actually_runs_1() { let pool = mock_pool(4, 4, 0, 0, 0, 1); - let barrier = Arc::new(std::sync::Barrier::new(2)); + let barrier = Arc::new(Barrier::new(2)); let barrier_clone = Arc::clone(&barrier); pool.try_run("BAZ", move || { barrier_clone.wait(); @@ -687,7 +711,7 @@ mod tests { #[test] fn actually_runs_2() { let pool = mock_pool(4, 4, 0, 0, 0, 1); - let barrier = Arc::new(std::sync::Barrier::new(2)); + let barrier = Arc::new(Barrier::new(2)); let barrier_clone = Arc::clone(&barrier); pool.spawn("BAZ", move || { barrier_clone.wait(); @@ -697,10 +721,6 @@ mod tests { #[test] fn actually_waits() { - use std::sync::{ - atomic::{AtomicBool, Ordering}, - Barrier, - }; let pool = mock_pool(4, 4, 0, 4, 0, 1); let ops_i_ran = Arc::new(AtomicBool::new(false)); let ops_i_ran_clone = Arc::clone(&ops_i_ran); @@ -717,7 +737,7 @@ mod tests { barrier2_clone.wait(); }); // in this case we have to sleep - std::thread::sleep(std::time::Duration::from_secs(1)); + std::thread::sleep(Duration::from_secs(1)); assert!(!ops_i_ran.load(Ordering::SeqCst)); // now finish the first job barrier.wait(); @@ -727,7 +747,6 @@ mod tests { #[test] fn verify_metrics() { - use std::sync::Barrier; let pool = mock_pool(4, 4, 2, 1, 0, 4); let barrier = Arc::new(Barrier::new(5)); for name in &["FOO", "BAZ", "FOO", "FOO"] { @@ -739,7 +758,7 @@ mod tests { // now finish all jobs barrier.wait(); // in this case we have to sleep to give it some time to store all the metrics - std::thread::sleep(std::time::Duration::from_secs(2)); + std::thread::sleep(Duration::from_secs(2)); let metrics = pool.take_metrics(); let foo = metrics.get("FOO").expect("FOO doesn't exist in metrics"); //its limited to 2, even though we had 3 jobs @@ -749,107 +768,55 @@ mod tests { assert_eq!(baz.len(), 1); } - - fn busy_work(ms: u64) { - let x = Instant::now(); - while x.elapsed() < std::time::Duration::from_millis(ms) { - } - } - - use std::time::Duration; - use std::sync::atomic::Ordering; - - fn work_barrier2(counter: Arc, ms: u64) -> () { - println!(".{}..", ms); - busy_work(ms); - println!(".{}..Done", ms); - counter.fetch_add(1, Ordering::SeqCst); - } - fn work_barrier(counter: &Arc, ms: u64) -> impl std::ops::FnOnce() -> () { - let counter = Arc::clone(&counter); + let counter = Arc::clone(counter); println!("Create work_barrier"); - move || work_barrier2(counter, ms) + move || { + println!(".{}..", ms); + std::thread::sleep(Duration::from_millis(ms)); + println!(".{}..Done", ms); + counter.fetch_add(1, Ordering::SeqCst); + } } #[test] - fn ffffff() { - let threadpool = Arc::new(rayon::ThreadPoolBuilder::new() - .num_threads(2) - .build() - .unwrap()); - let pool = SlowJobPool::new(2, 100, threadpool.clone()); - pool.configure("FOO", |x| x ); - pool.configure("BAR", |x| x / 2); - pool.configure("BAZ", |_| 1); - let pool2 = SlowJobPool::new(2, 100, threadpool.clone()); - pool2.configure("FOO", |x| x ); - pool2.configure("BAR", |x| x / 2); - pool2.configure("BAZ", |_| 1); + fn verify_that_spawn_doesnt_block_par_iter() { + let threadpool = Arc::new( + rayon::ThreadPoolBuilder::new() + .num_threads(20) + .build() + .unwrap(), + ); + let pool = SlowJobPool::new(2, 100, Arc::::clone(&threadpool)); + pool.configure("BAZ", |_| 2); let counter = Arc::new(AtomicU64::new(0)); let start = Instant::now(); - //pool.spawn("BAZ", work_barrier(&counter, 1000)); - //for _ in 0..600 { - // pool.spawn("FOO", work_barrier(&counter, 10)); - //} threadpool.install(|| { use rayon::prelude::*; - let mut iter = Vec::new(); - for i in 0..1000 { - iter.push((i, work_barrier(&counter, 10))); - } - let mut iter2 = Vec::new(); - for i in 0..1000 { - iter2.push((i, work_barrier(&counter, 10))); - } - iter.into_par_iter().map(|(i, task)| { - task(); - if i == 900 { - println!("Spawning task"); - pool.spawn("BAZ", work_barrier(&counter, 1000)); - pool2.spawn("BAZ", work_barrier(&counter, 10000)); - println!("Spawned tasks"); - } - if i == 999 { - println!("The first ITER end"); - } - }).collect::>(); - println!("The first ITER finished"); - //pool2.spawn("BAZ", work_barrier(&counter, 1000)); - //pool2.spawn("BAZ", work_barrier(&counter, 1000)); - //pool2.spawn("BAZ", work_barrier(&counter, 1000)); - iter2.into_par_iter().map(|(i, task)| { - if i == 0 { - println!("The second ITER started"); - } - task(); - }).collect::>(); - + (0..100) + .into_par_iter() + .map(|i| { + std::thread::sleep(Duration::from_millis(10)); + if i == 50 { + pool.spawn("BAZ", work_barrier(&counter, 2000)); + } + if i == 99 { + println!("The first ITER end, at {}ms", start.elapsed().as_millis()); + } + }) + .collect::>(); + let elapsed = start.elapsed().as_millis(); + println!("The first ITER finished, at {}ms", elapsed); + assert!( + elapsed < 1900, + "It seems like the par_iter waited on the 2s sleep task to finish" + ); }); - - //pool.spawn("FOO", work_barrier(&barrier, 1)); - - - - - println!("wait for test finish"); - const TIMEOUT: Duration = Duration::from_secs(2); - let mut last_n_time = (0, start); - loop { - let now = Instant::now(); - let n = counter.load(Ordering::SeqCst); - if n != last_n_time.0 { - last_n_time = (n, now); - } else if now.duration_since(last_n_time.1) > TIMEOUT { - break; - } + while counter.load(Ordering::SeqCst) == 0 { + println!("waiting for BAZ task to finish"); + std::thread::sleep(Duration::from_secs(1)); } - let d = last_n_time.1.duration_since(start); - println!("=============="); - println!("Time Passed: {}ms", d.as_millis()); - println!("Jobs finished: {}", last_n_time.0); - } } diff --git a/common/state/src/state.rs b/common/state/src/state.rs index d088bc84d3..6d659c9f07 100644 --- a/common/state/src/state.rs +++ b/common/state/src/state.rs @@ -110,7 +110,7 @@ impl State { let thread_pool = Arc::new( ThreadPoolBuilder::new() - .num_threads(num_cpus::get().max(common::consts::MIN_RECOMMENDED_RAYON_THREADS)) + .num_threads(num_cpus::get().max(common::consts::MIN_RECOMMENDED_RAYON_THREADS) + 1 /*workaround for a rayon schedule bug, see MR 3546*/) .thread_name(move |i| format!("rayon-{}-{}", thread_name_infix, i)) .build() .unwrap(), From 8ca458188d524edfe5af411f37392fabfeaaaafd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Fri, 19 Aug 2022 09:30:56 +0200 Subject: [PATCH 080/854] also those dispatcher tricks wont help the test, it still sporadically fails --- common/src/slowjob.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/common/src/slowjob.rs b/common/src/slowjob.rs index a7cb2d88dc..9af7b348d9 100644 --- a/common/src/slowjob.rs +++ b/common/src/slowjob.rs @@ -155,10 +155,14 @@ impl InternalSlowJobPool { let dispatch_receiver = Mutex::new(dispatch_receiver); let threadpool2 = Arc::clone(&threadpool); threadpool.spawn(move || { - let dispatch_receiver = dispatch_receiver.lock().unwrap(); - for task in dispatch_receiver.iter() { - threadpool2.spawn(task) - } + threadpool2.in_place_scope(|s| { + s.spawn(|s| { + let dispatch_receiver = dispatch_receiver.lock().unwrap(); + for task in dispatch_receiver.iter() { + s.spawn(|_| (task)()); + } + }); + }); }); } From 3eac68000bf81d091f09e94b7d22c0a96165f0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Fri, 19 Aug 2022 09:47:54 +0200 Subject: [PATCH 081/854] all tests shows there is currently no way to keep rayon from work-stealing over scopes and doing really really weird stuff between the ECS threadpool and the slowjob Threadpool. so even if i dont like to have multiple threads i think there is no other workaround than just creating a second threapool for background tasks --- common/src/slowjob.rs | 39 +++++++++++++-------------------------- common/state/src/state.rs | 2 +- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/common/src/slowjob.rs b/common/src/slowjob.rs index 9af7b348d9..86c9c1afab 100644 --- a/common/src/slowjob.rs +++ b/common/src/slowjob.rs @@ -60,13 +60,13 @@ type JobType = Box; struct InternalSlowJobPool { next_id: u64, queue: HashMap>, - dispatch_sender: std::sync::mpsc::Sender, configs: HashMap, last_spawned_configs: Vec, global_spawned_and_running: u64, global_limit: u64, jobs_metrics_cnt: usize, jobs_metrics: HashMap>, + threadpool: Arc, internal: Option>>, } @@ -124,20 +124,27 @@ impl InternalSlowJobPool { pub fn new( global_limit: u64, jobs_metrics_cnt: usize, - threadpool: Arc, + _threadpool: Arc, ) -> Arc> { - let (dispatch_sender, dispatch_receiver) = std::sync::mpsc::channel(); - Self::dispatcher(threadpool, dispatch_receiver); + // rayon is having a bug where a ECS task could work-steal a slowjob if we use + // the same threadpool, which would cause lagspikes we dont want! + let threadpool = Arc::new( + rayon::ThreadPoolBuilder::new() + .num_threads(global_limit as usize) + .thread_name(move |i| format!("slowjob-{}", i)) + .build() + .unwrap(), + ); let link = Arc::new(Mutex::new(Self { next_id: 0, queue: HashMap::new(), - dispatch_sender, configs: HashMap::new(), last_spawned_configs: Vec::new(), global_spawned_and_running: 0, global_limit: global_limit.max(1), jobs_metrics_cnt, jobs_metrics: HashMap::new(), + threadpool, internal: None, })); @@ -148,24 +155,6 @@ impl InternalSlowJobPool { link } - pub fn dispatcher( - threadpool: Arc, - dispatch_receiver: std::sync::mpsc::Receiver, - ) { - let dispatch_receiver = Mutex::new(dispatch_receiver); - let threadpool2 = Arc::clone(&threadpool); - threadpool.spawn(move || { - threadpool2.in_place_scope(|s| { - s.spawn(|s| { - let dispatch_receiver = dispatch_receiver.lock().unwrap(); - for task in dispatch_receiver.iter() { - s.spawn(|_| (task)()); - } - }); - }); - }); - } - /// returns order of configuration which are queued next fn calc_queued_order( &self, @@ -329,9 +318,7 @@ impl InternalSlowJobPool { .position(|e| e == &queue.name) .map(|i| self.last_spawned_configs.remove(i)); self.last_spawned_configs.push(queue.name.to_owned()); - if let Err(e) = self.dispatch_sender.send(queue.task) { - error!(?e, "dispatcher thread seems to have crashed"); - }; + self.threadpool.spawn(queue.task); }, None => error!( "internal calculation is wrong, we extected a schedulable job to be \ diff --git a/common/state/src/state.rs b/common/state/src/state.rs index 6d659c9f07..d088bc84d3 100644 --- a/common/state/src/state.rs +++ b/common/state/src/state.rs @@ -110,7 +110,7 @@ impl State { let thread_pool = Arc::new( ThreadPoolBuilder::new() - .num_threads(num_cpus::get().max(common::consts::MIN_RECOMMENDED_RAYON_THREADS) + 1 /*workaround for a rayon schedule bug, see MR 3546*/) + .num_threads(num_cpus::get().max(common::consts::MIN_RECOMMENDED_RAYON_THREADS)) .thread_name(move |i| format!("rayon-{}-{}", thread_name_infix, i)) .build() .unwrap(), From a16af151400f1ca9d2b7b1bef6edc6cf8d557498 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 19 Aug 2022 18:29:47 +0300 Subject: [PATCH 082/854] Make CI trigger on .ftl changes --- .gitlab/CI/recompile.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab/CI/recompile.yml b/.gitlab/CI/recompile.yml index a6bc634b8e..cd1fa94863 100644 --- a/.gitlab/CI/recompile.yml +++ b/.gitlab/CI/recompile.yml @@ -4,7 +4,7 @@ - if: $CI_PIPELINE_SOURCE == "merge_request_event" # No '-' here is *very* important: https://docs.gitlab.com/ee/ci/yaml/#complex-rule-clauses changes: - - "**/*.{glsl,png,rs,ron,toml,vox,yml,wav,sh}" + - "**/*.{glsl,png,rs,ron,ftl,toml,vox,yml,wav,sh}" - "rust-toolchain" - "Cargo.lock" - ".gitlab-ci.yml" @@ -14,7 +14,7 @@ .recompile: rules: - changes: - - "**/*.{glsl,png,rs,ron,toml,vox,yml,wav,sh}" + - "**/*.{glsl,png,rs,ron,ftl,toml,vox,yml,wav,sh}" - "rust-toolchain" - "Cargo.lock" - - ".gitlab-ci.yml" \ No newline at end of file + - ".gitlab-ci.yml" From e15c375cb58fb9b6979ff9c1d8f659e4f7f3c253 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 19 Aug 2022 03:18:33 +0300 Subject: [PATCH 083/854] Use fluent attributes for abilities * Better translation logic and ergonomics * Cut two format!-s --- assets/voxygen/i18n/en/hud/ability.ftl | 30 +++---- assets/voxygen/i18n/pl_PL/hud/ability.ftl | 30 +++---- assets/voxygen/i18n/pt_BR/hud/ability.ftl | 30 +++---- assets/voxygen/i18n/ro_RO/hud/ability.ftl | 30 +++---- assets/voxygen/i18n/sv_SE/hud/ability.ftl | 30 +++---- assets/voxygen/i18n/uk_UA/hud/ability.ftl | 30 +++---- voxygen/i18n/src/lib.rs | 101 ++++++++++++++++++++++ voxygen/src/hud/util.rs | 19 +--- 8 files changed, 187 insertions(+), 113 deletions(-) diff --git a/assets/voxygen/i18n/en/hud/ability.ftl b/assets/voxygen/i18n/en/hud/ability.ftl index 6a1e7c1a10..6d11bd42f3 100644 --- a/assets/voxygen/i18n/en/hud/ability.ftl +++ b/assets/voxygen/i18n/en/hud/ability.ftl @@ -1,16 +1,14 @@ -common-abilities-debug-possess-name = Possessing Arrow -common-abilities-debug-possess-desc = Shoots a poisonous arrow. Lets you control your target. -common-abilities-sword-spin-name = Whirlwind -common-abilities-sword-spin-desc = Move forward while spinning with your sword. -common-abilities-axe-leap-name = Axe Jump -common-abilities-axe-leap-desc = A jump with the slashing leap to position of cursor. -common-abilities-hammer-leap-name = Smash of Doom -common-abilities-hammer-leap-desc = An AOE attack with knockback. Leaps to position of cursor. -common-abilities-bow-shotgun-name = Burst -common-abilities-bow-shotgun-desc = Launches a burst of arrows -common-abilities-staff-fireshockwave-name = Ring of Fire -common-abilities-staff-fireshockwave-desc = Ignites the ground with fiery shockwave. -common-abilities-sceptre-wardingaura-name = Warding Aura -common-abilities-sceptre-wardingaura-desc = Wards your allies against enemy attacks. -common-abilities-unknown-name = Ability has no title -common-abilities-unknown-desc = Ability has no description \ No newline at end of file +common-abilities-debug-possess = Possessing Arrow + .desc = Shoots a poisonous arrow. Lets you control your target. +common-abilities-sword-spin = Whirlwind + .desc = Move forward while spinning with your sword. +common-abilities-axe-leap = Axe Jump + .desc = A jump with the slashing leap to position of cursor. +common-abilities-hammer-leap = Smash of Doom + .desc = An AOE attack with knockback. Leaps to position of cursor. +common-abilities-bow-shotgun = Burst + .desc = Launches a burst of arrows +common-abilities-staff-fireshockwave = Ring of Fire + .desc = Ignites the ground with fiery shockwave. +common-abilities-sceptre-wardingaura = Warding Aura + .desc = Wards your allies against enemy attacks. diff --git a/assets/voxygen/i18n/pl_PL/hud/ability.ftl b/assets/voxygen/i18n/pl_PL/hud/ability.ftl index b4c6224b2b..6aaf695e33 100644 --- a/assets/voxygen/i18n/pl_PL/hud/ability.ftl +++ b/assets/voxygen/i18n/pl_PL/hud/ability.ftl @@ -1,16 +1,14 @@ -common-abilities-debug-possess-name = Strzała Opętania -common-abilities-debug-possess-desc = Pozwala przejąć kontrolę nad twoim celem. -common-abilities-sword-spin-name = Cyklon -common-abilities-sword-spin-desc = Poruszasz się do przodu kręcąc się z Twoim mieczem. -common-abilities-axe-leap-name = Skok Drwala -common-abilities-axe-leap-desc = Skaczesz w kierunku kursora, tnąc swoją siekierą. -common-abilities-hammer-leap-name = Uderzenie Zagłady -common-abilities-hammer-leap-desc = Atak obszarowy z odrzutem. Skaczesz w kierunku kursora, uderzając w ziemię swoim młotem. -common-abilities-bow-shotgun-name = Salwa -common-abilities-bow-shotgun-desc = Wystrzeliwujesz salwę strzał. -common-abilities-staff-fireshockwave-name = Pierścień Ognia -common-abilities-staff-fireshockwave-desc = Przywołujesz ognisty pierścień odrzucający przeciwników. -common-abilities-sceptre-wardingaura-name = Ochronna Aura -common-abilities-sceptre-wardingaura-desc = Chroni twoich sojuszników przed atakami. -common-abilities-unknown-name = Umiejętność bez nazwy -common-abilities-unknown-desc = Umiejętność bez opisu \ No newline at end of file +common-abilities-debug-possess = Strzała Opętania + .desc = Pozwala przejąć kontrolę nad twoim celem. +common-abilities-sword-spin = Cyklon + .desc = Poruszasz się do przodu kręcąc się z Twoim mieczem. +common-abilities-axe-leap = Skok Drwala + .desc = Skaczesz w kierunku kursora, tnąc swoją siekierą. +common-abilities-hammer-leap = Uderzenie Zagłady + .desc = Atak obszarowy z odrzutem. Skaczesz w kierunku kursora, uderzając w ziemię swoim młotem. +common-abilities-bow-shotgun = Salwa + .desc = Wystrzeliwujesz salwę strzał. +common-abilities-staff-fireshockwave = Pierścień Ognia + .desc = Przywołujesz ognisty pierścień odrzucający przeciwników. +common-abilities-sceptre-wardingaura = Ochronna Aura + .desc = Chroni twoich sojuszników przed atakami. diff --git a/assets/voxygen/i18n/pt_BR/hud/ability.ftl b/assets/voxygen/i18n/pt_BR/hud/ability.ftl index 6b53f9ec3f..ba3e9fec38 100644 --- a/assets/voxygen/i18n/pt_BR/hud/ability.ftl +++ b/assets/voxygen/i18n/pt_BR/hud/ability.ftl @@ -1,16 +1,14 @@ -common-abilities-debug-possess-name = Flecha Marionete -common-abilities-debug-possess-desc = Atira uma flecha venenosa que deixa você controlar seu alvo. -common-abilities-sword-spin-name = Redemoinho -common-abilities-sword-spin-desc = Movimento frontal girando com sua espada. -common-abilities-axe-leap-name = Machadada Pulante -common-abilities-axe-leap-desc = Um pulo cortante na direção do cursor do mouse. -common-abilities-hammer-leap-name = Golpe da Ruína -common-abilities-hammer-leap-desc = Um Ataque em Área que inflige Empurrão. Salta na direção do cursor do mouse. -common-abilities-bow-shotgun-name = Estrondo -common-abilities-bow-shotgun-desc = Atira uma sequência de flechas -common-abilities-staff-fireshockwave-name = Anel de Fogo -common-abilities-staff-fireshockwave-desc = Incendeia o chão com uma onda de chamas. -common-abilities-sceptre-wardingaura-name = Aura Protetora -common-abilities-sceptre-wardingaura-desc = Protege seus aliados contra ataques inimigos. -common-abilities-unknown-name = Habilidade sem título -common-abilities-unknown-desc = Habilidade sem descrição \ No newline at end of file +common-abilities-debug-possess = Flecha Marionete + .desc = Atira uma flecha venenosa que deixa você controlar seu alvo. +common-abilities-sword-spin = Redemoinho + .desc = Movimento frontal girando com sua espada. +common-abilities-axe-leap = Machadada Pulante + .desc = Um pulo cortante na direção do cursor do mouse. +common-abilities-hammer-leap = Golpe da Ruína + .desc = Um Ataque em Área que inflige Empurrão. Salta na direção do cursor do mouse. +common-abilities-bow-shotgun = Estrondo + .desc = Atira uma sequência de flechas +common-abilities-staff-fireshockwave = Anel de Fogo + .desc = Incendeia o chão com uma onda de chamas. +common-abilities-sceptre-wardingaura = Aura Protetora + .desc = Protege seus aliados contra ataques inimigos. diff --git a/assets/voxygen/i18n/ro_RO/hud/ability.ftl b/assets/voxygen/i18n/ro_RO/hud/ability.ftl index 1874c47748..efde84cc12 100644 --- a/assets/voxygen/i18n/ro_RO/hud/ability.ftl +++ b/assets/voxygen/i18n/ro_RO/hud/ability.ftl @@ -1,16 +1,14 @@ -common-abilities-debug-possess-name = Săgeată Manipulatoare -common-abilities-debug-possess-desc = Trage o săgeată otrăvitoare care te lasă să controlezi inamicul. -common-abilities-sword-spin-name = Vârtej de vânt -common-abilities-sword-spin-desc = Mișcă-te înainte în timp ce te rotești cu sabia. -common-abilities-axe-leap-name = Saltul Toporului -common-abilities-axe-leap-desc = Un salt cu mișcare tăioasă la poziția cursorului. -common-abilities-hammer-leap-name = Lovitura Morții -common-abilities-hammer-leap-desc = Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului. -common-abilities-bow-shotgun-name = Burst -common-abilities-bow-shotgun-desc = Trage rapid mai multe sageți -common-abilities-staff-fireshockwave-name = Inel de Foc -common-abilities-staff-fireshockwave-desc = Aprinde pământul cu undă de șoc în flăcări. -common-abilities-sceptre-wardingaura-name = Aură Protectoare -common-abilities-sceptre-wardingaura-desc = Protejează aliații tăi împotriva atacutilor inamicilor -common-abilities-unknown-name = Ablitatea nu are titlu -common-abilities-unknown-desc = Ablitatea nu are descripție \ No newline at end of file +common-abilities-debug-possess = Săgeată Manipulatoare + .desc = Trage o săgeată otrăvitoare care te lasă să controlezi inamicul. +common-abilities-sword-spin = Vârtej de vânt + .desc = Mișcă-te înainte în timp ce te rotești cu sabia. +common-abilities-axe-leap = Saltul Toporului + .desc = Un salt cu mișcare tăioasă la poziția cursorului. +common-abilities-hammer-leap = Lovitura Morții + .desc = Un atac „Zonă de Efect” cu aruncare. Salt la poziția cursorului. +common-abilities-bow-shotgun = Burst + .desc = Trage rapid mai multe sageți +common-abilities-staff-fireshockwave = Inel de Foc + .desc = Aprinde pământul cu undă de șoc în flăcări. +common-abilities-sceptre-wardingaura = Aură Protectoare + .desc = Protejează aliații tăi împotriva atacutilor inamicilor diff --git a/assets/voxygen/i18n/sv_SE/hud/ability.ftl b/assets/voxygen/i18n/sv_SE/hud/ability.ftl index 5b9ef08ce2..21d2e08afd 100644 --- a/assets/voxygen/i18n/sv_SE/hud/ability.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/ability.ftl @@ -1,16 +1,14 @@ -common-abilities-debug-possess-name = Besittningspil -common-abilities-debug-possess-desc = Skjuter en förgiftad pil. Låter dig kontrollera ditt mål. -common-abilities-sword-spin-name = Virvelvind -common-abilities-sword-spin-desc = Flytta dig framåt medan du snurrar med ditt svärd. -common-abilities-axe-leap-name = Yxhopp -common-abilities-axe-leap-desc = Ett hopp med det skärande språnget riktat mot pekarens position. -common-abilities-hammer-leap-name = Nederslag -common-abilities-hammer-leap-desc = En attack som träffar ett område och knuffar fiender. Hoppar mot pekarens position. -common-abilities-bow-shotgun-name = Pilskur -common-abilities-bow-shotgun-desc = Skjuter iväg en skur av pilar. -common-abilities-staff-fireshockwave-name = Eldens ring -common-abilities-staff-fireshockwave-desc = Tänder eld på marken med en eldig stötvåg. -common-abilities-sceptre-wardingaura-name = Vårdande Aura -common-abilities-sceptre-wardingaura-desc = Skyddar dina allierade mot fiendens attacker. -common-abilities-unknown-name = Förmågan har ingen titel -common-abilities-unknown-desc = Förmågan har ingen beskrivning \ No newline at end of file +common-abilities-debug-possess = Besittningspil + .desc = Skjuter en förgiftad pil. Låter dig kontrollera ditt mål. +common-abilities-sword-spin = Virvelvind + .desc = Flytta dig framåt medan du snurrar med ditt svärd. +common-abilities-axe-leap = Yxhopp + .desc = Ett hopp med det skärande språnget riktat mot pekarens position. +common-abilities-hammer-leap = Nederslag + .desc = En attack som träffar ett område och knuffar fiender. Hoppar mot pekarens position. +common-abilities-bow-shotgun = Pilskur + .desc = Skjuter iväg en skur av pilar. +common-abilities-staff-fireshockwave = Eldens ring + .desc = Tänder eld på marken med en eldig stötvåg. +common-abilities-sceptre-wardingaura = Vårdande Aura + .desc = Skyddar dina allierade mot fiendens attacker. diff --git a/assets/voxygen/i18n/uk_UA/hud/ability.ftl b/assets/voxygen/i18n/uk_UA/hud/ability.ftl index 9962c8dfa2..54916957d2 100644 --- a/assets/voxygen/i18n/uk_UA/hud/ability.ftl +++ b/assets/voxygen/i18n/uk_UA/hud/ability.ftl @@ -1,16 +1,14 @@ -common-abilities-debug-possess-name = Заклинаюча Стріла -common-abilities-debug-possess-desc = Стріляє отруйною стрілою. Дає тобі контроль над ціллю. -common-abilities-sword-spin-name = Буревій -common-abilities-sword-spin-desc = Рушай вперед кружляючи з мечем. -common-abilities-axe-leap-name = Стрибок Сокири -common-abilities-axe-leap-desc = Стрибок з рубаним ударом, слідує за курсором. -common-abilities-hammer-leap-name = Погром -common-abilities-hammer-leap-desc = Атака по області. Стрибок спрямований за курсором. -common-abilities-bow-shotgun-name = Стріловик -common-abilities-bow-shotgun-desc = Постріл купою стріл за раз. -common-abilities-staff-fireshockwave-name = Кільце Вогню -common-abilities-staff-fireshockwave-desc = Підпалює землю вогненною ударною хвилєю. -common-abilities-sceptre-wardingaura-name = Захисна Аура -common-abilities-sceptre-wardingaura-desc = Укріплює тебе і твоїх спільників силами природи на деякий час. -common-abilities-unknown-name = Неназвана Здатність -common-abilities-unknown-desc = Здатність без опису \ No newline at end of file +common-abilities-debug-possess = Заклинаюча Стріла + .desc = Стріляє отруйною стрілою. Дає тобі контроль над ціллю. +common-abilities-sword-spin = Буревій + .desc = Рушай вперед кружляючи з мечем. +common-abilities-axe-leap = Стрибок Сокири + .desc = Стрибок з рубаним ударом, слідує за курсором. +common-abilities-hammer-leap = Погром + .desc = Атака по області. Стрибок спрямований за курсором. +common-abilities-bow-shotgun = Стріловик + .desc = Постріл купою стріл за раз. +common-abilities-staff-fireshockwave = Кільце Вогню + .desc = Підпалює землю вогненною ударною хвилєю. +common-abilities-sceptre-wardingaura = Захисна Аура + .desc = Укріплює тебе і твоїх спільників силами природи на деякий час. diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 3a4f2b4835..2125aa486b 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -86,6 +86,26 @@ impl Language { Some(msg) } + fn try_attr<'a>( + &'a self, + key: &str, + attr: &str, + args: Option<&'a FluentArgs>, + ) -> Option> { + let bundle = &self.bundle; + let msg = bundle.get_message(key)?; + let attr = msg.get_attribute(attr)?; + let attr = attr.value(); + + let mut errs = Vec::new(); + let msg = bundle.format_pattern(attr, args, &mut errs); + for err in errs { + tracing::error!("err: {err} for {key}"); + } + + Some(msg) + } + fn try_variation<'a>( &'a self, key: &str, @@ -291,6 +311,10 @@ impl LocalizationGuard { .unwrap_or_else(|| Cow::Owned(key.to_owned())) } + /// Get a localized text from the variation of given key + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). pub fn try_variation(&self, key: &str, seed: u16) -> Option> { self.active.try_variation(key, seed, None).or_else(|| { self.fallback @@ -299,11 +323,22 @@ impl LocalizationGuard { }) } + /// Get a localized text from the variation of given key + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + /// If the key is not present in the localization object + /// then the key itself is returned. pub fn get_variation(&self, key: &str, seed: u16) -> Cow { self.try_variation(key, seed) .unwrap_or_else(|| Cow::Owned(key.to_owned())) } + /// Get a localized text from the variation of given key with given + /// arguments + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). pub fn try_variation_ctx<'a>( &'a self, key: &str, @@ -325,11 +360,77 @@ impl LocalizationGuard { }) } + /// Get a localized text from the variation of given key with given + /// arguments + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + /// If the key is not present in the localization object + /// then the key itself is returned. pub fn get_variation_ctx<'a>(&'a self, key: &str, seed: u16, args: &'a FluentArgs) -> Cow { self.try_variation_ctx(key, seed, args) .unwrap_or_else(|| Cow::Owned(key.to_owned())) } + /// Get a localized text from the given key by given attribute + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + pub fn try_attr(&self, key: &str, attr: &str) -> Option> { + self.active.try_attr(key, attr, None).or_else(|| { + self.fallback + .as_ref() + .and_then(|fb| fb.try_attr(key, attr, None)) + }) + } + + /// Get a localized text from the given key by given attribute + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + /// If the key is not present in the localization object + /// then the key itself is returned. + pub fn get_attr(&self, key: &str, attr: &str) -> Cow { + self.try_attr(key, attr) + .unwrap_or_else(|| Cow::Owned(format!("{key}.{attr}"))) + } + + /// Get a localized text from the given key by given attribute and arguments + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + pub fn try_attr_ctx<'a>( + &'a self, + key: &str, + attr: &str, + args: &'a FluentArgs, + ) -> Option> { + self.active + .try_attr(key, attr, Some(args)) + .or_else(|| { + self.fallback + .as_ref() + .and_then(|fb| fb.try_attr(key, attr, Some(args))) + }) + .map(|x| { + // NOTE: + // Hack. Remove Unicode Directionality Marks, conrod doesn't support them. + let res = x.replace('\u{2068}', "").replace('\u{2069}', ""); + Cow::Owned(res) + }) + } + + /// Get a localized text from the given key by given attribute and arguments + /// + /// First lookup is done in the active language, second in + /// the fallback (if present). + /// If the key is not present in the localization object + /// then the key itself is returned. + pub fn get_attr_ctx<'a>(&'a self, key: &str, attr: &str, args: &'a FluentArgs) -> Cow { + self.try_attr_ctx(key, attr, args) + .unwrap_or_else(|| Cow::Owned(format!("{key}.{attr}"))) + } + #[must_use] pub fn fonts(&self) -> &Fonts { &self.active.fonts } diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index c5c5393b25..2e8d47561c 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -359,22 +359,7 @@ pub fn ability_description<'a>( ability_id: &str, loc: &'a Localization, ) -> (Cow<'a, str>, Cow<'a, str>) { - // TODO: Use fluent attribute mechanic - let (name, desc) = ( - format!("{}.name", ability_id).replace('.', "-"), - format!("{}.desc", ability_id).replace('.', "-"), - ); + let ability = ability_id.replace('.', "-"); - // 1) Try localize ability - // 2) If not, say that ability is unknown - // 3) If unknown key is missed, just return id - // TODO: better algorithm? - ( - loc.try_msg(&name) - .or_else(|| loc.try_msg("common-abilities-unknown-name")) - .unwrap_or(Cow::Owned(name)), - loc.try_msg(&desc) - .or_else(|| loc.try_msg("common-abilities-unknown-desc")) - .unwrap_or(Cow::Owned(desc)), - ) + (loc.get_msg(&ability), loc.get_attr(&ability, "desc")) } From 0e5b472d1d9f8048efa8e2d1bea63190114bd06c Mon Sep 17 00:00:00 2001 From: Socksonme Date: Fri, 19 Aug 2022 19:45:22 +0300 Subject: [PATCH 084/854] Fix sed regex --- .gitlab/scripts/coverage.sh | 5 ++--- voxygen/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitlab/scripts/coverage.sh b/.gitlab/scripts/coverage.sh index f7b397f3dc..6addb4bd79 100755 --- a/.gitlab/scripts/coverage.sh +++ b/.gitlab/scripts/coverage.sh @@ -1,6 +1,5 @@ #!/bin/bash echo "modifying files in 5s, ctrl+c to abort" && sleep 5 -find ./* -name "Cargo.toml" -exec sed -i 's/, "simd"]/]/g' {} \; -find ./* -name "Cargo.toml" -exec sed -i 's/"simd"]/]/g' {} \; +find ./* -name "Cargo.toml" -exec sed -i -E 's/, *"simd"|"simd" *,|"simd"//g' {} \; export VELOREN_ASSETS="$(pwd)/assets"; -time cargo tarpaulin --skip-clean -v -- --test-threads=2; +time cargo tarpaulin --skip-clean -v -- --test-threads=2; \ No newline at end of file diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index d956487fff..48d4026f18 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -35,7 +35,7 @@ shaderc-from-source = ["shaderc/build-from-source"] discord = ["discord-sdk"] # We don't ship egui with published release builds so a separate feature is required that excludes it. -default-publish = ["singleplayer", "native-dialog", "plugins", "discord", "simd"] # keep simd the last in this list +default-publish = ["singleplayer", "native-dialog", "plugins", "discord", "simd"] # Temp for bug on current wgpu version that has access violation in vulkan when constructing egui pipeline default-no-egui = ["default-publish", "hot-reloading", "shaderc-from-source"] default = ["default-no-egui", "egui-ui"] From 64c909cba02147738c247d1ee5a67f34c81d6820 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 20 Aug 2022 13:23:23 +0300 Subject: [PATCH 085/854] Don't produce isolation marks in fluent --- voxygen/i18n/src/lib.rs | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 2125aa486b..99a2c9d0b7 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -198,6 +198,11 @@ impl assets::Compound for Language { } } + // NOTE: + // Basically a hack, but conrod can't use isolation marks yet. + // Veloren Issue 1649 + bundle.set_use_isolating(false); + Ok(Self { bundle, fonts, @@ -292,12 +297,7 @@ impl LocalizationGuard { .as_ref() .and_then(|fb| fb.try_msg(key, Some(args))) }) - .map(|x| { - // NOTE: - // Hack. Remove Unicode Directionality Marks, conrod doesn't support them. - let res = x.replace('\u{2068}', "").replace('\u{2069}', ""); - Cow::Owned(res) - }) + .map(|res| Cow::Owned(res.into_owned())) } /// Get a localized text from the given key using given arguments @@ -352,12 +352,6 @@ impl LocalizationGuard { .as_ref() .and_then(|fb| fb.try_variation(key, seed, Some(args))) }) - .map(|x| { - // NOTE: - // Hack. Remove Unicode Directionality Marks, conrod doesn't support them. - let res = x.replace('\u{2068}', "").replace('\u{2069}', ""); - Cow::Owned(res) - }) } /// Get a localized text from the variation of given key with given @@ -405,19 +399,11 @@ impl LocalizationGuard { attr: &str, args: &'a FluentArgs, ) -> Option> { - self.active - .try_attr(key, attr, Some(args)) - .or_else(|| { - self.fallback - .as_ref() - .and_then(|fb| fb.try_attr(key, attr, Some(args))) - }) - .map(|x| { - // NOTE: - // Hack. Remove Unicode Directionality Marks, conrod doesn't support them. - let res = x.replace('\u{2068}', "").replace('\u{2069}', ""); - Cow::Owned(res) - }) + self.active.try_attr(key, attr, Some(args)).or_else(|| { + self.fallback + .as_ref() + .and_then(|fb| fb.try_attr(key, attr, Some(args))) + }) } /// Get a localized text from the given key by given attribute and arguments From a371aad05e6ee1e27c39320c31e9f1fb3abaa107 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 20 Aug 2022 15:20:27 +0300 Subject: [PATCH 086/854] Add /body command that allows you to switch body --- common/src/cmd.rs | 7 +++++++ server/src/cmd.rs | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/common/src/cmd.rs b/common/src/cmd.rs index 96aea26498..ed8c986797 100644 --- a/common/src/cmd.rs +++ b/common/src/cmd.rs @@ -240,6 +240,7 @@ pub enum ServerChatCommand { Ban, BattleMode, BattleModeForce, + Body, Build, BuildAreaAdd, BuildAreaList, @@ -365,6 +366,11 @@ impl ServerChatCommand { None, ), + ServerChatCommand::Body => cmd( + vec![Enum("body", ENTITIES.clone(), Required)], + "Change your body to different species", + Some(Admin), + ), ServerChatCommand::BattleModeForce => cmd( vec![Enum( "battle mode", @@ -720,6 +726,7 @@ impl ServerChatCommand { ServerChatCommand::Ban => "ban", ServerChatCommand::BattleMode => "battlemode", ServerChatCommand::BattleModeForce => "battlemode_force", + ServerChatCommand::Body => "body", ServerChatCommand::Build => "build", ServerChatCommand::BuildAreaAdd => "build_area_add", ServerChatCommand::BuildAreaList => "build_area_list", diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 948d451959..ec01ab389b 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -129,6 +129,7 @@ fn do_command( ServerChatCommand::Ban => handle_ban, ServerChatCommand::BattleMode => handle_battlemode, ServerChatCommand::BattleModeForce => handle_battlemode_force, + ServerChatCommand::Body => handle_body, ServerChatCommand::Build => handle_build, ServerChatCommand::BuildAreaAdd => handle_build_area_add, ServerChatCommand::BuildAreaList => handle_build_area_list, @@ -3704,3 +3705,23 @@ fn handle_lightning( .emit_now(Outcome::Lightning { pos }); Ok(()) } + +fn handle_body( + server: &mut Server, + _client: EcsEntity, + target: EcsEntity, + args: Vec, + action: &ServerChatCommand, +) -> CmdResult<()> { + if let Some(npc::NpcBody(_id, mut body)) = parse_cmd_args!(args, npc::NpcBody) { + let body = body(); + let ecs = &server.state.ecs(); + let mut bodies = ecs.write_storage::(); + if let Some(mut target_body) = bodies.get_mut(target) { + *target_body = body; + } + Ok(()) + } else { + Err(action.help_string()) + } +} From 6319dcfc22c1167212f1e6871b70785d1ea09304 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 20 Aug 2022 16:59:57 +0300 Subject: [PATCH 087/854] Add more components in /body * Add mass * Add density * Add collider. This one is strange as always, I don't know what's wrong, but debug hitbox changes only after death. Real one seems to work. --- common/src/comp/body.rs | 19 ++++++++++++++++++- server/src/cmd.rs | 9 ++++----- server/src/state_ext.rs | 30 +++++++++--------------------- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 53a7853fda..2c7ac05664 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -27,7 +27,7 @@ use specs::{Component, DerefFlaggedStorage}; use strum::Display; use vek::*; -use super::{BuffKind, Density, Mass}; +use super::{BuffKind, Collider, Density, Mass}; make_case_elim!( body, @@ -567,6 +567,23 @@ impl Body { } } + // Body collider + pub fn collider(&self) -> Collider { + if let Body::Ship(ship) = self { + ship.make_collider() + } else { + let (p0, p1, radius) = self.sausage(); + + Collider::CapsulePrism { + p0, + p1, + radius, + z_min: 0.0, + z_max: self.height(), + } + } + } + // How far away other entities should try to be. Will be added upon the other // entity's spacing_radius. So an entity with 2.0 and an entity with 3.0 will // lead to that both entities will try to keep 5.0 units away from each diff --git a/server/src/cmd.rs b/server/src/cmd.rs index ec01ab389b..bc010776d8 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -3715,11 +3715,10 @@ fn handle_body( ) -> CmdResult<()> { if let Some(npc::NpcBody(_id, mut body)) = parse_cmd_args!(args, npc::NpcBody) { let body = body(); - let ecs = &server.state.ecs(); - let mut bodies = ecs.write_storage::(); - if let Some(mut target_body) = bodies.get_mut(target) { - *target_body = body; - } + insert_or_replace_component(server, target, body, "body")?; + insert_or_replace_component(server, target, body.mass(), "mass")?; + insert_or_replace_component(server, target, body.density(), "density")?; + insert_or_replace_component(server, target, body.collider(), "collider")?; Ok(()) } else { Err(action.help_string()) diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 237f891849..2dff0e15eb 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -241,10 +241,7 @@ impl StateExt for State { ) .with(body.mass()) .with(body.density()) - .with(match body { - comp::Body::Ship(ship) => ship.make_collider(), - _ => capsule(&body), - }) + .with(body.collider()) .with(comp::Controller::default()) .with(body) .with(comp::Energy::new( @@ -275,7 +272,7 @@ impl StateExt for State { .with(comp::Ori::default()) .with(body.mass()) .with(body.density()) - .with(capsule(&body)) + .with(body.collider()) .with(body) } @@ -290,7 +287,7 @@ impl StateExt for State { .with(item_drop.orientation(&mut thread_rng())) .with(item_drop.mass()) .with(item_drop.density()) - .with(capsule(&body)) + .with(body.collider()) .with(body) } @@ -352,7 +349,7 @@ impl StateExt for State { if projectile.is_point { projectile_base = projectile_base.with(comp::Collider::Point) } else { - projectile_base = projectile_base.with(capsule(&body)) + projectile_base = projectile_base.with(body.collider()) } projectile_base.with(projectile).with(body) @@ -425,7 +422,10 @@ impl StateExt for State { .with(pos) .with(comp::Vel(Vec3::zero())) .with(comp::Ori::default()) - .with(capsule(&object.into())) + .with({ + let body: comp::Body = object.into(); + body.collider() + }) .with(comp::Body::Object(object)) .with(comp::Mass(100.0)) // .with(comp::Sticky) @@ -577,7 +577,7 @@ impl StateExt for State { // and we call nothing that can delete it in any of the subsequent // commands, so we can assume that all of these calls succeed, // justifying ignoring the result of insertion. - self.write_component_ignore_entity_dead(entity, capsule(&body)); + self.write_component_ignore_entity_dead(entity, body.collider()); self.write_component_ignore_entity_dead(entity, body); self.write_component_ignore_entity_dead(entity, body.mass()); self.write_component_ignore_entity_dead(entity, body.density()); @@ -1040,15 +1040,3 @@ fn send_to_group(g: &Group, ecs: &specs::World, msg: &comp::ChatMsg) { } } } - -fn capsule(body: &comp::Body) -> comp::Collider { - let (p0, p1, radius) = body.sausage(); - - comp::Collider::CapsulePrism { - p0, - p1, - radius, - z_min: 0.0, - z_max: body.height(), - } -} From 69cea513eedae66d1df8414c8e84b5e7503d8d35 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sat, 20 Aug 2022 19:23:05 +0300 Subject: [PATCH 088/854] Make comments to be doc-comments --- common/src/comp/body.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 2c7ac05664..af15ed8991 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -567,7 +567,7 @@ impl Body { } } - // Body collider + /// Body collider pub fn collider(&self) -> Collider { if let Body::Ship(ship) = self { ship.make_collider() @@ -584,10 +584,10 @@ impl Body { } } - // How far away other entities should try to be. Will be added upon the other - // entity's spacing_radius. So an entity with 2.0 and an entity with 3.0 will - // lead to that both entities will try to keep 5.0 units away from each - // other. + /// How far away other entities should try to be. Will be added upon the + /// other entity's spacing_radius. So an entity with 2.0 and an entity + /// with 3.0 will lead to that both entities will try to keep 5.0 units + /// away from each other. pub fn spacing_radius(&self) -> f32 { self.max_radius() + match self { From 00a13fd8932b33973ba42b40a91275995cf7ed54 Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sat, 20 Aug 2022 20:47:37 +0100 Subject: [PATCH 089/854] Added settings missing keys --- assets/voxygen/i18n/pt_BR/hud/settings.ftl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/assets/voxygen/i18n/pt_BR/hud/settings.ftl b/assets/voxygen/i18n/pt_BR/hud/settings.ftl index c43a9bae28..da87df14a0 100644 --- a/assets/voxygen/i18n/pt_BR/hud/settings.ftl +++ b/assets/voxygen/i18n/pt_BR/hud/settings.ftl @@ -129,4 +129,8 @@ hud-settings-region = Região hud-settings-say = Fala hud-settings-all = Todos hud-settings-group_only = Grupo apenas -hud-settings-reset_chat = Restaurar Padrões \ No newline at end of file +hud-settings-reset_chat = Restaurar Padrões +hud-settings-third_party_integrations = Integrações de Aplicativos Terceiros +hud-settings-enable_discord_integration = Habilitar integração com o Discord +hud-settings-flashing_lights = Luzes Intermitentes +hud-settings-flashing_lights_info = Desabilita todo tipo de luzes intermitentes, e.g. cintilações ou trovões. \ No newline at end of file From b28821465065a542e4996b6117b04dcfe4c604d4 Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sat, 20 Aug 2022 20:48:04 +0100 Subject: [PATCH 090/854] Added and formatted npcs missing keys --- assets/voxygen/i18n/pt_BR/npc.ftl | 123 +++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 35 deletions(-) diff --git a/assets/voxygen/i18n/pt_BR/npc.ftl b/assets/voxygen/i18n/pt_BR/npc.ftl index 7156ad0ce1..d1f4be61e9 100644 --- a/assets/voxygen/i18n/pt_BR/npc.ftl +++ b/assets/voxygen/i18n/pt_BR/npc.ftl @@ -1,36 +1,5 @@ npc-speech-villager = - .a0 = Não é um dia tão lindo? - .a1 = Como você está? - .a2 = Uma ótima manhã para você! - .a3 = Fico imaginando o que um Catobelpas pensa enquanto come grama. - .a4 = O que você está achando do clima? - .a5 = Só de imaginar o que há em todas as masmorras me dá arrepios. Espero que alguém as limpe. - .a6 = Adoraria explorar algumas cavernas assim que eu ficar mais forte. - .a7 = Você viu meu gato? - .a8 = Já ouviu falar dos ferozes Land Sharks? Ouvi dizer que eles vivem nos desertos. - .a9 = Dizem que diversos tipos de gemas brilhantes podem ser encontradas nas cavernas. - .a10 = Sou viciado em queijo! - .a11 = Quer entrar? Venha, vamos comer um queijo! - .a12 = Dizem que cogumelos são bons para saude. Nunca comi. - .a13 = Não esqueça dos biscoitos! - .a14 = Eu adoro queijo anão(dwarven cheese). Gostaria de saber fazer. - .a15 = Fico imaginando o que há depois das montanhas. - .a16 = Espero um dia conseguir fazer meu planador. - .a17 = Gostaria de ver o meu jardim? Tá bom, talvez outro dia então. - .a18 = Um dia adoravel para um passeio na floresta! - .a19 = Ser ou não ser? Acho que serei um fazendeiro. - .a20 = Nossa aldeia é a melhor, não acha?. - .a21 = O que você acha que faz os Restos Brilhantes(Glowing Remains) brilharem?. - .a22 = Acho que está na hora dum segundo café da manhã! - .a23 = Já capturou uma libélula(firefly)? - .a24 = Gostaria que alguém conseguisse espantar os lobos da aldeia. - .a25 = Tive um sonho magnífico sobre queijo ontem. O que será que significa? - .a26 = Deixei um pouco de queijo com meu irmão. Agora não sei se existe ou não. Eu chamo de queijo de Schrödinger. - .a27 = Deixei um pouco de queijo com minha irmã. Agora não sei se existe ou não. Eu chamo de queijo de Schrödinger. - .a28 = Alguém deveria fazer algo sobre esses cultistas. De preferência, não eu. - .a29 = Espero que chova logo. Seria bom para as colheitas. - .a30 = Eu amo mel! E eu odeio abelhas. - .a31 = Eu quero viajar no mundo um dia. Deve haver mais vida do que nesta aldeia. + .a0 = Eu amo queijo. npc-speech-villager_decline_trade = .a0 = Desculpe, não tenho nada para trocar. .a1 = Troca? Como se eu tivesse algo que pode interessar a você. @@ -101,7 +70,7 @@ npc-speech-villager_under_attack = .a22 = Guardas! Guardas! .a23 = Guardas! Um vilão está me atacando! .a24 = Guardas, acabem com este maldito vilão! - .a25 = Guardas! Um assasino a solta! + .a25 = Guardas! Um assassino a solta! .a26 = Guardas! Me ajude! .a27 = Você não vai se safar dessa! Guardas! .a28 = Maldito Vilão! @@ -154,7 +123,7 @@ npc-speech-villager_under_attack = .a75 = Eu não mereço isso! .a76 = Por favor, não faça isso novamente. .a77 = Guardas, joguem este monstro no lago! - .a78 = Vou mandar meu tarrasque em você! + .a78 = Vou mandar meu tarasca em você! .a79 = Porque eeeeeeeeeeeeeu? npc-speech-villager_enemy_killed = .a0 = Destruí meu inimigo! @@ -166,4 +135,88 @@ npc-speech-menacing = .a2 = Não tenho medo de você! .a3 = Se manda daqui! .a4 = Vaza daqui se deseja viver! - .a5 = Você não é bem-vindo aqui! \ No newline at end of file + .a5 = Você não é bem-vindo aqui! +npc-speech-ambush = + .a0 = Não é muito inteligente viajar sozinho! + .a1 = Como roubar doce de criança! +npc-speech-merchant_busy_rude = + .a0 = Hey, espere pela sua vez. + .a1 = Você não vê a pessoa na sua frente? + .a2 = Sem furar a fila. +npc-speech-merchant_trade_cancelled_hostile = + .a0 = Desculpa interromper, nós temos um problema para resolver aqui! + .a1 = Nós fazemos negócios depois, eu preciso cuidar disso primeiro! +npc-speech-villager_adventurous = + .a0 = Espero um dia conseguir fazer meu propio planador. + .a1 = Eu gostaria de explorar uma caverna quando eu ficar mais forte. +npc-speech-villager_agreeable = + .a0 = Como você está hoje? + .a1 = Apenas me diga se precisar de algo. + .a2 = Você viu meu gato por ai? +npc-speech-villager_busy = + .a0 = Desculpa, não posso falar com você agora. + .a1 = Nos falamos depois, estou ocupado. +npc-speech-villager_busybody = + .a0 = As pessoas deveriam falar menos e trabalharem mais. +npc-speech-villager_closed = + .a0 = Você não é daqui, né? + .a1 = Você não acha nossa vila a melhor? + .a2 = Eles dizem que cogumelos são bons para sua saúde. Nunca comi. + .a3 = Ser, ou não ser? Eu acho que vou ser um fazendeiro. +npc-speech-villager_conscientious = + .a0 = Eu me mantenho ocupado. Sempre tem algo para fazer. + .a1 = Eu espero que chova logo. Vai ser bom para as plantações. +npc-speech-villager_disagreeable = + .a0 = Eu digo como eu quero. Se as pessoas não gostam disso, problema delas. + .a1 = As pessoas são facilmente ofendidas. +npc-speech-villager_extroverted = + .a0 = Você não vai acreditar no que fiz esse final de semana! + .a1 = O melhor da manhã para você! + .a2 = O Que você acha desse clima? + .a3 = Eu apenas sou loco por queijo! + .a4 = Não se esqueça dos biscoitos! + .a5 = Eu apenas amo queijo dos anões. Gostaria de saber fazer. + .a6 = Eu tive um sonho maravilhoso sobre queijo ontem a noite. O que será que significa? + .a7 = Eu amo mel! E odeio abelhas. +npc-speech-villager_introverted = + .a0 = Oi. + .a1 = Oh, Eu? Não sou nada demais. +npc-speech-villager_neurotic = + .a0 = Pensar nessas dungeons me deixam com medo. Espero que alguém limpe elas. + .a1 = Alguém deveria fazer algo sobre aqueles cultistas. De preferência que não seja eu. + .a2 = Eu tenho um pressentimento que algo ruim irá acontecer. + .a3 = Eu gostaria que alguém deixasse os lobos longe dessa vila. +npc-speech-villager_open = + .a0 = Eu imagino o que os Catoblepas pensam quando comem grama. + .a1 = O que você acha que faz os Glowing Remains brilharem? + .a2 = Já ouviu falar dos ferozes Land Sharks? Ouvi dizer que eles vivem nos desertos. + .a3 = Eu imagino o que tenha do outro lado das montanhas. + .a4 = Eu deixei um pouco de queijo com meu irmão. Agora eu não sei se existe ou não. Eu chamo de queijo de Schrödinger. + .a5 = Você alguma fez ja pegou um vagalume? + .a6 = Eles dizem que gemas brilhantes de todos os tipos podem ser achadas nas cavernas. + .a7 = Eu não consigo entender de onde esses Sauroks estão vindo. +npc-speech-villager_sad_loner = + .a0 = Eu estou tão sozinho. + .a1 = ... Desculpa por esse silêncio estranho. Não sou muito bom com pessoas. +npc-speech-villager_seeker = + .a0 = Eu quero ver o mundo um dia. Deve ter mais nessa vida do que essa vila. +npc-speech-villager_sociable = + .a0 = Você não vai entrar? Nos íamos comer um pouco de queijo! + .a1 = Você gostaria de ver meu jardim? Okay, talvez outra hora. +npc-speech-villager_stable = + .a0 = Hoje não é um dia bonito? + .a1 = A vida não é tão ruim assim. + .a2 = Lindo dia para caminhar na floresta! +npc-speech-villager_unconscientious = + .a0 = Eu acho que é hora de ter um segundo café da manhã! + .a1 = Eu gostaria que minha casa não fosse uma bagunça. Mas para isso eu teria que arrumar! Haha! + .a2 = Agora, onde será que eu deixei aquela coisa... +npc-speech-villager_worried = + .a0 = Tome cuidado, OK? Tem muitas coisas perigosas por ai. +npc-speech-cultist_low_health_fleeing = + .a0 = Recuem pela causa! + .a1 = Recuar! + .a2 = Maldito seja você! + .a3 = Vou te amaldiçoar na vida após a morte! + .a4 = Eu preciso descansar! + .a5 = Eles são muito forte! \ No newline at end of file From 636dbc8a2298691229ff74ed3df1f7e996f375de Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sat, 20 Aug 2022 20:48:20 +0100 Subject: [PATCH 091/854] Added char_selection missing keys --- assets/voxygen/i18n/pt_BR/char_selection.ftl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/voxygen/i18n/pt_BR/char_selection.ftl b/assets/voxygen/i18n/pt_BR/char_selection.ftl index d8000a8c00..9921ddfdfc 100644 --- a/assets/voxygen/i18n/pt_BR/char_selection.ftl +++ b/assets/voxygen/i18n/pt_BR/char_selection.ftl @@ -19,4 +19,5 @@ char_selection-skin = Pele char_selection-eyeshape = Detalhe dos Olhos char_selection-accessories = Acessórios char_selection-create_info_name = Seu personagem precisa de um nome! -char_selection-version_mismatch = AVISO! Este servidor está executando uma versão diferente e possivelmente incompatível do jogo. Por favor, atualize o seu jogo. \ No newline at end of file +char_selection-version_mismatch = AVISO! Este servidor está executando uma versão diferente e possivelmente incompatível do jogo. Por favor, atualize o seu jogo. +char_selection-spectate = Espectar Mundo \ No newline at end of file From b662d9cce1c897d82e3e75fce0394203d90d0a3c Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sat, 20 Aug 2022 20:48:36 +0100 Subject: [PATCH 092/854] Added common missing keys --- assets/voxygen/i18n/pt_BR/common.ftl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/voxygen/i18n/pt_BR/common.ftl b/assets/voxygen/i18n/pt_BR/common.ftl index 69fa8b6e30..c4a4653e3e 100644 --- a/assets/voxygen/i18n/pt_BR/common.ftl +++ b/assets/voxygen/i18n/pt_BR/common.ftl @@ -105,4 +105,6 @@ common-material-wood = Madeira common-material-stone = Pedra common-material-cloth = Tecido common-material-hide = Couro -common-sprite-chest = Baú \ No newline at end of file +common-sprite-chest = Baú +common-networking = Rede +common-networking_settings = Configurações de Rede \ No newline at end of file From fc9dca7e952869cd1938f92dc3532f6c7a39450f Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sat, 20 Aug 2022 20:48:52 +0100 Subject: [PATCH 093/854] Added gameinput missing keys --- assets/voxygen/i18n/pt_BR/gameinput.ftl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/voxygen/i18n/pt_BR/gameinput.ftl b/assets/voxygen/i18n/pt_BR/gameinput.ftl index 04c23d51e3..297dfdfe08 100644 --- a/assets/voxygen/i18n/pt_BR/gameinput.ftl +++ b/assets/voxygen/i18n/pt_BR/gameinput.ftl @@ -63,4 +63,6 @@ gameinput-swimup = Emergir gameinput-mapzoomin = Aumentar zoom do mapa gameinput-mapzoomout = Reduzir zoom do mapa gameinput-greet = Saudação -gameinput-map-locationmarkerbutton = Insere um marcador no Mapa \ No newline at end of file +gameinput-map-locationmarkerbutton = Insere um marcador no Mapa +gameinput-spectateviewpoint = Ponto de vista de Espectador +gameinput-spectatespeedboost = Acelerar a câmera de Espectador \ No newline at end of file From ca66a9f79b4109dcb256434c816749a9e295ee63 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 20 Aug 2022 17:10:29 -0400 Subject: [PATCH 094/854] Fix bug in Health::kill that caused Destroy event to never be emitted by preemptively setting `is_dead` to true --- common/src/comp/health.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/common/src/comp/health.rs b/common/src/comp/health.rs index 13eac4b7eb..c2a27cfc08 100644 --- a/common/src/comp/health.rs +++ b/common/src/comp/health.rs @@ -195,10 +195,7 @@ impl Health { pub fn should_die(&self) -> bool { self.current == 0 } - pub fn kill(&mut self) { - self.current = 0; - self.is_dead = true; - } + pub fn kill(&mut self) { self.current = 0; } #[cfg(not(target_arch = "wasm32"))] pub fn revive(&mut self) { From 0ee0d446f1712529dd0381627c93b02133741885 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 20 Aug 2022 17:12:14 -0400 Subject: [PATCH 095/854] Make /kill_npcs delete entities instead of setting health to 0, to avoid drops or other undesired effects from occuring. --- server/src/cmd.rs | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index bc010776d8..d42181a98c 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -1826,27 +1826,35 @@ fn handle_kill_npcs( false }; - let ecs = server.state.ecs(); - let mut healths = ecs.write_storage::(); - let players = ecs.read_storage::(); - let alignments = ecs.read_storage::(); - let mut count = 0; + let to_kill = { + let ecs = server.state.ecs(); + let entities = ecs.entities(); + let healths = ecs.write_storage::(); + let players = ecs.read_storage::(); + let alignments = ecs.read_storage::(); - for (mut health, (), alignment) in (&mut healths, !&players, alignments.maybe()).join() { - let should_kill = kill_pets - || if let Some(Alignment::Owned(owned)) = alignment { - ecs.entity_from_uid(owned.0) - .map_or(true, |owner| !players.contains(owner)) - } else { - true - }; + (&entities, &healths, !&players, alignments.maybe()) + .join() + .filter_map(|(entity, _health, (), alignment)| { + let should_kill = kill_pets + || if let Some(Alignment::Owned(owned)) = alignment { + ecs.entity_from_uid(owned.0) + .map_or(true, |owner| !players.contains(owner)) + } else { + true + }; - if should_kill { - count += 1; - health.kill(); + should_kill.then(|| entity) + }) + .collect::>() + }; + let count = to_kill.len(); + for entity in to_kill { + // Directly remove entities instead of modifying health to avoid loot drops. + if let Err(e) server.state.delete_entity_recorded(entity) { + error!(?e, ?entity, "Failed to delete entity"); } } - let text = if count > 0 { format!("Destroyed {} NPCs.", count) } else { From f1b6805c659faedd52f5099a6c5bb5b001a98d1e Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 20 Aug 2022 17:19:33 -0400 Subject: [PATCH 096/854] Remove outdated comments in handle_destroy and refactor `map_err` to `if let Err` --- server/src/events/entity_manipulation.rs | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 2b42021011..30589be618 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -129,15 +129,6 @@ pub fn handle_knockback(server: &Server, entity: EcsEntity, impulse: Vec3) /// other players. If the entity that killed it had stats, then give it exp for /// the kill. Experience given is equal to the level of the entity that was /// killed times 10. -// NOTE: Clippy incorrectly warns about a needless collect here because it does -// not understand that the pet count (which is computed during the first -// iteration over the members in range) is actually used by the second iteration -// over the members in range; since we have no way of knowing the pet count -// before the first loop finishes, we definitely need at least two loops. Then -// (currently) our only options are to store the member list in temporary space -// (e.g. by collecting to a vector), or to repeat the loop; but repeating the -// loop would currently be very inefficient since it has to rescan every entity -// on the server again. pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: HealthChange) { let state = server.state_mut(); @@ -531,18 +522,11 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt .destroy_entity(rtsim_entity.0); } - let _ = state - .delete_entity_recorded(entity) - .map_err(|e| error!(?e, ?entity, "Failed to delete destroyed entity")); + println!("deleting"); + if let Err(e) = state.delete_entity_recorded(entity) { + error!(?e, ?entity, "Failed to delete destroyed entity"); + } } - - // TODO: Add Delete(time_left: Duration) component - /* - // If not a player delete the entity - if let Err(err) = state.delete_entity_recorded(entity) { - error!(?e, "Failed to delete destroyed entity"); - } - */ } /// Delete an entity without any special actions (this is generally used for From 87815b4615cae5b6c1d93f84bc1046fee06630a4 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 20 Aug 2022 17:21:46 -0400 Subject: [PATCH 097/854] Use `send_fallible` in `notify_client` implementation to document that any errors are ignored (and use `if let` instead of `map`) --- server/src/client.rs | 1 + server/src/lib.rs | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/server/src/client.rs b/server/src/client.rs index 6db1dc479a..64921b1402 100644 --- a/server/src/client.rs +++ b/server/src/client.rs @@ -140,6 +140,7 @@ impl Client { }*/ } + /// Like `send` but any errors are explicitly ignored. pub(crate) fn send_fallible>(&self, msg: M) { let _ = self.send(msg); } pub(crate) fn send_prepared(&self, msg: &PreparedMsg) -> Result<(), StreamError> { diff --git a/server/src/lib.rs b/server/src/lib.rs index bcc50f13e0..ecfd922977 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1172,11 +1172,12 @@ impl Server { where S: Into, { - self.state + if let Some(client) = self.state .ecs() .read_storage::() - .get(entity) - .map(|c| c.send(msg)); + .get(entity) { + client.send_fallible(msg); + } } pub fn notify_players(&mut self, msg: ServerGeneral) { self.state.notify_players(msg); } From 7439d0970831162fd105423b72454509f92363a0 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 20 Aug 2022 18:44:26 -0400 Subject: [PATCH 098/854] Ensure that the client clears pending trades on its side when exiting to the character screen (and similar actions). When any entity is deleted cancel any existing trades associated with it. --- client/src/lib.rs | 5 +++++ server/src/cmd.rs | 2 +- server/src/events/mod.rs | 4 ++-- server/src/events/player.rs | 14 +++++++++---- server/src/events/trade.rs | 41 +++++++++++++++++++++---------------- server/src/state_ext.rs | 6 +++++- 6 files changed, 46 insertions(+), 26 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 72e3fe913d..51cc93fd67 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -2065,6 +2065,8 @@ impl Client { PresenceKind::Possessor => PresenceKind::Possessor, }); } + // Clear pending trade + self.pending_trade = None; } else { return Err(Error::Other("Failed to find entity from uid.".into())); } @@ -2543,6 +2545,9 @@ impl Client { /// Clean client ECS state fn clean_state(&mut self) { + // Clear pending trade + self.pending_trade = None; + let client_uid = self .uid() .map(|u| u.into()) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index d42181a98c..79be96586f 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -1851,7 +1851,7 @@ fn handle_kill_npcs( let count = to_kill.len(); for entity in to_kill { // Directly remove entities instead of modifying health to avoid loot drops. - if let Err(e) server.state.delete_entity_recorded(entity) { + if let Err(e) = server.state.delete_entity_recorded(entity) { error!(?e, ?entity, "Failed to delete entity"); } } diff --git a/server/src/events/mod.rs b/server/src/events/mod.rs index 62f3bf0873..d8fb23f2d7 100644 --- a/server/src/events/mod.rs +++ b/server/src/events/mod.rs @@ -25,9 +25,10 @@ use inventory_manip::handle_inventory; use invite::{handle_invite, handle_invite_response}; use player::{handle_client_disconnect, handle_exit_ingame, handle_possess}; use specs::{Builder, Entity as EcsEntity, WorldExt}; -use trade::{cancel_trade_for, handle_process_trade_action}; +use trade::handle_process_trade_action; pub use group_manip::update_map_markers; +pub(crate) use trade::cancel_trades_for; mod entity_creation; mod entity_manipulation; @@ -165,7 +166,6 @@ impl Server { handle_loaded_character_data(self, entity, components); }, ServerEvent::ExitIngame { entity } => { - cancel_trade_for(self, entity); handle_exit_ingame(self, entity); }, ServerEvent::CreateNpc { diff --git a/server/src/events/player.rs b/server/src/events/player.rs index 12be12d221..69305343d1 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -1,6 +1,6 @@ use super::Event; use crate::{ - client::Client, events::trade::cancel_trade_for, metrics::PlayerMetrics, + client::Client, metrics::PlayerMetrics, persistence::character_updater::CharacterUpdater, presence::Presence, state_ext::StateExt, BattleModeBuffer, Server, }; @@ -24,9 +24,16 @@ pub fn handle_exit_ingame(server: &mut Server, entity: EcsEntity) { let entity = persist_entity(state, entity); // Create new entity with just `Client`, `Uid`, `Player`, and `...Stream` - // components Easier than checking and removing all other known components + // components. + // + // Easier than checking and removing all other known components. + // // Note: If other `ServerEvent`s are referring to this entity they will be - // disrupted + // disrupted. + + // Since we remove `Uid` below, any trades won't be cancelled by `delete_entity_recorded`. So + // we cancel the trade here. (maybe the trade key could be switched from `Uid` to `Entity`) + super::cancel_trades_for(state, entity); let maybe_admin = state.ecs().write_storage::().remove(entity); let maybe_group = state @@ -115,7 +122,6 @@ pub fn handle_client_disconnect( skip_persistence: bool, ) -> Event { span!(_guard, "handle_client_disconnect"); - cancel_trade_for(server, entity); if let Some(client) = server .state() .ecs() diff --git a/server/src/events/trade.rs b/server/src/events/trade.rs index aa239aad24..7b10a65b7a 100644 --- a/server/src/events/trade.rs +++ b/server/src/events/trade.rs @@ -55,7 +55,7 @@ fn notify_agent_prices( } /// Invoked when the trade UI is up, handling item changes, accepts, etc -pub fn handle_process_trade_action( +pub(super) fn handle_process_trade_action( server: &mut Server, entity: EcsEntity, trade_id: TradeId, @@ -164,29 +164,34 @@ pub fn handle_process_trade_action( } } -//Cancel all trades registered for a given UID. -pub fn cancel_trade_for(server: &mut Server, entity: EcsEntity) { - if let Some(uid) = server.state().ecs().uid_from_entity(entity) { - let mut trades = server.state.ecs().write_resource::(); +/// Cancel all trades registered for a given UID. +/// +/// Note: This doesn't send any notification to the provided entity (only other +/// participants in the trade). It is assumed that the supplied entity either no +/// longer exists or is awareof this cancellation through other means (e.g. +/// client getting ExitInGameSuccess message knows that it should clear any +/// trades). +pub(crate) fn cancel_trades_for(state: &mut common_state::State, entity: EcsEntity) { + let ecs = state.ecs(); + if let Some(uid) = ecs.uid_from_entity(entity) { + let mut trades = ecs.write_resource::(); let active_trade = match trades.entity_trades.get(&uid) { Some(n) => *n, - None => { - return; - }, + None => return, }; let to_notify = trades.decline_trade(active_trade, uid); - to_notify - .and_then(|u| server.state.ecs().entity_from_uid(u.0)) - .map(|e| { - server.notify_client(e, ServerGeneral::FinishedTrade(TradeResult::Declined)); - notify_agent_simple( - server.state.ecs().write_storage::(), - e, - AgentEvent::FinishedTrade(TradeResult::Declined), - ); - }); + to_notify.and_then(|u| ecs.entity_from_uid(u.0)).map(|e| { + if let Some(c) = ecs.read_storage::().get(e) { + c.send_fallible(ServerGeneral::FinishedTrade(TradeResult::Declined)); + } + notify_agent_simple( + ecs.write_storage::(), + e, + AgentEvent::FinishedTrade(TradeResult::Declined), + ); + }); } } diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 2dff0e15eb..fe3761795a 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -1,7 +1,7 @@ use crate::{ automod::AutoMod, client::Client, - events::update_map_markers, + events::{self, update_map_markers}, persistence::PersistedComponents, pet::restore_pet, presence::{Presence, RepositionOnChunkLoad}, @@ -1000,10 +1000,14 @@ impl StateExt for State { ); } + // Cancel extant trades + events::cancel_trades_for(self, entity); + let (maybe_uid, maybe_pos) = ( self.ecs().read_storage::().get(entity).copied(), self.ecs().read_storage::().get(entity).copied(), ); + let res = self.ecs_mut().delete_entity(entity); if res.is_ok() { if let (Some(uid), Some(pos)) = (maybe_uid, maybe_pos) { From 02d609043848234c35ad0be23880bb6a52eb4d03 Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sun, 21 Aug 2022 01:42:12 +0100 Subject: [PATCH 099/854] changed some words for better context --- assets/voxygen/i18n/pt_BR/npc.ftl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/assets/voxygen/i18n/pt_BR/npc.ftl b/assets/voxygen/i18n/pt_BR/npc.ftl index d1f4be61e9..50640ea632 100644 --- a/assets/voxygen/i18n/pt_BR/npc.ftl +++ b/assets/voxygen/i18n/pt_BR/npc.ftl @@ -2,7 +2,7 @@ npc-speech-villager = .a0 = Eu amo queijo. npc-speech-villager_decline_trade = .a0 = Desculpe, não tenho nada para trocar. - .a1 = Troca? Como se eu tivesse algo que pode interessar a você. + .a1 = Troca? Como se eu tivesse algo que pudesse interessar a você. .a2 = Minha casa é minha, não vou trocá-la por nada. npc-speech-merchant_advertisement = .a0 = Está interessado em fazer uma troca comigo? @@ -11,7 +11,7 @@ npc-speech-merchant_advertisement = npc-speech-merchant_busy = .a0 = Ei, espere sua vez. .a1 = Espere, por favor. Sou apenas uma pessoa. - .a2 = Você vê a outra pessoa na sua frente? + .a2 = Você nãe esta vendo a outra pessoa na sua frente? .a3 = Só um momento, deixe-me terminar. .a4 = Não fure a fila. .a5 = Estou ocupado, volte mais tarde. @@ -30,10 +30,10 @@ npc-speech-villager_cultist_alarm = .a5 = Cultista assassino! .a6 = Prove o gume da minha espada, seu cultista sujo! .a7 = Nada pode limpar o sangue de suas mãos, cultista! - .a8 = Com mil milhões de macacos e raios e coriscos! Um cultista entre nós! + .a8 = Com bilhões de coriscos azuis borbulhantes! Um cultista entre nós! .a9 = Os males deste cultista estão prestes a acabar! .a10 = Este cultista é meu! - .a11 = Prepare-se para encontrar o seu criador, oh sórdido cultista! + .a11 = Prepare-se para encontrar o seu criador, oh tolo cultista! .a12 = Vejo um cultista! Pegue eles! .a13 = Vejo um cultista! Atacar! .a14 = Vejo um cultista! Não o deixe escapar! @@ -147,7 +147,7 @@ npc-speech-merchant_trade_cancelled_hostile = .a0 = Desculpa interromper, nós temos um problema para resolver aqui! .a1 = Nós fazemos negócios depois, eu preciso cuidar disso primeiro! npc-speech-villager_adventurous = - .a0 = Espero um dia conseguir fazer meu propio planador. + .a0 = Espero um dia conseguir fazer meu próprio planador. .a1 = Eu gostaria de explorar uma caverna quando eu ficar mais forte. npc-speech-villager_agreeable = .a0 = Como você está hoje? @@ -160,7 +160,7 @@ npc-speech-villager_busybody = .a0 = As pessoas deveriam falar menos e trabalharem mais. npc-speech-villager_closed = .a0 = Você não é daqui, né? - .a1 = Você não acha nossa vila a melhor? + .a1 = Você não acha nossa vila a melhor de todas? .a2 = Eles dizem que cogumelos são bons para sua saúde. Nunca comi. .a3 = Ser, ou não ser? Eu acho que vou ser um fazendeiro. npc-speech-villager_conscientious = @@ -219,4 +219,4 @@ npc-speech-cultist_low_health_fleeing = .a2 = Maldito seja você! .a3 = Vou te amaldiçoar na vida após a morte! .a4 = Eu preciso descansar! - .a5 = Eles são muito forte! \ No newline at end of file + .a5 = Eles são muito fortes! \ No newline at end of file From 3967501a03b5446bca430ab749358f80aa598b75 Mon Sep 17 00:00:00 2001 From: matheusclmb Date: Sun, 21 Aug 2022 03:26:32 +0100 Subject: [PATCH 100/854] Small/Cultural changes recommended by @jcezarms --- assets/voxygen/i18n/pt_BR/npc.ftl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/voxygen/i18n/pt_BR/npc.ftl b/assets/voxygen/i18n/pt_BR/npc.ftl index 50640ea632..dc03e4eb26 100644 --- a/assets/voxygen/i18n/pt_BR/npc.ftl +++ b/assets/voxygen/i18n/pt_BR/npc.ftl @@ -11,7 +11,7 @@ npc-speech-merchant_advertisement = npc-speech-merchant_busy = .a0 = Ei, espere sua vez. .a1 = Espere, por favor. Sou apenas uma pessoa. - .a2 = Você nãe esta vendo a outra pessoa na sua frente? + .a2 = Você não olha por onde anda? .a3 = Só um momento, deixe-me terminar. .a4 = Não fure a fila. .a5 = Estou ocupado, volte mais tarde. @@ -84,7 +84,7 @@ npc-speech-villager_under_attack = .a36 = Pare com isso! .a37 = O que eu fiz para você?! .a38 = Por favor, pare de me atacar! - .a39 = Hey! Cuida pra onde você aponta essa coisa! + .a39 = Ei! Cuida pra onde você aponta essa coisa! .a40 = Desgraçado hediondo, vou acabar com você! .a41 = Pare com isso! Vá embora! .a42 = Você está me deixando louco! @@ -140,8 +140,8 @@ npc-speech-ambush = .a0 = Não é muito inteligente viajar sozinho! .a1 = Como roubar doce de criança! npc-speech-merchant_busy_rude = - .a0 = Hey, espere pela sua vez. - .a1 = Você não vê a pessoa na sua frente? + .a0 = Ei, espere pela sua vez. + .a1 = Você não olha por onde anda? .a2 = Sem furar a fila. npc-speech-merchant_trade_cancelled_hostile = .a0 = Desculpa interromper, nós temos um problema para resolver aqui! @@ -167,25 +167,25 @@ npc-speech-villager_conscientious = .a0 = Eu me mantenho ocupado. Sempre tem algo para fazer. .a1 = Eu espero que chova logo. Vai ser bom para as plantações. npc-speech-villager_disagreeable = - .a0 = Eu digo como eu quero. Se as pessoas não gostam disso, problema delas. + .a0 = Eu falo a verdade, doa a quem doer. .a1 = As pessoas são facilmente ofendidas. npc-speech-villager_extroverted = .a0 = Você não vai acreditar no que fiz esse final de semana! .a1 = O melhor da manhã para você! .a2 = O Que você acha desse clima? - .a3 = Eu apenas sou loco por queijo! + .a3 = Eu apenas sou louco por queijo! .a4 = Não se esqueça dos biscoitos! .a5 = Eu apenas amo queijo dos anões. Gostaria de saber fazer. - .a6 = Eu tive um sonho maravilhoso sobre queijo ontem a noite. O que será que significa? + .a6 = Eu tive um sonho maravilhoso sobre queijo ontem à noite. O que será que significa? .a7 = Eu amo mel! E odeio abelhas. npc-speech-villager_introverted = .a0 = Oi. .a1 = Oh, Eu? Não sou nada demais. npc-speech-villager_neurotic = - .a0 = Pensar nessas dungeons me deixam com medo. Espero que alguém limpe elas. + .a0 = Pensar nesses calabouços me deixam com medo. Espero que alguém limpe elas. .a1 = Alguém deveria fazer algo sobre aqueles cultistas. De preferência que não seja eu. .a2 = Eu tenho um pressentimento que algo ruim irá acontecer. - .a3 = Eu gostaria que alguém deixasse os lobos longe dessa vila. + .a3 = Eu gostaria que alguém mantivesse os lobos longe dessa vila. npc-speech-villager_open = .a0 = Eu imagino o que os Catoblepas pensam quando comem grama. .a1 = O que você acha que faz os Glowing Remains brilharem? From 467e85dca22f9eeed911c22b4db7907924be9938 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 21 Aug 2022 02:28:36 +0000 Subject: [PATCH 101/854] typo fix --- assets/voxygen/i18n/pt_BR/npc.ftl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/i18n/pt_BR/npc.ftl b/assets/voxygen/i18n/pt_BR/npc.ftl index dc03e4eb26..cf5d082970 100644 --- a/assets/voxygen/i18n/pt_BR/npc.ftl +++ b/assets/voxygen/i18n/pt_BR/npc.ftl @@ -84,7 +84,7 @@ npc-speech-villager_under_attack = .a36 = Pare com isso! .a37 = O que eu fiz para você?! .a38 = Por favor, pare de me atacar! - .a39 = Ei! Cuida pra onde você aponta essa coisa! + .a39 = Ei! Cuidado para onde você aponta essa coisa! .a40 = Desgraçado hediondo, vou acabar com você! .a41 = Pare com isso! Vá embora! .a42 = Você está me deixando louco! @@ -219,4 +219,4 @@ npc-speech-cultist_low_health_fleeing = .a2 = Maldito seja você! .a3 = Vou te amaldiçoar na vida após a morte! .a4 = Eu preciso descansar! - .a5 = Eles são muito fortes! \ No newline at end of file + .a5 = Eles são muito fortes! From 055f40ddc6f4e5eaa4c96e02602ec8cde9cd3572 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 21 Aug 2022 02:43:09 +0000 Subject: [PATCH 102/854] changed/typo to generic masculine --- assets/voxygen/i18n/pt_BR/npc.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/voxygen/i18n/pt_BR/npc.ftl b/assets/voxygen/i18n/pt_BR/npc.ftl index cf5d082970..b77ff42f1c 100644 --- a/assets/voxygen/i18n/pt_BR/npc.ftl +++ b/assets/voxygen/i18n/pt_BR/npc.ftl @@ -182,7 +182,7 @@ npc-speech-villager_introverted = .a0 = Oi. .a1 = Oh, Eu? Não sou nada demais. npc-speech-villager_neurotic = - .a0 = Pensar nesses calabouços me deixam com medo. Espero que alguém limpe elas. + .a0 = Pensar nesses calabouços me deixam com medo. Espero que alguém limpe eles. .a1 = Alguém deveria fazer algo sobre aqueles cultistas. De preferência que não seja eu. .a2 = Eu tenho um pressentimento que algo ruim irá acontecer. .a3 = Eu gostaria que alguém mantivesse os lobos longe dessa vila. From 656727ecbdcd1acdfe38b44d2461c083fa453143 Mon Sep 17 00:00:00 2001 From: DaforLynx Date: Sun, 21 Aug 2022 05:32:02 +0000 Subject: [PATCH 103/854] Miscellaneous audio fixes --- common/src/comp/character_state.rs | 8 ++++++++ voxygen/src/audio/sfx/event_mapper/combat/mod.rs | 5 ++--- voxygen/src/audio/sfx/event_mapper/movement/mod.rs | 6 +++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs index 0471e06687..3d72938933 100644 --- a/common/src/comp/character_state.rs +++ b/common/src/comp/character_state.rs @@ -149,6 +149,14 @@ impl CharacterState { | CharacterState::Blink(_) | CharacterState::BasicSummon(_) | CharacterState::SpriteSummon(_) + | CharacterState::Roll(roll::Data { + was_wielded: true, + .. + }) + | CharacterState::Stunned(stunned::Data { + was_wielded: true, + .. + }) ) } diff --git a/voxygen/src/audio/sfx/event_mapper/combat/mod.rs b/voxygen/src/audio/sfx/event_mapper/combat/mod.rs index 24f5e5b9b9..b758902c97 100644 --- a/voxygen/src/audio/sfx/event_mapper/combat/mod.rs +++ b/voxygen/src/audio/sfx/event_mapper/combat/mod.rs @@ -154,11 +154,10 @@ impl CombatEventMapper { ); } else if let Some(wield_event) = match ( previous_state.weapon_drawn, - character_state.is_dodge(), Self::weapon_drawn(character_state), ) { - (false, false, true) => Some(SfxEvent::Wield(data.kind)), - (true, false, false) => Some(SfxEvent::Unwield(data.kind)), + (false, true) => Some(SfxEvent::Wield(data.kind)), + (true, false) => Some(SfxEvent::Unwield(data.kind)), _ => None, } { return wield_event; diff --git a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs index 007a3fea67..9c613200f8 100644 --- a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs +++ b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs @@ -211,7 +211,7 @@ impl MovementEventMapper { SfxEvent::Run(BlockKind::Rock) }, BlockKind::Earth => SfxEvent::Run(BlockKind::Earth), - BlockKind::Sand => SfxEvent::Run(BlockKind::Sand), + // BlockKind::Sand => SfxEvent::Run(BlockKind::Sand), BlockKind::Air => SfxEvent::Idle, _ => SfxEvent::Run(BlockKind::Grass), } @@ -238,7 +238,7 @@ impl MovementEventMapper { match underfoot_block_kind { BlockKind::Snow => SfxEvent::Run(BlockKind::Snow), BlockKind::Rock | BlockKind::WeakRock => SfxEvent::Run(BlockKind::Rock), - BlockKind::Sand => SfxEvent::Run(BlockKind::Sand), + // BlockKind::Sand => SfxEvent::Run(BlockKind::Sand), BlockKind::Earth => SfxEvent::Run(BlockKind::Earth), BlockKind::Air => SfxEvent::Idle, _ => SfxEvent::Run(BlockKind::Grass), @@ -260,7 +260,7 @@ impl MovementEventMapper { match underfoot_block_kind { BlockKind::Snow => SfxEvent::QuadRun(BlockKind::Snow), BlockKind::Rock | BlockKind::WeakRock => SfxEvent::QuadRun(BlockKind::Rock), - BlockKind::Sand => SfxEvent::QuadRun(BlockKind::Sand), + // BlockKind::Sand => SfxEvent::QuadRun(BlockKind::Sand), BlockKind::Earth => SfxEvent::QuadRun(BlockKind::Earth), BlockKind::Air => SfxEvent::Idle, _ => SfxEvent::QuadRun(BlockKind::Grass), From ce8b8b6f1260796544d370e34775b117bd42d87a Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 20 Aug 2022 18:55:03 -0400 Subject: [PATCH 104/854] Update changelog, cargo fmt --- CHANGELOG.md | 6 ++++++ server/src/events/player.rs | 10 +++++----- server/src/lib.rs | 7 ++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fb0621101..61d48402c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,11 +17,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use fluent for translations - First tab on Login screen triggers username focus - Certain NPCs will now attack when alone with victim +- /kill_npcs no longer leaves drops behind and also has bug causing it to not destroy entities + fixed. ### Removed ### Fixed - Fixed crash due to zooming out very far +- Client properly knows trade was cancelled when exiting to the character screen (and no longer + tries to display the trade window when rejoining) +- Cancel trades for an entity when it is deleted (note this doesn't effect trades between players + since their entities are not removed). ## [0.13.0] - 2022-07-23 diff --git a/server/src/events/player.rs b/server/src/events/player.rs index 69305343d1..1163ccab60 100644 --- a/server/src/events/player.rs +++ b/server/src/events/player.rs @@ -1,8 +1,7 @@ use super::Event; use crate::{ - client::Client, metrics::PlayerMetrics, - persistence::character_updater::CharacterUpdater, presence::Presence, state_ext::StateExt, - BattleModeBuffer, Server, + client::Client, metrics::PlayerMetrics, persistence::character_updater::CharacterUpdater, + presence::Presence, state_ext::StateExt, BattleModeBuffer, Server, }; use common::{ comp, @@ -31,8 +30,9 @@ pub fn handle_exit_ingame(server: &mut Server, entity: EcsEntity) { // Note: If other `ServerEvent`s are referring to this entity they will be // disrupted. - // Since we remove `Uid` below, any trades won't be cancelled by `delete_entity_recorded`. So - // we cancel the trade here. (maybe the trade key could be switched from `Uid` to `Entity`) + // Since we remove `Uid` below, any trades won't be cancelled by + // `delete_entity_recorded`. So we cancel the trade here. (maybe the trade + // key could be switched from `Uid` to `Entity`) super::cancel_trades_for(state, entity); let maybe_admin = state.ecs().write_storage::().remove(entity); diff --git a/server/src/lib.rs b/server/src/lib.rs index ecfd922977..c3205fc944 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1172,11 +1172,8 @@ impl Server { where S: Into, { - if let Some(client) = self.state - .ecs() - .read_storage::() - .get(entity) { - client.send_fallible(msg); + if let Some(client) = self.state.ecs().read_storage::().get(entity) { + client.send_fallible(msg); } } From 5e8adb3c80fc73b4962ebeb964c33faa4415383b Mon Sep 17 00:00:00 2001 From: Imbris Date: Tue, 23 Aug 2022 02:12:28 -0400 Subject: [PATCH 105/854] Make the present mode default to Fifo instead of Immediate since it uses less power and in my own experience is generally a better experience when the GPU is under significant load. --- CHANGELOG.md | 1 + voxygen/src/render/mod.rs | 11 ++++------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61d48402c2..e49e5f8bab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Certain NPCs will now attack when alone with victim - /kill_npcs no longer leaves drops behind and also has bug causing it to not destroy entities fixed. +- Default present mode changed to Fifo (aka 'Vsync capped'). ### Removed diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index ebf5bd8d91..c0b7e4f2b1 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -251,16 +251,13 @@ impl Default for UpscaleMode { /// Present modes /// See https://docs.rs/wgpu/0.7.0/wgpu/enum.PresentMode.html -#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(Default, PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] pub enum PresentMode { - Fifo, Mailbox, - #[serde(other)] Immediate, -} - -impl Default for PresentMode { - fn default() -> Self { Self::Immediate } + #[default] + #[serde(other)] + Fifo, // has to be last for `#[serde(other)]` } impl From for wgpu::PresentMode { From 16a3794686d13af8f1db414512913a54e6582b7a Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 10:04:21 +0200 Subject: [PATCH 106/854] in the process of cleaning up i18n.gte calls --- voxygen/src/hud/bag.rs | 72 +++++++++++++++++++++--------------------- voxygen/src/hud/map.rs | 64 ++++++++++++++++++------------------- voxygen/src/hud/mod.rs | 54 +++++++++++++++---------------- 3 files changed, 95 insertions(+), 95 deletions(-) diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index 14fb7d12c0..ae4c33f0a8 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -822,9 +822,9 @@ impl<'a> Widget for Bag<'a> { .with_tooltip( self.tooltip_manager, &(match inventory.next_sort_order() { - InventorySortOrder::Name => i18n.get("hud.bag.sort_by_name"), - InventorySortOrder::Quality => i18n.get("hud.bag.sort_by_quality"), - InventorySortOrder::Tag => i18n.get("hud.bag.sort_by_category"), + InventorySortOrder::Name => i18n.get_msg("hud-bag-sort_by_name"), + InventorySortOrder::Quality => i18n.get_msg("hudbag-sort_by_quality"), + InventorySortOrder::Tag => i18n.get_msg("hud-bag-sort_by_category"), }), "", &tooltip, @@ -894,7 +894,7 @@ impl<'a> Widget for Bag<'a> { } else { let manager = &mut *self.tooltip_manager; $slot_maker - .with_tooltip(manager, &i18n.get($desc), "", &tooltip, color::WHITE) + .with_tooltip(manager, &i18n.get_msg($desc), "", &tooltip, color::WHITE) .set($slot_id, ui) } }; @@ -974,18 +974,18 @@ impl<'a> Widget for Bag<'a> { btn.down_from(state.ids.stat_icons[i.0 - 1], 7.0) }; let tooltip_head = match i.1 { - "Health" => i18n.get("hud.bag.health"), - "Energy" => i18n.get("hud.bag.energy"), - "Combat Rating" => i18n.get("hud.bag.combat_rating"), - "Protection" => i18n.get("hud.bag.protection"), - "Stun Resilience" => i18n.get("hud.bag.stun_res"), - "Stealth" => i18n.get("hud.bag.stealth"), + "Health" => i18n.get_msg("hud-bag-health"), + "Energy" => i18n.get_msg("hud-bag-energy"), + "Combat Rating" => i18n.get_msg("hud-bag-combat_rating"), + "Protection" => i18n.get_msg("hud-bag-protection"), + "Stun Resilience" => i18n.get_msg("hud-bag-stun_res"), + "Stealth" => i18n.get_msg("hud-bag-stealth"), _ => Cow::Borrowed(""), }; let tooltip_txt = match i.1 { - "Combat Rating" => i18n.get("hud.bag.combat_rating_desc"), - "Protection" => i18n.get("hud.bag.protection_desc"), - "Stun Resilience" => i18n.get("hud.bag.stun_res_desc"), + "Combat Rating" => i18n.get_msg("hud-bag-combat_rating_desc"), + "Protection" => i18n.get_msg("hud-bag-protection_desc"), + "Stun Resilience" => i18n.get_msg("hud-bag-stun_res_desc"), _ => Cow::Borrowed(""), }; btn.with_tooltip( @@ -1022,7 +1022,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.head_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.head"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-head"); // Necklace let item_slot = EquipSlot::Armor(ArmorSlot::Neck); @@ -1033,7 +1033,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.neck_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.neck"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-neck"); // Chest //Image::new(self.imgs.armor_slot) // different graphics for empty/non empty @@ -1045,7 +1045,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.chest_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.chest"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-chest"); // Shoulders let item_slot = EquipSlot::Armor(ArmorSlot::Shoulders); @@ -1056,7 +1056,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.shoulders_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.shoulders"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-shoulders"); // Hands let item_slot = EquipSlot::Armor(ArmorSlot::Hands); @@ -1067,7 +1067,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.hands_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.hands"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-hands"); // Belt let item_slot = EquipSlot::Armor(ArmorSlot::Belt); @@ -1078,7 +1078,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.belt_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.belt"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-belt"); // Legs let item_slot = EquipSlot::Armor(ArmorSlot::Legs); @@ -1089,7 +1089,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.legs_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.legs"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-legs"); // Ring let item_slot = EquipSlot::Armor(ArmorSlot::Ring1); @@ -1100,7 +1100,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.ring1_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.ring"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-ring"); // Ring 2 let item_slot = EquipSlot::Armor(ArmorSlot::Ring2); @@ -1111,7 +1111,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.ring2_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.ring"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-ring"); // Back let item_slot = EquipSlot::Armor(ArmorSlot::Back); @@ -1122,7 +1122,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.back_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.back"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-back"); // Foot let item_slot = EquipSlot::Armor(ArmorSlot::Feet); @@ -1133,7 +1133,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.feet_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.feet"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-feet"); // Lantern let item_slot = EquipSlot::Lantern; @@ -1144,7 +1144,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.lantern_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.lantern"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-lantern"); // Glider let item_slot = EquipSlot::Glider; @@ -1155,7 +1155,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.glider_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.glider"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-glider"); // Tabard let item_slot = EquipSlot::Armor(ArmorSlot::Tabard); @@ -1166,7 +1166,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.tabard_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.tabard"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-tabard"); // Active Mainhand/Left-Slot let item_slot = EquipSlot::ActiveMainhand; @@ -1177,7 +1177,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.active_mainhand_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.mainhand"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-mainhand"); // Active Offhand/Right-Slot let item_slot = EquipSlot::ActiveOffhand; @@ -1188,7 +1188,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.active_offhand_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.offhand"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-offhand"); // Inactive Mainhand/Left-Slot let item_slot = EquipSlot::InactiveMainhand; @@ -1199,7 +1199,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.inactive_mainhand_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.inactive_mainhand"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-inactive_mainhand"); // Inactive Offhand/Right-Slot let item_slot = EquipSlot::InactiveOffhand; @@ -1210,7 +1210,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.inactive_offhand_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.inactive_offhand"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-inactive_offhand"); if Button::image(self.imgs.swap_equipped_weapons_btn) .hover_image(self.imgs.swap_equipped_weapons_btn_hover) @@ -1220,7 +1220,7 @@ impl<'a> Widget for Bag<'a> { .align_middle_y_of(state.ids.active_mainhand_slot) .with_tooltip( self.tooltip_manager, - &i18n.get("hud.bag.swap_equipped_weapons_title"), + &i18n.get_msg("hud-bag-swap_equipped_weapons_title"), &(if let Some(key) = self .global_state .settings @@ -1259,7 +1259,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.bag1_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.bag"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-bag"); // Bag 2 let item_slot = EquipSlot::Armor(ArmorSlot::Bag2); @@ -1270,7 +1270,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.bag2_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.bag"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-bag"); // Bag 3 let item_slot = EquipSlot::Armor(ArmorSlot::Bag3); @@ -1281,7 +1281,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.bag3_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.bag"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-bag"); // Bag 4 let item_slot = EquipSlot::Armor(ArmorSlot::Bag4); @@ -1292,7 +1292,7 @@ impl<'a> Widget for Bag<'a> { .filled_slot(filled_slot); let slot_id = state.ids.bag4_slot; - set_tooltip!(slot, slot_id, item_slot, "hud.bag.bag"); + set_tooltip!(slot, slot_id, item_slot, "hud-bag-bag"); // Close button if Button::image(self.imgs.close_btn) diff --git a/voxygen/src/hud/map.rs b/voxygen/src/hud/map.rs index 6a292718dc..85f7c6cff2 100644 --- a/voxygen/src/hud/map.rs +++ b/voxygen/src/hud/map.rs @@ -278,7 +278,7 @@ impl<'a> Widget for Map<'a> { .set(state.ids.icon, ui); // Map Title - Text::new(&i18n.get("hud.map.map_title")) + Text::new(&i18n.get_msg("hud-map-map_title")) .mid_top_with_margin_on(state.ids.frame, 3.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(29)) @@ -286,7 +286,7 @@ impl<'a> Widget for Map<'a> { .set(state.ids.map_title, ui); // Questlog Title - Text::new(&i18n.get("hud.map.qlog_title")) + Text::new(&i18n.get_msg("hud-map-qlog_title")) .mid_top_with_margin_on(state.ids.qlog_align, 6.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(21)) @@ -506,7 +506,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowDifficulty(!show_difficulty))); } - Text::new(&i18n.get("hud.map.difficulty")) + Text::new(&i18n.get_msg("hud-map-difficulty")) .right_from(state.ids.show_difficulty_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -540,7 +540,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowTowns(!show_towns))); } - Text::new(&i18n.get("hud.map.towns")) + Text::new(&i18n.get_msg("hud-map-towns")) .right_from(state.ids.show_towns_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -574,7 +574,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowCastles(!show_castles))); } - Text::new(&i18n.get("hud.map.castles")) + Text::new(&i18n.get_msg("hud-map-castles")) .right_from(state.ids.show_castles_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -608,7 +608,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowDungeons(!show_dungeons))); } - Text::new(&i18n.get("hud.map.dungeons")) + Text::new(&i18n.get_msg("hud-map-dungeons")) .right_from(state.ids.show_dungeons_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -642,7 +642,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowCaves(!show_caves))); } - Text::new(&i18n.get("hud.map.caves")) + Text::new(&i18n.get_msg("hud-map-caves")) .right_from(state.ids.show_caves_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -676,7 +676,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowTrees(!show_trees))); } - Text::new(&i18n.get("hud.map.trees")) + Text::new(&i18n.get_msg("hud-map-trees")) .right_from(state.ids.show_trees_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -710,7 +710,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowBiomes(!show_biomes))); } - Text::new(&i18n.get("hud.map.biomes")) + Text::new(&i18n.get_msg("hud-map-biomes")) .right_from(state.ids.show_biomes_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -744,7 +744,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowPeaks(!show_peaks))); } - Text::new(&i18n.get("hud.map.peaks")) + Text::new(&i18n.get_msg("hud-map-peaks")) .right_from(state.ids.show_peaks_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -781,7 +781,7 @@ impl<'a> Widget for Map<'a> { { events.push(Event::SettingsChange(MapShowVoxelMap(!show_voxel_map))); } - Text::new(&i18n.get("hud.map.voxel_map")) + Text::new(&i18n.get_msg("hud-map-voxel_map")) .right_from(state.ids.show_voxel_map_box, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -872,15 +872,15 @@ impl<'a> Widget for Map<'a> { .as_deref() .map(Cow::Borrowed) .unwrap_or_else(|| match &site.kind { - SiteKind::Town => i18n.get("hud.map.town"), - SiteKind::Dungeon { .. } => i18n.get("hud.map.dungeon"), - SiteKind::Castle => i18n.get("hud.map.castle"), - SiteKind::Cave => i18n.get("hud.map.cave"), - SiteKind::Tree => i18n.get("hud.map.tree"), - SiteKind::Gnarling => i18n.get("hud.map.gnarling"), + SiteKind::Town => i18n.get_msg("hud-map-town"), + SiteKind::Dungeon { .. } => i18n.get_msg("hud-map-dungeon"), + SiteKind::Castle => i18n.get_msg("hud-map-castle"), + SiteKind::Cave => i18n.get_msg("hud-map-cave"), + SiteKind::Tree => i18n.get_msg("hud-map-tree"), + SiteKind::Gnarling => i18n.get_msg("hud-map-gnarling"), }); let (difficulty, desc) = match &site.kind { - SiteKind::Town => (None, i18n.get("hud.map.town")), + SiteKind::Town => (None, i18n.get_msg("hud-map-town")), SiteKind::Dungeon { difficulty } => { if *difficulty < 5 { ( @@ -898,10 +898,10 @@ impl<'a> Widget for Map<'a> { ) } }, - SiteKind::Castle => (None, i18n.get("hud.map.castle")), - SiteKind::Cave => (None, i18n.get("hud.map.cave")), - SiteKind::Tree => (None, i18n.get("hud.map.tree")), - SiteKind::Gnarling => (Some(0), i18n.get("hud.map.gnarling")), + SiteKind::Castle => (None, i18n.get_msg("hud-map-castle")), + SiteKind::Cave => (None, i18n.get_msg("hud-map-cave")), + SiteKind::Tree => (None, i18n.get_msg("hud-map-tree")), + SiteKind::Gnarling => (Some(0), i18n.get_msg("hud-map-gnarling")), }; let desc = desc.into_owned() + &get_site_economy(site_rich); let site_btn = Button::image(match &site.kind { @@ -1274,7 +1274,7 @@ impl<'a> Widget for Map<'a> { .floating(true) .with_tooltip( self.tooltip_manager, - &i18n.get("hud.map.marked_location"), + &i18n.get_msg("hud-map-marked_location"), &format!( "X: {}, Y: {}\n\n{}", lm.x as i32, @@ -1316,12 +1316,12 @@ impl<'a> Widget for Map<'a> { .floating(true) .with_tooltip( self.tooltip_manager, - &i18n.get("hud.map.marked_location"), + &i18n.get_msg("hud-map-marked_location"), &format!( "X: {}, Y: {}\n\n{}", lm.x as i32, lm.y as i32, - i18n.get("hud.map.marked_location_remove") + i18n.get_msg("hud-map-marked_location_remove") ), &site_tooltip, TEXT_VELORITE, @@ -1389,7 +1389,7 @@ impl<'a> Widget for Map<'a> { } else { self.imgs.button }) - .label(&i18n.get("hud.map.recenter")) + .label(&i18n.get_msg("hud-map-recenter")) .label_y(position::Relative::Scalar(1.0)) .label_color(if recenter { TEXT_COLOR @@ -1414,7 +1414,7 @@ impl<'a> Widget for Map<'a> { .w_h(icon_size.x, icon_size.y) .color(Some(UI_HIGHLIGHT_0)) .set(state.ids.drag_ico, ui); - Text::new(&i18n.get("hud.map.drag")) + Text::new(&i18n.get_msg("hud-map-drag")) .right_from(state.ids.drag_ico, 5.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1426,7 +1426,7 @@ impl<'a> Widget for Map<'a> { .w_h(icon_size.x, icon_size.y) .color(Some(UI_HIGHLIGHT_0)) .set(state.ids.zoom_ico, ui); - Text::new(&i18n.get("hud.map.zoom")) + Text::new(&i18n.get_msg("hud-map-zoom")) .right_from(state.ids.zoom_ico, 5.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1442,7 +1442,7 @@ impl<'a> Widget for Map<'a> { .color(TEXT_COLOR) .set(state.ids.waypoint_binding_txt, ui); - Text::new(&i18n.get("hud.map.mid_click")) + Text::new(&i18n.get_msg("hud-map-mid_click")) .right_from(state.ids.waypoint_binding_txt, 5.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1458,7 +1458,7 @@ impl<'a> Widget for Map<'a> { .bottom_right_with_margins_on(state.ids.map_layers[0], -36.0, 0.0) .with_tooltip( self.tooltip_manager, - &i18n.get("hud.map.change_map_mode"), + &i18n.get_msg("hud-map-change_map_mode"), "", &site_tooltip, TEXT_COLOR, @@ -1482,8 +1482,8 @@ impl<'a> Widget for Map<'a> { .left_from(state.ids.map_mode_btn, 5.0) .with_tooltip( self.tooltip_manager, - &i18n.get("hud.map.toggle_minimap_voxel"), - &i18n.get("hud.map.zoom_minimap_explanation"), + &i18n.get_msg("hud-map-toggle_minimap_voxel"), + &i18n.get_msg("hud-map-zoom_minimap_explanation"), &site_tooltip, TEXT_COLOR, ) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 3c7f322347..774779405a 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1640,13 +1640,13 @@ impl Hud { .mid_top_with_margin_on(self.ids.player_rank_up, fontsize.1) .set(self.ids.player_rank_up_txt_number, ui_widgets); // Static "New Rank!" text - Text::new(&i18n.get("hud.rank_up")) + Text::new(&i18n.get_msg("hud-rank_up")) .font_size(40) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, fade)) .mid_bottom_with_margin_on(self.ids.player_rank_up, 20.0) .set(self.ids.player_rank_up_txt_0_bg, ui_widgets); - Text::new(&i18n.get("hud.rank_up")) + Text::new(&i18n.get_msg("hud-rank_up")) .font_size(40) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(1.0, 1.0, 1.0, fade)) @@ -1654,14 +1654,14 @@ impl Hud { .set(self.ids.player_rank_up_txt_0, ui_widgets); // Variable skilltree text let skill = match display.skill_tree { - General => i18n.get("common.weapons.general"), - Weapon(ToolKind::Hammer) => i18n.get("common.weapons.hammer"), - Weapon(ToolKind::Axe) => i18n.get("common.weapons.axe"), - Weapon(ToolKind::Sword) => i18n.get("common.weapons.sword"), - Weapon(ToolKind::Sceptre) => i18n.get("common.weapons.sceptre"), - Weapon(ToolKind::Bow) => i18n.get("common.weapons.bow"), - Weapon(ToolKind::Staff) => i18n.get("common.weapons.staff"), - Weapon(ToolKind::Pick) => i18n.get("common.tool.mining"), + General => i18n.get_msg("common-weapons-general"), + Weapon(ToolKind::Hammer) => i18n.get_msg("common-weapons-hammer"), + Weapon(ToolKind::Axe) => i18n.get_msg("common-weapons-axe"), + Weapon(ToolKind::Sword) => i18n.get_msg("common-weapons-sword"), + Weapon(ToolKind::Sceptre) => i18n.get_msg("common-weapons-sceptre"), + Weapon(ToolKind::Bow) => i18n.get_msg("common-weapons-bow"), + Weapon(ToolKind::Staff) => i18n.get_msg("common-weapons-staff"), + Weapon(ToolKind::Pick) => i18n.get_msg("common-tool-mining"), _ => Cow::Borrowed("Unknown"), }; Text::new(&skill) @@ -1720,7 +1720,7 @@ impl Hud { 1.0 }; - Text::new(&i18n.get("hud.sct.block")) + Text::new(&i18n.get_msg("hud-sct-block")) .font_size(font_size) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, fade)) @@ -1729,7 +1729,7 @@ impl Hud { ui_widgets.win_h * (-0.3) + y - 3.0, ) .set(player_sct_bg_id, ui_widgets); - Text::new(&i18n.get("hud.sct.block")) + Text::new(&i18n.get_msg("hud-sct-block")) .font_size(font_size) .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.69, 0.82, 0.88, fade)) @@ -1823,7 +1823,7 @@ impl Hud { pickup_failed_pulse: self.failed_entity_pickups.get(&entity).cloned(), }, &self.fonts, - vec![(GameInput::Interact, i18n.get("hud.pick_up").to_string())], + vec![(GameInput::Interact, i18n.get_msg("hud-pick_up").to_string())], ) .set(overitem_id, ui_widgets); } @@ -1858,7 +1858,7 @@ impl Hud { overitem_properties, self.pulse, &global_state.window.key_layout, - vec![(GameInput::Interact, i18n.get("hud.open").to_string())], + vec![(GameInput::Interact, i18n.get_msg("hud-open").to_string())], ) .x_y(0.0, 100.0) .position_ingame(over_pos) @@ -1872,13 +1872,13 @@ impl Hud { &self.fonts, match interaction { Interaction::Collect => { - vec![(GameInput::Interact, i18n.get("hud.collect").to_string())] + vec![(GameInput::Interact, i18n.get_msg("hud-collect").to_string())] }, Interaction::Craft(_) => { - vec![(GameInput::Interact, i18n.get("hud.use").to_string())] + vec![(GameInput::Interact, i18n.get_msg("hud-use").to_string())] }, Interaction::Mine => { - vec![(GameInput::Primary, i18n.get("hud.mine").to_string())] + vec![(GameInput::Primary, i18n.get_msg("hud-mine").to_string())] }, }, ) @@ -1895,7 +1895,7 @@ impl Hud { overitem_properties, self.pulse, &global_state.window.key_layout, - vec![(GameInput::Interact, i18n.get("hud.use").to_string())], + vec![(GameInput::Interact, i18n.get_msg("hud-use").to_string())], ) .x_y(0.0, 100.0) .position_ingame(over_pos) @@ -1928,7 +1928,7 @@ impl Hud { let over_pos = pos + Vec3::unit_z() * 1.5; overitem::Overitem::new( - i18n.get("hud.crafting.campfire"), + i18n.get_msg("hud-crafting-campfire"), overitem::TEXT_COLOR, pos.distance_squared(player_pos), &self.fonts, @@ -1937,7 +1937,7 @@ impl Hud { overitem_properties, self.pulse, &global_state.window.key_layout, - vec![(GameInput::Interact, i18n.get("hud.sit").to_string())], + vec![(GameInput::Interact, i18n.get_msg("hud-sit").to_string())], ) .x_y(0.0, 100.0) .position_ingame(over_pos) @@ -2100,8 +2100,8 @@ impl Hud { == Some(entity) => { vec![ - (GameInput::Interact, i18n.get("hud.talk").to_string()), - (GameInput::Trade, i18n.get("hud.trade").to_string()), + (GameInput::Interact, i18n.get_msg("hud-talk").to_string()), + (GameInput::Trade, i18n.get_msg("hud-trade").to_string()), ] }, Some(comp::Alignment::Owned(owner)) @@ -2111,7 +2111,7 @@ impl Hud { && is_mountable(body, bodies.get(client.entity())) && dist_sqr < common::consts::MAX_MOUNT_RANGE.powi(2) => { - vec![(GameInput::Mount, i18n.get("hud.mount").to_string())] + vec![(GameInput::Mount, i18n.get_msg("hud-mount").to_string())] }, _ => Vec::new(), }, @@ -3306,14 +3306,14 @@ impl Hud { // Auto walk indicator if self.show.auto_walk { - Text::new(&i18n.get("hud.auto_walk_indicator")) + Text::new(&i18n.get_msg("hud-auto_walk_indicator")) .color(TEXT_BG) .mid_top_with_margin_on(ui_widgets.window, indicator_offset) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) .set(self.ids.auto_walk_bg, ui_widgets); indicator_offset += 30.0; - Text::new(&i18n.get("hud.auto_walk_indicator")) + Text::new(&i18n.get_msg("hud-auto_walk_indicator")) .color(KILL_COLOR) .top_left_with_margins_on(self.ids.auto_walk_bg, -1.0, -1.0) .font_id(self.fonts.cyri.conrod_id) @@ -3763,7 +3763,7 @@ impl Hud { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .bottom_left_with_margins_on(ui_widgets.window, 350.0, 150.0) - .label(&i18n.get("hud.tutorial_btn")) + .label(&i18n._msg("hud-tutorial_btn")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(18)) .label_color(TEXT_COLOR) @@ -3811,7 +3811,7 @@ impl Hud { Intro::Show => { if self.show.intro { self.show.want_grab = false; - let quest_headline = i18n.get("hud.temp_quest_headline"); + let quest_headline = i18n.get_msg("hud-temp_quest_headline"); let quest_text = i18n.get("hud.temp_quest_text"); Image::new(self.imgs.quest_bg) .w_h(404.0, 858.0) From 51d90707b5fe1d1864b096c8a8cf24949dc52093 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 23 Aug 2022 10:03:06 +0100 Subject: [PATCH 107/854] Relaxed automod somewhat --- common/src/comp/chat.rs | 19 +++++++++++++++++++ server/src/automod.rs | 12 +++++++++--- server/src/state_ext.rs | 19 ++++++++++++++++--- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/common/src/comp/chat.rs b/common/src/comp/chat.rs index 791e47580c..228f12cbab 100644 --- a/common/src/comp/chat.rs +++ b/common/src/comp/chat.rs @@ -146,6 +146,25 @@ impl ChatType { ChatType::Meta => None, } } + + /// `None` means that the chat type is automated. + pub fn is_private(&self) -> Option { + match self { + ChatType::Online(_) + | ChatType::Offline(_) + | ChatType::CommandInfo + | ChatType::CommandError + | ChatType::FactionMeta(_) + | ChatType::GroupMeta(_) + | ChatType::Npc(_, _) + | ChatType::NpcSay(_, _) + | ChatType::NpcTell(_, _, _) + | ChatType::Meta + | ChatType::Kill(_, _) => None, + ChatType::Tell(_, _) | ChatType::Group(_, _) | ChatType::Faction(_, _) => Some(true), + ChatType::Say(_) | ChatType::Region(_) | ChatType::World(_) => Some(false), + } + } } // Stores chat text, type diff --git a/server/src/automod.rs b/server/src/automod.rs index c9bc3b16e8..4f6e683895 100644 --- a/server/src/automod.rs +++ b/server/src/automod.rs @@ -1,7 +1,7 @@ use crate::settings::ModerationSettings; use authc::Uuid; use censor::Censor; -use common::comp::AdminRole; +use common::comp::{AdminRole, ChatType, Group}; use hashbrown::HashMap; use std::{ fmt, @@ -95,12 +95,18 @@ impl AutoMod { player: Uuid, role: Option, now: Instant, + chat_type: &ChatType, msg: &str, ) -> Result, ActionErr> { // TODO: Consider using grapheme cluster count instead of size in bytes if msg.len() > MAX_BYTES_CHAT_MSG { Err(ActionErr::TooLong) - } else if !self.settings.automod || (role.is_some() && self.settings.admins_exempt) { + } else if !self.settings.automod + // Is this a private chat message? + || chat_type.is_private().unwrap_or(true) + // Is the user exempt from automoderation? + || (role.is_some() && self.settings.admins_exempt) + { Ok(None) } else if self.censor.check(msg) { Err(ActionErr::BannedWord) @@ -123,7 +129,7 @@ impl AutoMod { const CHAT_VOLUME_PERIOD: f32 = 30.0; /// The maximum permitted average number of chat messages over the chat volume /// period. -const MAX_AVG_MSG_PER_SECOND: f32 = 1.0 / 7.0; // No more than a message every 7 seconds on average +const MAX_AVG_MSG_PER_SECOND: f32 = 1.0 / 5.0; // No more than a message every 5 seconds on average /// The period for which a player should be muted when they exceed the message /// spam threshold. const SPAM_MUTE_PERIOD: Duration = Duration::from_secs(180); diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index fe3761795a..dd1241f5b8 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -114,7 +114,12 @@ pub trait StateExt { /// Performed after loading component data from the database fn update_character_data(&mut self, entity: EcsEntity, components: PersistedComponents); /// Iterates over registered clients and send each `ServerMsg` - fn validate_chat_msg(&self, player: EcsEntity, msg: &str) -> bool; + fn validate_chat_msg( + &self, + player: EcsEntity, + chat_type: &comp::ChatType, + msg: &str, + ) -> bool; fn send_chat(&self, msg: comp::UnresolvedChatMsg); fn notify_players(&self, msg: ServerGeneral); fn notify_in_game_clients(&self, msg: ServerGeneral); @@ -676,7 +681,12 @@ impl StateExt for State { } } - fn validate_chat_msg(&self, entity: EcsEntity, msg: &str) -> bool { + fn validate_chat_msg( + &self, + entity: EcsEntity, + chat_type: &comp::ChatType, + msg: &str, + ) -> bool { let mut automod = self.ecs().write_resource::(); let Some(client) = self.ecs().read_storage::().get(entity) else { return true }; let Some(player) = self.ecs().read_storage::().get(entity) else { return true }; @@ -688,6 +698,7 @@ impl StateExt for State { .get(entity) .map(|a| a.0), Instant::now(), + chat_type, msg, ) { Ok(note) => { @@ -727,7 +738,9 @@ impl StateExt for State { if msg.chat_type.uid().map_or(true, |sender| { (*ecs.read_resource::()) .retrieve_entity_internal(sender.0) - .map_or(false, |e| self.validate_chat_msg(e, &msg.message)) + .map_or(false, |e| { + self.validate_chat_msg(e, &msg.chat_type, &msg.message) + }) }) { match &msg.chat_type { comp::ChatType::Offline(_) From 9e22ae01a0151d5c6f091269a3ae2456a71fb2a4 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 11:17:21 +0200 Subject: [PATCH 108/854] finished first pass removing i18n.get --- voxygen/src/hud/diary.rs | 480 +++++++++++----------- voxygen/src/hud/mod.rs | 10 +- voxygen/src/hud/overhead.rs | 2 +- voxygen/src/hud/popup.rs | 2 +- voxygen/src/hud/util.rs | 98 ++--- voxygen/src/menu/char_selection/ui/mod.rs | 66 +-- voxygen/src/menu/main/ui/connecting.rs | 10 +- voxygen/src/menu/main/ui/credits.rs | 8 +- voxygen/src/menu/main/ui/disclaimer.rs | 6 +- voxygen/src/menu/main/ui/login.rs | 28 +- voxygen/src/menu/main/ui/servers.rs | 6 +- voxygen/src/session/mod.rs | 8 +- voxygen/src/ui/widgets/item_tooltip.rs | 60 +-- 13 files changed, 392 insertions(+), 392 deletions(-) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index ebe074b1a4..969bfef5f9 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -436,7 +436,7 @@ impl<'a> Widget for Diary<'a> { } // Title - Text::new(&self.localized_strings.get("hud.diary")) + Text::new(&self.localized_strings.get_msg("hud-diary")) .mid_top_with_margin_on(state.ids.frame, 3.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(29)) @@ -632,7 +632,7 @@ impl<'a> Widget for Diary<'a> { }; let tooltip_txt = if locked { - self.localized_strings.get("hud.skill.not_unlocked") + self.localized_strings.get_msg("hud-skill-not_unlocked") } else { Cow::Borrowed("") }; @@ -1334,7 +1334,7 @@ impl<'a> Diary<'a> { ui: &mut UiCell, mut events: Vec, ) -> Vec { - let tree_title = &self.localized_strings.get("common.weapons.general"); + let tree_title = &self.localized_strings.get_msg("common-weapons-general"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) .font_id(self.fonts.cyri.conrod_id) @@ -1440,8 +1440,8 @@ impl<'a> Diary<'a> { }, // Bottom left skills SkillIcon::Descriptive { - title: "hud.skill.dodge_title", - desc: "hud.skill.dodge", + title: "hud-skill-dodge_title", + desc: "hud-skill-dodge", image: self.imgs.skill_dodge_skill, position: MidTopWithMarginOn(state.ids.skills_bot_l[0], 3.0), id: state.ids.skill_general_roll_0, @@ -1466,8 +1466,8 @@ impl<'a> Diary<'a> { }, // Bottom right skills SkillIcon::Descriptive { - title: "hud.skill.climbing_title", - desc: "hud.skill.climbing", + title: "hud-skill-climbing_title", + desc: "hud-skill-climbing", image: self.imgs.skill_climbing_skill, position: MidTopWithMarginOn(state.ids.skills_bot_r[0], 3.0), id: state.ids.skill_general_climb_0, @@ -1485,8 +1485,8 @@ impl<'a> Diary<'a> { id: state.ids.skill_general_climb_2, }, SkillIcon::Descriptive { - title: "hud.skill.swim_title", - desc: "hud.skill.swim", + title: "hud-skill-swim_title", + desc: "hud-skill-swim", image: self.imgs.skill_swim_skill, position: MidTopWithMarginOn(state.ids.skills_bot_r[3], 3.0), id: state.ids.skill_general_swim_0, @@ -1511,7 +1511,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.weapons.sword"); + let tree_title = &self.localized_strings.get_msg("common-weapons-sword"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -1556,8 +1556,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.sw_trip_str_title", - desc: "hud.skill.sw_trip_str", + title: "hud-skill-sw_trip_str_title", + desc: "hud-skill-sw_trip_str", image: self.imgs.twohsword_m1, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_sword_combo_0, @@ -1588,8 +1588,8 @@ impl<'a> Diary<'a> { }, // Top right skills SkillIcon::Descriptive { - title: "hud.skill.sw_dash_title", - desc: "hud.skill.sw_dash", + title: "hud-skill-sw_dash_title", + desc: "hud-skill-sw_dash", image: self.imgs.twohsword_m2, position: MidTopWithMarginOn(state.ids.skills_top_r[0], 3.0), id: state.ids.skill_sword_dash_0, @@ -1682,7 +1682,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.weapons.hammer"); + let tree_title = &self.localized_strings.get_msg("common-weapons-hammer"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -1727,8 +1727,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.hmr_single_strike_title", - desc: "hud.skill.hmr_single_strike", + title: "hud-skill-hmr_single_strike_title", + desc: "hud-skill-hmr_single_strike", image: self.imgs.twohhammer_m1, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_hammer_combo_0, @@ -1759,8 +1759,8 @@ impl<'a> Diary<'a> { }, // Top right skills SkillIcon::Descriptive { - title: "hud.skill.hmr_charged_melee_title", - desc: "hud.skill.hmr_charged_melee", + title: "hud-skill-hmr_charged_melee_title", + desc: "hud-skill-hmr_charged_melee", image: self.imgs.hammergolf, position: MidTopWithMarginOn(state.ids.skills_top_r[0], 3.0), id: state.ids.skill_hammer_charged_0, @@ -1840,7 +1840,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.weapons.axe"); + let tree_title = &self.localized_strings.get_msg("common-weapons-axe"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -1885,8 +1885,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.axe_double_strike_title", - desc: "hud.skill.axe_double_strike", + title: "hud-skill-axe_double_strike_title", + desc: "hud-skill-axe_double_strike", image: self.imgs.twohaxe_m1, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_axe_combo_0, @@ -1917,8 +1917,8 @@ impl<'a> Diary<'a> { }, // Top right skills SkillIcon::Descriptive { - title: "hud.skill.axe_spin_title", - desc: "hud.skill.axe_spin", + title: "hud-skill-axe_spin_title", + desc: "hud-skill-axe_spin", image: self.imgs.axespin, position: MidTopWithMarginOn(state.ids.skills_top_r[0], 3.0), id: state.ids.skill_axe_spin_0, @@ -1998,7 +1998,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.weapons.sceptre"); + let tree_title = &self.localized_strings.get_msg("common-weapons-sceptre"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2043,8 +2043,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.sc_lifesteal_title", - desc: "hud.skill.sc_lifesteal", + title: "hud-skill-sc_lifesteal_title", + desc: "hud-skill-sc_lifesteal", image: self.imgs.skill_sceptre_lifesteal, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_sceptre_lifesteal_0, @@ -2075,8 +2075,8 @@ impl<'a> Diary<'a> { }, // Top right skills SkillIcon::Descriptive { - title: "hud.skill.sc_heal_title", - desc: "hud.skill.sc_heal", + title: "hud-skill-sc_heal_title", + desc: "hud-skill-sc_heal", image: self.imgs.skill_sceptre_heal, position: MidTopWithMarginOn(state.ids.skills_top_r[0], 3.0), id: state.ids.skill_sceptre_heal_0, @@ -2150,7 +2150,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.weapons.bow"); + let tree_title = &self.localized_strings.get_msg("common-weapons-bow"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2194,8 +2194,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.bow_charged_title", - desc: "hud.skill.bow_charged", + title: "hud-skill-bow_charged_title", + desc: "hud-skill-bow_charged", image: self.imgs.bow_m1, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_bow_charged_0, @@ -2232,8 +2232,8 @@ impl<'a> Diary<'a> { }, // Top right skills SkillIcon::Descriptive { - title: "hud.skill.bow_repeater_title", - desc: "hud.skill.bow_repeater", + title: "hud-skill-bow_repeater_title", + desc: "hud-skill-bow_repeater", image: self.imgs.bow_m2, position: MidTopWithMarginOn(state.ids.skills_top_r[0], 3.0), id: state.ids.skill_bow_repeater_0, @@ -2308,7 +2308,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.weapons.staff"); + let tree_title = &self.localized_strings.get_msg("common-weapons-staff"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2354,8 +2354,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.st_fireball_title", - desc: "hud.skill.st_fireball", + title: "hud-skill-st_fireball_title", + desc: "hud-skill-st_fireball", image: self.imgs.fireball, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_staff_basic_0, @@ -2380,8 +2380,8 @@ impl<'a> Diary<'a> { }, // Top right skills SkillIcon::Descriptive { - title: "hud.skill.st_flamethrower_title", - desc: "hud.skill.st_flamethrower", + title: "hud-skill-st_flamethrower_title", + desc: "hud-skill-st_flamethrower", image: self.imgs.flamethrower, position: MidTopWithMarginOn(state.ids.skills_top_r[0], 3.0), id: state.ids.skill_staff_beam_0, @@ -2455,7 +2455,7 @@ impl<'a> Diary<'a> { mut events: Vec, ) -> Vec { // Title text - let tree_title = &self.localized_strings.get("common.tool.mining"); + let tree_title = &self.localized_strings.get_msg("common-tool-mining"); Text::new(tree_title) .mid_top_with_margin_on(state.ids.content_align, 2.0) @@ -2501,8 +2501,8 @@ impl<'a> Diary<'a> { // 3 0 4 // 8 2 7 SkillIcon::Descriptive { - title: "hud.skill.pick_strike_title", - desc: "hud.skill.pick_strike", + title: "hud-skill-pick_strike_title", + desc: "hud-skill-pick_strike", image: self.imgs.pickaxe, position: MidTopWithMarginOn(state.ids.skills_top_l[0], 3.0), id: state.ids.skill_pick_m1, @@ -2553,8 +2553,8 @@ impl<'a> Diary<'a> { .position(*position) .with_tooltip( self.tooltip_manager, - &self.localized_strings.get(title), - &self.localized_strings.get(desc), + &self.localized_strings.get_msg(title), + &self.localized_strings.get_msg(desc), diary_tooltip, TEXT_COLOR, ) @@ -2793,13 +2793,13 @@ fn skill_strings(skill: Skill) -> SkillStrings<'static> { fn general_skill_strings(skill: GeneralSkill) -> SkillStrings<'static> { match skill { GeneralSkill::HealthIncrease => SkillStrings::with_const( - "hud.skill.inc_health_title", - "hud.skill.inc_health", + "hud-skill-inc_health_title", + "hud-skill-inc_health", u32::from(HP_PER_LEVEL), ), GeneralSkill::EnergyIncrease => SkillStrings::with_const( - "hud.skill.inc_energy_title", - "hud.skill.inc_energy", + "hud-skill-inc_energy_title", + "hud-skill-inc_energy", u32::from(ENERGY_PER_LEVEL), ), } @@ -2808,22 +2808,22 @@ fn general_skill_strings(skill: GeneralSkill) -> SkillStrings<'static> { fn unlock_skill_strings(group: SkillGroupKind) -> SkillStrings<'static> { match group { SkillGroupKind::Weapon(ToolKind::Sword) => { - SkillStrings::plain("hud.skill.unlck_sword_title", "hud.skill.unlck_sword") + SkillStrings::plain("hud-skill-unlck_sword_title", "hud-skill-unlck_sword") }, SkillGroupKind::Weapon(ToolKind::Axe) => { - SkillStrings::plain("hud.skill.unlck_axe_title", "hud.skill.unlck_axe") + SkillStrings::plain("hud-skill-unlck_axe_title", "hud-skill-unlck_axe") }, SkillGroupKind::Weapon(ToolKind::Hammer) => { - SkillStrings::plain("hud.skill.unlck_hammer_title", "hud.skill.unlck_hammer") + SkillStrings::plain("hud-skill-unlck_hammer_title", "hud-skill-unlck_hammer") }, SkillGroupKind::Weapon(ToolKind::Bow) => { - SkillStrings::plain("hud.skill.unlck_bow_title", "hud.skill.unlck_bow") + SkillStrings::plain("hud-skill-unlck_bow_title", "hud-skill-unlck_bow") }, SkillGroupKind::Weapon(ToolKind::Staff) => { - SkillStrings::plain("hud.skill.unlck_staff_title", "hud.skill.unlck_staff") + SkillStrings::plain("hud-skill-unlck_staff_title", "hud-skill-unlck_staff") }, SkillGroupKind::Weapon(ToolKind::Sceptre) => { - SkillStrings::plain("hud.skill.unlck_sceptre_title", "hud.skill.unlck_sceptre") + SkillStrings::plain("hud-skill-unlck_sceptre_title", "hud-skill-unlck_sceptre") }, SkillGroupKind::General | SkillGroupKind::Weapon( @@ -2848,77 +2848,77 @@ fn sword_skill_strings(skill: SwordSkill) -> SkillStrings<'static> { match skill { // triple strike SwordSkill::TsCombo => SkillStrings::plain( - "hud.skill.sw_trip_str_combo_title", - "hud.skill.sw_trip_str_combo", + "hud-skill-sw_trip_str_combo_title", + "hud-skill-sw_trip_str_combo", ), SwordSkill::TsDamage => SkillStrings::plain( - "hud.skill.sw_trip_str_dmg_title", - "hud.skill.sw_trip_str_dmg", + "hud-skill-sw_trip_str_dmg_title", + "hud-skill-sw_trip_str_dmg", ), SwordSkill::TsSpeed => { - SkillStrings::plain("hud.skill.sw_trip_str_sp_title", "hud.skill.sw_trip_str_sp") + SkillStrings::plain("hud-skill-sw_trip_str_sp_title", "hud-skill-sw_trip_str_sp") }, SwordSkill::TsRegen => SkillStrings::plain( - "hud.skill.sw_trip_str_reg_title", - "hud.skill.sw_trip_str_reg", + "hud-skill-sw_trip_str_reg_title", + "hud-skill-sw_trip_str_reg", ), // dash SwordSkill::DDamage => SkillStrings::with_mult( - "hud.skill.sw_dash_dmg_title", - "hud.skill.sw_dash_dmg", + "hud-skill-sw_dash_dmg_title", + "hud-skill-sw_dash_dmg", modifiers.dash.base_damage, ), SwordSkill::DDrain => SkillStrings::with_mult( - "hud.skill.sw_dash_drain_title", - "hud.skill.sw_dash_drain", + "hud-skill-sw_dash_drain_title", + "hud-skill-sw_dash_drain", modifiers.dash.energy_drain, ), SwordSkill::DCost => SkillStrings::with_mult( - "hud.skill.sw_dash_cost_title", - "hud.skill.sw_dash_cost", + "hud-skill-sw_dash_cost_title", + "hud-skill-sw_dash_cost", modifiers.dash.energy_cost, ), SwordSkill::DSpeed => SkillStrings::with_mult( - "hud.skill.sw_dash_speed_title", - "hud.skill.sw_dash_speed", + "hud-skill-sw_dash_speed_title", + "hud-skill-sw_dash_speed", modifiers.dash.forward_speed, ), SwordSkill::DChargeThrough => SkillStrings::plain( - "hud.skill.sw_dash_charge_through_title", - "hud.skill.sw_dash_charge_through", + "hud-skill-sw_dash_charge_through_title", + "hud-skill-sw_dash_charge_through", ), SwordSkill::DScaling => SkillStrings::with_mult( - "hud.skill.sw_dash_scale_title", - "hud.skill.sw_dash_scale", + "hud-skill-sw_dash_scale_title", + "hud-skill-sw_dash_scale", modifiers.dash.scaled_damage, ), // spin SwordSkill::UnlockSpin => { - SkillStrings::plain("hud.skill.sw_spin_title", "hud.skill.sw_spin") + SkillStrings::plain("hud-skill-sw_spin_title", "hud-skill-sw_spin") }, SwordSkill::SDamage => SkillStrings::with_mult( - "hud.skill.sw_spin_dmg_title", - "hud.skill.sw_spin_dmg", + "hud-skill-sw_spin_dmg_title", + "hud-skill-sw_spin_dmg", modifiers.spin.base_damage, ), SwordSkill::SSpeed => SkillStrings::with_mult( - "hud.skill.sw_spin_spd_title", - "hud.skill.sw_spin_spd", + "hud-skill-sw_spin_spd_title", + "hud-skill-sw_spin_spd", modifiers.spin.swing_duration, ), SwordSkill::SCost => SkillStrings::with_mult( - "hud.skill.sw_spin_cost_title", - "hud.skill.sw_spin_cost", + "hud-skill-sw_spin_cost_title", + "hud-skill-sw_spin_cost", modifiers.spin.energy_cost, ), SwordSkill::SSpins => SkillStrings::with_const( - "hud.skill.sw_spin_spins_title", - "hud.skill.sw_spin_spins", + "hud-skill-sw_spin_spins_title", + "hud-skill-sw_spin_spins", modifiers.spin.num, ), // independent skills SwordSkill::InterruptingAttacks => { - SkillStrings::plain("hud.skill.sw_interrupt_title", "hud.skill.sw_interrupt") + SkillStrings::plain("hud-skill-sw_interrupt_title", "hud-skill-sw_interrupt") }, } } @@ -2928,68 +2928,68 @@ fn axe_skill_strings(skill: AxeSkill) -> SkillStrings<'static> { match skill { // Double strike upgrades AxeSkill::DsCombo => SkillStrings::plain( - "hud.skill.axe_double_strike_combo_title", - "hud.skill.axe_double_strike_combo", + "hud-skill-axe_double_strike_combo_title", + "hud-skill-axe_double_strike_combo", ), AxeSkill::DsDamage => SkillStrings::plain( - "hud.skill.axe_double_strike_damage_title", - "hud.skill.axe_double_strike_damage", + "hud-skill-axe_double_strike_damage_title", + "hud-skill-axe_double_strike_damage", ), AxeSkill::DsSpeed => SkillStrings::plain( - "hud.skill.axe_double_strike_speed_title", - "hud.skill.axe_double_strike_speed", + "hud-skill-axe_double_strike_speed_title", + "hud-skill-axe_double_strike_speed", ), AxeSkill::DsRegen => SkillStrings::plain( - "hud.skill.axe_double_strike_regen_title", - "hud.skill.axe_double_strike_regen", + "hud-skill-axe_double_strike_regen_title", + "hud-skill-axe_double_strike_regen", ), // Spin upgrades AxeSkill::SInfinite => SkillStrings::plain( - "hud.skill.axe_infinite_axe_spin_title", - "hud.skill.axe_infinite_axe_spin", + "hud-skill-axe_infinite_axe_spin_title", + "hud-skill-axe_infinite_axe_spin", ), AxeSkill::SHelicopter => SkillStrings::plain( - "hud.skill.axe_spin_helicopter_title", - "hud.skill.axe_spin_helicopter", + "hud-skill-axe_spin_helicopter_title", + "hud-skill-axe_spin_helicopter", ), AxeSkill::SDamage => SkillStrings::with_mult( - "hud.skill.axe_spin_damage_title", - "hud.skill.axe_spin_damage", + "hud-skill-axe_spin_damage_title", + "hud-skill-axe_spin_damage", modifiers.spin.base_damage, ), AxeSkill::SSpeed => SkillStrings::with_mult( - "hud.skill.axe_spin_speed_title", - "hud.skill.axe_spin_speed", + "hud-skill-axe_spin_speed_title", + "hud-skill-axe_spin_speed", modifiers.spin.swing_duration, ), AxeSkill::SCost => SkillStrings::with_mult( - "hud.skill.axe_spin_cost_title", - "hud.skill.axe_spin_cost", + "hud-skill-axe_spin_cost_title", + "hud-skill-axe_spin_cost", modifiers.spin.energy_cost, ), // Leap upgrades AxeSkill::UnlockLeap => SkillStrings::plain( - "hud.skill.axe_unlock_leap_title", - "hud.skill.axe_unlock_leap", + "hud-skill-axe_unlock_leap_title", + "hud-skill-axe_unlock_leap", ), AxeSkill::LDamage => SkillStrings::with_mult( - "hud.skill.axe_leap_damage_title", - "hud.skill.axe_leap_damage", + "hud-skill-axe_leap_damage_title", + "hud-skill-axe_leap_damage", modifiers.leap.base_damage, ), AxeSkill::LKnockback => SkillStrings::with_mult( - "hud.skill.axe_leap_knockback_title", - "hud.skill.axe_leap_knockback", + "hud-skill-axe_leap_knockback_title", + "hud-skill-axe_leap_knockback", modifiers.leap.knockback, ), AxeSkill::LCost => SkillStrings::with_mult( - "hud.skill.axe_leap_cost_title", - "hud.skill.axe_leap_cost", + "hud-skill-axe_leap_cost_title", + "hud-skill-axe_leap_cost", modifiers.leap.energy_cost, ), AxeSkill::LDistance => SkillStrings::with_mult( - "hud.skill.axe_leap_distance_title", - "hud.skill.axe_leap_distance", + "hud-skill-axe_leap_distance_title", + "hud-skill-axe_leap_distance", modifiers.leap.leap_strength, ), } @@ -3000,71 +3000,71 @@ fn hammer_skill_strings(skill: HammerSkill) -> SkillStrings<'static> { // Single strike upgrades match skill { HammerSkill::SsKnockback => SkillStrings::with_mult( - "hud.skill.hmr_single_strike_knockback_title", - "hud.skill.hmr_single_strike_knockback", + "hud-skill-hmr_single_strike_knockback_title", + "hud-skill-hmr_single_strike_knockback", modifiers.single_strike.knockback, ), HammerSkill::SsDamage => SkillStrings::plain( - "hud.skill.hmr_single_strike_damage_title", - "hud.skill.hmr_single_strike_damage", + "hud-skill-hmr_single_strike_damage_title", + "hud-skill-hmr_single_strike_damage", ), HammerSkill::SsSpeed => SkillStrings::plain( - "hud.skill.hmr_single_strike_speed_title", - "hud.skill.hmr_single_strike_speed", + "hud-skill-hmr_single_strike_speed_title", + "hud-skill-hmr_single_strike_speed", ), HammerSkill::SsRegen => SkillStrings::plain( - "hud.skill.hmr_single_strike_regen_title", - "hud.skill.hmr_single_strike_regen", + "hud-skill-hmr_single_strike_regen_title", + "hud-skill-hmr_single_strike_regen", ), // Charged melee upgrades HammerSkill::CDamage => SkillStrings::with_mult( - "hud.skill.hmr_charged_melee_damage_title", - "hud.skill.hmr_charged_melee_damage", + "hud-skill-hmr_charged_melee_damage_title", + "hud-skill-hmr_charged_melee_damage", modifiers.charged.scaled_damage, ), HammerSkill::CKnockback => SkillStrings::with_mult( - "hud.skill.hmr_charged_melee_knockback_title", - "hud.skill.hmr_charged_melee_knockback", + "hud-kill-hmr_charged_melee_knockback_title", + "hud-skill-hmr_charged_melee_knockback", modifiers.charged.scaled_knockback, ), HammerSkill::CDrain => SkillStrings::with_mult( - "hud.skill.hmr_charged_melee_nrg_drain_title", - "hud.skill.hmr_charged_melee_nrg_drain", + "hud-skill-hmr_charged_melee_nrg_drain_title", + "hud-skill-hmr_charged_melee_nrg_drain", modifiers.charged.energy_drain, ), HammerSkill::CSpeed => SkillStrings::with_mult( - "hud.skill.hmr_charged_rate_title", - "hud.skill.hmr_charged_rate", + "hud-skill-hmr_charged_rate_title", + "hud-skill-hmr_charged_rate", modifiers.charged.charge_rate, ), // Leap upgrades HammerSkill::UnlockLeap => SkillStrings::plain( - "hud.skill.hmr_unlock_leap_title", - "hud.skill.hmr_unlock_leap", + "hud-skill-hmr_unlock_leap_title", + "hud-skill-hmr_unlock_leap", ), HammerSkill::LDamage => SkillStrings::with_mult( - "hud.skill.hmr_leap_damage_title", - "hud.skill.hmr_leap_damage", + "hud-skill-hmr_leap_damage_title", + "hud-skill-hmr_leap_damage", modifiers.leap.base_damage, ), HammerSkill::LCost => SkillStrings::with_mult( - "hud.skill.hmr_leap_cost_title", - "hud.skill.hmr_leap_cost", + "hud-skill-hmr_leap_cost_title", + "hud-skill-hmr_leap_cost", modifiers.leap.energy_cost, ), HammerSkill::LDistance => SkillStrings::with_mult( - "hud.skill.hmr_leap_distance_title", - "hud.skill.hmr_leap_distance", + "hud-skill-hmr_leap_distance_title", + "hud-skill-hmr_leap_distance", modifiers.leap.leap_strength, ), HammerSkill::LKnockback => SkillStrings::with_mult( - "hud.skill.hmr_leap_knockback_title", - "hud.skill.hmr_leap_knockback", + "hud-skill-hmr_leap_knockback_title", + "hud-skill-hmr_leap_knockback", modifiers.leap.knockback, ), HammerSkill::LRange => SkillStrings::with_const_float( - "hud.skill.hmr_leap_radius_title", - "hud.skill.hmr_leap_radius", + "hud-skill-hmr_leap_radius_title", + "hud-skill-hmr_leap_radius", modifiers.leap.range, ), } @@ -3075,75 +3075,75 @@ fn bow_skill_strings(skill: BowSkill) -> SkillStrings<'static> { match skill { // Passives BowSkill::ProjSpeed => SkillStrings::with_mult( - "hud.skill.bow_projectile_speed_title", - "hud.skill.bow_projectile_speed", + "hud-skill-bow_projectile_speed_title", + "hud-skill-bow_projectile_speed", modifiers.universal.projectile_speed, ), // Charged upgrades BowSkill::CDamage => SkillStrings::with_mult( - "hud.skill.bow_charged_damage_title", - "hud.skill.bow_charged_damage", + "hud-skill-bow_charged_damage_title", + "hud-skill-bow_charged_damage", modifiers.charged.damage_scaling, ), BowSkill::CRegen => SkillStrings::with_mult( - "hud.skill.bow_charged_energy_regen_title", - "hud.skill.bow_charged_energy_regen", + "hud-skill-bow_charged_energy_regen_title", + "hud-skill-bow_charged_energy_regen", modifiers.charged.regen_scaling, ), BowSkill::CKnockback => SkillStrings::with_mult( - "hud.skill.bow_charged_knockback_title", - "hud.skill.bow_charged_knockback", + "hud-skill-bow_charged_knockback_title", + "hud-skill-bow_charged_knockback", modifiers.charged.knockback_scaling, ), BowSkill::CSpeed => SkillStrings::with_mult( - "hud.skill.bow_charged_speed_title", - "hud.skill.bow_charged_speed", + "hud-skill-bow_charged_speed_title", + "hud-skill-bow_charged_speed", modifiers.charged.charge_rate, ), BowSkill::CMove => SkillStrings::with_mult( - "hud.skill.bow_charged_move_title", - "hud.skill.bow_charged_move", + "hud-skill-bow_charged_move_title", + "hud-skill-bow_charged_move", modifiers.charged.move_speed, ), // Repeater upgrades BowSkill::RDamage => SkillStrings::with_mult( - "hud.skill.bow_repeater_damage_title", - "hud.skill.bow_repeater_damage", + "hud-skill-bow_repeater_damage_title", + "hud-skill-bow_repeater_damage", modifiers.repeater.power, ), BowSkill::RCost => SkillStrings::with_mult( - "hud.skill.bow_repeater_cost_title", - "hud.skill.bow_repeater_cost", + "hud-skill-bow_repeater_cost_title", + "hud-skill-bow_repeater_cost", modifiers.repeater.energy_cost, ), BowSkill::RSpeed => SkillStrings::with_mult( - "hud.skill.bow_repeater_speed_title", - "hud.skill.bow_repeater_speed", + "hud-skill-bow_repeater_speed_title", + "hud-skill-bow_repeater_speed", modifiers.repeater.max_speed, ), // Shotgun upgrades BowSkill::UnlockShotgun => SkillStrings::plain( - "hud.skill.bow_shotgun_unlock_title", - "hud.skill.bow_shotgun_unlock", + "hud-skill-bow_shotgun_unlock_title", + "hud-skill-bow_shotgun_unlock", ), BowSkill::SDamage => SkillStrings::with_mult( - "hud.skill.bow_shotgun_damage_title", - "hud.skill.bow_shotgun_damage", + "hud-skill-bow_shotgun_damage_title", + "hud-skill-bow_shotgun_damage", modifiers.shotgun.power, ), BowSkill::SCost => SkillStrings::with_mult( - "hud.skill.bow_shotgun_cost_title", - "hud.skill.bow_shotgun_cost", + "hud-skill-bow_shotgun_cost_title", + "hud-skill-bow_shotgun_cost", modifiers.shotgun.energy_cost, ), BowSkill::SArrows => SkillStrings::with_const( - "hud.skill.bow_shotgun_arrow_count_title", - "hud.skill.bow_shotgun_arrow_count", + "hud-skill-bow_shotgun_arrow_count_title", + "hud-skill-bow_shotgun_arrow_count", modifiers.shotgun.num_projectiles, ), BowSkill::SSpread => SkillStrings::with_mult( - "hud.skill.bow_shotgun_spread_title", - "hud.skill.bow_shotgun_spread", + "hud-skill-bow_shotgun_spread_title", + "hud-skill-bow_shotgun_spread", modifiers.shotgun.spread, ), } @@ -3154,64 +3154,64 @@ fn staff_skill_strings(skill: StaffSkill) -> SkillStrings<'static> { match skill { // Basic ranged upgrades StaffSkill::BDamage => SkillStrings::with_mult( - "hud.skill.st_damage_title", - "hud.skill.st_damage", + "hud-skill-st_damage_title", + "hud-skill-st_damage", modifiers.fireball.power, ), StaffSkill::BRegen => SkillStrings::with_mult( - "hud.skill.st_energy_regen_title", - "hud.skill.st_energy_regen", + "hud-skill-st_energy_regen_title", + "hud-skill-st_energy_regen", modifiers.fireball.regen, ), StaffSkill::BRadius => SkillStrings::with_mult( - "hud.skill.st_explosion_radius_title", - "hud.skill.st_explosion_radius", + "hud-skill-st_explosion_radius_title", + "hud-skill-st_explosion_radius", modifiers.fireball.range, ), // Flamethrower upgrades StaffSkill::FDamage => SkillStrings::with_mult( - "hud.skill.st_flamethrower_damage_title", - "hud.skill.st_flamethrower_damage", + "hud-skill-st_flamethrower_damage_title", + "hud-skill-st_flamethrower_damage", modifiers.flamethrower.damage, ), StaffSkill::FRange => SkillStrings::with_mult( - "hud.skill.st_flamethrower_range_title", - "hud.skill.st_flamethrower_range", + "hud-skill-st_flamethrower_range_title", + "hud-skill-st_flamethrower_range", modifiers.flamethrower.range, ), StaffSkill::FDrain => SkillStrings::with_mult( - "hud.skill.st_energy_drain_title", - "hud.skill.st_energy_drain", + "hud-skill-st_energy_drain_title", + "hud-skill-st_energy_drain", modifiers.flamethrower.energy_drain, ), StaffSkill::FVelocity => SkillStrings::with_mult( - "hud.skill.st_flame_velocity_title", - "hud.skill.st_flame_velocity", + "hud-skill-st_flame_velocity_title", + "hud-skill-st_flame_velocity", modifiers.flamethrower.velocity, ), // Shockwave upgrades StaffSkill::UnlockShockwave => SkillStrings::plain( - "hud.skill.st_shockwave_unlock_title", - "hud.skill.st_shockwave_unlock", + "hud-skill-st_shockwave_unlock_title", + "hud-skill-st_shockwave_unlock", ), StaffSkill::SDamage => SkillStrings::with_mult( - "hud.skill.st_shockwave_damage_title", - "hud.skill.st_shockwave_damage", + "hud-skill-st_shockwave_damage_title", + "hud-skill-st_shockwave_damage", modifiers.shockwave.damage, ), StaffSkill::SKnockback => SkillStrings::with_mult( - "hud.skill.st_shockwave_knockback_title", - "hud.skill.st_shockwave_knockback", + "hud-skill-st_shockwave_knockback_title", + "hud-skill-st_shockwave_knockback", modifiers.shockwave.knockback, ), StaffSkill::SRange => SkillStrings::with_mult( - "hud.skill.st_shockwave_range_title", - "hud.skill.st_shockwave_range", + "hud-skill-st_shockwave_range_title", + "hud-skill-st_shockwave_range", modifiers.shockwave.duration, ), StaffSkill::SCost => SkillStrings::with_mult( - "hud.skill.st_shockwave_cost_title", - "hud.skill.st_shockwave_cost", + "hud-skill-st_shockwave_cost_title", + "hud-skill-st_shockwave_cost", modifiers.shockwave.energy_cost, ), } @@ -3222,69 +3222,69 @@ fn sceptre_skill_strings(skill: SceptreSkill) -> SkillStrings<'static> { match skill { // Lifesteal beam upgrades SceptreSkill::LDamage => SkillStrings::with_mult( - "hud.skill.sc_lifesteal_damage_title", - "hud.skill.sc_lifesteal_damage", + "hud-skill-sc_lifesteal_damage_title", + "hud-skill-sc_lifesteal_damage", modifiers.beam.damage, ), SceptreSkill::LRange => SkillStrings::with_mult( - "hud.skill.sc_lifesteal_range_title", - "hud.skill.sc_lifesteal_range", + "hud-skill-sc_lifesteal_range_title", + "hud-skill-sc_lifesteal_range", modifiers.beam.range, ), SceptreSkill::LLifesteal => SkillStrings::with_mult( - "hud.skill.sc_lifesteal_lifesteal_title", - "hud.skill.sc_lifesteal_lifesteal", + "hud-skill-sc_lifesteal_lifesteal_title", + "hud-skill-sc_lifesteal_lifesteal", modifiers.beam.lifesteal, ), SceptreSkill::LRegen => SkillStrings::with_mult( - "hud.skill.sc_lifesteal_regen_title", - "hud.skill.sc_lifesteal_regen", + "hud-skill-sc_lifesteal_regen_title", + "hud-skill-sc_lifesteal_regen", modifiers.beam.energy_regen, ), // Healing aura upgrades SceptreSkill::HHeal => SkillStrings::with_mult( - "hud.skill.sc_heal_heal_title", - "hud.skill.sc_heal_heal", + "hud-skill-sc_heal_heal_title", + "hud-skill-sc_heal_heal", modifiers.healing_aura.strength, ), SceptreSkill::HRange => SkillStrings::with_mult( - "hud.skill.sc_heal_range_title", - "hud.skill.sc_heal_range", + "hud-skill-sc_heal_range_title", + "hud-skill-sc_heal_range", modifiers.healing_aura.range, ), SceptreSkill::HDuration => SkillStrings::with_mult( - "hud.skill.sc_heal_duration_title", - "hud.skill.sc_heal_duration", + "hud-skill-sc_heal_duration_title", + "hud-skill-sc_heal_duration", modifiers.healing_aura.duration, ), SceptreSkill::HCost => SkillStrings::with_mult( - "hud.skill.sc_heal_cost_title", - "hud.skill.sc_heal_cost", + "hud-skill-sc_heal_cost_title", + "hud-skill-sc_heal_cost", modifiers.healing_aura.energy_cost, ), // Warding aura upgrades SceptreSkill::UnlockAura => SkillStrings::plain( - "hud.skill.sc_wardaura_unlock_title", - "hud.skill.sc_wardaura_unlock", + "hud-skill-sc_wardaura_unlock_title", + "hud-skill-sc_wardaura_unlock", ), SceptreSkill::AStrength => SkillStrings::with_mult( - "hud.skill.sc_wardaura_strength_title", - "hud.skill.sc_wardaura_strength", + "hud-skill-sc_wardaura_strength_title", + "hud-skill-sc_wardaura_strength", modifiers.warding_aura.strength, ), SceptreSkill::ADuration => SkillStrings::with_mult( - "hud.skill.sc_wardaura_duration_title", - "hud.skill.sc_wardaura_duration", + "hud-skill-sc_wardaura_duration_title", + "hud-kill-sc_wardaura_duration", modifiers.warding_aura.duration, ), SceptreSkill::ARange => SkillStrings::with_mult( - "hud.skill.sc_wardaura_range_title", - "hud.skill.sc_wardaura_range", + "hud-skill-sc_wardaura_range_title", + "hud-skill-sc_wardaura_range", modifiers.warding_aura.range, ), SceptreSkill::ACost => SkillStrings::with_mult( - "hud.skill.sc_wardaura_cost_title", - "hud.skill.sc_wardaura_cost", + "hud-skill-sc_wardaura_cost_title", + "hud-skill-sc_wardaura_cost", modifiers.warding_aura.energy_cost, ), } @@ -3294,18 +3294,18 @@ fn roll_skill_strings(skill: RollSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.general_tree.roll; match skill { RollSkill::Cost => SkillStrings::with_mult( - "hud.skill.roll_energy_title", - "hud.skill.roll_energy", + "hud-skill-roll_energy_title", + "hud-skill-roll_energy", modifiers.energy_cost, ), RollSkill::Strength => SkillStrings::with_mult( - "hud.skill.roll_speed_title", - "hud.skill.roll_speed", + "hud-skill-roll_speed_title", + "hud-skill-roll_speed", modifiers.strength, ), RollSkill::Duration => SkillStrings::with_mult( - "hud.skill.roll_dur_title", - "hud.skill.roll_dur", + "hud-skill-roll_dur_title", + "hud-skill-roll_dur", modifiers.duration, ), } @@ -3315,13 +3315,13 @@ fn climb_skill_strings(skill: ClimbSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.general_tree.climb; match skill { ClimbSkill::Cost => SkillStrings::with_mult( - "hud.skill.climbing_cost_title", - "hud.skill.climbing_cost", + "hud-skill-climbing_cost_title", + "hud-skill-climbing_cost", modifiers.energy_cost, ), ClimbSkill::Speed => SkillStrings::with_mult( - "hud.skill.climbing_speed_title", - "hud.skill.climbing_speed", + "hud-skill-climbing_speed_title", + "hud-skill-climbing_speed", modifiers.speed, ), } @@ -3331,8 +3331,8 @@ fn swim_skill_strings(skill: SwimSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.general_tree.swim; match skill { SwimSkill::Speed => SkillStrings::with_mult( - "hud.skill.swim_speed_title", - "hud.skill.swim_speed", + "hud-skill-swim_speed_title", + "hud-skill-swim_speed", modifiers.speed, ), } @@ -3342,18 +3342,18 @@ fn mining_skill_strings(skill: MiningSkill) -> SkillStrings<'static> { let modifiers = SKILL_MODIFIERS.mining_tree; match skill { MiningSkill::Speed => SkillStrings::with_mult( - "hud.skill.pick_strike_speed_title", - "hud.skill.pick_strike_speed", + "hud-skill-pick_strike_speed_title", + "hud-skill-pick_strike_speed", modifiers.speed, ), MiningSkill::OreGain => SkillStrings::with_const( - "hud.skill.pick_strike_oregain_title", - "hud.skill.pick_strike_oregain", + "hud-skill-pick_strike_oregain_title", + "hud-skill-pick_strike_oregain", (modifiers.ore_gain * 100.0).round() as u32, ), MiningSkill::GemGain => SkillStrings::with_const( - "hud.skill.pick_strike_gemgain_title", - "hud.skill.pick_strike_gemgain", + "hud-skill-pick_strike_gemgain_title", + "hud-skill-pick_strike_gemgain", (modifiers.gem_gain * 100.0).round() as u32, ), } @@ -3419,12 +3419,12 @@ impl<'a> SkillStrings<'a> { ) -> (Cow<'loc, str>, Cow<'loc, str>) { match self { Self::Plain { title, desc } => { - let title = i18n.get(title); + let title = i18n.get_msg(title); let args = i18n::fluent_args! { "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + let desc = i18n.get_msg_ctx(&desc, &args); (title, desc) }, @@ -3433,7 +3433,7 @@ impl<'a> SkillStrings<'a> { desc, constant, } => { - let title = i18n.get(title); + let title = i18n.get_msg(title); let args = i18n::fluent_args! { "boost" => constant, "SP" => sp(i18n, skill_set, skill), @@ -3447,7 +3447,7 @@ impl<'a> SkillStrings<'a> { desc, constant, } => { - let title = i18n.get(title); + let title = i18n.get_msg(title); let args = i18n::fluent_args! { "boost" => constant, "SP" => sp(i18n, skill_set, skill), @@ -3463,7 +3463,7 @@ impl<'a> SkillStrings<'a> { } => { let percentage = hud::multiplier_to_percentage(*multiplier).abs(); - let title = i18n.get(title); + let title = i18n.get_msg(title); let args = i18n::fluent_args! { "boost" => format!("{percentage:.0}"), diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 774779405a..73891d196b 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -3763,7 +3763,7 @@ impl Hud { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .bottom_left_with_margins_on(ui_widgets.window, 350.0, 150.0) - .label(&i18n._msg("hud-tutorial_btn")) + .label(&i18n.get_msg("hud-tutorial_btn")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(18)) .label_color(TEXT_COLOR) @@ -3812,7 +3812,7 @@ impl Hud { if self.show.intro { self.show.want_grab = false; let quest_headline = i18n.get_msg("hud-temp_quest_headline"); - let quest_text = i18n.get("hud.temp_quest_text"); + let quest_text = i18n.get_msg("hud-temp_quest_text"); Image::new(self.imgs.quest_bg) .w_h(404.0, 858.0) .middle_of(ui_widgets.window) @@ -3851,7 +3851,7 @@ impl Hud { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .mid_bottom_with_margin_on(self.ids.q_text_bg, -80.0) - .label(&i18n.get("common.close")) + .label(&i18n.get_msg("common-close")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(22)) .label_color(TEXT_COLOR) @@ -3875,14 +3875,14 @@ impl Hud { ) .color(Some(QUALITY_LEGENDARY)) .set(self.ids.tut_arrow, ui_widgets); - Text::new(&i18n.get("hud.tutorial_elements")) + Text::new(&i18n.get_msg("hud-tutorial_elements")) .mid_top_with_margin_on(self.ids.tut_arrow, -50.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(40)) .color(BLACK) .floating(true) .set(self.ids.tut_arrow_txt_bg, ui_widgets); - Text::new(&i18n.get("hud.tutorial_elements")) + Text::new(&i18n.get_msg("hud-tutorial_elements")) .bottom_right_with_margins_on(self.ids.tut_arrow_txt_bg, 1.0, 1.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(40)) diff --git a/voxygen/src/hud/overhead.rs b/voxygen/src/hud/overhead.rs index d0b94fc028..4a311428c3 100644 --- a/voxygen/src/hud/overhead.rs +++ b/voxygen/src/hud/overhead.rs @@ -394,7 +394,7 @@ impl<'a> Widget for Overhead<'a> { } let mut txt = format!("{}/{}", health_cur_txt, health_max_txt); if health.is_dead { - txt = self.i18n.get("hud.group.dead").to_string() + txt = self.i18n.get_msg("hud-group-dead").to_string() }; Text::new(&txt) .mid_top_with_margin_on(state.ids.health_bar_bg, 2.0) diff --git a/voxygen/src/hud/popup.rs b/voxygen/src/hud/popup.rs index 9daca35dec..5053425e12 100644 --- a/voxygen/src/hud/popup.rs +++ b/voxygen/src/hud/popup.rs @@ -127,7 +127,7 @@ impl<'a> Widget for Popup<'a> { if s.infos.is_empty() { s.last_info_update = Instant::now(); } - let text = self.i18n.get("hud.waypoint_saved"); + let text = self.i18n.get_msg("hud-waypoint_saved"); s.infos.push_back(text.to_string()); }); }, diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 2e8d47561c..199859ed0b 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -44,15 +44,15 @@ pub fn price_desc( let deal_goodness = deal_goodness.log(2.0); let buy_string = format!( "{} : {:0.1} {}", - i18n.get("hud.trade.buy_price"), + i18n.get_msg("hud-trade-buy_price"), buyprice / coinprice, - i18n.get("hud.trade.coin"), + i18n.get_msg("hud-trade-coin"), ); let sell_string = format!( "{} : {:0.1} {}", - i18n.get("hud.trade.sell_price"), + i18n.get_msg("hud-trade-sell_price"), sellprice / coinprice, - i18n.get("hud.trade.coin"), + i18n.get_msg("hud-trade-coin"), ); let deal_goodness = match deal_goodness { x if x < -2.5 => 0.0, @@ -82,30 +82,30 @@ pub fn kind_text<'a>(kind: &ItemKind, i18n: &'a Localization) -> Cow<'a, str> { if let Some(toolkind) = mc.toolkind() { Cow::Owned(format!( "{} {}", - i18n.get(&format!("common.weapons.{}", toolkind.identifier_name())), - i18n.get("common.kind.modular_component_partial") + i18n.get_msg(&format!("common-weapons-{}", toolkind.identifier_name())), + i18n.get_msg("common-kind-modular_component_partial") )) } else { - i18n.get("common.kind.modular_component") + i18n.get_msg("common-kind-modular_component") } }, - ItemKind::Glider => i18n.get("common.kind.glider"), - ItemKind::Consumable { .. } => i18n.get("common.kind.consumable"), - ItemKind::Throwable { .. } => i18n.get("common.kind.throwable"), - ItemKind::Utility { .. } => i18n.get("common.kind.utility"), - ItemKind::Ingredient { .. } => i18n.get("common.kind.ingredient"), - ItemKind::Lantern { .. } => i18n.get("common.kind.lantern"), + ItemKind::Glider => i18n.get_msg("common-kind-glider"), + ItemKind::Consumable { .. } => i18n.get_msg("common-kind-consumable"), + ItemKind::Throwable { .. } => i18n.get_msg("common-kind-throwable"), + ItemKind::Utility { .. } => i18n.get_msg("common-kind-utility"), + ItemKind::Ingredient { .. } => i18n.get_msg("common-kind-ingredient"), + ItemKind::Lantern { .. } => i18n.get_msg("common-kind-lantern"), ItemKind::TagExamples { .. } => Cow::Borrowed(""), } } pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> Cow<'a, str> { match kind { - MaterialKind::Metal { .. } => i18n.get("common.material.metal"), - MaterialKind::Wood { .. } => i18n.get("common.material.wood"), - MaterialKind::Stone { .. } => i18n.get("common.material.stone"), - MaterialKind::Cloth { .. } => i18n.get("common.material.cloth"), - MaterialKind::Hide { .. } => i18n.get("common.material.hide"), + MaterialKind::Metal { .. } => i18n.get_msg("common-material-metal"), + MaterialKind::Wood { .. } => i18n.get_msg("common-material-wood"), + MaterialKind::Stone { .. } => i18n.get_msg("common-material-stone"), + MaterialKind::Cloth { .. } => i18n.get_msg("common-material-cloth"), + MaterialKind::Hide { .. } => i18n.get_msg("common-material-hide"), } } @@ -161,7 +161,7 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { "strength" => format_float(strength), }) }, - BuffKind::Invulnerability => i18n.get("buff.stat.invulnerability"), + BuffKind::Invulnerability => i18n.get_msg("buff-stat-invulnerability"), BuffKind::Bleeding | BuffKind::Burning | BuffKind::CampfireHeal @@ -207,7 +207,7 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { | BuffKind::Hastened => Cow::Borrowed(""), } } else if let BuffKind::Saturation | BuffKind::Regeneration = buff.kind { - i18n.get("buff.text.every_second") + i18n.get_msg("buff-text-every_second") } else { Cow::Borrowed("") }; @@ -223,18 +223,18 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { // Armor fn armor_kind<'a>(armor: &Armor, i18n: &'a Localization) -> Cow<'a, str> { let kind = match armor.kind { - ArmorKind::Shoulder => i18n.get("hud.bag.shoulders"), - ArmorKind::Chest => i18n.get("hud.bag.chest"), - ArmorKind::Belt => i18n.get("hud.bag.belt"), - ArmorKind::Hand => i18n.get("hud.bag.hands"), - ArmorKind::Pants => i18n.get("hud.bag.legs"), - ArmorKind::Foot => i18n.get("hud.bag.feet"), - ArmorKind::Back => i18n.get("hud.bag.back"), - ArmorKind::Ring => i18n.get("hud.bag.ring"), - ArmorKind::Neck => i18n.get("hud.bag.neck"), - ArmorKind::Head => i18n.get("hud.bag.head"), - ArmorKind::Tabard => i18n.get("hud.bag.tabard"), - ArmorKind::Bag => i18n.get("hud.bag.bag"), + ArmorKind::Shoulder => i18n.get_msg("hud-bag-shoulders"), + ArmorKind::Chest => i18n.get_msg("hud-bag-chest"), + ArmorKind::Belt => i18n.get_msg("hud-bag-belt"), + ArmorKind::Hand => i18n.get_msg("hud-bag-hands"), + ArmorKind::Pants => i18n.get_msg("hud-bag-legs"), + ArmorKind::Foot => i18n.get_msg("hud-bag-feet"), + ArmorKind::Back => i18n.get_msg("hud-bag-back"), + ArmorKind::Ring => i18n.get_msg("hud-bag-ring"), + ArmorKind::Neck => i18n.get_msg("hud-bag-neck"), + ArmorKind::Head => i18n.get_msg("hud-bag-head"), + ArmorKind::Tabard => i18n.get_msg("hud-bag-tabard"), + ArmorKind::Bag => i18n.get_msg("hud-bag-bag"), }; kind } @@ -242,21 +242,21 @@ fn armor_kind<'a>(armor: &Armor, i18n: &'a Localization) -> Cow<'a, str> { // Tool fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { let kind = match tool.kind { - ToolKind::Sword => i18n.get("common.weapons.sword"), - ToolKind::Axe => i18n.get("common.weapons.axe"), - ToolKind::Hammer => i18n.get("common.weapons.hammer"), - ToolKind::Bow => i18n.get("common.weapons.bow"), - ToolKind::Dagger => i18n.get("common.weapons.dagger"), - ToolKind::Staff => i18n.get("common.weapons.staff"), - ToolKind::Sceptre => i18n.get("common.weapons.sceptre"), - ToolKind::Shield => i18n.get("common.weapons.shield"), - ToolKind::Spear => i18n.get("common.weapons.spear"), - ToolKind::Blowgun => i18n.get("common.weapons.blowgun"), - ToolKind::Natural => i18n.get("common.weapons.natural"), - ToolKind::Debug => i18n.get("common.tool.debug"), - ToolKind::Farming => i18n.get("common.tool.farming"), - ToolKind::Pick => i18n.get("common.tool.pick"), - ToolKind::Empty => i18n.get("common.empty"), + ToolKind::Sword => i18n.get_msg("common-weapons-sword"), + ToolKind::Axe => i18n.get_msg("common-weapons-axe"), + ToolKind::Hammer => i18n.get_msg("common-weapons-hammer"), + ToolKind::Bow => i18n.get_msg("common-weapons-bow"), + ToolKind::Dagger => i18n.get_msg("common-weapons-dagger"), + ToolKind::Staff => i18n.get_msg("common-weapons-staff"), + ToolKind::Sceptre => i18n.get_msg("common-weapons-sceptre"), + ToolKind::Shield => i18n.get_msg("common-weapons-shield"), + ToolKind::Spear => i18n.get_msg("common-weapons-spear"), + ToolKind::Blowgun => i18n.get_msg("common-weapons-blowgun"), + ToolKind::Natural => i18n.get_msg("common-weapons-natural"), + ToolKind::Debug => i18n.get_msg("common-tool-debug"), + ToolKind::Farming => i18n.get_msg("common-tool-farming"), + ToolKind::Pick => i18n.get_msg("common-tool-pick"), + ToolKind::Empty => i18n.get_msg("common-empty"), }; kind } @@ -264,8 +264,8 @@ fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { /// Output the number of hands needed to hold a tool pub fn tool_hands<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { let hands = match tool.hands { - Hands::One => i18n.get("common.hands.one"), - Hands::Two => i18n.get("common.hands.two"), + Hands::One => i18n.get_msg("common-hands-one"), + Hands::Two => i18n.get_msg("common-hands-two"), }; hands } diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index cb05e6ed36..6bd90f1c04 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -444,7 +444,7 @@ impl Controls { // instead of directly showing error message here *info_content = Some(InfoContent::CharacterError(format!( "{}: {}", - i18n.get("common.error"), + i18n.get_msg("common-error"), error ))) } else if let Some(InfoContent::CharacterError(_)) = info_content { @@ -559,7 +559,7 @@ impl Controls { .into(), Text::new( // TODO: Add actual location here - i18n.get("char_selection.uncanny_valley"), + i18n.get_msg("char_selection-uncanny_valley"), ) .into(), ]), @@ -605,7 +605,7 @@ impl Controls { let button = Button::new( new_character_button, Container::new(Text::new( - i18n.get("char_selection.create_new_character"), + i18n.get_msg("char_selection-create_new_character"), )) .width(Length::Fill) .height(Length::Fill) @@ -684,7 +684,7 @@ impl Controls { let mut bottom_content = vec![ Container::new(neat_button( logout_button, - i18n.get("char_selection.logout").into_owned(), + i18n.get_msg("char_selection-logout").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::Logout), @@ -698,7 +698,7 @@ impl Controls { bottom_content.push( Container::new(neat_button( spectate_button, - i18n.get("char_selection.spectate").into_owned(), + i18n.get_msg("char_selection-spectate").into_owned(), FILL_FRAC_TWO, button_style, Some(Message::Spectate), @@ -713,7 +713,7 @@ impl Controls { bottom_content.push( Container::new(neat_button( enter_world_button, - i18n.get("char_selection.enter_world").into_owned(), + i18n.get_msg("char_selection-enter_world").into_owned(), FILL_FRAC_TWO, button_style, selected.map(|_| Message::EnterWorld), @@ -737,20 +737,20 @@ impl Controls { if let Some(info_content) = info_content { let over_content: Element<_> = match &info_content { InfoContent::Deletion(_) => Column::with_children(vec![ - Text::new(i18n.get("char_selection.delete_permanently")) + Text::new(i18n.get_msg("char_selection-delete_permanently")) .size(fonts.cyri.scale(24)) .into(), Row::with_children(vec![ neat_button( no_button, - i18n.get("common.no").into_owned(), + i18n.get_msg("common-no").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::CancelDeletion), ), neat_button( yes_button, - i18n.get("common.yes").into_owned(), + i18n.get_msg("common-yes").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::ConfirmDeletion), @@ -764,22 +764,22 @@ impl Controls { .spacing(10) .into(), InfoContent::LoadingCharacters => { - Text::new(i18n.get("char_selection.loading_characters")) + Text::new(i18n.get_msg("char_selection-loading_characters")) .size(fonts.cyri.scale(24)) .into() }, InfoContent::CreatingCharacter => { - Text::new(i18n.get("char_selection.creating_character")) + Text::new(i18n.get_msg("char_selection-creating_character")) .size(fonts.cyri.scale(24)) .into() }, InfoContent::EditingCharacter => { - Text::new(i18n.get("char_selection.editing_character")) + Text::new(i18n.get_msg("char_selection-editing_character")) .size(fonts.cyri.scale(24)) .into() }, InfoContent::DeletingCharacter => { - Text::new(i18n.get("char_selection.deleting_character")) + Text::new(i18n.get_msg("char_selection-deleting_character")) .size(fonts.cyri.scale(24)) .into() }, @@ -787,7 +787,7 @@ impl Controls { Text::new(error).size(fonts.cyri.scale(24)).into(), Row::with_children(vec![neat_button( no_button, - i18n.get("common.close").into_owned(), + i18n.get_msg("common-close").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::ClearCharacterListError), @@ -871,7 +871,7 @@ impl Controls { icon_button(button, selected, msg, img).with_tooltip( tooltip_manager, move || { - let tooltip_text = i18n.get(tooltip_i18n_key); + let tooltip_text = i18n.get_msg(tooltip_i18n_key); tooltip::text(&tooltip_text, tooltip_style) }, ) @@ -1137,7 +1137,7 @@ impl Controls { let slider_options = Column::with_children(vec![ char_slider( - i18n.get("char_selection.hair_style").into_owned(), + i18n.get_msg("char_selection-hair_style").into_owned(), &mut sliders.hair_style, body.species.num_hair_styles(body.body_type) - 1, body.hair_style, @@ -1145,7 +1145,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.hair_color").into_owned(), + i18n.get_msg("char_selection-hair_color").into_owned(), &mut sliders.hair_color, body.species.num_hair_colors() - 1, body.hair_color, @@ -1153,7 +1153,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.skin").into_owned(), + i18n.get_msg("char_selection-skin").into_owned(), &mut sliders.skin, body.species.num_skin_colors() - 1, body.skin, @@ -1161,7 +1161,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.eyeshape").into_owned(), + i18n.get_msg("char_selection-eyeshape").into_owned(), &mut sliders.eyes, body.species.num_eyes(body.body_type) - 1, body.eyes, @@ -1169,7 +1169,7 @@ impl Controls { (fonts, imgs), ), char_slider( - i18n.get("char_selection.eye_color").into_owned(), + i18n.get_msg("char_selection-eye_color").into_owned(), &mut sliders.eye_color, body.species.num_eye_colors() - 1, body.eye_color, @@ -1178,7 +1178,7 @@ impl Controls { ), char_slider_greyable( body.species.num_accessories(body.body_type) > 1, - i18n.get("char_selection.accessories").into_owned(), + i18n.get_msg("char_selection-accessories").into_owned(), &mut sliders.accessory, body.species.num_accessories(body.body_type) - 1, body.accessory, @@ -1187,7 +1187,7 @@ impl Controls { ), char_slider_greyable( body.species.num_beards(body.body_type) > 1, - i18n.get("char_selection.beard").into_owned(), + i18n.get_msg("char_selection-beard").into_owned(), &mut sliders.beard, body.species.num_beards(body.body_type) - 1, body.beard, @@ -1210,7 +1210,7 @@ impl Controls { ) .on_press(Message::RandomizeCharacter) .with_tooltip(tooltip_manager, move || { - let tooltip_text = i18n.get("common.rand_appearance"); + let tooltip_text = i18n.get_msg("common-rand_appearance"); tooltip::text(&tooltip_text, tooltip_style) }); @@ -1270,7 +1270,7 @@ impl Controls { let back = neat_button( back_button, - i18n.get("common.back").into_owned(), + i18n.get_msg("common-back").into_owned(), FILL_FRAC_ONE, button_style, Some(Message::Back), @@ -1288,7 +1288,7 @@ impl Controls { ) .on_press(Message::RandomizeName) .with_tooltip(tooltip_manager, move || { - let tooltip_text = i18n.get("common.rand_name"); + let tooltip_text = i18n.get_msg("common-rand_name"); tooltip::text(&tooltip_text, tooltip_style) }); @@ -1304,7 +1304,7 @@ impl Controls { .fix_aspect_ratio(), TextInput::new( name_input, - &i18n.get("character_window.character_name"), + &i18n.get_msg("character_window-character_name"), name, Message::Name, ) @@ -1328,10 +1328,10 @@ impl Controls { let create = neat_button( create_button, - i18n.get(if character_id.is_some() { - "common.confirm" + i18n.get_msg(if character_id.is_some() { + "common-confirm" } else { - "common.create" + "common-create" }), FILL_FRAC_ONE, button_style, @@ -1341,7 +1341,7 @@ impl Controls { let create: Element = if name.is_empty() { create .with_tooltip(tooltip_manager, move || { - let tooltip_text = i18n.get("char_selection.create_info_name"); + let tooltip_text = i18n.get_msg("char_selection-create_info_name"); tooltip::text(&tooltip_text, tooltip_style) }) .into() @@ -1379,10 +1379,10 @@ impl Controls { if let Some(mismatched_version) = &self.server_mismatched_version { let warning = Text::::new(format!( "{}\n{}: {} {}: {}", - i18n.get("char_selection.version_mismatch"), - i18n.get("main.login.server_version"), + i18n.get_msg("char_selection-version_mismatch"), + i18n.get_msg("main-login-server_version"), mismatched_version, - i18n.get("main.login.client_version"), + i18n.get_msg("main-login-client_version"), *common::util::GIT_HASH )) .size(self.fonts.cyri.scale(18)) diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index 393dd5cf5b..29cd0caacc 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -102,7 +102,7 @@ impl Screen { let tip = if show_tip { let key = |code| match controls.keybindings.get(&code) { Some(Some(key_mouse)) => key_mouse.display_string(key_layout), - Some(None) => i18n.get("main.unbound_key_tip").into_owned(), + Some(None) => i18n.get_msg("main-unbound_key_tip").into_owned(), None => ControlSettings::default_binding(code).display_string(key_layout), }; let keys = i18n::fluent_args! { @@ -118,7 +118,7 @@ impl Screen { "gameinput-screenshot" => key(GameInput::Screenshot), }; let tip = &i18n.get_variation_ctx("loading-tips", self.tip_number, &keys); - let tip = format!("{} {}", i18n.get("main.tip"), tip); + let tip = format!("{} {}", i18n.get_msg("main-tip"), tip); Container::new(Text::new(tip).size(fonts.cyri.scale(25))) .width(Length::Fill) @@ -132,7 +132,7 @@ impl Screen { let cancel = Container::new(neat_button( &mut self.cancel_button, - i18n.get("common.cancel"), + i18n.get_msg("common-cancel"), 0.7, button_style, Some(Message::CancelConnect), @@ -190,14 +190,14 @@ impl Screen { let cancel = neat_button( &mut self.cancel_button, - i18n.get("common.cancel"), + i18n.get_msg("common-cancel"), 0.7, button_style, Some(Message::TrustPromptCancel), ); let add = neat_button( &mut self.add_button, - i18n.get("common.add"), + i18n.get_msg("common-add"), 0.7, button_style, Some(Message::TrustPromptAdd), diff --git a/voxygen/src/menu/main/ui/credits.rs b/voxygen/src/menu/main/ui/credits.rs index f98009a896..ade2a464ac 100644 --- a/voxygen/src/menu/main/ui/credits.rs +++ b/voxygen/src/menu/main/ui/credits.rs @@ -40,7 +40,7 @@ impl Screen { write!( &mut text, " {} {}", - i18n.get("main.credits.created_by"), + i18n.get_msg("main-credits-created_by"), author )?; } @@ -79,7 +79,7 @@ impl Screen { ) -> Element<'a, Message> { Column::with_children( core::iter::once( - iced::Text::new(i18n.get(header_i18n_key)) + iced::Text::new(i18n.get_msg(header_i18n_key)) .font(fonts.cyri.id) .size(fonts.cyri.scale(30)) .color(header_color) @@ -119,7 +119,7 @@ impl Screen { Container::new( Container::new( Column::with_children(vec![ - iced::Text::new(i18n.get("main.credits")) + iced::Text::new(i18n.get_msg("main-credits")) .font(fonts.alkhemi.id) .size(fonts.alkhemi.scale(35)) .width(Length::Fill) @@ -156,7 +156,7 @@ impl Screen { Container::new( Container::new(neat_button( &mut self.back_button, - i18n.get("common.back"), + i18n.get_msg("common-back"), 0.7, button_style, Some(Message::Back), diff --git a/voxygen/src/menu/main/ui/disclaimer.rs b/voxygen/src/menu/main/ui/disclaimer.rs index 885b29bc15..7a5e05a540 100644 --- a/voxygen/src/menu/main/ui/disclaimer.rs +++ b/voxygen/src/menu/main/ui/disclaimer.rs @@ -31,14 +31,14 @@ impl Screen { Container::new( Container::new( Column::with_children(vec![ - iced::Text::new(i18n.get("common.disclaimer")) + iced::Text::new(i18n.get_msg("common-disclaimer")) .font(fonts.alkhemi.id) .size(fonts.alkhemi.scale(35)) .into(), Space::new(Length::Fill, Length::Units(20)).into(), Scrollable::new(&mut self.scroll) .push( - iced::Text::new(i18n.get("main.notice")) + iced::Text::new(i18n.get_msg("main-notice")) .font(fonts.cyri.id) .size(fonts.cyri.scale(23)), ) @@ -47,7 +47,7 @@ impl Screen { Container::new( Container::new(neat_button( &mut self.accept_button, - i18n.get("common.accept"), + i18n.get_msg("common-accept"), 0.7, button_style, Some(Message::AcceptDisclaimer), diff --git a/voxygen/src/menu/main/ui/login.rs b/voxygen/src/menu/main/ui/login.rs index 02d14be554..56ccc16ac8 100644 --- a/voxygen/src/menu/main/ui/login.rs +++ b/voxygen/src/menu/main/ui/login.rs @@ -67,35 +67,35 @@ impl Screen { let buttons = Column::with_children(vec![ neat_button( &mut self.servers_button, - i18n.get("common.servers"), + i18n.get_msg("common-servers"), FILL_FRAC_ONE, button_style, Some(Message::ShowServers), ), // neat_button( // &mut self.settings_button, - // i18n.get("common.settings"), + // i18n.get_msg("common-settings"), // FILL_FRAC_ONE, // button_style, // None, // ), neat_button( &mut self.language_select_button, - i18n.get("common.languages"), + i18n.get_msg("common-languages"), FILL_FRAC_ONE, button_style, Some(Message::OpenLanguageMenu), ), neat_button( &mut self.credits_button, - i18n.get("main.credits"), + i18n.get_msg("main-credits"), FILL_FRAC_ONE, button_style, Some(Message::ShowCredits), ), neat_button( &mut self.quit_button, - i18n.get("common.quit"), + i18n.get_msg("common-quit"), FILL_FRAC_ONE, button_style, Some(Message::Quit), @@ -110,7 +110,7 @@ impl Screen { .height(Length::Fill) .align_y(Align::End); - let intro_text = i18n.get("main.login_process"); + let intro_text = i18n.get_msg("main-login_process"); let info_window = BackgroundContainer::new( CompoundGraphic::from_graphics(vec![ @@ -139,7 +139,7 @@ impl Screen { Container::new(Text::new(error)).height(Length::Fill).into(), Container::new(neat_button( &mut self.error_okay_button, - i18n.get("common.okay"), + i18n.get_msg("common-okay"), FILL_FRAC_ONE, button_style, Some(Message::CloseError), @@ -238,7 +238,7 @@ impl LanguageSelectBanner { self.language_buttons = vec![Default::default(); language_metadatas.len()]; } - let title = Text::new(i18n.get("main.login.select_language")) + let title = Text::new(i18n.get_msg("main-login-select_language")) .size(fonts.cyri.scale(35)) .horizontal_alignment(iced::HorizontalAlignment::Center); @@ -290,7 +290,7 @@ impl LanguageSelectBanner { let okay_button = Container::new(neat_button( &mut self.okay_button, - i18n.get("common.okay"), + i18n.get_msg("common-okay"), FILL_FRAC_TWO, button_style, Some(Message::OpenLanguageMenu), @@ -363,7 +363,7 @@ impl LoginBanner { .fix_aspect_ratio(), TextInput::new( &mut self.username, - &i18n.get("main.username"), + &i18n.get_msg("main-username"), &login_info.username, Message::Username, ) @@ -378,7 +378,7 @@ impl LoginBanner { .fix_aspect_ratio(), TextInput::new( &mut self.password, - &i18n.get("main.password"), + &i18n.get_msg("main-password"), &login_info.password, Message::Password, ) @@ -394,7 +394,7 @@ impl LoginBanner { .fix_aspect_ratio(), TextInput::new( &mut self.server, - &i18n.get("main.server"), + &i18n.get_msg("main-server"), &login_info.server, Message::Server, ) @@ -410,7 +410,7 @@ impl LoginBanner { Column::with_children(vec![ neat_button( &mut self.multiplayer_button, - i18n.get("common.multiplayer"), + i18n.get_msg("common-multiplayer"), FILL_FRAC_TWO, button_style, Some(Message::Multiplayer), @@ -418,7 +418,7 @@ impl LoginBanner { #[cfg(feature = "singleplayer")] neat_button( &mut self.singleplayer_button, - i18n.get("common.singleplayer"), + i18n.get_msg("common-singleplayer"), FILL_FRAC_TWO, button_style, Some(Message::Singleplayer), diff --git a/voxygen/src/menu/main/ui/servers.rs b/voxygen/src/menu/main/ui/servers.rs index 0f35a18aaa..feeb55a829 100644 --- a/voxygen/src/menu/main/ui/servers.rs +++ b/voxygen/src/menu/main/ui/servers.rs @@ -34,7 +34,7 @@ impl Screen { i18n: &Localization, button_style: style::button::Style, ) -> Element { - let title = Text::new(i18n.get("main.servers.select_server")) + let title = Text::new(i18n.get_msg("main-servers-select_server")) .size(fonts.cyri.scale(35)) .width(Length::Fill) .horizontal_alignment(iced::HorizontalAlignment::Center); @@ -42,7 +42,7 @@ impl Screen { let back_button = Container::new( Container::new(neat_button( &mut self.back_button, - i18n.get("common.back"), + i18n.get_msg("common-back"), FILL_FRAC_ONE, button_style, Some(Message::Back), @@ -55,7 +55,7 @@ impl Screen { let delete_button = Container::new( Container::new(neat_button( &mut self.delete_button, - i18n.get("common.delete_server"), + i18n.get_msg("common-delete_server"), FILL_FRAC_ONE, button_style, Some(Message::DeleteServer), diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index c26ad32a1d..432d19db0a 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -258,9 +258,9 @@ impl SessionState { self.hud.clear_cursor(); let i18n = global_state.i18n.read(); let msg = match result { - TradeResult::Completed => i18n.get("hud.trade.result.completed"), - TradeResult::Declined => i18n.get("hud.trade.result.declined"), - TradeResult::NotEnoughSpace => i18n.get("hud.trade.result.nospace"), + TradeResult::Completed => i18n.get_msg("hud-trade-result-completed"), + TradeResult::Declined => i18n.get_msg("hud-trade-result-declined"), + TradeResult::NotEnoughSpace => i18n.get_msg("hud-trade-result-nospace"), }; self.hud.new_message(ChatType::Meta.chat_msg(msg)); }, @@ -327,7 +327,7 @@ impl SessionState { let i18n = global_state.i18n.read(); let message = match time { - 0 => String::from(i18n.get("hud.chat.goodbye")), + 0 => String::from(i18n.get_msg("hud-chat-goodbye")), _ => i18n .get_msg_ctx("hud-chat-connection_lost", &i18n::fluent_args! { "time" => time diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 5be0f77d18..7ffa996514 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -588,7 +588,7 @@ impl<'a> Widget for ItemTooltip<'a> { // Power widget::Text::new(&format!( "{} : {:.1}", - i18n.get("common.stats.power"), + i18n.get_msg("common-stats-power"), stats.power * 10.0 )) .x_align_to(state.ids.item_frame, conrod_core::position::Align::Start) @@ -613,7 +613,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:+.0}%", - i18n.get("common.stats.speed"), + i18n.get_msg("common-stats-speed"), (stats.speed - 1.0) * 100.0 ), 1, @@ -625,7 +625,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:+.0}%", - i18n.get("common.stats.poise"), + i18n.get_msg("common-stats-poise"), (stats.effect_power - 1.0) * 100.0 ), 2, @@ -635,7 +635,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:.1}%", - i18n.get("common.stats.crit_chance"), + i18n.get_msg("common-stats-crit_chance"), stats.crit_chance * 100.0 ), 3, @@ -645,7 +645,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:+.0}%", - i18n.get("common.stats.range"), + i18n.get_msg("common-stats-range"), (stats.range - 1.0) * 100.0 ), 4, @@ -655,7 +655,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:+.0}%", - i18n.get("common.stats.energy_efficiency"), + i18n.get_msg("common-stats-energy_efficiency"), (stats.energy_efficiency - 1.0) * 100.0 ), 5, @@ -665,7 +665,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:+.0}%", - i18n.get("common.stats.buff_strength"), + i18n.get_msg("common-stats-buff_strength"), (stats.buff_strength - 1.0) * 100.0 ), 6, @@ -786,7 +786,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {}", - i18n.get("common.stats.armor"), + i18n.get_msg("common-stats-armor"), util::protec2string( armor_stats.protection.unwrap_or(Protection::Normal(0.0)) ) @@ -801,7 +801,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {}", - i18n.get("common.stats.poise_res"), + i18n.get_msg("common-stats-poise_res"), util::protec2string( armor_stats .poise_resilience @@ -818,7 +818,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:.1}", - i18n.get("common.stats.energy_max"), + i18n.get_msg("common-stats-energy_max"), armor_stats.energy_max.unwrap_or(0.0) ), index, @@ -831,7 +831,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:.1}%", - i18n.get("common.stats.energy_reward"), + i18n.get_msg("common-stats-energy_reward"), armor_stats.energy_reward.map_or(0.0, |x| x * 100.0) ), index, @@ -844,7 +844,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:.3}", - i18n.get("common.stats.crit_power"), + i18n.get_msg("common-stats-crit_power"), armor_stats.crit_power.unwrap_or(0.0) ), index, @@ -857,7 +857,7 @@ impl<'a> Widget for ItemTooltip<'a> { stat_text( format!( "{} : {:.3}", - i18n.get("common.stats.stealth"), + i18n.get_msg("common-stats-stealth"), armor_stats.stealth.unwrap_or(0.0) ), index, @@ -868,7 +868,7 @@ impl<'a> Widget for ItemTooltip<'a> { // Slots if item.num_slots() > 0 { stat_text( - format!("{} : {}", i18n.get("common.stats.slots"), item.num_slots()), + format!("{} : {}", i18n.get_msg("common-stats-slots"), item.num_slots()), index, ); } @@ -1002,11 +1002,11 @@ impl<'a> Widget for ItemTooltip<'a> { let power_text = if is_primary { format!( "{} : {:.1}", - i18n.get("common.stats.power"), + i18n.get_msg("common-stats-power"), stats.power * 10.0 ) } else { - format!("{} : x{:.2}", i18n.get("common.stats.power"), stats.power) + format!("{} : x{:.2}", i18n.get_msg("common-stats-power"), stats.power) }; widget::Text::new(&power_text) .x_align_to(state.ids.item_frame, conrod_core::position::Align::Start) @@ -1021,11 +1021,11 @@ impl<'a> Widget for ItemTooltip<'a> { let speed_text = if is_primary { format!( "{} : {:+.0}%", - i18n.get("common.stats.speed"), + i18n.get_msg("common-stats-speed"), (stats.speed - 1.0) * 100.0 ) } else { - format!("{} : x{:.2}", i18n.get("common.stats.speed"), stats.speed) + format!("{} : x{:.2}", i18n.get_msg("common-stats-speed"), stats.speed) }; widget::Text::new(&speed_text) .graphics_for(id) @@ -1041,13 +1041,13 @@ impl<'a> Widget for ItemTooltip<'a> { let effect_power_text = if is_primary { format!( "{} : {:+.0}%", - i18n.get("common.stats.poise"), + i18n.get_msg("common-stats-poise"), (stats.effect_power - 1.0) * 100.0 ) } else { format!( "{} : x{:.2}", - i18n.get("common.stats.poise"), + i18n.get_msg("common-stats-poise"), stats.effect_power ) }; @@ -1063,13 +1063,13 @@ impl<'a> Widget for ItemTooltip<'a> { let crit_chance_text = if is_primary { format!( "{} : {:.1}%", - i18n.get("common.stats.crit_chance"), + i18n.get_msg("common-stats-crit_chance"), stats.crit_chance * 100.0 ) } else { format!( "{} : x{:.2}", - i18n.get("common.stats.crit_chance"), + i18n.get_msg("common-stats-crit_chance"), stats.crit_chance ) }; @@ -1085,11 +1085,11 @@ impl<'a> Widget for ItemTooltip<'a> { let range_text = if is_primary { format!( "{} : {:.0}%", - i18n.get("common.stats.range"), + i18n.get_msg("common-stats-range"), (stats.range - 1.0) * 100.0 ) } else { - format!("{} : x{:.2}", i18n.get("common.stats.range"), stats.range) + format!("{} : x{:.2}", i18n.get_msg("common-stats-range"), stats.range) }; widget::Text::new(&range_text) .graphics_for(id) @@ -1103,13 +1103,13 @@ impl<'a> Widget for ItemTooltip<'a> { let energy_eff_text = if is_primary { format!( "{} : {:.0}%", - i18n.get("common.stats.energy_efficiency"), + i18n.get_msg("common-stats-energy_efficiency"), (stats.energy_efficiency - 1.0) * 100.0 ) } else { format!( "{} : x{:.2}", - i18n.get("common.stats.energy_efficiency"), + i18n.get_msg("common-stats-energy_efficiency"), stats.energy_efficiency ) }; @@ -1125,13 +1125,13 @@ impl<'a> Widget for ItemTooltip<'a> { let buff_str_text = if is_primary { format!( "{} : {:.0}%", - i18n.get("common.stats.buff_strength"), + i18n.get_msg("common-stats-buff_strength"), (stats.buff_strength - 1.0) * 100.0 ) } else { format!( "{} : x{:.2}", - i18n.get("common.stats.buff_strength"), + i18n.get_msg("common-stats-buff_strength"), stats.buff_strength ) }; @@ -1203,8 +1203,8 @@ impl<'a> Widget for ItemTooltip<'a> { //Tooltips for trade mini-tutorial widget::Text::new(&format!( "{}\n{}", - i18n.get("hud.trade.tooltip_hint_1"), - i18n.get("hud.trade.tooltip_hint_2"), + i18n.get_msg("hud-trade-tooltip_hint_1"), + i18n.get_msg("hud-trade-tooltip_hint_2"), )) .x_align_to(state.ids.item_frame, conrod_core::position::Align::Start) .graphics_for(id) From 4a71698048633d3331a0bc692be7d8f3d1621a70 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 11:19:39 +0200 Subject: [PATCH 109/854] removed i18n.get --- voxygen/i18n/src/lib.rs | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 99a2c9d0b7..ad40e9b8fa 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -233,28 +233,6 @@ pub struct LocalizationGuard { } impl LocalizationGuard { - /// !!!DEPRECATED!!! - /// - /// Get a localized text from the given key - /// - /// First lookup is done in the active language, second in - /// the fallback (if present). - /// If the key is not present in the localization object - /// then the key itself is returned. - /// - /// # NOTE: - /// This function shouldn't be used in new code. - /// It is kept for compatibility with old code that uses - /// old style dot-separated keys and this function internally - /// replaces them with dashes. - // FIXME (i18n old style keys): - // this is deprecated, fix all usages of this asap - pub fn get(&self, key: &str) -> Cow { - // Fluent uses `-` as informal separator, while in the past with our - // RON based system we used `.` for that purpose. - self.get_msg(&key.replace('.', "-")) - } - /// Get a localized text from the given key /// /// First lookup is done in the active language, second in From cf093483068f96cb63955c6f683aa08bd59dbae9 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:14:29 +0200 Subject: [PATCH 110/854] second cleaning pass after removing i18n.get --- voxygen/src/hud/buffs.rs | 4 +- voxygen/src/hud/buttons.rs | 14 +-- voxygen/src/hud/chat.rs | 4 +- voxygen/src/hud/crafting.rs | 86 +++++++------- voxygen/src/hud/esc_menu.rs | 12 +- voxygen/src/hud/group.rs | 18 +-- voxygen/src/hud/mod.rs | 92 +++++++-------- voxygen/src/hud/overitem.rs | 6 +- voxygen/src/hud/settings_window/chat.rs | 44 +++---- voxygen/src/hud/settings_window/controls.rs | 8 +- voxygen/src/hud/settings_window/gameplay.rs | 32 ++--- voxygen/src/hud/settings_window/interface.rs | 68 +++++------ voxygen/src/hud/settings_window/language.rs | 2 +- voxygen/src/hud/settings_window/mod.rs | 36 +++--- voxygen/src/hud/settings_window/networking.rs | 10 +- voxygen/src/hud/settings_window/sound.rs | 14 +-- voxygen/src/hud/settings_window/video.rs | 110 +++++++++--------- voxygen/src/hud/skillbar.rs | 8 +- voxygen/src/hud/social.rs | 12 +- voxygen/src/hud/trade.rs | 20 ++-- voxygen/src/menu/char_selection/mod.rs | 4 +- voxygen/src/menu/main/mod.rs | 50 ++++---- voxygen/src/session/mod.rs | 4 +- voxygen/src/ui/widgets/item_tooltip.rs | 4 +- 24 files changed, 331 insertions(+), 331 deletions(-) diff --git a/voxygen/src/hud/buffs.rs b/voxygen/src/hud/buffs.rs index 4752d57fd3..0ae50468b7 100644 --- a/voxygen/src/hud/buffs.rs +++ b/voxygen/src/hud/buffs.rs @@ -230,7 +230,7 @@ impl<'a> Widget for BuffsBar<'a> { let title = hud::get_buff_title(buff.kind, localized_strings); let desc_txt = hud::get_buff_desc(buff.kind, buff.data, localized_strings); let remaining_time = hud::get_buff_time(*buff); - let click_to_remove = format!("<{}>", &localized_strings.get("buff.remove")); + let click_to_remove = format!("<{}>", &localized_strings.get_msg("buff-remove")); let desc = format!("{}\n\n{}\n\n{}", desc_txt, remaining_time, click_to_remove); // Timer overlay if Button::image(self.get_duration_image(duration_percentage)) @@ -388,7 +388,7 @@ impl<'a> Widget for BuffsBar<'a> { let title = hud::get_buff_title(buff.kind, localized_strings); let desc_txt = hud::get_buff_desc(buff.kind, buff.data, localized_strings); let remaining_time = hud::get_buff_time(*buff); - let click_to_remove = format!("<{}>", &localized_strings.get("buff.remove")); + let click_to_remove = format!("<{}>", &localized_strings.get_msg("buff-remove")); let desc = if buff.is_buff { format!("{}\n\n{}", desc_txt, click_to_remove) } else { diff --git a/voxygen/src/hud/buttons.rs b/voxygen/src/hud/buttons.rs index 2e14c09ba0..61ce7abc2d 100644 --- a/voxygen/src/hud/buttons.rs +++ b/voxygen/src/hud/buttons.rs @@ -231,7 +231,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.settings_press) .with_tooltip( self.tooltip_manager, - &localized_strings.get("common.settings"), + &localized_strings.get_msg("common-settings"), "", &button_tooltip, TEXT_COLOR, @@ -264,7 +264,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.social_press) .with_tooltip( self.tooltip_manager, - &localized_strings.get("hud.social"), + &localized_strings.get_msg("hud-social"), "", &button_tooltip, TEXT_COLOR, @@ -296,7 +296,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.map_press) .with_tooltip( self.tooltip_manager, - &localized_strings.get("hud.map.map_title"), + &localized_strings.get_msg("hud-map-map_title"), "", &button_tooltip, TEXT_COLOR, @@ -333,7 +333,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.spellbook_press) .with_tooltip( self.tooltip_manager, - &localized_strings.get("hud.diary"), + &localized_strings.get_msg("hud-diary"), "", &button_tooltip, TEXT_COLOR, @@ -366,14 +366,14 @@ impl<'a> Widget for Buttons<'a> { .mid_top_with_margin_on(state.ids.spellbook_button, -12.0 + arrow_ani as f64) .color(Some(QUALITY_LEGENDARY)) .set(state.ids.sp_arrow, ui); - Text::new(&localized_strings.get("hud.sp_arrow_txt")) + Text::new(&localized_strings.get_msg("hud-sp_arrow_txt")) .mid_top_with_margin_on(state.ids.sp_arrow, -18.0) .graphics_for(state.ids.spellbook_button) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) .color(BLACK) .set(state.ids.sp_arrow_txt_bg, ui); - Text::new(&localized_strings.get("hud.sp_arrow_txt")) + Text::new(&localized_strings.get_msg("hud-sp_arrow_txt")) .graphics_for(state.ids.spellbook_button) .bottom_right_with_margins_on(state.ids.sp_arrow_txt_bg, 1.0, 1.0) .font_id(self.fonts.cyri.conrod_id) @@ -389,7 +389,7 @@ impl<'a> Widget for Buttons<'a> { .press_image(self.imgs.crafting_icon_press) .with_tooltip( self.tooltip_manager, - &localized_strings.get("hud.crafting"), + &localized_strings.get_msg("hud-crafting"), "", &button_tooltip, TEXT_COLOR, diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index dbdffb21cb..6ec3d2c32b 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -552,7 +552,7 @@ impl<'a> Widget for Chat<'a> { .hover_image(self.imgs.selection_hover) .hover_image(self.imgs.selection_press) .image_color(shading) - .label(&self.localized_strings.get("hud.chat.all")) + .label(&self.localized_strings.get_msg("hud-chat-all")) .label_font_size(self.fonts.cyri.scale(14)) .label_font_id(self.fonts.cyri.conrod_id) .label_color(TEXT_COLOR.alpha(alpha)) @@ -613,7 +613,7 @@ impl<'a> Widget for Chat<'a> { Text::new( &self .localized_strings - .get("hud.chat.chat_tab_hover_tooltip"), + .get_msg("hud-chat-chat_tab_hover_tooltip"), ) .mid_top_with_margin_on(state.ids.chat_tab_tooltip_bg, 3.0) .font_size(self.fonts.cyri.scale(10)) diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index c8c91e01e7..6bf71316b4 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -213,17 +213,17 @@ pub enum CraftingTab { impl CraftingTab { fn name_key(self) -> &'static str { match self { - CraftingTab::All => "hud.crafting.tabs.all", - CraftingTab::Armor => "hud.crafting.tabs.armor", - CraftingTab::Food => "hud.crafting.tabs.food", - CraftingTab::Glider => "hud.crafting.tabs.glider", - CraftingTab::Potion => "hud.crafting.tabs.potion", - CraftingTab::Tool => "hud.crafting.tabs.tool", - CraftingTab::Utility => "hud.crafting.tabs.utility", - CraftingTab::Weapon => "hud.crafting.tabs.weapon", - CraftingTab::Bag => "hud.crafting.tabs.bag", - CraftingTab::ProcessedMaterial => "hud.crafting.tabs.processed_material", - CraftingTab::Dismantle => "hud.crafting.tabs.dismantle", + CraftingTab::All => "hud-crafting-tabs-all", + CraftingTab::Armor => "hud-crafting-tabs-armor", + CraftingTab::Food => "hud-crafting-tabs-food", + CraftingTab::Glider => "hud-crafting-tabs-glider", + CraftingTab::Potion => "hud-crafting-tabs-potion", + CraftingTab::Tool => "hud-crafting-tabs-tool", + CraftingTab::Utility => "hud-crafting-tabs-utility", + CraftingTab::Weapon => "hud-crafting-tabs-weapon", + CraftingTab::Bag => "hud-crafting-tabs-bag", + CraftingTab::ProcessedMaterial => "hud-crafting-tabs-processed_material", + CraftingTab::Dismantle => "hud-crafting-tabs-dismantle", } } @@ -391,7 +391,7 @@ impl<'a> Widget for Crafting<'a> { } // Title - Text::new(&self.localized_strings.get("hud.crafting")) + Text::new(&self.localized_strings.get_msg("hud-crafting")) .mid_top_with_margin_on(state.ids.window_frame, 9.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -467,7 +467,7 @@ impl<'a> Widget for Crafting<'a> { }) .with_tooltip( self.tooltip_manager, - &self.localized_strings.get(crafting_tab.name_key()), + &self.localized_strings.get_msg(crafting_tab.name_key()), "", &tabs_tooltip, TEXT_COLOR, @@ -961,25 +961,25 @@ impl<'a> Widget for Crafting<'a> { let (tooltip_title, tooltip_desc) = match recipe_kind { RecipeKind::ModularWeapon => ( self.localized_strings - .get("hud.crafting.mod_weap_prim_slot_title"), + .get_msg("hud-crafting-mod_weap_prim_slot_title"), self.localized_strings - .get("hud.crafting.mod_weap_prim_slot_desc"), + .get_msg("hud-crafting-mod_weap_prim_slot_desc"), ), RecipeKind::Component( ToolKind::Sword | ToolKind::Axe | ToolKind::Hammer, ) => ( self.localized_strings - .get("hud.crafting.mod_comp_metal_prim_slot_title"), + .get_msg("hud-crafting-mod_comp_metal_prim_slot_title"), self.localized_strings - .get("hud.crafting.mod_comp_metal_prim_slot_desc"), + .get_msg("hud-crafting-mod_comp_metal_prim_slot_desc"), ), RecipeKind::Component( ToolKind::Bow | ToolKind::Staff | ToolKind::Sceptre, ) => ( self.localized_strings - .get("hud.crafting.mod_comp_wood_prim_slot_title"), + .get_msg("hud-crafting-mod_comp_wood_prim_slot_title"), self.localized_strings - .get("hud.crafting.mod_comp_wood_prim_slot_desc"), + .get_msg("hud-crafting-mod_comp_wood_prim_slot_desc"), ), RecipeKind::Component(_) | RecipeKind::Simple => { (Cow::Borrowed(""), Cow::Borrowed("")) @@ -1050,15 +1050,15 @@ impl<'a> Widget for Crafting<'a> { let (tooltip_title, tooltip_desc) = match recipe_kind { RecipeKind::ModularWeapon => ( self.localized_strings - .get("hud.crafting.mod_weap_sec_slot_title"), + .get_msg("hud-crafting-mod_weap_sec_slot_title"), self.localized_strings - .get("hud.crafting.mod_weap_sec_slot_desc"), + .get_msg("hud-crafting-mod_weap_sec_slot_desc"), ), RecipeKind::Component(_) => ( self.localized_strings - .get("hud.crafting.mod_comp_sec_slot_title"), + .get_msg("hud-crafting-mod_comp_sec_slot_title"), self.localized_strings - .get("hud.crafting.mod_comp_sec_slot_desc"), + .get_msg("hud-crafting-mod_comp_sec_slot_desc"), ), RecipeKind::Simple => (Cow::Borrowed(""), Cow::Borrowed("")), }; @@ -1221,7 +1221,7 @@ impl<'a> Widget for Crafting<'a> { == recipe.craft_sprite, ) } else { - Text::new(&self.localized_strings.get("hud.crafting.modular_desc")) + Text::new(&self.localized_strings.get_msg("hud-crafting-modular_desc")) .mid_top_with_margin_on(state.ids.modular_art, -18.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(13)) @@ -1316,7 +1316,7 @@ impl<'a> Widget for Crafting<'a> { }; icon.with_tooltip( self.tooltip_manager, - &self.localized_strings.get(crafting_tab.name_key()), + &self.localized_strings.get_msg(crafting_tab.name_key()), "", &tabs_tooltip, TEXT_COLOR, @@ -1353,7 +1353,7 @@ impl<'a> Widget for Crafting<'a> { .then_some(self.imgs.button_press) .unwrap_or(self.imgs.button), ) - .label(&self.localized_strings.get("hud.crafting.craft")) + .label(&self.localized_strings.get_msg("hud-crafting-craft")) .label_y(conrod_core::position::Relative::Scalar(1.0)) .label_color(can_perform.then_some(TEXT_COLOR).unwrap_or(TEXT_GRAY_COLOR)) .label_font_size(self.fonts.cyri.scale(12)) @@ -1406,7 +1406,7 @@ impl<'a> Widget for Crafting<'a> { .then_some(self.imgs.button_press) .unwrap_or(self.imgs.button), ) - .label(&self.localized_strings.get("hud.crafting.craft_all")) + .label(&self.localized_strings.get_msg("hud-crafting-craft_all")) .label_y(conrod_core::position::Relative::Scalar(1.0)) .label_color( can_perform_all @@ -1446,7 +1446,7 @@ impl<'a> Widget for Crafting<'a> { Text::new( &self .localized_strings - .get("hud.crafting.req_crafting_station"), + .get_msg("hud-crafting-req_crafting_station"), ) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(18)) @@ -1485,18 +1485,18 @@ impl<'a> Widget for Crafting<'a> { .set(state.ids.req_station_img, ui); let station_name = match recipe.craft_sprite { - Some(SpriteKind::Anvil) => "hud.crafting.anvil", - Some(SpriteKind::Cauldron) => "hud.crafting.cauldron", - Some(SpriteKind::CookingPot) => "hud.crafting.cooking_pot", - Some(SpriteKind::CraftingBench) => "hud.crafting.crafting_bench", - Some(SpriteKind::Forge) => "hud.crafting.forge", - Some(SpriteKind::Loom) => "hud.crafting.loom", - Some(SpriteKind::SpinningWheel) => "hud.crafting.spinning_wheel", - Some(SpriteKind::TanningRack) => "hud.crafting.tanning_rack", - Some(SpriteKind::DismantlingBench) => "hud.crafting.salvaging_station", + Some(SpriteKind::Anvil) => "hud-crafting-anvil", + Some(SpriteKind::Cauldron) => "hud-crafting-cauldron", + Some(SpriteKind::CookingPot) => "hud.crafting-cooking_pot", + Some(SpriteKind::CraftingBench) => "hud-crafting-crafting_bench", + Some(SpriteKind::Forge) => "hud-crafting-forge", + Some(SpriteKind::Loom) => "hud-crafting-loom", + Some(SpriteKind::SpinningWheel) => "hud-crafting-spinning_wheel", + Some(SpriteKind::TanningRack) => "hud-crafting-tanning_rack", + Some(SpriteKind::DismantlingBench) => "hud-crafting-salvaging_station", _ => "", }; - Text::new(&self.localized_strings.get(station_name)) + Text::new(&self.localized_strings.get_msg(station_name)) .right_from(state.ids.req_station_img, 10.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) @@ -1558,7 +1558,7 @@ impl<'a> Widget for Crafting<'a> { let num_ingredients = ingredients.len(); if num_ingredients > 0 { - Text::new(&self.localized_strings.get("hud.crafting.ingredients")) + Text::new(&self.localized_strings.get_msg("hud-crafting-ingredients")) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(18)) .color(TEXT_COLOR) @@ -1754,7 +1754,7 @@ impl<'a> Widget for Crafting<'a> { } else { state.ids.ingredient_frame[i - 1] }; - Text::new(&self.localized_strings.get("hud.crafting.tool_cata")) + Text::new(&self.localized_strings.get_msg("hud-crafting-tool_cata")) .down_from(ref_widget, 20.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) @@ -1804,7 +1804,7 @@ impl<'a> Widget for Crafting<'a> { } } else if *sel_crafting_tab == CraftingTab::Dismantle { // Title - Text::new(&self.localized_strings.get("hud.crafting.dismantle_title")) + Text::new(&self.localized_strings.get_msg("hud-crafting-dismantle_title")) .mid_top_with_margin_on(state.ids.align_ing, 0.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(24)) @@ -1830,7 +1830,7 @@ impl<'a> Widget for Crafting<'a> { Text::new( &self .localized_strings - .get("hud.crafting.dismantle_explanation"), + .get_msg("hud-crafting-dismantle_explanation"), ) .mid_bottom_with_margin_on(state.ids.dismantle_img, -60.0) .font_id(self.fonts.cyri.conrod_id) @@ -1871,7 +1871,7 @@ impl<'a> Widget for Crafting<'a> { events.push(Event::SearchRecipe(Some(string))); } } else { - Text::new(&self.localized_strings.get("hud.crafting.recipes")) + Text::new(&self.localized_strings.get_msg("hud-crafting-recipes")) .mid_top_with_margin_on(state.ids.align_rec, -22.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/hud/esc_menu.rs b/voxygen/src/hud/esc_menu.rs index a72b432c83..cbb7cfca03 100644 --- a/voxygen/src/hud/esc_menu.rs +++ b/voxygen/src/hud/esc_menu.rs @@ -87,7 +87,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("common.resume")) + .label(&self.localized_strings.get_msg("common-resume")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -104,7 +104,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("common.settings")) + .label(&self.localized_strings.get_msg("common-settings")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -120,7 +120,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("common.controls")) + .label(&self.localized_strings.get_msg("common-controls")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -136,7 +136,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("common.characters")) + .label(&self.localized_strings.get_msg("common-characters")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -152,7 +152,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("esc_menu.logout")) + .label(&self.localized_strings.get_msg("esc_menu-logout")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) @@ -168,7 +168,7 @@ impl<'a> Widget for EscMenu<'a> { .w_h(210.0, 50.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("esc_menu.quit_game")) + .label(&self.localized_strings.get_msg("esc_menu-quit_game")) .label_y(conrod_core::position::Relative::Scalar(3.0)) .label_color(TEXT_COLOR) .label_font_size(self.fonts.cyri.scale(20)) diff --git a/voxygen/src/hud/group.rs b/voxygen/src/hud/group.rs index 51371d6327..b5e041b8b5 100644 --- a/voxygen/src/hud/group.rs +++ b/voxygen/src/hud/group.rs @@ -428,7 +428,7 @@ impl<'a> Widget for Group<'a> { } if health.is_dead { // Death Text - Text::new(&self.localized_strings.get("hud.group.dead")) + Text::new(&self.localized_strings.get_msg("hud-group-dead")) .mid_top_with_margin_on(state.ids.member_panels_bg[i], 1.0) .font_size(20) .font_id(self.fonts.cyri.conrod_id) @@ -611,7 +611,7 @@ impl<'a> Widget for Group<'a> { .color(Some(UI_HIGHLIGHT_0)) .set(state.ids.member_panels_frame[i], ui); // Panel Text - Text::new(&self.localized_strings.get("hud.group.out_of_range")) + Text::new(&self.localized_strings.get_msg("hud-group-out_of_range")) .mid_top_with_margin_on(state.ids.member_panels_bg[i], 3.0) .font_size(16) .font_id(self.fonts.cyri.conrod_id) @@ -630,7 +630,7 @@ impl<'a> Widget for Group<'a> { .press_image(self.imgs.button) .label_color(TEXT_COLOR_GREY) .image_color(TEXT_COLOR_GREY) - .label(&self.localized_strings.get("hud.group.add_friend")) + .label(&self.localized_strings.get_msg("hud-group-add_friend")) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(10)) .set(state.ids.btn_friend, ui) @@ -641,7 +641,7 @@ impl<'a> Widget for Group<'a> { .bottom_right_with_margins_on(state.ids.bg, 5.0, 5.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("hud.group.leave")) + .label(&self.localized_strings.get_msg("hud-group-leave")) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) .label_font_size(self.fonts.cyri.scale(10)) @@ -659,7 +659,7 @@ impl<'a> Widget for Group<'a> { .mid_bottom_with_margin_on(state.ids.btn_friend, -27.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("hud.group.assign_leader")) + .label(&self.localized_strings.get_msg("hud-group-assign_leader")) .label_color(if state.selected_member.is_some() { TEXT_COLOR } else { @@ -682,7 +682,7 @@ impl<'a> Widget for Group<'a> { .mid_bottom_with_margin_on(state.ids.btn_leader, -27.0) .hover_image(self.imgs.button) .press_image(self.imgs.button) - .label(&self.localized_strings.get("hud.group.link_group")) + .label(&self.localized_strings.get_msg("hud-group-link_group")) .hover_image(self.imgs.button) .press_image(self.imgs.button) .label_color(TEXT_COLOR_GREY) @@ -698,7 +698,7 @@ impl<'a> Widget for Group<'a> { .down_from(state.ids.btn_link, 5.0) .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) - .label(&self.localized_strings.get("hud.group.kick")) + .label(&self.localized_strings.get_msg("hud-group-kick")) .label_color(if state.selected_member.is_some() { TEXT_COLOR } else { @@ -826,7 +826,7 @@ impl<'a> Widget for Group<'a> { .label(&format!( "[{}] {}", &accept_key, - self.localized_strings.get("common.accept") + self.localized_strings.get_msg("common-accept") )) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -851,7 +851,7 @@ impl<'a> Widget for Group<'a> { .label(&format!( "[{}] {}", &decline_key, - self.localized_strings.get("common.decline") + self.localized_strings.get_msg("common-decline") )) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 73891d196b..8ca0832907 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -4584,69 +4584,69 @@ pub fn get_buff_image(buff: BuffKind, imgs: &Imgs) -> conrod_core::image::Id { pub fn get_buff_title(buff: BuffKind, localized_strings: &Localization) -> Cow { match buff { // Buffs - BuffKind::Regeneration { .. } => localized_strings.get("buff.title.heal"), - BuffKind::Saturation { .. } => localized_strings.get("buff.title.saturation"), - BuffKind::Potion { .. } => localized_strings.get("buff.title.potion"), - BuffKind::CampfireHeal { .. } => localized_strings.get("buff.title.campfire_heal"), - BuffKind::IncreaseMaxHealth { .. } => localized_strings.get("buff.title.IncreaseMaxHealth"), - BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get("buff.title.energyup"), - BuffKind::Invulnerability => localized_strings.get("buff.title.invulnerability"), - BuffKind::ProtectingWard => localized_strings.get("buff.title.protectingward"), - BuffKind::Frenzied => localized_strings.get("buff.title.frenzied"), - BuffKind::Hastened => localized_strings.get("buff.title.hastened"), + BuffKind::Regeneration { .. } => localized_strings.get_msg("buff-title-heal"), + BuffKind::Saturation { .. } => localized_strings.get_msg("buff-title-saturation"), + BuffKind::Potion { .. } => localized_strings.get_msg("buff-title-potion"), + BuffKind::CampfireHeal { .. } => localized_strings.get_msg("buff-title-campfire_heal"), + BuffKind::IncreaseMaxHealth { .. } => localized_strings.get_msg("buff-title-IncreaseMaxHealth"), + BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get_msg("buff-title-energyup"), + BuffKind::Invulnerability => localized_strings.get_msg("buff-title-invulnerability"), + BuffKind::ProtectingWard => localized_strings.get_msg("buff-title-protectingward"), + BuffKind::Frenzied => localized_strings.get_msg("buff-title-frenzied"), + BuffKind::Hastened => localized_strings.get_msg("buff-title-hastened"), // Debuffs - BuffKind::Bleeding { .. } => localized_strings.get("buff.title.bleed"), - BuffKind::Cursed { .. } => localized_strings.get("buff.title.cursed"), - BuffKind::Burning { .. } => localized_strings.get("buff.title.burn"), - BuffKind::Crippled { .. } => localized_strings.get("buff.title.crippled"), - BuffKind::Frozen { .. } => localized_strings.get("buff.title.frozen"), - BuffKind::Wet { .. } => localized_strings.get("buff.title.wet"), - BuffKind::Ensnared { .. } => localized_strings.get("buff.title.ensnared"), - BuffKind::Poisoned { .. } => localized_strings.get("buff.title.poisoned"), + BuffKind::Bleeding { .. } => localized_strings.get_msg("buff-title-bleed"), + BuffKind::Cursed { .. } => localized_strings.get_msg("buff-title-cursed"), + BuffKind::Burning { .. } => localized_strings.get_msg("buff-title-burn"), + BuffKind::Crippled { .. } => localized_strings.get_msg("buff-title-crippled"), + BuffKind::Frozen { .. } => localized_strings.get_msg("buff-title-frozen"), + BuffKind::Wet { .. } => localized_strings.get_msg("buff-title-wet"), + BuffKind::Ensnared { .. } => localized_strings.get_msg("buff-title-ensnared"), + BuffKind::Poisoned { .. } => localized_strings.get_msg("buff-title-poisoned"), } } pub fn get_buff_desc(buff: BuffKind, data: BuffData, localized_strings: &Localization) -> Cow { match buff { // Buffs - BuffKind::Regeneration { .. } => localized_strings.get("buff.desc.heal"), - BuffKind::Saturation { .. } => localized_strings.get("buff.desc.saturation"), - BuffKind::Potion { .. } => localized_strings.get("buff.desc.potion"), + BuffKind::Regeneration { .. } => localized_strings.get_msg("buff-desc-heal"), + BuffKind::Saturation { .. } => localized_strings.get_msg("buff-desc-saturation"), + BuffKind::Potion { .. } => localized_strings.get_msg("buff-desc-potion"), BuffKind::CampfireHeal { .. } => { localized_strings.get_msg_ctx("buff-desc-campfire_heal", &i18n::fluent_args! { "rate" => data.strength * 100.0 }) }, - BuffKind::IncreaseMaxHealth { .. } => localized_strings.get("buff.desc.IncreaseMaxHealth"), - BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get("buff.desc.IncreaseMaxEnergy"), - BuffKind::Invulnerability => localized_strings.get("buff.desc.invulnerability"), - BuffKind::ProtectingWard => localized_strings.get("buff.desc.protectingward"), - BuffKind::Frenzied => localized_strings.get("buff.desc.frenzied"), - BuffKind::Hastened => localized_strings.get("buff.desc.hastened"), + BuffKind::IncreaseMaxHealth { .. } => localized_strings.get_msg("buff-desc-IncreaseMaxHealth"), + BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get_msg("buff-desc-IncreaseMaxEnergy"), + BuffKind::Invulnerability => localized_strings.get_msg("buff-desc-invulnerability"), + BuffKind::ProtectingWard => localized_strings.get_msg("buff-desc-protectingward"), + BuffKind::Frenzied => localized_strings.get_msg("buff-desc-frenzied"), + BuffKind::Hastened => localized_strings.get_msg("buff-desc-hastened"), // Debuffs - BuffKind::Bleeding { .. } => localized_strings.get("buff.desc.bleed"), - BuffKind::Cursed { .. } => localized_strings.get("buff.desc.cursed"), - BuffKind::Burning { .. } => localized_strings.get("buff.desc.burn"), - BuffKind::Crippled { .. } => localized_strings.get("buff.desc.crippled"), - BuffKind::Frozen { .. } => localized_strings.get("buff.desc.frozen"), - BuffKind::Wet { .. } => localized_strings.get("buff.desc.wet"), - BuffKind::Ensnared { .. } => localized_strings.get("buff.desc.ensnared"), - BuffKind::Poisoned { .. } => localized_strings.get("buff.desc.poisoned"), + BuffKind::Bleeding { .. } => localized_strings.get_msg("buff-desc-bleed"), + BuffKind::Cursed { .. } => localized_strings.get_msg("buff-desc-cursed"), + BuffKind::Burning { .. } => localized_strings.get_msg("buff-desc-burn"), + BuffKind::Crippled { .. } => localized_strings.get_msg("buff-desc-crippled"), + BuffKind::Frozen { .. } => localized_strings.get_msg("buff-desc-frozen"), + BuffKind::Wet { .. } => localized_strings.get_msg("buff-desc-wet"), + BuffKind::Ensnared { .. } => localized_strings.get_msg("buff-desc-ensnared"), + BuffKind::Poisoned { .. } => localized_strings.get_msg("buff-desc-poisoned"), } } pub fn get_sprite_desc(sprite: SpriteKind, localized_strings: &Localization) -> Option> { let i18n_key = match sprite { SpriteKind::Empty => return None, - SpriteKind::Anvil => "hud.crafting.anvil", - SpriteKind::Cauldron => "hud.crafting.cauldron", - SpriteKind::CookingPot => "hud.crafting.cooking_pot", - SpriteKind::CraftingBench => "hud.crafting.crafting_bench", - SpriteKind::Forge => "hud.crafting.forge", - SpriteKind::Loom => "hud.crafting.loom", - SpriteKind::SpinningWheel => "hud.crafting.spinning_wheel", - SpriteKind::TanningRack => "hud.crafting.tanning_rack", - SpriteKind::DismantlingBench => "hud.crafting.salvaging_station", + SpriteKind::Anvil => "hud-crafting-anvil", + SpriteKind::Cauldron => "hud-crafting-cauldron", + SpriteKind::CookingPot => "hud-crafting-cooking_pot", + SpriteKind::CraftingBench => "hud-crafting-crafting_bench", + SpriteKind::Forge => "hud-crafting-forge", + SpriteKind::Loom => "hud-crafting-loom", + SpriteKind::SpinningWheel => "hud-crafting-spinning_wheel", + SpriteKind::TanningRack => "hud-crafting-tanning_rack", + SpriteKind::DismantlingBench => "hud-crafting-salvaging_station", SpriteKind::ChestBuried | SpriteKind::Chest | SpriteKind::DungeonChest0 @@ -4654,10 +4654,10 @@ pub fn get_sprite_desc(sprite: SpriteKind, localized_strings: &Localization) -> | SpriteKind::DungeonChest2 | SpriteKind::DungeonChest3 | SpriteKind::DungeonChest4 - | SpriteKind::DungeonChest5 => "common.sprite.chest", + | SpriteKind::DungeonChest5 => "common-sprite-chest", sprite => return Some(Cow::Owned(format!("{:?}", sprite))), }; - Some(localized_strings.get(i18n_key)) + Some(localized_strings.get_msg(i18n_key)) } pub fn get_buff_time(buff: BuffInfo) -> String { diff --git a/voxygen/src/hud/overitem.rs b/voxygen/src/hud/overitem.rs index 25f0463a1d..00112ab29b 100644 --- a/voxygen/src/hud/overitem.rs +++ b/voxygen/src/hud/overitem.rs @@ -230,13 +230,13 @@ impl<'a> Widget for Overitem<'a> { let text = match collect_failed_data.reason { HudCollectFailedReason::InventoryFull => { - self.localized_strings.get("hud.inventory_full") + self.localized_strings.get_msg("hud-inventory_full") }, HudCollectFailedReason::LootOwned { owner, expiry_secs } => { let owner_name = match owner { HudLootOwner::Name(name) => Cow::Owned(name), - HudLootOwner::Group => self.localized_strings.get("hud.another_group"), - HudLootOwner::Unknown => self.localized_strings.get("hud.someone_else"), + HudLootOwner::Group => self.localized_strings.get_msg("hud-another_group"), + HudLootOwner::Unknown => self.localized_strings.get_msg("hud-someone_else"), }; self.localized_strings.get_msg_ctx( "hud-owned_by_for_secs", diff --git a/voxygen/src/hud/settings_window/chat.rs b/voxygen/src/hud/settings_window/chat.rs index f03d8c3b69..d57143d6e9 100644 --- a/voxygen/src/hud/settings_window/chat.rs +++ b/voxygen/src/hud/settings_window/chat.rs @@ -141,7 +141,7 @@ impl<'a> Widget for Chat<'a> { .set(state.ids.window_r, ui); // General Title - Text::new(&self.localized_strings.get("hud.settings.general")) + Text::new(&self.localized_strings.get_msg("hud-settings-general")) .top_left_with_margins_on(state.ids.window, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -152,7 +152,7 @@ impl<'a> Widget for Chat<'a> { Text::new( &self .localized_strings - .get("hud.settings.background_opacity"), + .get_msg("hud-settings-background_opacity"), ) .down_from(state.ids.general_txt, 20.0) .font_size(self.fonts.cyri.scale(14)) @@ -188,7 +188,7 @@ impl<'a> Widget for Chat<'a> { Text::new( &self .localized_strings - .get("hud.settings.chat_character_name"), + .get_msg("hud-settings-chat_character_name"), ) .down_from(state.ids.transp_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -219,7 +219,7 @@ impl<'a> Widget for Chat<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.char_name_text, 20.0) - .label(&self.localized_strings.get("hud.settings.reset_chat")) + .label(&self.localized_strings.get_msg("hud-settings-reset_chat")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -231,7 +231,7 @@ impl<'a> Widget for Chat<'a> { } // Tabs Title - Text::new(&self.localized_strings.get("hud.settings.chat_tabs")) + Text::new(&self.localized_strings.get_msg("hud-settings-chat_tabs")) .top_left_with_margins_on(state.ids.window_r, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -335,7 +335,7 @@ impl<'a> Widget for Chat<'a> { { let mut updated_chat_tab = chat_tab.clone(); - Text::new(&self.localized_strings.get("hud.settings.label")) + Text::new(&self.localized_strings.get_msg("hud-settings-label")) .top_left_with_margins_on(state.ids.tab_content_align, 5.0, 25.0) .font_size(self.fonts.cyri.scale(16)) .font_id(self.fonts.cyri.conrod_id) @@ -363,7 +363,7 @@ impl<'a> Widget for Chat<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .w_h(100.0, 30.0) - .label(&self.localized_strings.get("hud.settings.delete")) + .label(&self.localized_strings.get_msg("hud-settings-delete")) .label_font_size(self.fonts.cyri.scale(14)) .label_font_id(self.fonts.cyri.conrod_id) .label_color(TEXT_COLOR) @@ -418,7 +418,7 @@ impl<'a> Widget for Chat<'a> { }; //Messages - Text::new(&self.localized_strings.get("hud.settings.messages")) + Text::new(&self.localized_strings.get_msg("hud-settings-messages")) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(16)) .color(TEXT_COLOR) @@ -441,7 +441,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_all = !chat_tab.filter.message_all; }; - Text::new(&self.localized_strings.get("hud.settings.show_all")) + Text::new(&self.localized_strings.get_msg("hud-settings-show_all")) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(16)) .color(TEXT_COLOR) @@ -458,7 +458,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_group = !chat_tab.filter.message_group; } - let group_text = self.localized_strings.get("hud.settings.group"); + let group_text = self.localized_strings.get_msg("hud-settings-group"); create_toggle_text(&group_text, !chat_tab.filter.message_all) .right_from(state.ids.btn_messages_group, 5.0) .set(state.ids.text_messages_group, ui); @@ -480,7 +480,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_faction = !chat_tab.filter.message_faction; } - let faction_text = self.localized_strings.get("hud.settings.faction"); + let faction_text = self.localized_strings.get_msg("hud-settings-faction"); create_toggle_text(&faction_text, !chat_tab.filter.message_all) .right_from(state.ids.btn_messages_faction, 5.0) .set(state.ids.text_messages_faction, ui); @@ -499,7 +499,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_world = !chat_tab.filter.message_world; } - let world_text = self.localized_strings.get("hud.settings.world"); + let world_text = self.localized_strings.get_msg("hud-settings-world"); create_toggle_text(&world_text, !chat_tab.filter.message_all) .right_from(state.ids.btn_messages_world, 5.0) .set(state.ids.text_messages_world, ui); @@ -518,7 +518,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_region = !chat_tab.filter.message_region; } - let region_text = self.localized_strings.get("hud.settings.region"); + let region_text = self.localized_strings.get_msg("hud-settings-region"); create_toggle_text(®ion_text, !chat_tab.filter.message_all) .right_from(state.ids.btn_messages_region, 5.0) .set(state.ids.text_messages_region, ui); @@ -537,7 +537,7 @@ impl<'a> Widget for Chat<'a> { updated_chat_tab.filter.message_say = !chat_tab.filter.message_say; } - let say_text = self.localized_strings.get("hud.settings.say"); + let say_text = self.localized_strings.get_msg("hud-settings-say"); create_toggle_text(&say_text, !chat_tab.filter.message_all) .right_from(state.ids.btn_messages_say, 5.0) .set(state.ids.text_messages_say, ui); @@ -547,7 +547,7 @@ impl<'a> Widget for Chat<'a> { .set(state.ids.icon_messages_say, ui); //Activity - Text::new(&self.localized_strings.get("hud.settings.activity")) + Text::new(&self.localized_strings.get_msg("hud-settings-activity")) .top_left_with_margins_on(state.ids.tab_content_align_r, 0.0, 5.0) .align_middle_y_of(state.ids.text_messages) .font_size(self.fonts.cyri.scale(16)) @@ -557,9 +557,9 @@ impl<'a> Widget for Chat<'a> { if let Some(clicked) = DropDownList::new( &[ - &self.localized_strings.get("hud.settings.none"), - &self.localized_strings.get("hud.settings.all"), - &self.localized_strings.get("hud.settings.group_only"), + &self.localized_strings.get_msg("hud-settings-none"), + &self.localized_strings.get_msg("hud-settings-all"), + &self.localized_strings.get_msg("hud-settings-group_only"), ], Some(if chat_tab.filter.activity_all { //all @@ -598,7 +598,7 @@ impl<'a> Widget for Chat<'a> { } //Death - Text::new(&self.localized_strings.get("hud.settings.death")) + Text::new(&self.localized_strings.get_msg("hud-settings-death")) .down_from(state.ids.list_activity, 20.0) .font_size(self.fonts.cyri.scale(16)) .font_id(self.fonts.cyri.conrod_id) @@ -607,9 +607,9 @@ impl<'a> Widget for Chat<'a> { if let Some(clicked) = DropDownList::new( &[ - &self.localized_strings.get("hud.settings.none"), - &self.localized_strings.get("hud.settings.all"), - &self.localized_strings.get("hud.settings.group_only"), + &self.localized_strings.get_msg("hud-settings-none"), + &self.localized_strings.get_msg("hud-settings-all"), + &self.localized_strings.get_msg("hud-settings-group_only"), ], Some(if chat_tab.filter.death_all { //all diff --git a/voxygen/src/hud/settings_window/controls.rs b/voxygen/src/hud/settings_window/controls.rs index a9113c59c5..2800f6c2bc 100644 --- a/voxygen/src/hud/settings_window/controls.rs +++ b/voxygen/src/hud/settings_window/controls.rs @@ -125,7 +125,7 @@ impl<'a> Widget for Controls<'a> { if self.global_state.window.remapping_keybindings == Some(game_input) { ( self.localized_strings - .get("hud.settings.awaitingkey") + .get_msg("hud-settings-awaitingkey") .into_owned(), TEXT_COLOR, ) @@ -146,14 +146,14 @@ impl<'a> Widget for Controls<'a> { } else { ( self.localized_strings - .get("hud.settings.unbound") + .get_msg("hud-settings-unbound") .into_owned(), ERROR_COLOR, ) }; let loc_key = self .localized_strings - .get(game_input.get_localization_key()); + .get_msg(game_input.get_localization_key()); let text_widget = Text::new(&loc_key) .color(TEXT_COLOR) .font_id(self.fonts.cyri.conrod_id) @@ -196,7 +196,7 @@ impl<'a> Widget for Controls<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(prev_id, 20.0) - .label(&self.localized_strings.get("hud.settings.reset_keybinds")) + .label(&self.localized_strings.get_msg("hud-settings-reset_keybinds")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/gameplay.rs b/voxygen/src/hud/settings_window/gameplay.rs index dbffc915cb..0bbf6ca2fb 100644 --- a/voxygen/src/hud/settings_window/gameplay.rs +++ b/voxygen/src/hud/settings_window/gameplay.rs @@ -122,7 +122,7 @@ impl<'a> Widget for Gameplay<'a> { let display_clamp = self.global_state.settings.gameplay.camera_clamp_angle; // Mouse Pan Sensitivity - Text::new(&self.localized_strings.get("hud.settings.pan_sensitivity")) + Text::new(&self.localized_strings.get_msg("hud-setting-pan_sensitivity")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -154,7 +154,7 @@ impl<'a> Widget for Gameplay<'a> { .set(state.ids.mouse_pan_value, ui); // Mouse Zoom Sensitivity - Text::new(&self.localized_strings.get("hud.settings.zoom_sensitivity")) + Text::new(&self.localized_strings.get_msg("hud-settings-zoom_sensitivity")) .down_from(state.ids.mouse_pan_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -189,7 +189,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.camera_clamp_angle"), + .get_msg("hud-settings-camera_clamp_angle"), ) .down_from(state.ids.mouse_zoom_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -242,7 +242,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.invert_scroll_zoom"), + .get_msg("hud-settings-invert_scroll_zoom"), ) .right_from(state.ids.mouse_zoom_invert_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -272,7 +272,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.invert_mouse_y_axis"), + .get_msg("hud-settings-invert_mouse_y_axis"), ) .right_from(state.ids.mouse_y_invert_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -302,7 +302,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.invert_controller_y_axis"), + .get_msg("hud-settings-invert_controller_y_axis"), ) .right_from(state.ids.controller_y_invert_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -332,7 +332,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.enable_mouse_smoothing"), + .get_msg("hud-settings-enable_mouse_smoothing"), ) .right_from(state.ids.smooth_pan_toggle_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -345,7 +345,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.free_look_behavior"), + .get_msg("hud-settings-free_look_behavior"), ) .down_from(state.ids.mouse_zoom_invert_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -355,9 +355,9 @@ impl<'a> Widget for Gameplay<'a> { let mode_label_list = [ self.localized_strings - .get("hud.settings.press_behavior.toggle"), + .get_msg("hud-settings-press_behavior-toggle"), self.localized_strings - .get("hud.settings.press_behavior.hold"), + .get_msg("hud-settings-press_behavior-hold"), ]; // Get which free look behavior is currently active @@ -382,7 +382,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.auto_walk_behavior"), + .get_msg("hud-settings-auto_walk_behavior"), ) .down_from(state.ids.mouse_zoom_invert_button, 10.0) .right_from(state.ids.free_look_behavior_text, 150.0) @@ -412,7 +412,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.camera_clamp_behavior"), + .get_msg("hud-settings-camera_clamp_behavior"), ) .down_from(state.ids.free_look_behavior_list, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -461,7 +461,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get("hud.settings.stop_auto_walk_on_input"), + .get_msg("hud-settings-stop_auto_walk_on_input"), ) .right_from(state.ids.stop_auto_walk_on_input_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -488,7 +488,7 @@ impl<'a> Widget for Gameplay<'a> { )); } - Text::new(&self.localized_strings.get("hud.settings.auto_camera")) + Text::new(&self.localized_strings.get_msg("hud-settings-auto_camera")) .right_from(state.ids.auto_camera_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -512,7 +512,7 @@ impl<'a> Widget for Gameplay<'a> { events.push(ChangeBowZoom(!self.global_state.settings.gameplay.bow_zoom)); } - Text::new(&self.localized_strings.get("hud.settings.bow_zoom")) + Text::new(&self.localized_strings.get_msg("hud-settings-bow_zoom")) .right_from(state.ids.bow_zoom_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -526,7 +526,7 @@ impl<'a> Widget for Gameplay<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.camera_clamp_behavior_list, 12.0) - .label(&self.localized_strings.get("hud.settings.reset_gameplay")) + .label(&self.localized_strings.get_msg("hud-settings-reset_gameplay")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/interface.rs b/voxygen/src/hud/settings_window/interface.rs index 2b74a5d42c..a8a3b2f958 100644 --- a/voxygen/src/hud/settings_window/interface.rs +++ b/voxygen/src/hud/settings_window/interface.rs @@ -174,7 +174,7 @@ impl<'a> Widget for Interface<'a> { let crosshair_type = self.global_state.settings.interface.crosshair_type; let ui_scale = self.global_state.settings.interface.ui_scale; - Text::new(&self.localized_strings.get("hud.settings.general")) + Text::new(&self.localized_strings.get_msg("hud-settings-general")) .top_left_with_margins_on(state.ids.window, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -197,7 +197,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHelp(show_help)); } - Text::new(&self.localized_strings.get("hud.settings.help_window")) + Text::new(&self.localized_strings.get_msg("hud-settings-help_window")) .right_from(state.ids.button_help, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -223,7 +223,7 @@ impl<'a> Widget for Interface<'a> { )); } - Text::new(&self.localized_strings.get("hud.settings.loading_tips")) + Text::new(&self.localized_strings.get_msg("hud-settings-loading_tips")) .right_from(state.ids.load_tips_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -247,7 +247,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleDebug(show_debug)); } - Text::new(&self.localized_strings.get("hud.settings.debug_info")) + Text::new(&self.localized_strings.get_msg("hud-settings-debug_info")) .right_from(state.ids.debug_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -271,7 +271,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHitboxes(show_hitboxes)); } - Text::new(&self.localized_strings.get("hud.settings.show_hitboxes")) + Text::new(&self.localized_strings.get_msg("hud-settings-show_hitboxes")) .right_from(state.ids.hitboxes_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -295,7 +295,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleChat(show_chat)); } - Text::new(&self.localized_strings.get("hud.settings.show_chat")) + Text::new(&self.localized_strings.get_msg("hud-settings-show_chat")) .right_from(state.ids.chat_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -319,7 +319,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHotkeyHints(show_hotkey_hints)); } - Text::new(&self.localized_strings.get("hud.settings.show_hotkey_hints")) + Text::new(&self.localized_strings.get_msg("hud-settings-show_hotkey_hints")) .right_from(state.ids.hotkey_hints_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -328,7 +328,7 @@ impl<'a> Widget for Interface<'a> { .set(state.ids.hotkey_hints_button_label, ui); // Ui Scale - Text::new(&self.localized_strings.get("hud.settings.ui_scale")) + Text::new(&self.localized_strings.get_msg("hud-settings-ui_scale")) .down_from(state.ids.hotkey_hints_button, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -362,7 +362,7 @@ impl<'a> Widget for Interface<'a> { events.push(UiScale(ScaleChange::ToRelative)); } - Text::new(&self.localized_strings.get("hud.settings.relative_scaling")) + Text::new(&self.localized_strings.get_msg("hud-settings-relative_scaling")) .right_from(state.ids.relative_to_win_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -397,7 +397,7 @@ impl<'a> Widget for Interface<'a> { events.push(UiScale(ScaleChange::ToAbsolute)); } - Text::new(&self.localized_strings.get("hud.settings.custom_scaling")) + Text::new(&self.localized_strings.get_msg("hud-settings-custom_scaling")) .right_from(state.ids.absolute_scale_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -574,13 +574,13 @@ impl<'a> Widget for Interface<'a> { .graphics_for(state.ids.ch_3_bg) .set(state.ids.crosshair_inner_3, ui); // Crosshair Transparency Text and Slider - Text::new(&self.localized_strings.get("hud.settings.crosshair")) + Text::new(&self.localized_strings.get_msg("hud-settings-crosshair")) .down_from(state.ids.absolute_scale_button, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.ch_title, ui); - Text::new(&self.localized_strings.get("hud.settings.opacity")) + Text::new(&self.localized_strings.get_msg("hud-settings-opacity")) .right_from(state.ids.ch_3_bg, 20.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -613,7 +613,7 @@ impl<'a> Widget for Interface<'a> { .set(state.ids.ch_transp_value, ui); // Hotbar text - Text::new(&self.localized_strings.get("hud.settings.hotbar")) + Text::new(&self.localized_strings.get_msg("hud-settings-hotbar")) .down_from(state.ids.ch_1_bg, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -648,7 +648,7 @@ impl<'a> Widget for Interface<'a> { ShortcutNumbers::Off => events.push(ToggleShortcutNumbers(ShortcutNumbers::On)), } } - Text::new(&self.localized_strings.get("hud.settings.toggle_shortcuts")) + Text::new(&self.localized_strings.get_msg("hud-settings-toggle_shortcuts")) .right_from(state.ids.show_shortcuts_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -676,7 +676,7 @@ impl<'a> Widget for Interface<'a> { { events.push(BuffPosition(BuffPosition::Bar)) } - Text::new(&self.localized_strings.get("hud.settings.buffs_skillbar")) + Text::new(&self.localized_strings.get_msg("hud-settings-buffs_skillbar")) .right_from(state.ids.buff_pos_bar_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -703,7 +703,7 @@ impl<'a> Widget for Interface<'a> { { events.push(BuffPosition(BuffPosition::Map)) } - Text::new(&self.localized_strings.get("hud.settings.buffs_mmap")) + Text::new(&self.localized_strings.get_msg("hud-settings-buffs_mmap")) .right_from(state.ids.buff_pos_map_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -727,7 +727,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.scrolling_combat_text"), + .get_msg("hud-settings-scrolling_combat_text"), ) .top_left_with_margins_on(state.ids.window_r, 5.0, 5.0) .font_size(self.fonts.cyri.scale(18)) @@ -752,7 +752,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.scrolling_combat_text"), + .get_msg("hud-settings-scrolling_combat_text"), ) .right_from(state.ids.sct_show_radio, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -772,7 +772,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.damage_accumulation_duration"), + .get_msg("hud-settings-damage_accumulation_duration"), ) .down_from(state.ids.sct_show_radio, 8.0) .right_from(state.ids.sct_show_radio, 10.0) @@ -823,7 +823,7 @@ impl<'a> Widget for Interface<'a> { !self.global_state.settings.interface.sct_inc_dmg, )) } - Text::new(&self.localized_strings.get("hud.settings.incoming_damage")) + Text::new(&self.localized_strings.get_msg("hud-settings-incoming_damage")) .right_from(state.ids.sct_show_inc_dmg_radio, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -834,7 +834,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.incoming_damage_accumulation_duration"), + .get_msg("hud-settings-incoming_damage_accumulation_duration"), ) .down_from(state.ids.sct_show_inc_dmg_radio, 8.0) .right_from(state.ids.sct_show_inc_dmg_radio, 10.0) @@ -895,7 +895,7 @@ impl<'a> Widget for Interface<'a> { !self.global_state.settings.interface.sct_damage_rounding, )) } - Text::new(&self.localized_strings.get("hud.settings.round_damage")) + Text::new(&self.localized_strings.get_msg("hud-settings-round_damage")) .right_from(state.ids.sct_round_dmg_radio, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -905,7 +905,7 @@ impl<'a> Widget for Interface<'a> { } // Speech bubbles - Text::new(&self.localized_strings.get("hud.settings.speech_bubble")) + Text::new(&self.localized_strings.get_msg("hud-settings-speech_bubble")) .down_from( if self.global_state.settings.interface.sct { state.ids.sct_round_dmg_radio @@ -938,7 +938,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.speech_bubble_self"), + .get_msg("hud-settings-speech_bubble_self"), ) .right_from(state.ids.speech_bubble_self_button, 10.0) .font_size(self.fonts.cyri.scale(15)) @@ -963,7 +963,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.speech_bubble_dark_mode"), + .get_msg("hud-settings-speech_bubble_dark_mode"), ) .right_from(state.ids.speech_bubble_dark_mode_button, 10.0) .font_size(self.fonts.cyri.scale(15)) @@ -987,7 +987,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.speech_bubble_icon"), + .get_msg("hud-settings-speech_bubble_icon"), ) .right_from(state.ids.speech_bubble_icon_button, 10.0) .font_size(self.fonts.cyri.scale(15)) @@ -997,7 +997,7 @@ impl<'a> Widget for Interface<'a> { // Energybars Numbers // Hotbar text - Text::new(&self.localized_strings.get("hud.settings.energybar_numbers")) + Text::new(&self.localized_strings.get_msg("hud-settings-energybar_numbers")) .down_from(state.ids.speech_bubble_icon_button, 20.0) .font_size(self.fonts.cyri.scale(18)) .font_id(self.fonts.cyri.conrod_id) @@ -1027,7 +1027,7 @@ impl<'a> Widget for Interface<'a> { { events.push(ToggleBarNumbers(BarNumbers::Off)) } - Text::new(&self.localized_strings.get("hud.settings.none")) + Text::new(&self.localized_strings.get_msg("hud-settings-none")) .right_from(state.ids.show_bar_numbers_none_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1058,7 +1058,7 @@ impl<'a> Widget for Interface<'a> { { events.push(ToggleBarNumbers(BarNumbers::Values)) } - Text::new(&self.localized_strings.get("hud.settings.values")) + Text::new(&self.localized_strings.get_msg("hud-settings-values")) .right_from(state.ids.show_bar_numbers_values_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1089,7 +1089,7 @@ impl<'a> Widget for Interface<'a> { { events.push(ToggleBarNumbers(BarNumbers::Percent)) } - Text::new(&self.localized_strings.get("hud.settings.percentages")) + Text::new(&self.localized_strings.get_msg("hud-settings-percentages")) .right_from(state.ids.show_bar_numbers_percentage_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1113,7 +1113,7 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleAlwaysShowBars(always_show_bars)); } - Text::new(&self.localized_strings.get("hud.settings.always_show_bars")) + Text::new(&self.localized_strings.get_msg("hud-settings-always_show_bars")) .right_from(state.ids.always_show_bars_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1125,7 +1125,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.experience_numbers"), + .get_msg("hud-settings-experience_numbers"), ) .down_from(state.ids.always_show_bars_button, 20.0) .font_size(self.fonts.cyri.scale(18)) @@ -1154,7 +1154,7 @@ impl<'a> Widget for Interface<'a> { Text::new( &self .localized_strings - .get("hud.settings.accumulate_experience"), + .get_msg("hud-settings-accumulate_experience"), ) .right_from(state.ids.accum_experience_button, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -1169,7 +1169,7 @@ impl<'a> Widget for Interface<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.buff_pos_map_button, 12.0) - .label(&self.localized_strings.get("hud.settings.reset_interface")) + .label(&self.localized_strings.get_msg("hud-settings-reset_interface")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/language.rs b/voxygen/src/hud/settings_window/language.rs index 0bfb16989d..b7efd48300 100644 --- a/voxygen/src/hud/settings_window/language.rs +++ b/voxygen/src/hud/settings_window/language.rs @@ -149,7 +149,7 @@ impl<'a> Widget for Language<'a> { events.push(ToggleEnglishFallback(show_english_fallback)); } - Text::new(&self.localized_strings.get("hud.settings.english_fallback")) + Text::new(&self.localized_strings.get_msg("hud-settings-english_fallback")) .right_from(state.ids.english_fallback_button, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/mod.rs b/voxygen/src/hud/settings_window/mod.rs index 0e4f7d93fe..6b045ef933 100644 --- a/voxygen/src/hud/settings_window/mod.rs +++ b/voxygen/src/hud/settings_window/mod.rs @@ -61,27 +61,27 @@ pub enum SettingsTab { impl SettingsTab { fn name_key(&self) -> &str { match self { - SettingsTab::Interface => "common.interface", - SettingsTab::Chat => "common.chat", - SettingsTab::Gameplay => "common.gameplay", - SettingsTab::Controls => "common.controls", - SettingsTab::Video => "common.video", - SettingsTab::Sound => "common.sound", - SettingsTab::Lang => "common.languages", - SettingsTab::Networking => "common.networking", + SettingsTab::Interface => "common-interface", + SettingsTab::Chat => "common-chat", + SettingsTab::Gameplay => "common-gameplay", + SettingsTab::Controls => "common-controls", + SettingsTab::Video => "common-video", + SettingsTab::Sound => "common-sound", + SettingsTab::Lang => "common-languages", + SettingsTab::Networking => "common-networking", } } fn title_key(&self) -> &str { match self { - SettingsTab::Interface => "common.interface_settings", - SettingsTab::Chat => "common.chat_settings", - SettingsTab::Gameplay => "common.gameplay_settings", - SettingsTab::Controls => "common.controls_settings", - SettingsTab::Video => "common.video_settings", - SettingsTab::Sound => "common.sound_settings", - SettingsTab::Lang => "common.language_settings", - SettingsTab::Networking => "common.networking_settings", + SettingsTab::Interface => "common-interface_settings", + SettingsTab::Chat => "common-chat_settings", + SettingsTab::Gameplay => "common-gameplay_settings", + SettingsTab::Controls => "common-controls_settings", + SettingsTab::Video => "common-video_settings", + SettingsTab::Sound => "common-sound_settings", + SettingsTab::Lang => "common-language_settings", + SettingsTab::Networking => "common-networking_settings", } } } @@ -191,7 +191,7 @@ impl<'a> Widget for SettingsWindow<'a> { Text::new( &self .localized_strings - .get(self.show.settings_tab.title_key()), + .get_msg(self.show.settings_tab.title_key()), ) .mid_top_with_margin_on(state.ids.frame, 3.0) .font_id(self.fonts.cyri.conrod_id) @@ -220,7 +220,7 @@ impl<'a> Widget for SettingsWindow<'a> { }); } for (i, settings_tab) in SettingsTab::iter().enumerate() { - let tab_name = self.localized_strings.get(settings_tab.name_key()); + let tab_name = self.localized_strings.get_msg(settings_tab.name_key()); let mut button = Button::image(if self.show.settings_tab == settings_tab { self.imgs.selection } else { diff --git a/voxygen/src/hud/settings_window/networking.rs b/voxygen/src/hud/settings_window/networking.rs index ceb58e9c38..8a7904e55e 100644 --- a/voxygen/src/hud/settings_window/networking.rs +++ b/voxygen/src/hud/settings_window/networking.rs @@ -89,7 +89,7 @@ impl<'a> Widget for Networking<'a> { .set(state.ids.window_r, ui); // View Distance - Text::new(&self.localized_strings.get("hud.settings.view_distance")) + Text::new(&self.localized_strings.get_msg("hud-settings-view_distance")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -127,7 +127,7 @@ impl<'a> Widget for Networking<'a> { Text::new( &self .localized_strings - .get("hud.settings.player_physics_behavior"), + .get_msg("hud-settings-player_physics_behavior"), ) .down_from(state.ids.vd_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -166,7 +166,7 @@ impl<'a> Widget for Networking<'a> { Text::new( &self .localized_strings - .get("hud.settings.lossy_terrain_compression"), + .get_msg("hud-settings-lossy_terrain_compression"), ) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -206,7 +206,7 @@ impl<'a> Widget for Networking<'a> { Text::new( &self .localized_strings - .get("hud.settings.third_party_integrations"), + .get_msg("hud-settings-third_party_integrations"), ) .down_from(state.ids.player_physics_behavior_list, 16.0) .font_size(self.fonts.cyri.scale(18)) @@ -248,7 +248,7 @@ impl<'a> Widget for Networking<'a> { Text::new( &self .localized_strings - .get("hud.settings.enable_discord_integration"), + .get_msg("hud-settings-enable_discord_integration"), ) .right_from(state.ids.enable_discord_integration_button, 10.0) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index 0ce9c106bc..dc048f8432 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -108,7 +108,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.window_scrollbar, ui); // Master Volume - Text::new(&self.localized_strings.get("hud.settings.master_volume")) + Text::new(&self.localized_strings.get_msg("hud-settings-master_volume")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -146,7 +146,7 @@ impl<'a> Widget for Sound<'a> { Text::new( &self .localized_strings - .get("hud.settings.inactive_master_volume_perc"), + .get_msg("hud-settings-inactive_master_volume_perc"), ) .down_from(state.ids.master_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -182,7 +182,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.inactive_master_volume_number, ui); // Music Volume - Text::new(&self.localized_strings.get("hud.settings.music_volume")) + Text::new(&self.localized_strings.get_msg("hud-settings-music_volume")) .down_from(state.ids.inactive_master_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -220,7 +220,7 @@ impl<'a> Widget for Sound<'a> { Text::new( &self .localized_strings - .get("hud.settings.sound_effect_volume"), + .get_msg("hud-settings-sound_effect_volume"), ) .down_from(state.ids.music_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -255,7 +255,7 @@ impl<'a> Widget for Sound<'a> { .color(TEXT_COLOR) .set(state.ids.sfx_volume_number, ui); // Ambience Volume - Text::new(&self.localized_strings.get("hud.settings.ambience_volume")) + Text::new(&self.localized_strings.get_msg("hud-settings-ambience_volume")) .down_from(state.ids.sfx_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -290,7 +290,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.ambience_volume_number, ui); // Music spacing - Text::new(&self.localized_strings.get("hud.settings.music_spacing")) + Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing")) .down_from(state.ids.ambience_volume_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -357,7 +357,7 @@ impl<'a> Widget for Sound<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.music_spacing_slider, 12.0) - .label(&self.localized_strings.get("hud.settings.reset_sound")) + .label(&self.localized_strings.get_msg("hud-settings-reset_sound")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 037d4eb515..8d23cab482 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -277,7 +277,7 @@ impl<'a> Widget for Video<'a> { } // View Distance - Text::new(&self.localized_strings.get("hud.settings.view_distance")) + Text::new(&self.localized_strings.get_msg("hud-settings-view_distance")) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -312,7 +312,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.vd_value, ui); // LoD Distance - Text::new(&self.localized_strings.get("hud.settings.lod_distance")) + Text::new(&self.localized_strings.get_msg("hud-settings-lod_distance")) .down_from(state.ids.vd_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -347,7 +347,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.ld_value, ui); // Max FPS - Text::new(&self.localized_strings.get("hud.settings.maximum_fps")) + Text::new(&self.localized_strings.get_msg("hud-settings-maximum_fps")) .down_from(state.ids.ld_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -382,7 +382,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.max_fps_value, ui); // Max Background FPS - Text::new(&self.localized_strings.get("hud.settings.background_fps")) + Text::new(&self.localized_strings.get_msg("hud-settings-background_fps")) .down_from(state.ids.ld_slider, 10.0) .right_from(state.ids.max_fps_value, 30.0) .font_size(self.fonts.cyri.scale(14)) @@ -430,7 +430,7 @@ impl<'a> Widget for Video<'a> { let render_mode = &self.global_state.settings.graphics.render_mode; // Present Mode - Text::new(&self.localized_strings.get("hud.settings.present_mode")) + Text::new(&self.localized_strings.get_msg("hud-settings-present_mode")) .down_from(state.ids.ld_slider, 10.0) .right_from(state.ids.max_background_fps_value, 30.0) .font_size(self.fonts.cyri.scale(14)) @@ -444,13 +444,13 @@ impl<'a> Widget for Video<'a> { PresentMode::Immediate, ]; let mode_label_list = [ - &self.localized_strings.get("hud.settings.present_mode.fifo"), + &self.localized_strings.get_msg("hud-settings-present_mode-fifo"), &self .localized_strings - .get("hud.settings.present_mode.mailbox"), + .get_msg("hud-settings-present_mode-mailbox"), &self .localized_strings - .get("hud.settings.present_mode.immediate"), + .get_msg("hud-settings-present_mode.immediate"), ]; // Get which present mode is currently active @@ -474,7 +474,7 @@ impl<'a> Widget for Video<'a> { } // FOV - Text::new(&self.localized_strings.get("hud.settings.fov")) + Text::new(&self.localized_strings.get_msg("hud-settings-fov")) .down_from(state.ids.max_fps_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -506,7 +506,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.fov_value, ui); // LoD detail - Text::new(&self.localized_strings.get("hud.settings.lod_detail")) + Text::new(&self.localized_strings.get_msg("hud-settings-lod_detail")) .down_from(state.ids.fov_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -544,7 +544,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.lod_detail_value, ui); // Gamma - Text::new(&self.localized_strings.get("hud.settings.gamma")) + Text::new(&self.localized_strings.get_msg("hud-settings-gamma")) .down_from(state.ids.lod_detail_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -595,7 +595,7 @@ impl<'a> Widget for Video<'a> { events.push(GraphicsChange::ChangeExposure(new_val as f32 / 16.0)); } - Text::new(&self.localized_strings.get("hud.settings.exposure")) + Text::new(&self.localized_strings.get_msg("hud-settings-exposure")) .up_from(state.ids.exposure_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -629,7 +629,7 @@ impl<'a> Widget for Video<'a> { { events.push(GraphicsChange::ChangeAmbiance(new_val as f32 / 100.0)); } - Text::new(&self.localized_strings.get("hud.settings.ambiance")) + Text::new(&self.localized_strings.get_msg("hud-settings-ambiance")) .up_from(state.ids.ambiance_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -665,7 +665,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.sprites_view_distance"), + .get_msg("hud-settings-sprites_view_distance"), ) .up_from(state.ids.sprite_dist_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -705,7 +705,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.figures_view_distance"), + .get_msg("hud-settings-figures_view_distance"), ) .up_from(state.ids.figure_dist_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -727,7 +727,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.figure_dist_value, ui); // AaMode - Text::new(&self.localized_strings.get("hud.settings.antialiasing_mode")) + Text::new(&self.localized_strings.get_msg("hud-settings-antialiasing_mode")) .down_from(state.ids.gamma_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -775,7 +775,7 @@ impl<'a> Widget for Video<'a> { }; let max_bloom = 0.3; - Text::new(&self.localized_strings.get("hud.settings.bloom")) + Text::new(&self.localized_strings.get_msg("hud-settings-bloom")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.aa_mode_list, 10.0) @@ -827,7 +827,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.bloom_intensity_value, ui); // Point Glow - Text::new(&self.localized_strings.get("hud.settings.point_glow")) + Text::new(&self.localized_strings.get_msg("hud-settings-point_glow")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.aa_mode_list, 10.0) @@ -866,7 +866,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.point_glow_value, ui); // Upscaling factor - Text::new(&self.localized_strings.get("hud.settings.upscale_factor")) + Text::new(&self.localized_strings.get_msg("hud-settings-upscale_factor")) .down_from(state.ids.bloom_intensity_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -911,7 +911,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.cloud_rendering_mode"), + .get_msg("hud-settings-cloud_rendering_mode"), ) .down_from(state.ids.upscale_factor_list, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -928,17 +928,17 @@ impl<'a> Widget for Video<'a> { CloudMode::Ultra, ]; let mode_label_list = [ - self.localized_strings.get("common.none"), + self.localized_strings.get_msg("common-none"), self.localized_strings - .get("hud.settings.cloud_rendering_mode.minimal"), + .get_msg("hud-settings-cloud_rendering_mode-minimal"), self.localized_strings - .get("hud.settings.cloud_rendering_mode.low"), + .get_msg("hud-settings-cloud_rendering_mode-low"), self.localized_strings - .get("hud.settings.cloud_rendering_mode.medium"), + .get_msg("hud-settings-cloud_rendering_mode-medium"), self.localized_strings - .get("hud.settings.cloud_rendering_mode.high"), + .get_msg("hud-settings-cloud_rendering_mode-high"), self.localized_strings - .get("hud.settings.cloud_rendering_mode.ultra"), + .get_msg("hud-settings-cloud_rendering_mode-ultra"), ]; // Get which cloud rendering mode is currently active @@ -962,7 +962,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.fluid_rendering_mode"), + .get_msg("hud-settings-fluid_rendering_mode"), ) .down_from(state.ids.cloud_mode_list, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -973,9 +973,9 @@ impl<'a> Widget for Video<'a> { let mode_list = [FluidMode::Cheap, FluidMode::Shiny]; let mode_label_list = [ self.localized_strings - .get("hud.settings.fluid_rendering_mode.cheap"), + .get_msg("hud-settings-fluid_rendering_mode-cheap"), self.localized_strings - .get("hud.settings.fluid_rendering_mode.shiny"), + .get_msg("hud-settings-fluid_rendering_mode-shiny"), ]; // Get which fluid rendering mode is currently active @@ -999,7 +999,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.lighting_rendering_mode"), + .get_msg("hud-settings-lighting_rendering_mode"), ) .down_from(state.ids.fluid_mode_list, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -1014,11 +1014,11 @@ impl<'a> Widget for Video<'a> { ]; let mode_label_list = [ self.localized_strings - .get("hud.settings.lighting_rendering_mode.ashikhmin"), + .get_msg("hud-settings-lighting_rendering_mode-ashikhmin"), self.localized_strings - .get("hud.settings.lighting_rendering_mode.blinnphong"), + .get_msg("hud-settings-lighting_rendering_mode-blinnphong"), self.localized_strings - .get("hud.settings.lighting_rendering_mode.lambertian"), + .get_msg("hud-settings-lighting_rendering_mode-lambertian"), ]; // Get which lighting rendering mode is currently active @@ -1042,7 +1042,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.shadow_rendering_mode"), + .get_msg("hud-settings-shadow_rendering_mode"), ) .down_from(state.ids.lighting_mode_list, 8.0) .font_size(self.fonts.cyri.scale(14)) @@ -1058,11 +1058,11 @@ impl<'a> Widget for Video<'a> { ]; let mode_label_list = [ self.localized_strings - .get("hud.settings.shadow_rendering_mode.none"), + .get_msg("hud-settings-shadow_rendering_mode-none"), self.localized_strings - .get("hud.settings.shadow_rendering_mode.cheap"), + .get_msg("hud-settings-shadow_rendering_mode-cheap"), self.localized_strings - .get("hud.settings.shadow_rendering_mode.map"), + .get_msg("hud-settings-shadow_rendering_mode-map"), ]; // Get which shadow rendering mode is currently active @@ -1087,7 +1087,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.shadow_rendering_mode.map.resolution"), + .get_msg("hud-settings-shadow_rendering_mode-map-resolution"), ) .right_from(state.ids.shadow_mode_list, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -1132,7 +1132,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.rain_occlusion.resolution"), + .get_msg("hud-settings-rain_occlusion-resolution"), ) .down_from(state.ids.shadow_mode_list, 10.0) .font_size(self.fonts.cyri.scale(14)) @@ -1169,7 +1169,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.rain_map_resolution_value, ui); // GPU Profiler - Text::new(&self.localized_strings.get("hud.settings.gpu_profiler")) + Text::new(&self.localized_strings.get_msg("hud-settings-gpu_profiler")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.rain_map_resolution_text, 8.0) @@ -1195,7 +1195,7 @@ impl<'a> Widget for Video<'a> { } // Particles - Text::new(&self.localized_strings.get("hud.settings.particles")) + Text::new(&self.localized_strings.get_msg("hud-settings-particles")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.gpu_profiler_label, 8.0) @@ -1218,7 +1218,7 @@ impl<'a> Widget for Video<'a> { } // Weapon trails - Text::new(&self.localized_strings.get("hud.settings.weapon_trails")) + Text::new(&self.localized_strings.get_msg("hud-settings-weapon_trails")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .right_from(state.ids.particles_label, 64.0) @@ -1243,7 +1243,7 @@ impl<'a> Widget for Video<'a> { } // Disable flashing lights - Text::new(&self.localized_strings.get("hud.settings.flashing_lights")) + Text::new(&self.localized_strings.get_msg("hud-settings-flashing_lights")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.particles_label, 25.0) @@ -1268,7 +1268,7 @@ impl<'a> Widget for Video<'a> { Text::new( &self .localized_strings - .get("hud.settings.flashing_lights_info"), + .get_msg("hud-settings-flashing_lights_info"), ) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1300,7 +1300,7 @@ impl<'a> Widget for Video<'a> { .dedup() .collect(); - Text::new(&self.localized_strings.get("hud.settings.resolution")) + Text::new(&self.localized_strings.get_msg("hud-settings-resolution")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.flashing_lights_label, 25.0) @@ -1359,7 +1359,7 @@ impl<'a> Widget for Video<'a> { .dedup() .collect(); - Text::new(&self.localized_strings.get("hud.settings.bit_depth")) + Text::new(&self.localized_strings.get_msg("hud-settings-bit_depth")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.flashing_lights_label, 25.0) @@ -1368,7 +1368,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.bit_depth_label, ui); if let Some(clicked) = DropDownList::new( - once(String::from(self.localized_strings.get("common.automatic"))) + once(String::from(self.localized_strings.get_msg("common-automatic"))) .chain(bit_depths.iter().map(|depth| format!("{}", depth))) .collect::>() .as_slice(), @@ -1413,7 +1413,7 @@ impl<'a> Widget for Video<'a> { .dedup() .collect(); - Text::new(&self.localized_strings.get("hud.settings.refresh_rate")) + Text::new(&self.localized_strings.get_msg("hud-settings-refresh_rate")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.flashing_lights_label, 25.0) @@ -1422,7 +1422,7 @@ impl<'a> Widget for Video<'a> { .set(state.ids.refresh_rate_label, ui); if let Some(clicked) = DropDownList::new( - once(String::from(self.localized_strings.get("common.automatic"))) + once(String::from(self.localized_strings.get_msg("common-automatic"))) .chain(refresh_rates.iter().map(|rate| format!("{}", rate))) .collect::>() .as_slice(), @@ -1453,7 +1453,7 @@ impl<'a> Widget for Video<'a> { } // Fullscreen - Text::new(&self.localized_strings.get("hud.settings.fullscreen")) + Text::new(&self.localized_strings.get_msg("hud-settings-fullscreen")) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .down_from(state.ids.resolution, 8.0) @@ -1479,7 +1479,7 @@ impl<'a> Widget for Video<'a> { } // Fullscreen Mode - Text::new(&self.localized_strings.get("hud.settings.fullscreen_mode")) + Text::new(&self.localized_strings.get_msg("hud-settings-fullscreen_mode")) .down_from(state.ids.fullscreen_label, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) @@ -1490,10 +1490,10 @@ impl<'a> Widget for Video<'a> { let mode_label_list = [ &self .localized_strings - .get("hud.settings.fullscreen_mode.exclusive"), + .get_msg("hud-settings-fullscreen_mode-exclusive"), &self .localized_strings - .get("hud.settings.fullscreen_mode.borderless"), + .get_msg("hud-settings-fullscreen_mode-borderless"), ]; // Get which fullscreen mode is currently active @@ -1521,7 +1521,7 @@ impl<'a> Widget for Video<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.fullscreen_mode_list, 12.0) - .label(&self.localized_strings.get("hud.settings.save_window_size")) + .label(&self.localized_strings.get_msg("hud-settings-save_window_size")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -1545,7 +1545,7 @@ impl<'a> Widget for Video<'a> { .press_image(self.imgs.button_press) .down_from(state.ids.fullscreen_mode_list, 12.0) .right_from(state.ids.save_window_size_button, 12.0) - .label(&self.localized_strings.get("hud.settings.reset_graphics")) + .label(&self.localized_strings.get_msg("hud-settings-reset_graphics")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index b71577d4dd..b6c4a15ff6 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -333,7 +333,7 @@ impl<'a> Skillbar<'a> { .controls .get_binding(GameInput::Respawn) { - Text::new(&localized_strings.get("hud.you_died")) + Text::new(&localized_strings.get_msg("hud-you_died")) .middle_of(ui.window) .font_size(self.fonts.cyri.scale(50)) .font_id(self.fonts.cyri.conrod_id) @@ -349,7 +349,7 @@ impl<'a> Skillbar<'a> { .font_id(self.fonts.cyri.conrod_id) .color(Color::Rgba(0.0, 0.0, 0.0, 1.0)) .set(state.ids.death_message_2_bg, ui); - Text::new(&localized_strings.get("hud.you_died")) + Text::new(&localized_strings.get_msg("hud-you_died")) .bottom_left_with_margins_on(state.ids.death_message_1_bg, 2.0, 2.0) .font_size(self.fonts.cyri.scale(50)) .font_id(self.fonts.cyri.conrod_id) @@ -455,8 +455,8 @@ impl<'a> Skillbar<'a> { // Bar Text let bar_text = if self.health.is_dead { Some(( - self.localized_strings.get("hud.group.dead").into_owned(), - self.localized_strings.get("hud.group.dead").into_owned(), + self.localized_strings.get_msg("hud-group-dead").into_owned(), + self.localized_strings.get_msg("hud-group-dead").into_owned(), )) } else if let BarNumbers::Values = bar_values { Some(( diff --git a/voxygen/src/hud/social.rs b/voxygen/src/hud/social.rs index 3e55c4905a..3c5a8b6fd8 100644 --- a/voxygen/src/hud/social.rs +++ b/voxygen/src/hud/social.rs @@ -159,7 +159,7 @@ impl<'a> Widget for Social<'a> { Rectangle::fill_with([212.0, 42.0], color::TRANSPARENT) .top_left_with_margins_on(state.ids.frame, 2.0, 44.0) .set(state.ids.title_align, ui); - Text::new(&self.localized_strings.get("hud.social")) + Text::new(&self.localized_strings.get_msg("hud-social")) .middle_of(state.ids.title_align) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -184,7 +184,7 @@ impl<'a> Widget for Social<'a> { .set(state.ids.scrollbar, ui); // Online Text - Text::new(&self.localized_strings.get("hud.social.online")) + Text::new(&self.localized_strings.get_msg("hud-social-online")) .bottom_left_with_margins_on(state.ids.frame, 18.0, 10.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) @@ -255,12 +255,12 @@ impl<'a> Widget for Social<'a> { None => format!( "{} [{}]", alias.clone(), - self.localized_strings.get("hud.group.in_menu") + self.localized_strings.get_msg("hud-group-in_menu") ), // character select or spectating }; let acc_name_txt = format!( "{}: {}", - &self.localized_strings.get("hud.social.account"), + &self.localized_strings.get_msg("hud-social-account"), alias ); // Player name widget @@ -347,7 +347,7 @@ impl<'a> Widget for Social<'a> { }) .flatten(); - let invite_text = self.localized_strings.get("hud.group.invite"); + let invite_text = self.localized_strings.get_msg("hud-group-invite"); let invite_button = Button::image(self.imgs.button) .w_h(106.0, 26.0) .bottom_right_with_margins_on(state.ids.frame, 9.0, 7.0) @@ -381,7 +381,7 @@ impl<'a> Widget for Social<'a> { "{}/{} {}", current_members + current_invites, max_members, - &self.localized_strings.get("hud.group.members") + &self.localized_strings.get_msg("hud-group-members") ); invite_button .with_tooltip( diff --git a/voxygen/src/hud/trade.rs b/voxygen/src/hud/trade.rs index 6a3b299e8b..afe2f6d150 100644 --- a/voxygen/src/hud/trade.rs +++ b/voxygen/src/hud/trade.rs @@ -140,13 +140,13 @@ impl<'a> Trade<'a> { } fn title(&mut self, state: &mut ConrodState<'_, State>, ui: &mut UiCell<'_>) { - Text::new(&self.localized_strings.get("hud.trade.trade_window")) + Text::new(&self.localized_strings.get_msg("hud-trade-trade_window")) .mid_top_with_margin_on(state.ids.bg_frame, 9.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) .color(Color::Rgba(0.0, 0.0, 0.0, 1.0)) .set(state.ids.trade_title_bg, ui); - Text::new(&self.localized_strings.get("hud.trade.trade_window")) + Text::new(&self.localized_strings.get_msg("hud-trade-trade_window")) .top_left_with_margins_on(state.ids.trade_title_bg, 2.0, 2.0) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(20)) @@ -161,9 +161,9 @@ impl<'a> Trade<'a> { trade: &'a PendingTrade, ) { let phase_text = match trade.phase() { - TradePhase::Mutate => self.localized_strings.get("hud.trade.phase1_description"), - TradePhase::Review => self.localized_strings.get("hud.trade.phase2_description"), - TradePhase::Complete => self.localized_strings.get("hud.trade.phase3_description"), + TradePhase::Mutate => self.localized_strings.get_msg("hud-trade-phase1_description"), + TradePhase::Review => self.localized_strings.get_msg("hud-trade-phase2_description"), + TradePhase::Complete => self.localized_strings.get_msg("hud-trade-phase3_description"), }; Text::new(&phase_text) @@ -223,11 +223,11 @@ impl<'a> Trade<'a> { let offer_header = if ours { self.localized_strings - .get("hud.trade.your_offer") + .get_msg("hud-trade-your_offer") .to_owned() } else { self.localized_strings - .get("hud.trade.their_offer") + .get_msg("hud-trade-their_offer") .to_owned() }; @@ -515,7 +515,7 @@ impl<'a> Trade<'a> { .press_image(press_img) .image_color(accept_button_luminance) .bottom_left_with_margins_on(state.ids.bg, 90.0, 47.0) - .label(&self.localized_strings.get("hud.trade.accept")) + .label(&self.localized_strings.get_msg("hud-trade-accept")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -531,7 +531,7 @@ impl<'a> Trade<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .right_from(state.ids.accept_button, 20.0) - .label(&self.localized_strings.get("hud.trade.decline")) + .label(&self.localized_strings.get_msg("hud-trade-decline")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -662,7 +662,7 @@ impl<'a> Trade<'a> { } } else { // placeholder text when no trade slot is selected - Text::new(&self.localized_strings.get("hud.trade.amount_input")) + Text::new(&self.localized_strings.get_msg("hud-trade-amount_input")) .middle_of(state.ids.amount_bg) .font_id(self.fonts.cyri.conrod_id) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index 00ec248e99..7a0207726d 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -224,7 +224,7 @@ impl PlayState for CharSelectionState { client::Event::Disconnect => { global_state.info_message = Some( localized_strings - .get("main.login.server_shut_down") + .get_msg("main-login-server_shut_down") .into_owned(), ); return PlayStateResult::Pop; @@ -241,7 +241,7 @@ impl PlayState for CharSelectionState { }, Err(err) => { global_state.info_message = - Some(localized_strings.get("common.connection_lost").into_owned()); + Some(localized_strings.get_msg("common-connection_lost").into_owned()); error!(?err, "[char_selection] Failed to tick the client"); return PlayStateResult::Pop; }, diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 772631e4a0..e72c2d8109 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -240,7 +240,7 @@ impl PlayState for MainMenuState { client::Event::Disconnect => { global_state.info_message = Some( localized_strings - .get("main.login.server_shut_down") + .get_msg("main-login-server_shut_down") .into_owned(), ); self.init = InitState::None; @@ -251,7 +251,7 @@ impl PlayState for MainMenuState { }, Err(err) => { global_state.info_message = - Some(localized_strings.get("common.connection_lost").into_owned()); + Some(localized_strings.get_msg("common-connection_lost").into_owned()); error!(?err, "[main menu] Failed to tick the client"); self.init = InitState::None; }, @@ -420,18 +420,18 @@ fn get_client_msg_error( if let Some(server_info) = mismatched_server_info { format!( "{} {}: {} ({}) {}: {} ({})", - localization.get("main.login.network_wrong_version"), - localization.get("main.login.client_version"), + localization.get_msg("main-login-network_wrong_version"), + localization.get_msg("main-login-client_version"), &*common::util::GIT_HASH, &*common::util::GIT_DATE, - localization.get("main.login.server_version"), + localization.get_msg("main-login-server_version"), server_info.git_hash, server_info.git_date, ) } else { format!( "{}: {}", - localization.get("main.login.network_error"), + localization.get_msg("main-login-network_error"), error ) } @@ -444,30 +444,30 @@ fn get_client_msg_error( mismatched_server_info, } => match error { Error::SpecsErr(e) => { - format!("{}: {}", localization.get("main.login.internal_error"), e) + format!("{}: {}", localization.get_msg("main-login-internal_error"), e) }, Error::AuthErr(e) => format!( "{}: {}", - localization.get("main.login.authentication_error"), + localization.get_msg("main-login-authentication_error"), e ), Error::Kicked(e) => e, - Error::TooManyPlayers => localization.get("main.login.server_full").into(), + Error::TooManyPlayers => localization.get_msg("main-login-server_full").into(), Error::AuthServerNotTrusted => { - localization.get("main.login.untrusted_auth_server").into() + localization.get_msg("main-login-untrusted_auth_server").into() }, - Error::ServerTimeout => localization.get("main.login.timeout").into(), - Error::ServerShutdown => localization.get("main.login.server_shut_down").into(), - Error::NotOnWhitelist => localization.get("main.login.not_on_whitelist").into(), + Error::ServerTimeout => localization.get_msg("main-login-timeout").into(), + Error::ServerShutdown => localization.get_msg("main-login-server_shut_down").into(), + Error::NotOnWhitelist => localization.get_msg("main-login-not_on_whitelist").into(), Error::Banned(reason) => { - format!("{}: {}", localization.get("main.login.banned"), reason) + format!("{}: {}", localization.get_msg("main-login-banned"), reason) }, - Error::InvalidCharacter => localization.get("main.login.invalid_character").into(), + Error::InvalidCharacter => localization.get_msg("main-login-invalid_character").into(), Error::NetworkErr(NetworkError::ConnectFailed(NetworkConnectError::Handshake( InitProtocolError::WrongVersion(_), ))) => net_error( localization - .get("main.login.network_wrong_version") + .get_msg("main-login-network_wrong_version") .into_owned(), mismatched_server_info, ), @@ -475,38 +475,38 @@ fn get_client_msg_error( Error::ParticipantErr(e) => net_error(e.to_string(), mismatched_server_info), Error::StreamErr(e) => net_error(e.to_string(), mismatched_server_info), Error::HostnameLookupFailed(e) => { - format!("{}: {}", localization.get("main.login.server_not_found"), e) + format!("{}: {}", localization.get_msg("main-login-server_not_found"), e) }, Error::Other(e) => { - format!("{}: {}", localization.get("common.error"), e) + format!("{}: {}", localization.get_msg("common-error"), e) }, Error::AuthClientError(e) => match e { // TODO: remove parentheses client::AuthClientError::RequestError(e) => format!( "{}: {}", - localization.get("main.login.failed_sending_request"), + localization.get_msg("main-login-failed_sending_request"), e ), client::AuthClientError::JsonError(e) => format!( "{}: {}", - localization.get("main.login.failed_sending_request"), + localization.get_msg("main-login-failed_sending_request"), e ), client::AuthClientError::InsecureSchema => { - localization.get("main.login.insecure_auth_scheme").into() + localization.get_msg("main-login-insecure_auth_scheme").into() }, client::AuthClientError::ServerError(_, e) => String::from_utf8_lossy(&e).into(), }, Error::AuthServerUrlInvalid(e) => { format!( "{}: https://{}", - localization.get("main.login.failed_auth_server_url_invalid"), + localization.get_msg("main-login-failed_auth_server_url_invalid"), e ) }, }, - InitError::ClientCrashed => localization.get("main.login.client_crashed").into(), - InitError::ServerNotFound => localization.get("main.login.server_not_found").into(), + InitError::ClientCrashed => localization.get_msg("main-login-client_crashed").into(), + InitError::ServerNotFound => localization.get_msg("main-login-server_not_found").into(), } } @@ -525,7 +525,7 @@ fn attempt_login( comp::AliasError::ForbiddenCharacters => { *info_message = Some( localization - .get("main.login.username_bad_characters") + .get_msg("main-login-username_bad_characters") .into_owned(), ); }, diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 432d19db0a..f3ab46bdff 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -343,7 +343,7 @@ impl SessionState { client::Event::Kicked(reason) => { global_state.info_message = Some(format!( "{}: {}", - global_state.i18n.read().get("main.login.kicked"), + global_state.i18n.read().get_msg("main-login-kicked"), reason )); return Ok(TickAction::Disconnect); @@ -1187,7 +1187,7 @@ impl PlayState for SessionState { global_state .i18n .read() - .get("common.connection_lost") + .get_msg("common-connection_lost") .into_owned(), ); error!("[session] Failed to tick the scene: {:?}", err); diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 7ffa996514..ee25ec8360 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -1265,8 +1265,8 @@ impl<'a> Widget for ItemTooltip<'a> { ) { // Get localized tooltip strings (gotten here because these should // only show if in a trade- aka if buy/sell prices are present) - let tt_hint_1 = self.localized_strings.get("hud.trade.tooltip_hint_1"); - let tt_hint_2 = self.localized_strings.get("hud.trade.tooltip_hint_2"); + let tt_hint_1 = self.localized_strings.get_msg("hud-trade-tooltip_hint_1"); + let tt_hint_2 = self.localized_strings.get_msg("hud-trade-tooltip_hint_2"); widget::Text::new(&format!("{}\n{}\n{}\n{}", buy, sell, tt_hint_1, tt_hint_2)) .with_style(self.style.desc) From a3388bdd2e8fbe6d3dd7f119ba165b9bd021bff0 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:35:16 +0200 Subject: [PATCH 111/854] final cleanup for issue #1652 --- voxygen/src/game_input.rs | 132 +++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/voxygen/src/game_input.rs b/voxygen/src/game_input.rs index 3d418bad52..537e954f26 100644 --- a/voxygen/src/game_input.rs +++ b/voxygen/src/game_input.rs @@ -19,138 +19,138 @@ use strum::{AsRefStr, EnumIter, EnumString}; EnumString, )] pub enum GameInput { - #[strum(serialize = "gameinput.primary")] + #[strum(serialize = "gameinput-primary")] Primary, - #[strum(serialize = "gameinput.secondary")] + #[strum(serialize = "gameinput-secondary")] Secondary, - #[strum(serialize = "gameinput.block")] + #[strum(serialize = "gameinput-block")] Block, - #[strum(serialize = "gameinput.slot1")] + #[strum(serialize = "gameinput-slot1")] Slot1, - #[strum(serialize = "gameinput.slot2")] + #[strum(serialize = "gameinput-slot2")] Slot2, - #[strum(serialize = "gameinput.slot3")] + #[strum(serialize = "gameinput-slot3")] Slot3, - #[strum(serialize = "gameinput.slot4")] + #[strum(serialize = "gameinput-slot4")] Slot4, - #[strum(serialize = "gameinput.slot5")] + #[strum(serialize = "gameinput-slot5")] Slot5, - #[strum(serialize = "gameinput.slot6")] + #[strum(serialize = "gameinput-slot6")] Slot6, - #[strum(serialize = "gameinput.slot7")] + #[strum(serialize = "gameinput-slot7")] Slot7, - #[strum(serialize = "gameinput.slot8")] + #[strum(serialize = "gameinput-slot8")] Slot8, - #[strum(serialize = "gameinput.slot9")] + #[strum(serialize = "gameinput-slot9")] Slot9, - #[strum(serialize = "gameinput.slot10")] + #[strum(serialize = "gameinput-slot10")] Slot10, - #[strum(serialize = "gameinput.togglecursor")] + #[strum(serialize = "gameinput-togglecursor")] ToggleCursor, - #[strum(serialize = "gameinput.moveforward")] + #[strum(serialize = "gameinput-moveforward")] MoveForward, - #[strum(serialize = "gameinput.moveback")] + #[strum(serialize = "gameinput-moveback")] MoveBack, - #[strum(serialize = "gameinput.moveleft")] + #[strum(serialize = "gameinput-moveleft")] MoveLeft, - #[strum(serialize = "gameinput.moveright")] + #[strum(serialize = "gameinput-moveright")] MoveRight, - #[strum(serialize = "gameinput.jump")] + #[strum(serialize = "gameinput-jump")] Jump, - #[strum(serialize = "gameinput.sit")] + #[strum(serialize = "gameinput-sit")] Sit, - #[strum(serialize = "gameinput.dance")] + #[strum(serialize = "gameinput-dance")] Dance, - #[strum(serialize = "gameinput.greet")] + #[strum(serialize = "gameinput-greet")] Greet, - #[strum(serialize = "gameinput.glide")] + #[strum(serialize = "gameinput-glide")] Glide, - #[strum(serialize = "gameinput.climb")] + #[strum(serialize = "gameinput-climb")] Climb, - #[strum(serialize = "gameinput.climbdown")] + #[strum(serialize = "gameinput-climbdown")] ClimbDown, - #[strum(serialize = "gameinput.swimup")] + #[strum(serialize = "gameinput-swimup")] SwimUp, - #[strum(serialize = "gameinput.swimdown")] + #[strum(serialize = "gameinput-swimdown")] SwimDown, - #[strum(serialize = "gameinput.fly")] + #[strum(serialize = "gameinput-fly")] Fly, - #[strum(serialize = "gameinput.sneak")] + #[strum(serialize = "gameinput-sneak")] Sneak, - #[strum(serialize = "gameinput.togglelantern")] + #[strum(serialize = "gameinput-togglelantern")] ToggleLantern, - #[strum(serialize = "gameinput.mount")] + #[strum(serialize = "gameinput-mount")] Mount, - #[strum(serialize = "gameinput.chat")] + #[strum(serialize = "gameinput-chat")] Chat, - #[strum(serialize = "gameinput.command")] + #[strum(serialize = "gameinput-command")] Command, - #[strum(serialize = "gameinput.escape")] + #[strum(serialize = "gameinput-escape")] Escape, - #[strum(serialize = "gameinput.map")] + #[strum(serialize = "gameinput-map")] Map, - #[strum(serialize = "gameinput.bag")] + #[strum(serialize = "gameinput-bag")] Bag, - #[strum(serialize = "gameinput.trade")] + #[strum(serialize = "gameinput-trade")] Trade, - #[strum(serialize = "gameinput.social")] + #[strum(serialize = "gameinput-social")] Social, - #[strum(serialize = "gameinput.crafting")] + #[strum(serialize = "gameinput-crafting")] Crafting, - #[strum(serialize = "gameinput.spellbook")] + #[strum(serialize = "gameinput-spellbook")] Spellbook, - #[strum(serialize = "gameinput.settings")] + #[strum(serialize = "gameinput-settings")] Settings, - #[strum(serialize = "gameinput.toggleinterface")] + #[strum(serialize = "gameinput-toggleinterface")] ToggleInterface, - #[strum(serialize = "gameinput.help")] + #[strum(serialize = "gameinput-help")] Help, - #[strum(serialize = "gameinput.toggledebug")] + #[strum(serialize = "gameinput-toggledebug")] ToggleDebug, #[cfg(feature = "egui-ui")] - #[strum(serialize = "gameinput.toggle_egui_debug")] + #[strum(serialize = "gameinput-toggle_egui_debug")] ToggleEguiDebug, - #[strum(serialize = "gameinput.togglechat")] + #[strum(serialize = "gameinput-togglechat")] ToggleChat, - #[strum(serialize = "gameinput.fullscreen")] + #[strum(serialize = "gameinput-fullscreen")] Fullscreen, - #[strum(serialize = "gameinput.screenshot")] + #[strum(serialize = "gameinput-screenshot")] Screenshot, - #[strum(serialize = "gameinput.toggleingameui")] + #[strum(serialize = "gameinput-toggleingameui")] ToggleIngameUi, - #[strum(serialize = "gameinput.roll")] + #[strum(serialize = "gameinput-roll")] Roll, - #[strum(serialize = "gameinput.respawn")] + #[strum(serialize = "gameinput-respawn")] Respawn, - #[strum(serialize = "gameinput.interact")] + #[strum(serialize = "gameinput-interact")] Interact, - #[strum(serialize = "gameinput.togglewield")] + #[strum(serialize = "gameinput-togglewield")] ToggleWield, - #[strum(serialize = "gameinput.swaploadout")] + #[strum(serialize = "gameinput-swaploadout")] SwapLoadout, - #[strum(serialize = "gameinput.freelook")] + #[strum(serialize = "gameinput-freelook")] FreeLook, - #[strum(serialize = "gameinput.autowalk")] + #[strum(serialize = "gameinput-autowalk")] AutoWalk, - #[strum(serialize = "gameinput.cameraclamp")] + #[strum(serialize = "gameinput-cameraclamp")] CameraClamp, - #[strum(serialize = "gameinput.cyclecamera")] + #[strum(serialize = "gameinput-cyclecamera")] CycleCamera, - #[strum(serialize = "gameinput.select")] + #[strum(serialize = "gameinput-select")] Select, - #[strum(serialize = "gameinput.acceptgroupinvite")] + #[strum(serialize = "gameinput-acceptgroupinvite")] AcceptGroupInvite, - #[strum(serialize = "gameinput.declinegroupinvite")] + #[strum(serialize = "gameinput-declinegroupinvite")] DeclineGroupInvite, - #[strum(serialize = "gameinput.mapzoomin")] + #[strum(serialize = "gameinput-mapzoomin")] MapZoomIn, - #[strum(serialize = "gameinput.mapzoomout")] + #[strum(serialize = "gameinput-mapzoomout")] MapZoomOut, - #[strum(serialize = "gameinput.map.locationmarkerbutton")] + #[strum(serialize = "gameinput-map-locationmarkerbutton")] MapSetMarker, - #[strum(serialize = "gameinput.spectatespeedboost")] + #[strum(serialize = "gameinput-spectatespeedboost")] SpectateSpeedBoost, - #[strum(serialize = "gameinput.spectateviewpoint")] + #[strum(serialize = "gameinput-spectateviewpoint")] SpectateViewpoint, } From e7f472059daf49cba9375b353e4791ebe92954c8 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 14:23:31 +0200 Subject: [PATCH 112/854] tidied up code --- voxygen/src/hud/diary.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index 969bfef5f9..c83b2b9c0e 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -3424,7 +3424,7 @@ impl<'a> SkillStrings<'a> { let args = i18n::fluent_args! { "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc, &args); + let desc = i18n.get_msg_ctx(desc, &args); (title, desc) }, From 0ca2e64772bf974c1ffcb6ceebebe57a71392c81 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Tue, 23 Aug 2022 19:18:18 +0200 Subject: [PATCH 113/854] formtaed code with cargo fmt --- voxygen/src/hud/buffs.rs | 6 +- voxygen/src/hud/crafting.rs | 18 ++- voxygen/src/hud/mod.rs | 12 +- voxygen/src/hud/settings_window/controls.rs | 6 +- voxygen/src/hud/settings_window/gameplay.rs | 38 +++-- voxygen/src/hud/settings_window/interface.rs | 148 ++++++++++++------- voxygen/src/hud/settings_window/language.rs | 18 ++- voxygen/src/hud/settings_window/sound.rs | 16 +- voxygen/src/hud/settings_window/video.rs | 118 +++++++++------ voxygen/src/hud/skillbar.rs | 8 +- voxygen/src/hud/trade.rs | 12 +- voxygen/src/menu/char_selection/mod.rs | 7 +- voxygen/src/menu/main/mod.rs | 31 ++-- voxygen/src/ui/widgets/item_tooltip.rs | 24 ++- 14 files changed, 304 insertions(+), 158 deletions(-) diff --git a/voxygen/src/hud/buffs.rs b/voxygen/src/hud/buffs.rs index 0ae50468b7..bd04ce3b47 100644 --- a/voxygen/src/hud/buffs.rs +++ b/voxygen/src/hud/buffs.rs @@ -230,7 +230,8 @@ impl<'a> Widget for BuffsBar<'a> { let title = hud::get_buff_title(buff.kind, localized_strings); let desc_txt = hud::get_buff_desc(buff.kind, buff.data, localized_strings); let remaining_time = hud::get_buff_time(*buff); - let click_to_remove = format!("<{}>", &localized_strings.get_msg("buff-remove")); + let click_to_remove = + format!("<{}>", &localized_strings.get_msg("buff-remove")); let desc = format!("{}\n\n{}\n\n{}", desc_txt, remaining_time, click_to_remove); // Timer overlay if Button::image(self.get_duration_image(duration_percentage)) @@ -388,7 +389,8 @@ impl<'a> Widget for BuffsBar<'a> { let title = hud::get_buff_title(buff.kind, localized_strings); let desc_txt = hud::get_buff_desc(buff.kind, buff.data, localized_strings); let remaining_time = hud::get_buff_time(*buff); - let click_to_remove = format!("<{}>", &localized_strings.get_msg("buff-remove")); + let click_to_remove = + format!("<{}>", &localized_strings.get_msg("buff-remove")); let desc = if buff.is_buff { format!("{}\n\n{}", desc_txt, click_to_remove) } else { diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 6bf71316b4..a3a30cf274 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -1804,13 +1804,17 @@ impl<'a> Widget for Crafting<'a> { } } else if *sel_crafting_tab == CraftingTab::Dismantle { // Title - Text::new(&self.localized_strings.get_msg("hud-crafting-dismantle_title")) - .mid_top_with_margin_on(state.ids.align_ing, 0.0) - .font_id(self.fonts.cyri.conrod_id) - .font_size(self.fonts.cyri.scale(24)) - .color(TEXT_COLOR) - .parent(state.ids.window) - .set(state.ids.dismantle_title, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-crafting-dismantle_title"), + ) + .mid_top_with_margin_on(state.ids.align_ing, 0.0) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(24)) + .color(TEXT_COLOR) + .parent(state.ids.window) + .set(state.ids.dismantle_title, ui); // Bench Icon let size = 140.0; diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 8ca0832907..322a8fc95e 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -4588,7 +4588,9 @@ pub fn get_buff_title(buff: BuffKind, localized_strings: &Localization) -> Cow localized_strings.get_msg("buff-title-saturation"), BuffKind::Potion { .. } => localized_strings.get_msg("buff-title-potion"), BuffKind::CampfireHeal { .. } => localized_strings.get_msg("buff-title-campfire_heal"), - BuffKind::IncreaseMaxHealth { .. } => localized_strings.get_msg("buff-title-IncreaseMaxHealth"), + BuffKind::IncreaseMaxHealth { .. } => { + localized_strings.get_msg("buff-title-IncreaseMaxHealth") + }, BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get_msg("buff-title-energyup"), BuffKind::Invulnerability => localized_strings.get_msg("buff-title-invulnerability"), BuffKind::ProtectingWard => localized_strings.get_msg("buff-title-protectingward"), @@ -4617,8 +4619,12 @@ pub fn get_buff_desc(buff: BuffKind, data: BuffData, localized_strings: &Localiz "rate" => data.strength * 100.0 }) }, - BuffKind::IncreaseMaxHealth { .. } => localized_strings.get_msg("buff-desc-IncreaseMaxHealth"), - BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get_msg("buff-desc-IncreaseMaxEnergy"), + BuffKind::IncreaseMaxHealth { .. } => { + localized_strings.get_msg("buff-desc-IncreaseMaxHealth") + }, + BuffKind::IncreaseMaxEnergy { .. } => { + localized_strings.get_msg("buff-desc-IncreaseMaxEnergy") + }, BuffKind::Invulnerability => localized_strings.get_msg("buff-desc-invulnerability"), BuffKind::ProtectingWard => localized_strings.get_msg("buff-desc-protectingward"), BuffKind::Frenzied => localized_strings.get_msg("buff-desc-frenzied"), diff --git a/voxygen/src/hud/settings_window/controls.rs b/voxygen/src/hud/settings_window/controls.rs index 2800f6c2bc..9381510a61 100644 --- a/voxygen/src/hud/settings_window/controls.rs +++ b/voxygen/src/hud/settings_window/controls.rs @@ -196,7 +196,11 @@ impl<'a> Widget for Controls<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(prev_id, 20.0) - .label(&self.localized_strings.get_msg("hud-settings-reset_keybinds")) + .label( + &self + .localized_strings + .get_msg("hud-settings-reset_keybinds"), + ) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/gameplay.rs b/voxygen/src/hud/settings_window/gameplay.rs index 0bbf6ca2fb..bc107631e9 100644 --- a/voxygen/src/hud/settings_window/gameplay.rs +++ b/voxygen/src/hud/settings_window/gameplay.rs @@ -122,12 +122,16 @@ impl<'a> Widget for Gameplay<'a> { let display_clamp = self.global_state.settings.gameplay.camera_clamp_angle; // Mouse Pan Sensitivity - Text::new(&self.localized_strings.get_msg("hud-setting-pan_sensitivity")) - .top_left_with_margins_on(state.ids.window, 10.0, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.mouse_pan_label, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-setting-pan_sensitivity"), + ) + .top_left_with_margins_on(state.ids.window, 10.0, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.mouse_pan_label, ui); if let Some(new_val) = ImageSlider::discrete( display_pan, @@ -154,12 +158,16 @@ impl<'a> Widget for Gameplay<'a> { .set(state.ids.mouse_pan_value, ui); // Mouse Zoom Sensitivity - Text::new(&self.localized_strings.get_msg("hud-settings-zoom_sensitivity")) - .down_from(state.ids.mouse_pan_slider, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.mouse_zoom_label, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-zoom_sensitivity"), + ) + .down_from(state.ids.mouse_pan_slider, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.mouse_zoom_label, ui); if let Some(new_val) = ImageSlider::discrete( display_zoom, @@ -526,7 +534,11 @@ impl<'a> Widget for Gameplay<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.camera_clamp_behavior_list, 12.0) - .label(&self.localized_strings.get_msg("hud-settings-reset_gameplay")) + .label( + &self + .localized_strings + .get_msg("hud-settings-reset_gameplay"), + ) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/interface.rs b/voxygen/src/hud/settings_window/interface.rs index a8a3b2f958..8dab3486ff 100644 --- a/voxygen/src/hud/settings_window/interface.rs +++ b/voxygen/src/hud/settings_window/interface.rs @@ -319,13 +319,17 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleHotkeyHints(show_hotkey_hints)); } - Text::new(&self.localized_strings.get_msg("hud-settings-show_hotkey_hints")) - .right_from(state.ids.hotkey_hints_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.hotkey_hints_button) - .color(TEXT_COLOR) - .set(state.ids.hotkey_hints_button_label, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-show_hotkey_hints"), + ) + .right_from(state.ids.hotkey_hints_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.hotkey_hints_button) + .color(TEXT_COLOR) + .set(state.ids.hotkey_hints_button_label, ui); // Ui Scale Text::new(&self.localized_strings.get_msg("hud-settings-ui_scale")) @@ -362,13 +366,17 @@ impl<'a> Widget for Interface<'a> { events.push(UiScale(ScaleChange::ToRelative)); } - Text::new(&self.localized_strings.get_msg("hud-settings-relative_scaling")) - .right_from(state.ids.relative_to_win_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.relative_to_win_button) - .color(TEXT_COLOR) - .set(state.ids.relative_to_win_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-relative_scaling"), + ) + .right_from(state.ids.relative_to_win_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.relative_to_win_button) + .color(TEXT_COLOR) + .set(state.ids.relative_to_win_text, ui); // Absolute Scaling Button let (check_img, check_mo_img, check_press_img, absolute_selected) = match ui_scale { @@ -397,13 +405,17 @@ impl<'a> Widget for Interface<'a> { events.push(UiScale(ScaleChange::ToAbsolute)); } - Text::new(&self.localized_strings.get_msg("hud-settings-custom_scaling")) - .right_from(state.ids.absolute_scale_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.absolute_scale_button) - .color(TEXT_COLOR) - .set(state.ids.absolute_scale_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-custom_scaling"), + ) + .right_from(state.ids.absolute_scale_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.absolute_scale_button) + .color(TEXT_COLOR) + .set(state.ids.absolute_scale_text, ui); // Slider -> Inactive when "Relative to window" is selected if let ScaleMode::Absolute(scale) = ui_scale { @@ -648,13 +660,17 @@ impl<'a> Widget for Interface<'a> { ShortcutNumbers::Off => events.push(ToggleShortcutNumbers(ShortcutNumbers::On)), } } - Text::new(&self.localized_strings.get_msg("hud-settings-toggle_shortcuts")) - .right_from(state.ids.show_shortcuts_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.show_shortcuts_button) - .color(TEXT_COLOR) - .set(state.ids.show_shortcuts_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-toggle_shortcuts"), + ) + .right_from(state.ids.show_shortcuts_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.show_shortcuts_button) + .color(TEXT_COLOR) + .set(state.ids.show_shortcuts_text, ui); // Buff Position // Buffs above skills if Button::image(match self.global_state.settings.interface.buff_position { @@ -676,13 +692,17 @@ impl<'a> Widget for Interface<'a> { { events.push(BuffPosition(BuffPosition::Bar)) } - Text::new(&self.localized_strings.get_msg("hud-settings-buffs_skillbar")) - .right_from(state.ids.buff_pos_bar_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.show_shortcuts_button) - .color(TEXT_COLOR) - .set(state.ids.buff_pos_bar_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-buffs_skillbar"), + ) + .right_from(state.ids.buff_pos_bar_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.show_shortcuts_button) + .color(TEXT_COLOR) + .set(state.ids.buff_pos_bar_text, ui); // Buffs left from minimap if Button::image(match self.global_state.settings.interface.buff_position { BuffPosition::Map => self.imgs.check_checked, @@ -823,13 +843,17 @@ impl<'a> Widget for Interface<'a> { !self.global_state.settings.interface.sct_inc_dmg, )) } - Text::new(&self.localized_strings.get_msg("hud-settings-incoming_damage")) - .right_from(state.ids.sct_show_inc_dmg_radio, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.sct_show_inc_dmg_radio) - .color(TEXT_COLOR) - .set(state.ids.sct_show_inc_dmg_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-incoming_damage"), + ) + .right_from(state.ids.sct_show_inc_dmg_radio, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.sct_show_inc_dmg_radio) + .color(TEXT_COLOR) + .set(state.ids.sct_show_inc_dmg_text, ui); if self.global_state.settings.interface.sct_inc_dmg { Text::new( &self @@ -997,12 +1021,16 @@ impl<'a> Widget for Interface<'a> { // Energybars Numbers // Hotbar text - Text::new(&self.localized_strings.get_msg("hud-settings-energybar_numbers")) - .down_from(state.ids.speech_bubble_icon_button, 20.0) - .font_size(self.fonts.cyri.scale(18)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.bar_numbers_title, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-energybar_numbers"), + ) + .down_from(state.ids.speech_bubble_icon_button, 20.0) + .font_size(self.fonts.cyri.scale(18)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.bar_numbers_title, ui); // None if Button::image(if let BarNumbers::Off = bar_values { @@ -1113,13 +1141,17 @@ impl<'a> Widget for Interface<'a> { events.push(ToggleAlwaysShowBars(always_show_bars)); } - Text::new(&self.localized_strings.get_msg("hud-settings-always_show_bars")) - .right_from(state.ids.always_show_bars_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.always_show_bars_button) - .color(TEXT_COLOR) - .set(state.ids.always_show_bars_label, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-always_show_bars"), + ) + .right_from(state.ids.always_show_bars_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.always_show_bars_button) + .color(TEXT_COLOR) + .set(state.ids.always_show_bars_label, ui); // Experience Numbers Text::new( @@ -1169,7 +1201,11 @@ impl<'a> Widget for Interface<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.buff_pos_map_button, 12.0) - .label(&self.localized_strings.get_msg("hud-settings-reset_interface")) + .label( + &self + .localized_strings + .get_msg("hud-settings-reset_interface"), + ) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/settings_window/language.rs b/voxygen/src/hud/settings_window/language.rs index b7efd48300..bcde69f66e 100644 --- a/voxygen/src/hud/settings_window/language.rs +++ b/voxygen/src/hud/settings_window/language.rs @@ -149,13 +149,17 @@ impl<'a> Widget for Language<'a> { events.push(ToggleEnglishFallback(show_english_fallback)); } - Text::new(&self.localized_strings.get_msg("hud-settings-english_fallback")) - .right_from(state.ids.english_fallback_button, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .graphics_for(state.ids.english_fallback_button) - .color(TEXT_COLOR) - .set(state.ids.english_fallback_button_label, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-english_fallback"), + ) + .right_from(state.ids.english_fallback_button, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .graphics_for(state.ids.english_fallback_button) + .color(TEXT_COLOR) + .set(state.ids.english_fallback_button_label, ui); events } diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index dc048f8432..a575753b49 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -255,12 +255,16 @@ impl<'a> Widget for Sound<'a> { .color(TEXT_COLOR) .set(state.ids.sfx_volume_number, ui); // Ambience Volume - Text::new(&self.localized_strings.get_msg("hud-settings-ambience_volume")) - .down_from(state.ids.sfx_volume_slider, 10.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.ambience_volume_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-ambience_volume"), + ) + .down_from(state.ids.sfx_volume_slider, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.ambience_volume_text, ui); // Ambience Volume Slider if let Some(new_val) = ImageSlider::continuous( self.global_state.settings.audio.ambience_volume, diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 8d23cab482..68bfb21062 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -382,13 +382,17 @@ impl<'a> Widget for Video<'a> { .set(state.ids.max_fps_value, ui); // Max Background FPS - Text::new(&self.localized_strings.get_msg("hud-settings-background_fps")) - .down_from(state.ids.ld_slider, 10.0) - .right_from(state.ids.max_fps_value, 30.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.max_background_fps_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-background_fps"), + ) + .down_from(state.ids.ld_slider, 10.0) + .right_from(state.ids.max_fps_value, 30.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.max_background_fps_text, ui); if let Some(which) = ImageSlider::discrete( BG_FPS_CHOICES @@ -444,7 +448,9 @@ impl<'a> Widget for Video<'a> { PresentMode::Immediate, ]; let mode_label_list = [ - &self.localized_strings.get_msg("hud-settings-present_mode-fifo"), + &self + .localized_strings + .get_msg("hud-settings-present_mode-fifo"), &self .localized_strings .get_msg("hud-settings-present_mode-mailbox"), @@ -727,12 +733,16 @@ impl<'a> Widget for Video<'a> { .set(state.ids.figure_dist_value, ui); // AaMode - Text::new(&self.localized_strings.get_msg("hud-settings-antialiasing_mode")) - .down_from(state.ids.gamma_slider, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.aa_mode_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-antialiasing_mode"), + ) + .down_from(state.ids.gamma_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.aa_mode_text, ui); // NOTE: MSAA modes are currently disabled from the UI due to poor // interaction with greedy meshing, and may eventually be removed. @@ -866,12 +876,16 @@ impl<'a> Widget for Video<'a> { .set(state.ids.point_glow_value, ui); // Upscaling factor - Text::new(&self.localized_strings.get_msg("hud-settings-upscale_factor")) - .down_from(state.ids.bloom_intensity_slider, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.upscale_factor_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-upscale_factor"), + ) + .down_from(state.ids.bloom_intensity_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.upscale_factor_text, ui); let upscale_factors = [ // Upscaling @@ -1243,12 +1257,16 @@ impl<'a> Widget for Video<'a> { } // Disable flashing lights - Text::new(&self.localized_strings.get_msg("hud-settings-flashing_lights")) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .down_from(state.ids.particles_label, 25.0) - .color(TEXT_COLOR) - .set(state.ids.flashing_lights_label, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-flashing_lights"), + ) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .down_from(state.ids.particles_label, 25.0) + .color(TEXT_COLOR) + .set(state.ids.flashing_lights_label, ui); let flashing_lights_enabled = ToggleButton::new( self.global_state @@ -1368,10 +1386,12 @@ impl<'a> Widget for Video<'a> { .set(state.ids.bit_depth_label, ui); if let Some(clicked) = DropDownList::new( - once(String::from(self.localized_strings.get_msg("common-automatic"))) - .chain(bit_depths.iter().map(|depth| format!("{}", depth))) - .collect::>() - .as_slice(), + once(String::from( + self.localized_strings.get_msg("common-automatic"), + )) + .chain(bit_depths.iter().map(|depth| format!("{}", depth))) + .collect::>() + .as_slice(), match self.global_state.settings.graphics.fullscreen.bit_depth { Some(bit_depth) => bit_depths .iter() @@ -1422,10 +1442,12 @@ impl<'a> Widget for Video<'a> { .set(state.ids.refresh_rate_label, ui); if let Some(clicked) = DropDownList::new( - once(String::from(self.localized_strings.get_msg("common-automatic"))) - .chain(refresh_rates.iter().map(|rate| format!("{}", rate))) - .collect::>() - .as_slice(), + once(String::from( + self.localized_strings.get_msg("common-automatic"), + )) + .chain(refresh_rates.iter().map(|rate| format!("{}", rate))) + .collect::>() + .as_slice(), match self.global_state.settings.graphics.fullscreen.refresh_rate { Some(refresh_rate) => refresh_rates .iter() @@ -1479,12 +1501,16 @@ impl<'a> Widget for Video<'a> { } // Fullscreen Mode - Text::new(&self.localized_strings.get_msg("hud-settings-fullscreen_mode")) - .down_from(state.ids.fullscreen_label, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.fullscreen_mode_text, ui); + Text::new( + &self + .localized_strings + .get_msg("hud-settings-fullscreen_mode"), + ) + .down_from(state.ids.fullscreen_label, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.fullscreen_mode_text, ui); let mode_list = [FullscreenMode::Exclusive, FullscreenMode::Borderless]; let mode_label_list = [ @@ -1521,7 +1547,11 @@ impl<'a> Widget for Video<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.fullscreen_mode_list, 12.0) - .label(&self.localized_strings.get_msg("hud-settings-save_window_size")) + .label( + &self + .localized_strings + .get_msg("hud-settings-save_window_size"), + ) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) @@ -1545,7 +1575,11 @@ impl<'a> Widget for Video<'a> { .press_image(self.imgs.button_press) .down_from(state.ids.fullscreen_mode_list, 12.0) .right_from(state.ids.save_window_size_button, 12.0) - .label(&self.localized_strings.get_msg("hud-settings-reset_graphics")) + .label( + &self + .localized_strings + .get_msg("hud-settings-reset_graphics"), + ) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index b6c4a15ff6..d9e0ac459f 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -455,8 +455,12 @@ impl<'a> Skillbar<'a> { // Bar Text let bar_text = if self.health.is_dead { Some(( - self.localized_strings.get_msg("hud-group-dead").into_owned(), - self.localized_strings.get_msg("hud-group-dead").into_owned(), + self.localized_strings + .get_msg("hud-group-dead") + .into_owned(), + self.localized_strings + .get_msg("hud-group-dead") + .into_owned(), )) } else if let BarNumbers::Values = bar_values { Some(( diff --git a/voxygen/src/hud/trade.rs b/voxygen/src/hud/trade.rs index afe2f6d150..16b3553082 100644 --- a/voxygen/src/hud/trade.rs +++ b/voxygen/src/hud/trade.rs @@ -161,9 +161,15 @@ impl<'a> Trade<'a> { trade: &'a PendingTrade, ) { let phase_text = match trade.phase() { - TradePhase::Mutate => self.localized_strings.get_msg("hud-trade-phase1_description"), - TradePhase::Review => self.localized_strings.get_msg("hud-trade-phase2_description"), - TradePhase::Complete => self.localized_strings.get_msg("hud-trade-phase3_description"), + TradePhase::Mutate => self + .localized_strings + .get_msg("hud-trade-phase1_description"), + TradePhase::Review => self + .localized_strings + .get_msg("hud-trade-phase2_description"), + TradePhase::Complete => self + .localized_strings + .get_msg("hud-trade-phase3_description"), }; Text::new(&phase_text) diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index 7a0207726d..3fbbf7e212 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -240,8 +240,11 @@ impl PlayState for CharSelectionState { } }, Err(err) => { - global_state.info_message = - Some(localized_strings.get_msg("common-connection_lost").into_owned()); + global_state.info_message = Some( + localized_strings + .get_msg("common-connection_lost") + .into_owned(), + ); error!(?err, "[char_selection] Failed to tick the client"); return PlayStateResult::Pop; }, diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index e72c2d8109..88246035b1 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -250,8 +250,11 @@ impl PlayState for MainMenuState { } }, Err(err) => { - global_state.info_message = - Some(localized_strings.get_msg("common-connection_lost").into_owned()); + global_state.info_message = Some( + localized_strings + .get_msg("common-connection_lost") + .into_owned(), + ); error!(?err, "[main menu] Failed to tick the client"); self.init = InitState::None; }, @@ -444,7 +447,11 @@ fn get_client_msg_error( mismatched_server_info, } => match error { Error::SpecsErr(e) => { - format!("{}: {}", localization.get_msg("main-login-internal_error"), e) + format!( + "{}: {}", + localization.get_msg("main-login-internal_error"), + e + ) }, Error::AuthErr(e) => format!( "{}: {}", @@ -453,9 +460,9 @@ fn get_client_msg_error( ), Error::Kicked(e) => e, Error::TooManyPlayers => localization.get_msg("main-login-server_full").into(), - Error::AuthServerNotTrusted => { - localization.get_msg("main-login-untrusted_auth_server").into() - }, + Error::AuthServerNotTrusted => localization + .get_msg("main-login-untrusted_auth_server") + .into(), Error::ServerTimeout => localization.get_msg("main-login-timeout").into(), Error::ServerShutdown => localization.get_msg("main-login-server_shut_down").into(), Error::NotOnWhitelist => localization.get_msg("main-login-not_on_whitelist").into(), @@ -475,7 +482,11 @@ fn get_client_msg_error( Error::ParticipantErr(e) => net_error(e.to_string(), mismatched_server_info), Error::StreamErr(e) => net_error(e.to_string(), mismatched_server_info), Error::HostnameLookupFailed(e) => { - format!("{}: {}", localization.get_msg("main-login-server_not_found"), e) + format!( + "{}: {}", + localization.get_msg("main-login-server_not_found"), + e + ) }, Error::Other(e) => { format!("{}: {}", localization.get_msg("common-error"), e) @@ -492,9 +503,9 @@ fn get_client_msg_error( localization.get_msg("main-login-failed_sending_request"), e ), - client::AuthClientError::InsecureSchema => { - localization.get_msg("main-login-insecure_auth_scheme").into() - }, + client::AuthClientError::InsecureSchema => localization + .get_msg("main-login-insecure_auth_scheme") + .into(), client::AuthClientError::ServerError(_, e) => String::from_utf8_lossy(&e).into(), }, Error::AuthServerUrlInvalid(e) => { diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index ee25ec8360..ba86d89af7 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -868,7 +868,11 @@ impl<'a> Widget for ItemTooltip<'a> { // Slots if item.num_slots() > 0 { stat_text( - format!("{} : {}", i18n.get_msg("common-stats-slots"), item.num_slots()), + format!( + "{} : {}", + i18n.get_msg("common-stats-slots"), + item.num_slots() + ), index, ); } @@ -1006,7 +1010,11 @@ impl<'a> Widget for ItemTooltip<'a> { stats.power * 10.0 ) } else { - format!("{} : x{:.2}", i18n.get_msg("common-stats-power"), stats.power) + format!( + "{} : x{:.2}", + i18n.get_msg("common-stats-power"), + stats.power + ) }; widget::Text::new(&power_text) .x_align_to(state.ids.item_frame, conrod_core::position::Align::Start) @@ -1025,7 +1033,11 @@ impl<'a> Widget for ItemTooltip<'a> { (stats.speed - 1.0) * 100.0 ) } else { - format!("{} : x{:.2}", i18n.get_msg("common-stats-speed"), stats.speed) + format!( + "{} : x{:.2}", + i18n.get_msg("common-stats-speed"), + stats.speed + ) }; widget::Text::new(&speed_text) .graphics_for(id) @@ -1089,7 +1101,11 @@ impl<'a> Widget for ItemTooltip<'a> { (stats.range - 1.0) * 100.0 ) } else { - format!("{} : x{:.2}", i18n.get_msg("common-stats-range"), stats.range) + format!( + "{} : x{:.2}", + i18n.get_msg("common-stats-range"), + stats.range + ) }; widget::Text::new(&range_text) .graphics_for(id) From c5b83e016604ca1096bbee65552fd7fafe050ee0 Mon Sep 17 00:00:00 2001 From: tygyh <32486062+tygyh@users.noreply.github.com> Date: Tue, 23 Aug 2022 21:18:32 +0200 Subject: [PATCH 114/854] Update swedish translations --- assets/voxygen/i18n/sv_SE/char_selection.ftl | 1 + assets/voxygen/i18n/sv_SE/common.ftl | 2 + assets/voxygen/i18n/sv_SE/gameinput.ftl | 8 +- assets/voxygen/i18n/sv_SE/hud/crafting.ftl | 14 +- assets/voxygen/i18n/sv_SE/hud/map.ftl | 4 +- assets/voxygen/i18n/sv_SE/hud/misc.ftl | 3 + assets/voxygen/i18n/sv_SE/hud/settings.ftl | 19 ++- assets/voxygen/i18n/sv_SE/npc.ftl | 138 +++++++++++++------ 8 files changed, 140 insertions(+), 49 deletions(-) diff --git a/assets/voxygen/i18n/sv_SE/char_selection.ftl b/assets/voxygen/i18n/sv_SE/char_selection.ftl index 6e1e52550a..84de1dbbd2 100644 --- a/assets/voxygen/i18n/sv_SE/char_selection.ftl +++ b/assets/voxygen/i18n/sv_SE/char_selection.ftl @@ -3,6 +3,7 @@ char_selection-delete_permanently = Vill du radera rollpersonen permanent? char_selection-deleting_character = Raderar rollperson … char_selection-change_server = Byt server char_selection-enter_world = Öppna värld +char_selection-spectate = Övervaka värld char_selection-logout = Logga ut char_selection-create_new_character = Skapa ny rollperson char_selection-creating_character = Skapar rollperson … diff --git a/assets/voxygen/i18n/sv_SE/common.ftl b/assets/voxygen/i18n/sv_SE/common.ftl index 4b73e45cba..d2d6f8f0c1 100644 --- a/assets/voxygen/i18n/sv_SE/common.ftl +++ b/assets/voxygen/i18n/sv_SE/common.ftl @@ -11,6 +11,7 @@ common-controls = Kontroller common-video = Grafik common-sound = Ljud common-chat = Chatt +common-networking = Nätverk common-resume = Återgå common-characters = Rollpersoner common-close = Stäng @@ -40,6 +41,7 @@ common-video_settings = Grafikinställningar common-sound_settings = Ljudinställningar common-language_settings = Språkinställningar common-chat_settings = Chattinställningar +common-networking_settings = Nätverksinställningar common-connection_lost = Anslutningen förlorades! Startade servern om? diff --git a/assets/voxygen/i18n/sv_SE/gameinput.ftl b/assets/voxygen/i18n/sv_SE/gameinput.ftl index ebd4910f36..a6f830ce77 100644 --- a/assets/voxygen/i18n/sv_SE/gameinput.ftl +++ b/assets/voxygen/i18n/sv_SE/gameinput.ftl @@ -58,9 +58,11 @@ gameinput-cyclecamera = Byt kamera gameinput-crafting = Tillverkning gameinput-fly = Flyg gameinput-sneak = Smyg -gameinput-swimdown = Dyk neråt -gameinput-swimup = Dyk neråt +gameinput-swimdown = Simma nedåt +gameinput-swimup = Simma uppåt gameinput-mapzoomin = Förstora kartan gameinput-mapzoomout = Förminska kartan gameinput-greet = Hälsa -gameinput-map-locationmarkerbutton = Placera en markör på kartan \ No newline at end of file +gameinput-map-locationmarkerbutton = Placera en markör på kartan +gameinput-spectatespeedboost = Övervakningshastighetsökning +gameinput-spectateviewpoint = Övervakningssynpunkt \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/crafting.ftl b/assets/voxygen/i18n/sv_SE/hud/crafting.ftl index 4b9f9691ce..6b85e8b3d2 100644 --- a/assets/voxygen/i18n/sv_SE/hud/crafting.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/crafting.ftl @@ -2,6 +2,7 @@ hud-crafting = Tillverkning hud-crafting-recipes = Recept hud-crafting-ingredients = Ingredienser: hud-crafting-craft = Tillverka +hud-crafting-craft_all = Tillverka Alla hud-crafting-tool_cata = Kräver: hud-crafting-req_crafting_station = Kräver: hud-crafting-anvil = Städ @@ -30,4 +31,15 @@ hud-crafting-dismantle_explanation = Håll pekaren över föremål i din väska för att se vad du kan återvinna. - Dubbelklicka dem för att börja demontera. \ No newline at end of file + Dubbelklicka dem för att börja demontera. +hud-crafting-modular_desc = Dra föremålsdelar hit för att tillverka ett vapen +hud-crafting-mod_weap_prim_slot_title = Komponent för primärt vapen +hud-crafting-mod_weap_prim_slot_desc = Placera en komponent för ett primärt vapen här (t.ex. ett svärdsblad, yxhuvud, eller båglemmar). +hud-crafting-mod_weap_sec_slot_title = Komponent för sekundärt vapen +hud-crafting-mod_weap_sec_slot_desc = Placera en komponent för ett sekundärt vapen här (e.g. ett svärdsfäste, båghandtag, eller stavkärna). +hud-crafting-mod_comp_metal_prim_slot_title = Metalltacka +hud-crafting-mod_comp_metal_prim_slot_desc = Placera en metalltacka här, endast vissa metaller kan användas för att tillverka vapen. +hud-crafting-mod_comp_wood_prim_slot_title = Trä +hud-crafting-mod_comp_wood_prim_slot_desc = Placera en träsort här, endast vissa träsorter kan användas för att tillverka vapen. +hud-crafting-mod_comp_sec_slot_title = Djurmaterial +hud-crafting-mod_comp_sec_slot_desc = Placera valfritt en tillverkningsingrediens från ett djur, endast vissa ingredienser kan användas för att förändra vapen. \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/map.ftl b/assets/voxygen/i18n/sv_SE/hud/map.ftl index 6dafeea638..9cc5452955 100644 --- a/assets/voxygen/i18n/sv_SE/hud/map.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/map.ftl @@ -29,4 +29,6 @@ hud-map-change_map_mode = Ändra kartläge hud-map-toggle_minimap_voxel = Växla Minikartans Voxelvy hud-map-zoom_minimap_explanation = Zooma in Minikartan för att se - området runtom dig i högre detalj \ No newline at end of file + området runtom dig i högre detalj +hud-map-gnarling = Gnarlingsfästning +hud-map-placed_by = Placerad av { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/misc.ftl b/assets/voxygen/i18n/sv_SE/hud/misc.ftl index 72c434aa3d..4571833c37 100644 --- a/assets/voxygen/i18n/sv_SE/hud/misc.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/misc.ftl @@ -5,6 +5,9 @@ hud-you_died = Du dog hud-waypoint_saved = Landmärke sparat hud-sp_arrow_txt = FP hud-inventory_full = Full packning +hud-someone_else = någon annan +hud-another_group = en annan grupp +hud-owned_by_for_secs = Ägs av { $name } i { $secs } sekunder hud-press_key_to_show_keybindings_fmt = [{ $key }] tangentbordsgenvägar hud-press_key_to_toggle_lantern_fmt = [{ $key }] lykta hud-press_key_to_show_debug_info_fmt = Tryck { $key } för att vids felsökningsinformation diff --git a/assets/voxygen/i18n/sv_SE/hud/settings.ftl b/assets/voxygen/i18n/sv_SE/hud/settings.ftl index 87a1f00284..2221701473 100644 --- a/assets/voxygen/i18n/sv_SE/hud/settings.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/settings.ftl @@ -19,13 +19,18 @@ hud-settings-buffs_skillbar = Effekter vid Förmågomätarna hud-settings-buffs_mmap = Effekter vid Minikartan hud-settings-toggle_bar_experience = Visa/dölj erfarenhetsmätare hud-settings-scrolling_combat_text = Rullande stridstext +hud-settings-damage_accumulation_duration = Skadeackumulationsvaraktighet hud-settings-incoming_damage = Inkommande skada +settings-incoming_damage_accumulation_duration = Inkommande Skadeackumulationsvaraktighet +hud-settings-round_damage = Avrunda skada hud-settings-speech_bubble = Pratbubbla hud-settings-speech_bubble_self = Visa egna pratbubblor hud-settings-speech_bubble_dark_mode = Pratbubbla mörkt läge hud-settings-speech_bubble_icon = Pratbubbleikon hud-settings-energybar_numbers = Energimätare med värden hud-settings-always_show_bars = Visa alltid Energimätare +hud-settings-experience_numbers = Erfarenhetsnummer +hud-settings-accumulate_experience = Ackumulera erfarenhetsnummer hud-settings-values = Värden hud-settings-percentages = Procent hud-settings-chat = Chatt @@ -46,8 +51,10 @@ hud-settings-camera_clamp_behavior = Beteende för låst kamera hud-settings-player_physics_behavior = Spelarfysik (experiment) hud-settings-stop_auto_walk_on_input = Avsluta automatisk gång vid rörelse hud-settings-auto_camera = Automatisk kamera +hud-settings-bow_zoom = Zooma in när du spänner bågen hud-settings-reset_gameplay = Återställ till standard hud-settings-view_distance = Visningsavstånd +hud-settings-lod_distance = Detaljnivåsavstånd hud-settings-sprites_view_distance = Visningsavstånd för sprites hud-settings-figures_view_distance = Visningsavstånd för entiteter hud-settings-maximum_fps = Maximal bildhastighet @@ -78,6 +85,9 @@ hud-settings-fullscreen_mode-borderless = Utan ram hud-settings-gpu_profiler = Aktivera GPU-timing (stöds inte överallt) hud-settings-particles = Partiklar hud-settings-lossy_terrain_compression = Destruktiv komprimering av terräng +hud-settings-weapon_trails = Strimmor efter vapen +hud-settings-flashing_lights = Blinkande lysen +hud-settings-flashing_lights_info = Stänger av alla sorters blinkande, t.ex. blinkande ljus eller blixtnedslag hud-settings-resolution = Upplösning hud-settings-bit_depth = Bitdjup hud-settings-refresh_rate = Uppdateringsfrekvens @@ -88,8 +98,9 @@ hud-settings-lighting_rendering_mode-lambertian = Typ L - Billig hud-settings-shadow_rendering_mode = Återgivning av skuggor hud-settings-shadow_rendering_mode-none = Ingen hud-settings-shadow_rendering_mode-cheap = Billig -hud-settings-shadow_rendering_mode-map = Mappad +hud-settings-shadow_rendering_mode-map = Kartlagd hud-settings-shadow_rendering_mode-map-resolution = Upplösning +hud-settings-rain_occlusion-resolution = Regnocklusionsupplösning hud-settings-lod_detail = Detailjrikedom hud-settings-save_window_size = Kom ihåg fönsterstorlek hud-settings-reset_graphics = Återställ till standard @@ -99,6 +110,8 @@ hud-settings-master_volume = Huvudvolym hud-settings-inactive_master_volume_perc = Huvudvolym (inaktivt fönster) hud-settings-music_volume = Musikvolym hud-settings-sound_effect_volume = Ljudeffektsvolym +hud-settings-ambience_volume = Omgivningsmusiksvolym +hud-settings-music_spacing = Avstånd mellan musik hud-settings-audio_device = Ljudenhet hud-settings-reset_sound = Återställ till standard hud-settings-english_fallback = Visa på engelska om översättning saknas @@ -119,4 +132,6 @@ hud-settings-region = Region hud-settings-say = Säg hud-settings-all = Alla hud-settings-group_only = Endast grupp -hud-settings-reset_chat = Återställ till standard \ No newline at end of file +hud-settings-reset_chat = Återställ till standard +hud-settings-third_party_integrations = Tredjepartsintegrationer +hud-settings-enable_discord_integration = Aktivera Discord-Integration diff --git a/assets/voxygen/i18n/sv_SE/npc.ftl b/assets/voxygen/i18n/sv_SE/npc.ftl index 6745d61196..88ec580e38 100644 --- a/assets/voxygen/i18n/sv_SE/npc.ftl +++ b/assets/voxygen/i18n/sv_SE/npc.ftl @@ -1,37 +1,70 @@ npc-speech-villager = + .a0 = Jag älskar ost. +npc-speech-villager_open = + .a0 = Undrar vad en Catoblepa tänker på när den betar. + .a1 = Vad tror du får Skimrande Lämningar att lysa? + .a2 = Har du också hört ryktet om Landhajar? Jag hörde att de bor i öknar. + .a3 = Undrar just vad som ligger på andra sidan bergen där borta. + .a4 = Jag lämnade en ost hos min bror. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost. + .a5 = Jag lämnade en ost hos min syster. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost. + .a6 = Har du lyckats fånga en eldfluga någon gång? + .a7 = De påstår att glimrande ädelstenar av alla dess slag kan hittas i grottor. + .a8 = Jag kan bara inte begripa var alla dessa Sauroker kommer ifrån. +npc-speech-villager_adventurous = + .a0 = Jag skulle vilja konstruera min egna glidare en dag. + .a1 = Jag skulle vilja utforska någon grotta när jag blir starkare. +npc-speech-villager_closed = + .a0 = Du är inte härifrån, eller hur are you? + .a1 = Visst är väl vår by den bästa i världen? + .a2 = Vissa påstår att svamp skulle vara bra för hälsan. Det skulle aldrig falla mig in att äta en. + .a3 = Att vara eller inte vara? Jag tror nog jag borde bli bonde. +npc-speech-villager_conscientious = + .a0 = Jag håller mig upptagen. Det finns alltid något att göra. + .a1 = Jag hoppas verkligen vi får lite regn snart. Det vore bra för grödorna. +npc-speech-villager_busybody = + .a0 = Folk borde jobba mer och prata mindre. +npc-speech-villager_unconscientious = + .a0 = Jag tycker nog det börjar bli dags för en andra frukost! + .a1 = Jag önskar att mitt hus inte var så stökigt. Men du skulle jag behöva städa! Haha! + .a2 = Var lämnade jag den här saken nu igen... +npc-speech-villager_extroverted = + .a0 = Du kan inte ana vad jag gjorde i helgen! + .a1 = Tjenixen! + .a2 = Vad tycker du om vädret idag? + .a3 = Visst blir man lycklig av ost! + .a4 = Glöm inte kexen för allt i världen! + .a5 = Jag bara älskar dvärgarnas ost. Om jag bara visste hur de tillverkades... + .a6 = Jag hade en fantastisk dröm om ost inatt. Vad tror du det kan betyda? + .a7 = Jag älskar honung! Om det inte vore för dessa fördömda bin. +npc-speech-villager_sociable = + .a0 = Kom in, vettja! Vi skulle just börja på en ost! + .a1 = Skulle du vilja se min trädgård? Okej, kanske någon annan gång då. +npc-speech-villager_introverted = + .a0 = Hej. + .a1 = Jag? Jag är inte speciell. +npc-speech-villager_agreeable = + .a0 = Hur står det till idag? + .a1 = Säg bara till om du behöver något. + .a2 = Har du sett min katt? +npc-speech-villager_worried = + .a0 = Var försiktig, okej? Det finns så många faror där ute. +npc-speech-villager_disagreeable = + .a0 = Jag säger som det är. Om folk inte gillar det, synd för dem. + .a1 = Folk tar illa upp för enkelt. +npc-speech-villager_neurotic = + .a0 = Blotta tanken av dungeons ger mig rysningar. Jag hoppas att någon kommer städa ur dem. + .a1 = Någon borde göra något åt de där sektanhängarna. Helst inte jag. + .a2 = Jag känner på mig att något dåligt kommer hända. + .a3 = Jag önskar att någon kunde hålla alla vargar borta från byn. +npc-speech-villager_sad_loner = + .a0 = Jag känner mig så ensam. + .a1 = ... Förlåt för den jobbiga tystnaden. Jag är inte så bra med folk. +npc-speech-villager_seeker = + .a0 = En dag skulle jag vilja se världen. Livet måste väl vara större än bara den här hålan? +npc-speech-villager_stable = .a0 = Är inte detta en underbar dag? - .a1 = Hur står det till idag? - .a2 = Tjenixen! - .a3 = Undrar vad en Catoblepa tänker på när den betar. - .a4 = Vad tycker du om vädret idag? - .a5 = Blotta tanken av dungeons ger mig rysningar. Jag hoppas att någon kommer städa ur dem. - .a6 = Jag skulle vilja utforska någon dungeon när jag blir starkare. - .a7 = Har du sett min katt? - .a8 = Har du också hört ryktet om Landhajar? Jag hörde att de bor i öknar. - .a9 = De påstår att glimrande ädelstenar av alla dess slag kan hittas i dungeons. - .a10 = Visst blir man lycklig av ost! - .a11 = Kom in, vettja! Vi skulle just börja på en ost. - .a12 = Vissa påstår att svamp skulle vara bra för hälsan. Det skulle aldrig falla mig in att äta en. - .a13 = Glöm inte kexen för allt i världen! - .a14 = Jag bara älskar dvärgarnas ost. Om jag bara visste hur de tillverkades … - .a15 = Undrar just vad som ligger på andra sidan bergen där borta. - .a16 = Jag skulle vilja konstruera min egna glidare en dag. - .a17 = Skulle du vilja se min trädgård? Okej, kanske någon annan gång då. - .a18 = En underbar dag för en skogspromenad! - .a19 = Att vara eller inte vara? Jag tror nog jag borde bli bonde. - .a20 = Visst är väl vår by den bästa i världen? - .a21 = Vad tror du får Skimrande Lämningar att lysa? - .a22 = Jag tycker nog det börjar bli dags för en andra frukost! - .a23 = Har du lyckats fånga en eldfluga någon gång? - .a24 = Jag kan bara inte begripa var alla dessa Sauroker kommer ifrån. - .a25 = Jag önskar att någon kunde hålla alla vargar på avstånd från byn. - .a26 = Jag hade en fantastisk dröm om ost inatt. Vad tror du det kan betyda? - .a27 = Jag lämnade en ost hos min bror. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost. - .a28 = Jag lämnade en ost hos min syster. Nu vet jag inte om den existerar eller inte, så jag kallar den Schrödingers ost. - .a29 = Någon borde göra något åt de där sektanhängarna. Förslgsvis inte jag. - .a30 = Jag hoppas verkligen vi får lite regn snart. Det vore bra för grödorna. - .a31 = Jag älskar honung! Om det inte vore för dessa fördömda bin. - .a32 = En dag skulle jag vilja se världen. Livet måste väl vara större än bara den här hålan? + .a1 = Livet är inte så illa. + .a2 = En underbar dag för en skogspromenad! npc-speech-villager_decline_trade = .a0 = Tyvärr har jag inget till salu. .a1 = En vaddå? Tror inte jag har något av intresse för dig. @@ -41,18 +74,25 @@ npc-speech-merchant_advertisement = .a1 = Skulle du vilja köpa någonting? .a2 = Jag har gott om varor, skulle du vilja se för dig själv? npc-speech-merchant_busy = - .a0 = Hallå där, vänta på din tur! - .a1 = Ta det lugnt, jag är bara en människa. - .a2 = Ser du inte att andra står före dig i kön? - .a3 = Bara ett ögonblick, jag är snart klar. - .a4 = Du får nöja dig med din plats i kön. - .a5 = Jag är upptagen, kom igen lite senare. + .a0 = Ta det lugnt, jag är bara en person. + .a1 = Bara ett ögonblick, jag är snart klar. + .a2 = Jag är upptagen, kom igen lite senare. +npc-speech-merchant_busy_rude = + .a0 = Hallå där, vänta på din tur. + .a1 = Ser du inte att andra står före dig i kön? + .a2 = Du får nöja dig med din plats i kön. npc-speech-merchant_trade_successful = .a0 = Tack för att du ville handla av mig! .a1 = Tack så mycket! npc-speech-merchant_trade_declined = .a0 = Kanske en annan gång, ha en bra dag! .a1 = Äsch, det får bli nästa gång istället! +npc-speech-merchant_trade_cancelled_hostile = + .a0 = Ursäkta för att jag avbryter detta tidigt, vi har ett problem att lösa här + .a1 = Vi får byta mer senare, jag måste ta hand om detta först! +npc-speech-ambush = + .a0 = Det är ingen bra idé att resa ensam! + .a1 = Som att stjäla godis från ett barn! npc-speech-villager_cultist_alarm = .a0 = Se upp! Här är en sektmedlem i farten! .a1 = Till vapen! Sektanhängarna anfaller! @@ -64,12 +104,12 @@ npc-speech-villager_cultist_alarm = .a7 = Inget kan två blodet från era händer, sektanhängare! .a8 = Tusen troglodytiska terapeuter! En sektmedlem mitt ibland oss! .a9 = Sektens ondskefulla tid är snart förbi! - .a10 = Den här sektanhängaren är min + .a10 = Den här sektanhängaren är min! .a11 = Gör dig redo för ett möte med din skapare, vidriga sektanhängare! .a12 = Jag ser en sektmedlem! Efter dem! .a13 = Jag ser en sektmedlem! Till attack! .a14 = Jag ser en sektmedlem! Låt dem inte komma undan! - .a15 = Skulle den högt vördade sektmedlemmen önska spilla lite blod? + .a15 = Skulle den högt vördade sektmedlemmen önska lite DÖD? .a16 = Aldrig förlåta! Aldrig förglömma! Sektanhängare, ve er! .a17 = Dö, sektanhängare! .a18 = Ert skräckvälde ska gå under! @@ -156,8 +196,22 @@ npc-speech-villager_under_attack = .a76 = Gör inte om det. .a77 = Vakter, kasta tillbaka detta odjur i sjön! .a78 = Jag kommer sätta min tarask efter dig! - .a79 = Varför just jag? + .a79 = Varför just jaaaaaag? npc-speech-villager_enemy_killed = .a0 = Min fiende är förgjord! .a1 = Äntligen lite lugn och ro! - .a2 = Vad var det nu jag höll på med? \ No newline at end of file + .a2 = ... Vad var det nu jag höll på med? +npc-speech-menacing = + .a0 = Jag varnar dig! + .a1 = Kommer du närmare attackerar jag dig! + .a2 = Du skrämmer inte mig! + .a3 = Stick iväg! + .a4 = Vänd om ifall du vill leva! + .a5 = Du är inte välkommen här! +npc-speech-cultist_low_health_fleeing = + .a0 = Retirera för syftet! + .a1 = Retirera! + .a2 = Förbannelse över dig! + .a3 = Jag kommer förbanna dig i efterlivet! + .a4 = Jag måste vila! + .a5 = De är för starka! \ No newline at end of file From 06f5aa70f0a88f046c976861abb33d6233c3e1bd Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Wed, 24 Aug 2022 16:16:30 +0200 Subject: [PATCH 115/854] removed unecesarry .replace in dairy.rs --- voxygen/src/hud/diary.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index c83b2b9c0e..8f491f58c6 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -3438,7 +3438,7 @@ impl<'a> SkillStrings<'a> { "boost" => constant, "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + let desc = i18n.get_msg_ctx(&desc, &args); (title, desc) }, @@ -3452,7 +3452,7 @@ impl<'a> SkillStrings<'a> { "boost" => constant, "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + let desc = i18n.get_msg_ctx(&desc, &args); (title, desc) }, @@ -3469,7 +3469,7 @@ impl<'a> SkillStrings<'a> { "boost" => format!("{percentage:.0}"), "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc.replace('.', "-"), &args); + let desc = i18n.get_msg_ctx(&desc, &args); (title, desc) }, From feca285665480030972ee7988136a245eb4a552d Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Wed, 24 Aug 2022 16:29:42 +0200 Subject: [PATCH 116/854] ammended code quality issues from last commit --- voxygen/src/hud/diary.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index 8f491f58c6..f761bcb2e6 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -3438,7 +3438,7 @@ impl<'a> SkillStrings<'a> { "boost" => constant, "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc, &args); + let desc = i18n.get_msg_ctx(desc, &args); (title, desc) }, @@ -3452,7 +3452,7 @@ impl<'a> SkillStrings<'a> { "boost" => constant, "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc, &args); + let desc = i18n.get_msg_ctx(desc, &args); (title, desc) }, @@ -3469,7 +3469,7 @@ impl<'a> SkillStrings<'a> { "boost" => format!("{percentage:.0}"), "SP" => sp(i18n, skill_set, skill), }; - let desc = i18n.get_msg_ctx(&desc, &args); + let desc = i18n.get_msg_ctx(desc, &args); (title, desc) }, From e456137b4cdf75dff80798a08358662e534c4bbd Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Wed, 24 Aug 2022 16:52:08 +0200 Subject: [PATCH 117/854] updated icon_button_tooltip to new format --- voxygen/src/menu/char_selection/ui/mod.rs | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/voxygen/src/menu/char_selection/ui/mod.rs b/voxygen/src/menu/char_selection/ui/mod.rs index 6bd90f1c04..97e1b2a1e6 100644 --- a/voxygen/src/menu/char_selection/ui/mod.rs +++ b/voxygen/src/menu/char_selection/ui/mod.rs @@ -941,7 +941,7 @@ impl Controls { matches!(body.species, humanoid::Species::Human), Message::Species(humanoid::Species::Human), human_icon, - "common.species.human", + "common-species-human", ) .into(), icon_button_tooltip( @@ -949,7 +949,7 @@ impl Controls { matches!(body.species, humanoid::Species::Orc), Message::Species(humanoid::Species::Orc), orc_icon, - "common.species.orc", + "common-species-orc", ) .into(), icon_button_tooltip( @@ -957,7 +957,7 @@ impl Controls { matches!(body.species, humanoid::Species::Dwarf), Message::Species(humanoid::Species::Dwarf), dwarf_icon, - "common.species.dwarf", + "common-species-dwarf", ) .into(), ]) @@ -969,7 +969,7 @@ impl Controls { matches!(body.species, humanoid::Species::Elf), Message::Species(humanoid::Species::Elf), elf_icon, - "common.species.elf", + "common-species-elf", ) .into(), icon_button_tooltip( @@ -977,7 +977,7 @@ impl Controls { matches!(body.species, humanoid::Species::Draugr), Message::Species(humanoid::Species::Draugr), draugr_icon, - "common.species.draugr", + "common-species-draugr", ) .into(), icon_button_tooltip( @@ -985,7 +985,7 @@ impl Controls { matches!(body.species, humanoid::Species::Danari), Message::Species(humanoid::Species::Danari), danari_icon, - "common.species.danari", + "common-species-danari", ) .into(), ]) @@ -1008,7 +1008,7 @@ impl Controls { *mainhand == Some(STARTER_SWORD), Message::Tool((Some(STARTER_SWORD), None)), imgs.sword, - "common.weapons.greatsword", + "common-weapons-greatsword", ) .into(), icon_button_tooltip( @@ -1016,7 +1016,7 @@ impl Controls { *mainhand == Some(STARTER_HAMMER), Message::Tool((Some(STARTER_HAMMER), None)), imgs.hammer, - "common.weapons.hammer", + "common-weapons-hammer", ) .into(), icon_button_tooltip( @@ -1024,7 +1024,7 @@ impl Controls { *mainhand == Some(STARTER_AXE), Message::Tool((Some(STARTER_AXE), None)), imgs.axe, - "common.weapons.axe", + "common-weapons-axe", ) .into(), ]) @@ -1036,7 +1036,7 @@ impl Controls { *mainhand == Some(STARTER_SWORDS), Message::Tool((Some(STARTER_SWORDS), Some(STARTER_SWORDS))), imgs.swords, - "common.weapons.shortswords", + "common-weapons-shortswords", ) .into(), icon_button_tooltip( @@ -1044,7 +1044,7 @@ impl Controls { *mainhand == Some(STARTER_BOW), Message::Tool((Some(STARTER_BOW), None)), imgs.bow, - "common.weapons.bow", + "common-weapons-bow", ) .into(), icon_button_tooltip( @@ -1052,7 +1052,7 @@ impl Controls { *mainhand == Some(STARTER_STAFF), Message::Tool((Some(STARTER_STAFF), None)), imgs.staff, - "common.weapons.staff", + "common-weapons-staff", ) .into(), ]) From 1fb981a09af1fa58fcb89481450bb87439f4a206 Mon Sep 17 00:00:00 2001 From: parzivale <40600864+parzivale@users.noreply.github.com> Date: Wed, 24 Aug 2022 17:19:23 +0200 Subject: [PATCH 118/854] updated header_i18n_key --- voxygen/src/menu/main/ui/credits.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/voxygen/src/menu/main/ui/credits.rs b/voxygen/src/menu/main/ui/credits.rs index ade2a464ac..d51afe1378 100644 --- a/voxygen/src/menu/main/ui/credits.rs +++ b/voxygen/src/menu/main/ui/credits.rs @@ -128,22 +128,22 @@ impl Screen { Space::new(Length::Fill, Length::Units(25)).into(), Scrollable::new(&mut self.scroll) .push(art_section( - "main.credits.music", + "main-credits-music", music_header_color, &credits.music, )) .push(art_section( - "main.credits.fonts", + "main-credits-fonts", fonts_header_color, &credits.fonts, )) .push(art_section( - "main.credits.other_art", + "main-credits-other_art", other_art_header_color, &credits.other_art, )) .push(credit_section( - "main.credits.contributors", + "main-credits-contributors", contributors_header_color, credits.contributors.iter(), format_contributor_credit, From 5232b6e9af17ab7e92ce10de7ef97b88f6c5e422 Mon Sep 17 00:00:00 2001 From: IsseW Date: Wed, 24 Aug 2022 23:38:18 +0200 Subject: [PATCH 119/854] remove print --- server/src/events/entity_manipulation.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 30589be618..b4ccbb7d9d 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -522,7 +522,6 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt .destroy_entity(rtsim_entity.0); } - println!("deleting"); if let Err(e) = state.delete_entity_recorded(entity) { error!(?e, ?entity, "Failed to delete destroyed entity"); } From e882e62c080918270cbb08d91ca957a116eb9d04 Mon Sep 17 00:00:00 2001 From: flo Date: Wed, 24 Aug 2022 21:50:53 +0000 Subject: [PATCH 120/854] seachapel --- .../common/abilities/ability_set_manifest.ron | 19 + .../custom/cardinal/summonseacrocs.ron | 18 + .../abilities/custom/dagon/dagonbombs.ron | 16 + .../abilities/custom/dagon/seaurchins.ron | 8 + .../abilities/custom/organ/organaura.ron | 19 + .../entity/dungeon/sea_chapel/cardinal.ron | 16 + .../entity/dungeon/sea_chapel/dagon.ron | 11 + .../entity/dungeon/sea_chapel/organ.ron | 11 + .../entity/dungeon/sea_chapel/sea_cleric.ron | 21 + .../dungeon/sea_chapel/sea_cleric_sceptre.ron | 18 + assets/common/items/armor/cardinal/belt.ron | 18 + assets/common/items/armor/cardinal/chest.ron | 18 + assets/common/items/armor/cardinal/foot.ron | 18 + assets/common/items/armor/cardinal/hand.ron | 18 + assets/common/items/armor/cardinal/pants.ron | 18 + .../common/items/armor/cardinal/shoulder.ron | 18 + .../items/armor/misc/neck/abyssal_gorget.ron | 17 + .../items/crafting_ing/abyssal_heart.ron | 9 + .../items/crafting_ing/coral_branch.ron | 9 + .../items/npc_weapons/unique/cardinal.ron | 21 + .../common/items/npc_weapons/unique/dagon.ron | 21 + .../common/items/npc_weapons/unique/organ.ron | 21 + .../loadout/dungeon/sea_chapel/cardinal.ron | 14 + .../loadout/dungeon/sea_chapel/sea_cleric.ron | 13 + .../dungeon/sea_chapel/cardinal.ron | 5 + .../dungeon/sea_chapel/chest_coral.ron | 5 + .../loot_tables/dungeon/sea_chapel/dagon.ron | 4 + .../dungeon/sea_chapel/sea_cleric.ron | 4 + assets/common/npc_names.ron | 4 + assets/common/recipe_book.ron | 11 +- assets/voxygen/audio/sfx.ron | 14 +- .../audio/sfx/abilities/barrel_organ.ogg | 3 + .../element/ui/map/buttons/sea_chapel.png | 3 + .../element/ui/map/buttons/sea_chapel_bg.png | 3 + .../ui/map/buttons/sea_chapel_hover.png | 3 + assets/voxygen/i18n/en/common.ftl | 1 + assets/voxygen/i18n/en/common.ron | 130 + assets/voxygen/i18n/en/hud/map.ftl | 1 + assets/voxygen/item_image_manifest.ron | 37 + assets/voxygen/voxel/armor/cardinal/belt.vox | 3 + assets/voxygen/voxel/armor/cardinal/chest.vox | 3 + assets/voxygen/voxel/armor/cardinal/foot.vox | 3 + assets/voxygen/voxel/armor/cardinal/hand.vox | 3 + assets/voxygen/voxel/armor/cardinal/pants.vox | 3 + .../voxygen/voxel/armor/cardinal/shoulder.vox | 3 + .../voxel/armor/misc/neck/abyssal_gorget.vox | 3 + .../voxygen/voxel/biped_weapon_manifest.ron | 4 + .../voxel/humanoid_armor_belt_manifest.ron | 4 + .../voxel/humanoid_armor_chest_manifest.ron | 4 + .../voxel/humanoid_armor_foot_manifest.ron | 4 + .../voxel/humanoid_armor_hand_manifest.ron | 10 + .../voxel/humanoid_armor_pants_manifest.ron | 4 + .../humanoid_armor_shoulder_manifest.ron | 10 + assets/voxygen/voxel/item_drop_manifest.ron | 3 + assets/voxygen/voxel/npc/dagon/male/chest.vox | 3 + .../voxygen/voxel/npc/dagon/male/foot_br.vox | 3 + .../voxygen/voxel/npc/dagon/male/foot_fr.vox | 3 + .../voxel/npc/dagon/male/head_lower.vox | 3 + .../voxel/npc/dagon/male/head_upper.vox | 3 + assets/voxygen/voxel/npc/dagon/male/jaw.vox | 3 + .../voxel/npc/dagon/male/tail_front.vox | 3 + .../voxel/npc/dagon/male/tail_rear.vox | 3 + assets/voxygen/voxel/object/dagon_bomb.vox | 3 + assets/voxygen/voxel/object/sea_urchin.vox | 3 + .../voxygen/voxel/object/seashell_lantern.vox | 3 + assets/voxygen/voxel/object_manifest.ron | 20 + .../voxel/quadruped_low_central_manifest.ron | 52 + .../voxel/quadruped_low_lateral_manifest.ron | 36 + .../voxel/sprite/chests/chest_coral.vox | 3 + .../sprite/crafting_ing/abyssal_heart.vox | 3 + .../sprite/crafting_ing/coral_branch.vox | 3 + .../voxel/sprite/misc/barrel_organ.vox | 3 + .../voxel/sprite/misc/glass_barrier.vox | 3 + assets/voxygen/voxel/sprite/misc/rope.vox | 3 + .../voxel/sprite/misc/sea_decor_block.vox | 3 + .../voxel/sprite/misc/sea_decor_chain.vox | 3 + .../voxel/sprite/misc/sea_decor_emblem.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-0.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-1.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-2.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-3.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-4.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-5.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-6.vox | 3 + .../voxel/sprite/misc/sea_decor_pillar-7.vox | 3 + .../sprite/misc/sea_decor_window_hor.vox | 3 + .../sprite/misc/sea_decor_window_ver.vox | 3 + assets/voxygen/voxel/sprite_manifest.ron | 156 + common/net/src/msg/world_msg.rs | 1 + common/src/bin/csv_export/main.rs | 1 + common/src/comp/body.rs | 3 + common/src/comp/body/object.rs | 22 +- common/src/comp/body/quadruped_low.rs | 6 +- common/src/comp/inventory/item/tool.rs | 2 + common/src/comp/inventory/loadout_builder.rs | 6 + common/src/comp/projectile.rs | 71 + common/src/states/sprite_summon.rs | 18 +- common/src/states/utils.rs | 1 + common/src/terrain/block.rs | 15 +- common/src/terrain/sprite.rs | 28 +- common/systems/src/buff.rs | 15 + server/src/persistence/json_models.rs | 6 +- server/src/sys/agent.rs | 17 + server/src/sys/agent/attack.rs | 224 + server/src/sys/agent/data.rs | 3 + voxygen/anim/src/quadruped_low/mod.rs | 11 + voxygen/src/hud/diary.rs | 1 + voxygen/src/hud/img_ids.rs | 3 + voxygen/src/hud/map.rs | 29 +- voxygen/src/hud/minimap.rs | 3 + voxygen/src/hud/mod.rs | 2 + voxygen/src/hud/util.rs | 2 +- voxygen/src/render/pipelines/particle.rs | 1 + voxygen/src/scene/particle.rs | 36 + world/src/civ/mod.rs | 74 +- world/src/lib.rs | 1 + world/src/site/economy/context.rs | 1 + world/src/site/mod.rs | 14 + world/src/site/namegen.rs | 5 +- world/src/site2/mod.rs | 33 + world/src/site2/plot.rs | 4 +- world/src/site2/plot/sea_chapel.rs | 4995 +++++++++++++++++ 122 files changed, 6636 insertions(+), 54 deletions(-) create mode 100644 assets/common/abilities/custom/cardinal/summonseacrocs.ron create mode 100644 assets/common/abilities/custom/dagon/dagonbombs.ron create mode 100644 assets/common/abilities/custom/dagon/seaurchins.ron create mode 100644 assets/common/abilities/custom/organ/organaura.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/cardinal.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/dagon.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/organ.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/sea_cleric.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron create mode 100644 assets/common/items/armor/cardinal/belt.ron create mode 100644 assets/common/items/armor/cardinal/chest.ron create mode 100644 assets/common/items/armor/cardinal/foot.ron create mode 100644 assets/common/items/armor/cardinal/hand.ron create mode 100644 assets/common/items/armor/cardinal/pants.ron create mode 100644 assets/common/items/armor/cardinal/shoulder.ron create mode 100644 assets/common/items/armor/misc/neck/abyssal_gorget.ron create mode 100644 assets/common/items/crafting_ing/abyssal_heart.ron create mode 100644 assets/common/items/crafting_ing/coral_branch.ron create mode 100644 assets/common/items/npc_weapons/unique/cardinal.ron create mode 100644 assets/common/items/npc_weapons/unique/dagon.ron create mode 100644 assets/common/items/npc_weapons/unique/organ.ron create mode 100644 assets/common/loadout/dungeon/sea_chapel/cardinal.ron create mode 100644 assets/common/loadout/dungeon/sea_chapel/sea_cleric.ron create mode 100644 assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron create mode 100644 assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron create mode 100644 assets/common/loot_tables/dungeon/sea_chapel/dagon.ron create mode 100644 assets/common/loot_tables/dungeon/sea_chapel/sea_cleric.ron create mode 100644 assets/voxygen/audio/sfx/abilities/barrel_organ.ogg create mode 100644 assets/voxygen/element/ui/map/buttons/sea_chapel.png create mode 100644 assets/voxygen/element/ui/map/buttons/sea_chapel_bg.png create mode 100644 assets/voxygen/element/ui/map/buttons/sea_chapel_hover.png create mode 100644 assets/voxygen/i18n/en/common.ron create mode 100644 assets/voxygen/voxel/armor/cardinal/belt.vox create mode 100644 assets/voxygen/voxel/armor/cardinal/chest.vox create mode 100644 assets/voxygen/voxel/armor/cardinal/foot.vox create mode 100644 assets/voxygen/voxel/armor/cardinal/hand.vox create mode 100644 assets/voxygen/voxel/armor/cardinal/pants.vox create mode 100644 assets/voxygen/voxel/armor/cardinal/shoulder.vox create mode 100644 assets/voxygen/voxel/armor/misc/neck/abyssal_gorget.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/head_lower.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/head_upper.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/dagon/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/object/dagon_bomb.vox create mode 100644 assets/voxygen/voxel/object/sea_urchin.vox create mode 100644 assets/voxygen/voxel/object/seashell_lantern.vox create mode 100644 assets/voxygen/voxel/sprite/chests/chest_coral.vox create mode 100644 assets/voxygen/voxel/sprite/crafting_ing/abyssal_heart.vox create mode 100644 assets/voxygen/voxel/sprite/crafting_ing/coral_branch.vox create mode 100644 assets/voxygen/voxel/sprite/misc/barrel_organ.vox create mode 100644 assets/voxygen/voxel/sprite/misc/glass_barrier.vox create mode 100644 assets/voxygen/voxel/sprite/misc/rope.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_block.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_chain.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-0.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-1.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-2.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-3.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-4.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-5.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-6.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_pillar-7.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_window_hor.vox create mode 100644 assets/voxygen/voxel/sprite/misc/sea_decor_window_ver.vox create mode 100644 world/src/site2/plot/sea_chapel.rs diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index 98ab4eecb1..016ace5fba 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -321,6 +321,11 @@ secondary: "common.abilities.custom.turret.arrows", abilities: [], ), + Custom("Organ"): ( + primary: "common.abilities.custom.organ.organaura", + secondary: "common.abilities.custom.organ.organaura", + abilities: [], + ), Custom("Haniwa Sentry"): ( primary: "common.abilities.custom.turret.flamethrower", secondary: "common.abilities.custom.turret.flamethrower", @@ -367,6 +372,20 @@ (None, "common.abilities.custom.harvester.explodingpumpkin"), ], ), + // TODO: Allow ability sets to expand other ability sets + Custom("Dagon"): ( + primary: "common.abilities.custom.dagon.dagonbombs", + secondary: "common.abilities.custom.dagon.seaurchins", + abilities: [], + ), + Custom("Cardinal"): ( + primary: "common.abilities.sceptre.lifestealbeam", + secondary: "common.abilities.sceptre.healingaura", + abilities: [ + (Some(Sceptre(UnlockAura)), "common.abilities.sceptre.wardingaura"), + (None, "common.abilities.custom.cardinal.summonseacrocs"), + ], + ), Custom("Oni"): ( primary: "common.abilities.custom.oni.dash", secondary: "common.abilities.custom.oni.doublestrike", diff --git a/assets/common/abilities/custom/cardinal/summonseacrocs.ron b/assets/common/abilities/custom/cardinal/summonseacrocs.ron new file mode 100644 index 0000000000..216b7d097c --- /dev/null +++ b/assets/common/abilities/custom/cardinal/summonseacrocs.ron @@ -0,0 +1,18 @@ +BasicSummon( + buildup_duration: 0.5, + cast_duration: 1.0, + recover_duration: 0.5, + summon_amount: 4, + summon_distance: (4, 4), + summon_info: ( + body: QuadrupedLow(( + species: SeaCrocodile, + body_type: Male, + )), + scale: None, + has_health: true, + loadout_config: None, + skillset_config: Some(Rank5), + ), + duration: None, +) diff --git a/assets/common/abilities/custom/dagon/dagonbombs.ron b/assets/common/abilities/custom/dagon/dagonbombs.ron new file mode 100644 index 0000000000..6744061753 --- /dev/null +++ b/assets/common/abilities/custom/dagon/dagonbombs.ron @@ -0,0 +1,16 @@ +BasicRanged( + energy_cost: 0, + buildup_duration: 0.4, + recover_duration: 0.6, + projectile: DagonBomb( + damage: 32.0, + knockback: 25.0, + radius: 10.0, + min_falloff: 0.6, + ), + projectile_body: Object(DagonBomb), + projectile_light: None, + projectile_speed: 30.0, + num_projectiles: 1, + projectile_spread: 0.0, +) diff --git a/assets/common/abilities/custom/dagon/seaurchins.ron b/assets/common/abilities/custom/dagon/seaurchins.ron new file mode 100644 index 0000000000..ad76f2755d --- /dev/null +++ b/assets/common/abilities/custom/dagon/seaurchins.ron @@ -0,0 +1,8 @@ +SpriteSummon( + buildup_duration: 0.1, + cast_duration: 0.1, + recover_duration: 0.9, + sprite: SeaUrchin, + summon_distance: (3, 3.1), + sparseness: 0.2, +) \ No newline at end of file diff --git a/assets/common/abilities/custom/organ/organaura.ron b/assets/common/abilities/custom/organ/organaura.ron new file mode 100644 index 0000000000..00aa669fd7 --- /dev/null +++ b/assets/common/abilities/custom/organ/organaura.ron @@ -0,0 +1,19 @@ +BasicAura( + buildup_duration: 0.0, + cast_duration: 0.0, + recover_duration: 2.0, + targets: InGroup, + auras: [ + ( + kind: ProtectingWard, + strength: 0.20, + duration: Some(10.0), + category: Magical, + ), + ], + aura_duration: 34.75, + range: 18.0, + energy_cost: 0.0, + scales_with_combo: false, + specifier: Some(WardingAura), +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/cardinal.ron b/assets/common/entity/dungeon/sea_chapel/cardinal.ron new file mode 100644 index 0000000000..4f6b7b6825 --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/cardinal.ron @@ -0,0 +1,16 @@ +#![enable(implicit_some)] +( + name: Name("Cardinal"), + body: RandomWith("humanoid"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.cardinal"), + inventory: ( + loadout: Inline(( + inherit: Asset("common.loadout.dungeon.sea_chapel.cardinal"), + active_hands: InHands((Item("common.items.npc_weapons.unique.cardinal"), None)), + )), + ), + meta: [ + SkillSetAsset("common.skillset.preset.rank5.fullskill"), + ], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/dagon.ron b/assets/common/entity/dungeon/sea_chapel/dagon.ron new file mode 100644 index 0000000000..986d5d3e0e --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/dagon.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Name("Dagon"), + body: RandomWith("dagon"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.dagon"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/organ.ron b/assets/common/entity/dungeon/sea_chapel/organ.ron new file mode 100644 index 0000000000..c8acfdbe7c --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/organ.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Name("Organ"), + body: Exact(Object(BarrelOrgan)), + alignment: Alignment(Enemy), + loot: Item("common.items.crafting_ing.seashells"), + inventory: ( + loadout: FromBody + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/sea_cleric.ron b/assets/common/entity/dungeon/sea_chapel/sea_cleric.ron new file mode 100644 index 0000000000..15b0b6920b --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/sea_cleric.ron @@ -0,0 +1,21 @@ +#![enable(implicit_some)] +( + name: Name("Sea Cleric"), + body: RandomWith("danari"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.sea_cleric"), + inventory: ( + loadout: Inline(( + inherit: Asset("common.loadout.dungeon.sea_chapel.sea_cleric"), + active_hands: InHands((Choice([ + (2, ModularWeapon(tool: Axe, material: Cobalt, hands: None)), + (2, ModularWeapon(tool: Sword, material: Cobalt, hands: None)), + (2, ModularWeapon(tool: Hammer, material: Cobalt, hands: None)), + (2, ModularWeapon(tool: Bow, material: Ironwood, hands: None)), + ]), None)), + )), + ), + meta: [ + SkillSetAsset("common.skillset.preset.rank4.fullskill"), + ], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron b/assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron new file mode 100644 index 0000000000..4ac20749ad --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron @@ -0,0 +1,18 @@ +#![enable(implicit_some)] +( + name: Name("Sea Cleric"), + body: RandomWith("danari"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.sea_cleric"), + inventory: ( + loadout: Inline(( + inherit: Asset("common.loadout.dungeon.sea_chapel.sea_cleric"), + active_hands: InHands((Choice([ + (1, ModularWeapon(tool: Sceptre, material: Ironwood, hands: None)), + ]), None)), + )), + ), + meta: [ + SkillSetAsset("common.skillset.preset.rank4.fullskill"), + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/belt.ron b/assets/common/items/armor/cardinal/belt.ron new file mode 100644 index 0000000000..c4b67693c7 --- /dev/null +++ b/assets/common/items/armor/cardinal/belt.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cardinal's Belt", + description: "Seemlessly transitions...", + kind: Armor(( + kind: Belt, + stats: Direct(( + protection: Some(Normal(24.0)), + poise_resilience: Some(Normal(3.0)), + energy_max: Some(20), + energy_reward: Some(0.025), + crit_power: Some(0.06), + stealth: Some(0.0), + )), + )), + quality: Legendary, + tags: [ + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/chest.ron b/assets/common/items/armor/cardinal/chest.ron new file mode 100644 index 0000000000..d20c5fc785 --- /dev/null +++ b/assets/common/items/armor/cardinal/chest.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cardinal's Cloak", + description: "A part of the cardinal's exquisite cloak.", + kind: Armor(( + kind: Chest, + stats: Direct(( + protection: Some(Normal(60.0)), + poise_resilience: Some(Normal(18.0)), + energy_max: Some(120), + energy_reward: Some(0.060), + crit_power: Some(0.375), + stealth: Some(0.0), + )), + )), + quality: Legendary, + tags: [ + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/foot.ron b/assets/common/items/armor/cardinal/foot.ron new file mode 100644 index 0000000000..0bfa1311dd --- /dev/null +++ b/assets/common/items/armor/cardinal/foot.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cardinal's Boots", + description: "The boots with millions of steps.", + kind: Armor(( + kind: Foot, + stats: Direct(( + protection: Some(Normal(24.0)), + poise_resilience: Some(Normal(6.0)), + energy_max: Some(85), + energy_reward: Some(0.105), + crit_power: Some(0.12), + stealth: Some(0.0), + )), + )), + quality: Legendary, + tags: [ + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/hand.ron b/assets/common/items/armor/cardinal/hand.ron new file mode 100644 index 0000000000..73dcb6f0e4 --- /dev/null +++ b/assets/common/items/armor/cardinal/hand.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cardinal's Gloves", + description: "Bloodstained and rugged.", + kind: Armor(( + kind: Hand, + stats: Direct(( + protection: Some(Normal(20.0)), + poise_resilience: Some(Normal(6.0)), + energy_max: Some(75), + energy_reward: Some(0.09), + crit_power: Some(0.12), + stealth: Some(0.0), + )), + )), + quality: Legendary, + tags: [ + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/pants.ron b/assets/common/items/armor/cardinal/pants.ron new file mode 100644 index 0000000000..c4af2de612 --- /dev/null +++ b/assets/common/items/armor/cardinal/pants.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cardinal's Jeans", + description: "Pants with many experiences.", + kind: Armor(( + kind: Pants, + stats: Direct(( + protection: Some(Normal(45.0)), + poise_resilience: Some(Normal(12.0)), + energy_max: Some(150.0), + energy_reward: Some(0.05), + crit_power: Some(0.24), + stealth: Some(0.00), + )), + )), + quality: Legendary, + tags: [ + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/shoulder.ron b/assets/common/items/armor/cardinal/shoulder.ron new file mode 100644 index 0000000000..4960b46639 --- /dev/null +++ b/assets/common/items/armor/cardinal/shoulder.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cardinal's Shoulderguard", + description: "The other was lost in a vicious fight.", + kind: Armor(( + kind: Shoulder, + stats: Direct(( + protection: Some(Normal(30.0)), + poise_resilience: Some(Normal(15.0)), + energy_max: Some(90), + energy_reward: Some(0.05), + crit_power: Some(0.24), + stealth: Some(0.0), + )), + )), + quality: Legendary, + tags: [ + ], +) \ No newline at end of file diff --git a/assets/common/items/armor/misc/neck/abyssal_gorget.ron b/assets/common/items/armor/misc/neck/abyssal_gorget.ron new file mode 100644 index 0000000000..994494cf4a --- /dev/null +++ b/assets/common/items/armor/misc/neck/abyssal_gorget.ron @@ -0,0 +1,17 @@ +ItemDef( + name: "Abyssal Gorget", + description: "Harnessed vigour of the tides", + kind: Armor(( + kind: Neck, + stats: Direct(( + protection: Some(Normal(2.0)), + energy_reward: Some(0.2), + crit_power: Some(0.1), + poise_resilience: Some(Normal(1.0)), + )), + )), + quality: Moderate, + tags: [ + + ], +) \ No newline at end of file diff --git a/assets/common/items/crafting_ing/abyssal_heart.ron b/assets/common/items/crafting_ing/abyssal_heart.ron new file mode 100644 index 0000000000..e2f66769ad --- /dev/null +++ b/assets/common/items/crafting_ing/abyssal_heart.ron @@ -0,0 +1,9 @@ +ItemDef( + name: "Abyssal Heart", + description: "Source of Dagons Power.", + kind: Ingredient( + // Descriptor not needed + descriptor: "", ), + quality: Epic, + tags: [], +) diff --git a/assets/common/items/crafting_ing/coral_branch.ron b/assets/common/items/crafting_ing/coral_branch.ron new file mode 100644 index 0000000000..272867d267 --- /dev/null +++ b/assets/common/items/crafting_ing/coral_branch.ron @@ -0,0 +1,9 @@ +ItemDef( + name: "Coral Branch", + description: "Treasure from the bottom of the sea.", + kind: Ingredient( + // Descriptor not needed + descriptor: "", ), + quality: Common, + tags: [], +) diff --git a/assets/common/items/npc_weapons/unique/cardinal.ron b/assets/common/items/npc_weapons/unique/cardinal.ron new file mode 100644 index 0000000000..25fb54df95 --- /dev/null +++ b/assets/common/items/npc_weapons/unique/cardinal.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Caduceus", + description: "The snakes seem to be alive", + kind: Tool(( + kind: Sceptre, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 1.2, + effect_power: 0.8, + speed: 1.2, + crit_chance: 0.4, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Legendary, + tags: [], + ability_spec: Some(Custom("Cardinal")), +) \ No newline at end of file diff --git a/assets/common/items/npc_weapons/unique/dagon.ron b/assets/common/items/npc_weapons/unique/dagon.ron new file mode 100644 index 0000000000..f7914ca412 --- /dev/null +++ b/assets/common/items/npc_weapons/unique/dagon.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Dagon Kit", + description: "Placeholder", + kind: Tool(( + kind: Natural, + hands: Two, + stats: ( + equip_time_secs: 0.001, + power: 1.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.05078125, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Low, + tags: [], + ability_spec: Some(Custom("Dagon")), +) \ No newline at end of file diff --git a/assets/common/items/npc_weapons/unique/organ.ron b/assets/common/items/npc_weapons/unique/organ.ron new file mode 100644 index 0000000000..87149aa32f --- /dev/null +++ b/assets/common/items/npc_weapons/unique/organ.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Organ Aura", + description: "Motivational Tune", + kind: Tool(( + kind: Organ, + hands: Two, + stats: ( + equip_time_secs: 0.0, + power: 2.5, + effect_power: 1.0, + speed: 0.8, + crit_chance: 0.2, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Organ")), +) \ No newline at end of file diff --git a/assets/common/loadout/dungeon/sea_chapel/cardinal.ron b/assets/common/loadout/dungeon/sea_chapel/cardinal.ron new file mode 100644 index 0000000000..7f77141b61 --- /dev/null +++ b/assets/common/loadout/dungeon/sea_chapel/cardinal.ron @@ -0,0 +1,14 @@ +#![enable(implicit_some)] +( + shoulders: Item("common.items.armor.cardinal.shoulder"), + chest: Item("common.items.armor.cardinal.chest"), + gloves: Item("common.items.armor.cardinal.hand"), + ring1: Item("common.items.armor.misc.ring.gold"), + ring2: Item("common.items.armor.misc.ring.gold"), + belt: Item("common.items.armor.cardinal.belt"), + legs: Item("common.items.armor.cardinal.pants"), + feet: Item("common.items.armor.cardinal.foot"), + lantern: Item("common.items.lantern.blue_0"), + neck: Item("common.items.armor.misc.neck.abyssal_gorget"), + +) \ No newline at end of file diff --git a/assets/common/loadout/dungeon/sea_chapel/sea_cleric.ron b/assets/common/loadout/dungeon/sea_chapel/sea_cleric.ron new file mode 100644 index 0000000000..53dccc043e --- /dev/null +++ b/assets/common/loadout/dungeon/sea_chapel/sea_cleric.ron @@ -0,0 +1,13 @@ +#![enable(implicit_some)] +( + head: Item("common.items.armor.misc.head.winged_coronet"), + shoulders: Item("common.items.armor.cloth.silken.shoulder"), + chest: Item("common.items.armor.cloth.silken.chest"), + gloves: Item("common.items.armor.cloth.silken.hand"), + ring1: Item("common.items.armor.misc.ring.gold"), + ring2: Item("common.items.armor.misc.ring.gold"), + belt: Item("common.items.armor.cloth.silken.belt"), + legs: Item("common.items.armor.cloth.silken.pants"), + feet: Item("common.items.armor.cloth.silken.foot"), + lantern: Item("common.items.lantern.blue_0"), +) \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron b/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron new file mode 100644 index 0000000000..d45657e9fb --- /dev/null +++ b/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron @@ -0,0 +1,5 @@ +[ + (0.5, Item("common.items.crafting_ing.abyssal_heart")), + (2.5, LootTable("common.loot_tables.food.prepared")), + (2.5, Item("common.items.crafting_ing.seashells")), +] \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron b/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron new file mode 100644 index 0000000000..e537aa6fbd --- /dev/null +++ b/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron @@ -0,0 +1,5 @@ +[ + // Ingredients + (0.5, Item("common.items.crafting_ing.coral_branch")), + (5.0, Item("common.items.crafting_ing.seashells")), +] \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron b/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron new file mode 100644 index 0000000000..e45ac3e322 --- /dev/null +++ b/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron @@ -0,0 +1,4 @@ +[ + (0.5, Item("common.items.crafting_ing.abyssal_heart")), + (5.0, LootTable("common.loot_tables.creature.quad_low.fanged")), +] \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/sea_cleric.ron b/assets/common/loot_tables/dungeon/sea_chapel/sea_cleric.ron new file mode 100644 index 0000000000..e18dccd5ec --- /dev/null +++ b/assets/common/loot_tables/dungeon/sea_chapel/sea_cleric.ron @@ -0,0 +1,4 @@ +[ + // Nothing + (1.0, Nothing), +] \ No newline at end of file diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index 5d3394342e..54c843d971 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -1201,6 +1201,10 @@ keyword: "hakulaq", generic: "Hakulaq" ), + dagon: ( + keyword: "dagon", + generic: "Dagon" + ), lavadrake: ( keyword: "lavadrake", generic: "Lava Drake" diff --git a/assets/common/recipe_book.ron b/assets/common/recipe_book.ron index b56ea50853..f9c9ee09bc 100644 --- a/assets/common/recipe_book.ron +++ b/assets/common/recipe_book.ron @@ -1723,6 +1723,15 @@ ], craft_sprite: None, ), + "abyssal gorget": ( + output: ("common.items.armor.misc.neck.abyssal_gorget", 1), + inputs: [ + (Item("common.items.crafting_ing.coral_branch"), 10, false), + (Item("common.items.crafting_ing.abyssal_heart"), 2, false), + (Item("common.items.crafting_ing.cloth.linen"), 2, false), + ], + craft_sprite: Some(CraftingBench), + ), "tin pickaxe": ( output: ("common.items.tool.pickaxe_stone", 1), inputs: [ @@ -2049,4 +2058,4 @@ craft_sprite: Some(Cauldron), is_recycling: false, ), -} +} \ No newline at end of file diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index ecd3f5bb22..d786aa3e08 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -450,6 +450,12 @@ ], threshold: 0.2, ), + Attack(BasicAura, Organ): ( + files: [ + "voxygen.audio.sfx.abilities.barrel_organ", + ], + threshold: 34.75, + ), //Attack(BasicRanged, Staff): ( // files: [ // "voxygen.audio.sfx.abilities.staff_channeling", @@ -588,7 +594,6 @@ ], threshold: 0.3, ), - // // Inventory // @@ -952,6 +957,13 @@ ], threshold: 1.0, ), + Utterance(Angry, SeaCrocodile): ( + files: [ + "voxygen.audio.sfx.utterance.sea_crocodile_angry1", + "voxygen.audio.sfx.utterance.sea_crocodile_angry2", + ], + threshold: 1.0, + ), Utterance(Angry, Antelope): ( files: [ "voxygen.audio.sfx.utterance.antelope_angry1", diff --git a/assets/voxygen/audio/sfx/abilities/barrel_organ.ogg b/assets/voxygen/audio/sfx/abilities/barrel_organ.ogg new file mode 100644 index 0000000000..4b9e3ae178 --- /dev/null +++ b/assets/voxygen/audio/sfx/abilities/barrel_organ.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4528a71f4c063e47db68fd047d40bbdc1f32ef11518eeba454f855cf774defad +size 253317 diff --git a/assets/voxygen/element/ui/map/buttons/sea_chapel.png b/assets/voxygen/element/ui/map/buttons/sea_chapel.png new file mode 100644 index 0000000000..7372ec0ca9 --- /dev/null +++ b/assets/voxygen/element/ui/map/buttons/sea_chapel.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8a3367f5a884f66e50eaaf9b248253a8b80a064da34ccef7aeb56140e0a4de6 +size 15856 diff --git a/assets/voxygen/element/ui/map/buttons/sea_chapel_bg.png b/assets/voxygen/element/ui/map/buttons/sea_chapel_bg.png new file mode 100644 index 0000000000..2dcbdd1cd0 --- /dev/null +++ b/assets/voxygen/element/ui/map/buttons/sea_chapel_bg.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00b86a830cb88748ca4c0c778fb5035ae6200bcec9e13e6c479e8c7da6e6cd32 +size 8617 diff --git a/assets/voxygen/element/ui/map/buttons/sea_chapel_hover.png b/assets/voxygen/element/ui/map/buttons/sea_chapel_hover.png new file mode 100644 index 0000000000..21ebcb25dc --- /dev/null +++ b/assets/voxygen/element/ui/map/buttons/sea_chapel_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9d34dcc9067ef480240b5ff8d378eae3639bb2a62b0aa7978f4003f635c4b24 +size 18257 diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl index 8314927865..e3151be8ae 100644 --- a/assets/voxygen/i18n/en/common.ftl +++ b/assets/voxygen/i18n/en/common.ftl @@ -70,6 +70,7 @@ common-weapons-staff_simple = Simple Staff common-weapons-axe_simple = Simple Axe common-weapons-bow_simple = Simple Bow common-weapons-unique = Unique +common-weapons-organ = Organ common-tool-debug = Debug common-tool-farming = Farming Tool common-tool-pick = Pickaxe diff --git a/assets/voxygen/i18n/en/common.ron b/assets/voxygen/i18n/en/common.ron new file mode 100644 index 0000000000..5736ac36bf --- /dev/null +++ b/assets/voxygen/i18n/en/common.ron @@ -0,0 +1,130 @@ +/// WARNING: Localization files shall be saved in UTF-8 format without BOM + +/// Localization for "global" English +( + string_map: { + // Texts used in multiple locations with the same formatting + "common.username": "username", + "common.singleplayer": "Singleplayer", + "common.multiplayer": "Multiplayer", + "common.servers": "Servers", + "common.quit": "Quit", + "common.settings": "Settings", + "common.languages": "Languages", + "common.interface": "Interface", + "common.gameplay": "Gameplay", + "common.controls": "Controls", + "common.video": "Graphics", + "common.sound": "Sound", + "common.chat": "Chat", + "common.resume": "Resume", + "common.characters": "Characters", + "common.close": "Close", + "common.yes": "Yes", + "common.no": "No", + "common.back": "Back", + "common.create": "Create", + "common.okay": "Okay", + "common.add": "Add", + "common.accept": "Accept", + "common.decline": "Decline", + "common.disclaimer": "Disclaimer", + "common.cancel": "Cancel", + "common.none": "None", + "common.error": "Error", + "common.fatal_error": "Fatal Error", + "common.you": "You", + "common.automatic": "Auto", + "common.random": "Random", + "common.empty": "Empty", + "common.confirm": "Confirm", + "common.delete_server": "Delete Server", + + // Settings Window title + "common.interface_settings": "Interface Settings", + "common.gameplay_settings": "Gameplay Settings", + "common.controls_settings": "Controls Settings", + "common.video_settings": "Graphics Settings", + "common.sound_settings": "Sound Settings", + "common.language_settings": "Language Settings", + "common.chat_settings": "Chat Settings", + + // Message when connection to the server is lost + "common.connection_lost": r#"Connection lost! +Did the server restart? +Is the client up to date?"#, + + + "common.species.orc": "Orc", + "common.species.human": "Human", + "common.species.dwarf": "Dwarf", + "common.species.elf": "Elf", + "common.species.draugr": "Draugr", + "common.species.danari": "Danari", + + "common.weapons.axe": "Axe", + "common.weapons.dagger": "Dagger", + "common.weapons.greatsword": "Greatsword", + "common.weapons.shortswords": "Shortswords", + "common.weapons.sword": "Sword", + "common.weapons.staff": "Firestaff", + "common.weapons.bow": "Bow", + "common.weapons.hammer": "Hammer", + "common.weapons.general": "General Combat", + "common.weapons.sceptre": "Healing Sceptre", + "common.weapons.shield": "Shield", + "common.weapons.spear": "Spear", + "common.weapons.hammer_simple": "Simple Hammer", + "common.weapons.sword_simple": "Simple Sword", + "common.weapons.staff_simple": "Simple Staff", + "common.weapons.axe_simple": "Simple Axe", + "common.weapons.bow_simple": "Simple Bow", + "common.weapons.unique": "Unique", + "common.tool.debug": "Debug", + "common.tool.farming": "Farming Tool", + "common.tool.pick": "Pickaxe", + "common.tool.mining": "Mining", + "common.kind.modular_component": "Modular Component", + "common.kind.modular_component_partial": "Component", + "common.kind.glider": "Glider", + "common.kind.consumable": "Consumable", + "common.kind.throwable": "Can be thrown", + "common.kind.utility": "Utility", + "common.kind.ingredient": "Ingredient", + "common.kind.lantern": "Lantern", + "common.hands.one": "One-Handed", + "common.hands.two": "Two-Handed", + + "common.rand_appearance": "Random appearance", + "common.rand_name": "Random name", + + "common.stats.combat_rating": "CR", + "common.stats.power": "Power", + "common.stats.speed": "Speed", + "common.stats.poise": "Poise", + "common.stats.range": "Range", + "common.stats.energy_efficiency": "Energy Efficiency", + "common.stats.buff_strength": "Buff/Debuff Strength", + "common.stats.crit_chance": "Crit Chance", + "common.stats.crit_mult": "Crit Mult", + "common.stats.armor": "Armor", + "common.stats.poise_res":"Stun Res", + "common.stats.energy_max": "Max Energy", + "common.stats.energy_reward": "Energy Reward", + "common.stats.crit_power": "Crit Power", + "common.stats.stealth": "Stealth", + "common.stats.slots": "Slots", + + "common.material.metal": "Metal", + "common.material.wood": "Wood", + "common.material.stone": "Stone", + "common.material.cloth": "Cloth", + "common.material.hide": "Hide", + + "common.sprite.chest": "Chest", + }, + + + vector_map: { + } +) diff --git a/assets/voxygen/i18n/en/hud/map.ftl b/assets/voxygen/i18n/en/hud/map.ftl index 94a01a061d..8f7635164e 100644 --- a/assets/voxygen/i18n/en/hud/map.ftl +++ b/assets/voxygen/i18n/en/hud/map.ftl @@ -31,4 +31,5 @@ hud-map-zoom_minimap_explanation = Zoom in the Minimap to see the area around you in higher detail hud-map-gnarling = Gnarling Fortification +hud-map-chapel_site = Sea Chapel hud-map-placed_by = Placed by { $name } \ No newline at end of file diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index d28341f06b..19c8d54197 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -2018,6 +2018,31 @@ "voxel.armor.misc.foot.jackalope", (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, ), + //Cardinal Set + Simple("common.items.armor.cardinal.chest"): VoxTrans( + "voxel.armor.cardinal.chest", + (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Simple("common.items.armor.cardinal.pants"): VoxTrans( + "voxel.armor.cardinal.pants", + (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.cardinal.belt"): VoxTrans( + "voxel.armor.cardinal.belt", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.cardinal.foot"): VoxTrans( + "voxel.armor.cardinal.foot", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.cardinal.hand"): VoxTrans( + "voxel.armor.cardinal.hand", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.cardinal.shoulder"): VoxTrans( + "voxel.armor.cardinal.shoulder", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 1.0, + ), //Twig Set Simple("common.items.armor.twigs.chest"): VoxTrans( "voxel.armor.twigs.chest", @@ -2915,6 +2940,10 @@ "voxel.armor.misc.neck.scratched", (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, ), + Simple("common.items.armor.misc.neck.abyssal_gorget"): VoxTrans( + "voxel.armor.misc.neck.abyssal_gorget", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), // Tabards Simple("common.items.armor.misc.tabard.admin"): VoxTrans( @@ -3486,6 +3515,14 @@ "voxel.sprite.wood.item.wood", (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.8, ), + Simple("common.items.crafting_ing.abyssal_heart"): VoxTrans( + "voxel.sprite.crafting_ing.abyssal_heart", + (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Simple("common.items.crafting_ing.coral_branch"): VoxTrans( + "voxel.sprite.crafting_ing.coral_branch", + (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), // Gliders Simple("common.items.glider.cloverleaf"): VoxTrans( "voxel.glider.starter", diff --git a/assets/voxygen/voxel/armor/cardinal/belt.vox b/assets/voxygen/voxel/armor/cardinal/belt.vox new file mode 100644 index 0000000000..aa8ca54805 --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/belt.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03b5851769e677fb79da2a4ff27ec6d23bffa0d410dacab24bafba1189a709a2 +size 1496 diff --git a/assets/voxygen/voxel/armor/cardinal/chest.vox b/assets/voxygen/voxel/armor/cardinal/chest.vox new file mode 100644 index 0000000000..92bc90ab19 --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d1f424de34c80001ca69a097e78a837f6f1c5e2d794f185ced1e6c62396c452 +size 2880 diff --git a/assets/voxygen/voxel/armor/cardinal/foot.vox b/assets/voxygen/voxel/armor/cardinal/foot.vox new file mode 100644 index 0000000000..9971125def --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/foot.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38d8eb73c514400d00ff1205a375525ce37c9df7e77b73572e1986c4dcdd64a2 +size 1580 diff --git a/assets/voxygen/voxel/armor/cardinal/hand.vox b/assets/voxygen/voxel/armor/cardinal/hand.vox new file mode 100644 index 0000000000..2d756f0a07 --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/hand.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe7989bb326d88e51aa8c4373d2cc90c09c8bb64e8e857bc6490121ad784e58c +size 1396 diff --git a/assets/voxygen/voxel/armor/cardinal/pants.vox b/assets/voxygen/voxel/armor/cardinal/pants.vox new file mode 100644 index 0000000000..f887986165 --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/pants.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e6b0d6f1a282b653da07c84d3af556fd6624f2f02c49c2aec8e55fdb6f8589a +size 2104 diff --git a/assets/voxygen/voxel/armor/cardinal/shoulder.vox b/assets/voxygen/voxel/armor/cardinal/shoulder.vox new file mode 100644 index 0000000000..e8e919ea6b --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/shoulder.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1f73335cdb76c0bbddd9b1b7cac7eb4d3dfde74864a6e704503e6345c9871a0 +size 1360 diff --git a/assets/voxygen/voxel/armor/misc/neck/abyssal_gorget.vox b/assets/voxygen/voxel/armor/misc/neck/abyssal_gorget.vox new file mode 100644 index 0000000000..8dcfac51ac --- /dev/null +++ b/assets/voxygen/voxel/armor/misc/neck/abyssal_gorget.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eea39e850a3aa2f66d0fe7fe85a014be55cf6afdaa8007f4fb5eeac8f2833908 +size 1380 diff --git a/assets/voxygen/voxel/biped_weapon_manifest.ron b/assets/voxygen/voxel/biped_weapon_manifest.ron index 2f0fa64e57..a06dc48981 100644 --- a/assets/voxygen/voxel/biped_weapon_manifest.ron +++ b/assets/voxygen/voxel/biped_weapon_manifest.ron @@ -1529,6 +1529,10 @@ vox_spec: ("armor.empty", (-3.0, -3.5, 1.0)), color: None ), + Tool("common.items.npc_weapons.unique.cardinal"): ( + vox_spec: ("weapon.sceptre.caduceus", (-2.5, -4.5, -6.0)), + color: None + ), //BIPEDLARGE Tool("common.items.npc_weapons.hammer.ogre_hammer"): ( vox_spec: ("weapon.hammer.2hhammer_ogre", (-5.0, -5.5, -7.0)), diff --git a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron index 69212f2ae1..768255cc0a 100644 --- a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron @@ -172,6 +172,10 @@ vox_spec: ("armor.mail.orichalcum.belt", (-4.0, -3.5, 1.0)), color: None ), + "common.items.armor.cardinal.belt": ( + vox_spec: ("armor.cardinal.belt", (-4.0, -3.8, 1.3)), + color: None + ), "common.items.armor.merchant.belt": ( vox_spec: ("armor.merchant.belt", (-5.0, -4.0, 2.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron index f9e9d49786..6f058cf5b6 100644 --- a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron @@ -242,6 +242,10 @@ vox_spec: ("armor.mail.orichalcum.chest", (-7.0, -4.0, 1.0)), color: None ), + "common.items.armor.cardinal.chest": ( + vox_spec: ("armor.cardinal.chest", (-7.0, -4.0, 1.0)), + color: None + ), "common.items.armor.merchant.chest": ( vox_spec: ("armor.merchant.chest", (-7.0, -4.0, 1.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron b/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron index d4b95c17d3..646bc47c2e 100644 --- a/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron @@ -160,6 +160,10 @@ vox_spec: ("armor.mail.orichalcum.foot", (-2.5, -3.5, -2.0)), color: None ), + "common.items.armor.cardinal.foot": ( + vox_spec: ("armor.cardinal.foot",(-2.5, -3.5, -2.0)), + color: None + ), "common.items.armor.merchant.foot": ( vox_spec: ("armor.merchant.foot", (-2.5, -3.5, -2.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron b/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron index b4ca981c87..3a961a1f7d 100644 --- a/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron @@ -380,6 +380,16 @@ color: None ) ), + "common.items.armor.cardinal.hand": ( + left: ( + vox_spec: ("armor.cardinal.hand", (-2.5, -2.5, -4.0)), + color: None + ), + right: ( + vox_spec: ("armor.cardinal.hand", (-1.5, -2.5, -4.0)), + color: None + ) + ), "common.items.armor.merchant.hand": ( left: ( vox_spec: ("armor.merchant.hand", (-2.5, -2.0, -4.0)), diff --git a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron index eedc856df7..09b36eb831 100644 --- a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron @@ -200,6 +200,10 @@ vox_spec: ("armor.mail.orichalcum.pants", (-6.0, -4.0, 0.5)), color: None ), + "common.items.armor.cardinal.pants": ( + vox_spec: ("armor.cardinal.pants", (-5.0, -4.0, -0.4)), + color: None + ), "common.items.armor.merchant.pants": ( vox_spec: ("armor.merchant.pants", (-6.0, -4.0, 0.5)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron b/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron index 25509a2cc3..c305c92f29 100644 --- a/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron @@ -451,6 +451,16 @@ color: None ) ), + "common.items.armor.cardinal.shoulder": ( + left: ( + vox_spec: ("armor.cardinal.shoulder", (-5.0, -4.0, -2.0)), + color: None + ), + right: ( + vox_spec: ("armor.empty", (-0.5, -4.0, -2.0)), + color: None + ) + ), "common.items.armor.merchant.shoulder": ( left: ( vox_spec: ("armor.merchant.shoulder_l", (-3.0, -4.0 , -8.0)), diff --git a/assets/voxygen/voxel/item_drop_manifest.ron b/assets/voxygen/voxel/item_drop_manifest.ron index 87947b2ed9..ff916912ba 100644 --- a/assets/voxygen/voxel/item_drop_manifest.ron +++ b/assets/voxygen/voxel/item_drop_manifest.ron @@ -734,6 +734,7 @@ Simple("common.items.armor.misc.neck.gem_of_resilience"): "voxel.armor.misc.neck.resilience_gem", Simple("common.items.armor.misc.neck.shell"): "voxel.armor.misc.neck.shell", Simple("common.items.armor.misc.neck.amethyst"): "voxel.armor.misc.neck.amethyst", + Simple("common.items.armor.misc.neck.abyssal_gorget"): "voxel.armor.misc.neck.abyssal_gorget", Simple("common.items.armor.misc.neck.diamond"): "voxel.armor.misc.neck.diamond", Simple("common.items.armor.cultist.necklace"): "voxel.armor.cultist.necklace", Simple("common.items.armor.misc.neck.ruby"): "voxel.armor.misc.neck.ruby", @@ -844,6 +845,8 @@ Simple("common.items.crafting_ing.animal_misc.grim_eyeball"): "voxel.sprite.crafting_ing.animal_misc.grim_eyeball", Simple("common.items.flowers.plant_fiber"): "voxel.sprite.crafting_ing.plant_fiber", Simple("common.items.flowers.moonbell"): "voxel.sprite.flowers.moonbell", + Simple("common.items.crafting_ing.abyssal_heart"): "voxel.sprite.crafting_ing.abyssal_heart", + Simple("common.items.crafting_ing.coral_branch"): "voxel.sprite.crafting_ing.coral_branch", Simple("common.items.flowers.pyrebloom"): "voxel.sprite.flowers.pyrebloom", Simple("common.items.flowers.wild_flax"): "voxel.sprite.flowers.flax", Simple("common.items.crafting_ing.cotton_boll"): "voxel.sprite.crafting_ing.cotton_boll", diff --git a/assets/voxygen/voxel/npc/dagon/male/chest.vox b/assets/voxygen/voxel/npc/dagon/male/chest.vox new file mode 100644 index 0000000000..8604dc3082 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5f6fecc2fd3c10f80761123a1c29b7330c3142229ad27313721d3383d1a8871 +size 7656 diff --git a/assets/voxygen/voxel/npc/dagon/male/foot_br.vox b/assets/voxygen/voxel/npc/dagon/male/foot_br.vox new file mode 100644 index 0000000000..7f6ff730ce --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/foot_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf299b185164db1bc5fc274f9c4fe3a9a5c470b393a69859201593d91e7d3e9c +size 1740 diff --git a/assets/voxygen/voxel/npc/dagon/male/foot_fr.vox b/assets/voxygen/voxel/npc/dagon/male/foot_fr.vox new file mode 100644 index 0000000000..aa5ef293ed --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/foot_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f0ce90b8983a15b8a7ca37463933a7dff62f958ded16fc38c6a2bdd3b93886c +size 2104 diff --git a/assets/voxygen/voxel/npc/dagon/male/head_lower.vox b/assets/voxygen/voxel/npc/dagon/male/head_lower.vox new file mode 100644 index 0000000000..3cf7d672ca --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/head_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20d4958d6487dbd3f082474bf1ff26252ed80c3e1f24657781121c2a64e9e224 +size 4120 diff --git a/assets/voxygen/voxel/npc/dagon/male/head_upper.vox b/assets/voxygen/voxel/npc/dagon/male/head_upper.vox new file mode 100644 index 0000000000..2d61bdd7bd --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/head_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7c7b2d74b235314b12e7f54e26764cef723f9cee4aac9badea6f61d3dbc5e8c +size 3188 diff --git a/assets/voxygen/voxel/npc/dagon/male/jaw.vox b/assets/voxygen/voxel/npc/dagon/male/jaw.vox new file mode 100644 index 0000000000..5f25f5ef93 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e318aa86d561727dc3ea63144233de2edaa8ff0a009a81927e97326e6c5e90f +size 2168 diff --git a/assets/voxygen/voxel/npc/dagon/male/tail_front.vox b/assets/voxygen/voxel/npc/dagon/male/tail_front.vox new file mode 100644 index 0000000000..9202436281 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1af8558fc0586a724f91a1a7501d2a5ccb4ee98fd2d7820e9c50c865c3419b6d +size 2128 diff --git a/assets/voxygen/voxel/npc/dagon/male/tail_rear.vox b/assets/voxygen/voxel/npc/dagon/male/tail_rear.vox new file mode 100644 index 0000000000..74a9af0469 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagon/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:619baee168e170990d2da0a7e7148fab0ce6fcb242caeb39fc87382f248dc0c4 +size 2228 diff --git a/assets/voxygen/voxel/object/dagon_bomb.vox b/assets/voxygen/voxel/object/dagon_bomb.vox new file mode 100644 index 0000000000..680ad33039 --- /dev/null +++ b/assets/voxygen/voxel/object/dagon_bomb.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aba33e8577174796ac831af8a5befa1eac3aab4b337cf5242e92ac74e4c8f0b6 +size 2284 diff --git a/assets/voxygen/voxel/object/sea_urchin.vox b/assets/voxygen/voxel/object/sea_urchin.vox new file mode 100644 index 0000000000..8fb919a064 --- /dev/null +++ b/assets/voxygen/voxel/object/sea_urchin.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1291b6ce35372547f55f34555213a4e7ae143555b06ec0bc52c044d77540ffd1 +size 1660 diff --git a/assets/voxygen/voxel/object/seashell_lantern.vox b/assets/voxygen/voxel/object/seashell_lantern.vox new file mode 100644 index 0000000000..24e6f2d872 --- /dev/null +++ b/assets/voxygen/voxel/object/seashell_lantern.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:073ae7d89a5118abc445638ccb266effa6344c6f4a48b853698b20563fd91b1d +size 1884 diff --git a/assets/voxygen/voxel/object_manifest.ron b/assets/voxygen/voxel/object_manifest.ron index bc56ce1b90..548d5a8bd9 100644 --- a/assets/voxygen/voxel/object_manifest.ron +++ b/assets/voxygen/voxel/object_manifest.ron @@ -19,6 +19,16 @@ central: ("armor.empty"), ) ), + DagonBomb: ( + bone0: ( + offset: (-5.5, -5.5, 0.0), + central: ("object.dagon_bomb"), + ), + bone1: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ) + ), FireworkBlue: ( bone0: ( offset: (0.0, 0.0, 0.0), @@ -249,6 +259,16 @@ central: ("armor.empty"), ) ), + BarrelOrgan: ( + bone0: ( + offset: (-9.0, -10.0, 0.0), + central: ("sprite.misc.barrel_organ"), + ), + bone1: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ) + ), LanternGround: ( bone0: ( offset: (-3.5, -3.5, 0.0), diff --git a/assets/voxygen/voxel/quadruped_low_central_manifest.ron b/assets/voxygen/voxel/quadruped_low_central_manifest.ron index 6ff66eec07..c1d95b2214 100644 --- a/assets/voxygen/voxel/quadruped_low_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_low_central_manifest.ron @@ -572,6 +572,58 @@ central: ("npc.hakulaq.male.tail_front"), ), ), + (Dagon, Male): ( + upper: ( + offset: (-4.5, 2.5, -13.0), + central: ("npc.dagon.male.head_upper"), + ), + lower: ( + offset: (-4.5, -10.0, -10.5), + central: ("npc.dagon.male.head_lower"), + ), + jaw: ( + offset: (-3.5, 11.5, -13.0), + central: ("npc.dagon.male.jaw"), + ), + chest: ( + offset: (-4.5, -8.0, -10.5), + central: ("npc.dagon.male.chest"), + ), + tail_rear: ( + offset: (-0.5, -31.0, -8.0), + central: ("npc.dagon.male.tail_rear"), + ), + tail_front: ( + offset: (-1.5, -12.0, -10.0), + central: ("npc.dagon.male.tail_front"), + ), + ), + (Dagon, Female): ( + upper: ( + offset: (-4.5, 2.5, -13.0), + central: ("npc.dagon.male.head_upper"), + ), + lower: ( + offset: (-4.5, -10.0, -10.5), + central: ("npc.dagon.male.head_lower"), + ), + jaw: ( + offset: (-3.5, 11.5, -13.0), + central: ("npc.dagon.male.jaw"), + ), + chest: ( + offset: (-4.5, -8.0, -10.5), + central: ("npc.dagon.male.chest"), + ), + tail_rear: ( + offset: (-0.5, -31.0, -8.0), + central: ("npc.dagon.male.tail_rear"), + ), + tail_front: ( + offset: (-1.5, -12.0, -10.0), + central: ("npc.dagon.male.tail_front"), + ), + ), (Sandshark, Male): ( upper: ( offset: (-5.5, -8.0, -5.0), diff --git a/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron index d39d73d77f..26e1b3a8b8 100644 --- a/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron @@ -395,6 +395,42 @@ lateral: ("npc.hakulaq.male.foot_br", false), ), ), + (Dagon, Male): ( + front_left: ( + offset: (-9.0, 5.0, -9.0), + lateral: ("npc.dagon.male.foot_fr", false), + ), + front_right: ( + offset: (-2.0, 5.0, -9.0), + lateral: ("npc.dagon.male.foot_fr", false), + ), + back_left: ( + offset: (-11.0, 3.0, -9.0), + lateral: ("npc.dagon.male.foot_br", false), + ), + back_right: ( + offset: (0.0, 3.0, -9.0), + lateral: ("npc.dagon.male.foot_br", false), + ), + ), + (Dagon, Female): ( + front_left: ( + offset: (-9.0, 5.0, -9.0), + lateral: ("npc.dagon.male.foot_fr", false), + ), + front_right: ( + offset: (-2.0, 5.0, -9.0), + lateral: ("npc.dagon.male.foot_fr", false), + ), + back_left: ( + offset: (-11.0, 3.0, -9.0), + lateral: ("npc.dagon.male.foot_br", false), + ), + back_right: ( + offset: (0.0, 3.0, -9.0), + lateral: ("npc.dagon.male.foot_br", false), + ), + ), (Sandshark, Male): ( front_left: ( offset: (-17.0, 0.0, -12.0), diff --git a/assets/voxygen/voxel/sprite/chests/chest_coral.vox b/assets/voxygen/voxel/sprite/chests/chest_coral.vox new file mode 100644 index 0000000000..920228e4ac --- /dev/null +++ b/assets/voxygen/voxel/sprite/chests/chest_coral.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a5f5487e2271538e3f94ddec587f4477e7b459615b0259dce608ef645bc00ab +size 5336 diff --git a/assets/voxygen/voxel/sprite/crafting_ing/abyssal_heart.vox b/assets/voxygen/voxel/sprite/crafting_ing/abyssal_heart.vox new file mode 100644 index 0000000000..c3bfbc62fd --- /dev/null +++ b/assets/voxygen/voxel/sprite/crafting_ing/abyssal_heart.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7692822b93e1ea3c08479e4b7a105da17b0d4f9bd65c8135f6f489c7be4bb0d +size 1960 diff --git a/assets/voxygen/voxel/sprite/crafting_ing/coral_branch.vox b/assets/voxygen/voxel/sprite/crafting_ing/coral_branch.vox new file mode 100644 index 0000000000..3a19f953af --- /dev/null +++ b/assets/voxygen/voxel/sprite/crafting_ing/coral_branch.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5fb3144793a6d802316679bbac79a6e545be11b93115192ede3734491dced60 +size 1176 diff --git a/assets/voxygen/voxel/sprite/misc/barrel_organ.vox b/assets/voxygen/voxel/sprite/misc/barrel_organ.vox new file mode 100644 index 0000000000..a8031e84a1 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/barrel_organ.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c541a8126216c0f50a26502e3e5d8523300a593f0d6edbda154f2d185f3b6040 +size 12984 diff --git a/assets/voxygen/voxel/sprite/misc/glass_barrier.vox b/assets/voxygen/voxel/sprite/misc/glass_barrier.vox new file mode 100644 index 0000000000..db51993d70 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/glass_barrier.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4447a9680c0a2401e400203f10171e345e2ccfde4a96e5ef9e6384ae7efabe7e +size 2268 diff --git a/assets/voxygen/voxel/sprite/misc/rope.vox b/assets/voxygen/voxel/sprite/misc/rope.vox new file mode 100644 index 0000000000..41d9406d23 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/rope.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1930c55aa200d5a3ca17c73f2bde240e6d2c498173b3514c33d33b554623364 +size 1888 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_block.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_block.vox new file mode 100644 index 0000000000..07cbd29bec --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_block.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4709c5acc8fcc98d332749c5e4b327df63d5e88e625080edc4427ec193229c17 +size 6420 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_chain.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_chain.vox new file mode 100644 index 0000000000..c3567de471 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_chain.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a025c97a09ffd4d91b11fe27963fa0c9faf17da89445da5671d0493ce4eb999 +size 1232 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox new file mode 100644 index 0000000000..7e851a1cd1 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd98c7f9a687f04ff235ba58afd5987c9a08843db24b7293f9a4bf6e9672b253 +size 3368 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-0.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-0.vox new file mode 100644 index 0000000000..68006dc889 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-0.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8331d89f4bbfd0e26fea06072a83f829756d44ffa06ca00bb8fe0ab9d8bdfcf0 +size 6920 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-1.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-1.vox new file mode 100644 index 0000000000..4ceff39e72 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-1.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3ff9529a4478ee747772696d9e8859757d2fb4af2a833c5471378a06f9f17ad +size 6788 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-2.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-2.vox new file mode 100644 index 0000000000..c268c9bc2a --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-2.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c60a387315db09de6f0ae888f12fc4b97598f79607acf4350fe59afa73fc450f +size 7168 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-3.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-3.vox new file mode 100644 index 0000000000..e6cad95023 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-3.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2d53fdf83f15f6713391865eb34671a1e0f11e632353838815e6f3343c1175b +size 7376 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-4.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-4.vox new file mode 100644 index 0000000000..339b87602b --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-4.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b0fcb10b46981f074eb371212d619562a3c391efd93fefa33934d3491f6d2ae +size 4360 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-5.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-5.vox new file mode 100644 index 0000000000..2c32907b17 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-5.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fd2e94e58760635299b5f68ffac6db78c79a87b372da9f8ba79400350b1861d +size 4348 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-6.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-6.vox new file mode 100644 index 0000000000..42cb5b07d3 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-6.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfa516c88e0c07875ef2efb3142b37fd02b602d1a5482d1f5ea08f37951bfb10 +size 4364 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-7.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-7.vox new file mode 100644 index 0000000000..07d62a9b10 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_pillar-7.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:258a9a317a58d5b4f2ed7146ea3768f36b717e0d3989a2947900066151652443 +size 4348 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_window_hor.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_window_hor.vox new file mode 100644 index 0000000000..cd025c929f --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_window_hor.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:432c81b08d1e74dad147fec4104f6bbeb02566619fd710cb465a61faa5188bec +size 1240 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_window_ver.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_window_ver.vox new file mode 100644 index 0000000000..aed7ca6523 --- /dev/null +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_window_ver.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a79b159c7560e94e4c6d7d0a425347b027a09604b50df3b42922287141305163 +size 1240 diff --git a/assets/voxygen/voxel/sprite_manifest.ron b/assets/voxygen/voxel/sprite_manifest.ron index c4439fba25..50b3486c02 100644 --- a/assets/voxygen/voxel/sprite_manifest.ron +++ b/assets/voxygen/voxel/sprite_manifest.ron @@ -864,6 +864,151 @@ DungeonChest5: Some(( ], wind_sway: 0.0, )), +// Rope +Rope: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.rope", + offset: (-5.5, -5.5, -0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Coral Chest +CoralChest: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.chests.chest_coral", + offset: (-7.0, -5.0, -0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Sea DecorChain +SeaDecorChain: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.sea_decor_chain", + offset: (-5.5, -5.5, -0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Sea DecorBlock +SeaDecorBlock: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.sea_decor_block", + offset: (-5.5, -5.5, -0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Sea DecorWindow Horizontal +SeaDecorWindowHor: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.sea_decor_window_hor", + offset: (-5.5, -5.5, -0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Sea DecorWindow Vertical +SeaDecorWindowVer: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.sea_decor_window_ver", + offset: (-5.5, -5.5, -0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Sea Decor Emblem +SeaDecorEmblem: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.sea_decor_emblem", + offset: (-5.5, -5.5, -4.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// Sea Decor Pillar +SeaDecorPillar: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-0", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-1", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-2", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-3", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-4", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-5", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-6", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ( + model: "voxygen.voxel.sprite.misc.sea_decor_pillar-7", + offset: (-5.5, -5.5, 0.0), + lod_axes: (1.0, 1.0, 1.0), + ), + ], + wind_sway: 0.0, +)), +// SeashellLantern +SeashellLantern: Some(( + variations: [ + ( + model: "voxygen.voxel.object.seashell_lantern", + offset: (-4.5, -4.5, 0.0), + lod_axes: (0.0, 0.0, 0.0), + ), + ], + wind_sway: 0.0, +)), +// GlassBarrier +GlassBarrier: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.misc.glass_barrier", + offset: (-5.5, -5.5, 0.0), + lod_axes: (0.0, 0.0, 0.0), + ), + ], + wind_sway: 0.0, +)), // Welwitch Welwitch: Some(( variations: [ @@ -3617,6 +3762,17 @@ EnsnaringVines: Some(( ], wind_sway: 0.0, )), +// Sea Urchin +SeaUrchin: Some(( + variations: [ + ( + model: "voxygen.voxel.object.sea_urchin", + offset: (-5.0, -6.5, 0.0), + lod_axes: (0.0, 0.0, 0.0), + ), + ], + wind_sway: 0.0, +)), // WitchWindow WitchWindow: Some(( variations: [ diff --git a/common/net/src/msg/world_msg.rs b/common/net/src/msg/world_msg.rs index e92740b9fc..1ab33ee89c 100644 --- a/common/net/src/msg/world_msg.rs +++ b/common/net/src/msg/world_msg.rs @@ -145,6 +145,7 @@ pub enum SiteKind { Cave, Tree, Gnarling, + ChapelSite, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/common/src/bin/csv_export/main.rs b/common/src/bin/csv_export/main.rs index f802d2ed2c..b67d00b93b 100644 --- a/common/src/bin/csv_export/main.rs +++ b/common/src/bin/csv_export/main.rs @@ -175,6 +175,7 @@ fn get_tool_kind(kind: &ToolKind) -> String { ToolKind::Farming => "Farming".to_string(), ToolKind::Pick => "Pick".to_string(), ToolKind::Natural => "Natural".to_string(), + ToolKind::Organ => "Organ".to_string(), ToolKind::Empty => "Empty".to_string(), } } diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index af15ed8991..1b84fa7122 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -735,6 +735,7 @@ impl Body { Body::Object(object) => match object { object::Body::TrainingDummy => 1000, object::Body::Crossbow => 80, + object::Body::BarrelOrgan => 500, object::Body::HaniwaSentry => 60, object::Body::SeaLantern => 100, object::Body::GnarlingTotemGreen => 25, @@ -766,6 +767,7 @@ impl Body { quadruped_low::Species::Maneater => 130, quadruped_low::Species::Sandshark => 110, quadruped_low::Species::Hakulaq => 120, + quadruped_low::Species::Dagon => 1200, quadruped_low::Species::Lavadrake => 160, quadruped_low::Species::Basilisk => 200, quadruped_low::Species::Deadwood => 120, @@ -831,6 +833,7 @@ impl Body { ) ) }, + BuffKind::ProtectingWard => matches!(self, Body::Object(object::Body::BarrelOrgan)), _ => false, } } diff --git a/common/src/comp/body/object.rs b/common/src/comp/body/object.rs index a351c345e5..3865b4fbd4 100644 --- a/common/src/comp/body/object.rs +++ b/common/src/comp/body/object.rs @@ -98,6 +98,8 @@ make_case_elim!( GnarlingTotemRed = 83, GnarlingTotemGreen = 84, GnarlingTotemWhite = 85, + DagonBomb = 86, + BarrelOrgan = 87, } ); @@ -108,7 +110,7 @@ impl Body { } } -pub const ALL_OBJECTS: [Body; 86] = [ +pub const ALL_OBJECTS: [Body; 88] = [ Body::Arrow, Body::Bomb, Body::Scarecrow, @@ -195,6 +197,8 @@ pub const ALL_OBJECTS: [Body; 86] = [ Body::GnarlingTotemRed, Body::GnarlingTotemWhite, Body::GnarlingTotemGreen, + Body::DagonBomb, + Body::BarrelOrgan, ]; impl From for super::Body { @@ -290,6 +294,8 @@ impl Body { Body::GnarlingTotemRed => "gnarling_totem_red", Body::GnarlingTotemGreen => "gnarling_totem_green", Body::GnarlingTotemWhite => "gnarling_totem_white", + Body::DagonBomb => "dagon_bomb", + Body::BarrelOrgan => "barrel_organ", } } @@ -307,9 +313,12 @@ impl Body { pub fn density(&self) -> Density { let density = match self { Body::Anvil | Body::Cauldron => IRON_DENSITY, - Body::Arrow | Body::ArrowSnake | Body::ArrowTurret | Body::MultiArrow | Body::Dart => { - 500.0 - }, + Body::Arrow + | Body::ArrowSnake + | Body::ArrowTurret + | Body::MultiArrow + | Body::Dart + | Body::DagonBomb => 500.0, Body::Bomb => 2000.0, // I have no idea what it's supposed to be Body::Crate => 300.0, // let's say it's a lot of wood and maybe some contents Body::Scarecrow => 900.0, @@ -337,10 +346,10 @@ impl Body { | Body::BoltNature | Body::BoltIcicle | Body::SpitPoison => 1.0, - Body::Bomb => { + Body::Bomb | Body::DagonBomb => { 0.5 * IRON_DENSITY * std::f32::consts::PI / 6.0 * self.dimensions().x.powi(3) }, - Body::Campfire | Body::CampfireLit => 300.0, + Body::Campfire | Body::CampfireLit | Body::BarrelOrgan => 300.0, Body::Carpet | Body::CarpetHumanRound | Body::CarpetHumanSquare @@ -420,6 +429,7 @@ impl Body { Body::GnarlingTotemRed | Body::GnarlingTotemGreen | Body::GnarlingTotemWhite => { Vec3::new(0.8, 0.8, 1.4) }, + Body::BarrelOrgan => Vec3::new(4.0, 2.0, 3.0), // FIXME: this *must* be exhaustive match _ => Vec3::broadcast(0.5), } diff --git a/common/src/comp/body/quadruped_low.rs b/common/src/comp/body/quadruped_low.rs index 9a432e721b..e779d70c5d 100644 --- a/common/src/comp/body/quadruped_low.rs +++ b/common/src/comp/body/quadruped_low.rs @@ -55,6 +55,7 @@ make_case_elim!( Deadwood = 13, Icedrake = 14, SeaCrocodile = 15, + Dagon = 16, } ); @@ -75,6 +76,7 @@ pub struct AllSpecies { pub maneater: SpeciesMeta, pub sandshark: SpeciesMeta, pub hakulaq: SpeciesMeta, + pub dagon: SpeciesMeta, pub lavadrake: SpeciesMeta, pub basilisk: SpeciesMeta, pub deadwood: SpeciesMeta, @@ -99,6 +101,7 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Maneater => &self.maneater, Species::Sandshark => &self.sandshark, Species::Hakulaq => &self.hakulaq, + Species::Dagon => &self.dagon, Species::Lavadrake => &self.lavadrake, Species::Basilisk => &self.basilisk, Species::Deadwood => &self.deadwood, @@ -107,7 +110,7 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies } } -pub const ALL_SPECIES: [Species; 16] = [ +pub const ALL_SPECIES: [Species; 17] = [ Species::Crocodile, Species::SeaCrocodile, Species::Alligator, @@ -120,6 +123,7 @@ pub const ALL_SPECIES: [Species; 16] = [ Species::Maneater, Species::Sandshark, Species::Hakulaq, + Species::Dagon, Species::Lavadrake, Species::Basilisk, Species::Deadwood, diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index ed61131771..43b7b54fbc 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -34,6 +34,7 @@ pub enum ToolKind { /// Intended for invisible weapons (e.g. a creature using its claws or /// biting) Natural, + Organ, /// This is an placeholder item, it is used by non-humanoid npcs to attack Empty, } @@ -55,6 +56,7 @@ impl ToolKind { ToolKind::Debug => "debug", ToolKind::Farming => "farming", ToolKind::Pick => "pickaxe", + ToolKind::Organ => "organ", ToolKind::Empty => "empty", } } diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 1ccb2aef47..74ecb92091 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -579,6 +579,9 @@ fn default_main_tool(body: &Body) -> Item { quadruped_low::Species::Asp => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.asp", )), + quadruped_low::Species::Dagon => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.dagon", + )), quadruped_low::Species::Crocodile | quadruped_low::Species::SeaCrocodile | quadruped_low::Species::Alligator @@ -718,6 +721,9 @@ fn default_main_tool(body: &Body) -> Item { object::Body::Crossbow => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.turret", )), + object::Body::BarrelOrgan => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.organ", + )), object::Body::HaniwaSentry => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.haniwa_sentry", )), diff --git a/common/src/comp/projectile.rs b/common/src/comp/projectile.rs index 532866b654..f7d5c1bc46 100644 --- a/common/src/comp/projectile.rs +++ b/common/src/comp/projectile.rs @@ -88,6 +88,12 @@ pub enum ProjectileConstructor { knockback: f32, min_falloff: f32, }, + DagonBomb { + damage: f32, + radius: f32, + knockback: f32, + min_falloff: f32, + }, } impl ProjectileConstructor { @@ -457,6 +463,63 @@ impl ProjectileConstructor { is_point: true, } }, + DagonBomb { + damage, + radius, + knockback, + min_falloff, + } => { + let knockback = AttackEffect::new( + Some(GroupTarget::OutOfGroup), + CombatEffect::Knockback(Knockback { + strength: knockback, + direction: KnockbackDir::Away, + }), + ) + .with_requirement(CombatRequirement::AnyDamage); + let buff = AttackEffect::new( + Some(GroupTarget::OutOfGroup), + CombatEffect::Buff(CombatBuff { + kind: BuffKind::Burning, + dur_secs: 5.0, + strength: CombatBuffStrength::DamageFraction(0.2 * buff_strength), + chance: 1.0, + }), + ) + .with_requirement(CombatRequirement::AnyDamage); + let damage = AttackDamage::new( + Damage { + source: DamageSource::Explosion, + kind: DamageKind::Energy, + value: damage, + }, + Some(GroupTarget::OutOfGroup), + instance, + ); + let attack = Attack::default() + .with_damage(damage) + .with_crit(crit_chance, crit_mult) + .with_effect(knockback) + .with_effect(buff); + let explosion = Explosion { + effects: vec![ + RadiusEffect::Attack(attack), + RadiusEffect::TerrainDestruction(5.0), + ], + radius, + reagent: Some(Reagent::Blue), + min_falloff, + }; + Projectile { + hit_solid: vec![Effect::Explode(explosion.clone()), Effect::Vanish], + hit_entity: vec![Effect::Explode(explosion), Effect::Vanish], + time_left: Duration::from_secs(10), + owner, + ignore_group: true, + is_sticky: true, + is_point: true, + } + }, } } @@ -532,6 +595,14 @@ impl ProjectileConstructor { *damage *= power; *radius *= range; }, + DagonBomb { + ref mut damage, + ref mut radius, + .. + } => { + *damage *= power; + *radius *= range; + }, } self } diff --git a/common/src/states/sprite_summon.rs b/common/src/states/sprite_summon.rs index 0483de1bce..13b2497dab 100644 --- a/common/src/states/sprite_summon.rs +++ b/common/src/states/sprite_summon.rs @@ -118,12 +118,18 @@ impl CharacterBehavior for Data { // Location sprite will be created let sprite_pos = Vec3::new(sprite_pos.x as i32, sprite_pos.y as i32, z); - - // Send server event to create sprite - output_events.emit_server(ServerEvent::CreateSprite { - pos: sprite_pos, - sprite: self.static_data.sprite, - }); + // Layers of sprites + let layers = match self.static_data.sprite { + SpriteKind::SeaUrchin => 2, + _ => 1, + }; + for i in 0..layers { + // Send server event to create sprite + output_events.emit_server(ServerEvent::CreateSprite { + pos: Vec3::new(sprite_pos.x as i32, sprite_pos.y, z + i), + sprite: self.static_data.sprite, + }); + } } } } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 5a95138f4d..0d18f761ed 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -126,6 +126,7 @@ impl Body { quadruped_low::Species::Maneater => 80.0, quadruped_low::Species::Sandshark => 160.0, quadruped_low::Species::Hakulaq => 140.0, + quadruped_low::Species::Dagon => 140.0, quadruped_low::Species::Lavadrake => 100.0, quadruped_low::Species::Icedrake => 100.0, quadruped_low::Species::Basilisk => 90.0, diff --git a/common/src/terrain/block.rs b/common/src/terrain/block.rs index f1224324e1..74abc44363 100644 --- a/common/src/terrain/block.rs +++ b/common/src/terrain/block.rs @@ -235,6 +235,9 @@ impl Block { | SpriteKind::EmeraldSmall | SpriteKind::SapphireSmall => Some(3), SpriteKind::Lantern => Some(24), + SpriteKind::SeashellLantern => Some(16), + SpriteKind::SeaDecorEmblem => Some(12), + SpriteKind::SeaDecorBlock => Some(10), _ => None, }, } @@ -294,8 +297,16 @@ impl Block { | SpriteKind::DungeonChest3 | SpriteKind::DungeonChest4 | SpriteKind::DungeonChest5 - | SpriteKind::ChestBuried => None, - SpriteKind::EnsnaringVines | SpriteKind::EnsnaringWeb => Some(0.1), + | SpriteKind::ChestBuried + | SpriteKind::SeaDecorBlock + | SpriteKind::SeaDecorChain + | SpriteKind::SeaDecorWindowHor + | SpriteKind::SeaDecorWindowVer + | SpriteKind::Rope + | SpriteKind::GlassBarrier => None, + SpriteKind::EnsnaringVines | SpriteKind::EnsnaringWeb | SpriteKind::SeaUrchin => { + Some(0.1) + }, _ => Some(0.25), }), } diff --git a/common/src/terrain/sprite.rs b/common/src/terrain/sprite.rs index 8d7a5dcaff..14709accc8 100644 --- a/common/src/terrain/sprite.rs +++ b/common/src/terrain/sprite.rs @@ -215,6 +215,17 @@ make_case_elim!( Ironwood = 0xBC, Frostwood = 0xBD, Eldwood = 0xBE, + SeaUrchin = 0xBF, + GlassBarrier = 0xC0, + CoralChest = 0xC1, + SeaDecorChain = 0xC2, + SeaDecorBlock = 0xC3, + SeaDecorWindowHor = 0xC4, + SeaDecorWindowVer = 0xC5, + SeaDecorEmblem = 0xC6, + SeaDecorPillar = 0xC7, + SeashellLantern = 0xC8, + Rope = 0xC9, } ); @@ -237,6 +248,14 @@ impl SpriteKind { SpriteKind::DungeonChest3 => 1.09, SpriteKind::DungeonChest4 => 1.09, SpriteKind::DungeonChest5 => 1.09, + SpriteKind::CoralChest => 1.09, + SpriteKind::SeaDecorChain => 1.09, + SpriteKind::SeaDecorBlock => 1.00, + SpriteKind::SeaDecorWindowHor => 0.55, + SpriteKind::SeaDecorWindowVer => 1.09, + SpriteKind::SeaDecorPillar => 2.55, + SpriteKind::SeashellLantern => 2.09, + SpriteKind::Rope => 1.09, SpriteKind::StreetLamp => 2.65, SpriteKind::Carrot => 0.18, SpriteKind::Radish => 0.18, @@ -290,6 +309,8 @@ impl SpriteKind { | SpriteKind::Window4 | SpriteKind::DropGate | SpriteKind::WitchWindow + | SpriteKind::SeaUrchin + | SpriteKind::GlassBarrier | SpriteKind::Bomb => 1.0, // TODO: Figure out if this should be solid or not. SpriteKind::Shelf => 1.0, @@ -398,6 +419,7 @@ impl SpriteKind { SpriteKind::DungeonChest5 => table("common.loot_tables.dungeon.tier-5.chest"), SpriteKind::Chest => table("common.loot_tables.sprite.chest"), SpriteKind::ChestBuried => table("common.loot_tables.sprite.chest-buried"), + SpriteKind::CoralChest => table("common.loot_tables.dungeon.sea_chapel.chest_coral"), SpriteKind::Mud => table("common.loot_tables.sprite.mud"), SpriteKind::Crate => table("common.loot_tables.sprite.crate"), SpriteKind::Wood => item("common.items.log.wood"), @@ -448,7 +470,8 @@ impl SpriteKind { | SpriteKind::Tin | SpriteKind::Silver | SpriteKind::Gold - | SpriteKind::SapphireSmall => Some(ToolKind::Pick), + | SpriteKind::SapphireSmall + | SpriteKind::GlassBarrier => Some(ToolKind::Pick), _ => None, } } @@ -491,6 +514,9 @@ impl SpriteKind { | SpriteKind::DungeonChest3 | SpriteKind::DungeonChest4 | SpriteKind::DungeonChest5 + | SpriteKind::CoralChest + | SpriteKind::SeaDecorWindowVer + | SpriteKind::SeaDecorEmblem | SpriteKind::DropGate | SpriteKind::DropGateBottom | SpriteKind::Door diff --git a/common/systems/src/buff.rs b/common/systems/src/buff.rs index 4bfb9c6810..caf755edb0 100644 --- a/common/systems/src/buff.rs +++ b/common/systems/src/buff.rs @@ -152,6 +152,21 @@ impl<'a> System<'a> for Sys { )), }); } + if matches!( + physics_state.on_ground.and_then(|b| b.get_sprite()), + Some(SpriteKind::SeaUrchin) + ) { + // If touching Sea Urchin apply Bleeding buff + server_emitter.emit(ServerEvent::Buff { + entity, + buff_change: BuffChange::Add(Buff::new( + BuffKind::Bleeding, + BuffData::new(1.0, Some(Duration::from_secs_f32(6.0))), + Vec::new(), + BuffSource::World, + )), + }); + } if matches!( physics_state.in_fluid, Some(Fluid::Liquid { diff --git a/server/src/persistence/json_models.rs b/server/src/persistence/json_models.rs index 95bae90d0f..2e5dfecb9b 100644 --- a/server/src/persistence/json_models.rs +++ b/server/src/persistence/json_models.rs @@ -85,7 +85,8 @@ pub fn skill_group_to_db_string(skill_group: comp::skillset::SkillGroupKind) -> | Weapon(ToolKind::Debug) | Weapon(ToolKind::Farming) | Weapon(ToolKind::Empty) - | Weapon(ToolKind::Natural) => panic!( + | Weapon(ToolKind::Natural) + | Weapon(ToolKind::Organ) => panic!( "Tried to add unsupported skill group to database: {:?}", skill_group ), @@ -104,6 +105,7 @@ pub fn db_string_to_skill_group(skill_group_string: &str) -> comp::skillset::Ski "Weapon Staff" => Weapon(ToolKind::Staff), "Weapon Sceptre" => Weapon(ToolKind::Sceptre), "Weapon Pick" => Weapon(ToolKind::Pick), + _ => panic!( "Tried to convert an unsupported string from the database: {}", skill_group_string @@ -203,6 +205,7 @@ fn tool_kind_to_string(tool: Option) -> String { Some(Farming) => "Farming", Some(Debug) => "Debug", Some(Natural) => "Natural", + Some(Organ) => "Organ", Some(Empty) => "Empty", None => "None", }) @@ -226,6 +229,7 @@ fn tool_kind_from_string(tool: String) -> Option { "Farming" => Some(Farming), "Debug" => Some(Debug), "Natural" => Some(Natural), + "Organ" => Some(Organ), "Empty" => Some(Empty), "None" => None, unknown => { diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index b172d040b6..bcf2c83207 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -944,6 +944,7 @@ impl<'a> AgentData<'a> { "Quad Low Breathe" | "Quad Low Beam" | "Basilisk" => { Tactic::QuadLowBeam }, + "Organ" => Tactic::OrganAura, "Quad Low Tail" | "Husk Brute" => Tactic::TailSlap, "Quad Low Quick" => Tactic::QuadLowQuick, "Quad Low Basic" => Tactic::QuadLowBasic, @@ -972,6 +973,8 @@ impl<'a> AgentData<'a> { | "Gnarling Totem White" => Tactic::RadialTurret, "Yeti" => Tactic::Yeti, "Harvester" => Tactic::Harvester, + "Cardinal" => Tactic::Cardinal, + "Dagon" => Tactic::Dagon, "Gnarling Dagger" => Tactic::SimpleBackstab, "Gnarling Blowgun" => Tactic::ElevatedRanged, "Deadwood" => Tactic::Deadwood, @@ -1242,6 +1245,9 @@ impl<'a> AgentData<'a> { tgt_data, read_data, ), + Tactic::OrganAura => { + self.handle_organ_aura_attack(agent, controller, &attack_data, tgt_data, read_data) + }, Tactic::Theropod => { self.handle_theropod_attack(agent, controller, &attack_data, tgt_data, read_data) }, @@ -1332,6 +1338,17 @@ impl<'a> AgentData<'a> { Tactic::Harvester => { self.handle_harvester_attack(agent, controller, &attack_data, tgt_data, read_data) }, + Tactic::Cardinal => self.handle_cardinal_attack( + agent, + controller, + &attack_data, + tgt_data, + read_data, + rng, + ), + Tactic::Dagon => { + self.handle_dagon_attack(agent, controller, &attack_data, tgt_data, read_data) + }, Tactic::SimpleBackstab => { self.handle_simple_backstab(agent, controller, &attack_data, tgt_data, read_data) }, diff --git a/server/src/sys/agent/attack.rs b/server/src/sys/agent/attack.rs index e53f8b3cb4..cdc8bce929 100644 --- a/server/src/sys/agent/attack.rs +++ b/server/src/sys/agent/attack.rs @@ -1305,6 +1305,31 @@ impl<'a> AgentData<'a> { } } + pub fn handle_organ_aura_attack( + &self, + agent: &mut Agent, + controller: &mut Controller, + attack_data: &AttackData, + _tgt_data: &TargetData, + read_data: &ReadData, + ) { + const ORGAN_AURA_DURATION: f32 = 34.75; + if attack_data.dist_sqrd < (7.0 * attack_data.min_attack_dist).powi(2) { + if agent.action_state.timer > ORGAN_AURA_DURATION { + agent.action_state.timer = 0.0; + } else if agent.action_state.timer < 1.0 { + controller + .actions + .push(ControlAction::basic_input(InputKind::Primary)); + agent.action_state.timer += read_data.dt.0; + } else { + agent.action_state.timer += read_data.dt.0; + } + } else { + agent.target = None; + } + } + pub fn handle_theropod_attack( &self, agent: &mut Agent, @@ -2309,6 +2334,205 @@ impl<'a> AgentData<'a> { ); } + pub fn handle_cardinal_attack( + &self, + agent: &mut Agent, + controller: &mut Controller, + attack_data: &AttackData, + tgt_data: &TargetData, + read_data: &ReadData, + rng: &mut impl Rng, + ) { + const DESIRED_ENERGY_LEVEL: f32 = 50.0; + const DESIRED_COMBO_LEVEL: u32 = 8; + const MINION_SUMMON_THRESHOLD: f32 = 0.10; + let health_fraction = self.health.map_or(0.5, |h| h.fraction()); + // Sets counter at start of combat, using `condition` to keep track of whether + // it was already intitialized + if !agent.action_state.condition { + agent.action_state.counter = 1.0 - MINION_SUMMON_THRESHOLD; + agent.action_state.condition = true; + } + + if agent.action_state.counter > health_fraction { + // Summon minions at particular thresholds of health + controller.push_basic_input(InputKind::Ability(1)); + + if matches!(self.char_state, CharacterState::BasicSummon(c) if matches!(c.stage_section, StageSection::Recover)) + { + agent.action_state.counter -= MINION_SUMMON_THRESHOLD; + } + } + // Logic to use abilities + else if attack_data.dist_sqrd > attack_data.min_attack_dist.powi(2) + && entities_have_line_of_sight( + self.pos, + self.body, + tgt_data.pos, + tgt_data.body, + read_data, + ) + { + // If far enough away, and can see target, check which skill is appropriate to + // use + if self.energy.current() > DESIRED_ENERGY_LEVEL + && read_data + .combos + .get(*self.entity) + .map_or(false, |c| c.counter() >= DESIRED_COMBO_LEVEL) + && !read_data.buffs.get(*self.entity).iter().any(|buff| { + buff.iter_kind(BuffKind::Regeneration) + .peekable() + .peek() + .is_some() + }) + { + // If have enough energy and combo to use healing aura, do so + controller.push_basic_input(InputKind::Secondary); + } else if self + .skill_set + .has_skill(Skill::Sceptre(SceptreSkill::UnlockAura)) + && self.energy.current() > DESIRED_ENERGY_LEVEL + && !read_data.buffs.get(*self.entity).iter().any(|buff| { + buff.iter_kind(BuffKind::ProtectingWard) + .peekable() + .peek() + .is_some() + }) + { + // Use ward if target is far enough away, self is not buffed, and have + // sufficient energy + controller.push_basic_input(InputKind::Ability(0)); + } else { + // If low on energy, use primary to attempt to regen energy + // Or if at desired energy level but not able/willing to ward, just attack + controller.push_basic_input(InputKind::Primary); + } + } else if attack_data.dist_sqrd < (2.0 * attack_data.min_attack_dist).powi(2) { + if self.body.map_or(false, |b| b.is_humanoid()) + && self.energy.current() > CharacterAbility::default_roll().get_energy_cost() + && !matches!(self.char_state, CharacterState::BasicAura(c) if !matches!(c.stage_section, StageSection::Recover)) + { + // Else roll away if can roll and have enough energy, and not using aura or in + // recover + controller.push_basic_input(InputKind::Roll); + } else if attack_data.angle < 15.0 { + controller.push_basic_input(InputKind::Primary); + } + } + // Logic to move. Intentionally kept separate from ability logic where possible + // so duplicated work is less necessary. + if attack_data.dist_sqrd < (2.0 * attack_data.min_attack_dist).powi(2) { + // Attempt to move away from target if too close + if let Some((bearing, speed)) = agent.chaser.chase( + &*read_data.terrain, + self.pos.0, + self.vel.0, + tgt_data.pos.0, + TraversalConfig { + min_tgt_dist: 1.25, + ..self.traversal_config + }, + ) { + controller.inputs.move_dir = + -bearing.xy().try_normalized().unwrap_or_else(Vec2::zero) * speed; + } + } else if attack_data.dist_sqrd < MAX_PATH_DIST.powi(2) { + // Else attempt to circle target if neither too close nor too far + if let Some((bearing, speed)) = agent.chaser.chase( + &*read_data.terrain, + self.pos.0, + self.vel.0, + tgt_data.pos.0, + TraversalConfig { + min_tgt_dist: 1.25, + ..self.traversal_config + }, + ) { + if entities_have_line_of_sight( + self.pos, + self.body, + tgt_data.pos, + tgt_data.body, + read_data, + ) && attack_data.angle < 45.0 + { + controller.inputs.move_dir = bearing + .xy() + .rotated_z(rng.gen_range(0.5..1.57)) + .try_normalized() + .unwrap_or_else(Vec2::zero) + * speed; + } else { + // Unless cannot see target, then move towards them + controller.inputs.move_dir = + bearing.xy().try_normalized().unwrap_or_else(Vec2::zero) * speed; + self.jump_if(bearing.z > 1.5, controller); + controller.inputs.move_z = bearing.z; + } + } + // Sometimes try to roll + if self.body.map(|b| b.is_humanoid()).unwrap_or(false) + && !matches!(self.char_state, CharacterState::BasicAura(_)) + && attack_data.dist_sqrd < 16.0f32.powi(2) + && rng.gen::() < 0.01 + { + controller.push_basic_input(InputKind::Roll); + } + } else { + // If too far, move towards target + self.path_toward_target( + agent, + controller, + tgt_data.pos.0, + read_data, + Path::Partial, + None, + ); + } + } + + pub fn handle_dagon_attack( + &self, + agent: &mut Agent, + controller: &mut Controller, + attack_data: &AttackData, + tgt_data: &TargetData, + read_data: &ReadData, + ) { + // if close to target, shoot dagon bombs and lay out sea urchins + if attack_data.angle < 70.0 + && attack_data.dist_sqrd < (1.3 * attack_data.min_attack_dist).powi(2) + { + controller.inputs.move_dir = Vec2::zero(); + if agent.action_state.timer > 1.0 { + controller.push_basic_input(InputKind::Primary); + agent.action_state.timer += read_data.dt.0; + } else { + controller.push_basic_input(InputKind::Secondary); + agent.action_state.timer += read_data.dt.0; + } + } else if attack_data.angle < 30.0 + && entities_have_line_of_sight( + self.pos, + self.body, + tgt_data.pos, + tgt_data.body, + read_data, + ) + { + // if in range, angle and sight, shoot dagon bombs at target + controller.push_basic_input(InputKind::Primary); + } + // chase + let path = if attack_data.dist_sqrd < MAX_PATH_DIST.powi(2) { + Path::Separate + } else { + Path::Partial + }; + self.path_toward_target(agent, controller, tgt_data.pos.0, read_data, path, None); + } + pub fn handle_deadwood( &self, agent: &mut Agent, diff --git a/server/src/sys/agent/data.rs b/server/src/sys/agent/data.rs index 6b2516d99d..c6fbb0f67d 100644 --- a/server/src/sys/agent/data.rs +++ b/server/src/sys/agent/data.rs @@ -119,6 +119,9 @@ pub enum Tactic { Mandragora, WoodGolem, GnarlingChieftain, + OrganAura, + Dagon, + Cardinal, } #[derive(SystemData)] diff --git a/voxygen/anim/src/quadruped_low/mod.rs b/voxygen/anim/src/quadruped_low/mod.rs index 23655e3ee6..2b0a2df6db 100644 --- a/voxygen/anim/src/quadruped_low/mod.rs +++ b/voxygen/anim/src/quadruped_low/mod.rs @@ -164,6 +164,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (7.0, 11.5), (Sandshark, _) => (8.5, 0.5), (Hakulaq, _) => (8.0, 10.0), + (Dagon, _) => (8.0, 10.0), (Lavadrake, _) => (7.0, 8.0), (Icedrake, _) => (7.0, 8.0), (Basilisk, _) => (5.0, 2.5), @@ -183,6 +184,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (1.0, 4.5), (Sandshark, _) => (13.5, -10.5), (Hakulaq, _) => (10.5, 1.0), + (Dagon, _) => (10.5, 1.0), (Lavadrake, _) => (9.0, -6.0), (Icedrake, _) => (11.5, -6.0), (Basilisk, _) => (12.5, -5.5), @@ -202,6 +204,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (-1.0, 4.0), (Sandshark, _) => (-8.0, -5.5), (Hakulaq, _) => (-6.5, -4.0), + (Dagon, _) => (-6.5, -4.0), (Lavadrake, _) => (3.0, -5.0), (Icedrake, _) => (-0.5, -8.0), (Basilisk, _) => (0.5, -3.0), @@ -221,6 +224,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (0.0, 12.0), (Sandshark, _) => (0.0, 20.0), (Hakulaq, _) => (0.0, 13.5), + (Dagon, _) => (0.0, 13.5), (Lavadrake, _) => (0.0, 16.5), (Icedrake, _) => (0.0, 16.5), (Basilisk, _) => (0.0, 15.0), @@ -240,6 +244,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (-15.0, 4.0), (Sandshark, _) => (-10.0, 0.5), (Hakulaq, _) => (-9.0, -2.0), + (Dagon, _) => (-9.0, -2.0), (Lavadrake, _) => (-12.0, -2.0), (Icedrake, _) => (-12.0, 1.0), (Basilisk, _) => (-10.0, -4.0), @@ -259,6 +264,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (-1.0, 4.0), (Sandshark, _) => (-13.0, -8.0), (Hakulaq, _) => (-6.0, -5.5), + (Dagon, _) => (-9.0, -2.0), (Lavadrake, _) => (-7.0, -4.5), (Icedrake, _) => (-7.0, -4.5), (Basilisk, _) => (-6.5, -5.5), @@ -278,6 +284,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (4.5, 4.0, -5.5), (Sandshark, _) => (5.5, 2.0, -8.0), (Hakulaq, _) => (4.5, 2.0, -4.5), + (Dagon, _) => (4.5, 2.0, -4.5), (Lavadrake, _) => (4.5, 4.0, -6.5), (Icedrake, _) => (4.5, 4.0, -6.5), (Basilisk, _) => (6.5, 4.0, -2.0), @@ -297,6 +304,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Maneater, _) => (4.5, -2.5, -3.0), (Sandshark, _) => (3.5, -15.0, -14.0), (Hakulaq, _) => (3.5, -8.0, -4.5), + (Dagon, _) => (3.5, -8.0, -4.5), (Lavadrake, _) => (3.5, -8.0, -6.5), (Icedrake, _) => (3.5, -8.0, -6.5), (Basilisk, _) => (5.5, -6.5, -2.0), @@ -315,6 +323,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (1.12), (Rocksnapper, _) => (1.12), (Hakulaq, _) => (1.05), + (Dagon, _) => (1.05), (Pangolin, _) => (1.05), (Maneater, _) => (1.12), (Lavadrake, _) => (1.12), @@ -331,6 +340,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tortoise, _) => (0.7), (Rocksnapper, _) => (0.7), (Hakulaq, _) => (1.2), + (Dagon, _) => (1.2), (Pangolin, _) => (1.15), (Maneater, _) => (0.9), (Lavadrake, _) => (1.1), @@ -357,6 +367,7 @@ fn mount_point(body: &Body) -> Vec3 { (Maneater, _) => (0.0, 4.0, -11.5), (Sandshark, _) => (0.0, -4.0, -2.0), (Hakulaq, _) => (0.0, 4.0, -4.5), + (Dagon, _) => (0.0, 4.0, -4.5), (Lavadrake, _) => (0.0, 2.0, -2.5), (Icedrake, _) => (0.0, -8.0, 2.5), (Basilisk, _) => (0.0, -2.0, 2.0), diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index f761bcb2e6..f2a932f53c 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -2835,6 +2835,7 @@ fn unlock_skill_strings(group: SkillGroupKind) -> SkillStrings<'static> { | ToolKind::Farming | ToolKind::Pick | ToolKind::Natural + | ToolKind::Organ | ToolKind::Empty, ) => { tracing::warn!("Requesting title for unlocking unexpected skill group"); diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 6f2a65f835..56f6f042dd 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -410,6 +410,9 @@ image_ids! { mmap_site_town: "voxygen.element.ui.map.buttons.town", mmap_site_town_hover: "voxygen.element.ui.map.buttons.town_hover", mmap_site_town_bg: "voxygen.element.ui.map.buttons.town_bg", + mmap_site_sea_chapel_hover: "voxygen.element.ui.map.buttons.sea_chapel_hover", + mmap_site_sea_chapel_bg: "voxygen.element.ui.map.buttons.sea_chapel_bg", + mmap_site_sea_chapel: "voxygen.element.ui.map.buttons.sea_chapel", mmap_site_dungeon: "voxygen.element.ui.map.buttons.dungeon", mmap_site_dungeon_hover: "voxygen.element.ui.map.buttons.dungeon_hover", mmap_site_dungeon_bg: "voxygen.element.ui.map.buttons.dungeon_bg", diff --git a/voxygen/src/hud/map.rs b/voxygen/src/hud/map.rs index 85f7c6cff2..8002f1f201 100644 --- a/voxygen/src/hud/map.rs +++ b/voxygen/src/hud/map.rs @@ -57,6 +57,9 @@ widget_ids! { show_towns_img, show_towns_box, show_towns_text, + show_sea_chapels_img, + show_sea_chapels_box, + show_sea_chapels_text, show_castles_img, show_castles_box, show_castles_text, @@ -878,6 +881,7 @@ impl<'a> Widget for Map<'a> { SiteKind::Cave => i18n.get_msg("hud-map-cave"), SiteKind::Tree => i18n.get_msg("hud-map-tree"), SiteKind::Gnarling => i18n.get_msg("hud-map-gnarling"), + SiteKind::ChapelSite => i18n.get_msg("hud-map-chapel_Site"), }); let (difficulty, desc) = match &site.kind { SiteKind::Town => (None, i18n.get_msg("hud-map-town")), @@ -902,10 +906,12 @@ impl<'a> Widget for Map<'a> { SiteKind::Cave => (None, i18n.get_msg("hud-map-cave")), SiteKind::Tree => (None, i18n.get_msg("hud-map-tree")), SiteKind::Gnarling => (Some(0), i18n.get_msg("hud-map-gnarling")), + SiteKind::ChapelSite => (Some(0), i18n.get_msg("hud-map-chapel_site")), }; let desc = desc.into_owned() + &get_site_economy(site_rich); let site_btn = Button::image(match &site.kind { SiteKind::Town => self.imgs.mmap_site_town, + SiteKind::ChapelSite => self.imgs.mmap_site_sea_chapel, SiteKind::Castle => self.imgs.mmap_site_castle, SiteKind::Cave => self.imgs.mmap_site_cave, SiteKind::Tree => self.imgs.mmap_site_tree, @@ -924,6 +930,7 @@ impl<'a> Widget for Map<'a> { .w_h(rside as f64, rside as f64) .hover_image(match &site.kind { SiteKind::Town => self.imgs.mmap_site_town_hover, + SiteKind::ChapelSite => self.imgs.mmap_site_sea_chapel_hover, SiteKind::Castle => self.imgs.mmap_site_castle_hover, SiteKind::Cave => self.imgs.mmap_site_cave_hover, SiteKind::Tree => self.imgs.mmap_site_tree_hover, @@ -943,13 +950,15 @@ impl<'a> Widget for Map<'a> { match &site.kind { SiteKind::Town => TEXT_COLOR, SiteKind::Castle => TEXT_COLOR, - SiteKind::Dungeon { .. } | SiteKind::Gnarling => match difficulty { - Some(0) => QUALITY_LOW, - Some(1) => QUALITY_COMMON, - Some(2) => QUALITY_MODERATE, - Some(3) => QUALITY_HIGH, - Some(4 | 5) => QUALITY_EPIC, - _ => TEXT_COLOR, + SiteKind::Dungeon { .. } | SiteKind::Gnarling | SiteKind::ChapelSite => { + match difficulty { + Some(0) => QUALITY_LOW, + Some(1) => QUALITY_COMMON, + Some(2) => QUALITY_MODERATE, + Some(3) => QUALITY_HIGH, + Some(4 | 5) => QUALITY_EPIC, + _ => TEXT_COLOR, + } }, SiteKind::Cave => TEXT_COLOR, SiteKind::Tree => TEXT_COLOR, @@ -967,7 +976,9 @@ impl<'a> Widget for Map<'a> { // Only display sites that are toggled on let show_site = match &site.kind { SiteKind::Town => show_towns, - SiteKind::Dungeon { .. } | SiteKind::Gnarling => show_dungeons, + SiteKind::Dungeon { .. } | SiteKind::Gnarling | SiteKind::ChapelSite => { + show_dungeons + }, SiteKind::Castle => show_castles, SiteKind::Cave => show_caves, SiteKind::Tree => show_trees, @@ -1023,7 +1034,7 @@ impl<'a> Widget for Map<'a> { dif_img.set(state.ids.site_difs[i], ui) } }, - SiteKind::Dungeon { .. } | SiteKind::Gnarling => { + SiteKind::Dungeon { .. } | SiteKind::Gnarling | SiteKind::ChapelSite => { if show_dungeons { dif_img.set(state.ids.site_difs[i], ui) } diff --git a/voxygen/src/hud/minimap.rs b/voxygen/src/hud/minimap.rs index ce12a72cd1..9e15d1b1dd 100644 --- a/voxygen/src/hud/minimap.rs +++ b/voxygen/src/hud/minimap.rs @@ -692,6 +692,7 @@ impl<'a> Widget for MiniMap<'a> { }; let difficulty = match &site.kind { SiteKind::Town => None, + SiteKind::ChapelSite => Some(0), SiteKind::Dungeon { difficulty } => Some(*difficulty), SiteKind::Castle => None, SiteKind::Cave => None, @@ -701,6 +702,7 @@ impl<'a> Widget for MiniMap<'a> { Image::new(match &site.kind { SiteKind::Town => self.imgs.mmap_site_town_bg, + SiteKind::ChapelSite => self.imgs.mmap_site_sea_chapel_bg, SiteKind::Dungeon { .. } => self.imgs.mmap_site_dungeon_bg, SiteKind::Castle => self.imgs.mmap_site_castle_bg, SiteKind::Cave => self.imgs.mmap_site_cave_bg, @@ -725,6 +727,7 @@ impl<'a> Widget for MiniMap<'a> { .set(state.ids.mmap_site_icons_bgs[i], ui); Image::new(match &site.kind { SiteKind::Town => self.imgs.mmap_site_town, + SiteKind::ChapelSite => self.imgs.mmap_site_sea_chapel, SiteKind::Dungeon { .. } => self.imgs.mmap_site_dungeon, SiteKind::Castle => self.imgs.mmap_site_castle, SiteKind::Cave => self.imgs.mmap_site_cave, diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 322a8fc95e..8acb48ce9c 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -4644,6 +4644,7 @@ pub fn get_buff_desc(buff: BuffKind, data: BuffData, localized_strings: &Localiz pub fn get_sprite_desc(sprite: SpriteKind, localized_strings: &Localization) -> Option> { let i18n_key = match sprite { SpriteKind::Empty => return None, + SpriteKind::GlassBarrier => return None, SpriteKind::Anvil => "hud-crafting-anvil", SpriteKind::Cauldron => "hud-crafting-cauldron", SpriteKind::CookingPot => "hud-crafting-cooking_pot", @@ -4655,6 +4656,7 @@ pub fn get_sprite_desc(sprite: SpriteKind, localized_strings: &Localization) -> SpriteKind::DismantlingBench => "hud-crafting-salvaging_station", SpriteKind::ChestBuried | SpriteKind::Chest + | SpriteKind::CoralChest | SpriteKind::DungeonChest0 | SpriteKind::DungeonChest1 | SpriteKind::DungeonChest2 diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 199859ed0b..c1dd3ebd99 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -252,6 +252,7 @@ fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { ToolKind::Shield => i18n.get_msg("common-weapons-shield"), ToolKind::Spear => i18n.get_msg("common-weapons-spear"), ToolKind::Blowgun => i18n.get_msg("common-weapons-blowgun"), + ToolKind::Organ => i18n.get_msg("common-weapons-organ"), ToolKind::Natural => i18n.get_msg("common-weapons-natural"), ToolKind::Debug => i18n.get_msg("common-tool-debug"), ToolKind::Farming => i18n.get_msg("common-tool-farming"), @@ -350,7 +351,6 @@ pub fn ability_image(imgs: &img_ids::Imgs, ability_id: &str) -> image::Id { "common.abilities.dagger.tempbasic" => imgs.onehdagger_m1, // Pickaxe "common.abilities.pick.swing" => imgs.mining, - _ => imgs.not_found, } } diff --git a/voxygen/src/render/pipelines/particle.rs b/voxygen/src/render/pipelines/particle.rs index 384feb5b45..7c701fa3f6 100644 --- a/voxygen/src/render/pipelines/particle.rs +++ b/voxygen/src/render/pipelines/particle.rs @@ -89,6 +89,7 @@ pub enum ParticleMode { WebStrand = 36, BlackSmoke = 37, Lightning = 38, + BarrelOrgan = 39, } impl ParticleMode { diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 3f7d4814b7..4eeccdefd4 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -359,6 +359,9 @@ impl ParticleMgr { Body::Object(object::Body::CampfireLit) => { self.maintain_campfirelit_particles(scene_data, interpolated.pos, vel) }, + Body::Object(object::Body::BarrelOrgan) => { + self.maintain_barrel_organ_particles(scene_data, interpolated.pos, vel) + }, Body::Object(object::Body::BoltFire) => { self.maintain_boltfire_particles(scene_data, interpolated.pos, vel) }, @@ -418,6 +421,39 @@ impl ParticleMgr { } } + fn maintain_barrel_organ_particles( + &mut self, + scene_data: &SceneData, + pos: Vec3, + vel: Option<&Vel>, + ) { + span!( + _guard, + "barrel_organ_particles", + "ParticleMgr::maintain_barrel_organ_particles" + ); + let time = scene_data.state.get_time(); + let dt = scene_data.state.get_delta_time(); + let mut rng = thread_rng(); + + for _ in 0..self.scheduler.heartbeats(Duration::from_millis(20)) { + self.particles.push(Particle::new( + Duration::from_millis(250), + time, + ParticleMode::BarrelOrgan, + pos, + )); + + self.particles.push(Particle::new( + Duration::from_secs(10), + time, + ParticleMode::BarrelOrgan, + pos.map(|e| e + thread_rng().gen_range(-0.25..0.25)) + + vel.map_or(Vec3::zero(), |v| -v.0 * dt * rng.gen::()), + )); + } + } + fn maintain_boltfire_particles( &mut self, scene_data: &SceneData, diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index 1aeb62eb53..07a6fbcef6 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -15,7 +15,9 @@ use common::{ path::Path, spiral::Spiral2d, store::{Id, Store}, - terrain::{uniform_idx_as_vec2, MapSizeLg, TerrainChunkSize, TERRAIN_CHUNK_BLOCKS_LG}, + terrain::{ + uniform_idx_as_vec2, BiomeKind, MapSizeLg, TerrainChunkSize, TERRAIN_CHUNK_BLOCKS_LG, + }, vol::RectVolSize, }; use core::{fmt, hash::BuildHasherDefault, ops::Range}; @@ -111,6 +113,7 @@ impl Civs { info!(?initial_civ_count, "all civilisations created"); let mut gnarling_enemies: Vec> = start_locations.clone(); + let mut chapel_site_enemies: Vec> = start_locations.clone(); let mut dungeon_enemies: Vec> = start_locations.clone(); let mut tree_enemies: Vec> = start_locations.clone(); let mut castle_enemies: Vec> = Vec::new(); @@ -126,12 +129,14 @@ impl Civs { } }, 32..=37 => (SiteKind::Gnarling, (&gnarling_enemies, 40)), + 38..=43 => (SiteKind::ChapelSite, (&chapel_site_enemies, 40)), _ => (SiteKind::Dungeon, (&dungeon_enemies, 40)), }; let loc = find_site_loc(&mut ctx, avoid, kind)?; match kind { SiteKind::Castle => { gnarling_enemies.push(loc); + chapel_site_enemies.push(loc); dungeon_enemies.push(loc); tree_enemies.push(loc); castle_enemies.push(loc); @@ -140,9 +145,17 @@ impl Civs { castle_enemies.push(loc); dungeon_enemies.push(loc); gnarling_enemies.push(loc); + chapel_site_enemies.push(loc); + }, + SiteKind::ChapelSite => { + castle_enemies.push(loc); + dungeon_enemies.push(loc); + gnarling_enemies.push(loc); + chapel_site_enemies.push(loc); }, SiteKind::Dungeon => { gnarling_enemies.push(loc); + chapel_site_enemies.push(loc); dungeon_enemies.push(loc); castle_enemies.push(loc); }, @@ -171,6 +184,7 @@ impl Civs { SiteKind::Refactor => (32i32, 10.0), SiteKind::CliffTown => (32i32, 10.0), SiteKind::DesertCity => (64i32, 25.0), + SiteKind::ChapelSite => (36i32, 10.0), SiteKind::Tree => (12i32, 8.0), SiteKind::GiantTree => (12i32, 8.0), SiteKind::Gnarling => (16i32, 10.0), @@ -271,6 +285,9 @@ impl Civs { &mut rng, wpos, )), + SiteKind::ChapelSite => WorldSite::chapel_site( + site2::Site::generate_chapel_site(&Land::from_sim(ctx.sim), &mut rng, wpos), + ), }); sim_site.site_tmp = Some(site); let site_ref = &index.sites[site]; @@ -1130,24 +1147,8 @@ fn loc_suitable_for_site(sim: &WorldSim, loc: Vec2, site_kind: SiteKind) -> } true } - let possible_terrain = if let Some(chunk) = sim.get(loc) { - !chunk.river.is_ocean() - && !chunk.river.is_lake() - && !chunk.river.is_river() - && !chunk.is_underwater() - && !matches!( - chunk.get_biome(), - common::terrain::BiomeKind::Lake | common::terrain::BiomeKind::Ocean - ) - && sim - .get_gradient_approx(loc) - .map(|grad| grad < 1.0) - .unwrap_or(false) - } else { - false - }; let not_occupied = check_chunk_occupation(sim, loc, site_kind.exclusion_radius()); - possible_terrain && site_kind.is_suitable_loc(loc, sim) && not_occupied + site_kind.is_suitable_loc(loc, sim) && not_occupied } /// Attempt to search for a location that's suitable for site construction @@ -1240,6 +1241,7 @@ pub enum SiteKind { Refactor, CliffTown, DesertCity, + ChapelSite, Tree, GiantTree, Gnarling, @@ -1247,6 +1249,26 @@ pub enum SiteKind { impl SiteKind { pub fn is_suitable_loc(&self, loc: Vec2, sim: &WorldSim) -> bool { + let on_land = || -> bool { + if let Some(chunk) = sim.get(loc) { + !chunk.river.is_ocean() + && !chunk.river.is_lake() + && !chunk.river.is_river() + && !chunk.is_underwater() + && !matches!( + chunk.get_biome(), + common::terrain::BiomeKind::Lake | common::terrain::BiomeKind::Ocean + ) + } else { + false + } + }; + let on_flat_terrain = || -> bool { + sim.get_gradient_approx(loc) + .map(|grad| grad < 1.0) + .unwrap_or(false) + }; + sim.get(loc).map_or(false, |chunk| { let suitable_for_town = |score_threshold: f32| -> bool { const RESOURCE_RADIUS: i32 = 1; @@ -1345,10 +1367,16 @@ impl SiteKind { }; match self { SiteKind::Gnarling => { - (-0.3..0.4).contains(&chunk.temp) && chunk.tree_density > 0.75 + on_land() + && on_flat_terrain() + && (-0.3..0.4).contains(&chunk.temp) + && chunk.tree_density > 0.75 }, SiteKind::GiantTree | SiteKind::Tree => { - chunk.tree_density > 0.4 && (-0.3..0.4).contains(&chunk.temp) + on_land() + && on_flat_terrain() + && chunk.tree_density > 0.4 + && (-0.3..0.4).contains(&chunk.temp) }, SiteKind::CliffTown => { (-0.6..0.4).contains(&chunk.temp) @@ -1360,6 +1388,10 @@ impl SiteKind { && !chunk.near_cliffs() && suitable_for_town(4.0) }, + SiteKind::ChapelSite => { + matches!(chunk.get_biome(), BiomeKind::Ocean) + && CONFIG.sea_level < chunk.alt + 1.0 + }, SiteKind::Castle => { if chunk.tree_density > 0.4 || chunk.river.near_water() || chunk.near_cliffs() { return false; @@ -1387,8 +1419,8 @@ impl SiteKind { } true }, + SiteKind::Dungeon => on_land(), SiteKind::Refactor | SiteKind::Settlement => suitable_for_town(6.7), - _ => true, } }) } diff --git a/world/src/lib.rs b/world/src/lib.rs index 7ce7e3defc..e77c4837e4 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -161,6 +161,7 @@ impl World { civ::SiteKind::Tree | civ::SiteKind::GiantTree => world_msg::SiteKind::Tree, // TODO: Maybe change? civ::SiteKind::Gnarling => world_msg::SiteKind::Gnarling, + civ::SiteKind::ChapelSite => world_msg::SiteKind::ChapelSite, }, wpos: site.center * TerrainChunkSize::RECT_SIZE.map(|e| e as i32), } diff --git a/world/src/site/economy/context.rs b/world/src/site/economy/context.rs index 4d6f2250db..0614c0f932 100644 --- a/world/src/site/economy/context.rs +++ b/world/src/site/economy/context.rs @@ -128,6 +128,7 @@ impl Environment { SiteKind::Tree(_) => (), SiteKind::GiantTree(_) => (), SiteKind::Gnarling(_) => {}, + SiteKind::ChapelSite(_) => {}, } } if towns.valid() { diff --git a/world/src/site/mod.rs b/world/src/site/mod.rs index 3665f9f375..434d0e77bb 100644 --- a/world/src/site/mod.rs +++ b/world/src/site/mod.rs @@ -69,6 +69,7 @@ pub enum SiteKind { CliffTown(site2::Site), Tree(Tree), DesertCity(site2::Site), + ChapelSite(site2::Site), GiantTree(site2::Site), Gnarling(site2::Site), } @@ -123,6 +124,13 @@ impl Site { } } + pub fn chapel_site(p: site2::Site) -> Self { + Self { + kind: SiteKind::ChapelSite(p), + economy: Economy::default(), + } + } + pub fn tree(t: Tree) -> Self { Self { kind: SiteKind::Tree(t), @@ -145,6 +153,7 @@ impl Site { SiteKind::Refactor(s) => s.radius(), SiteKind::CliffTown(ct) => ct.radius(), SiteKind::DesertCity(dc) => dc.radius(), + SiteKind::ChapelSite(p) => p.radius(), SiteKind::Tree(t) => t.radius(), SiteKind::GiantTree(gt) => gt.radius(), SiteKind::Gnarling(g) => g.radius(), @@ -159,6 +168,7 @@ impl Site { SiteKind::Refactor(s) => s.origin, SiteKind::CliffTown(ct) => ct.origin, SiteKind::DesertCity(dc) => dc.origin, + SiteKind::ChapelSite(p) => p.origin, SiteKind::Tree(t) => t.origin, SiteKind::GiantTree(gt) => gt.origin, SiteKind::Gnarling(g) => g.origin, @@ -173,6 +183,7 @@ impl Site { SiteKind::Refactor(s) => s.spawn_rules(wpos), SiteKind::CliffTown(ct) => ct.spawn_rules(wpos), SiteKind::DesertCity(dc) => dc.spawn_rules(wpos), + SiteKind::ChapelSite(p) => p.spawn_rules(wpos), SiteKind::Tree(t) => t.spawn_rules(wpos), SiteKind::GiantTree(gt) => gt.spawn_rules(wpos), SiteKind::Gnarling(g) => g.spawn_rules(wpos), @@ -187,6 +198,7 @@ impl Site { SiteKind::Refactor(s) => s.name(), SiteKind::CliffTown(ct) => ct.name(), SiteKind::DesertCity(dc) => dc.name(), + SiteKind::ChapelSite(p) => p.name(), SiteKind::Tree(_) => "Giant Tree", SiteKind::GiantTree(gt) => gt.name(), SiteKind::Gnarling(g) => g.name(), @@ -219,6 +231,7 @@ impl Site { SiteKind::Refactor(s) => s.render(canvas, dynamic_rng), SiteKind::CliffTown(ct) => ct.render(canvas, dynamic_rng), SiteKind::DesertCity(dc) => dc.render(canvas, dynamic_rng), + SiteKind::ChapelSite(p) => p.render(canvas, dynamic_rng), SiteKind::Tree(t) => t.render(canvas, dynamic_rng), SiteKind::GiantTree(gt) => gt.render(canvas, dynamic_rng), SiteKind::Gnarling(g) => g.render(canvas, dynamic_rng), @@ -246,6 +259,7 @@ impl Site { SiteKind::Refactor(_) => {}, SiteKind::CliffTown(_) => {}, SiteKind::DesertCity(_) => {}, + SiteKind::ChapelSite(p) => p.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Tree(_) => {}, SiteKind::GiantTree(gt) => gt.apply_supplement(dynamic_rng, wpos2d, supplement), SiteKind::Gnarling(g) => g.apply_supplement(dynamic_rng, wpos2d, supplement), diff --git a/world/src/site/namegen.rs b/world/src/site/namegen.rs index e043a390ce..a9d5453556 100644 --- a/world/src/site/namegen.rs +++ b/world/src/site/namegen.rs @@ -529,7 +529,6 @@ impl<'a, R: Rng> NameGen<'a, R> { end: &[&str], ) -> String { let mut name = String::new(); - name += start.choose(self.rng).unwrap(); for _ in 0..self.approx_syllables.saturating_sub(2) { name += vowel.choose(self.rng).unwrap(); @@ -586,8 +585,8 @@ impl<'a, R: Rng> NameGen<'a, R> { "d", "ph", "r", "st", "t", "s", "p", "th", "br", "tr", "m", "k", "cr", "phr", "dr", "pl", "ch", "l", "ap", "akr", "ak", "ar", "ath", "asp", "al", "aph", "aphr", "oph", "or", "ok", "on", "od", "oth", "om", "ep", "er", "em", "eph", "eth", "yps", "yph", - "ach", "amph", "yp", "ik", "is", "iph", "ith", "pr", "as", "asph", "ps", "b", "n", "z", - "x", "kr", "kt", "cht", "chr", "thr", "dr", "pr", "pl", "h", "in", "g", "sph", + "ach", "amph", "yp", "ik", "is", "iph", "ith", "pr", "as", "ps", "b", "n", "z", "x", + "kr", "kt", "cht", "chr", "thr", "dr", "pr", "pl", "h", "in", "g", "sph", ]; let vowel = [ "o", "e", "a", "i", "y", "eo", "ae", "ea", "oi", "io", "ia", "aeo", diff --git a/world/src/site2/mod.rs b/world/src/site2/mod.rs index eb12c761c0..527e6077ad 100644 --- a/world/src/site2/mod.rs +++ b/world/src/site2/mod.rs @@ -887,6 +887,38 @@ impl Site { site } + pub fn generate_chapel_site(land: &Land, rng: &mut impl Rng, origin: Vec2) -> Self { + let mut rng = reseed(rng); + let mut site = Site { + origin, + name: NameGen::location(&mut rng).generate_danari(), + ..Site::default() + }; + // SeaChapel + let size = 10.0 as i32; + let aabr = Aabr { + min: Vec2::broadcast(-size), + max: Vec2::broadcast(size), + }; + { + let sea_chapel = plot::SeaChapel::generate(land, &mut reseed(&mut rng), &site, aabr); + let sea_chapel_alt = sea_chapel.alt; + let plot = site.create_plot(Plot { + kind: PlotKind::SeaChapel(sea_chapel), + root_tile: aabr.center(), + tiles: aabr_tiles(aabr).collect(), + seed: rng.gen(), + }); + + site.blit_aabr(aabr, Tile { + kind: TileKind::Building, + plot: Some(plot), + hard_alt: Some(sea_chapel_alt), + }); + } + site + } + pub fn wpos_tile_pos(&self, wpos2d: Vec2) -> Vec2 { (wpos2d - self.origin).map(|e| e.div_euclid(TILE_SIZE as i32)) } @@ -1131,6 +1163,7 @@ impl Site { PlotKind::House(house) => house.render_collect(self, canvas), PlotKind::Workshop(workshop) => workshop.render_collect(self, canvas), PlotKind::Castle(castle) => castle.render_collect(self, canvas), + PlotKind::SeaChapel(sea_chapel) => sea_chapel.render_collect(self, canvas), PlotKind::Dungeon(dungeon) => dungeon.render_collect(self, canvas), PlotKind::Gnarling(gnarling) => gnarling.render_collect(self, canvas), PlotKind::GiantTree(giant_tree) => giant_tree.render_collect(self, canvas), diff --git a/world/src/site2/plot.rs b/world/src/site2/plot.rs index df70e74ac4..27f3543ac5 100644 --- a/world/src/site2/plot.rs +++ b/world/src/site2/plot.rs @@ -6,12 +6,13 @@ pub mod dungeon; mod giant_tree; mod gnarling; mod house; +mod sea_chapel; mod workshop; pub use self::{ castle::Castle, cliff_tower::CliffTower, desert_city_multiplot::DesertCityMultiPlot, desert_city_temple::DesertCityTemple, dungeon::Dungeon, giant_tree::GiantTree, - gnarling::GnarlingFortification, house::House, workshop::Workshop, + gnarling::GnarlingFortification, house::House, sea_chapel::SeaChapel, workshop::Workshop, }; use super::*; @@ -52,6 +53,7 @@ pub enum PlotKind { Workshop(Workshop), DesertCityMultiPlot(DesertCityMultiPlot), DesertCityTemple(DesertCityTemple), + SeaChapel(SeaChapel), Plaza, Castle(Castle), Road(Path>), diff --git a/world/src/site2/plot/sea_chapel.rs b/world/src/site2/plot/sea_chapel.rs new file mode 100644 index 0000000000..93a324328a --- /dev/null +++ b/world/src/site2/plot/sea_chapel.rs @@ -0,0 +1,4995 @@ +use super::*; +use crate::{ + site2::{plot::dungeon::spiral_staircase, util::Dir}, + util::{sampler::Sampler, RandomField, NEIGHBORS}, + Land, CONFIG, +}; +use common::{ + generation::EntityInfo, + terrain::{Block, BlockKind, SpriteKind}, +}; + +use rand::prelude::*; +use std::sync::Arc; +use vek::*; + +pub struct SeaChapel { + bounds: Aabr, + pub(crate) alt: i32, +} +impl SeaChapel { + pub fn generate(_land: &Land, _rng: &mut impl Rng, site: &Site, tile_aabr: Aabr) -> Self { + let bounds = Aabr { + min: site.tile_wpos(tile_aabr.min), + max: site.tile_wpos(tile_aabr.max), + }; + Self { + bounds, + alt: CONFIG.sea_level as i32, + } + } +} + +impl Structure for SeaChapel { + fn render(&self, _site: &Site, _land: &Land, painter: &Painter) { + let base = self.alt + 1; + let center = self.bounds.center(); + let diameter = 54; + let mut rng = thread_rng(); + // Fills + let (top, washed) = match (RandomField::new(0).get(center.with_z(base))) % 2 { + 0 => { + //color_scheme_1 blue + ( + Fill::Brick(BlockKind::Rock, Rgb::new(0, 51, 209), 24), + Fill::Brick(BlockKind::Rock, Rgb::new(24, 115, 242), 12), + ) + }, + _ => { + //color_scheme_2 turquoise + ( + Fill::Brick(BlockKind::Rock, Rgb::new(0, 55, 71), 24), + Fill::Brick(BlockKind::Rock, Rgb::new(2, 106, 129), 24), + ) + }, + }; + let water = Fill::Block(Block::new(BlockKind::Water, Rgb::zero())); + let rope = Fill::Block(Block::air(SpriteKind::Rope)); + let ropefix1 = Fill::Brick(BlockKind::Rock, Rgb::new(80, 75, 35), 24); + let ropefix2 = Fill::Brick(BlockKind::Rock, Rgb::new(172, 172, 172), 4); + let white_polished = Fill::Brick(BlockKind::Rock, Rgb::new(202, 202, 202), 24); + let white_coral = Fill::Sampling(Arc::new(|center| { + let c = (RandomField::new(0).get(center) % 13) as u8 * 10 + 120; + Some(Block::new(BlockKind::Rock, Rgb::new(c, c, c))) + })); + let white = match (RandomField::new(0).get(center.with_z(base - 1))) % 2 { + 0 => white_polished, + _ => white_coral.clone(), + }; + let gold = Fill::Brick(BlockKind::GlowingRock, Rgb::new(245, 232, 0), 10); + let gold_chain = Fill::Block(Block::air(SpriteKind::SeaDecorChain)); + let gold_decor = Fill::Block(Block::air(SpriteKind::SeaDecorBlock)); + let window_hor = Fill::Block(Block::air(SpriteKind::SeaDecorWindowHor)); + let window_ver = Fill::Block(Block::air(SpriteKind::SeaDecorWindowVer)); + let window_ver2 = Fill::Block( + Block::air(SpriteKind::SeaDecorWindowVer) + .with_ori(2) + .unwrap(), + ); + let glass_barrier = Fill::Block(Block::air(SpriteKind::GlassBarrier)); + // random exit from water basin to side building + let mut connect_gate_types = vec![ + SpriteKind::GlassBarrier, + SpriteKind::SeaDecorWindowHor, + SpriteKind::SeaDecorWindowHor, + SpriteKind::SeaDecorWindowHor, + ]; + //Paint SeaChapel + // balcony1 + let center_b1 = Vec2::new(center.x + (diameter / 2) - (diameter / 4), center.y); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3) + 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 8), + max: (center_b1 + (diameter / 3) - 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 7), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 7), + max: (center_b1 + (diameter / 3) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 6), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 6), + max: (center_b1 + (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 5), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 5), + max: (center_b1 + (diameter / 3) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 5), + max: (center_b1 + (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + }) + .clear(); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3) - 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + max: (center_b1 + (diameter / 3) + 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_b1 - (diameter / 3) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + max: (center_b1 + (diameter / 3) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + }) + .clear(); + // balcony2 + let center_b2 = Vec2::new(center.x, center.y + (diameter / 2) - (diameter / 4)); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3) + 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 8), + max: (center_b2 + (diameter / 3) - 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 7), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 7), + max: (center_b2 + (diameter / 3) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 6), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 6), + max: (center_b2 + (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 5), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 5), + max: (center_b2 + (diameter / 3) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 5), + max: (center_b2 + (diameter / 3)) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + }) + .clear(); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3) - 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + max: (center_b2 + (diameter / 3) + 2) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_b2 - (diameter / 3) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + max: (center_b2 + (diameter / 3) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + }) + .clear(); + // chapel bottom + painter + .sphere(Aabb { + min: (center - (diameter / 2)).with_z(base - (2 * (diameter / 3))), + max: (center + (diameter / 2)).with_z(base - (2 * (diameter / 3)) + diameter), + }) + .fill(white.clone()); + // chapel clear bottom + painter + .sphere(Aabb { + min: (center - (diameter / 2) + 1).with_z(base - (2 * (diameter / 3)) + 1), + max: (center + (diameter / 2) - 1) + .with_z(base - (2 * (diameter / 3)) + diameter - 1), + }) + .clear(); + // chapel main room + painter + .sphere(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }) + .fill(white.clone()); + // chapel main room entry1 stairs1 + // entry1 white floor + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) + 3, + center.y - 5, + base + (diameter / 8) - 4, + ), + max: Vec3::new( + center.x - (diameter / 2) + (diameter / 5), + center.y + 5, + base + (diameter / 8) - 1, + ), + }) + .fill(white.clone()); + painter + .ramp( + Aabb { + min: Vec3::new( + center.x - (diameter / 2) - 12, + center.y - 3, + base - (diameter / 8) - 7, + ), + max: Vec3::new( + center.x - (diameter / 2) + 2, + center.y + 3, + base - (diameter / 8) + 7, + ), + }, + 14, + Dir::X, + ) + .fill(white.clone()); + // chapel main room entry2 stairs + // entry2 white floor + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - (diameter / 5), + center.y - 5, + base + (diameter / 8) - 4, + ), + max: Vec3::new( + center.x + (diameter / 2) - 3, + center.y + 5, + base + (diameter / 8) - 1, + ), + }) + .fill(white.clone()); + painter + .ramp( + Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 2, + center.y - 3, + base - (diameter / 8) - 7, + ), + max: Vec3::new( + center.x + (diameter / 2) + 12, + center.y + 3, + base - (diameter / 8) + 7, + ), + }, + 14, + Dir::NegX, + ) + .fill(white.clone()); + // chapel 1st washed out top + painter + .sphere(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }) + .without(painter.cylinder(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), + })) + .fill(washed.clone()); + // chapel 1st top + painter + .sphere(Aabb { + min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }) + .without(painter.cylinder(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), + })) + .fill(top.clone()); + // chapel small top room + painter + .sphere(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), + }) + .fill(white.clone()); + // chapel small washed out top + painter + .sphere(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), + }), + ) + .fill(washed.clone()); + // chapel small top + painter + .sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), + }), + ) + .fill(top.clone()); + // ground to top room stairway3 + let center_s3 = Vec2::new(center.x, center.y - (diameter / 2)); + // stairway3 top room + painter + .sphere(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), + }) + .fill(white.clone()); + // stairway3 top washed out + painter + .sphere(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), + }) + .without( + painter.cylinder(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), + }), + ) + .fill(washed.clone()); + // stairway3 top + painter + .sphere(Aabb { + min: (center_s3 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), + }) + .without( + painter.cylinder(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), + }), + ) + .fill(top.clone()); + // stairway3 top gold ring + painter + .cylinder(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 2), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 1), + }) + .fill(gold.clone()); + // stairway3 clear top halfway + painter + .sphere(Aabb { + min: (center_s3 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) - 2), + max: (center_s3 + (diameter / 6) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 4), + }) + .without( + painter.cylinder(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2)) + - 2, + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 10) - 3), + }), + ) + .clear(); + // stairway3 top window1 + painter + .aabb(Aabb { + min: Vec3::new( + center_s3.x + (diameter / 6) - 1, + center_s3.y - 1, + base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 5, + ), + max: Vec3::new( + center_s3.x + (diameter / 6), + center_s3.y + 1, + base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, + ), + }) + .fill(window_ver2.clone()); + // stairway3 top window2 + painter + .aabb(Aabb { + min: Vec3::new( + center_s3.x - (diameter / 6), + center_s3.y - 1, + base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 5, + ), + max: Vec3::new( + center_s3.x - (diameter / 6) + 1, + center_s3.y + 1, + base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, + ), + }) + .fill(window_ver2.clone()); + + // stairway3 top window3 + painter + .aabb(Aabb { + min: Vec3::new( + center_s3.x - 1, + center_s3.y - (diameter / 6), + base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 5, + ), + max: Vec3::new( + center_s3.x + 1, + center_s3.y - (diameter / 6) + 1, + base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, + ), + }) + .fill(window_ver.clone()); + + // chapel clear room + painter + .sphere(Aabb { + min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8) + 1), + max: (center + (diameter / 2) - 1).with_z(base - (diameter / 8) + diameter - 1), + }) + .clear(); + // chapel main room entry1 gold door frame + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) + 2, + center.y - 2, + base + (diameter / 8) + 5, + ), + max: Vec3::new( + center.x - (diameter / 2) + 4, + center.y + 2, + base + (diameter / 8) + 6, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) + 2, + center.y - 3, + base + (diameter / 8) + 3, + ), + max: Vec3::new( + center.x - (diameter / 2) + 5, + center.y + 3, + base + (diameter / 8) + 5, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) + 3, + center.y - 3, + base + (diameter / 8) - 3, + ), + max: Vec3::new( + center.x - (diameter / 2) + 5, + center.y + 3, + base + (diameter / 8) + 3, + ), + }) + .fill(gold_decor.clone()); + // chapel main room entry2 gold door frame + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 4, + center.y - 2, + base + (diameter / 8) + 5, + ), + max: Vec3::new( + center.x + (diameter / 2) - 2, + center.y + 2, + base + (diameter / 8) + 6, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 5, + center.y - 3, + base + (diameter / 8) + 3, + ), + max: Vec3::new( + center.x + (diameter / 2) - 2, + center.y + 3, + base + (diameter / 8) + 5, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 5, + center.y - 3, + base + (diameter / 8) - 3, + ), + max: Vec3::new( + center.x + (diameter / 2) - 3, + center.y + 3, + base + (diameter / 8) + 3, + ), + }) + .fill(gold_decor.clone()); + // chapel main room clear entries + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - 8, + center.y - 2, + base + (diameter / 8) - 3, + ), + max: Vec3::new( + center.x + (diameter / 2) + 8, + center.y + 2, + base + (diameter / 8) + 4, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - 8, + center.y - 1, + base + (diameter / 8) + 4, + ), + max: Vec3::new( + center.x + (diameter / 2) + 8, + center.y + 1, + base + (diameter / 8) + 5, + ), + }) + .clear(); + // chapel main room mobilees + let mbl_corner = center - 5; + for dir in SQUARE_4 { + let mbl_center = mbl_corner + dir * 10; + let mbl_offset = + ((RandomField::new(0).get((mbl_corner - dir).with_z(base))) % 4) as i32 - 2; + painter + .cone(Aabb { + min: (mbl_center - 2) + .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), + max: (mbl_center + 3) + .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset + 2), + }) + .fill(top.clone()); + painter + .cylinder(Aabb { + min: (mbl_center - 2) + .with_z(base - (diameter / 8) + (diameter / 3) + 1 + mbl_offset), + max: (mbl_center + 3) + .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: (mbl_center - 1) + .with_z(base - (diameter / 8) + (diameter / 3) + 1 + mbl_offset), + max: (mbl_center + 2) + .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), + }) + .clear(); + // chapel main room mobilee chains + painter + .aabb(Aabb { + min: Vec3::new( + mbl_center.x, + mbl_center.y, + base - (diameter / 8) + (diameter / 3) + 4 + mbl_offset, + ), + max: Vec3::new( + mbl_center.x + 1, + mbl_center.y + 1, + base - (diameter / 8) + (diameter / 2) + 1, + ), + }) + .fill(gold_chain.clone()); + } + // chapel main room window1 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2), + center.y - 4, + base - (diameter / 8) + (diameter / 2) - 2, + ), + max: Vec3::new( + center.x - (diameter / 2) + 1, + center.y + 4, + base - (diameter / 8) + (diameter / 2) - 1, + ), + }) + .fill(window_ver2.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2), + center.y - 3, + base - (diameter / 8) + (diameter / 2) - 3, + ), + max: Vec3::new( + center.x - (diameter / 2) + 1, + center.y + 3, + base - (diameter / 8) + (diameter / 2) - 2, + ), + }) + .fill(window_ver2.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2), + center.y - 2, + base - (diameter / 8) + (diameter / 2) - 4, + ), + max: Vec3::new( + center.x - (diameter / 2) + 1, + center.y + 2, + base - (diameter / 8) + (diameter / 2) - 3, + ), + }) + .fill(window_ver2.clone()); + + // chapel main room window2 to balcony1 + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 1, + center.y - 4, + base - (diameter / 8) + (diameter / 2) - 2, + ), + max: Vec3::new( + center.x + (diameter / 2), + center.y + 4, + base - (diameter / 8) + (diameter / 2) - 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 1, + center.y - 3, + base - (diameter / 8) + (diameter / 2) - 3, + ), + max: Vec3::new( + center.x + (diameter / 2), + center.y + 3, + base - (diameter / 8) + (diameter / 2) - 2, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - 1, + center.y - 2, + base - (diameter / 8) + (diameter / 2) - 4, + ), + max: Vec3::new( + center.x + (diameter / 2), + center.y + 2, + base - (diameter / 8) + (diameter / 2) - 3, + ), + }) + .clear(); + // chapel main room window3 to balcony2 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 4, + center.y + (diameter / 2) - 1, + base - (diameter / 8) + (diameter / 2) - 2, + ), + max: Vec3::new( + center.x + 4, + center.y + (diameter / 2), + base - (diameter / 8) + (diameter / 2) - 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y + (diameter / 2) - 1, + base - (diameter / 8) + (diameter / 2) - 3, + ), + max: Vec3::new( + center.x + 3, + center.y + (diameter / 2), + base - (diameter / 8) + (diameter / 2) - 2, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y + (diameter / 2) - 1, + base - (diameter / 8) + (diameter / 2) - 4, + ), + max: Vec3::new( + center.x + 2, + center.y + (diameter / 2), + base - (diameter / 8) + (diameter / 2) - 3, + ), + }) + .clear(); + // chapel gold ring and white floor + painter + .cylinder(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 1), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 2), + }) + .fill(gold.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) + 1), + max: (center + (diameter / 2) - 1) + .with_z(base - (diameter / 8) + (diameter / 2) + 2), + }) + .fill(white.clone()); + // chapel main room organ podium + let center_o = Vec2::new(center.x - (diameter / 4), center.y + (diameter / 4)); + painter + .cylinder(Aabb { + min: (center_o - 2).with_z(base), + max: (center_o + 2).with_z(base + (diameter / 8) - 2), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_o - 3).with_z(base + (diameter / 8) - 2), + max: (center_o + 3).with_z(base + (diameter / 8) - 1), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center_o - 4).with_z(base + (diameter / 8) - 1), + max: (center_o + 4).with_z(base + (diameter / 8)), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_o - 3).with_z(base + (diameter / 8) - 1), + max: (center_o + 3).with_z(base + (diameter / 8)), + }) + .fill(white.clone()); + // organ on chapel main room organ podium + let main_room_organ_pos = center_o.with_z(base + (diameter / 8)); + painter.spawn( + EntityInfo::at(main_room_organ_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), + ); + // sea clerics in chapel main room + let main_room_sea_clerics_pos = (center_o - 2).with_z(base + (diameter / 8)); + for _ in 0..(4 + ((RandomField::new(0).get((main_room_sea_clerics_pos).with_z(base))) % 4)) + { + painter.spawn( + EntityInfo::at(main_room_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // chapel first floor organ podium + let center_o2 = Vec2::new(center.x - (diameter / 4), center.y - (diameter / 4)); + painter + .cylinder(Aabb { + min: (center_o2 - 4).with_z(base - (diameter / 8) + (diameter / 2) + 2), + max: (center_o2 + 4).with_z(base - (diameter / 8) + (diameter / 2) + 3), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_o2 - 3).with_z(base - (diameter / 8) + (diameter / 2) + 2), + max: (center_o2 + 3).with_z(base - (diameter / 8) + (diameter / 2) + 3), + }) + .fill(white.clone()); + // organ on chapel first floor organ podium + let first_floor_organ_pos = center_o2.with_z(base - (diameter / 8) + (diameter / 2) + 2); + painter.spawn( + EntityInfo::at(first_floor_organ_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), + ); + // sea clerics on first floor + let first_floor_sea_clerics_pos = + (center_o2 - 2).with_z(base - (diameter / 8) + (diameter / 2) + 2); + for _ in + 0..(3 + ((RandomField::new(0).get((first_floor_sea_clerics_pos).with_z(base))) % 3)) + { + painter.spawn( + EntityInfo::at(first_floor_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // ground to top room stairway1 + let center_s1 = Vec2::new( + center.x - (diameter / 2) + (diameter / 8), + center.y - (diameter / 8) - (diameter / 16), + ); + // stairway1 top room + painter + .sphere(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), + }) + .fill(white.clone()); + // stairway1 top washed out + painter + .sphere(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), + }), + ) + .fill(washed.clone()); + // stairway1 top + painter + .sphere(Aabb { + min: (center_s1 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 4)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), + }), + ) + .fill(top.clone()); + // stairway1 top gold ring + painter + .cylinder(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) + 1), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) + 2), + }) + .fill(gold.clone()); + // stairway1 top window1 + painter + .aabb(Aabb { + min: Vec3::new( + center_s1.x - (diameter / 6), + center_s1.y - 1, + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 2, + ), + max: Vec3::new( + center_s1.x - (diameter / 6) + 1, + center_s1.y + 1, + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, + ), + }) + .fill(window_ver2.clone()); + + // stairway1 top window2 + painter + .aabb(Aabb { + min: Vec3::new( + center_s1.x - 1, + center_s1.y - (diameter / 6), + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 2, + ), + max: Vec3::new( + center_s1.x + 1, + center_s1.y - (diameter / 6) + 1, + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, + ), + }) + .fill(window_ver.clone()); + + // stairway1 top window3 + painter + .aabb(Aabb { + min: Vec3::new( + center_s1.x - 1, + center_s1.y + (diameter / 6) - 1, + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 2, + ), + max: Vec3::new( + center_s1.x + 1, + center_s1.y + (diameter / 6), + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, + ), + }) + .fill(window_ver.clone()); + + // ground to top room stairway2 + let center_s2 = Vec2::new( + center.x + (diameter / 2) - (diameter / 6), + center.y + (diameter / 8) + (diameter / 16), + ); + // stairway2 top room + painter + .sphere(Aabb { + min: (center_s2 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10)), + max: (center_s2 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), + }) + .fill(white.clone()); + // stairway2 top washed out + painter + .sphere(Aabb { + min: (center_s2 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10)), + max: (center_s2 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (center_s2 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10)), + max: (center_s2 + (diameter / 6)).with_z( + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6), + ), + }), + ) + .fill(washed.clone()); + // stairway2 top + painter + .sphere(Aabb { + min: (center_s2 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 10)), + max: (center_s2 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (center_s2 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10)), + max: (center_s2 + (diameter / 6)).with_z( + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6), + ), + }), + ) + .fill(top.clone()); + // stairway2 top gold ring + painter + .cylinder(Aabb { + min: (center_s2 - (diameter / 6)).with_z( + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) + 1, + ), + max: (center_s2 + (diameter / 6)).with_z( + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) + 2, + ), + }) + .fill(gold.clone()); + // chapel clear top room + painter + .sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 3) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 1), + }) + .clear(); + // stairway1 clear top halfway + painter + .sphere(Aabb { + min: (center_s1 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + 1), + max: (center_s1 + (diameter / 6) - 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3) - 1), + }) + .without( + painter.sphere(Aabb { + min: (center_s1 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + 1), + max: (center_s1 + (diameter / 6) - 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8)), + }), + ) + .clear(); + // stairway2 clear top halfway + painter + .sphere(Aabb { + min: (center_s2 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + 1), + max: (center_s2 + (diameter / 6) - 1).with_z( + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3) - 1, + ), + }) + .without( + painter.sphere(Aabb { + min: (center_s2 - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + 1), + max: (center_s2 + (diameter / 6) - 1) + .with_z(base - (diameter / 8) + diameter + 2), + }), + ) + .clear(); + // stairway2 top window1 + painter + .aabb(Aabb { + min: Vec3::new( + center_s2.x + (diameter / 6) - 1, + center_s2.y - 1, + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 2, + ), + max: Vec3::new( + center_s2.x + (diameter / 6), + center_s2.y + 1, + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 1, + ), + }) + .fill(window_ver2.clone()); + + // stairway2 top window2 + painter + .aabb(Aabb { + min: Vec3::new( + center_s2.x - 1, + center_s2.y + (diameter / 6) - 1, + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 2, + ), + max: Vec3::new( + center_s2.x + 1, + center_s2.y + (diameter / 6), + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 1, + ), + }) + .fill(window_ver.clone()); + // chapel tube1 / NPC-fence + painter + .cylinder(Aabb { + min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 2) + 2), + max: (center + (diameter / 6)).with_z(base - (diameter / 8) + diameter + 1), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 6) + 1) + .with_z(base - (diameter / 8) + (diameter / 2) + 2), + max: (center + (diameter / 6) - 1).with_z(base - (diameter / 8) + diameter + 1), + }) + .clear(); + // chapel tube1 glass barrier / gold door + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 1, + base + (diameter / 2) + 5, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 1, + base + (diameter / 2) + 6, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 2, + base + (diameter / 2) + 4, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 2, + base + (diameter / 2) + 5, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 1, + base + (diameter / 2) + 4, + ), + max: Vec3::new( + center.x - (diameter / 6) + 1, + center.y + 1, + base + (diameter / 2) + 5, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 3, + base + (diameter / 2) + 2, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 3, + base + (diameter / 2) + 4, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 2, + base + (diameter / 2) + 2, + ), + max: Vec3::new( + center.x - (diameter / 6) + 1, + center.y + 2, + base + (diameter / 2) + 4, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 2, + base + (diameter / 2) + 1, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 2, + base + (diameter / 2) + 2, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 1, + base + (diameter / 2) + 1, + ), + max: Vec3::new( + center.x - (diameter / 6) + 1, + center.y + 1, + base + (diameter / 2) + 2, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 1, + base + (diameter / 2), + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 1, + base + (diameter / 2) + 1, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 2, + base + (diameter / 2) + 2, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 2, + base + (diameter / 2) + 4, + ), + }) + .fill(window_ver2.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 1, + base + (diameter / 2) + 1, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 1, + base + (diameter / 2) + 5, + ), + }) + .fill(window_ver2.clone()); + // chapel floor1 mobilees and cages + let floor1_corner = center - (diameter / 5); + for dir in SQUARE_4 { + let floor1_pos = floor1_corner + dir * (2 * diameter / 5); + let floor1_variant = (RandomField::new(0).get((floor1_corner + dir).with_z(base))) % 10; + match floor1_variant { + // chapel first floor mobilee + 0..=4 => { + let floor1_mbl_top = Aabb { + min: (floor1_pos - 3) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 8), + max: (floor1_pos + 2) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 6), + }; + let floor1_mbl_gold = painter.cylinder(Aabb { + min: (floor1_pos - 3) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 9), + max: (floor1_pos + 2) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 8), + }); + let floor1_mbl_gold_clear = painter.aabb(Aabb { + min: (floor1_pos - 2) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 9), + max: (floor1_pos + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 8), + }); + let floor1_mbl_chain = Aabb { + min: (floor1_pos - 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 6), + max: (floor1_pos) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), + }; + painter.cone(floor1_mbl_top).fill(top.clone()); + floor1_mbl_gold.fill(gold_decor.clone()); + floor1_mbl_gold_clear.clear(); + painter.aabb(floor1_mbl_chain).fill(gold_chain.clone()); + }, + _ => { + // chapel floor1 hanging cages + let cage_glass_barriers = Aabb { + min: (floor1_pos - 3).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 5, + ), + max: (floor1_pos + 3) + .with_z(base - (diameter / 4) + diameter - (diameter / 8)), + }; + let cage_clear1 = Aabb { + min: (floor1_pos - 3 + 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 5, + ), + max: (floor1_pos + 3 - 1) + .with_z(base - (diameter / 4) + diameter - (diameter / 8)), + }; + let cage_clear2 = Aabb { + min: (floor1_pos - 3) + .with_z(base - (diameter / 4) + diameter - (diameter / 8) - 2), + max: (floor1_pos + 3) + .with_z(base - (diameter / 4) + diameter - (diameter / 8) - 1), + }; + let cage_windows = Aabb { + min: (floor1_pos - 3 + 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 4, + ), + max: (floor1_pos + 3 - 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 5, + ), + }; + let cage_platform = Aabb { + min: (floor1_pos - 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 4, + ), + max: (floor1_pos + 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 5, + ), + }; + let cage_chain = Aabb { + min: (floor1_pos - 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 5, + ), + max: (floor1_pos + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 2), + }; + let cage_chain_fix = Aabb { + min: (floor1_pos - 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 2), + max: (floor1_pos + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), + }; + let cage_coral_chest_podium = Aabb { + min: (floor1_pos + 1).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 4, + ), + max: (floor1_pos + 2).with_z( + base - (diameter / 4) + diameter + - (diameter / 8) + - (2 * (diameter / 11)) + + 6, + ), + }; + let cage_coral_chest_pos = (floor1_pos + 1).with_z( + base - (diameter / 4) + diameter - (diameter / 8) - (2 * (diameter / 11)) + + 6, + ); + // first floor cage Sea Cleric + let cage_sea_cleric_pos = (floor1_pos - 1).with_z( + base - (diameter / 4) + diameter - (diameter / 8) - (2 * (diameter / 11)) + + 5, + ); + painter + .cylinder(cage_glass_barriers) + .fill(glass_barrier.clone()); + painter.aabb(cage_clear1).clear(); + painter.cylinder(cage_clear2).clear(); + painter.aabb(cage_windows).fill(window_hor.clone()); + painter.aabb(cage_platform).fill(gold_decor.clone()); + painter.aabb(cage_chain).fill(gold_chain.clone()); + painter.aabb(cage_chain_fix).fill(gold_decor.clone()); + painter + .aabb(cage_coral_chest_podium) + .fill(gold_decor.clone()); + painter.rotated_sprite(cage_coral_chest_pos, SpriteKind::CoralChest, 2); + painter.spawn(EntityInfo::at(cage_sea_cleric_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric_sceptre", + &mut rng, + )); + }, + } + } + + // chapel floor1 window1 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 3), + center.y, + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x - (diameter / 3) + 1, + center.y + 2, + base - (diameter / 8) + diameter - 1, + ), + }) + .fill(window_ver2.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 3), + center.y, + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x - (diameter / 3) + 1, + center.y + 1, + base - (diameter / 8) + diameter - 2, + ), + }) + .fill(window_ver2.clone()); + + // chapel floor1 window2 + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 3) - 1, + center.y - 2, + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x + (diameter / 3), + center.y, + base - (diameter / 8) + diameter - 1, + ), + }) + .fill(window_ver2.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 3) - 1, + center.y - 1, + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x + (diameter / 3), + center.y, + base - (diameter / 8) + diameter - 2, + ), + }) + .fill(window_ver2.clone()); + + // chapel floor1 window3 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y + (diameter / 3) - 1, + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x + 2, + center.y + (diameter / 3), + base - (diameter / 8) + diameter - 1, + ), + }) + .fill(window_ver.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 1, + center.y + (diameter / 3) - 1, + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x + 1, + center.y + (diameter / 3), + base - (diameter / 8) + diameter - 2, + ), + }) + .fill(window_ver.clone()); + + // chapel floor1 window4 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y - (diameter / 3), + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x + 2, + center.y - (diameter / 3) + 1, + base - (diameter / 8) + diameter - 1, + ), + }) + .fill(window_ver.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 1, + center.y - (diameter / 3), + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x + 1, + center.y - (diameter / 3) + 1, + base - (diameter / 8) + diameter - 2, + ), + }) + .fill(window_ver.clone()); + + // chapel floor1 + painter + .cylinder(Aabb { + min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter + 1), + max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter + 2), + }) + .fill(gold.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 3) + 1).with_z(base - (diameter / 8) + diameter + 1), + max: (center + (diameter / 3) - 1).with_z(base - (diameter / 8) + diameter + 2), + }) + .fill(white.clone()); + // chapel tube2 / NPC-fence + painter + .cylinder(Aabb { + min: (center - (diameter / 6)).with_z(base - (diameter / 8) + diameter + 2), + max: (center + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 6) + 1).with_z(base - (diameter / 8) + diameter + 2), + max: (center + (diameter / 6) - 1) + .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), + }) + .clear(); + // chapel tube2 gold door + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 3, + base - (diameter / 8) + diameter + 2, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 3, + base - (diameter / 8) + diameter + 6, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 2, + base - (diameter / 8) + diameter + 6, + ), + max: Vec3::new( + center.x - (diameter / 6), + center.y + 2, + base - (diameter / 8) + diameter + 7, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 2, + base - (diameter / 8) + diameter + 2, + ), + max: Vec3::new( + center.x - (diameter / 6) + 1, + center.y + 2, + base - (diameter / 8) + diameter + 5, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 6) - 1, + center.y - 1, + base - (diameter / 8) + diameter + 5, + ), + max: Vec3::new( + center.x - (diameter / 6) + 1, + center.y + 1, + base - (diameter / 8) + diameter + 6, + ), + }) + .clear(); + //chapel floor2 + painter + .cylinder(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 8)), + }) + .fill(white.clone()); + //chapel floor2 glass barriers in tube + painter + .cylinder(Aabb { + min: (center - 4).with_z(base - (diameter / 8) + diameter - (diameter / 8)), + max: (center + 4).with_z(base - (diameter / 8) + diameter - (diameter / 8) + 2), + }) + .fill(glass_barrier.clone()); + //chapel floor2 drawer and potion + painter.sprite( + (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8)), + SpriteKind::DrawerSmall, + ); + painter.sprite( + (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8) + 1), + SpriteKind::PotionMinor, + ); + //chapel main room pillars1 + for dir in SQUARE_4 { + let sq_corner = Vec2::new(center.x - 3, center.y - (diameter / 4) - 2); + let pos = Vec3::new( + sq_corner.x + (dir.x * 5), + sq_corner.y + (dir.y * ((diameter / 2) + 2)), + base - (diameter / 8) + (diameter / 6), + ); + painter.sprite(pos, SpriteKind::SeaDecorPillar); + } + //chapel main room pillars2 + for dir in SQUARE_4 { + let sq_corner = Vec2::new(center.x - (diameter / 2) + 6, center.y - 4); + let pos = Vec3::new( + sq_corner.x + (dir.x * (diameter - 13)), + sq_corner.y + (dir.y * 7), + base - (diameter / 8) + (diameter / 6) + 2, + ); + painter.sprite(pos, SpriteKind::SeaDecorPillar); + } + //chapel floor1 pillars inside tube + for dir in SQUARE_4 { + let sq_corner = Vec2::new(center.x - (diameter / 8) - 2, center.y - 3); + let pos = Vec3::new( + sq_corner.x + (dir.x * ((diameter / 4) + 2)), + sq_corner.y + (dir.y * 5), + base - (diameter / 8) + (diameter / 2) + 2, + ); + painter.sprite(pos, SpriteKind::SeaDecorPillar); + } + //chapel floor1 pillars outside tube + for dir in SQUARE_4 { + let sq_corner = Vec2::new(center.x - (diameter / 8) - 3, center.y - 4); + let pos = Vec3::new( + sq_corner.x + (dir.x * ((diameter / 4) + 4)), + sq_corner.y + (dir.y * 7), + base - (diameter / 8) + (diameter / 2) + 2, + ); + painter.sprite(pos, SpriteKind::SeaDecorPillar); + } + //chapel floor2/3 pillars inside tube + for dir in SQUARE_4 { + for f in 0..2 { + let sq_corner = Vec2::new(center.x - (diameter / 8) - 2, center.y - 3); + let pos = Vec3::new( + sq_corner.x + (dir.x * ((diameter / 4) + 2)), + sq_corner.y + (dir.y * 5), + base - (diameter / 8) + diameter - (diameter / 8) + (f * ((diameter / 8) + 2)), + ); + painter.sprite(pos, SpriteKind::SeaDecorPillar); + } + } + //chapel floor2/3 pillars outside tube + for dir in SQUARE_4 { + for f in 0..2 { + let sq_corner = Vec2::new(center.x - (diameter / 8) - 3, center.y - 4); + let pos = Vec3::new( + sq_corner.x + (dir.x * ((diameter / 4) + 4)), + sq_corner.y + (dir.y * 7), + base - (diameter / 8) + diameter - (diameter / 8) + (f * ((diameter / 8) + 2)), + ); + painter.sprite(pos, SpriteKind::SeaDecorPillar); + } + } + // floor2 tube Sea Clerics + let fl2_tb_sea_clerics_pos = (center + (diameter / 8) - 2) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) + 1); + for _ in 0..(1 + (RandomField::new(0).get((fl2_tb_sea_clerics_pos).with_z(base))) % 3) { + painter.spawn( + EntityInfo::at(fl2_tb_sea_clerics_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric_sceptre", + &mut rng, + ), + ) + } + // chapel upper floor exits + let (exit_pos1, exit_pos2) = ( + Vec2::new(center.x, center.y + (diameter / 4)), + Vec2::new(center.x, center.y - (diameter / 4)), + ); + let floors_exit_distr = RandomField::new(0).get(center.with_z(base)) as usize % 2; + let (floor2_exit_center, floor3_exit_center) = match floors_exit_distr { + 0 => (exit_pos1, exit_pos2), + _ => (exit_pos2, exit_pos1), + }; + // floor3 exit + painter + .cylinder(Aabb { + min: (floor3_exit_center - 2).with_z(base - (diameter / 8) + diameter + 1), + max: (floor3_exit_center + 2).with_z(base - (diameter / 8) + diameter + 2), + }) + .fill(glass_barrier.clone()); + // floor2 exit + painter + .cylinder(Aabb { + min: (floor2_exit_center - 2) + .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), + max: (floor2_exit_center + 2) + .with_z(base - (diameter / 8) + diameter - (diameter / 8)), + }) + .fill(glass_barrier.clone()); + // floor 2 Sea Clerics + let fl2_sea_clerics_pos = Vec3::new( + center.x - 3, + center.y - (diameter / 4), + base - (diameter / 8) + diameter - (diameter / 8) + 1, + ); + for _ in 0..(2 + ((RandomField::new(0).get((fl2_sea_clerics_pos).with_z(base))) % 4)) { + painter.spawn( + EntityInfo::at(fl2_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // floor 3 Sea Clerics + let fl3_sea_clerics_pos = + (center - (diameter / 6)).with_z(base - (diameter / 8) + diameter + 2); + for _ in 0..(2 + ((RandomField::new(0).get((fl3_sea_clerics_pos).with_z(base))) % 2)) { + painter.spawn( + EntityInfo::at(fl3_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // chapel gold top emblem4 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 9, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 9, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + }) + .clear(); + // chapel gold top emblem5 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + }) + .clear(); + // chapel gold top emblem6 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + }) + .clear(); + // chapel gold top emblem7 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + }) + .clear(); + // chapel gold top emblem8 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + }) + .clear(); + // chapel gold top emblem9 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + }) + .clear(); + // chapel gold top emblem10 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + }) + .clear(); + // chapel gold top emblem11 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + }) + .clear(); + // chapel gold top emblem12 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + }) + .clear(); + // chapel gold top emblem13 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 31, + ), + }) + .fill(gold.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 31, + ), + }) + .clear(); + // chapel gold top sphere + painter + .sphere(Aabb { + min: (center - 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), + max: (center + 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), + }) + .fill(gold.clone()); + // chapel gold top pole + painter + .aabb(Aabb { + min: (center - 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), + max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 21), + }) + .fill(gold.clone()); + // chapel gold top emblem1 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + }) + .fill(gold.clone()); + // chapel gold top emblem2 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + }) + .fill(gold.clone()); + // chapel gold top emblem3 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 7, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 9, + ), + }) + .fill(gold.clone()); + // chapel main room pulpit + painter + .sphere(Aabb { + min: (center - (diameter / 6)).with_z(base - (diameter / 8)), + max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 3)), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6)), + max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 3)), + }) + .clear(); + // chapel main room pulpit gold ring + painter + .sphere(Aabb { + min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6)), + max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6) + 1), + }) + .fill(gold_decor.clone()); + + painter + .cylinder(Aabb { + min: (center - (diameter / 6) + 1).with_z(base - (diameter / 8) + (diameter / 6)), + max: (center + (diameter / 6) - 1) + .with_z(base - (diameter / 8) + (diameter / 6) + 1), + }) + .clear(); + // chapel clear rope & platform entries + painter + .cylinder(Aabb { + min: (center - 3).with_z(base - (2 * (diameter / 3)) + 3), + max: (center + 3).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 2), + }) + .clear(); + //chapel main room gold window downwards + painter + .cylinder(Aabb { + min: (center - 3).with_z(base - (diameter / 8)), + max: (center + 3).with_z(base - (diameter / 8) + 1), + }) + .fill(window_hor.clone()); + // chapel Ropefix1 + painter + .cylinder(Aabb { + min: (center - 2).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), + max: (center + 2).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 2), + }) + .fill(ropefix1.clone()); + // chapel Ropefix2 + painter + .cylinder(Aabb { + min: (center).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 4), + max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), + }) + .fill(ropefix2.clone()); + // chapel rope + painter + .cylinder(Aabb { + min: (center).with_z(base - (diameter / 8) + (diameter / 2) - 5), + max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 4), + }) + .fill(rope.clone()); + // chapel floor1 to cellar1 tube (access to dagons room) + let t_center = Vec2::new(center.x + (diameter / 4) + 2, center.y + (diameter / 4) + 4); + painter + .cylinder(Aabb { + min: (t_center - 2).with_z(base - (diameter / 8)), + max: (t_center + 2).with_z(base - (diameter / 8) + (diameter / 2) + 2), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: (t_center - 1).with_z(base - (diameter / 8)), + max: (t_center + 1).with_z(base - (diameter / 8) + (diameter / 2) + 2), + }) + .clear(); + painter + .cylinder(Aabb { + min: (t_center - 1).with_z(base - (diameter / 8) + (diameter / 2) + 1), + max: (t_center + 1).with_z(base - (diameter / 8) + (diameter / 2) + 2), + }) + .fill(glass_barrier.clone()); + // chapel cellar2 water + painter + .cylinder(Aabb { + min: (center - 5).with_z(base - (2 * (diameter / 3)) + 1), + max: (center + 5).with_z(base - (2 * (diameter / 3)) + 2), + }) + .fill(water.clone()); + painter + .cylinder(Aabb { + min: (center - 11).with_z(base - (2 * (diameter / 3)) + 2), + max: (center + 11).with_z(base - (2 * (diameter / 3)) + 3), + }) + .fill(water.clone()); + // chapel cellar to basin glass barrier barricade downwards & miniboss + // cellar floor + painter + .cylinder(Aabb { + min: (center - (2 * (diameter / 3))).with_z(base - (2 * (diameter / 3)) + 10), + max: (center + (2 * (diameter / 3))).with_z(base - (2 * (diameter / 3)) + 16), + }) + .fill(white_coral.clone()); + // exit to water basin + let exit = Fill::Sampling(Arc::new(|center| { + let c = RandomField::new(0).get(center - 6) % 11; + Some(if c < 8 { + let c = c as u8 * 10 + 120; + Block::new(BlockKind::Rock, Rgb::new(c, c, c)) + } else { + Block::air(SpriteKind::GlassBarrier) + }) + })); + // glass barriers with center clearance for dagon + painter + .cylinder(Aabb { + min: (center - 9).with_z(base - (2 * (diameter / 3)) + 10), + max: (center + 9).with_z(base - (2 * (diameter / 3)) + 16), + }) + .fill(glass_barrier.clone()); + painter + .cylinder(Aabb { + min: (center - 9).with_z(base - (2 * (diameter / 3)) + 13), + max: (center + 9).with_z(base - (2 * (diameter / 3)) + 14), + }) + .without(painter.cylinder(Aabb { + min: (center - 8).with_z(base - (2 * (diameter / 3)) + 13), + max: (center + 8).with_z(base - (2 * (diameter / 3)) + 14), + })) + .fill(exit); + painter + .cylinder(Aabb { + min: (center - 8).with_z(base - (2 * (diameter / 3)) + 14), + max: (center + 8).with_z(base - (2 * (diameter / 3)) + 16), + }) + .clear(); + painter + .cylinder(Aabb { + min: (center - 8).with_z(base - (2 * (diameter / 3)) + 10), + max: (center + 8).with_z(base - (2 * (diameter / 3)) + 14), + }) + .fill(white_coral); + let cellar_miniboss_pos = center.with_z(base - (2 * (diameter / 3)) + 17); + painter.spawn( + EntityInfo::at(cellar_miniboss_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.dagon", &mut rng), + ); + // cellar 2 sea crocodiles + let cellar_sea_croc_pos = (center - 12).with_z(base - (2 * (diameter / 3)) + 8); + for _ in 0..(3 + ((RandomField::new(0).get((cellar_sea_croc_pos).with_z(base))) % 5)) { + painter.spawn( + EntityInfo::at(cellar_sea_croc_pos.as_()) + .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), + ) + } + // water basin + painter + .sphere(Aabb { + min: (center - diameter + (diameter / 5) + 1).with_z(base - (4 * diameter / 3)), + max: (center + diameter - (diameter / 5) - 1).with_z(base + 1), + }) + .without(painter.cylinder(Aabb { + min: (center - diameter + (diameter / 5) + 1).with_z(base - (2 * diameter / 3) + 1), + max: (center + diameter - (diameter / 5) - 1).with_z(base + 1), + })) + .fill(white.clone()); + painter + .sphere(Aabb { + min: (center - diameter + (diameter / 5) + 2).with_z(base - (4 * diameter / 3) + 1), + max: (center + diameter - (diameter / 5) - 2).with_z(base + 1), + }) + .without(painter.cylinder(Aabb { + min: (center - diameter + (diameter / 5) + 2).with_z(base - (2 * diameter / 3) + 1), + max: (center + diameter - (diameter / 5) - 2).with_z(base + 1), + })) + .fill(water.clone()); + // stairway1 bottom + painter + .sphere(Aabb { + min: (center_s1 - (diameter / 4)) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), + max: (center_s1 + (diameter / 4)).with_z(base - (2 * (diameter / 3)) + 3), + }) + .fill(white.clone()); + // stairway1 bottom gold ring + painter + .cylinder(Aabb { + min: (center_s1 - (diameter / 4)) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4)), + max: (center_s1 + (diameter / 4)) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4) + 1), + }) + .fill(gold.clone()); + painter + .sphere(Aabb { + min: (center_s1 - (diameter / 4) + 1) + .with_z(base - (2 * (diameter / 3)) + 4 - (diameter / 2)), + max: (center_s1 + (diameter / 4) - 1).with_z(base - (2 * (diameter / 3)) + 2), + }) + .clear(); + // stairway1 bottom clear entry + painter + .cylinder(Aabb { + min: Vec3::new( + center_s1.x - 5, + center_s1.y - 5, + base - (2 * (diameter / 3)) + 1, + ), + max: Vec3::new( + center_s1.x + 5, + center_s1.y + 5, + base - (2 * (diameter / 3)) + 2, + ), + }) + .clear(); + // stairway1 bottom window to basin + painter + .cylinder(Aabb { + min: Vec3::new( + center_s1.x - 4, + center_s1.y - 4, + base - (2 * (diameter / 3)) + 4 - (diameter / 2), + ), + max: Vec3::new( + center_s1.x + 4, + center_s1.y + 4, + base - (2 * (diameter / 3)) + 5 - (diameter / 2), + ), + }) + .fill(window_hor); + // stairway1 tube + painter + .cylinder(Aabb { + min: Vec3::new( + center_s1.x - 5, + center_s1.y - 5, + base - (2 * (diameter / 3)) + 1, + ), + max: Vec3::new( + center_s1.x + 5, + center_s1.y + 5, + base - (diameter / 8) + diameter - (diameter / 8), + ), + }) + .fill(white.clone()); + + painter + .cylinder(Aabb { + min: Vec3::new( + center_s1.x - 4, + center_s1.y - 4, + base - (2 * (diameter / 3)) + 1, + ), + max: Vec3::new( + center_s1.x + 4, + center_s1.y + 4, + base - (diameter / 8) + diameter - (diameter / 8), + ), + }) + .clear(); + // stairway1 tube window1 + painter + .aabb(Aabb { + min: Vec3::new(center_s1.x - 5, center_s1.y - 1, base + (diameter / 6)), + max: Vec3::new( + center_s1.x - 4, + center_s1.y + 1, + base - (diameter / 8) + diameter - (diameter / 4) + 1, + ), + }) + .fill(window_ver2.clone()); + + // stairway1 stairs + let stair_radius1 = 4.5; + let stairs_clear1 = painter.cylinder(Aabb { + min: (center_s1 - stair_radius1 as i32) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), + max: (center_s1 + stair_radius1 as i32) + .with_z(base - (diameter / 8) + diameter - (diameter / 8)), + }); + stairs_clear1 + .sample(spiral_staircase( + center_s1.with_z(base - (diameter / 8) + diameter - (diameter / 8)), + stair_radius1, + 0.5, + 7.0, + )) + .fill(white.clone()); + // coral chest podium + painter + .aabb(Aabb { + min: Vec3::new( + center_s1.x, + center_s1.y - 2, + base - (2 * (diameter / 3)) - (diameter / 2) + 12, + ), + max: Vec3::new( + center_s1.x + 1, + center_s1.y - 1, + base - (2 * (diameter / 3)) - (diameter / 2) + 13, + ), + }) + .fill(gold_decor.clone()); + // coral chest + painter.rotated_sprite( + Vec3::new( + center_s1.x, + center_s1.y - 2, + base - (2 * (diameter / 3)) - (diameter / 2) + 13, + ), + SpriteKind::CoralChest, + 2, + ); + // cardinals room next to stairway1 bottom + let cr_center = Vec2::new(center.x - diameter - 3, center.y - (diameter / 5) + 1); + painter + .cylinder(Aabb { + min: (cr_center - (diameter / 3)) + .with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 5), + max: (cr_center + (diameter / 3)).with_z(base - (2 * (diameter / 3)) + 3), + }) + .fill(white.clone()); + // cardinals room gold ring + painter + .cylinder(Aabb { + min: (cr_center - (diameter / 3)) + .with_z(base - (2 * (diameter / 3)) - (diameter / 4) + 3), + max: (cr_center + (diameter / 3)) + .with_z(base - (2 * (diameter / 3)) - (diameter / 4) + 4), + }) + .fill(gold.clone()); + // clear cardinals room + painter + .cylinder(Aabb { + min: (cr_center - (diameter / 3) + 1) + .with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4), + max: (cr_center + (diameter / 3) - 1).with_z(base - (2 * (diameter / 3)) + 2), + }) + .clear(); + // Cardinals room chamber mobile1 + painter + .cone(Aabb { + min: (cr_center - 2).with_z(base - (2 * (diameter / 3)) - 7), + max: (cr_center + 3).with_z(base - (2 * (diameter / 3)) - 5), + }) + .fill(top.clone()); + painter + .cylinder(Aabb { + min: (cr_center - 2).with_z(base - (2 * (diameter / 3)) - 8), + max: (cr_center + 3).with_z(base - (2 * (diameter / 3)) - 7), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: (cr_center - 1).with_z(base - (2 * (diameter / 3)) - 8), + max: (cr_center + 2).with_z(base - (2 * (diameter / 3)) - 7), + }) + .clear(); + // Cardinals room mobile1 chain + painter + .aabb(Aabb { + min: cr_center.with_z(base - (2 * (diameter / 3)) - 5), + max: (cr_center + 1).with_z(base - (2 * (diameter / 3)) + 2), + }) + .fill(gold_chain.clone()); + // passage from stairway1 bottom to cardinals room + painter + .aabb(Aabb { + min: Vec3::new( + cr_center.x + (diameter / 3), + cr_center.y - 3, + base - (2 * (diameter / 3)) - (diameter / 4), + ), + max: Vec3::new( + cr_center.x + (diameter / 3) + 5, + cr_center.y + 3, + base - (2 * (diameter / 3)) - (diameter / 4) + 5, + ), + }) + .fill(white.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + cr_center.x + (diameter / 3), + cr_center.y - 2, + base - (2 * (diameter / 3)) - (diameter / 4) - 1, + ), + max: Vec3::new( + cr_center.x + (diameter / 3) + 5, + cr_center.y + 2, + base - (2 * (diameter / 3)) - (diameter / 4) + 6, + ), + }) + .fill(white.clone()); + // passage from stairway1 bottom to cardinals room gold stripes + painter + .aabb(Aabb { + min: Vec3::new( + cr_center.x + (diameter / 3), + cr_center.y - 3, + base - (2 * (diameter / 3)) - (diameter / 4) + 3, + ), + max: Vec3::new( + cr_center.x + (diameter / 3) + 5, + cr_center.y + 3, + base - (2 * (diameter / 3)) - (diameter / 4) + 4, + ), + }) + .fill(gold.clone()); + // clear passage from stairway1 bottom to cardinals room + painter + .aabb(Aabb { + min: Vec3::new( + cr_center.x + (diameter / 3) - 1, + cr_center.y - 2, + base - (2 * (diameter / 3)) - (diameter / 4), + ), + max: Vec3::new( + cr_center.x + (diameter / 3) + 6, + cr_center.y + 2, + base - (2 * (diameter / 3)) - (diameter / 4) + 5, + ), + }) + .clear(); + // Cardinals room Sea Clerics + let cr_sea_clerics_pos = + (cr_center - 2).with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4); + for _ in 0..(2 + ((RandomField::new(0).get((fl2_sea_clerics_pos).with_z(base))) % 3)) { + painter.spawn( + EntityInfo::at(cr_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // Cardinal + let cr_cardinal_pos = + (cr_center + 2).with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4); + painter.spawn( + EntityInfo::at(cr_cardinal_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.cardinal", &mut rng), + ); + // stairway2 bottom + painter + .sphere(Aabb { + min: (center_s2 - (diameter / 4)) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), + max: (center_s2 + (diameter / 4)).with_z(base - (2 * (diameter / 3)) + 3), + }) + .fill(white.clone()); + // stairway2 bottom gold ring + painter + .cylinder(Aabb { + min: (center_s2 - (diameter / 4)) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4)), + max: (center_s2 + (diameter / 4)) + .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4) + 1), + }) + .fill(gold.clone()); + painter + .sphere(Aabb { + min: (center_s2 - (diameter / 4) + 1) + .with_z(base - (2 * (diameter / 3)) + 4 - (diameter / 2)), + max: (center_s2 + (diameter / 4) - 1).with_z(base - (2 * (diameter / 3)) + 2), + }) + .fill(water.clone()); + // stairway2 bottom clear entry + painter + .cylinder(Aabb { + min: Vec3::new( + center_s2.x - 5, + center_s2.y - 5, + base - (2 * (diameter / 3)) + 1, + ), + max: Vec3::new( + center_s2.x + 5, + center_s2.y + 5, + base - (2 * (diameter / 3)) + 2, + ), + }) + .clear(); + // stairway2 bottom water to basin + painter + .cylinder(Aabb { + min: Vec3::new( + center_s2.x - 4, + center_s2.y - 4, + base - (2 * (diameter / 3)) + 4 - (diameter / 2), + ), + max: Vec3::new( + center_s2.x + 4, + center_s2.y + 4, + base - (2 * (diameter / 3)) + 5 - (diameter / 2), + ), + }) + .fill(water.clone()); + // stairway2 tube + painter + .cylinder(Aabb { + min: Vec3::new( + center_s2.x - 5, + center_s2.y - 5, + base - (2 * (diameter / 3)) + 1, + ), + max: Vec3::new( + center_s2.x + 5, + center_s2.y + 5, + base - (diameter / 8) + diameter + 2, + ), + }) + .fill(white.clone()); + painter + .cylinder(Aabb { + min: Vec3::new( + center_s2.x - 4, + center_s2.y - 4, + base - (2 * (diameter / 3)) + 1, + ), + max: Vec3::new( + center_s2.x + 4, + center_s2.y + 4, + base - (diameter / 8) + diameter + 2, + ), + }) + .clear(); + // stairway2 tube window1 + painter + .aabb(Aabb { + min: Vec3::new( + center_s2.x + 4, + center_s2.y - 1, + base + (diameter / 8) + (diameter / 2), + ), + max: Vec3::new( + center_s2.x + 5, + center_s2.y + 1, + base - (diameter / 8) + diameter - 4, + ), + }) + .fill(window_ver2.clone()); + // coral chest + painter.rotated_sprite( + Vec3::new( + center_s2.x - 5, + center_s2.y - 4, + base - (2 * (diameter / 3)) - (diameter / 2) + 11, + ), + SpriteKind::DungeonChest1, + 2, + ); + // bottom 2 sea crocodiles + let bt_sea_croc_pos = center_s2.with_z(base - (2 * (diameter / 3)) - (diameter / 2) + 11); + for _ in 0..(2 + ((RandomField::new(0).get((bt_sea_croc_pos).with_z(base))) % 3)) { + painter.spawn( + EntityInfo::at(bt_sea_croc_pos.as_()) + .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), + ) + } + // underwater chamber + painter + .sphere(Aabb { + min: (center - (diameter / 3)).with_z(base - (4 * diameter / 3) - (diameter / 6)), + max: (center + (diameter / 3)).with_z(base - (2 * diameter / 3) - (diameter / 6)), + }) + .without( + painter.sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), + }), + ) + .fill(white.clone()); + // underwater chamber entries + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 3), + center.y - 2, + base - (3 * diameter / 3) - (diameter / 3) + 1, + ), + max: Vec3::new( + center.x + (diameter / 3), + center.y + 2, + base - (3 * diameter / 3) - (diameter / 6) - 2, + ), + }) + .fill(water.clone()); + // underwater chamber entries + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 3), + center.y - 1, + base - (3 * diameter / 3) - (diameter / 6) - 2, + ), + max: Vec3::new( + center.x + (diameter / 3), + center.y + 1, + base - (3 * diameter / 3) - (diameter / 6) - 1, + ), + }) + .fill(water.clone()); + // underwater chamber gold ring white floor + painter + .cylinder(Aabb { + min: (center - (diameter / 3)).with_z(base - (3 * diameter / 3) - (diameter / 6)), + max: (center + (diameter / 3)) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + }) + .fill(gold.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (3 * diameter / 3) - (diameter / 6)), + max: (center + (diameter / 3) - 1) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + }) + .fill(white.clone()); + // underwater chamber floor entry + painter + .cylinder(Aabb { + min: (center - 2).with_z(base - (3 * diameter / 3) - (diameter / 6)), + max: (center + 2).with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + }) + .fill(water.clone()); + // fill underwater chamber halfway with air + painter + .sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), + }) + .without( + painter.cylinder(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + }), + ) + .clear(); + // chapel underwater chamber mobile1 + painter + .cone(Aabb { + min: (center - 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), + max: (center + 3).with_z(base - (2 * diameter / 3) - (diameter / 6) - 5), + }) + .fill(top.clone()); + painter + .cylinder(Aabb { + min: (center - 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 8), + max: (center + 3).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: (center - 1).with_z(base - (2 * diameter / 3) - (diameter / 6) - 8), + max: (center + 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), + }) + .clear(); + // chapel underwater chamber mobile1 chain + painter + .aabb(Aabb { + min: center.with_z(base - (2 * diameter / 3) - (diameter / 6) - 5), + max: (center + 1).with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), + }) + .fill(gold_chain); + // underwater chamber coral chest + painter + .cylinder(Aabb { + min: (center - (diameter / 6) - 1) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + max: (center - (diameter / 6) + 3) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: (center - (diameter / 6)) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + max: (center - (diameter / 6) + 2) + .with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), + }) + .fill(white.clone()); + // coral chest + painter.rotated_sprite( + (center - (diameter / 6)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), + SpriteKind::CoralChest, + 2, + ); + // underwater chamber sea crocodiles & sea clerics + let uwc_sea_croc_pos = + (center + (diameter / 8)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2); + for _ in 0..(3 + ((RandomField::new(0).get((uwc_sea_croc_pos).with_z(base))) % 5)) { + painter.spawn( + EntityInfo::at(uwc_sea_croc_pos.as_()) + .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), + ) + } + let uwc_sea_clerics_pos = + (center + (diameter / 7)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2); + for _ in 0..(2 + ((RandomField::new(0).get((uwc_sea_clerics_pos).with_z(base))) % 2)) { + painter.spawn( + EntityInfo::at(uwc_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ); + } + // Holding Cell2 + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - (diameter / 8) - 1, + center.y + (diameter / 16) - 1, + base - (diameter / 4) - 2, + ), + max: Vec3::new( + center.x - (diameter / 2) + (diameter / 8) + 1, + center.y + (diameter / 16) + (diameter / 4) + 1, + base, + ), + }) + .fill(white.clone()); + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - (diameter / 8), + center.y + (diameter / 16), + base - (diameter / 8), + ), + max: Vec3::new( + center.x - (diameter / 2) + (diameter / 8), + center.y + (diameter / 16) + (diameter / 4), + base - (diameter / 8) + (diameter / 4), + ), + }) + .fill(white.clone()); + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - (diameter / 8) + 1, + center.y + (diameter / 16) - 1, + base - (diameter / 8) + 1, + ), + max: Vec3::new( + center.x - (diameter / 2) + (diameter / 8) - 1, + center.y + (diameter / 16) + (diameter / 4) + 1, + base - (diameter / 8) + (diameter / 4) - 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - (diameter / 8) - 3, + center.y + (diameter / 16) + (diameter / 8) - 1, + base - (diameter / 8) + (diameter / 16) + 2, + ), + max: Vec3::new( + center.x - (diameter / 2) - (diameter / 8) + 1, + center.y + (diameter / 16) + (diameter / 4) - (diameter / 8) + 1, + base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 2, + ), + }) + .clear(); + painter.sprite( + Vec3::new( + center.x - (diameter / 2) - (diameter / 16) + 4, + center.y + (diameter / 6) - 1, + base - (diameter / 8) + (diameter / 16) - 1, + ), + SpriteKind::DungeonChest1, + ); + // Holding Cell2 glass barriers + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - (diameter / 8), + center.y + (diameter / 16) + (diameter / 8) - 1, + base - (diameter / 8) + (diameter / 16) + 3, + ), + max: Vec3::new( + center.x - (diameter / 2) - (diameter / 8) + 1, + center.y + (diameter / 16) + (diameter / 4) - (diameter / 8) + 1, + base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 3, + ), + }) + .fill(glass_barrier.clone()); + // Holding Cell3 + painter + .sphere(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - (diameter / 8) - 1, + center.y - (diameter / 4) - (diameter / 16) - 1, + base - (diameter / 4) - 2, + ), + max: Vec3::new( + center.x + (diameter / 2) + (diameter / 8) + 1, + center.y - (diameter / 16) + 1, + base, + ), + }) + .fill(white.clone()); + painter + .sphere(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - (diameter / 8), + center.y - (diameter / 4) - (diameter / 16), + base - (diameter / 8), + ), + max: Vec3::new( + center.x + (diameter / 2) + (diameter / 8), + center.y - (diameter / 16), + base - (diameter / 8) + (diameter / 4), + ), + }) + .fill(white.clone()); + painter + .sphere(Aabb { + min: Vec3::new( + center.x + (diameter / 2) - (diameter / 8) + 1, + center.y - (diameter / 4) - (diameter / 16) + 1, + base - (diameter / 8) + 1, + ), + max: Vec3::new( + center.x + (diameter / 2) + (diameter / 8) - 1, + center.y - (diameter / 16) - 1, + base - (diameter / 8) + (diameter / 4) - 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) + (diameter / 8) - 1, + center.y - (diameter / 4) - (diameter / 16) + (diameter / 8) - 1, + base - (diameter / 8) + (diameter / 16) + 2, + ), + max: Vec3::new( + center.x + (diameter / 2) + (diameter / 8) + 3, + center.y - (diameter / 16) - (diameter / 8) + 1, + base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 2, + ), + }) + .clear(); + painter.sprite( + Vec3::new( + center.x + (diameter / 2), + center.y - (diameter / 8) - (diameter / 16), + base - (diameter / 8) + 2, + ), + SpriteKind::DungeonChest1, + ); + // Holding Cell3 glass barriers + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 2) + (diameter / 8) - 1, + center.y - (diameter / 4) - (diameter / 16) + (diameter / 8) - 1, + base - (diameter / 8) + (diameter / 16) + 3, + ), + max: Vec3::new( + center.x + (diameter / 2) + (diameter / 8), + center.y - (diameter / 16) - (diameter / 8) + 1, + base - (diameter / 8) + (diameter / 16) + 4, + ), + }) + .fill(glass_barrier.clone()); + // Holding Cell1 + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 4), + center.y - (diameter / 2) - (diameter / 4), + base - (diameter / 4), + ), + max: Vec3::new( + center.x + (diameter / 4), + center.y - (diameter / 2) + (diameter / 4), + base - (diameter / 4) + (diameter / 2), + ), + }) + .fill(white.clone()); + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 4) + 1, + center.y - (diameter / 2) - (diameter / 4) + 1, + base - (diameter / 4) + 1, + ), + max: Vec3::new( + center.x + (diameter / 4 - 1), + center.y - (diameter / 2) + (diameter / 4) - 1, + base - (diameter / 4) + (diameter / 2) - 1, + ), + }) + .without(painter.cylinder(Aabb { + min: Vec3::new( + center.x - (diameter / 4) + 1, + center.y - (diameter / 2) - (diameter / 4) + 1, + base - (diameter / 4) + 1, + ), + max: Vec3::new( + center.x + (diameter / 4 - 1), + center.y - (diameter / 2) + (diameter / 4) - 1, + base - 1, + ), + })) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16), + center.y - (diameter / 2) - (diameter / 4) - 3, + base, + ), + max: Vec3::new( + center.x + (diameter / 16), + center.y - (diameter / 2) - (diameter / 4) + 1, + base + 3, + ), + }) + .clear(); + // Holding Cell1 windows + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16), + center.y - (diameter / 2) - (diameter / 4), + base, + ), + max: Vec3::new( + center.x + (diameter / 16), + center.y - (diameter / 2) - (diameter / 4) + 1, + base + 3, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y - (diameter / 2) - (diameter / 4), + base + 1, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y - (diameter / 2) - (diameter / 4) + 1, + base + 2, + ), + }) + .fill(window_ver.clone()); + // chapel main room pulpit stairs1 + painter + .ramp( + Aabb { + min: Vec3::new(center.x - 8, center.y - (diameter / 4) - 2, base - 3), + max: Vec3::new(center.x - 3, center.y - (diameter / 4) + 7, base + 2), + }, + 5, + Dir::X, + ) + .fill(white.clone()); + // chapel main room pulpit stairs2 + painter + .ramp( + Aabb { + min: Vec3::new(center.x + 3, center.y - (diameter / 4) - 2, base - 3), + max: Vec3::new(center.x + 8, center.y - (diameter / 4) + 7, base + 2), + }, + 5, + Dir::NegX, + ) + .fill(white.clone()); + // chapel main room pulpit stairs2 + painter + .ramp( + Aabb { + min: Vec3::new(center.x - 8, center.y + (diameter / 4) - 7, base - 3), + max: Vec3::new(center.x - 3, center.y + (diameter / 4) + 2, base + 2), + }, + 5, + Dir::X, + ) + .fill(white.clone()); + // chapel main room pulpit stairs4 + painter + .ramp( + Aabb { + min: Vec3::new(center.x + 3, center.y + (diameter / 4) - 7, base - 3), + max: Vec3::new(center.x + 8, center.y + (diameter / 4) + 2, base + 2), + }, + 5, + Dir::NegX, + ) + .fill(white.clone()); + // Holding Cell1 passage to main room + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16), + center.y - (diameter / 3) + 3, + base - 4, + ), + max: Vec3::new( + center.x + (diameter / 16), + center.y - (diameter / 20) - 1, + base + 3, + ), + }) + .fill(white.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y - (diameter / 3) + 3, + base - 3, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y - (diameter / 20) - 1, + base, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y - (diameter / 3), + base - 2, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y - (diameter / 20) - 1, + base, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 2, + center.y - (diameter / 3) + 3, + base, + ), + max: Vec3::new( + center.x + (diameter / 16) - 2, + center.y - (diameter / 20) - 1, + base + 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y - (diameter / 3) + 3, + base - 3, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y - (diameter / 3) + 4, + base + 1, + ), + }) + .fill(gold_decor.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 2, + center.y - (diameter / 3) + 3, + base - 2, + ), + max: Vec3::new( + center.x + (diameter / 16) - 2, + center.y - (diameter / 3) + 4, + base, + ), + }) + .fill(window_ver.clone()); + // holding cell1 coral chest + painter + .aabb(Aabb { + min: Vec3::new( + center.x, + center.y - (diameter / 2) - (diameter / 4) + 7, + base - 1, + ), + max: Vec3::new( + center.x + 1, + center.y - (diameter / 2) - (diameter / 4) + 8, + base, + ), + }) + .fill(gold_decor.clone()); + painter.rotated_sprite( + Vec3::new( + center.x, + center.y - (diameter / 2) - (diameter / 4) + 7, + base, + ), + SpriteKind::CoralChest, + 0, + ); + + // Holding Cell1 Sea Clerics + let hc1_sea_clerics_pos = Vec3::new(center.x, center.y - (diameter / 3), base + 3); + for _ in 0..(3 + ((RandomField::new(0).get((hc1_sea_clerics_pos).with_z(base))) % 3)) { + painter.spawn( + EntityInfo::at(hc1_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ); + } + // Holding Cell + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 4), + center.y + (diameter / 2) - (diameter / 4), + base - (diameter / 4), + ), + max: Vec3::new( + center.x + (diameter / 4), + center.y + (diameter / 2) + (diameter / 4), + base - (diameter / 4) + (diameter / 2), + ), + }) + .fill(white.clone()); + painter + .sphere(Aabb { + min: Vec3::new( + center.x - (diameter / 4) + 1, + center.y + (diameter / 2) - (diameter / 4) + 1, + base - (diameter / 4) + 1, + ), + max: Vec3::new( + center.x + (diameter / 4 - 1), + center.y + (diameter / 2) + (diameter / 4) - 1, + base - (diameter / 4) + (diameter / 2) - 1, + ), + }) + .without(painter.cylinder(Aabb { + min: Vec3::new( + center.x - (diameter / 4) + 1, + center.y + (diameter / 2) - (diameter / 4) + 1, + base - (diameter / 4) + 1, + ), + max: Vec3::new( + center.x + (diameter / 4 - 1), + center.y + (diameter / 2) + (diameter / 4) - 1, + base - 1, + ), + })) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16), + center.y + (diameter / 2) + (diameter / 4) - 1, + base, + ), + max: Vec3::new( + center.x + (diameter / 16), + center.y + (diameter / 2) + (diameter / 4) + 3, + base + 3, + ), + }) + .clear(); + // Holding Cell glass barriers + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16), + center.y + (diameter / 2) + (diameter / 4) - 2, + base + 1, + ), + max: Vec3::new( + center.x + (diameter / 16), + center.y + (diameter / 2) + (diameter / 4) - 1, + base + 2, + ), + }) + .fill(glass_barrier.clone()); + // Holding Cell passage to main room + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16), + center.y + (diameter / 20) + 1, + base - 4, + ), + max: Vec3::new( + center.x + (diameter / 16), + center.y + (diameter / 3) - 3, + base + 3, + ), + }) + .fill(white.clone()); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y + (diameter / 20) + 1, + base - 3, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y + (diameter / 3) - 3, + base, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y + (diameter / 20) + 1, + base - 2, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y + (diameter / 3) - 1, + base, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 2, + center.y + (diameter / 20) + 1, + base, + ), + max: Vec3::new( + center.x + (diameter / 16) - 2, + center.y + (diameter / 3) - 3, + base + 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 16) + 1, + center.y + (diameter / 3) - 4, + base - 1, + ), + max: Vec3::new( + center.x + (diameter / 16) - 1, + center.y + (diameter / 3) - 3, + base, + ), + }) + .fill(glass_barrier.clone()); + // Holding Cell Villagers + let hc_villagers_pos = Vec3::new(center.x, center.y + (diameter / 3), base + 3); + for _ in 0..(5 + ((RandomField::new(0).get((hc_villagers_pos).with_z(base))) % 5)) { + painter.spawn( + EntityInfo::at(hc_villagers_pos.as_()) + .with_asset_expect("common.entity.village.villager", &mut rng), + ); + } + // stairway3 tube + painter + .cylinder(Aabb { + min: Vec3::new(center_s3.x - 5, center_s3.y - 5, base + (diameter / 4)), + max: Vec3::new( + center_s3.x + 5, + center_s3.y + 5, + base - (diameter / 8) + (diameter / 2) + 2, + ), + }) + .fill(white.clone()); + + painter + .cylinder(Aabb { + min: Vec3::new(center_s3.x - 4, center_s3.y - 4, base + 2), + max: Vec3::new( + center_s3.x + 4, + center_s3.y + 4, + base - (diameter / 8) + (diameter / 2) + 2, + ), + }) + .clear(); + // stairway3 tube window1 + painter + .aabb(Aabb { + min: Vec3::new(center_s3.x - 1, center_s3.y - 5, base + (diameter / 4) + 1), + max: Vec3::new( + center_s3.x + 1, + center_s3.y - 4, + base - (diameter / 8) + (diameter / 2) - 2, + ), + }) + .fill(window_ver.clone()); + + // stairway3 stairs + let stair_radius3 = 4.5; + let stairs_clear3 = painter.cylinder(Aabb { + min: (center_s3 - stair_radius3 as i32).with_z(base - 1), + max: (center_s3 + stair_radius3 as i32) + .with_z(base - (diameter / 8) + (diameter / 2) + 2), + }); + stairs_clear3 + .sample(spiral_staircase( + center_s3.with_z(base - (diameter / 8) + (diameter / 2) + 2), + stair_radius3, + 0.5, + 7.0, + )) + .fill(white.clone()); + // stairway4 + let center_s4 = Vec2::new(center.x + (diameter / 2) + 2, center.y + (diameter / 8)); + // stairway4 balcony2 entry + painter + .cylinder(Aabb { + min: (center_s4 - 2).with_z(base - (diameter / 8) + (diameter / 2) - 7), + max: (center_s4 + 3).with_z(base - (diameter / 8) + (diameter / 2) - 5), + }) + .clear(); + // stairway4 stairs + let stair_radius4 = 3.0; + let stairs_clear4 = painter.cylinder(Aabb { + min: (center_s4 - stair_radius4 as i32).with_z(base - (diameter / 8) - 4), + max: (center_s4 + stair_radius4 as i32) + .with_z(base - (diameter / 8) + (diameter / 2) - 4), + }); + stairs_clear4 + .sample(spiral_staircase( + center_s4.with_z(base - (diameter / 8) + (diameter / 2) - 4), + stair_radius4, + 0.5, + 7.0, + )) + .fill(white.clone()); + // entry lanterns + for dir in SQUARE_4 { + let sq_corner = Vec2::new(center.x - (diameter / 2) + 3, center.y - 5); + let pos = Vec3::new( + sq_corner.x + (dir.x * (diameter - 7)), + sq_corner.y + (dir.y * 9), + base + 5, + ); + painter.sprite(pos, SpriteKind::SeashellLantern); + } + // main room lanterns + for dir in SQUARE_4 { + let sq_corner = Vec2::new(center.x - 4, center.y - (diameter / 2) + 5); + let pos = Vec3::new( + sq_corner.x + (dir.y * 7), + sq_corner.y + (dir.x * (diameter - 10)), + base + 12, + ); + painter.sprite(pos, SpriteKind::SeashellLantern); + } + // first floor lanterns + for dir in SQUARE_4 { + for d in 0..2 { + let sq_corner = Vec2::new(center.x - 3 - d, center.y - (diameter / 8) - 2 - d); + let pos = Vec3::new( + sq_corner.x + (dir.y * (5 + (2 * d))), + sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), + base - (diameter / 8) + (diameter / 2) + 2, + ); + painter.sprite(pos, SpriteKind::SeashellLantern); + } + } + // small floor lanterns + for dir in SQUARE_4 { + for d in 0..2 { + let sq_corner = Vec2::new(center.x - 3 - d, center.y - (diameter / 8) - 2 - d); + let pos = Vec3::new( + sq_corner.x + (dir.y * (5 + (2 * d))), + sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), + base + diameter - (diameter / 4) + 1, + ); + painter.sprite(pos, SpriteKind::SeashellLantern); + } + } + + // top floor lanterns + for dir in SQUARE_4 { + for d in 0..2 { + let sq_corner = Vec2::new(center.x - 3 - d, center.y - (diameter / 8) - 2 - d); + let pos = Vec3::new( + sq_corner.x + (dir.y * (5 + (2 * d))), + sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), + base - (diameter / 8) + diameter + 2, + ); + painter.sprite(pos, SpriteKind::SeashellLantern); + } + } + // main room emblems 1 + for d in 0..2 { + let emblem_pos = Vec3::new( + center.x - d, + center.y + (diameter / 3) + 6 - (d * (2 * (diameter / 3) + 10)), + base + (diameter / 4) + 1, + ); + painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8); + } + // main room emblems 2 + for d in 0..2 { + let emblem_pos = Vec3::new( + center.x - (diameter / 3) - 7 + (d * (2 * (diameter / 3) + 13)), + center.y - d, + base + (diameter / 4) + 1, + ); + painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 6 - (4 * d) as u8); + } + // first floor emblems / top floor emblems + for d in 0..2 { + for e in 0..2 { + let emblem_pos = Vec3::new( + center.x - d, + center.y - (diameter / 8) - 4 + (d * ((diameter / 4) + 6)), + base + (diameter / 2) + 1 + (e * (diameter / 2)), + ); + painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8); + } + } + + // side buildings hut, pavillon, tower + let bldg_corner = center - (diameter / 2); + for dir in SQUARE_4 { + let bldg_center = bldg_corner + dir * diameter; + let bldg_variant = (RandomField::new(0).get((bldg_corner - dir).with_z(base))) % 10; + let tower_height = (diameter / 4) + (3 * (bldg_variant as i32)); + let bldg_diameter = diameter; + let bldg_cellar = Aabb { + min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 3)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 3) + (bldg_diameter / 2)), + }; + let bldg_cellar_clear = Aabb { + min: (bldg_center - (bldg_diameter / 4) + 1).with_z(base - (bldg_diameter / 3) + 1), + max: (bldg_center + (bldg_diameter / 4) - 1) + .with_z(base - (bldg_diameter / 3) + (bldg_diameter / 2) - 1), + }; + let bldg_room = Aabb { + min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }; + let bldg_hut_entry_clear1 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 4) - 2, + bldg_center.y - 2, + base + (bldg_diameter / 15), + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 4) + 2, + bldg_center.y + 2, + base + (bldg_diameter / 15) + 4, + ), + }; + let bldg_hut_entry_clear2 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 4) - 2, + bldg_center.y - 1, + base + (bldg_diameter / 15) + 4, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 4) + 2, + bldg_center.y + 1, + base + (bldg_diameter / 15) + 5, + ), + }; + let bldg_pavillon_entry_clear1 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 4), + bldg_center.y - 6, + base + (bldg_diameter / 15), + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 4), + bldg_center.y + 6, + base + (bldg_diameter / 15) + 4, + ), + }; + let bldg_pavillon_entry_clear2 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 4), + bldg_center.y - 5, + base + (bldg_diameter / 15) + 4, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 4), + bldg_center.y + 5, + base + (bldg_diameter / 15) + 5, + ), + }; + let bldg_pavillon_entry_clear3 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 4), + bldg_center.y - 4, + base + (bldg_diameter / 15) + 5, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 4), + bldg_center.y + 4, + base + (bldg_diameter / 15) + 6, + ), + }; + let bldg_pavillon_entry_clear4 = Aabb { + min: Vec3::new( + bldg_center.x - 6, + bldg_center.y - (bldg_diameter / 4), + base + (bldg_diameter / 15), + ), + max: Vec3::new( + bldg_center.x + 6, + bldg_center.y + (bldg_diameter / 4), + base + (bldg_diameter / 15) + 4, + ), + }; + let bldg_pavillon_entry_clear5 = Aabb { + min: Vec3::new( + bldg_center.x - 5, + bldg_center.y - (bldg_diameter / 4), + base + (bldg_diameter / 15) + 4, + ), + max: Vec3::new( + bldg_center.x + 5, + bldg_center.y + (bldg_diameter / 4), + base + (bldg_diameter / 15) + 5, + ), + }; + let bldg_pavillon_entry_clear6 = Aabb { + min: Vec3::new( + bldg_center.x - 4, + bldg_center.y - (bldg_diameter / 4), + base + (bldg_diameter / 15) + 5, + ), + max: Vec3::new( + bldg_center.x + 4, + bldg_center.y + (bldg_diameter / 4), + base + (bldg_diameter / 15) + 6, + ), + }; + let bldg_room_windows = painter + .aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 4), + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 4), + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, + ), + }) + .without(painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 4) + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 4) - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, + ), + })); + let bldg_top = painter + .sphere(Aabb { + min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }) + .without( + painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), + }), + ); + let bldg_washed_top = painter + .sphere(Aabb { + min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), + max: (bldg_center + (bldg_diameter / 4) - 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }) + .without( + painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), + }), + ); + let bldg_room_goldring = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2), + }); + let bldg_room_goldring_clear = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 4) + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1), + max: (bldg_center + (bldg_diameter / 4) - 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2), + }); + let bldg_room_clear = Aabb { + min: (bldg_center - (bldg_diameter / 4) + 1) + .with_z(base - (bldg_diameter / 15) + 1), + max: (bldg_center + (bldg_diameter / 4) - 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1), + }; + let bldg_room_floor = Aabb { + min: (bldg_center - (bldg_diameter / 4) + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1), + max: (bldg_center + (bldg_diameter / 4) - 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2), + }; + let bldg_hut_floors_clear = Aabb { + min: (bldg_center - 3).with_z(base - (bldg_diameter / 3) + 2), + max: (bldg_center + 3) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2), + }; + let bldg_room2 = Aabb { + min: (bldg_center - (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + ), + max: (bldg_center + (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + }; + let bldg_room2_windows1 = painter + .aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }) + .without(painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 6) + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 6) - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + })); + let bldg_room2_windows2 = painter + .aabb(Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 6), + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 6), + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }) + .without(painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 6) + 1, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 6) - 1, + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + })); + let bldg_room2_top = painter + .sphere(Aabb { + min: (bldg_center - (bldg_diameter / 6) + 1).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + ), + max: (bldg_center + (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + }) + .without( + painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + ), + max: (bldg_center + (bldg_diameter / 6)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }), + ); + let bldg_room2_washed_top = painter + .sphere(Aabb { + min: (bldg_center - (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + ), + max: (bldg_center + (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + }) + .without( + painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + ), + max: (bldg_center + (bldg_diameter / 6)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }), + ); + let bldg_room2_goldring = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 6)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 1), + max: (bldg_center + (bldg_diameter / 6)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 2), + }); + let bldg_room2_goldring_clear = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 6) + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 1), + max: (bldg_center + (bldg_diameter / 6) - 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 2), + }); + let bldg_room2_clear = Aabb { + min: (bldg_center - (bldg_diameter / 6) + 1).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + ), + max: (bldg_center + (bldg_diameter / 6) - 1).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + }; + let bldg_room2_floor = Aabb { + min: (bldg_center - (bldg_diameter / 6) + 1).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10), + ), + max: (bldg_center + (bldg_diameter / 6) - 1).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, + ), + }; + let bldg_tube = painter.cylinder(Aabb { + min: (bldg_center - 4).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6) - 1, + ), + max: (bldg_center + 4) + .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4)), + }); + let bldg_tube_clear = painter.cylinder(Aabb { + min: (bldg_center - 3).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6) - 1, + ), + max: (bldg_center + 3) + .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4)), + }); + let bldg_tube_windows1 = Aabb { + min: Vec3::new( + bldg_center.x + 3, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + max: Vec3::new( + bldg_center.x + 4, + bldg_center.y + 1, + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + }; + let bldg_tube_windows2 = Aabb { + min: Vec3::new( + bldg_center.x - 4, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + max: Vec3::new( + bldg_center.x - 3, + bldg_center.y + 1, + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + }; + let bldg_tube_windows3 = Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - 4, + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y - 3, + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + }; + let bldg_tube_windows4 = Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y + 3, + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + 4, + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + }; + let bldg_room3 = Aabb { + min: (bldg_center - (bldg_diameter / 7)) + .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 2, + ), + }; + let bldg_room3_washed_top = painter + .sphere(Aabb { + min: (bldg_center - (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 2, + ), + }) + .without(painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 2, + ), + })); + let bldg_room3_top = painter + .sphere(Aabb { + min: (bldg_center - (bldg_diameter / 7) + 1).with_z( + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 2, + ), + }) + .without(painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 2, + ), + })); + let bldg_room3_goldring = Aabb { + min: (bldg_center - (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 1, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7), + ), + }; + let bldg_room3_clear = Aabb { + min: (bldg_center - (bldg_diameter / 7) + 1) + .with_z(base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 1), + max: (bldg_center + (bldg_diameter / 7) - 1).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 3, + ), + }; + let bldg_room3_floor = painter + .sphere(Aabb { + min: (bldg_center - 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 8, + ), + max: (bldg_center + 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ), + }) + .without(painter.cylinder(Aabb { + min: (bldg_center - 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 8, + ), + max: (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ), + })); + let bldg_tower_floors_clear = Aabb { + min: (bldg_center - 3).with_z(base - (bldg_diameter / 3) + 2), + max: (bldg_center + 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 4) + - 3, + ), + }; + let bldg_room3_entry_clear1 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 7), + bldg_center.y - 3, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 6, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 7), + bldg_center.y + 3, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 4, + ), + }; + let bldg_room3_entry_clear2 = Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 7), + bldg_center.y - 2, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 4, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 7), + bldg_center.y + 2, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 3, + ), + }; + let bldg_room3_entry_clear3 = Aabb { + min: Vec3::new( + bldg_center.x - 3, + bldg_center.y - (bldg_diameter / 7), + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 6, + ), + max: Vec3::new( + bldg_center.x + 3, + bldg_center.y + (bldg_diameter / 7), + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 4, + ), + }; + let bldg_room3_entry_clear4 = Aabb { + min: Vec3::new( + bldg_center.x - 2, + bldg_center.y - (bldg_diameter / 7), + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 4, + ), + max: Vec3::new( + bldg_center.x + 2, + bldg_center.y + (bldg_diameter / 7), + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 3, + ), + }; + let bldg_gold_top1 = Aabb { + min: (bldg_center - 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 3, + ), + max: (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 1, + ), + }; + let bldg_gold_top_pole = Aabb { + min: (bldg_center - 1).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 1, + ), + max: (bldg_center + 1).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 7, + ), + }; + let bldg_gold_top_antlers1 = Aabb { + min: Vec3::new( + bldg_center.x - 2, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 1, + ), + max: Vec3::new( + bldg_center.x + 2, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 2, + ), + }; + let bldg_gold_top_antlers2 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 3, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 2, + ), + + max: Vec3::new( + bldg_center.x + 3, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 3, + ), + }); + let bldg_gold_top_antlers2_clear = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 2, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 2, + ), + + max: Vec3::new( + bldg_center.x + 2, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 3, + ), + }); + let bldg_gold_top_antlers3 = Aabb { + min: Vec3::new( + bldg_center.x - 3, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 4, + ), + max: Vec3::new( + bldg_center.x + 3, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 5, + ), + }; + let bldg_gold_top_antlers4 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 5, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 5, + ), + + max: Vec3::new( + bldg_center.x + 5, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 6, + ), + }); + let bldg_gold_top_antlers4_clear = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 2, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 5, + ), + + max: Vec3::new( + bldg_center.x + 2, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 6, + ), + }); + let bldg_gold_top_antlers5 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 2, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 7, + ), + + max: Vec3::new( + bldg_center.x + 2, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 8, + ), + }); + let bldg_gold_top_antlers5_clear = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 7, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + 1, + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + + 8, + ), + }); + let bldg_tower_ropefix1 = Aabb { + min: (bldg_center - 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 4, + ), + max: (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 3, + ), + }; + let bldg_tower_ropefix2 = Aabb { + min: (bldg_center).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 5, + ), + max: (bldg_center + 1).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 4, + ), + }; + let bldg_tower_rope = Aabb { + min: bldg_center.with_z(base - (bldg_diameter / 3) + 7), + max: (bldg_center + 1).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 5, + ), + }; + let bldg_hut_ropefix1 = Aabb { + min: (bldg_center - 2) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 3), + max: (bldg_center + 2) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2), + }; + let bldg_hut_ropefix2 = Aabb { + min: bldg_center.with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 4), + max: (bldg_center + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 3), + }; + let bldg_hut_rope = Aabb { + min: bldg_center.with_z(base - (bldg_diameter / 3) + 7), + max: (bldg_center + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 4), + }; + let bldg_water_puddle = Aabb { + min: (bldg_center - 5).with_z(base - (bldg_diameter / 3) + 2), + max: (bldg_center + 5).with_z(base - (bldg_diameter / 3) + 3), + }; + let bldg_connect_entry = Aabb { + min: (bldg_center - 4).with_z(base - (bldg_diameter / 3) + 2), + max: (bldg_center + 4).with_z(base - (bldg_diameter / 3) + 3), + }; + let bldg_room_lantern_pos = (bldg_center + 2).with_z(base - (bldg_diameter / 15) + 2); + let bldg_floor_lantern_pos = + (bldg_center + 2).with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2); + let bldg_floor2_lantern_pos = Vec3::new( + bldg_center.x + 3, + bldg_center.y + 2, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, + ); + let bldg_floor3_lantern_pos = (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ); + let bldg_floor3_drawer_pos = (bldg_center - 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ); + let bldg_floor3_potion_pos = (bldg_center - 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 6, + ); + let bldg_cellar_chest_pos = Vec3::new( + bldg_center.x - (bldg_diameter / 8), + bldg_center.y, + base - (bldg_diameter / 3) + 3, + ); + let bldg_floor2_coral_chest_podium = Aabb { + min: (bldg_center - 5).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, + ), + max: (bldg_center - 4).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 2, + ), + }; + let bldg_floor2_coral_chest_pos = (bldg_center - 5).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 2, + ); + let bldg_floor_bed_pos = Vec3::new( + bldg_center.x - (bldg_diameter / 6), + bldg_center.y, + base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2, + ); + let bldg_floor_drawer_pos = (bldg_center - (bldg_diameter / 8)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2); + let bldg_floor_potion_pos = (bldg_center - (bldg_diameter / 8)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 3); + let bldg_floor_glass_barriers = Aabb { + min: (bldg_center - 4) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2), + max: (bldg_center + 4) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 3), + }; + let bldg_floor2_wall = Aabb { + min: (bldg_center - 4).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, + ), + max: (bldg_center + 4).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6) - 2, + ), + }; + let bldg_floor2_glass_barriers = Aabb { + min: Vec3::new( + bldg_center.x + 3, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, + ), + max: Vec3::new( + bldg_center.x + 4, + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 4, + ), + }; + let bldg_floor2_step = Aabb { + min: Vec3::new( + bldg_center.x + 2, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10), + ), + max: Vec3::new( + bldg_center.x + 3, + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, + ), + }; + let bldg_connect_tube = Aabb { + min: (bldg_center - (bldg_diameter / 10)) + .with_z(base - (2 * (bldg_diameter / 3)) + 1), + max: (bldg_center + (bldg_diameter / 10)).with_z(base - (bldg_diameter / 3) + 1), + }; + let bldg_connect_water = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 1) + .with_z(base - (2 * (bldg_diameter / 3)) + 1), + max: (bldg_center + (bldg_diameter / 10) - 1) + .with_z(base - (bldg_diameter / 3) + 2), + }; + let bldg_connect_gate = Aabb { + min: (bldg_center - 2).with_z(base - (bldg_diameter / 3) + 2), + max: (bldg_center + 2).with_z(base - (bldg_diameter / 3) + 3), + }; + let bldg_floor_sea_cleric_pos = (bldg_center + (bldg_diameter / 8)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2); + let bldg_floor3_sea_cleric_pos = (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 6, + ); + let bldg_floor2_sea_cleric_pos = (bldg_center + 5).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 2, + ); + // bldg cellar Sea Crocodiles + let bldg_cellar_sea_croc_pos = Vec3::new( + bldg_center.x - (bldg_diameter / 8), + bldg_center.y, + base - (bldg_diameter / 3) + 3, + ); + for _ in + 0..(1 + ((RandomField::new(0).get((bldg_cellar_sea_croc_pos).with_z(base))) % 2)) + { + painter.spawn( + EntityInfo::at(bldg_cellar_sea_croc_pos.as_()) + .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), + ) + } + match bldg_variant { + 0..=2 => { + // paint SeaHut + painter.sphere(bldg_cellar).fill(white.clone()); + painter.sphere(bldg_cellar_clear).clear(); + painter.sphere(bldg_room).fill(white.clone()); + painter.aabb(bldg_hut_entry_clear1).clear(); + painter.aabb(bldg_hut_entry_clear2).clear(); + bldg_room_windows.fill(window_ver.clone()); + bldg_top.fill(top.clone()); + bldg_washed_top.fill(washed.clone()); + painter.sphere(bldg_room_clear).clear(); + bldg_room_goldring.fill(gold.clone()); + bldg_room_goldring_clear.clear(); + painter.cylinder(bldg_room_floor).fill(white.clone()); + painter.cylinder(bldg_hut_floors_clear).clear(); + painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone()); + painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone()); + painter.aabb(bldg_hut_rope).fill(rope.clone()); + painter.cylinder(bldg_water_puddle).fill(water.clone()); + painter.cylinder(bldg_connect_tube).fill(white.clone()); + painter.cylinder(bldg_connect_water).fill(water.clone()); + painter.cylinder(bldg_connect_entry).fill(white.clone()); + painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); + painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed); + painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall); + painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor); + // bldg floor Sea Clerics + for _ in 0..(1 + + ((RandomField::new(0).get((bldg_floor_sea_cleric_pos).with_z(base))) % 2)) + { + painter.spawn( + EntityInfo::at(bldg_floor_sea_cleric_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric", + &mut rng, + ), + ) + } + }, + 3..=5 => { + // paint SeaPavillon + painter.sphere(bldg_cellar).fill(white.clone()); + painter.sphere(bldg_cellar_clear).clear(); + painter.sphere(bldg_room).fill(white.clone()); + painter.aabb(bldg_pavillon_entry_clear1).clear(); + painter.aabb(bldg_pavillon_entry_clear2).clear(); + painter.aabb(bldg_pavillon_entry_clear3).clear(); + painter.aabb(bldg_pavillon_entry_clear4).clear(); + painter.aabb(bldg_pavillon_entry_clear5).clear(); + painter.aabb(bldg_pavillon_entry_clear6).clear(); + bldg_top.fill(top.clone()); + bldg_washed_top.fill(washed.clone()); + painter.sphere(bldg_room_clear).clear(); + bldg_room_goldring.fill(gold.clone()); + bldg_room_goldring_clear.clear(); + painter.cylinder(bldg_hut_floors_clear).clear(); + painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone()); + painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone()); + painter.aabb(bldg_hut_rope).fill(rope.clone()); + painter.cylinder(bldg_water_puddle).fill(water.clone()); + painter.cylinder(bldg_connect_tube).fill(white.clone()); + painter.cylinder(bldg_connect_water).fill(water.clone()); + painter.cylinder(bldg_connect_entry).fill(white.clone()); + painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); + }, + 6..=9 => { + // paint SeaTower + painter.sphere(bldg_cellar).fill(white.clone()); + painter.sphere(bldg_cellar_clear).clear(); + painter.sphere(bldg_room).fill(white.clone()); + painter.aabb(bldg_hut_entry_clear1).clear(); + painter.aabb(bldg_hut_entry_clear2).clear(); + bldg_room_windows.fill(window_ver.clone()); + bldg_top.fill(top.clone()); + bldg_washed_top.fill(washed.clone()); + painter.sphere(bldg_room2).fill(white.clone()); + bldg_room2_windows1.fill(window_ver.clone()); + bldg_room2_windows2.fill(window_ver2.clone()); + bldg_room2_washed_top.fill(washed.clone()); + bldg_room2_top.fill(top.clone()); + painter.sphere(bldg_room2_clear).clear(); + bldg_room2_goldring.fill(gold.clone()); + bldg_room2_goldring_clear.clear(); + painter.sphere(bldg_room_clear).clear(); + bldg_room_goldring.fill(gold.clone()); + bldg_room_goldring_clear.clear(); + painter.cylinder(bldg_room_floor).fill(white.clone()); + painter.cylinder(bldg_room2_floor).fill(white.clone()); + bldg_tube.fill(white.clone()); + bldg_tube_clear.clear(); + painter.aabb(bldg_tube_windows1).fill(window_ver2.clone()); + painter.aabb(bldg_tube_windows2).fill(window_ver2.clone()); + painter.aabb(bldg_tube_windows3).fill(window_ver.clone()); + painter.aabb(bldg_tube_windows4).fill(window_ver.clone()); + painter.sphere(bldg_room3).fill(white.clone()); + bldg_room3_washed_top.fill(washed.clone()); + bldg_room3_top.fill(top.clone()); + painter.cylinder(bldg_room3_goldring).fill(gold.clone()); + painter.sphere(bldg_room3_clear).clear(); + painter.aabb(bldg_room3_entry_clear1).clear(); + painter.aabb(bldg_room3_entry_clear2).clear(); + painter.aabb(bldg_room3_entry_clear3).clear(); + painter.aabb(bldg_room3_entry_clear4).clear(); + painter + .cylinder(bldg_floor_glass_barriers) + .fill(glass_barrier.clone()); + painter.cylinder(bldg_floor2_wall).fill(white.clone()); + painter + .aabb(bldg_floor2_glass_barriers) + .fill(glass_barrier.clone()); + painter.cylinder(bldg_tower_floors_clear).clear(); + painter.aabb(bldg_floor2_step).fill(gold_decor.clone()); + bldg_room3_floor.fill(white.clone()); + painter.cylinder(bldg_tower_ropefix1).fill(ropefix1.clone()); + painter.aabb(bldg_tower_ropefix2).fill(ropefix2.clone()); + painter.aabb(bldg_tower_rope).fill(rope.clone()); + bldg_gold_top_antlers2.fill(gold.clone()); + bldg_gold_top_antlers2_clear.clear(); + bldg_gold_top_antlers4.fill(gold.clone()); + bldg_gold_top_antlers4_clear.clear(); + bldg_gold_top_antlers5.fill(gold.clone()); + bldg_gold_top_antlers5_clear.clear(); + painter.sphere(bldg_gold_top1).fill(gold.clone()); + painter.aabb(bldg_gold_top_pole).fill(gold.clone()); + painter.aabb(bldg_gold_top_antlers1).fill(gold.clone()); + painter.aabb(bldg_gold_top_antlers3).fill(gold.clone()); + painter.cylinder(bldg_water_puddle).fill(water.clone()); + painter.cylinder(bldg_connect_tube).fill(white.clone()); + painter.cylinder(bldg_connect_water).fill(water.clone()); + painter.cylinder(bldg_connect_entry).fill(white.clone()); + painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_floor2_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_floor3_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(bldg_floor3_drawer_pos, SpriteKind::DrawerSmall); + painter.sprite(bldg_floor3_potion_pos, SpriteKind::PotionMinor); + painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); + painter + .aabb(bldg_floor2_coral_chest_podium) + .fill(gold_decor.clone()); + painter.rotated_sprite(bldg_floor2_coral_chest_pos, SpriteKind::CoralChest, 0); + painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed); + painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall); + painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor); + // bldg floor Sea Clerics + for _ in 0..(1 + + ((RandomField::new(0).get((bldg_floor_sea_cleric_pos).with_z(base))) % 2)) + { + painter.spawn( + EntityInfo::at(bldg_floor_sea_cleric_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric", + &mut rng, + ), + ) + } + // bldg floor3 Sea Clerics + for _ in 0..(1 + + ((RandomField::new(0).get((bldg_floor3_sea_cleric_pos).with_z(base))) + % 2)) + { + painter.spawn( + EntityInfo::at(bldg_floor3_sea_cleric_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric", + &mut rng, + ), + ) + } + // bldg floor2 Sea Clerics + for _ in 0..(1 + + ((RandomField::new(0).get((bldg_floor2_sea_cleric_pos).with_z(base))) + % 2)) + { + painter.spawn( + EntityInfo::at(bldg_floor2_sea_cleric_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric", + &mut rng, + ), + ) + } + }, + _ => {}, + }; + let connect_gate_type = connect_gate_types.swap_remove( + RandomField::new(0).get((center + dir).with_z(base)) as usize + % connect_gate_types.len(), + ); + painter + .cylinder(bldg_connect_gate) + .fill(Fill::Block(Block::air(connect_gate_type))); + } + // surrounding buildings foundling, small hut, small pavillon + for dir in NEIGHBORS { + let su_bldg_variant = + ((RandomField::new(0).get((center - dir).with_z(base))) % 10) as i32; + let su_bldg_center = center + dir * (diameter + (3 * su_bldg_variant)); + let su_bldg_base = base - 2 + ((su_bldg_variant / 2) as i32); + let su_bldg_diameter = diameter; + + let foundling_bottom1 = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 8) - 3) + .with_z(su_bldg_base - (su_bldg_diameter / 5) - (su_bldg_diameter / 2)), + max: (su_bldg_center + (su_bldg_diameter / 8) + 3) + .with_z(su_bldg_base - (su_bldg_diameter / 5) - (su_bldg_diameter / 4) + 6), + }; + let foundling_bottom2 = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 8) - 1) + .with_z(su_bldg_base - (su_bldg_diameter / 5) - (su_bldg_diameter / 4) + 2), + max: (su_bldg_center + (su_bldg_diameter / 8) + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 5) + 2), + }; + let foundling_top = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 8)) + .with_z(su_bldg_base - (su_bldg_diameter / 5) - 1), + max: (su_bldg_center + (su_bldg_diameter / 8)) + .with_z(su_bldg_base - (su_bldg_diameter / 5) + (su_bldg_diameter / 4) - 1), + }; + let su_bldg_bottom1 = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6) - 1) + .with_z(su_bldg_base - (2 * (su_bldg_diameter / 3)) + 1), + max: (su_bldg_center + (su_bldg_diameter / 6) + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 3) + 1), + }; + let su_bldg_bottom2 = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 3)), + max: (su_bldg_center + (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 3) + (su_bldg_diameter / 3)), + }; + let su_bldg_room = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15)), + max: (su_bldg_center + (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), + }; + let su_bldg_hut_entries1 = Aabb { + min: Vec3::new( + su_bldg_center.x - (su_bldg_diameter / 6) - 2, + su_bldg_center.y - 2, + su_bldg_base + (su_bldg_diameter / 15) - 2, + ), + max: Vec3::new( + su_bldg_center.x + (su_bldg_diameter / 6) + 2, + su_bldg_center.y + 2, + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + }; + let su_bldg_hut_entries2 = Aabb { + min: Vec3::new( + su_bldg_center.x - (su_bldg_diameter / 6) - 2, + su_bldg_center.y - 1, + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + max: Vec3::new( + su_bldg_center.x + (su_bldg_diameter / 6) + 2, + su_bldg_center.y + 1, + su_bldg_base + (su_bldg_diameter / 15) + 2, + ), + }; + let su_bldg_top = painter + .sphere(Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15)), + max: (su_bldg_center + (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15)), + max: (su_bldg_center + (su_bldg_diameter / 6)).with_z( + su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6), + ), + }), + ); + let su_bldg_washed_top = painter + .sphere(Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15)), + max: (su_bldg_center + (su_bldg_diameter / 6) - 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), + }) + .without( + painter.cylinder(Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15)), + max: (su_bldg_center + (su_bldg_diameter / 6)).with_z( + su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6), + ), + }), + ); + let su_bldg_goldring = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1), + max: (su_bldg_center + (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2), + }; + let su_bldg_room_clear = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6) + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + 1), + max: (su_bldg_center + (su_bldg_diameter / 6) - 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 1), + }; + let su_bldg_floor = Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6) + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1), + max: (su_bldg_center + (su_bldg_diameter / 6) - 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2), + }; + let su_bldg_room_lantern_pos = + (su_bldg_center + 2).with_z(su_bldg_base - (su_bldg_diameter / 15) + 2); + let su_bldg_floor_lantern_pos = (su_bldg_center + 2) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2); + let su_bldg_floor_drawer_pos = (su_bldg_center - (su_bldg_diameter / 10)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2); + let su_bldg_floor_potion_pos = (su_bldg_center - (su_bldg_diameter / 10)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 3); + let su_bldg_floor_bed_pos = Vec3::new( + su_bldg_center.x - (su_bldg_diameter / 8), + su_bldg_center.y, + su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2, + ); + let su_bldg_floor_entry = Aabb { + min: (su_bldg_center - 3) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1), + max: (su_bldg_center + 3) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 2), + }; + let su_bldg_ropefix1 = Aabb { + min: (su_bldg_center - 2) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 3), + max: (su_bldg_center + 2) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 2), + }; + let su_bldg_ropefix2 = Aabb { + min: (su_bldg_center) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 4), + max: (su_bldg_center + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 3), + }; + let su_bldg_rope = Aabb { + min: (su_bldg_center).with_z(su_bldg_base - (su_bldg_diameter / 15) + 5), + max: (su_bldg_center + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 4), + }; + let su_bldg_pavillon_entries1 = Aabb { + min: Vec3::new( + su_bldg_center.x - (su_bldg_diameter / 6), + su_bldg_center.y - 4, + su_bldg_base + (su_bldg_diameter / 15) - 2, + ), + max: Vec3::new( + su_bldg_center.x + (su_bldg_diameter / 6), + su_bldg_center.y + 4, + su_bldg_base + (su_bldg_diameter / 15), + ), + }; + let su_bldg_pavillon_entries2 = Aabb { + min: Vec3::new( + su_bldg_center.x - (su_bldg_diameter / 6), + su_bldg_center.y - 3, + su_bldg_base + (su_bldg_diameter / 15), + ), + max: Vec3::new( + su_bldg_center.x + (su_bldg_diameter / 6), + su_bldg_center.y + 3, + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + }; + let su_bldg_pavillon_entries3 = Aabb { + min: Vec3::new( + su_bldg_center.x - (su_bldg_diameter / 6), + su_bldg_center.y - 2, + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + max: Vec3::new( + su_bldg_center.x + (su_bldg_diameter / 6), + su_bldg_center.y + 2, + su_bldg_base + (su_bldg_diameter / 15) + 2, + ), + }; + let su_bldg_pavillon_entries4 = Aabb { + min: Vec3::new( + su_bldg_center.x - 4, + su_bldg_center.y - (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15) - 2, + ), + max: Vec3::new( + su_bldg_center.x + 4, + su_bldg_center.y + (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15), + ), + }; + let su_bldg_pavillon_entries5 = Aabb { + min: Vec3::new( + su_bldg_center.x - 3, + su_bldg_center.y - (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15), + ), + max: Vec3::new( + su_bldg_center.x + 3, + su_bldg_center.y + (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + }; + let su_bldg_pavillon_entries6 = Aabb { + min: Vec3::new( + su_bldg_center.x - 2, + su_bldg_center.y - (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + max: Vec3::new( + su_bldg_center.x + 2, + su_bldg_center.y + (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15) + 2, + ), + }; + match su_bldg_variant { + 0..=5 => { + // common parts for small hut / small pavillon, + painter.sphere(su_bldg_bottom1).fill(white.clone()); + painter.sphere(su_bldg_bottom2).fill(white.clone()); + painter.sphere(su_bldg_room).fill(white.clone()); + su_bldg_top.fill(top.clone()); + su_bldg_washed_top.fill(washed.clone()); + painter.cylinder(su_bldg_goldring).fill(gold.clone()); + painter.sphere(su_bldg_room_clear).clear(); + painter.sprite(su_bldg_room_lantern_pos, SpriteKind::SeashellLantern); + match su_bldg_variant { + 0..=3 => { + // small hut + painter.aabb(su_bldg_hut_entries1).clear(); + painter.aabb(su_bldg_hut_entries2).clear(); + painter.cylinder(su_bldg_floor).fill(white.clone()); + painter.cylinder(su_bldg_floor_entry).clear(); + painter.aabb(su_bldg_ropefix1).fill(ropefix1.clone()); + painter.aabb(su_bldg_ropefix2).fill(ropefix2.clone()); + painter.aabb(su_bldg_rope).fill(rope.clone()); + painter.sprite(su_bldg_floor_lantern_pos, SpriteKind::SeashellLantern); + painter.sprite(su_bldg_floor_drawer_pos, SpriteKind::DrawerSmall); + painter.sprite(su_bldg_floor_potion_pos, SpriteKind::PotionMinor); + painter.sprite(su_bldg_floor_bed_pos, SpriteKind::Bed); + }, + _ => { + // small pavillon + painter.aabb(su_bldg_pavillon_entries1).clear(); + painter.aabb(su_bldg_pavillon_entries2).clear(); + painter.aabb(su_bldg_pavillon_entries3).clear(); + painter.aabb(su_bldg_pavillon_entries4).clear(); + painter.aabb(su_bldg_pavillon_entries5).clear(); + painter.aabb(su_bldg_pavillon_entries6).clear(); + }, + } + }, + 6..=7 => { + // foundling + painter.sphere(foundling_bottom1).fill(white.clone()); + painter.sphere(foundling_bottom2).fill(white.clone()); + painter.sphere(foundling_top).fill(white.clone()); + }, + _ => {}, + }; + } + } +} From 55aebd5774aa766998f821f0b1d7513e561f7b1e Mon Sep 17 00:00:00 2001 From: flo666 Date: Thu, 25 Aug 2022 08:38:32 +0200 Subject: [PATCH 121/854] seachapel changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e49e5f8bab..f876888177 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated the Polish translation - Setting for disabling flashing lights - Spectate mode for moderators. +- SeaChapel, greek/latin inspired dungeon for ocean biome coasts ### Changed From f9a31094b6148c2975ad91a311f1a68f6227cc34 Mon Sep 17 00:00:00 2001 From: flo Date: Thu, 25 Aug 2022 09:01:00 +0000 Subject: [PATCH 122/854] remove common_ron --- assets/voxygen/i18n/en/common.ron | 130 ------------------------------ 1 file changed, 130 deletions(-) delete mode 100644 assets/voxygen/i18n/en/common.ron diff --git a/assets/voxygen/i18n/en/common.ron b/assets/voxygen/i18n/en/common.ron deleted file mode 100644 index 5736ac36bf..0000000000 --- a/assets/voxygen/i18n/en/common.ron +++ /dev/null @@ -1,130 +0,0 @@ -/// WARNING: Localization files shall be saved in UTF-8 format without BOM - -/// Localization for "global" English -( - string_map: { - // Texts used in multiple locations with the same formatting - "common.username": "username", - "common.singleplayer": "Singleplayer", - "common.multiplayer": "Multiplayer", - "common.servers": "Servers", - "common.quit": "Quit", - "common.settings": "Settings", - "common.languages": "Languages", - "common.interface": "Interface", - "common.gameplay": "Gameplay", - "common.controls": "Controls", - "common.video": "Graphics", - "common.sound": "Sound", - "common.chat": "Chat", - "common.resume": "Resume", - "common.characters": "Characters", - "common.close": "Close", - "common.yes": "Yes", - "common.no": "No", - "common.back": "Back", - "common.create": "Create", - "common.okay": "Okay", - "common.add": "Add", - "common.accept": "Accept", - "common.decline": "Decline", - "common.disclaimer": "Disclaimer", - "common.cancel": "Cancel", - "common.none": "None", - "common.error": "Error", - "common.fatal_error": "Fatal Error", - "common.you": "You", - "common.automatic": "Auto", - "common.random": "Random", - "common.empty": "Empty", - "common.confirm": "Confirm", - "common.delete_server": "Delete Server", - - // Settings Window title - "common.interface_settings": "Interface Settings", - "common.gameplay_settings": "Gameplay Settings", - "common.controls_settings": "Controls Settings", - "common.video_settings": "Graphics Settings", - "common.sound_settings": "Sound Settings", - "common.language_settings": "Language Settings", - "common.chat_settings": "Chat Settings", - - // Message when connection to the server is lost - "common.connection_lost": r#"Connection lost! -Did the server restart? -Is the client up to date?"#, - - - "common.species.orc": "Orc", - "common.species.human": "Human", - "common.species.dwarf": "Dwarf", - "common.species.elf": "Elf", - "common.species.draugr": "Draugr", - "common.species.danari": "Danari", - - "common.weapons.axe": "Axe", - "common.weapons.dagger": "Dagger", - "common.weapons.greatsword": "Greatsword", - "common.weapons.shortswords": "Shortswords", - "common.weapons.sword": "Sword", - "common.weapons.staff": "Firestaff", - "common.weapons.bow": "Bow", - "common.weapons.hammer": "Hammer", - "common.weapons.general": "General Combat", - "common.weapons.sceptre": "Healing Sceptre", - "common.weapons.shield": "Shield", - "common.weapons.spear": "Spear", - "common.weapons.hammer_simple": "Simple Hammer", - "common.weapons.sword_simple": "Simple Sword", - "common.weapons.staff_simple": "Simple Staff", - "common.weapons.axe_simple": "Simple Axe", - "common.weapons.bow_simple": "Simple Bow", - "common.weapons.unique": "Unique", - "common.tool.debug": "Debug", - "common.tool.farming": "Farming Tool", - "common.tool.pick": "Pickaxe", - "common.tool.mining": "Mining", - "common.kind.modular_component": "Modular Component", - "common.kind.modular_component_partial": "Component", - "common.kind.glider": "Glider", - "common.kind.consumable": "Consumable", - "common.kind.throwable": "Can be thrown", - "common.kind.utility": "Utility", - "common.kind.ingredient": "Ingredient", - "common.kind.lantern": "Lantern", - "common.hands.one": "One-Handed", - "common.hands.two": "Two-Handed", - - "common.rand_appearance": "Random appearance", - "common.rand_name": "Random name", - - "common.stats.combat_rating": "CR", - "common.stats.power": "Power", - "common.stats.speed": "Speed", - "common.stats.poise": "Poise", - "common.stats.range": "Range", - "common.stats.energy_efficiency": "Energy Efficiency", - "common.stats.buff_strength": "Buff/Debuff Strength", - "common.stats.crit_chance": "Crit Chance", - "common.stats.crit_mult": "Crit Mult", - "common.stats.armor": "Armor", - "common.stats.poise_res":"Stun Res", - "common.stats.energy_max": "Max Energy", - "common.stats.energy_reward": "Energy Reward", - "common.stats.crit_power": "Crit Power", - "common.stats.stealth": "Stealth", - "common.stats.slots": "Slots", - - "common.material.metal": "Metal", - "common.material.wood": "Wood", - "common.material.stone": "Stone", - "common.material.cloth": "Cloth", - "common.material.hide": "Hide", - - "common.sprite.chest": "Chest", - }, - - - vector_map: { - } -) From 9a0ac8dccea49c9e521a22a3a1300b98c52f2984 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Thu, 25 Aug 2022 13:18:06 +0300 Subject: [PATCH 123/854] Make `test_all_localizations` run at unittest --- .gitlab/scripts/unittest.sh | 10 +++++++--- voxygen/i18n/src/analysis.rs | 1 + voxygen/i18n/src/lib.rs | 5 ----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitlab/scripts/unittest.sh b/.gitlab/scripts/unittest.sh index 06cd7a1b2e..a48387af9f 100755 --- a/.gitlab/scripts/unittest.sh +++ b/.gitlab/scripts/unittest.sh @@ -1,4 +1,8 @@ #!/bin/bash -export VELOREN_ASSETS="$(pwd)/assets" -time cargo test --package veloren-common-assets asset_tweak::tests --features asset_tweak --lib && -time cargo test +VELOREN_ASSETS="$(pwd)/assets" +export VELOREN_ASSETS + +time cargo test \ + --package veloren-common-assets asset_tweak::tests \ + --features asset_tweak --lib && +time cargo test --features stat diff --git a/voxygen/i18n/src/analysis.rs b/voxygen/i18n/src/analysis.rs index 396bc1b292..48a4351091 100644 --- a/voxygen/i18n/src/analysis.rs +++ b/voxygen/i18n/src/analysis.rs @@ -30,6 +30,7 @@ fn keys_from_file(filepath: &Path) -> Vec { ResourceErr::parsing_error(errs, file.clone(), &content) ) }); + let mut keys = Vec::new(); for entry in ast.body { match entry { diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index ad40e9b8fa..fb23a63198 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -163,10 +163,6 @@ impl assets::Compound for Language { // Here go dragons for id in cache.load_dir::(path, true)?.ids() { - if id.ends_with("_manifest") { - continue; - } - match cache.load(id) { Ok(handle) => { let source: &raw::Resource = &*handle.read(); @@ -518,7 +514,6 @@ mod tests { } #[test] - #[ignore] #[cfg(feature = "stat")] // Generate translation stats fn test_all_localizations() { From f2eb1fe7c8e0c564ddccca3346d09f164382e30d Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Thu, 25 Aug 2022 14:13:28 +0300 Subject: [PATCH 124/854] Make i18n csv own binary * Put file that needs care back into csv --- .gitlab/scripts/translation.sh | 5 +-- voxygen/i18n/Cargo.toml | 4 +++ voxygen/i18n/src/analysis.rs | 9 ++--- voxygen/i18n/src/bin/i18n-csv.rs | 57 ++++++++++++++++++++++++++++++++ voxygen/i18n/src/lib.rs | 44 +++--------------------- 5 files changed, 69 insertions(+), 50 deletions(-) create mode 100644 voxygen/i18n/src/bin/i18n-csv.rs diff --git a/.gitlab/scripts/translation.sh b/.gitlab/scripts/translation.sh index 4410ae57bb..4f21367d69 100755 --- a/.gitlab/scripts/translation.sh +++ b/.gitlab/scripts/translation.sh @@ -2,7 +2,4 @@ VELOREN_ASSETS="$(pwd)/assets" export VELOREN_ASSETS -time cargo test --package veloren-voxygen-i18n \ - --lib test_all_localizations \ - --features="stat" \ - -- --nocapture --ignored +time cargo run --bin i18n-csv --features="stat" diff --git a/voxygen/i18n/Cargo.toml b/voxygen/i18n/Cargo.toml index c5ff1c56d7..7f69709878 100644 --- a/voxygen/i18n/Cargo.toml +++ b/voxygen/i18n/Cargo.toml @@ -27,6 +27,10 @@ fluent-syntax = { git = "https://github.com/juliancoffee/fluent-rs.git", branch name = "i18n-check" required-features = ["bin"] +[[bin]] +name = "i18n-csv" +required-features = ["stat"] + [features] bin = ["clap"] stat = [] diff --git a/voxygen/i18n/src/analysis.rs b/voxygen/i18n/src/analysis.rs index 48a4351091..db5dafdb39 100644 --- a/voxygen/i18n/src/analysis.rs +++ b/voxygen/i18n/src/analysis.rs @@ -37,7 +37,7 @@ fn keys_from_file(filepath: &Path) -> Vec { Entry::Message(m) => { keys.push(MsgId { key: m.id.name.to_owned(), - file: Some(file.clone()), + file: file.clone(), }); }, Entry::Term(_) @@ -80,7 +80,7 @@ fn keys(from: &Path, tree: &Walk) -> Vec { #[derive(Clone, Debug)] pub struct MsgId { pub key: String, - pub file: Option, + pub file: String, } // TODO: @@ -122,10 +122,7 @@ impl ReferenceLanguage { if let Some(key) = keys.iter().find(|MsgId { key, .. }| &ref_key.key == key) { stats.up_to_date.push(key.clone()); } else { - stats.not_found.push(MsgId { - key: ref_key.key.clone(), - file: None, - }); + stats.not_found.push(ref_key.clone()); } } diff --git a/voxygen/i18n/src/bin/i18n-csv.rs b/voxygen/i18n/src/bin/i18n-csv.rs new file mode 100644 index 0000000000..d26706f2ed --- /dev/null +++ b/voxygen/i18n/src/bin/i18n-csv.rs @@ -0,0 +1,57 @@ +use common_assets::find_root; +use std::{fs, io::Write, path::Path}; +use veloren_voxygen_i18n::{ + analysis::{Language, ReferenceLanguage}, + list_localizations, REFERENCE_LANG, +}; + +fn main() { + let root = find_root().unwrap(); + let output = root.join("translation_analysis.csv"); + let mut f = fs::File::create(output).expect("couldn't write csv file"); + + writeln!( + f, + "country_code,file_name,translation_key,status,git_commit" + ) + .unwrap(); + + let i18n_directory = root.join("assets/voxygen/i18n"); + let reference = ReferenceLanguage::at(&i18n_directory.join(REFERENCE_LANG)); + + let list = list_localizations(); + let file = |filename| { + let file = Path::new(&filename) + .file_name() + .and_then(|s| s.to_str()) + .unwrap_or(""); + + format!("{file}") + }; + for meta in list { + let code = meta.language_identifier; + let lang = Language { + code: code.clone(), + path: i18n_directory.join(code.clone()), + }; + let stats = reference.compare_with(&lang); + for key in stats.up_to_date { + let code = &code; + let filename = file(key.file); + let key = &key.key; + writeln!(f, "{code},{filename},{key},UpToDate,None").unwrap(); + } + for key in stats.not_found { + let code = &code; + let filename = file(key.file); + let key = &key.key; + writeln!(f, "{code},{filename},{key},NotFound,None").unwrap(); + } + for key in stats.unused { + let code = &code; + let filename = file(key.file); + let key = &key.key; + writeln!(f, "{code},{filename},{key},Unused,None").unwrap(); + } + } +} diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index fb23a63198..6556dc980c 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -515,61 +515,25 @@ mod tests { #[test] #[cfg(feature = "stat")] - // Generate translation stats - fn test_all_localizations() { + fn test_strict_all_localizations() { use analysis::{Language, ReferenceLanguage}; use assets::find_root; - use std::{fs, io::Write, path::Path}; let root = find_root().unwrap(); - let output = root.join("translation_analysis.csv"); - let mut f = fs::File::create(output).expect("couldn't write csv file"); - - writeln!( - f, - "country_code,file_name,translation_key,status,git_commit" - ) - .unwrap(); - let i18n_directory = root.join("assets/voxygen/i18n"); let reference = ReferenceLanguage::at(&i18n_directory.join(REFERENCE_LANG)); let list = list_localizations(); - let file = |filename: Option| { - let file = filename - .as_ref() - .map(|s| Path::new(s)) - .and_then(|p| p.file_name()) - .and_then(|s| s.to_str()) - .unwrap_or("None"); - format!("{file}") - }; for meta in list { let code = meta.language_identifier; let lang = Language { code: code.clone(), path: i18n_directory.join(code.clone()), }; - let stats = reference.compare_with(&lang); - for key in stats.up_to_date { - let code = &code; - let filename = &file(key.file); - let key = &key.key; - writeln!(f, "{code},{filename},{key},UpToDate,None").unwrap(); - } - for key in stats.not_found { - let code = &code; - let filename = &file(key.file); - let key = &key.key; - writeln!(f, "{code},{filename},{key},NotFound,None").unwrap(); - } - for key in stats.unused { - let code = &code; - let filename = &file(key.file); - let key = &key.key; - writeln!(f, "{code},{filename},{key},Unused,None").unwrap(); - } + // TODO: somewhere here should go check that all needed + // versions are given + reference.compare_with(&lang); } } } From ae399b3c7c22f7eb68024638a3b7297bf5de881d Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Thu, 25 Aug 2022 14:20:54 +0300 Subject: [PATCH 125/854] Remove cfg(feature = stat) for localization test --- .gitlab/scripts/unittest.sh | 2 +- voxygen/i18n/src/lib.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitlab/scripts/unittest.sh b/.gitlab/scripts/unittest.sh index a48387af9f..1b346c6bdd 100755 --- a/.gitlab/scripts/unittest.sh +++ b/.gitlab/scripts/unittest.sh @@ -5,4 +5,4 @@ export VELOREN_ASSETS time cargo test \ --package veloren-common-assets asset_tweak::tests \ --features asset_tweak --lib && -time cargo test --features stat +time cargo test diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 6556dc980c..435bb71884 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -3,7 +3,7 @@ mod raw; use error::ResourceErr; -#[cfg(any(feature = "bin", feature = "stat"))] +#[cfg(any(feature = "bin", feature = "stat", test))] pub mod analysis; use fluent_bundle::{bundle::FluentBundle, FluentResource}; @@ -514,7 +514,6 @@ mod tests { } #[test] - #[cfg(feature = "stat")] fn test_strict_all_localizations() { use analysis::{Language, ReferenceLanguage}; use assets::find_root; From 49e8cec5eba2fb28a4a59eec5de2a0206057196a Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Thu, 25 Aug 2022 16:24:05 +0300 Subject: [PATCH 126/854] Fix i18n keys --- voxygen/src/hud/bag.rs | 2 +- voxygen/src/hud/crafting.rs | 2 +- voxygen/src/hud/settings_window/gameplay.rs | 2 +- voxygen/src/hud/settings_window/video.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index ae4c33f0a8..90e5136bc5 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -823,7 +823,7 @@ impl<'a> Widget for Bag<'a> { self.tooltip_manager, &(match inventory.next_sort_order() { InventorySortOrder::Name => i18n.get_msg("hud-bag-sort_by_name"), - InventorySortOrder::Quality => i18n.get_msg("hudbag-sort_by_quality"), + InventorySortOrder::Quality => i18n.get_msg("hud-bag-sort_by_quality"), InventorySortOrder::Tag => i18n.get_msg("hud-bag-sort_by_category"), }), "", diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index a3a30cf274..384099398e 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -1487,7 +1487,7 @@ impl<'a> Widget for Crafting<'a> { let station_name = match recipe.craft_sprite { Some(SpriteKind::Anvil) => "hud-crafting-anvil", Some(SpriteKind::Cauldron) => "hud-crafting-cauldron", - Some(SpriteKind::CookingPot) => "hud.crafting-cooking_pot", + Some(SpriteKind::CookingPot) => "hud-crafting-cooking_pot", Some(SpriteKind::CraftingBench) => "hud-crafting-crafting_bench", Some(SpriteKind::Forge) => "hud-crafting-forge", Some(SpriteKind::Loom) => "hud-crafting-loom", diff --git a/voxygen/src/hud/settings_window/gameplay.rs b/voxygen/src/hud/settings_window/gameplay.rs index bc107631e9..4f0ddd5e13 100644 --- a/voxygen/src/hud/settings_window/gameplay.rs +++ b/voxygen/src/hud/settings_window/gameplay.rs @@ -125,7 +125,7 @@ impl<'a> Widget for Gameplay<'a> { Text::new( &self .localized_strings - .get_msg("hud-setting-pan_sensitivity"), + .get_msg("hud-settings-pan_sensitivity"), ) .top_left_with_margins_on(state.ids.window, 10.0, 10.0) .font_size(self.fonts.cyri.scale(14)) diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 68bfb21062..2d4d9cd1a8 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -456,7 +456,7 @@ impl<'a> Widget for Video<'a> { .get_msg("hud-settings-present_mode-mailbox"), &self .localized_strings - .get_msg("hud-settings-present_mode.immediate"), + .get_msg("hud-settings-present_mode-immediate"), ]; // Get which present mode is currently active From e55eaf1782c1e3cb8de922eae092e1c138d6f284 Mon Sep 17 00:00:00 2001 From: flo666 Date: Thu, 25 Aug 2022 15:49:48 +0200 Subject: [PATCH 127/854] put seachapel in unrealesed in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f876888177..ab55163cb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a setting to influence the gap between music track plays. - Added a Craft All button. - Server: Vacuum database on startup +- SeaChapel, greek/latin inspired dungeon for ocean biome coasts ### Changed - Use fluent for translations @@ -69,7 +70,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated the Polish translation - Setting for disabling flashing lights - Spectate mode for moderators. -- SeaChapel, greek/latin inspired dungeon for ocean biome coasts ### Changed From b1176aa9d3684d30812ae78a341ed602f95a99c9 Mon Sep 17 00:00:00 2001 From: flo666 Date: Thu, 25 Aug 2022 16:32:31 +0200 Subject: [PATCH 128/854] set difficulty indicator to 3 --- voxygen/src/hud/map.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/hud/map.rs b/voxygen/src/hud/map.rs index 8002f1f201..b1fbf4c11c 100644 --- a/voxygen/src/hud/map.rs +++ b/voxygen/src/hud/map.rs @@ -906,7 +906,7 @@ impl<'a> Widget for Map<'a> { SiteKind::Cave => (None, i18n.get_msg("hud-map-cave")), SiteKind::Tree => (None, i18n.get_msg("hud-map-tree")), SiteKind::Gnarling => (Some(0), i18n.get_msg("hud-map-gnarling")), - SiteKind::ChapelSite => (Some(0), i18n.get_msg("hud-map-chapel_site")), + SiteKind::ChapelSite => (Some(2), i18n.get_msg("hud-map-chapel_site")), }; let desc = desc.into_owned() + &get_site_economy(site_rich); let site_btn = Button::image(match &site.kind { From 355f916a997fbd6cd93aac3e75e32ae9cfba253a Mon Sep 17 00:00:00 2001 From: tygyh <32486062+tygyh@users.noreply.github.com> Date: Thu, 25 Aug 2022 20:47:13 +0200 Subject: [PATCH 129/854] Update translations --- assets/voxygen/i18n/sv_SE/gameinput.ftl | 2 +- assets/voxygen/i18n/sv_SE/npc.ftl | 44 ++++++++++++------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/assets/voxygen/i18n/sv_SE/gameinput.ftl b/assets/voxygen/i18n/sv_SE/gameinput.ftl index a6f830ce77..b855ef80a5 100644 --- a/assets/voxygen/i18n/sv_SE/gameinput.ftl +++ b/assets/voxygen/i18n/sv_SE/gameinput.ftl @@ -65,4 +65,4 @@ gameinput-mapzoomout = Förminska kartan gameinput-greet = Hälsa gameinput-map-locationmarkerbutton = Placera en markör på kartan gameinput-spectatespeedboost = Övervakningshastighetsökning -gameinput-spectateviewpoint = Övervakningssynpunkt \ No newline at end of file +gameinput-spectateviewpoint = Övervaka synpunkt \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/npc.ftl b/assets/voxygen/i18n/sv_SE/npc.ftl index 88ec580e38..4f2b670342 100644 --- a/assets/voxygen/i18n/sv_SE/npc.ftl +++ b/assets/voxygen/i18n/sv_SE/npc.ftl @@ -14,7 +14,7 @@ npc-speech-villager_adventurous = .a0 = Jag skulle vilja konstruera min egna glidare en dag. .a1 = Jag skulle vilja utforska någon grotta när jag blir starkare. npc-speech-villager_closed = - .a0 = Du är inte härifrån, eller hur are you? + .a0 = Du är inte härifrån, eller hur? .a1 = Visst är väl vår by den bästa i världen? .a2 = Vissa påstår att svamp skulle vara bra för hälsan. Det skulle aldrig falla mig in att äta en. .a3 = Att vara eller inte vara? Jag tror nog jag borde bli bonde. @@ -25,7 +25,7 @@ npc-speech-villager_busybody = .a0 = Folk borde jobba mer och prata mindre. npc-speech-villager_unconscientious = .a0 = Jag tycker nog det börjar bli dags för en andra frukost! - .a1 = Jag önskar att mitt hus inte var så stökigt. Men du skulle jag behöva städa! Haha! + .a1 = Jag önskar att mitt hus inte var så stökigt. Men då skulle jag behöva städa! Haha! .a2 = Var lämnade jag den här saken nu igen... npc-speech-villager_extroverted = .a0 = Du kan inte ana vad jag gjorde i helgen! @@ -53,12 +53,12 @@ npc-speech-villager_disagreeable = .a1 = Folk tar illa upp för enkelt. npc-speech-villager_neurotic = .a0 = Blotta tanken av dungeons ger mig rysningar. Jag hoppas att någon kommer städa ur dem. - .a1 = Någon borde göra något åt de där sektanhängarna. Helst inte jag. + .a1 = Någon borde göra något åt de där kultanhängarna. Helst inte jag. .a2 = Jag känner på mig att något dåligt kommer hända. .a3 = Jag önskar att någon kunde hålla alla vargar borta från byn. npc-speech-villager_sad_loner = .a0 = Jag känner mig så ensam. - .a1 = ... Förlåt för den jobbiga tystnaden. Jag är inte så bra med folk. + .a1 = ... Förlåt för den pinsamma tystnaden. Jag är inte så bra med folk. npc-speech-villager_seeker = .a0 = En dag skulle jag vilja se världen. Livet måste väl vara större än bara den här hålan? npc-speech-villager_stable = @@ -94,24 +94,24 @@ npc-speech-ambush = .a0 = Det är ingen bra idé att resa ensam! .a1 = Som att stjäla godis från ett barn! npc-speech-villager_cultist_alarm = - .a0 = Se upp! Här är en sektmedlem i farten! - .a1 = Till vapen! Sektanhängarna anfaller! - .a2 = Hur vågar sektanhängarna angripa vår by! - .a3 = Död åt sekten! - .a4 = Sektens anhängare kommer inte tolereras här! - .a5 = Mordiska sektanhängare! - .a6 = Smaka på min svärdsegg, din smutsiga sektanhängare! - .a7 = Inget kan två blodet från era händer, sektanhängare! - .a8 = Tusen troglodytiska terapeuter! En sektmedlem mitt ibland oss! - .a9 = Sektens ondskefulla tid är snart förbi! - .a10 = Den här sektanhängaren är min! - .a11 = Gör dig redo för ett möte med din skapare, vidriga sektanhängare! - .a12 = Jag ser en sektmedlem! Efter dem! - .a13 = Jag ser en sektmedlem! Till attack! - .a14 = Jag ser en sektmedlem! Låt dem inte komma undan! - .a15 = Skulle den högt vördade sektmedlemmen önska lite DÖD? - .a16 = Aldrig förlåta! Aldrig förglömma! Sektanhängare, ve er! - .a17 = Dö, sektanhängare! + .a0 = Se upp! Här är en kultmedlem i farten! + .a1 = Till vapen! kultanhängarna anfaller! + .a2 = Hur vågar kultanhängarna angripa vår by! + .a3 = Död åt kulten! + .a4 = kultens anhängare kommer inte tolereras här! + .a5 = Mordiska kultanhängare! + .a6 = Smaka på min svärdsegg, din smutsiga kultanhängare! + .a7 = Inget kan två blodet från era händer, kultanhängare! + .a8 = Tusen troglodytiska terapeuter! En kultmedlem mitt ibland oss! + .a9 = kultens ondskefulla tid är snart förbi! + .a10 = Den här kultanhängaren är min! + .a11 = Gör dig redo för ett möte med din skapare, vidriga kultanhängare! + .a12 = Jag ser en kultmedlem! Efter dem! + .a13 = Jag ser en kultmedlem! Till attack! + .a14 = Jag ser en kultmedlem! Låt dem inte komma undan! + .a15 = Skulle den högt vördade kultmedlemmen önska lite DÖD? + .a16 = Aldrig förlåta! Aldrig förglömma! kultanhängare, ve er! + .a17 = Dö, kultanhängare! .a18 = Ert skräckvälde ska gå under! .a19 = Här är betalningen för allt ni gjort! .a20 = Vi uppskattar inte sådana som du här omkring. From c36d6e873f813236ea023dcbd9f0d019f1fe0e53 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sun, 21 Aug 2022 00:48:51 -0400 Subject: [PATCH 130/854] Fix issue with the region subscription system not updating on view distance changes (until the player crossed a chunk boundary and triggered the normal update). This introduces a `ViewDistance` struct that provides an abstraction around limiting the rate the view distance can be cycled up and down. This helps avoid unnecessary sending, deleting, and then resending of synced things like entities (the client will still delete its terrain locally and re-request it though). The second part of this fix is storing the last view distance in the `RegionSubscription` struct and then updating region subscriptions if this doesn't match the current view distance in the `Presence` component. --- server/src/presence.rs | 101 ++++++++++++++++++++++++++++++--- server/src/state_ext.rs | 2 +- server/src/sys/entity_sync.rs | 3 +- server/src/sys/msg/in_game.rs | 31 ++++++---- server/src/sys/msg/terrain.rs | 2 +- server/src/sys/subscription.rs | 19 +++++-- server/src/sys/terrain.rs | 4 +- server/src/sys/terrain_sync.rs | 8 ++- 8 files changed, 139 insertions(+), 31 deletions(-) diff --git a/server/src/presence.rs b/server/src/presence.rs index fea7730441..c6559d1925 100644 --- a/server/src/presence.rs +++ b/server/src/presence.rs @@ -1,12 +1,14 @@ use common_net::msg::PresenceKind; use hashbrown::HashSet; use serde::{Deserialize, Serialize}; -use specs::{Component, DenseVecStorage, DerefFlaggedStorage, NullStorage, VecStorage}; +use specs::{Component, DerefFlaggedStorage, NullStorage}; +use std::time::{Duration, Instant}; use vek::*; -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Debug)] pub struct Presence { - pub view_distance: u32, + // TODO: separate view distance for syncing entities? + pub view_distance: ViewDistance, pub kind: PresenceKind, pub lossy_terrain_compression: bool, } @@ -14,7 +16,7 @@ pub struct Presence { impl Presence { pub fn new(view_distance: u32, kind: PresenceKind) -> Self { Self { - view_distance, + view_distance: ViewDistance::new(view_distance, Instant::now()), kind, lossy_terrain_compression: false, } @@ -22,8 +24,7 @@ impl Presence { } impl Component for Presence { - // Presence seems <= 64 bits, so it isn't worth using DenseVecStorage. - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } // Distance from fuzzy_chunk before snapping to current chunk @@ -34,11 +35,12 @@ pub const REGION_FUZZ: u32 = 16; #[derive(Clone, Debug)] pub struct RegionSubscription { pub fuzzy_chunk: Vec2, + pub last_view_distance: u32, pub regions: HashSet>, } impl Component for RegionSubscription { - type Storage = DerefFlaggedStorage>; + type Storage = DerefFlaggedStorage>; } #[derive(Copy, Clone, Debug, Default, Serialize, Deserialize)] @@ -47,3 +49,88 @@ pub struct RepositionOnChunkLoad; impl Component for RepositionOnChunkLoad { type Storage = NullStorage; } + +#[derive(PartialEq, Debug, Clone, Copy)] +enum Direction { + Up, + Down, +} + +/// Distance from the [Presence] from which the world is loaded and information +/// is synced to clients. +/// +/// We limit the frequency that changes in the view distance change direction +/// (e.g. shifting from increasing the value to decreasing it). This is useful +/// since we want to avoid rapid cycles of shrinking and expanding of the view +/// distance. +#[derive(Debug)] +pub struct ViewDistance { + direction: Direction, + last_direction_change_time: Instant, + target: Option, + current: u32, +} + +impl ViewDistance { + /// Minimum time allowed between changes in direction of value adjustments. + const TIME_PER_DIR_CHANGE: Duration = Duration::from_millis(300); + + pub fn new(start_value: u32, now: Instant) -> Self { + Self { + direction: Direction::Up, + last_direction_change_time: now - Self::TIME_PER_DIR_CHANGE, + target: None, + current: start_value, + } + } + + /// Returns the current value. + pub fn current(&self) -> u32 { self.current } + + /// Applies deferred change based on the whether the time to apply it has + /// been reached. + pub fn update(&mut self, now: Instant) { + if let Some(target_val) = self.target { + if now.saturating_duration_since(self.last_direction_change_time) + > Self::TIME_PER_DIR_CHANGE + { + self.last_direction_change_time = now; + self.current = target_val; + self.target = None; + } + } + } + + /// Sets the target value. + /// + /// If this hasn't been changed recently or it is in the same direction as + /// the previous change it will be applied immediately. Otherwise, it + /// will be deferred to a later time (limiting the frequency of changes + /// in the change direction). + pub fn set_target(&mut self, new_target: u32, now: Instant) { + use core::cmp::Ordering; + let new_direction = match new_target.cmp(&self.current) { + Ordering::Equal => return, // No change needed. + Ordering::Less => Direction::Down, + Ordering::Greater => Direction::Up, + }; + + // Change is in the same direction as before so we can just apply it. + if new_direction == self.direction { + self.current = new_target; + self.target = None; + // If it has already been a while since the last direction change we can + // directly apply the request and switch the direction. + } else if now.saturating_duration_since(self.last_direction_change_time) + > Self::TIME_PER_DIR_CHANGE + { + self.direction = new_direction; + self.last_direction_change_time = now; + self.current = new_target; + self.target = None; + // Otherwise, we need to defer the request. + } else { + self.target = Some(new_target); + } + } +} diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index dd1241f5b8..d3c1bb94e7 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -519,7 +519,7 @@ impl StateExt for State { // Make sure physics components are updated self.write_component_ignore_entity_dead(entity, comp::ForceUpdate::forced()); - const INITIAL_VD: u32 = 5; //will be changed after login + const INITIAL_VD: u32 = 5; // will be changed after login self.write_component_ignore_entity_dead( entity, Presence::new(INITIAL_VD, PresenceKind::Character(character_id)), diff --git a/server/src/sys/entity_sync.rs b/server/src/sys/entity_sync.rs index ceff297429..a2e5407322 100644 --- a/server/src/sys/entity_sync.rs +++ b/server/src/sys/entity_sync.rs @@ -384,7 +384,8 @@ impl<'a> System<'a> for Sys { let is_near = |o_pos: Vec3| { pos.zip_with(presence, |pos, presence| { pos.0.xy().distance_squared(o_pos.xy()) - < (presence.view_distance as f32 * TerrainChunkSize::RECT_SIZE.x as f32) + < (presence.view_distance.current() as f32 + * TerrainChunkSize::RECT_SIZE.x as f32) .powi(2) }) }; diff --git a/server/src/sys/msg/in_game.rs b/server/src/sys/msg/in_game.rs index 474d16a902..a47a784a89 100644 --- a/server/src/sys/msg/in_game.rs +++ b/server/src/sys/msg/in_game.rs @@ -17,6 +17,7 @@ use common_ecs::{Job, Origin, Phase, System}; use common_net::msg::{ClientGeneral, PresenceKind, ServerGeneral}; use common_state::{BlockChange, BuildAreas}; use specs::{Entities, Join, Read, ReadExpect, ReadStorage, Write, WriteStorage}; +use std::time::Instant; use tracing::{debug, trace, warn}; use vek::*; @@ -49,6 +50,7 @@ impl Sys { _terrain_persistence: &mut TerrainPersistenceData<'_>, maybe_player: &Option<&Player>, maybe_admin: &Option<&Admin>, + time_for_vd_changes: Instant, msg: ClientGeneral, ) -> Result<(), crate::error::Error> { let presence = match maybe_presence { @@ -67,20 +69,15 @@ impl Sys { *maybe_presence = None; }, ClientGeneral::SetViewDistance(view_distance) => { - presence.view_distance = settings + let clamped_view_distance = settings .max_view_distance .map(|max| view_distance.min(max)) .unwrap_or(view_distance); + presence.view_distance.set_target(clamped_view_distance, time_for_vd_changes); - //correct client if its VD is to high - if settings - .max_view_distance - .map(|max| view_distance > max) - .unwrap_or(false) - { - client.send(ServerGeneral::SetViewDistance( - settings.max_view_distance.unwrap_or(0), - ))?; + // Correct client if its requested VD is too high. + if view_distance != clamped_view_distance { + client.send(ServerGeneral::SetViewDistance(clamped_view_distance))?; } }, ClientGeneral::ControllerInputs(inputs) => { @@ -378,6 +375,8 @@ impl<'a> System<'a> for Sys { ) { let mut server_emitter = server_event_bus.emitter(); + let time_for_vd_changes = Instant::now(); + for (entity, client, mut maybe_presence, player, maybe_admin) in ( &entities, &mut clients, @@ -387,12 +386,15 @@ impl<'a> System<'a> for Sys { ) .join() { + // If an `ExitInGame` message is received this is set to `None` allowing further + // ingame messages to be ignored. + let mut clearable_maybe_presence = maybe_presence.as_deref_mut(); let _ = super::try_recv_all(client, 2, |client, msg| { Self::handle_client_in_game_msg( &mut server_emitter, entity, client, - &mut maybe_presence.as_deref_mut(), + &mut clearable_maybe_presence, &terrain, &can_build, &is_rider, @@ -410,9 +412,16 @@ impl<'a> System<'a> for Sys { &mut terrain_persistence, &player, &maybe_admin, + time_for_vd_changes, msg, ) }); + + // Ensure deferred view distance changes are applied (if the + // requsite time has elapsed). + if let Some(mut presence) = maybe_presence { + presence.view_distance.update(time_for_vd_changes); + } } } } diff --git a/server/src/sys/msg/terrain.rs b/server/src/sys/msg/terrain.rs index af91135db6..f129ce5912 100644 --- a/server/src/sys/msg/terrain.rs +++ b/server/src/sys/msg/terrain.rs @@ -76,7 +76,7 @@ impl<'a> System<'a> for Sys { pos.0.xy().map(|e| e as f64).distance_squared( key.map(|e| e as f64 + 0.5) * TerrainChunkSize::RECT_SIZE.map(|e| e as f64), - ) < ((presence.view_distance as f64 - 1.0 + ) < ((presence.view_distance.current() as f64 - 1.0 + 2.5 * 2.0_f64.sqrt()) * TerrainChunkSize::RECT_SIZE.x as f64) .powi(2) diff --git a/server/src/sys/subscription.rs b/server/src/sys/subscription.rs index a2748ac8ea..5136f44c57 100644 --- a/server/src/sys/subscription.rs +++ b/server/src/sys/subscription.rs @@ -60,7 +60,8 @@ impl<'a> System<'a> for Sys { // To update subscriptions // 1. Iterate through clients // 2. Calculate current chunk position - // 3. If chunk is the same return, otherwise continue (use fuzziness) + // 3. If chunk is different (use fuzziness) or the client view distance + // has changed continue, otherwise return // 4. Iterate through subscribed regions // 5. Check if region is still in range (use fuzziness) // 6. If not in range @@ -78,13 +79,15 @@ impl<'a> System<'a> for Sys { ) .join() { - let vd = presence.view_distance; + let vd = presence.view_distance.current(); // Calculate current chunk let chunk = (Vec2::::from(pos.0)) .map2(TerrainChunkSize::RECT_SIZE, |e, sz| e as i32 / sz as i32); - // Only update regions when moving to a new chunk - // uses a fuzzy border to prevent rapid triggering when moving along chunk - // boundaries + // Only update regions when moving to a new chunk or if view distance has + // changed. + // + // Uses a fuzzy border to prevent rapid triggering when moving along chunk + // boundaries. if chunk != subscription.fuzzy_chunk && (subscription .fuzzy_chunk @@ -96,7 +99,10 @@ impl<'a> System<'a> for Sys { e.abs() > (sz / 2 + presence::CHUNK_FUZZ) as f32 }) .reduce_or() + || subscription.last_view_distance != vd { + // Update the view distance + subscription.last_view_distance = vd; // Update current chunk subscription.fuzzy_chunk = Vec2::::from(pos.0) .map2(TerrainChunkSize::RECT_SIZE, |e, sz| e as i32 / sz as i32); @@ -216,7 +222,7 @@ pub fn initialize_region_subscription(world: &World, entity: specs::Entity) { let chunk_size = TerrainChunkSize::RECT_SIZE.reduce_max() as f32; let regions = regions_in_vd( client_pos.0, - (presence.view_distance as f32 * chunk_size) as f32 + (presence.view_distance.current() as f32 * chunk_size) as f32 + (presence::CHUNK_FUZZ as f32 + chunk_size) * 2.0f32.sqrt(), ); @@ -261,6 +267,7 @@ pub fn initialize_region_subscription(world: &World, entity: specs::Entity) { if let Err(e) = world.write_storage().insert(entity, RegionSubscription { fuzzy_chunk, + last_view_distance: presence.view_distance.current(), regions, }) { error!(?e, "Failed to insert region subscription component"); diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs index 9bf2ecf288..a7243e9f39 100644 --- a/server/src/sys/terrain.rs +++ b/server/src/sys/terrain.rs @@ -269,7 +269,7 @@ impl<'a> System<'a> for Sys { .map(|e: i32| (e.unsigned_abs()).saturating_sub(2)) .magnitude_squared(); - if adjusted_dist_sqr <= presence.view_distance.pow(2) { + if adjusted_dist_sqr <= presence.view_distance.current().pow(2) { chunk_send_emitter.emit(ChunkSendEntry { entity, chunk_key: key, @@ -293,7 +293,7 @@ impl<'a> System<'a> for Sys { // For each player with a position, calculate the distance. for (presence, pos) in (&presences, &positions).join() { - if chunk_in_vd(pos.0, chunk_key, &terrain, presence.view_distance) { + if chunk_in_vd(pos.0, chunk_key, &terrain, presence.view_distance.current()) { should_drop = false; break; } diff --git a/server/src/sys/terrain_sync.rs b/server/src/sys/terrain_sync.rs index a12302b393..010502910e 100644 --- a/server/src/sys/terrain_sync.rs +++ b/server/src/sys/terrain_sync.rs @@ -33,8 +33,12 @@ impl<'a> System<'a> for Sys { // Sync changed chunks for chunk_key in &terrain_changes.modified_chunks { for (entity, presence, pos) in (&entities, &presences, &positions).join() { - if super::terrain::chunk_in_vd(pos.0, *chunk_key, &terrain, presence.view_distance) - { + if super::terrain::chunk_in_vd( + pos.0, + *chunk_key, + &terrain, + presence.view_distance.current(), + ) { chunk_send_emitter.emit(ChunkSendEntry { entity, chunk_key: *chunk_key, From 895d6a2d8bf609173a1db1219d9c875215f0ac98 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sun, 21 Aug 2022 02:16:12 -0400 Subject: [PATCH 131/854] Impove UX of server limits on the view distance * When client gets its view distance set by the server it stores that as the max view distance allowed by the server. * This is used to avoid skip sending requests if `set_view_distance` is called with larger values. * This is then also displayed in the UI via greying out the slider when it goes past the limit and drawing another slide at the limit. * The server clamping the client's view distance no longer leads to edits in voxygen's view distance settings (the view distance setting is instead preserved). --- client/src/lib.rs | 15 ++- voxygen/src/hud/mod.rs | 1 + voxygen/src/hud/settings_window/mod.rs | 34 ++++-- voxygen/src/hud/settings_window/networking.rs | 4 + voxygen/src/hud/settings_window/video.rs | 4 + voxygen/src/menu/char_selection/mod.rs | 7 +- voxygen/src/menu/main/mod.rs | 7 +- voxygen/src/session/mod.rs | 7 +- voxygen/src/session/settings_change.rs | 30 +++--- voxygen/src/ui/widgets/image_slider.rs | 100 +++++++++++------- 10 files changed, 129 insertions(+), 80 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 51cc93fd67..5354b8f47a 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -248,6 +248,7 @@ pub struct Client { tick: u64, state: State, + server_view_distance_limit: Option, view_distance: Option, lod_distance: f32, // TODO: move into voxygen @@ -707,6 +708,7 @@ impl Client { tick: 0, state, + server_view_distance_limit: None, view_distance: None, lod_distance: 4.0, loaded_distance: 0.0, @@ -943,9 +945,11 @@ impl Client { } pub fn set_view_distance(&mut self, view_distance: u32) { - let view_distance = view_distance.max(1).min(65); - self.view_distance = Some(view_distance); - self.send_msg(ClientGeneral::SetViewDistance(view_distance)); + if self.server_view_distance_limit.map_or(true, |limit| view_distance >= limit) { + let view_distance = view_distance.max(1).min(65); + self.view_distance = Some(view_distance); + self.send_msg(ClientGeneral::SetViewDistance(view_distance)); + } } pub fn set_lod_distance(&mut self, lod_distance: u32) { @@ -1486,6 +1490,8 @@ impl Client { pub fn view_distance(&self) -> Option { self.view_distance } + pub fn server_view_distance_limit(&self) -> Option { self.server_view_distance_limit } + pub fn loaded_distance(&self) -> f32 { self.loaded_distance } pub fn position(&self) -> Option> { @@ -2254,6 +2260,9 @@ impl Client { ServerGeneral::SetViewDistance(vd) => { self.view_distance = Some(vd); frontend_events.push(Event::SetViewDistance(vd)); + // If the server is correcting client vd selection we assume this is the max + // allowed view distance. + self.server_view_distance_limit = Some(vd); }, ServerGeneral::Outcomes(outcomes) => { frontend_events.extend(outcomes.into_iter().map(Event::Outcome)) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 8acb48ce9c..5d950626d1 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -3063,6 +3063,7 @@ impl Hud { &self.imgs, &self.fonts, i18n, + client.server_view_distance_limit(), fps as f32, ) .set(self.ids.settings_window, ui_widgets) diff --git a/voxygen/src/hud/settings_window/mod.rs b/voxygen/src/hud/settings_window/mod.rs index 6b045ef933..6e55347e52 100644 --- a/voxygen/src/hud/settings_window/mod.rs +++ b/voxygen/src/hud/settings_window/mod.rs @@ -93,6 +93,7 @@ pub struct SettingsWindow<'a> { imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, + server_view_distance_limit: Option, fps: f32, #[conrod(common_builder)] common: widget::CommonBuilder, @@ -105,6 +106,7 @@ impl<'a> SettingsWindow<'a> { imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, + server_view_distance_limit: Option, fps: f32, ) -> Self { Self { @@ -113,6 +115,7 @@ impl<'a> SettingsWindow<'a> { imgs, fonts, localized_strings, + server_view_distance_limit, fps, common: widget::CommonBuilder::default(), } @@ -299,11 +302,17 @@ impl<'a> Widget for SettingsWindow<'a> { } }, SettingsTab::Video => { - for change in - video::Video::new(global_state, imgs, fonts, localized_strings, self.fps) - .top_left_with_margins_on(state.ids.settings_content_align, 0.0, 0.0) - .wh_of(state.ids.settings_content_align) - .set(state.ids.video, ui) + for change in video::Video::new( + global_state, + imgs, + fonts, + localized_strings, + self.server_view_distance_limit, + self.fps, + ) + .top_left_with_margins_on(state.ids.settings_content_align, 0.0, 0.0) + .wh_of(state.ids.settings_content_align) + .set(state.ids.video, ui) { events.push(Event::SettingsChange(change.into())); } @@ -327,11 +336,16 @@ impl<'a> Widget for SettingsWindow<'a> { } }, SettingsTab::Networking => { - for change in - networking::Networking::new(global_state, imgs, fonts, localized_strings) - .top_left_with_margins_on(state.ids.settings_content_align, 0.0, 0.0) - .wh_of(state.ids.settings_content_align) - .set(state.ids.networking, ui) + for change in networking::Networking::new( + global_state, + imgs, + fonts, + localized_strings, + self.server_view_distance_limit, + ) + .top_left_with_margins_on(state.ids.settings_content_align, 0.0, 0.0) + .wh_of(state.ids.settings_content_align) + .set(state.ids.networking, ui) { events.push(Event::SettingsChange(change.into())); } diff --git a/voxygen/src/hud/settings_window/networking.rs b/voxygen/src/hud/settings_window/networking.rs index 8a7904e55e..64ecd4685c 100644 --- a/voxygen/src/hud/settings_window/networking.rs +++ b/voxygen/src/hud/settings_window/networking.rs @@ -34,6 +34,7 @@ pub struct Networking<'a> { imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, + server_view_distance_limit: Option, #[conrod(common_builder)] common: widget::CommonBuilder, } @@ -43,12 +44,14 @@ impl<'a> Networking<'a> { imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, + server_view_distance_limit: Option, ) -> Self { Self { global_state, imgs, fonts, localized_strings, + server_view_distance_limit, common: widget::CommonBuilder::default(), } } @@ -107,6 +110,7 @@ impl<'a> Widget for Networking<'a> { .down_from(state.ids.vd_text, 8.0) .track_breadth(12.0) .slider_length(10.0) + .soft_max(self.server_view_distance_limit.unwrap_or(u32::MAX)) .pad_track((5.0, 5.0)) .set(state.ids.vd_slider, ui) { diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 2d4d9cd1a8..4e56a2dc41 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -131,6 +131,7 @@ pub struct Video<'a> { imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, + server_view_distance_limit: Option, fps: f32, #[conrod(common_builder)] common: widget::CommonBuilder, @@ -141,6 +142,7 @@ impl<'a> Video<'a> { imgs: &'a Imgs, fonts: &'a Fonts, localized_strings: &'a Localization, + server_view_distance_limit: Option, fps: f32, ) -> Self { Self { @@ -148,6 +150,7 @@ impl<'a> Video<'a> { imgs, fonts, localized_strings, + server_view_distance_limit, fps, common: widget::CommonBuilder::default(), } @@ -295,6 +298,7 @@ impl<'a> Widget for Video<'a> { .down_from(state.ids.vd_text, 8.0) .track_breadth(12.0) .slider_length(10.0) + .soft_max(self.server_view_distance_limit.unwrap_or(u32::MAX)) .pad_track((5.0, 5.0)) .set(state.ids.vd_slider, ui) { diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index 3fbbf7e212..720e365ebe 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -215,12 +215,7 @@ impl PlayState for CharSelectionState { Ok(events) => { for event in events { match event { - client::Event::SetViewDistance(vd) => { - global_state.settings.graphics.view_distance = vd; - global_state - .settings - .save_to_file_warn(&global_state.config_dir); - }, + client::Event::SetViewDistance(_vd) => {}, client::Event::Disconnect => { global_state.info_message = Some( localized_strings diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 88246035b1..7b7d3cfa1e 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -231,12 +231,7 @@ impl PlayState for MainMenuState { Ok(events) => { for event in events { match event { - client::Event::SetViewDistance(vd) => { - global_state.settings.graphics.view_distance = vd; - global_state - .settings - .save_to_file_warn(&global_state.config_dir); - }, + client::Event::SetViewDistance(_vd) => {}, client::Event::Disconnect => { global_state.info_message = Some( localized_strings diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index f3ab46bdff..4cae6af2b1 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -351,12 +351,7 @@ impl SessionState { client::Event::Notification(n) => { self.hud.new_notification(n); }, - client::Event::SetViewDistance(vd) => { - global_state.settings.graphics.view_distance = vd; - global_state - .settings - .save_to_file_warn(&global_state.config_dir); - }, + client::Event::SetViewDistance(_vd) => {}, client::Event::Outcome(outcome) => outcomes.push(outcome), client::Event::CharacterCreated(_) => {}, client::Event::CharacterEdited(_) => {}, diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 4870820688..f53d4738c9 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -355,12 +355,7 @@ impl SettingsChange { SettingsChange::Graphics(graphics_change) => { match graphics_change { Graphics::AdjustViewDistance(view_distance) => { - session_state - .client - .borrow_mut() - .set_view_distance(view_distance); - - settings.graphics.view_distance = view_distance; + adjust_view_distance(view_distance, global_state, session_state) }, Graphics::AdjustLodDistance(lod_distance) => { session_state @@ -605,11 +600,7 @@ impl SettingsChange { }, SettingsChange::Networking(networking_change) => match networking_change { Networking::AdjustViewDistance(view_distance) => { - session_state - .client - .borrow_mut() - .set_view_distance(view_distance); - settings.graphics.view_distance = view_distance; + adjust_view_distance(view_distance, global_state, session_state) }, Networking::ChangePlayerPhysicsBehavior { server_authoritative, @@ -654,6 +645,21 @@ impl SettingsChange { }, }, } - settings.save_to_file_warn(&global_state.config_dir); + global_state + .settings + .save_to_file_warn(&global_state.config_dir); } } + +fn adjust_view_distance( + view_distance: u32, + global_state: &mut GlobalState, + session_state: &mut SessionState, +) { + session_state + .client + .borrow_mut() + .set_view_distance(view_distance); + + global_state.settings.graphics.view_distance = view_distance; +} diff --git a/voxygen/src/ui/widgets/image_slider.rs b/voxygen/src/ui/widgets/image_slider.rs index dbff4e518e..cc273b8f15 100644 --- a/voxygen/src/ui/widgets/image_slider.rs +++ b/voxygen/src/ui/widgets/image_slider.rs @@ -29,6 +29,10 @@ pub struct ImageSlider { value: T, min: T, max: T, + // If `value > soft_max` we will display the slider at `soft_max` along with a faded ghost + // slider at `value`. The slider displayed at `soft_max` is purely a visual indicator and has + // no effect on the values produced by this slider. + soft_max: T, /// The amount in which the slider's display should be skewed. /// /// Higher skew amounts (above 1.0) will weigh lower values. @@ -65,6 +69,7 @@ widget_ids! { struct Ids { track, slider, + soft_max_slider, } } @@ -76,6 +81,7 @@ pub struct State { impl ImageSlider { builder_methods! { pub skew { skew = f32 } + pub soft_max { soft_max = T } pub pad_track { track.padding = (f32, f32) } pub hover_image { slider.hover_image_id = Some(image::Id) } pub press_image { slider.press_image_id = Some(image::Id) } @@ -85,18 +91,16 @@ impl ImageSlider { pub slider_color { slider.color = Some(Color) } } - fn new( - value: T, - min: T, - max: T, - slider_image_id: image::Id, - track_image_id: image::Id, - ) -> Self { + fn new(value: T, min: T, max: T, slider_image_id: image::Id, track_image_id: image::Id) -> Self + where + T: Copy, + { Self { common: widget::CommonBuilder::default(), value, min, max, + soft_max: max, skew: 1.0, track: Track { image_id: track_image_id, @@ -133,7 +137,7 @@ where impl ImageSlider where - T: Integer, + T: Integer + Copy, { pub fn discrete( value: T, @@ -266,45 +270,67 @@ where .unwrap_or(slider.image_id); // A rectangle for positioning and sizing the slider. - let value_perc = utils::map_range(new_value, min, max, 0.0, 1.0); - let unskewed_perc = value_perc.powf(1.0 / skew as f64); - let slider_rect = if is_horizontal { - let pos = utils::map_range( - unskewed_perc, - 0.0, - 1.0, - rect.x.start + start_pad, - rect.x.end - end_pad, - ); - let w = slider.length.map_or(rect.w() / 10.0, |w| w as f64); - Rect { - x: Range::from_pos_and_len(pos, w), - ..rect - } - } else { - let pos = utils::map_range( - unskewed_perc, - 0.0, - 1.0, - rect.y.start + start_pad, - rect.y.end - end_pad, - ); - let h = slider.length.map_or(rect.h() / 10.0, |h| h as f64); - Rect { - y: Range::from_pos_and_len(pos, h), - ..rect + let slider_rect = |slider_value| { + let value_perc = utils::map_range(slider_value, min, max, 0.0, 1.0); + let unskewed_perc = value_perc.powf(1.0 / skew as f64); + if is_horizontal { + let pos = utils::map_range( + unskewed_perc, + 0.0, + 1.0, + rect.x.start + start_pad, + rect.x.end - end_pad, + ); + let w = slider.length.map_or(rect.w() / 10.0, |w| w as f64); + Rect { + x: Range::from_pos_and_len(pos, w), + ..rect + } + } else { + let pos = utils::map_range( + unskewed_perc, + 0.0, + 1.0, + rect.y.start + start_pad, + rect.y.end - end_pad, + ); + let h = slider.length.map_or(rect.h() / 10.0, |h| h as f64); + Rect { + y: Range::from_pos_and_len(pos, h), + ..rect + } } }; - let (x, y, w, h) = slider_rect.x_y_w_h(); + // Whether soft max slider needs to be displayed and main slider faded to look + // like a ghost. + let over_soft_max = new_value > self.soft_max; + + let (x, y, w, h) = slider_rect(new_value).x_y_w_h(); + let fade = if over_soft_max { 0.5 } else { 1.0 }; Image::new(slider_image) .x_y(x, y) .w_h(w, h) .parent(id) .graphics_for(id) - .color(slider.color) + .color(Some( + slider + .color + .map_or(Color::Rgba(1.0, 1.0, 1.0, fade), |c: Color| c.alpha(fade)), + )) .set(state.ids.slider, ui); + if over_soft_max { + let (x, y, w, h) = slider_rect(self.soft_max).x_y_w_h(); + Image::new(slider_image) + .x_y(x, y) + .w_h(w, h) + .parent(id) + .graphics_for(id) + .color(slider.color) + .set(state.ids.soft_max_slider, ui); + } + // If the value has just changed, return the new value. if value != new_value { Some(new_value) From 334937568e82428408ecb9b18b4e559577f950af Mon Sep 17 00:00:00 2001 From: Imbris Date: Sun, 21 Aug 2022 23:21:39 -0400 Subject: [PATCH 132/854] Add an entity view distance setting that allows limiting the distance entities are synced from and displayed in. NOTE: Syncing entities work at the granularity regions which are multi-chunk squares but the display of entities in voxygen is limited in a circle with the radiues of the supplied distance. Additional details and changes: * Added `ViewDistances` struct in `common` that contains separate terrain and entity view distances (the entity view distance will be clamped by the terrain view distance in uses of this). * View distance requests from the client to the server now use this type. * When requesting the character or spectate state the client now passes its desired view distances. This is exposed as a new parameter on `Client::request_character`/`Client::request_spectate`. And the client no longer needs to send a view distance request after entering these states. This also allows us to avoid needing to initialize `Presence` with a default view distance value on the server. * Removed `DerefFlaggedStorage` from `Presence` and `RegionSubscription` since the change tracking isn't used for these components. * Add sliders in voxygen graphics and network tabs for this new setting. Show the clamped value as well as the selected value next to the slider. * Rename existing "Entities View Distance" slider (which AFAIK controls the distance at which different LOD levels apply to figures) to "Entities Detail Distance" so we can use the former name for this new slider. --- assets/voxygen/i18n/en/hud/settings.ftl | 3 +- client/src/lib.rs | 40 ++- common/net/src/msg/client.rs | 9 +- common/net/src/msg/server.rs | 4 + common/src/event.rs | 3 +- common/src/lib.rs | 2 + common/src/view_distances.rs | 23 ++ server/src/events/entity_creation.rs | 24 +- server/src/events/mod.rs | 12 +- server/src/presence.rs | 18 +- server/src/state_ext.rs | 33 ++- server/src/sys/entity_sync.rs | 2 +- server/src/sys/msg/character_screen.rs | 7 +- server/src/sys/msg/in_game.rs | 26 +- server/src/sys/msg/terrain.rs | 2 +- server/src/sys/subscription.rs | 10 +- server/src/sys/terrain.rs | 4 +- server/src/sys/terrain_sync.rs | 2 +- voxygen/src/hud/settings_window/networking.rs | 84 ++++-- voxygen/src/hud/settings_window/video.rs | 249 +++++++++++------- voxygen/src/menu/char_selection/mod.rs | 17 +- voxygen/src/scene/figure/mod.rs | 2 +- voxygen/src/scene/mod.rs | 3 +- voxygen/src/session/mod.rs | 12 +- voxygen/src/session/settings_change.rs | 57 ++-- voxygen/src/settings/graphics.rs | 6 +- 26 files changed, 435 insertions(+), 219 deletions(-) create mode 100644 common/src/view_distances.rs diff --git a/assets/voxygen/i18n/en/hud/settings.ftl b/assets/voxygen/i18n/en/hud/settings.ftl index 97d5df9064..e9c78472c5 100644 --- a/assets/voxygen/i18n/en/hud/settings.ftl +++ b/assets/voxygen/i18n/en/hud/settings.ftl @@ -54,9 +54,10 @@ hud-settings-auto_camera = Auto camera hud-settings-bow_zoom = Zoom in when charging bow hud-settings-reset_gameplay = Reset to Defaults hud-settings-view_distance = View Distance +hud-settings-entity_view_distance = Entities View Distance hud-settings-lod_distance = LoD Distance hud-settings-sprites_view_distance = Sprites View Distance -hud-settings-figures_view_distance = Entities View Distance +hud-settings-entities_detail_distance = Entities Detail Distance hud-settings-maximum_fps = Maximum FPS hud-settings-background_fps = Background FPS hud-settings-present_mode = Present Mode diff --git a/client/src/lib.rs b/client/src/lib.rs index 5354b8f47a..24b41c8664 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -249,6 +249,7 @@ pub struct Client { state: State, server_view_distance_limit: Option, + /// Terrrain view distance view_distance: Option, lod_distance: f32, // TODO: move into voxygen @@ -805,8 +806,8 @@ impl Client { | ClientGeneral::CreateCharacter { .. } | ClientGeneral::EditCharacter { .. } | ClientGeneral::DeleteCharacter(_) - | ClientGeneral::Character(_) - | ClientGeneral::Spectate => &mut self.character_screen_stream, + | ClientGeneral::Character(_, _) + | ClientGeneral::Spectate(_) => &mut self.character_screen_stream, //Only in game ClientGeneral::ControllerInputs(_) | ClientGeneral::ControlEvent(_) @@ -881,16 +882,16 @@ impl Client { } /// Request a state transition to `ClientState::Character`. - pub fn request_character(&mut self, character_id: CharacterId) { - self.send_msg(ClientGeneral::Character(character_id)); + pub fn request_character(&mut self, character_id: CharacterId, view_distances: common::ViewDistances) { + self.send_msg(ClientGeneral::Character(character_id, view_distances)); // Assume we are in_game unless server tells us otherwise self.presence = Some(PresenceKind::Character(character_id)); } /// Request a state transition to `ClientState::Spectate`. - pub fn request_spectate(&mut self) { - self.send_msg(ClientGeneral::Spectate); + pub fn request_spectate(&mut self, view_distances: common::ViewDistances) { + self.send_msg(ClientGeneral::Spectate(view_distances)); self.presence = Some(PresenceKind::Spectator); } @@ -944,11 +945,14 @@ impl Client { self.send_msg(ClientGeneral::ExitInGame); } - pub fn set_view_distance(&mut self, view_distance: u32) { - if self.server_view_distance_limit.map_or(true, |limit| view_distance >= limit) { - let view_distance = view_distance.max(1).min(65); - self.view_distance = Some(view_distance); - self.send_msg(ClientGeneral::SetViewDistance(view_distance)); + pub fn set_view_distances(&mut self, view_distances: common::ViewDistances) { + if self.server_view_distance_limit.map_or(true, |limit| view_distances.terrain >= limit) { + let view_distances = common::ViewDistances { + terrain: view_distances.terrain.max(1).min(65), + entity: view_distances.entity, + }; + self.view_distance = Some(view_distances.terrain); + self.send_msg(ClientGeneral::SetViewDistance(view_distances)); } } @@ -2357,18 +2361,10 @@ impl Client { ServerGeneral::CharacterEdited(character_id) => { events.push(Event::CharacterEdited(character_id)); }, - ServerGeneral::CharacterSuccess => { - debug!("client is now in ingame state on server"); - if let Some(vd) = self.view_distance { - self.set_view_distance(vd); - } - }, + ServerGeneral::CharacterSuccess => debug!("client is now in ingame state on server"), ServerGeneral::SpectatorSuccess(spawn_point) => { - if let Some(vd) = self.view_distance { - events.push(Event::StartSpectate(spawn_point)); - debug!("client is now in ingame state on server"); - self.set_view_distance(vd); - } + events.push(Event::StartSpectate(spawn_point)); + debug!("client is now in ingame state on server"); }, _ => unreachable!("Not a character_screen msg"), } diff --git a/common/net/src/msg/client.rs b/common/net/src/msg/client.rs index f373593b5c..18ad9e52d5 100644 --- a/common/net/src/msg/client.rs +++ b/common/net/src/msg/client.rs @@ -4,6 +4,7 @@ use common::{ comp, comp::{Skill, SkillGroupKind}, terrain::block::Block, + ViewDistances, }; use serde::{Deserialize, Serialize}; use vek::*; @@ -60,13 +61,13 @@ pub enum ClientGeneral { alias: String, body: comp::Body, }, - Character(CharacterId), - Spectate, + Character(CharacterId, ViewDistances), + Spectate(ViewDistances), //Only in game ControllerInputs(Box), ControlEvent(comp::ControlEvent), ControlAction(comp::ControlAction), - SetViewDistance(u32), + SetViewDistance(ViewDistances), BreakBlock(Vec3), PlaceBlock(Vec3, Block), ExitInGame, @@ -121,7 +122,7 @@ impl ClientMsg { | ClientGeneral::DeleteCharacter(_) => { c_type != ClientType::ChatOnly && presence.is_none() }, - ClientGeneral::Character(_) | ClientGeneral::Spectate => { + ClientGeneral::Character(_, _) | ClientGeneral::Spectate(_) => { c_type == ClientType::Game && presence.is_none() }, //Only in game diff --git a/common/net/src/msg/server.rs b/common/net/src/msg/server.rs index 9fecc4361b..948f9a80a2 100644 --- a/common/net/src/msg/server.rs +++ b/common/net/src/msg/server.rs @@ -166,6 +166,10 @@ pub enum ServerGeneral { /// from an ingame state ExitInGameSuccess, InventoryUpdate(comp::Inventory, comp::InventoryUpdateEvent), + /// NOTE: The client can infer that entity view distance will be at most the + /// terrain view distance that we send here (and if lower it won't be + /// modified). So we just need to send the terrain VD back to the client + /// if corrections are made. SetViewDistance(u32), Outcomes(Vec), Knockback(Vec3), diff --git a/common/src/event.rs b/common/src/event.rs index d540b80b5d..4455484ace 100644 --- a/common/src/event.rs +++ b/common/src/event.rs @@ -107,8 +107,9 @@ pub enum ServerEvent { InitCharacterData { entity: EcsEntity, character_id: CharacterId, + requested_view_distances: crate::ViewDistances, }, - InitSpectator(EcsEntity), + InitSpectator(EcsEntity, crate::ViewDistances), UpdateCharacterData { entity: EcsEntity, components: ( diff --git a/common/src/lib.rs b/common/src/lib.rs index 88ae0bdefb..8b8e35b224 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -81,6 +81,7 @@ pub mod terrain; #[cfg(not(target_arch = "wasm32"))] pub mod typed; pub mod uid; #[cfg(not(target_arch = "wasm32"))] pub mod util; +mod view_distances; #[cfg(not(target_arch = "wasm32"))] pub mod vol; #[cfg(not(target_arch = "wasm32"))] pub mod volumes; @@ -98,3 +99,4 @@ pub use comp::inventory::loadout_builder::LoadoutBuilder; pub use explosion::{Explosion, RadiusEffect}; #[cfg(not(target_arch = "wasm32"))] pub use skillset_builder::SkillSetBuilder; +pub use view_distances::ViewDistances; diff --git a/common/src/view_distances.rs b/common/src/view_distances.rs new file mode 100644 index 0000000000..94416e5886 --- /dev/null +++ b/common/src/view_distances.rs @@ -0,0 +1,23 @@ +#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize)] +pub struct ViewDistances { + pub terrain: u32, + /// Server will clamp this to `terrain` if it is larger. + /// + /// NOTE: Importantly, the server still loads entities in the `terrain` view + /// distance (at least currently, please update this if you change it!), + /// but the syncing to the client is done based on the entity view + /// distance. + pub entity: u32, +} + +impl ViewDistances { + /// Clamps the terrain view distance to an optional max and clamps the + /// entity view distance to the resulting terrain view distance. + pub fn clamp(self, max: Option) -> Self { + let terrain = max.unwrap_or(u32::MAX).min(self.terrain); + Self { + terrain, + entity: self.entity.min(terrain), + } + } +} diff --git a/server/src/events/entity_creation.rs b/server/src/events/entity_creation.rs index 4afac192c5..3e0e9f390e 100644 --- a/server/src/events/entity_creation.rs +++ b/server/src/events/entity_creation.rs @@ -17,6 +17,7 @@ use common::{ rtsim::RtSimEntity, uid::Uid, util::Dir, + ViewDistances, }; use common_net::{msg::ServerGeneral, sync::WorldSyncExt}; use specs::{Builder, Entity as EcsEntity, WorldExt}; @@ -29,12 +30,29 @@ pub fn handle_initialize_character( server: &mut Server, entity: EcsEntity, character_id: CharacterId, + requested_view_distances: ViewDistances, ) { - server.state.initialize_character_data(entity, character_id); + let clamped_vds = requested_view_distances.clamp(server.settings().max_view_distance); + server + .state + .initialize_character_data(entity, character_id, clamped_vds); + // Correct client if its requested VD is too high. + if requested_view_distances.terrain != clamped_vds.terrain { + server.notify_client(entity, ServerGeneral::SetViewDistance(clamped_vds.terrain)); + } } -pub fn handle_initialize_spectator(server: &mut Server, entity: EcsEntity) { - server.state.initialize_spectator_data(entity); +pub fn handle_initialize_spectator( + server: &mut Server, + entity: EcsEntity, + requested_view_distances: ViewDistances, +) { + let clamped_vds = requested_view_distances.clamp(server.settings().max_view_distance); + server.state.initialize_spectator_data(entity, clamped_vds); + // Correct client if its requested VD is too high. + if requested_view_distances.terrain != clamped_vds.terrain { + server.notify_client(entity, ServerGeneral::SetViewDistance(clamped_vds.terrain)); + } sys::subscription::initialize_region_subscription(server.state.ecs(), entity); } diff --git a/server/src/events/mod.rs b/server/src/events/mod.rs index d8fb23f2d7..9b496c77b0 100644 --- a/server/src/events/mod.rs +++ b/server/src/events/mod.rs @@ -140,8 +140,16 @@ impl Server { ServerEvent::InitCharacterData { entity, character_id, - } => handle_initialize_character(self, entity, character_id), - ServerEvent::InitSpectator(entity) => handle_initialize_spectator(self, entity), + requested_view_distances, + } => handle_initialize_character( + self, + entity, + character_id, + requested_view_distances, + ), + ServerEvent::InitSpectator(entity, requested_view_distances) => { + handle_initialize_spectator(self, entity, requested_view_distances) + }, ServerEvent::UpdateCharacterData { entity, components } => { let ( body, diff --git a/server/src/presence.rs b/server/src/presence.rs index c6559d1925..7db43d1cca 100644 --- a/server/src/presence.rs +++ b/server/src/presence.rs @@ -1,22 +1,24 @@ use common_net::msg::PresenceKind; use hashbrown::HashSet; use serde::{Deserialize, Serialize}; -use specs::{Component, DerefFlaggedStorage, NullStorage}; +use specs::{Component, NullStorage}; use std::time::{Duration, Instant}; use vek::*; #[derive(Debug)] pub struct Presence { - // TODO: separate view distance for syncing entities? - pub view_distance: ViewDistance, + pub terrain_view_distance: ViewDistance, + pub entity_view_distance: ViewDistance, pub kind: PresenceKind, pub lossy_terrain_compression: bool, } impl Presence { - pub fn new(view_distance: u32, kind: PresenceKind) -> Self { + pub fn new(view_distances: common::ViewDistances, kind: PresenceKind) -> Self { + let now = Instant::now(); Self { - view_distance: ViewDistance::new(view_distance, Instant::now()), + terrain_view_distance: ViewDistance::new(view_distances.terrain, now), + entity_view_distance: ViewDistance::new(view_distances.entity, now), kind, lossy_terrain_compression: false, } @@ -24,7 +26,7 @@ impl Presence { } impl Component for Presence { - type Storage = DerefFlaggedStorage>; + type Storage = specs::DenseVecStorage; } // Distance from fuzzy_chunk before snapping to current chunk @@ -35,12 +37,12 @@ pub const REGION_FUZZ: u32 = 16; #[derive(Clone, Debug)] pub struct RegionSubscription { pub fuzzy_chunk: Vec2, - pub last_view_distance: u32, + pub last_entity_view_distance: u32, pub regions: HashSet>, } impl Component for RegionSubscription { - type Storage = DerefFlaggedStorage>; + type Storage = specs::DenseVecStorage; } #[derive(Copy, Clone, Debug, Default, Serialize, Deserialize)] diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index d3c1bb94e7..5a271b5131 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -26,6 +26,7 @@ use common::{ resources::{Time, TimeOfDay}, slowjob::SlowJobPool, uid::{Uid, UidAllocator}, + ViewDistances, }; use common_net::{ msg::{CharacterInfo, PlayerListUpdate, PresenceKind, ServerGeneral}, @@ -107,9 +108,14 @@ pub trait StateExt { index: &world::IndexOwned, ) -> EcsEntityBuilder; /// Insert common/default components for a new character joining the server - fn initialize_character_data(&mut self, entity: EcsEntity, character_id: CharacterId); + fn initialize_character_data( + &mut self, + entity: EcsEntity, + character_id: CharacterId, + view_distances: ViewDistances, + ); /// Insert common/default components for a new spectator joining the server - fn initialize_spectator_data(&mut self, entity: EcsEntity); + fn initialize_spectator_data(&mut self, entity: EcsEntity, view_distances: ViewDistances); /// Update the components associated with the entity's current character. /// Performed after loading component data from the database fn update_character_data(&mut self, entity: EcsEntity, components: PersistedComponents); @@ -488,10 +494,21 @@ impl StateExt for State { self.ecs_mut() .create_entity_synced() .with(pos) - .with(Presence::new(view_distance, PresenceKind::Spectator)) + .with(Presence::new( + ViewDistances { + terrain: view_distance, + entity: view_distance, + }, + PresenceKind::Spectator, + )) } - fn initialize_character_data(&mut self, entity: EcsEntity, character_id: CharacterId) { + fn initialize_character_data( + &mut self, + entity: EcsEntity, + character_id: CharacterId, + view_distances: ViewDistances, + ) { let spawn_point = self.ecs().read_resource::().0; if let Some(player_uid) = self.read_component_copied::(entity) { @@ -519,10 +536,9 @@ impl StateExt for State { // Make sure physics components are updated self.write_component_ignore_entity_dead(entity, comp::ForceUpdate::forced()); - const INITIAL_VD: u32 = 5; // will be changed after login self.write_component_ignore_entity_dead( entity, - Presence::new(INITIAL_VD, PresenceKind::Character(character_id)), + Presence::new(view_distances, PresenceKind::Character(character_id)), ); // Tell the client its request was successful. @@ -532,7 +548,7 @@ impl StateExt for State { } } - fn initialize_spectator_data(&mut self, entity: EcsEntity) { + fn initialize_spectator_data(&mut self, entity: EcsEntity, view_distances: ViewDistances) { let spawn_point = self.ecs().read_resource::().0; if self.read_component_copied::(entity).is_some() { @@ -545,10 +561,9 @@ impl StateExt for State { // Make sure physics components are updated self.write_component_ignore_entity_dead(entity, comp::ForceUpdate::forced()); - const INITIAL_VD: u32 = 5; //will be changed after login self.write_component_ignore_entity_dead( entity, - Presence::new(INITIAL_VD, PresenceKind::Spectator), + Presence::new(view_distances, PresenceKind::Spectator), ); // Tell the client its request was successful. diff --git a/server/src/sys/entity_sync.rs b/server/src/sys/entity_sync.rs index a2e5407322..dc303e732f 100644 --- a/server/src/sys/entity_sync.rs +++ b/server/src/sys/entity_sync.rs @@ -384,7 +384,7 @@ impl<'a> System<'a> for Sys { let is_near = |o_pos: Vec3| { pos.zip_with(presence, |pos, presence| { pos.0.xy().distance_squared(o_pos.xy()) - < (presence.view_distance.current() as f32 + < (presence.entity_view_distance.current() as f32 * TerrainChunkSize::RECT_SIZE.x as f32) .powi(2) }) diff --git a/server/src/sys/msg/character_screen.rs b/server/src/sys/msg/character_screen.rs index d9a12f58f0..0e6ce84b28 100644 --- a/server/src/sys/msg/character_screen.rs +++ b/server/src/sys/msg/character_screen.rs @@ -64,17 +64,17 @@ impl Sys { }; match msg { // Request spectator state - ClientGeneral::Spectate => { + ClientGeneral::Spectate(requested_view_distances) => { if let Some(admin) = admins.get(entity) && admin.0 >= AdminRole::Moderator { send_join_messages()?; - server_emitter.emit(ServerEvent::InitSpectator(entity)); + server_emitter.emit(ServerEvent::InitSpectator(entity, requested_view_distances)); } else { debug!("dropped Spectate msg from unprivileged client") } }, - ClientGeneral::Character(character_id) => { + ClientGeneral::Character(character_id, requested_view_distances) => { if let Some(player) = players.get(entity) { if presences.contains(entity) { debug!("player already ingame, aborting"); @@ -117,6 +117,7 @@ impl Sys { server_emitter.emit(ServerEvent::InitCharacterData { entity, character_id, + requested_view_distances, }); } } else { diff --git a/server/src/sys/msg/in_game.rs b/server/src/sys/msg/in_game.rs index a47a784a89..95d92bee8b 100644 --- a/server/src/sys/msg/in_game.rs +++ b/server/src/sys/msg/in_game.rs @@ -53,7 +53,7 @@ impl Sys { time_for_vd_changes: Instant, msg: ClientGeneral, ) -> Result<(), crate::error::Error> { - let presence = match maybe_presence { + let presence = match maybe_presence.as_deref_mut() { Some(g) => g, None => { debug!(?entity, "client is not in_game, ignoring msg"); @@ -68,16 +68,15 @@ impl Sys { client.send(ServerGeneral::ExitInGameSuccess)?; *maybe_presence = None; }, - ClientGeneral::SetViewDistance(view_distance) => { - let clamped_view_distance = settings - .max_view_distance - .map(|max| view_distance.min(max)) - .unwrap_or(view_distance); - presence.view_distance.set_target(clamped_view_distance, time_for_vd_changes); + ClientGeneral::SetViewDistance(view_distances) => { + let clamped_vds = view_distances.clamp(settings.max_view_distance); + + presence.terrain_view_distance.set_target(clamped_vds.terrain, time_for_vd_changes); + presence.entity_view_distance.set_target(clamped_vds.entity, time_for_vd_changes); // Correct client if its requested VD is too high. - if view_distance != clamped_view_distance { - client.send(ServerGeneral::SetViewDistance(clamped_view_distance))?; + if view_distances.terrain != clamped_vds.terrain { + client.send(ServerGeneral::SetViewDistance(clamped_vds.terrain))?; } }, ClientGeneral::ControllerInputs(inputs) => { @@ -296,8 +295,8 @@ impl Sys { | ClientGeneral::CreateCharacter { .. } | ClientGeneral::EditCharacter { .. } | ClientGeneral::DeleteCharacter(_) - | ClientGeneral::Character(_) - | ClientGeneral::Spectate + | ClientGeneral::Character(_, _) + | ClientGeneral::Spectate(_) | ClientGeneral::TerrainChunkRequest { .. } | ClientGeneral::LodZoneRequest { .. } | ClientGeneral::ChatMsg(_) @@ -419,8 +418,9 @@ impl<'a> System<'a> for Sys { // Ensure deferred view distance changes are applied (if the // requsite time has elapsed). - if let Some(mut presence) = maybe_presence { - presence.view_distance.update(time_for_vd_changes); + if let Some(presence) = maybe_presence { + presence.terrain_view_distance.update(time_for_vd_changes); + presence.entity_view_distance.update(time_for_vd_changes); } } } diff --git a/server/src/sys/msg/terrain.rs b/server/src/sys/msg/terrain.rs index f129ce5912..c60ea357fb 100644 --- a/server/src/sys/msg/terrain.rs +++ b/server/src/sys/msg/terrain.rs @@ -76,7 +76,7 @@ impl<'a> System<'a> for Sys { pos.0.xy().map(|e| e as f64).distance_squared( key.map(|e| e as f64 + 0.5) * TerrainChunkSize::RECT_SIZE.map(|e| e as f64), - ) < ((presence.view_distance.current() as f64 - 1.0 + ) < ((presence.terrain_view_distance.current() as f64 - 1.0 + 2.5 * 2.0_f64.sqrt()) * TerrainChunkSize::RECT_SIZE.x as f64) .powi(2) diff --git a/server/src/sys/subscription.rs b/server/src/sys/subscription.rs index 5136f44c57..ea3521ddbc 100644 --- a/server/src/sys/subscription.rs +++ b/server/src/sys/subscription.rs @@ -79,7 +79,7 @@ impl<'a> System<'a> for Sys { ) .join() { - let vd = presence.view_distance.current(); + let vd = presence.entity_view_distance.current(); // Calculate current chunk let chunk = (Vec2::::from(pos.0)) .map2(TerrainChunkSize::RECT_SIZE, |e, sz| e as i32 / sz as i32); @@ -99,10 +99,10 @@ impl<'a> System<'a> for Sys { e.abs() > (sz / 2 + presence::CHUNK_FUZZ) as f32 }) .reduce_or() - || subscription.last_view_distance != vd + || subscription.last_entity_view_distance != vd { // Update the view distance - subscription.last_view_distance = vd; + subscription.last_entity_view_distance = vd; // Update current chunk subscription.fuzzy_chunk = Vec2::::from(pos.0) .map2(TerrainChunkSize::RECT_SIZE, |e, sz| e as i32 / sz as i32); @@ -222,7 +222,7 @@ pub fn initialize_region_subscription(world: &World, entity: specs::Entity) { let chunk_size = TerrainChunkSize::RECT_SIZE.reduce_max() as f32; let regions = regions_in_vd( client_pos.0, - (presence.view_distance.current() as f32 * chunk_size) as f32 + (presence.entity_view_distance.current() as f32 * chunk_size) as f32 + (presence::CHUNK_FUZZ as f32 + chunk_size) * 2.0f32.sqrt(), ); @@ -267,7 +267,7 @@ pub fn initialize_region_subscription(world: &World, entity: specs::Entity) { if let Err(e) = world.write_storage().insert(entity, RegionSubscription { fuzzy_chunk, - last_view_distance: presence.view_distance.current(), + last_entity_view_distance: presence.entity_view_distance.current(), regions, }) { error!(?e, "Failed to insert region subscription component"); diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs index a7243e9f39..369852785b 100644 --- a/server/src/sys/terrain.rs +++ b/server/src/sys/terrain.rs @@ -269,7 +269,7 @@ impl<'a> System<'a> for Sys { .map(|e: i32| (e.unsigned_abs()).saturating_sub(2)) .magnitude_squared(); - if adjusted_dist_sqr <= presence.view_distance.current().pow(2) { + if adjusted_dist_sqr <= presence.terrain_view_distance.current().pow(2) { chunk_send_emitter.emit(ChunkSendEntry { entity, chunk_key: key, @@ -293,7 +293,7 @@ impl<'a> System<'a> for Sys { // For each player with a position, calculate the distance. for (presence, pos) in (&presences, &positions).join() { - if chunk_in_vd(pos.0, chunk_key, &terrain, presence.view_distance.current()) { + if chunk_in_vd(pos.0, chunk_key, &terrain, presence.terrain_view_distance.current()) { should_drop = false; break; } diff --git a/server/src/sys/terrain_sync.rs b/server/src/sys/terrain_sync.rs index 010502910e..4212261a15 100644 --- a/server/src/sys/terrain_sync.rs +++ b/server/src/sys/terrain_sync.rs @@ -37,7 +37,7 @@ impl<'a> System<'a> for Sys { pos.0, *chunk_key, &terrain, - presence.view_distance.current(), + presence.terrain_view_distance.current(), ) { chunk_send_emitter.emit(ChunkSendEntry { entity, diff --git a/voxygen/src/hud/settings_window/networking.rs b/voxygen/src/hud/settings_window/networking.rs index 64ecd4685c..3c624ef3a2 100644 --- a/voxygen/src/hud/settings_window/networking.rs +++ b/voxygen/src/hud/settings_window/networking.rs @@ -15,9 +15,12 @@ widget_ids! { struct Ids { window, window_r, - vd_text, - vd_slider, - vd_value, + terrain_vd_text, + terrain_vd_slider, + terrain_vd_value, + entity_vd_text, + entity_vd_slider, + entity_vd_value, player_physics_behavior_text, player_physics_behavior_list, lossy_terrain_compression_button, @@ -97,35 +100,84 @@ impl<'a> Widget for Networking<'a> { .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) - .set(state.ids.vd_text, ui); + .set(state.ids.terrain_vd_text, ui); + let terrain_view_distance = self.global_state.settings.graphics.terrain_view_distance; + let server_view_distance_limit = self.server_view_distance_limit.unwrap_or(u32::MAX); if let Some(new_val) = ImageSlider::discrete( - self.global_state.settings.graphics.view_distance, + terrain_view_distance, 1, 65, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.vd_text, 8.0) + .down_from(state.ids.terrain_vd_text, 8.0) .track_breadth(12.0) .slider_length(10.0) - .soft_max(self.server_view_distance_limit.unwrap_or(u32::MAX)) + .soft_max(server_view_distance_limit) .pad_track((5.0, 5.0)) - .set(state.ids.vd_slider, ui) + .set(state.ids.terrain_vd_slider, ui) { - events.push(NetworkingChange::AdjustViewDistance(new_val)); + events.push(NetworkingChange::AdjustTerrainViewDistance(new_val)); } - Text::new(&format!( - "{}", - self.global_state.settings.graphics.view_distance - )) - .right_from(state.ids.vd_slider, 8.0) + Text::new(&if terrain_view_distance <= server_view_distance_limit { + format!("{terrain_view_distance}") + } else { + format!("{terrain_view_distance} ({server_view_distance_limit})") + }) + .right_from(state.ids.terrain_vd_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) - .set(state.ids.vd_value, ui); + .set(state.ids.terrain_vd_value, ui); + + // Entity View Distance + Text::new( + &self + .localized_strings + .get_msg("hud-settings-entity_view_distance"), + ) + .down_from(state.ids.terrain_vd_slider, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.entity_vd_text, ui); + + let soft_entity_vd_max = self + .server_view_distance_limit + .unwrap_or(u32::MAX) + .min(terrain_view_distance); + let entity_view_distance = self.global_state.settings.graphics.entity_view_distance; + if let Some(new_val) = ImageSlider::discrete( + entity_view_distance, + 1, + 65, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .down_from(state.ids.entity_vd_text, 8.0) + .track_breadth(12.0) + .slider_length(10.0) + .soft_max(soft_entity_vd_max) + .pad_track((5.0, 5.0)) + .set(state.ids.entity_vd_slider, ui) + { + events.push(NetworkingChange::AdjustEntityViewDistance(new_val)); + } + + Text::new(&if entity_view_distance <= soft_entity_vd_max { + format!("{entity_view_distance}") + } else { + format!("{entity_view_distance} ({soft_entity_vd_max})") + }) + .right_from(state.ids.entity_vd_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.entity_vd_value, ui); // Player physics behavior Text::new( @@ -133,7 +185,7 @@ impl<'a> Widget for Networking<'a> { .localized_strings .get_msg("hud-settings-player_physics_behavior"), ) - .down_from(state.ids.vd_slider, 8.0) + .down_from(state.ids.entity_vd_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 4e56a2dc41..7214d74707 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -36,9 +36,12 @@ widget_ids! { reset_graphics_button, fps_counter, pipeline_recreation_text, - vd_slider, - vd_text, - vd_value, + terrain_vd_slider, + terrain_vd_text, + terrain_vd_value, + entity_vd_slider, + entity_vd_text, + entity_vd_value, ld_slider, ld_text, ld_value, @@ -285,39 +288,126 @@ impl<'a> Widget for Video<'a> { .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) - .set(state.ids.vd_text, ui); + .set(state.ids.terrain_vd_text, ui); + let terrain_view_distance = self.global_state.settings.graphics.terrain_view_distance; + let server_view_distance_limit = self.server_view_distance_limit.unwrap_or(u32::MAX); if let Some(new_val) = ImageSlider::discrete( - self.global_state.settings.graphics.view_distance, + terrain_view_distance, 1, 65, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.vd_text, 8.0) + .down_from(state.ids.terrain_vd_text, 8.0) .track_breadth(12.0) .slider_length(10.0) - .soft_max(self.server_view_distance_limit.unwrap_or(u32::MAX)) + .soft_max(server_view_distance_limit) .pad_track((5.0, 5.0)) - .set(state.ids.vd_slider, ui) + .set(state.ids.terrain_vd_slider, ui) { - events.push(GraphicsChange::AdjustViewDistance(new_val)); + events.push(GraphicsChange::AdjustTerrainViewDistance(new_val)); } - Text::new(&format!( - "{}", - self.global_state.settings.graphics.view_distance - )) - .right_from(state.ids.vd_slider, 8.0) + Text::new(&if terrain_view_distance <= server_view_distance_limit { + format!("{terrain_view_distance}") + } else { + format!("{terrain_view_distance} ({server_view_distance_limit})") + }) + .right_from(state.ids.terrain_vd_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) - .set(state.ids.vd_value, ui); + .set(state.ids.terrain_vd_value, ui); + + // Entity View Distance + let soft_entity_vd_max = self + .server_view_distance_limit + .unwrap_or(u32::MAX) + .min(terrain_view_distance); + let entity_view_distance = self.global_state.settings.graphics.entity_view_distance; + if let Some(new_val) = ImageSlider::discrete( + entity_view_distance, + 1, + 65, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .right_from(state.ids.terrain_vd_slider, 70.0) + .track_breadth(12.0) + .slider_length(10.0) + .soft_max(soft_entity_vd_max) + .pad_track((5.0, 5.0)) + .set(state.ids.entity_vd_slider, ui) + { + events.push(GraphicsChange::AdjustEntityViewDistance(new_val)); + } + + Text::new( + &self + .localized_strings + .get_msg("hud-settings-entity_view_distance"), + ) + .up_from(state.ids.entity_vd_slider, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.entity_vd_text, ui); + + Text::new(&if entity_view_distance <= soft_entity_vd_max { + format!("{entity_view_distance}") + } else { + format!("{entity_view_distance} ({soft_entity_vd_max})") + }) + .right_from(state.ids.entity_vd_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.entity_vd_value, ui); + + // Sprites VD + if let Some(new_val) = ImageSlider::discrete( + self.global_state.settings.graphics.sprite_render_distance, + 50, + 500, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .right_from(state.ids.entity_vd_slider, 70.0) + .track_breadth(12.0) + .slider_length(10.0) + .pad_track((5.0, 5.0)) + .set(state.ids.sprite_dist_slider, ui) + { + events.push(GraphicsChange::AdjustSpriteRenderDistance(new_val)); + } + Text::new( + &self + .localized_strings + .get_msg("hud-settings-sprites_view_distance"), + ) + .up_from(state.ids.sprite_dist_slider, 10.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.sprite_dist_text, ui); + + Text::new(&format!( + "{}", + self.global_state.settings.graphics.sprite_render_distance + )) + .right_from(state.ids.sprite_dist_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.sprite_dist_value, ui); // LoD Distance Text::new(&self.localized_strings.get_msg("hud-settings-lod_distance")) - .down_from(state.ids.vd_slider, 10.0) + .down_from(state.ids.terrain_vd_slider, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) @@ -350,6 +440,50 @@ impl<'a> Widget for Video<'a> { .color(TEXT_COLOR) .set(state.ids.ld_value, ui); + // Figure LOD distance + if let Some(new_val) = ImageSlider::discrete( + self.global_state + .settings + .graphics + .figure_lod_render_distance, + 50, + 500, + self.imgs.slider_indicator, + self.imgs.slider, + ) + .w_h(104.0, 22.0) + .right_from(state.ids.ld_slider, 70.0) + .track_breadth(12.0) + .slider_length(10.0) + .pad_track((5.0, 5.0)) + .set(state.ids.figure_dist_slider, ui) + { + events.push(GraphicsChange::AdjustFigureLoDRenderDistance(new_val)); + } + Text::new( + &self + .localized_strings + .get_msg("hud-settings-entities_detail_distance"), + ) + .up_from(state.ids.figure_dist_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.figure_dist_text, ui); + + Text::new(&format!( + "{}", + self.global_state + .settings + .graphics + .figure_lod_render_distance + )) + .right_from(state.ids.figure_dist_slider, 8.0) + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .color(TEXT_COLOR) + .set(state.ids.figure_dist_value, ui); + // Max FPS Text::new(&self.localized_strings.get_msg("hud-settings-maximum_fps")) .down_from(state.ids.ld_slider, 10.0) @@ -392,7 +526,7 @@ impl<'a> Widget for Video<'a> { .get_msg("hud-settings-background_fps"), ) .down_from(state.ids.ld_slider, 10.0) - .right_from(state.ids.max_fps_value, 30.0) + .right_from(state.ids.max_fps_value, 44.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) @@ -655,87 +789,6 @@ impl<'a> Widget for Video<'a> { .color(TEXT_COLOR) .set(state.ids.ambiance_value, ui); - // Sprites VD - if let Some(new_val) = ImageSlider::discrete( - self.global_state.settings.graphics.sprite_render_distance, - 50, - 500, - self.imgs.slider_indicator, - self.imgs.slider, - ) - .w_h(104.0, 22.0) - .right_from(state.ids.vd_slider, 50.0) - .track_breadth(12.0) - .slider_length(10.0) - .pad_track((5.0, 5.0)) - .set(state.ids.sprite_dist_slider, ui) - { - events.push(GraphicsChange::AdjustSpriteRenderDistance(new_val)); - } - Text::new( - &self - .localized_strings - .get_msg("hud-settings-sprites_view_distance"), - ) - .up_from(state.ids.sprite_dist_slider, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.sprite_dist_text, ui); - - Text::new(&format!( - "{}", - self.global_state.settings.graphics.sprite_render_distance - )) - .right_from(state.ids.sprite_dist_slider, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.sprite_dist_value, ui); - // Figure VD - if let Some(new_val) = ImageSlider::discrete( - self.global_state - .settings - .graphics - .figure_lod_render_distance, - 50, - 500, - self.imgs.slider_indicator, - self.imgs.slider, - ) - .w_h(104.0, 22.0) - .right_from(state.ids.sprite_dist_slider, 50.0) - .track_breadth(12.0) - .slider_length(10.0) - .pad_track((5.0, 5.0)) - .set(state.ids.figure_dist_slider, ui) - { - events.push(GraphicsChange::AdjustFigureLoDRenderDistance(new_val)); - } - Text::new( - &self - .localized_strings - .get_msg("hud-settings-figures_view_distance"), - ) - .up_from(state.ids.figure_dist_slider, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.figure_dist_text, ui); - - Text::new(&format!( - "{}", - self.global_state - .settings - .graphics - .figure_lod_render_distance - )) - .right_from(state.ids.figure_dist_slider, 8.0) - .font_size(self.fonts.cyri.scale(14)) - .font_id(self.fonts.cyri.conrod_id) - .color(TEXT_COLOR) - .set(state.ids.figure_dist_value, ui); - // AaMode Text::new( &self diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index 720e365ebe..a345ad17f0 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -137,10 +137,11 @@ impl PlayState for CharSelectionState { ui::Event::Play(character_id) => { { let mut c = self.client.borrow_mut(); - c.request_character(character_id); - //Send our ViewDistance and LoD distance - c.set_view_distance(global_state.settings.graphics.view_distance); - c.set_lod_distance(global_state.settings.graphics.lod_distance); + let graphics = &global_state.settings.graphics; + c.request_character(character_id, common::ViewDistances { + terrain: graphics.terrain_view_distance, + entity: graphics.entity_view_distance, + }); } return PlayStateResult::Switch(Box::new(SessionState::new( global_state, @@ -150,9 +151,11 @@ impl PlayState for CharSelectionState { ui::Event::Spectate => { { let mut c = self.client.borrow_mut(); - c.request_spectate(); - c.set_view_distance(global_state.settings.graphics.view_distance); - c.set_lod_distance(global_state.settings.graphics.lod_distance); + let graphics = &global_state.settings.graphics; + c.request_spectate(common::ViewDistances { + terrain: graphics.terrain_view_distance, + entity: graphics.entity_view_distance, + }); } return PlayStateResult::Switch(Box::new(SessionState::new( global_state, diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 4d1684dbc6..9d79d9c1c0 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -629,7 +629,7 @@ impl FigureMgr { let time = state.get_time() as f32; let tick = scene_data.tick; let ecs = state.ecs(); - let view_distance = scene_data.view_distance; + let view_distance = scene_data.entity_view_distance; let dt = state.get_delta_time(); let dt_lerp = (15.0 * dt).min(1.0); let frustum = camera.frustum(); diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index a059025a47..47a50d8e40 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -120,7 +120,8 @@ pub struct SceneData<'a> { pub mutable_viewpoint: bool, pub target_entity: Option, pub loaded_distance: f32, - pub view_distance: u32, + pub terrain_view_distance: u32, // not used currently + pub entity_view_distance: u32, pub tick: u64, pub gamma: f32, pub exposure: f32, diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 4cae6af2b1..237c89da82 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -1697,7 +1697,11 @@ impl PlayState for SessionState { // Only highlight if interactable target_entity: self.interactable.and_then(Interactable::entity), loaded_distance: client.loaded_distance(), - view_distance: client.view_distance().unwrap_or(1), + terrain_view_distance: client.view_distance().unwrap_or(1), + entity_view_distance: client + .view_distance() + .unwrap_or(1) + .min(global_state.settings.graphics.entity_view_distance), tick: client.get_tick(), gamma: global_state.settings.graphics.gamma, exposure: global_state.settings.graphics.exposure, @@ -1783,7 +1787,11 @@ impl PlayState for SessionState { // Only highlight if interactable target_entity: self.interactable.and_then(Interactable::entity), loaded_distance: client.loaded_distance(), - view_distance: client.view_distance().unwrap_or(1), + terrain_view_distance: client.view_distance().unwrap_or(1), + entity_view_distance: client + .view_distance() + .unwrap_or(1) + .min(settings.graphics.entity_view_distance), tick: client.get_tick(), gamma: settings.graphics.gamma, exposure: settings.graphics.exposure, diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index f53d4738c9..4c82431be8 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -70,7 +70,8 @@ pub enum Gameplay { } #[derive(Clone)] pub enum Graphics { - AdjustViewDistance(u32), + AdjustTerrainViewDistance(u32), + AdjustEntityViewDistance(u32), AdjustLodDistance(u32), AdjustLodDetail(u32), AdjustSpriteRenderDistance(u32), @@ -147,7 +148,8 @@ pub enum Language { } #[derive(Clone)] pub enum Networking { - AdjustViewDistance(u32), + AdjustTerrainViewDistance(u32), + AdjustEntityViewDistance(u32), ChangePlayerPhysicsBehavior { server_authoritative: bool, }, @@ -155,6 +157,8 @@ pub enum Networking { #[cfg(feature = "discord")] ToggleDiscordIntegration(bool), + // TODO: reset option (ensure it handles the entity/terrain vd the same as graphics reset + // option) } #[derive(Clone)] @@ -354,8 +358,11 @@ impl SettingsChange { }, SettingsChange::Graphics(graphics_change) => { match graphics_change { - Graphics::AdjustViewDistance(view_distance) => { - adjust_view_distance(view_distance, global_state, session_state) + Graphics::AdjustTerrainViewDistance(terrain_vd) => { + adjust_terrain_view_distance(terrain_vd, settings, session_state) + }, + Graphics::AdjustEntityViewDistance(entity_vd) => { + adjust_entity_view_distance(entity_vd, settings, session_state) }, Graphics::AdjustLodDistance(lod_distance) => { session_state @@ -428,10 +435,7 @@ impl SettingsChange { settings.graphics = GraphicsSettings::default(); let graphics = &settings.graphics; // View distance - session_state - .client - .borrow_mut() - .set_view_distance(graphics.view_distance); + client_set_view_distance(settings, session_state); // FOV session_state.scene.camera_mut().set_fov_deg(graphics.fov); session_state @@ -599,8 +603,11 @@ impl SettingsChange { }, }, SettingsChange::Networking(networking_change) => match networking_change { - Networking::AdjustViewDistance(view_distance) => { - adjust_view_distance(view_distance, global_state, session_state) + Networking::AdjustTerrainViewDistance(terrain_vd) => { + adjust_terrain_view_distance(terrain_vd, settings, session_state) + }, + Networking::AdjustEntityViewDistance(entity_vd) => { + adjust_entity_view_distance(entity_vd, settings, session_state) }, Networking::ChangePlayerPhysicsBehavior { server_authoritative, @@ -651,15 +658,33 @@ impl SettingsChange { } } -fn adjust_view_distance( - view_distance: u32, - global_state: &mut GlobalState, +use crate::settings::Settings; + +fn adjust_terrain_view_distance( + terrain_vd: u32, + settings: &mut Settings, session_state: &mut SessionState, ) { + settings.graphics.terrain_view_distance = terrain_vd; + client_set_view_distance(settings, session_state); +} + +fn adjust_entity_view_distance( + entity_vd: u32, + settings: &mut Settings, + session_state: &mut SessionState, +) { + settings.graphics.entity_view_distance = entity_vd; + client_set_view_distance(settings, session_state); +} + +fn client_set_view_distance(settings: &Settings, session_state: &mut SessionState) { + let view_distances = common::ViewDistances { + terrain: settings.graphics.terrain_view_distance, + entity: settings.graphics.entity_view_distance, + }; session_state .client .borrow_mut() - .set_view_distance(view_distance); - - global_state.settings.graphics.view_distance = view_distance; + .set_view_distances(view_distances); } diff --git a/voxygen/src/settings/graphics.rs b/voxygen/src/settings/graphics.rs index b2a1b4858c..5feabd793f 100644 --- a/voxygen/src/settings/graphics.rs +++ b/voxygen/src/settings/graphics.rs @@ -29,7 +29,8 @@ impl fmt::Display for Fps { #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default)] pub struct GraphicsSettings { - pub view_distance: u32, + pub terrain_view_distance: u32, + pub entity_view_distance: u32, pub lod_distance: u32, pub sprite_render_distance: u32, pub particles_enabled: bool, @@ -50,7 +51,8 @@ pub struct GraphicsSettings { impl Default for GraphicsSettings { fn default() -> Self { Self { - view_distance: 10, + terrain_view_distance: 10, + entity_view_distance: 65, lod_distance: 200, sprite_render_distance: 100, particles_enabled: true, From 37caab539c86cf352a7b88f3a24dba1f98aaa484 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sun, 21 Aug 2022 23:50:46 -0400 Subject: [PATCH 133/854] Replace uses of "65" with `client::MAX_SELECTABLE_VD` in client and voxygen crates. --- client/src/lib.rs | 4 +++- voxygen/src/hud/settings_window/networking.rs | 4 ++-- voxygen/src/hud/settings_window/video.rs | 4 ++-- voxygen/src/settings/graphics.rs | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 24b41c8664..a1497901bf 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -81,6 +81,8 @@ use tokio::runtime::Runtime; use tracing::{debug, error, trace, warn}; use vek::*; +pub const MAX_SELECTABLE_VIEW_DISTANCE: u32 = 65; + const PING_ROLLING_AVERAGE_SECS: usize = 10; #[derive(Debug)] @@ -948,7 +950,7 @@ impl Client { pub fn set_view_distances(&mut self, view_distances: common::ViewDistances) { if self.server_view_distance_limit.map_or(true, |limit| view_distances.terrain >= limit) { let view_distances = common::ViewDistances { - terrain: view_distances.terrain.max(1).min(65), + terrain: view_distances.terrain.max(1).min(MAX_SELECTABLE_VIEW_DISTANCE), entity: view_distances.entity, }; self.view_distance = Some(view_distances.terrain); diff --git a/voxygen/src/hud/settings_window/networking.rs b/voxygen/src/hud/settings_window/networking.rs index 3c624ef3a2..b892bbf122 100644 --- a/voxygen/src/hud/settings_window/networking.rs +++ b/voxygen/src/hud/settings_window/networking.rs @@ -107,7 +107,7 @@ impl<'a> Widget for Networking<'a> { if let Some(new_val) = ImageSlider::discrete( terrain_view_distance, 1, - 65, + client::MAX_SELECTABLE_VIEW_DISTANCE, self.imgs.slider_indicator, self.imgs.slider, ) @@ -153,7 +153,7 @@ impl<'a> Widget for Networking<'a> { if let Some(new_val) = ImageSlider::discrete( entity_view_distance, 1, - 65, + client::MAX_SELECTABLE_VIEW_DISTANCE, self.imgs.slider_indicator, self.imgs.slider, ) diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 7214d74707..c10bd8f620 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -295,7 +295,7 @@ impl<'a> Widget for Video<'a> { if let Some(new_val) = ImageSlider::discrete( terrain_view_distance, 1, - 65, + client::MAX_SELECTABLE_VIEW_DISTANCE, self.imgs.slider_indicator, self.imgs.slider, ) @@ -330,7 +330,7 @@ impl<'a> Widget for Video<'a> { if let Some(new_val) = ImageSlider::discrete( entity_view_distance, 1, - 65, + client::MAX_SELECTABLE_VIEW_DISTANCE, self.imgs.slider_indicator, self.imgs.slider, ) diff --git a/voxygen/src/settings/graphics.rs b/voxygen/src/settings/graphics.rs index 5feabd793f..303bf77f49 100644 --- a/voxygen/src/settings/graphics.rs +++ b/voxygen/src/settings/graphics.rs @@ -52,7 +52,7 @@ impl Default for GraphicsSettings { fn default() -> Self { Self { terrain_view_distance: 10, - entity_view_distance: 65, + entity_view_distance: client::MAX_SELECTABLE_VIEW_DISTANCE, lod_distance: 200, sprite_render_distance: 100, particles_enabled: true, From cc1de8334d331e5c5aebf9068f191abc146786ac Mon Sep 17 00:00:00 2001 From: Imbris Date: Mon, 22 Aug 2022 00:42:34 -0400 Subject: [PATCH 134/854] Clean up common/src/lib.rs to avoid repetitive wasm cfgs. Not many lines actually removed but it looks a lot better IMO. --- common/src/lib.rs | 145 +++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/common/src/lib.rs b/common/src/lib.rs index 8b8e35b224..6cf1b69302 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -18,85 +18,82 @@ )] #![feature(hash_drain_filter)] -/// Re-exported crates -#[cfg(not(target_arch = "wasm32"))] -pub use uuid; +macro_rules! cfg_not_wasm { + ($($item:item)*) => { + $( + #[cfg(not(target_arch = "wasm32"))] + $item + )* + } +} + +// Re-exported crates +cfg_not_wasm! { + pub use common_assets as assets; + pub use uuid; +} + +// Modules -// modules -#[cfg(not(target_arch = "wasm32"))] -pub use common_assets as assets; -#[cfg(not(target_arch = "wasm32"))] pub mod astar; -#[cfg(not(target_arch = "wasm32"))] -mod cached_spatial_grid; -#[cfg(not(target_arch = "wasm32"))] -pub mod calendar; -#[cfg(not(target_arch = "wasm32"))] -pub mod character; -#[cfg(not(target_arch = "wasm32"))] pub mod clock; -#[cfg(not(target_arch = "wasm32"))] pub mod cmd; pub mod combat; pub mod comp; pub mod consts; -#[cfg(not(target_arch = "wasm32"))] pub mod depot; -#[cfg(not(target_arch = "wasm32"))] -pub mod effect; -#[cfg(not(target_arch = "wasm32"))] pub mod event; -#[cfg(not(target_arch = "wasm32"))] -pub mod explosion; -#[cfg(not(target_arch = "wasm32"))] -pub mod figure; -#[cfg(not(target_arch = "wasm32"))] -pub mod generation; -#[cfg(not(target_arch = "wasm32"))] pub mod grid; -#[cfg(not(target_arch = "wasm32"))] pub mod link; -#[cfg(not(target_arch = "wasm32"))] pub mod lod; -#[cfg(not(target_arch = "wasm32"))] -pub mod lottery; -#[cfg(not(target_arch = "wasm32"))] -pub mod mounting; -#[cfg(not(target_arch = "wasm32"))] pub mod npc; -#[cfg(not(target_arch = "wasm32"))] -pub mod outcome; -#[cfg(not(target_arch = "wasm32"))] pub mod path; -#[cfg(not(target_arch = "wasm32"))] pub mod ray; -#[cfg(not(target_arch = "wasm32"))] -pub mod recipe; -#[cfg(not(target_arch = "wasm32"))] -pub mod region; pub mod resources; -#[cfg(not(target_arch = "wasm32"))] pub mod rtsim; -#[cfg(not(target_arch = "wasm32"))] -pub mod skillset_builder; -#[cfg(not(target_arch = "wasm32"))] -pub mod slowjob; -#[cfg(not(target_arch = "wasm32"))] -pub mod spiral; -#[cfg(not(target_arch = "wasm32"))] -pub mod states; -#[cfg(not(target_arch = "wasm32"))] pub mod store; -#[cfg(not(target_arch = "wasm32"))] -pub mod terrain; -#[cfg(not(target_arch = "wasm32"))] pub mod time; -#[cfg(not(target_arch = "wasm32"))] pub mod trade; -#[cfg(not(target_arch = "wasm32"))] pub mod typed; pub mod uid; -#[cfg(not(target_arch = "wasm32"))] pub mod util; -mod view_distances; -#[cfg(not(target_arch = "wasm32"))] pub mod vol; -#[cfg(not(target_arch = "wasm32"))] -pub mod volumes; -#[cfg(not(target_arch = "wasm32"))] -pub mod weather; -#[cfg(not(target_arch = "wasm32"))] -pub use cached_spatial_grid::CachedSpatialGrid; -#[cfg(not(target_arch = "wasm32"))] -pub use combat::{Damage, GroupTarget, Knockback, KnockbackDir}; +// NOTE: Comment out macro to get rustfmt to re-order these as needed. +cfg_not_wasm! { + pub mod astar; + pub mod calendar; + pub mod character; + pub mod clock; + pub mod cmd; + pub mod depot; + pub mod effect; + pub mod event; + pub mod explosion; + pub mod figure; + pub mod generation; + pub mod grid; + pub mod link; + pub mod lod; + pub mod lottery; + pub mod mounting; + pub mod npc; + pub mod outcome; + pub mod path; + pub mod ray; + pub mod recipe; + pub mod region; + pub mod rtsim; + pub mod skillset_builder; + pub mod slowjob; + pub mod spiral; + pub mod states; + pub mod store; + pub mod terrain; + pub mod time; + pub mod trade; + pub mod util; + pub mod vol; + pub mod volumes; + pub mod weather; + + mod cached_spatial_grid; + mod view_distances; +} + +// We declare a macro in this module so there are issues referring to it by path +// within this crate if typed module is declared in macro expansion. +#[cfg(not(target_arch = "wasm32"))] pub mod typed; + pub use combat::{DamageKind, DamageSource}; -#[cfg(not(target_arch = "wasm32"))] -pub use comp::inventory::loadout_builder::LoadoutBuilder; -#[cfg(not(target_arch = "wasm32"))] -pub use explosion::{Explosion, RadiusEffect}; -#[cfg(not(target_arch = "wasm32"))] -pub use skillset_builder::SkillSetBuilder; -pub use view_distances::ViewDistances; + +cfg_not_wasm! { + pub use cached_spatial_grid::CachedSpatialGrid; + pub use combat::{Damage, GroupTarget, Knockback, KnockbackDir}; + pub use comp::inventory::loadout_builder::LoadoutBuilder; + pub use explosion::{Explosion, RadiusEffect}; + pub use skillset_builder::SkillSetBuilder; + pub use view_distances::ViewDistances; +} From e626519ec0f1bd1ac89bb240c926af2025b23a8d Mon Sep 17 00:00:00 2001 From: Imbris Date: Mon, 22 Aug 2022 23:20:32 -0400 Subject: [PATCH 135/854] Replace "Present Mode" options with more user friendly terms: 'Fifo' -> 'Vsync capped' 'Mailbox' -> 'Vsync uncapped' 'Immediate' -> 'Vsync off' --- assets/voxygen/i18n/en/hud/settings.ftl | 6 +++--- voxygen/src/hud/settings_window/video.rs | 19 +++++++------------ 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/assets/voxygen/i18n/en/hud/settings.ftl b/assets/voxygen/i18n/en/hud/settings.ftl index e9c78472c5..cb895bebe5 100644 --- a/assets/voxygen/i18n/en/hud/settings.ftl +++ b/assets/voxygen/i18n/en/hud/settings.ftl @@ -61,9 +61,9 @@ hud-settings-entities_detail_distance = Entities Detail Distance hud-settings-maximum_fps = Maximum FPS hud-settings-background_fps = Background FPS hud-settings-present_mode = Present Mode -hud-settings-present_mode-fifo = Fifo -hud-settings-present_mode-mailbox = Mailbox -hud-settings-present_mode-immediate = Immediate +hud-settings-present_mode-vsync_capped = Vsync capped +hud-settings-present_mode-vsync_uncapped = Vsync uncapped +hud-settings-present_mode-vsync_off = Vsync off hud-settings-fov = Field of View (deg) hud-settings-gamma = Gamma hud-settings-exposure = Exposure diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index c10bd8f620..6b445957a5 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -574,7 +574,7 @@ impl<'a> Widget for Video<'a> { // Present Mode Text::new(&self.localized_strings.get_msg("hud-settings-present_mode")) .down_from(state.ids.ld_slider, 10.0) - .right_from(state.ids.max_background_fps_value, 30.0) + .right_from(state.ids.max_background_fps_value, 40.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) @@ -586,16 +586,11 @@ impl<'a> Widget for Video<'a> { PresentMode::Immediate, ]; let mode_label_list = [ - &self - .localized_strings - .get_msg("hud-settings-present_mode-fifo"), - &self - .localized_strings - .get_msg("hud-settings-present_mode-mailbox"), - &self - .localized_strings - .get_msg("hud-settings-present_mode-immediate"), - ]; + "hud-settings-present_mode-vsync_capped", + "hud-settings-present_mode-vsync_uncapped", + "hud-settings-present_mode-vsync_off", + ] + .map(|k| self.localized_strings.get_msg(k)); // Get which present mode is currently active let selected = mode_list @@ -603,7 +598,7 @@ impl<'a> Widget for Video<'a> { .position(|x| *x == render_mode.present_mode); if let Some(clicked) = DropDownList::new(&mode_label_list, selected) - .w_h(120.0, 22.0) + .w_h(150.0, 26.0) .color(MENU_BG) .label_color(TEXT_COLOR) .label_font_id(self.fonts.cyri.conrod_id) From 4126194a5c7ef7241f73292fb0ce19cf268e5c9f Mon Sep 17 00:00:00 2001 From: Imbris Date: Tue, 23 Aug 2022 00:46:52 -0400 Subject: [PATCH 136/854] View distances small fixes and improvement: * Properly set view_distance field in Client when sending it to the server in request_character/request_spectator. * Removed invalid check I had included in Client::set_view_distance * ViewDistances::clamp now clamps min to 1 for both types of view distance. --- client/src/lib.rs | 36 +++++++++++++++++++++++++++--------- common/src/view_distances.rs | 6 ++++-- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index a1497901bf..1138e9ab4f 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -884,7 +884,12 @@ impl Client { } /// Request a state transition to `ClientState::Character`. - pub fn request_character(&mut self, character_id: CharacterId, view_distances: common::ViewDistances) { + pub fn request_character( + &mut self, + character_id: CharacterId, + view_distances: common::ViewDistances, + ) { + let view_distances = self.set_view_distances_local(view_distances); self.send_msg(ClientGeneral::Character(character_id, view_distances)); // Assume we are in_game unless server tells us otherwise @@ -893,6 +898,7 @@ impl Client { /// Request a state transition to `ClientState::Spectate`. pub fn request_spectate(&mut self, view_distances: common::ViewDistances) { + let view_distances = self.set_view_distances_local(view_distances); self.send_msg(ClientGeneral::Spectate(view_distances)); self.presence = Some(PresenceKind::Spectator); @@ -948,14 +954,26 @@ impl Client { } pub fn set_view_distances(&mut self, view_distances: common::ViewDistances) { - if self.server_view_distance_limit.map_or(true, |limit| view_distances.terrain >= limit) { - let view_distances = common::ViewDistances { - terrain: view_distances.terrain.max(1).min(MAX_SELECTABLE_VIEW_DISTANCE), - entity: view_distances.entity, - }; - self.view_distance = Some(view_distances.terrain); - self.send_msg(ClientGeneral::SetViewDistance(view_distances)); - } + let view_distances = self.set_view_distances_local(view_distances); + self.send_msg(ClientGeneral::SetViewDistance(view_distances)); + } + + /// Clamps provided view distances, locally sets the terrain view distance + /// in the client's properties and returns the clamped values for the + /// caller to send to the server. + fn set_view_distances_local( + &mut self, + view_distances: common::ViewDistances, + ) -> common::ViewDistances { + let view_distances = common::ViewDistances { + terrain: view_distances + .terrain + .max(1) + .min(MAX_SELECTABLE_VIEW_DISTANCE), + entity: view_distances.entity.max(1), + }; + self.view_distance = Some(view_distances.terrain); + view_distances } pub fn set_lod_distance(&mut self, lod_distance: u32) { diff --git a/common/src/view_distances.rs b/common/src/view_distances.rs index 94416e5886..484ab496c0 100644 --- a/common/src/view_distances.rs +++ b/common/src/view_distances.rs @@ -13,11 +13,13 @@ pub struct ViewDistances { impl ViewDistances { /// Clamps the terrain view distance to an optional max and clamps the /// entity view distance to the resulting terrain view distance. + /// + /// Also ensures both are at a minimum of 1 (unless the provided max is 0). pub fn clamp(self, max: Option) -> Self { - let terrain = max.unwrap_or(u32::MAX).min(self.terrain); + let terrain = self.terrain.max(1).min(max.unwrap_or(u32::MAX)); Self { terrain, - entity: self.entity.min(terrain), + entity: self.entity.max(1).min(terrain), } } } From 7d88baef42e9c7c12721af73418f9c4ff3488ba7 Mon Sep 17 00:00:00 2001 From: Imbris Date: Tue, 23 Aug 2022 01:07:56 -0400 Subject: [PATCH 137/854] Move up changelog entries that were added after the latest release --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab55163cb4..6491d9ad4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Setting for disabling flashing lights +- Spectate mode for moderators. - Currently playing music track and artist now shows in the debug menu. - Added a setting to influence the gap between music track plays. - Added a Craft All button. @@ -25,6 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed +- Fixed npc not handling interactions while fighting (especially merchants in trade) +- Fixed bug where you would still be burning after dying in lava. +- Workaround for rayon bug that caused lag spikes in slowjobs - Fixed crash due to zooming out very far - Client properly knows trade was cancelled when exiting to the character screen (and no longer tries to display the trade window when rejoining) @@ -68,8 +73,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - More varied ambient birdcalls - Cave biomes - Updated the Polish translation -- Setting for disabling flashing lights -- Spectate mode for moderators. ### Changed @@ -113,9 +116,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Combat music now loops and ends properly - Modular weapons now have a selling price - Closing a subwindow now only regrabs the cursor if no other subwindow requires it. -- Fixed npc not handling interactions while fighting (especially merchants in trade) -- Fixed bug where you would still be burning after dying in lava. -- Workaround for rayon bug that caused lag spikes in slowjobs ## [0.12.0] - 2022-02-19 From d3c90f9078ca63c821e1b0d4c6e6fd6fbb0706c0 Mon Sep 17 00:00:00 2001 From: Imbris Date: Tue, 23 Aug 2022 01:22:15 -0400 Subject: [PATCH 138/854] Update changelog, update client/src/bin/* with changes in Client API --- CHANGELOG.md | 15 ++++++++++++++- client/src/bin/bot/main.rs | 5 ++++- client/src/bin/swarm/main.rs | 5 ++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6491d9ad4c..bad552cbf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a setting to influence the gap between music track plays. - Added a Craft All button. - Server: Vacuum database on startup -- SeaChapel, greek/latin inspired dungeon for ocean biome coasts +- SeaChapel, greek/latin inspired dungeon for ocean biome coasts +- Entity view distance setting added (shown in graphics and network tabs). This setting controls + the distance at which entities are synced to the client and which entities are displayed in. + This is clamped to be no more than the current overall view distance setting. +- View distance settings that are lowered by the server limit (or other factors) now display an + extra ghost slider cursor when set above the limit (instead of snapping back to the limit). + Limits on the view distance by the server no longer affect the settings saved on the client. ### Changed - Use fluent for translations @@ -23,6 +29,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - /kill_npcs no longer leaves drops behind and also has bug causing it to not destroy entities fixed. - Default present mode changed to Fifo (aka 'Vsync capped'). +- Old "Entity View Distance" setting renamed to "Entity Detail Distance" (since this controls the + distance at which lower detail models are used for entities). +- Present mode options renamed for clarity: Fifo -> 'Vsync capped', Mailbox -> 'Vsync uncapped', + Immediate -> 'Vsync off'. ### Removed @@ -35,6 +45,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 tries to display the trade window when rejoining) - Cancel trades for an entity when it is deleted (note this doesn't effect trades between players since their entities are not removed). +- Fixed bug where the view distance selection was not immediately applied to entity syncing when + first joining a server and when changing the view distance (previously this required moving to a + new chunk for the initial setting or subsequent change to apply). ## [0.13.0] - 2022-07-23 diff --git a/client/src/bin/bot/main.rs b/client/src/bin/bot/main.rs index d4529199f2..ce4bacff73 100644 --- a/client/src/bin/bot/main.rs +++ b/client/src/bin/bot/main.rs @@ -221,7 +221,10 @@ impl BotClient { let c = list.characters.get(0).unwrap(); if let Some(id) = c.character.id { - client.request_character(id); + client.request_character(id, common::ViewDistances { + terrain: 5, + entity: 5, + }); } } info!("ingame done"); diff --git a/client/src/bin/swarm/main.rs b/client/src/bin/swarm/main.rs index c776f8186f..90e345f6ad 100644 --- a/client/src/bin/swarm/main.rs +++ b/client/src/bin/swarm/main.rs @@ -111,7 +111,6 @@ fn run_client( let mut client = runtime .block_on(Client::new(addr, runtime_clone, &mut None)) .expect("Failed to connect to the server"); - client.set_view_distance(opt.vd); // Login // NOTE: use a no-auth server @@ -159,6 +158,10 @@ fn run_client( .character .id .expect("Why is this an option?"), + common::ViewDistances { + terrain: opt.vd, + entity: opt.vd, + }, ); // If this is the admin client then adminify the other swarm members From 76cd36b179f55c15b81ea471a00dce67a80977e4 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Fri, 26 Aug 2022 17:56:32 +0300 Subject: [PATCH 139/854] Remake price-tips internationalization --- assets/voxygen/i18n/en/hud/trade.ftl | 13 ++++++++---- voxygen/src/hud/util.rs | 30 +++++++++++++--------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/assets/voxygen/i18n/en/hud/trade.ftl b/assets/voxygen/i18n/en/hud/trade.ftl index 396ac9d73a..f17762a3d7 100644 --- a/assets/voxygen/i18n/en/hud/trade.ftl +++ b/assets/voxygen/i18n/en/hud/trade.ftl @@ -16,11 +16,16 @@ hud-trade-invite_sent = Trade request sent to { $playername }. hud-trade-result-completed = Trade completed successfully. hud-trade-result-declined = Trade declined. hud-trade-result-nospace = Not enough space to complete the trade. -hud-trade-buy_price = Buy Price -hud-trade-sell_price = Sell Price -hud-trade-coin = coin(s) +hud-trade-buy = Buy Price: { $coin_num -> + [one] one coin + *[other] { $coin_formatted } coins +} +hud-trade-sell = Sell Price: { $coin_num -> + [one] one coin. + *[other] { $coin_formatted } coins +} hud-trade-tooltip_hint_1 = hud-trade-tooltip_hint_2 = hud-trade-your_offer = Your offer hud-trade-their_offer = Their offer -hud-trade-amount_input = Select an item \ No newline at end of file +hud-trade-amount_input = Select an item diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index c1dd3ebd99..770ca5bef9 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -13,14 +13,14 @@ use common::{ trade::{Good, SitePrices}, }; use conrod_core::image; -use i18n::Localization; +use i18n::{fluent_args, Localization}; use std::{borrow::Cow, fmt::Write}; -pub fn price_desc( +pub fn price_desc<'a>( prices: &Option, item_definition_id: ItemDefinitionId<'_>, - i18n: &Localization, -) -> Option<(String, String, f32)> { + i18n: &'a Localization, +) -> Option<(Cow<'a, str>, Cow<'a, str>, f32)> { if let Some(prices) = prices { if let Some(materials) = TradePricing::get_materials(&item_definition_id) { let coinprice = prices.values.get(&Good::Coin).cloned().unwrap_or(1.0); @@ -42,18 +42,16 @@ pub fn price_desc( / prices.values.get(&Good::Coin).cloned().unwrap_or(1.0) / (materials.len() as f32); let deal_goodness = deal_goodness.log(2.0); - let buy_string = format!( - "{} : {:0.1} {}", - i18n.get_msg("hud-trade-buy_price"), - buyprice / coinprice, - i18n.get_msg("hud-trade-coin"), - ); - let sell_string = format!( - "{} : {:0.1} {}", - i18n.get_msg("hud-trade-sell_price"), - sellprice / coinprice, - i18n.get_msg("hud-trade-coin"), - ); + + let buy_string = i18n.get_msg_ctx("hud-trade-buy", &fluent_args! { + "coin_num" => buyprice / coinprice, + "coin_formatted" => format!("{:0.1}", buyprice / coinprice), + }); + let sell_string = i18n.get_msg_ctx("hud-trade-sell", &fluent_args! { + "coin_num" => sellprice / coinprice, + "coin_formatted" => format!("{:0.1}", sellprice / coinprice), + }); + let deal_goodness = match deal_goodness { x if x < -2.5 => 0.0, x if x < -1.05 => 0.25, From 87bac7c24aee5f48e249f9e2d4cf6619e2e2f4ec Mon Sep 17 00:00:00 2001 From: flo666 Date: Fri, 26 Aug 2022 17:40:46 +0200 Subject: [PATCH 140/854] - remove barriers in chapel tube & tower tube - change pitfall entry --- world/src/site2/plot/sea_chapel.rs | 57 +++++++++++------------------- 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/world/src/site2/plot/sea_chapel.rs b/world/src/site2/plot/sea_chapel.rs index 93a324328a..623be45f6f 100644 --- a/world/src/site2/plot/sea_chapel.rs +++ b/world/src/site2/plot/sea_chapel.rs @@ -1114,7 +1114,7 @@ impl Structure for SeaChapel { max: (center + (diameter / 6) - 1).with_z(base - (diameter / 8) + diameter + 1), }) .clear(); - // chapel tube1 glass barrier / gold door + // chapel tube1 gold window painter .aabb(Aabb { min: Vec3::new( @@ -1626,13 +1626,6 @@ impl Structure for SeaChapel { .with_z(base - (diameter / 8) + diameter - (diameter / 8)), }) .fill(white.clone()); - //chapel floor2 glass barriers in tube - painter - .cylinder(Aabb { - min: (center - 4).with_z(base - (diameter / 8) + diameter - (diameter / 8)), - max: (center + 4).with_z(base - (diameter / 8) + diameter - (diameter / 8) + 2), - }) - .fill(glass_barrier.clone()); //chapel floor2 drawer and potion painter.sprite( (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8)), @@ -2633,6 +2626,20 @@ impl Structure for SeaChapel { max: Vec3::new( center_s2.x + 4, center_s2.y + 4, + base - (diameter / 8) + diameter + 1, + ), + }) + .clear(); + painter + .cylinder(Aabb { + min: Vec3::new( + center_s2.x - 3, + center_s2.y - 3, + base - (diameter / 8) + diameter + 1, + ), + max: Vec3::new( + center_s2.x + 3, + center_s2.y + 3, base - (diameter / 8) + diameter + 2, ), }) @@ -2652,7 +2659,7 @@ impl Structure for SeaChapel { ), }) .fill(window_ver2.clone()); - // coral chest + // chest painter.rotated_sprite( Vec3::new( center_s2.x - 5, @@ -3368,11 +3375,11 @@ impl Structure for SeaChapel { ), }) .fill(glass_barrier.clone()); - // Holding Cell Villagers - let hc_villagers_pos = Vec3::new(center.x, center.y + (diameter / 3), base + 3); - for _ in 0..(5 + ((RandomField::new(0).get((hc_villagers_pos).with_z(base))) % 5)) { + // Holding Cell Prisoners + let prisoners_pos = Vec3::new(center.x, center.y + (diameter / 3), base + 3); + for _ in 0..(5 + ((RandomField::new(0).get((prisoners_pos).with_z(base))) % 5)) { painter.spawn( - EntityInfo::at(hc_villagers_pos.as_()) + EntityInfo::at(prisoners_pos.as_()) .with_asset_expect("common.entity.village.villager", &mut rng), ); } @@ -4447,12 +4454,6 @@ impl Structure for SeaChapel { .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2); let bldg_floor_potion_pos = (bldg_center - (bldg_diameter / 8)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 3); - let bldg_floor_glass_barriers = Aabb { - min: (bldg_center - 4) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2), - max: (bldg_center + 4) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 3), - }; let bldg_floor2_wall = Aabb { min: (bldg_center - 4).with_z( base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, @@ -4509,9 +4510,6 @@ impl Structure for SeaChapel { + (bldg_diameter / 7) - 6, ); - let bldg_floor2_sea_cleric_pos = (bldg_center + 5).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 2, - ); // bldg cellar Sea Crocodiles let bldg_cellar_sea_croc_pos = Vec3::new( bldg_center.x - (bldg_diameter / 8), @@ -4632,9 +4630,6 @@ impl Structure for SeaChapel { painter.aabb(bldg_room3_entry_clear2).clear(); painter.aabb(bldg_room3_entry_clear3).clear(); painter.aabb(bldg_room3_entry_clear4).clear(); - painter - .cylinder(bldg_floor_glass_barriers) - .fill(glass_barrier.clone()); painter.cylinder(bldg_floor2_wall).fill(white.clone()); painter .aabb(bldg_floor2_glass_barriers) @@ -4696,18 +4691,6 @@ impl Structure for SeaChapel { ), ) } - // bldg floor2 Sea Clerics - for _ in 0..(1 - + ((RandomField::new(0).get((bldg_floor2_sea_cleric_pos).with_z(base))) - % 2)) - { - painter.spawn( - EntityInfo::at(bldg_floor2_sea_cleric_pos.as_()).with_asset_expect( - "common.entity.dungeon.sea_chapel.sea_cleric", - &mut rng, - ), - ) - } }, _ => {}, }; From 1876d169c8e95138467459c6edb410bc0a01b9d8 Mon Sep 17 00:00:00 2001 From: flo666 Date: Sat, 27 Aug 2022 08:06:33 +0200 Subject: [PATCH 141/854] - Dagon, SeaCrocodile hitboxes --- common/src/comp/body.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 1b84fa7122..8cf7018d74 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -467,8 +467,10 @@ impl Body { Body::QuadrupedLow(body) => match body.species { quadruped_low::Species::Asp => Vec3::new(2.0, 3.0, 1.7), quadruped_low::Species::Crocodile => Vec3::new(1.0, 2.8, 1.3), + quadruped_low::Species::SeaCrocodile => Vec3::new(1.2, 4.5, 1.3), quadruped_low::Species::Deadwood => Vec3::new(1.3, 1.3, 1.4), quadruped_low::Species::Hakulaq => Vec3::new(1.8, 3.0, 2.0), + quadruped_low::Species::Dagon => Vec3::new(3.0, 6.0, 2.0), quadruped_low::Species::Icedrake => Vec3::new(2.0, 5.5, 2.5), quadruped_low::Species::Lavadrake => Vec3::new(2.0, 4.7, 2.5), quadruped_low::Species::Maneater => Vec3::new(2.5, 3.7, 4.0), From eae1c5ff6902c789f9c4b466725075bdb09d3b11 Mon Sep 17 00:00:00 2001 From: flo666 Date: Sat, 27 Aug 2022 08:11:35 +0200 Subject: [PATCH 142/854] set difficulty indicator to 4 --- voxygen/src/hud/map.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/hud/map.rs b/voxygen/src/hud/map.rs index b1fbf4c11c..0e10bd0359 100644 --- a/voxygen/src/hud/map.rs +++ b/voxygen/src/hud/map.rs @@ -906,7 +906,7 @@ impl<'a> Widget for Map<'a> { SiteKind::Cave => (None, i18n.get_msg("hud-map-cave")), SiteKind::Tree => (None, i18n.get_msg("hud-map-tree")), SiteKind::Gnarling => (Some(0), i18n.get_msg("hud-map-gnarling")), - SiteKind::ChapelSite => (Some(2), i18n.get_msg("hud-map-chapel_site")), + SiteKind::ChapelSite => (Some(3), i18n.get_msg("hud-map-chapel_site")), }; let desc = desc.into_owned() + &get_site_economy(site_rich); let site_btn = Button::image(match &site.kind { From 93399710329d1f2ee15264bb4104ee993801d7b8 Mon Sep 17 00:00:00 2001 From: flo Date: Sun, 28 Aug 2022 18:48:18 +0000 Subject: [PATCH 143/854] Music Instruments --- .../common/abilities/ability_set_manifest.ron | 40 +++ assets/common/abilities/music/bass.ron | 6 + assets/common/abilities/music/flute.ron | 6 + assets/common/abilities/music/harp.ron | 6 + assets/common/abilities/music/kalimba.ron | 6 + assets/common/abilities/music/lute.ron | 6 + assets/common/abilities/music/melodica.ron | 6 + assets/common/abilities/music/perc.ron | 6 + assets/common/abilities/music/sitar.ron | 6 + assets/common/items/tool/instruments/bass.ron | 21 ++ .../common/items/tool/instruments/flute.ron | 21 ++ assets/common/items/tool/instruments/harp.ron | 21 ++ .../common/items/tool/instruments/kalimba.ron | 21 ++ assets/common/items/tool/instruments/lute.ron | 21 ++ .../items/tool/instruments/melodica.ron | 21 ++ assets/common/items/tool/instruments/perc.ron | 21 ++ .../common/items/tool/instruments/sitar.ron | 21 ++ assets/voxygen/audio/sfx.ron | 113 ++++++++ .../audio/sfx/instrument/bass/bass_a.ogg | 3 + .../audio/sfx/instrument/bass/bass_c.ogg | 3 + .../audio/sfx/instrument/bass/bass_c1.ogg | 3 + .../audio/sfx/instrument/bass/bass_d.ogg | 3 + .../audio/sfx/instrument/bass/bass_e.ogg | 3 + .../audio/sfx/instrument/bass/bass_g.ogg | 3 + .../audio/sfx/instrument/flute/flute_a.ogg | 3 + .../audio/sfx/instrument/flute/flute_c.ogg | 3 + .../audio/sfx/instrument/flute/flute_c1.ogg | 3 + .../audio/sfx/instrument/flute/flute_d.ogg | 3 + .../audio/sfx/instrument/flute/flute_e.ogg | 3 + .../audio/sfx/instrument/flute/flute_g.ogg | 3 + .../audio/sfx/instrument/harp/harp_a.ogg | 3 + .../audio/sfx/instrument/harp/harp_c.ogg | 3 + .../audio/sfx/instrument/harp/harp_c1.ogg | 3 + .../audio/sfx/instrument/harp/harp_d.ogg | 3 + .../audio/sfx/instrument/harp/harp_e.ogg | 3 + .../audio/sfx/instrument/harp/harp_g.ogg | 3 + .../sfx/instrument/kalimba/kalimba_a.ogg | 3 + .../sfx/instrument/kalimba/kalimba_c.ogg | 3 + .../sfx/instrument/kalimba/kalimba_c1.ogg | 3 + .../sfx/instrument/kalimba/kalimba_d.ogg | 3 + .../sfx/instrument/kalimba/kalimba_e.ogg | 3 + .../sfx/instrument/kalimba/kalimba_g.ogg | 3 + .../audio/sfx/instrument/lute/lute_a.ogg | 3 + .../audio/sfx/instrument/lute/lute_c.ogg | 3 + .../audio/sfx/instrument/lute/lute_c1.ogg | 3 + .../audio/sfx/instrument/lute/lute_d.ogg | 3 + .../audio/sfx/instrument/lute/lute_e.ogg | 3 + .../audio/sfx/instrument/lute/lute_g.ogg | 3 + .../sfx/instrument/melodica/melodica_a.ogg | 3 + .../sfx/instrument/melodica/melodica_c.ogg | 3 + .../sfx/instrument/melodica/melodica_c1.ogg | 3 + .../sfx/instrument/melodica/melodica_d.ogg | 3 + .../sfx/instrument/melodica/melodica_e.ogg | 3 + .../sfx/instrument/melodica/melodica_g.ogg | 3 + .../audio/sfx/instrument/perc/perc_a.ogg | 3 + .../audio/sfx/instrument/perc/perc_c.ogg | 3 + .../audio/sfx/instrument/perc/perc_d.ogg | 3 + .../audio/sfx/instrument/perc/perc_e.ogg | 3 + .../audio/sfx/instrument/perc/perc_g.ogg | 3 + .../audio/sfx/instrument/sitar/sitar_a.ogg | 3 + .../audio/sfx/instrument/sitar/sitar_c.ogg | 3 + .../audio/sfx/instrument/sitar/sitar_c1.ogg | 3 + .../audio/sfx/instrument/sitar/sitar_d.ogg | 3 + .../audio/sfx/instrument/sitar/sitar_e.ogg | 3 + .../audio/sfx/instrument/sitar/sitar_g.ogg | 3 + assets/voxygen/element/skills/music.png | 3 + assets/voxygen/i18n/en/common.ftl | 1 + assets/voxygen/item_image_manifest.ron | 32 +++ .../voxygen/voxel/biped_weapon_manifest.ron | 32 +++ assets/voxygen/voxel/item_drop_manifest.ron | 9 + assets/voxygen/voxel/weapon/tool/bass.vox | 3 + assets/voxygen/voxel/weapon/tool/flute.vox | 3 + assets/voxygen/voxel/weapon/tool/harp.vox | 3 + assets/voxygen/voxel/weapon/tool/kalimba.vox | 3 + assets/voxygen/voxel/weapon/tool/lute.vox | 3 + assets/voxygen/voxel/weapon/tool/melodica.vox | 3 + assets/voxygen/voxel/weapon/tool/perc.vox | 3 + assets/voxygen/voxel/weapon/tool/sitar.vox | 3 + common/src/bin/csv_export/main.rs | 1 + common/src/comp/ability.rs | 37 +++ common/src/comp/character_state.rs | 8 + common/src/comp/inventory/item/tool.rs | 4 + common/src/states/mod.rs | 1 + common/src/states/music.rs | 133 +++++++++ common/src/states/utils.rs | 3 + common/systems/src/stats.rs | 1 + server/src/persistence/json_models.rs | 2 + voxygen/anim/src/character/alpha.rs | 256 +++++++++++++++++- voxygen/anim/src/character/equip.rs | 3 + voxygen/anim/src/character/roll.rs | 2 +- voxygen/anim/src/character/sneakequip.rs | 3 + voxygen/anim/src/character/sneakwield.rs | 32 ++- voxygen/anim/src/character/staggered.rs | 6 + voxygen/anim/src/character/stunned.rs | 7 +- voxygen/anim/src/character/wield.rs | 198 +++++++++++++- .../src/audio/sfx/event_mapper/combat/mod.rs | 7 + voxygen/src/audio/sfx/mod.rs | 3 +- voxygen/src/hud/diary.rs | 1 + voxygen/src/hud/img_ids.rs | 1 + voxygen/src/hud/util.rs | 10 + voxygen/src/scene/figure/mod.rs | 37 ++- 101 files changed, 1344 insertions(+), 23 deletions(-) create mode 100644 assets/common/abilities/music/bass.ron create mode 100644 assets/common/abilities/music/flute.ron create mode 100644 assets/common/abilities/music/harp.ron create mode 100644 assets/common/abilities/music/kalimba.ron create mode 100644 assets/common/abilities/music/lute.ron create mode 100644 assets/common/abilities/music/melodica.ron create mode 100644 assets/common/abilities/music/perc.ron create mode 100644 assets/common/abilities/music/sitar.ron create mode 100644 assets/common/items/tool/instruments/bass.ron create mode 100644 assets/common/items/tool/instruments/flute.ron create mode 100644 assets/common/items/tool/instruments/harp.ron create mode 100644 assets/common/items/tool/instruments/kalimba.ron create mode 100644 assets/common/items/tool/instruments/lute.ron create mode 100644 assets/common/items/tool/instruments/melodica.ron create mode 100644 assets/common/items/tool/instruments/perc.ron create mode 100644 assets/common/items/tool/instruments/sitar.ron create mode 100644 assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/kalimba/kalimba_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/kalimba/kalimba_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/kalimba/kalimba_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/kalimba/kalimba_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/melodica/melodica_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/melodica/melodica_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/melodica/melodica_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/melodica/melodica_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/melodica/melodica_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/melodica/melodica_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg create mode 100644 assets/voxygen/element/skills/music.png create mode 100644 assets/voxygen/voxel/weapon/tool/bass.vox create mode 100644 assets/voxygen/voxel/weapon/tool/flute.vox create mode 100644 assets/voxygen/voxel/weapon/tool/harp.vox create mode 100644 assets/voxygen/voxel/weapon/tool/kalimba.vox create mode 100644 assets/voxygen/voxel/weapon/tool/lute.vox create mode 100644 assets/voxygen/voxel/weapon/tool/melodica.vox create mode 100644 assets/voxygen/voxel/weapon/tool/perc.vox create mode 100644 assets/voxygen/voxel/weapon/tool/sitar.vox create mode 100644 common/src/states/music.rs diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index 016ace5fba..badbc909e2 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -422,6 +422,46 @@ secondary: "common.abilities.tool.golf_club.charged", abilities: [], ), + Custom("Bass"): ( + primary: "common.abilities.music.bass", + secondary: "common.abilities.music.bass", + abilities: [], + ), + Custom("Flute"): ( + primary: "common.abilities.music.flute", + secondary: "common.abilities.music.flute", + abilities: [], + ), + Custom("Harp"): ( + primary: "common.abilities.music.harp", + secondary: "common.abilities.music.harp", + abilities: [], + ), + Custom("Perc"): ( + primary: "common.abilities.music.perc", + secondary: "common.abilities.music.perc", + abilities: [], + ), + Custom("Kalimba"): ( + primary: "common.abilities.music.kalimba", + secondary: "common.abilities.music.kalimba", + abilities: [], + ), + Custom("Melodica"): ( + primary: "common.abilities.music.melodica", + secondary: "common.abilities.music.melodica", + abilities: [], + ), + Custom("Lute"): ( + primary: "common.abilities.music.lute", + secondary: "common.abilities.music.lute", + abilities: [], + ), + Custom("Sitar"): ( + primary: "common.abilities.music.sitar", + secondary: "common.abilities.music.sitar", + abilities: [], + ), Tool(Debug): ( primary: "common.abilities.debug.forwardboost", secondary: "common.abilities.debug.upboost", diff --git a/assets/common/abilities/music/bass.ron b/assets/common/abilities/music/bass.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/bass.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/flute.ron b/assets/common/abilities/music/flute.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/flute.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/harp.ron b/assets/common/abilities/music/harp.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/harp.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/kalimba.ron b/assets/common/abilities/music/kalimba.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/kalimba.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/lute.ron b/assets/common/abilities/music/lute.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/lute.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/melodica.ron b/assets/common/abilities/music/melodica.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/melodica.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/perc.ron b/assets/common/abilities/music/perc.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/perc.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/sitar.ron b/assets/common/abilities/music/sitar.ron new file mode 100644 index 0000000000..5e9fe39169 --- /dev/null +++ b/assets/common/abilities/music/sitar.ron @@ -0,0 +1,6 @@ +Music( + buildup_duration: 0.1, + play_duration: 0.1, + recover_duration: 0.1, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/bass.ron b/assets/common/items/tool/instruments/bass.ron new file mode 100644 index 0000000000..18559a8bd7 --- /dev/null +++ b/assets/common/items/tool/instruments/bass.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Bass", + description: "Common Bass.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Bass")), +) diff --git a/assets/common/items/tool/instruments/flute.ron b/assets/common/items/tool/instruments/flute.ron new file mode 100644 index 0000000000..477986ede5 --- /dev/null +++ b/assets/common/items/tool/instruments/flute.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Flute", + description: "Common Flute.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Flute")), +) diff --git a/assets/common/items/tool/instruments/harp.ron b/assets/common/items/tool/instruments/harp.ron new file mode 100644 index 0000000000..89e51ea5f6 --- /dev/null +++ b/assets/common/items/tool/instruments/harp.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Harp", + description: "Common Harp.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Harp")), +) diff --git a/assets/common/items/tool/instruments/kalimba.ron b/assets/common/items/tool/instruments/kalimba.ron new file mode 100644 index 0000000000..505a74a904 --- /dev/null +++ b/assets/common/items/tool/instruments/kalimba.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Kalimba", + description: "Common Kalimba.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Kalimba")), +) diff --git a/assets/common/items/tool/instruments/lute.ron b/assets/common/items/tool/instruments/lute.ron new file mode 100644 index 0000000000..24b0937794 --- /dev/null +++ b/assets/common/items/tool/instruments/lute.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Lute", + description: "Common Lute.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Lute")), +) diff --git a/assets/common/items/tool/instruments/melodica.ron b/assets/common/items/tool/instruments/melodica.ron new file mode 100644 index 0000000000..f41e2ae350 --- /dev/null +++ b/assets/common/items/tool/instruments/melodica.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Melodica", + description: "Common Melodica.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Melodica")), +) diff --git a/assets/common/items/tool/instruments/perc.ron b/assets/common/items/tool/instruments/perc.ron new file mode 100644 index 0000000000..79b3048cf9 --- /dev/null +++ b/assets/common/items/tool/instruments/perc.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Waschbrett", + description: "Waschbrett.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Perc")), +) diff --git a/assets/common/items/tool/instruments/sitar.ron b/assets/common/items/tool/instruments/sitar.ron new file mode 100644 index 0000000000..339cbfdf2f --- /dev/null +++ b/assets/common/items/tool/instruments/sitar.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Sitar", + description: "Common Sitar.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Sitar")), +) diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index d786aa3e08..4bdafca0e3 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -525,6 +525,119 @@ threshold: 0.3, ), + // + // Instruments + Wield(Instrument): ( + files: [ + "voxygen.audio.sfx.weapon.weapon_out", + ], + threshold: 0.5, + ), + Unwield(Instrument): ( + files: [ + "voxygen.audio.sfx.weapon.weapon_in", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Bass")): ( + files: [ + "voxygen.audio.sfx.instrument.bass.bass_c", + "voxygen.audio.sfx.instrument.bass.bass_g", + "voxygen.audio.sfx.instrument.bass.bass_d", + "voxygen.audio.sfx.instrument.bass.bass_a", + "voxygen.audio.sfx.instrument.bass.bass_e", + "voxygen.audio.sfx.instrument.bass.bass_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Flute")): ( + files: [ + "voxygen.audio.sfx.instrument.flute.flute_c", + "voxygen.audio.sfx.instrument.flute.flute_g", + "voxygen.audio.sfx.instrument.flute.flute_d", + "voxygen.audio.sfx.instrument.flute.flute_a", + "voxygen.audio.sfx.instrument.flute.flute_e", + "voxygen.audio.sfx.instrument.flute.flute_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Harp")): ( + files: [ + "voxygen.audio.sfx.instrument.harp.harp_c", + "voxygen.audio.sfx.instrument.harp.harp_g", + "voxygen.audio.sfx.instrument.harp.harp_d", + "voxygen.audio.sfx.instrument.harp.harp_a", + "voxygen.audio.sfx.instrument.harp.harp_e", + "voxygen.audio.sfx.instrument.harp.harp_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Kalimba")): ( + files: [ + "voxygen.audio.sfx.instrument.kalimba.kalimba_c", + "voxygen.audio.sfx.instrument.kalimba.kalimba_g", + "voxygen.audio.sfx.instrument.kalimba.kalimba_d", + "voxygen.audio.sfx.instrument.kalimba.kalimba_a", + "voxygen.audio.sfx.instrument.kalimba.kalimba_e", + "voxygen.audio.sfx.instrument.kalimba.kalimba_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Melodica")): ( + files: [ + "voxygen.audio.sfx.instrument.melodica.melodica_c", + "voxygen.audio.sfx.instrument.melodica.melodica_g", + "voxygen.audio.sfx.instrument.melodica.melodica_d", + "voxygen.audio.sfx.instrument.melodica.melodica_a", + "voxygen.audio.sfx.instrument.melodica.melodica_e", + "voxygen.audio.sfx.instrument.melodica.melodica_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Lute")): ( + files: [ + "voxygen.audio.sfx.instrument.lute.lute_c", + "voxygen.audio.sfx.instrument.lute.lute_g", + "voxygen.audio.sfx.instrument.lute.lute_d", + "voxygen.audio.sfx.instrument.lute.lute_a", + "voxygen.audio.sfx.instrument.lute.lute_e", + "voxygen.audio.sfx.instrument.lute.lute_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Sitar")): ( + files: [ + "voxygen.audio.sfx.instrument.sitar.sitar_c", + "voxygen.audio.sfx.instrument.sitar.sitar_g", + "voxygen.audio.sfx.instrument.sitar.sitar_d", + "voxygen.audio.sfx.instrument.sitar.sitar_a", + "voxygen.audio.sfx.instrument.sitar.sitar_e", + "voxygen.audio.sfx.instrument.sitar.sitar_c1", + ], + threshold: 0.5, + ), + Music(Instrument, Custom("Perc")): ( + files: [ + "voxygen.audio.sfx.instrument.perc.perc_c", + "voxygen.audio.sfx.instrument.perc.perc_g", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_d", + "voxygen.audio.sfx.instrument.perc.perc_a", + "voxygen.audio.sfx.instrument.perc.perc_e", + ], + threshold: 0.5, + ), + Inventory(CollectedTool(Instrument)): ( + files: [ + "voxygen.audio.sfx.inventory.add_item", + ], + threshold: 0.3, + ), // // Dagger // diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg new file mode 100644 index 0000000000..1a00276cfc --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8870ca6d50eaa0dbd9f293c632c2a91fddbdac8c895a9baba8708789ef51d165 +size 22155 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg new file mode 100644 index 0000000000..036bd41150 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:154c78cd118081c54ef4175fae8f2b60314cfdab4c4ad486f1bcfe477a1dd1e6 +size 20740 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg new file mode 100644 index 0000000000..47c6ac79f4 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e1c968dfd2dd3d99adef5dde4f0e39d5e0b3e0a92418cb927d0a46f38294c38 +size 22350 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg new file mode 100644 index 0000000000..fc8a3295c9 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3de935a5d70e17b4b34726f84330e5e7f261cfefde7468a3b7c3dd12eaa98326 +size 21204 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg new file mode 100644 index 0000000000..ee93daf2a1 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5de09a3c16eacb17afe94f8fb2e1ec3ed8d4af3926ab6390b0433fb9d25b2846 +size 21330 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg new file mode 100644 index 0000000000..16ae2d6b5a --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d785aa14128a33809946cfc4284be0fd1902994ecfc7cf72291e1cce8acd9a39 +size 23063 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg new file mode 100644 index 0000000000..b0fc7465ff --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcc226bddfaaf005d864d432e6f65a2be4c64da79dd0d145c43ff531339a45d5 +size 15767 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg new file mode 100644 index 0000000000..4b1ec1b287 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d521f5858aba942fa8f1c9b1183cadf3735b216301cb67af923042da3bfce15 +size 15604 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg new file mode 100644 index 0000000000..d03c26d16f --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9c429542f503ec3625834b15e8cac36c5de296fe5b65c2f669c755a189cb5fe +size 14930 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg new file mode 100644 index 0000000000..6564406c14 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f4c04d676c06fab391e4b9a034f6ca1bc79b13ae3189cccca3966f90a5cf521 +size 15778 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg new file mode 100644 index 0000000000..603abd5292 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5988ddb124a0f2b25fdb9674e00e4cce1a88cedc366043d42a8c392f022bddd6 +size 15772 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg new file mode 100644 index 0000000000..9b95118cb5 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52f323b028e0a3ae5300845a868d5ce56a9148c33d966ddc5b8b3e324ee235c7 +size 15638 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg new file mode 100644 index 0000000000..5aa23a2c02 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a379f51a0d3ff17cf1adb56cbc5df6c98c28d08003205670b2244771f9f96807 +size 14873 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg new file mode 100644 index 0000000000..ab532f50b0 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ded2fbf20f677a6a61a09be04fd8d72f7b20471113049465f6f62a3e7f8a919a +size 15923 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg new file mode 100644 index 0000000000..013ce66c11 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bab3b95b3ec9d687cadeedba6ed066922db8ea9208a6fdd1a8518d64fab63d4a +size 15258 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg new file mode 100644 index 0000000000..2249f666f4 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:190438f20e4142c10ec1130f3012231ff651f492371db79e6537f6c2b8a4a8ed +size 15151 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg new file mode 100644 index 0000000000..9d86ca2526 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbffd5497511fabfe427313aefbcd32c9630d75a33e42449877a460c4edeea57 +size 14997 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg new file mode 100644 index 0000000000..091cf1a349 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c71b93a9a53c905bf2ff872b80b85adb3e41fa57c04c0ce89fc0b620104ee8a +size 15462 diff --git a/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_a.ogg b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_a.ogg new file mode 100644 index 0000000000..4cb871d9f8 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92b6464999445ff3a2bca43e1ca40d5dfe2cba262b4ddb80a15d67e7e2aba55a +size 8549 diff --git a/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c.ogg b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c.ogg new file mode 100644 index 0000000000..273fc19eb5 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cf241f3cc9ffca3cb4cf9643877a2e8688e117bf9971a3d8f76340c241945da +size 8446 diff --git a/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c1.ogg b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c1.ogg new file mode 100644 index 0000000000..34bbf94411 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f75452b1d8bcf173571e7037f73115192a7a83275200fdc4f5b93e2f60786e +size 8375 diff --git a/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_d.ogg b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_d.ogg new file mode 100644 index 0000000000..81cb93cdca --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:845c00cfdc23f788b500e834087394e476cbbfa1ffebfe2aa0e2d99c6c6c1a4f +size 8583 diff --git a/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_e.ogg b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_e.ogg new file mode 100644 index 0000000000..12d44b8b97 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb45c41ca6d2ddd88c4f2e5c3008d7f83a6d6a623b685946dce27d8cfff5fa5b +size 8595 diff --git a/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_g.ogg b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_g.ogg new file mode 100644 index 0000000000..ac950c7b7b --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/kalimba/kalimba_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03f39ca33147ba58c70662f15b7c1a13f09eb7d385c1c25f963b15c836731ec8 +size 8315 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg new file mode 100644 index 0000000000..97f1b33df2 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d7fce0159af0ecc19b2230f55a0e789579f099ba1d84afcf682fe32beca22bf +size 13154 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg new file mode 100644 index 0000000000..29cb2d8cf0 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61f47508d08c5ed7a212b6ad788086b7b915d3c4caeb2456c721f90c28b6b5ab +size 11972 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg new file mode 100644 index 0000000000..139cfd9b63 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0049e761981358aaa577c0813805965dbf149bb2b583d33f2025584260f9a07 +size 12083 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg new file mode 100644 index 0000000000..fbfd80bc7c --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:767167900990ea13f1b5ef2bc4dadfc2b6f5ef6a0f06df620107b243b0ea8fb7 +size 11834 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg new file mode 100644 index 0000000000..e5c321dc1c --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6ff7cbe618164eaadc598a748537a5afb566480806e7db643c24f291a1a475e +size 12218 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg new file mode 100644 index 0000000000..37bcf75dc1 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85244f3670fe3fdb41adcb11777876c1ab0459b9f657898a3a6ce26bfbf21a96 +size 12220 diff --git a/assets/voxygen/audio/sfx/instrument/melodica/melodica_a.ogg b/assets/voxygen/audio/sfx/instrument/melodica/melodica_a.ogg new file mode 100644 index 0000000000..049a35e0d9 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/melodica/melodica_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ad5204068be369e23f65554b8dffcf0b1a6bc8e7c8afc3985bd00c831170c2f +size 11183 diff --git a/assets/voxygen/audio/sfx/instrument/melodica/melodica_c.ogg b/assets/voxygen/audio/sfx/instrument/melodica/melodica_c.ogg new file mode 100644 index 0000000000..90ab2dc549 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/melodica/melodica_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9468920628115a03eeae4179b4f041335bd68c3a194087294694ab9f7dc0213 +size 11185 diff --git a/assets/voxygen/audio/sfx/instrument/melodica/melodica_c1.ogg b/assets/voxygen/audio/sfx/instrument/melodica/melodica_c1.ogg new file mode 100644 index 0000000000..2aee575516 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/melodica/melodica_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2c7f7c09beda4bad687357ae90f7de5024c1b3f6cf3c526683c97805cf0ad90 +size 8229 diff --git a/assets/voxygen/audio/sfx/instrument/melodica/melodica_d.ogg b/assets/voxygen/audio/sfx/instrument/melodica/melodica_d.ogg new file mode 100644 index 0000000000..afd724c83d --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/melodica/melodica_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24cc96df160de9dd37e7518cad2203a4797e9ed2a1a17839f497437c3c7e55ab +size 8334 diff --git a/assets/voxygen/audio/sfx/instrument/melodica/melodica_e.ogg b/assets/voxygen/audio/sfx/instrument/melodica/melodica_e.ogg new file mode 100644 index 0000000000..8050934c56 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/melodica/melodica_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3809d40e03eedc5bb5f6eaaea9d62b9e04ce9b3b3d0bfc8b81f501c2a09dc91 +size 8264 diff --git a/assets/voxygen/audio/sfx/instrument/melodica/melodica_g.ogg b/assets/voxygen/audio/sfx/instrument/melodica/melodica_g.ogg new file mode 100644 index 0000000000..df52e3db22 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/melodica/melodica_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e43749b07ce070a71efab8dcd5d6c7e3e90b2e60c96d8c8f3c50c96eccc3a0c5 +size 11186 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg new file mode 100644 index 0000000000..3af6ae2732 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28fc6cf3b5f17bb02471f0cabcdeabfec196c6460b0cbfd07f961dac1cd15b78 +size 8752 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg new file mode 100644 index 0000000000..5fe3e724c0 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:273dfb2aed45c35734049b50eb2eb64d200cd7c8a061315d0c4a3b57d40a80be +size 11784 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg new file mode 100644 index 0000000000..fb1ffb1729 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c731c559a4de60715f217348cb2c1d1d5ff081cda330f4baac66b12922689c54 +size 7791 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg new file mode 100644 index 0000000000..7f8bd7014a --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5d30bedafb8c82d3f239b44be09d63a6be0f060edc4a04d67c94aee56b699bd +size 8017 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg new file mode 100644 index 0000000000..58e1504406 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a819881111ac16d059d876290612ad682ae944db79b62673bd93203affa5d50 +size 8147 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg new file mode 100644 index 0000000000..d8eeaf3d63 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:962eaeed674f3cbb0845a8cc453893bef7521adcfa978670a261e6bf568d093e +size 41171 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg new file mode 100644 index 0000000000..19cf91cae9 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da6b89fbbfd0288b174708524b7a685e9a7661240fc6b8a85c76ec7675b8a2af +size 41460 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg new file mode 100644 index 0000000000..2f87646353 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8bd8508c386275eccf5302d16d13526b9e7f0f6fab346ae2650e1db5ec91ca6 +size 41230 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg new file mode 100644 index 0000000000..2a1303a86e --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9c17c27eec1f8f2ba2fd4a680936c6ea65a4202354621119212b804152fab5e +size 41189 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg new file mode 100644 index 0000000000..0b6e357214 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f83fa537ef2dcc8bd573c9b1937c8136ea691fc900bbed44a2b6dd78613d73a +size 41112 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg new file mode 100644 index 0000000000..f32e428658 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a52c8a368686645f0a6340c8f5e89e5f0e6dc4e2ed7f0fe7cdb8dc55ccca0f4 +size 41054 diff --git a/assets/voxygen/element/skills/music.png b/assets/voxygen/element/skills/music.png new file mode 100644 index 0000000000..fb0b3ce63e --- /dev/null +++ b/assets/voxygen/element/skills/music.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87e0e08aca75fffa64f0a78b17f9109b247c97e843e07e27ab068e94b09e12c4 +size 8399 diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl index e3151be8ae..5c21ee0927 100644 --- a/assets/voxygen/i18n/en/common.ftl +++ b/assets/voxygen/i18n/en/common.ftl @@ -75,6 +75,7 @@ common-tool-debug = Debug common-tool-farming = Farming Tool common-tool-pick = Pickaxe common-tool-mining = Mining +common-tool-instrument = Instrument common-kind-modular_component = Modular Component common-kind-modular_component_partial = Component common-kind-glider = Glider diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index 19c8d54197..7dd0e4a4c0 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -1618,6 +1618,38 @@ "voxel.weapon.tool.shovel_gold", (0.0, 0.0, 0.0), (-135.0, 90.0, 0.0), 1.2, ), + Simple("common.items.tool.instruments.harp"): VoxTrans( + "voxel.weapon.tool.harp", + (0.0, 0.0, 0.0), (-135.0, 90.0, 0.0), 1.0, + ), + Simple("common.items.tool.instruments.flute"): VoxTrans( + "voxel.weapon.tool.flute", + (0.0, 0.0, 0.0), (-135.0, 90.0, 0.0), 1.0, + ), + Simple("common.items.tool.instruments.bass"): VoxTrans( + "voxel.weapon.tool.bass", + (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 1.4, + ), + Simple("common.items.tool.instruments.perc"): VoxTrans( + "voxel.weapon.tool.perc", + (0.0, 0.0, 0.0), (-135.0, 90.0, 0.0), 0.8, + ), + Simple("common.items.tool.instruments.kalimba"): VoxTrans( + "voxel.weapon.tool.kalimba", + (0.0, 0.0, 0.0), (-135.0, 90.0, 0.0), 0.8, + ), + Simple("common.items.tool.instruments.melodica"): VoxTrans( + "voxel.weapon.tool.melodica", + (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 0.9, + ), + Simple("common.items.tool.instruments.lute"): VoxTrans( + "voxel.weapon.tool.lute", + (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 1.0, + ), + Simple("common.items.tool.instruments.sitar"): VoxTrans( + "voxel.weapon.tool.sitar", + (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 1.2, + ), // Picks Simple("common.items.tool.pickaxe_stone"): VoxTrans( "voxel.weapon.tool.pickaxe_green-0", diff --git a/assets/voxygen/voxel/biped_weapon_manifest.ron b/assets/voxygen/voxel/biped_weapon_manifest.ron index a06dc48981..3cea116ceb 100644 --- a/assets/voxygen/voxel/biped_weapon_manifest.ron +++ b/assets/voxygen/voxel/biped_weapon_manifest.ron @@ -1120,6 +1120,38 @@ vox_spec: ("weapon.tool.shovel_gold", (-1.0, -2.5, -4.0)), color: None ), + Tool("common.items.tool.instruments.harp"): ( + vox_spec: ("weapon.tool.harp", (-3.5, -7.0, 6.0)), + color: None + ), + Tool("common.items.tool.instruments.flute"): ( + vox_spec: ("weapon.tool.flute", (-4.5, -4.5, 8.0)), + color: None + ), + Tool("common.items.tool.instruments.bass"): ( + vox_spec: ("weapon.tool.bass", (-3.5, -6.0, 0.0)), + color: None + ), + Tool("common.items.tool.instruments.perc"): ( + vox_spec: ("weapon.tool.perc", (-3.0, -6.0, 9.0)), + color: None + ), + Tool("common.items.tool.instruments.kalimba"): ( + vox_spec: ("weapon.tool.kalimba", (-3.5, -7.0, 6.0)), + color: None + ), + Tool("common.items.tool.instruments.melodica"): ( + vox_spec: ("weapon.tool.melodica", (-3.5, -4.5, 8.0)), + color: None + ), + Tool("common.items.tool.instruments.lute"): ( + vox_spec: ("weapon.tool.lute", (-2.5, -6.0, 4.0)), + color: None + ), + Tool("common.items.tool.instruments.sitar"): ( + vox_spec: ("weapon.tool.sitar", (-4.0, -6.0, 5.0)), + color: None + ), // Staves Modular(("common.items.modular.weapon.primary.staff.brand", "common.items.log.wood", Two)): ( vox_spec: ("weapon.staff.brand.wood", (-1.0, -2.5, -4.0)), diff --git a/assets/voxygen/voxel/item_drop_manifest.ron b/assets/voxygen/voxel/item_drop_manifest.ron index ff916912ba..fae1eb514d 100644 --- a/assets/voxygen/voxel/item_drop_manifest.ron +++ b/assets/voxygen/voxel/item_drop_manifest.ron @@ -397,6 +397,15 @@ // Picks Simple("common.items.tool.pickaxe_stone"): "voxel.weapon.tool.pickaxe_green-0", Simple("common.items.tool.pickaxe_steel"): "voxel.weapon.tool.pickaxe_green-1", + // Instruments + Simple("common.items.tool.instruments.bass"): "voxel.weapon.tool.bass", + Simple("common.items.tool.instruments.flute"): "voxel.weapon.tool.flute", + Simple("common.items.tool.instruments.harp"): "voxel.weapon.tool.harp", + Simple("common.items.tool.instruments.perc"): "voxel.weapon.tool.perc", + Simple("common.items.tool.instruments.kalimba"): "voxel.weapon.tool.kalimba", + Simple("common.items.tool.instruments.melodica"): "voxel.weapon.tool.melodica", + Simple("common.items.tool.instruments.lute"): "voxel.weapon.tool.lute", + Simple("common.items.tool.instruments.sitar"): "voxel.weapon.tool.sitar", // Other Simple("common.items.utility.coins"): "voxel.object.v-coin", Simple("common.items.utility.collar"): "voxel.object.collar", diff --git a/assets/voxygen/voxel/weapon/tool/bass.vox b/assets/voxygen/voxel/weapon/tool/bass.vox new file mode 100644 index 0000000000..15ca2fba7f --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/bass.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a810ac89e4fc98481f310e9082a75d4b1c09ac2d91167b34c19dca10b5871068 +size 2432 diff --git a/assets/voxygen/voxel/weapon/tool/flute.vox b/assets/voxygen/voxel/weapon/tool/flute.vox new file mode 100644 index 0000000000..d2c38d5dd6 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/flute.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:000d2af2baa0c4c126b7bd678afb9500d9cf87b19045b63805bd40923e41b1b6 +size 1296 diff --git a/assets/voxygen/voxel/weapon/tool/harp.vox b/assets/voxygen/voxel/weapon/tool/harp.vox new file mode 100644 index 0000000000..160d87a307 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/harp.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f265ae693ac68c7055849c091763e359d6ee286957ffd46264ceb1094551a399 +size 1464 diff --git a/assets/voxygen/voxel/weapon/tool/kalimba.vox b/assets/voxygen/voxel/weapon/tool/kalimba.vox new file mode 100644 index 0000000000..2673dd9e66 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/kalimba.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bef938960cd1af6a5953f02b700eb404af5e45e1634aacb4116fce93d76d8ddc +size 2068 diff --git a/assets/voxygen/voxel/weapon/tool/lute.vox b/assets/voxygen/voxel/weapon/tool/lute.vox new file mode 100644 index 0000000000..373899aa21 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/lute.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19ad242a3cd402407d6f5f4588ec5e2f20ccafdab03a1c4fbe56f83af4ed1375 +size 1428 diff --git a/assets/voxygen/voxel/weapon/tool/melodica.vox b/assets/voxygen/voxel/weapon/tool/melodica.vox new file mode 100644 index 0000000000..2e19f5c863 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/melodica.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8157ee1dcc54068203bca210ab47da9ecef6e2569525ff7d4968056fbb19a1c +size 1444 diff --git a/assets/voxygen/voxel/weapon/tool/perc.vox b/assets/voxygen/voxel/weapon/tool/perc.vox new file mode 100644 index 0000000000..a478cdbc02 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/perc.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1b869109fb6714e9c6f7d8732cd7ad7c5318f4780ff97d8aabcf83998c8dcc2 +size 1364 diff --git a/assets/voxygen/voxel/weapon/tool/sitar.vox b/assets/voxygen/voxel/weapon/tool/sitar.vox new file mode 100644 index 0000000000..eaaf8cba84 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/sitar.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d66f0188b78934f6785ce71cce5067443c7813521609fa50b8bbc68d8d1fdc0 +size 1700 diff --git a/common/src/bin/csv_export/main.rs b/common/src/bin/csv_export/main.rs index b67d00b93b..2626591486 100644 --- a/common/src/bin/csv_export/main.rs +++ b/common/src/bin/csv_export/main.rs @@ -174,6 +174,7 @@ fn get_tool_kind(kind: &ToolKind) -> String { ToolKind::Debug => "Debug".to_string(), ToolKind::Farming => "Farming".to_string(), ToolKind::Pick => "Pick".to_string(), + ToolKind::Instrument => "Instrument".to_string(), ToolKind::Natural => "Natural".to_string(), ToolKind::Organ => "Organ".to_string(), ToolKind::Empty => "Empty".to_string(), diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 2729790117..652c273a6a 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -359,6 +359,7 @@ pub enum CharacterAbilityType { ComboMelee(StageSection, u32), LeapMelee(StageSection), SpinMelee(StageSection), + Music(StageSection), Shockwave, BasicBeam, RepeaterRanged, @@ -385,6 +386,7 @@ impl From<&CharacterState> for CharacterAbilityType { CharacterState::RepeaterRanged(_) => Self::RepeaterRanged, CharacterState::BasicAura(_) => Self::BasicAura, CharacterState::SelfBuff(_) => Self::SelfBuff, + CharacterState::Music(data) => Self::Music(data.stage_section), CharacterState::Idle(_) | CharacterState::Climb(_) | CharacterState::Sit @@ -611,6 +613,12 @@ pub enum CharacterAbility { summon_distance: (f32, f32), sparseness: f64, }, + Music { + buildup_duration: f32, + play_duration: f32, + recover_duration: f32, + ori_modifier: f32, + }, } impl Default for CharacterAbility { @@ -684,6 +692,7 @@ impl CharacterAbility { | CharacterAbility::Boost { .. } | CharacterAbility::BasicBeam { .. } | CharacterAbility::Blink { .. } + | CharacterAbility::Music { .. } | CharacterAbility::BasicSummon { .. } | CharacterAbility::SpriteSummon { .. } => true, } @@ -1063,6 +1072,16 @@ impl CharacterAbility { *inner_dist *= stats.range; *outer_dist *= stats.range; }, + Music { + ref mut buildup_duration, + ref mut play_duration, + ref mut recover_duration, + ori_modifier: _, + } => { + *buildup_duration /= stats.speed; + *play_duration /= stats.speed; + *recover_duration /= stats.speed; + }, } self } @@ -1093,6 +1112,7 @@ impl CharacterAbility { Boost { .. } | ComboMelee { .. } | Blink { .. } + | Music { .. } | BasicSummon { .. } | SpriteSummon { .. } => 0.0, } @@ -2207,6 +2227,23 @@ impl From<(&CharacterAbility, AbilityInfo, &JoinData<'_>)> for CharacterState { stage_section: StageSection::Buildup, achieved_radius: summon_distance.0.floor() as i32 - 1, }), + CharacterAbility::Music { + buildup_duration, + play_duration, + recover_duration, + ori_modifier, + } => CharacterState::Music(music::Data { + static_data: music::StaticData { + buildup_duration: Duration::from_secs_f32(*buildup_duration), + play_duration: Duration::from_secs_f32(*play_duration), + recover_duration: Duration::from_secs_f32(*recover_duration), + ori_modifier: *ori_modifier, + ability_info, + }, + timer: Duration::default(), + stage_section: StageSection::Buildup, + exhausted: false, + }), } } } diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs index 3d72938933..845af42ae2 100644 --- a/common/src/comp/character_state.rs +++ b/common/src/comp/character_state.rs @@ -125,6 +125,8 @@ pub enum CharacterState { Wallrun(wallrun::Data), /// Ice skating or skiing Skate(skate::Data), + /// Play music instrument + Music(music::Data), } impl CharacterState { @@ -147,6 +149,7 @@ impl CharacterState { | CharacterState::BasicAura(_) | CharacterState::SelfBuff(_) | CharacterState::Blink(_) + | CharacterState::Music(_) | CharacterState::BasicSummon(_) | CharacterState::SpriteSummon(_) | CharacterState::Roll(roll::Data { @@ -240,6 +243,8 @@ impl CharacterState { pub fn is_skate(&self) -> bool { matches!(self, CharacterState::Skate(_)) } + pub fn is_music(&self) -> bool { matches!(self, CharacterState::Music(_)) } + pub fn is_melee_dodge(&self) -> bool { matches!(self, CharacterState::Roll(d) if d.static_data.immune_melee) } @@ -278,6 +283,7 @@ impl CharacterState { | CharacterState::SpriteSummon(_) | CharacterState::UseItem(_) | CharacterState::SpriteInteract(_) + | CharacterState::Music(_) ) } @@ -339,6 +345,7 @@ impl CharacterState { CharacterState::UseItem(data) => data.behavior(j, output_events), CharacterState::SpriteInteract(data) => data.behavior(j, output_events), CharacterState::Skate(data) => data.behavior(j, output_events), + CharacterState::Music(data) => data.behavior(j, output_events), } } @@ -386,6 +393,7 @@ impl CharacterState { CharacterState::UseItem(data) => data.handle_event(j, output_events, action), CharacterState::SpriteInteract(data) => data.handle_event(j, output_events, action), CharacterState::Skate(data) => data.handle_event(j, output_events, action), + CharacterState::Music(data) => data.handle_event(j, output_events, action), } } diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index 43b7b54fbc..7f7414fb88 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -36,6 +36,9 @@ pub enum ToolKind { Natural, Organ, /// This is an placeholder item, it is used by non-humanoid npcs to attack + /// Music Instruments + Instrument, + /// This is an placeholder item, it is used by non-humanoid npcs to attack Empty, } @@ -57,6 +60,7 @@ impl ToolKind { ToolKind::Farming => "farming", ToolKind::Pick => "pickaxe", ToolKind::Organ => "organ", + ToolKind::Instrument => "instrument", ToolKind::Empty => "empty", } } diff --git a/common/src/states/mod.rs b/common/src/states/mod.rs index 50920d6b11..295f28ac97 100644 --- a/common/src/states/mod.rs +++ b/common/src/states/mod.rs @@ -18,6 +18,7 @@ pub mod glide; pub mod glide_wield; pub mod idle; pub mod leap_melee; +pub mod music; pub mod repeater_ranged; pub mod roll; pub mod self_buff; diff --git a/common/src/states/music.rs b/common/src/states/music.rs new file mode 100644 index 0000000000..691bca061b --- /dev/null +++ b/common/src/states/music.rs @@ -0,0 +1,133 @@ +use crate::{ + comp::{character_state::OutputEvents, CharacterState, Melee, StateUpdate}, + states::{ + behavior::{CharacterBehavior, JoinData}, + utils::*, + wielding, + }, +}; +use serde::{Deserialize, Serialize}; +use std::time::Duration; + +/// Separated out to condense update portions of character state +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct StaticData { + /// How long until state should make sound + pub buildup_duration: Duration, + /// How long the state is playing for + pub play_duration: Duration, + /// How long the state has until exiting + pub recover_duration: Duration, + /// Adjusts turning rate during the attack + pub ori_modifier: f32, + /// What key is used to press ability + pub ability_info: AbilityInfo, +} + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Data { + /// Struct containing data that does not change over the course of the + /// character state + pub static_data: StaticData, + /// Timer for each stage + pub timer: Duration, + /// What section the character stage is in + pub stage_section: StageSection, + /// Whether the attack can deal more damage + pub exhausted: bool, +} + +impl CharacterBehavior for Data { + fn behavior(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate { + let mut update = StateUpdate::from(data); + + handle_orientation(data, &mut update, self.static_data.ori_modifier, None); + handle_move(data, &mut update, 0.7); + handle_jump(data, output_events, &mut update, 1.0); + + match self.stage_section { + StageSection::Buildup => { + if self.timer < self.static_data.buildup_duration { + // Build up + update.character = CharacterState::Music(Data { + timer: tick_attack_or_default(data, self.timer, None), + ..*self + }); + } else { + // Transitions to play section of stage + update.character = CharacterState::Music(Data { + timer: Duration::default(), + stage_section: StageSection::Action, + ..*self + }); + } + }, + StageSection::Action => { + if !self.exhausted { + update.character = CharacterState::Music(Data { + timer: Duration::default(), + exhausted: true, + ..*self + }); + } else if self.timer < self.static_data.play_duration { + // Play + update.character = CharacterState::Music(Data { + timer: tick_attack_or_default(data, self.timer, None), + ..*self + }); + } else { + // Transitions to recover section of stage + update.character = CharacterState::Music(Data { + timer: Duration::default(), + stage_section: StageSection::Recover, + ..*self + }); + } + }, + StageSection::Recover => { + if self.timer < self.static_data.recover_duration { + // Recovery + update.character = CharacterState::Music(Data { + timer: tick_attack_or_default(data, self.timer, None), + ..*self + }); + } else { + // Done + if input_is_pressed(data, self.static_data.ability_info.input) { + reset_state(self, data, output_events, &mut update); + } else { + update.character = + CharacterState::Wielding(wielding::Data { is_sneaking: false }); + } + } + }, + _ => { + // If it somehow ends up in an incorrect stage section + update.character = CharacterState::Wielding(wielding::Data { is_sneaking: false }); + // Make sure attack component is removed + data.updater.remove::(data.entity); + }, + } + + // At end of state logic so an interrupt isn't overwritten + if !input_is_pressed(data, self.static_data.ability_info.input) { + handle_state_interrupt(data, &mut update, false); + } + + update + } +} + +fn reset_state( + data: &Data, + join: &JoinData, + output_events: &mut OutputEvents, + update: &mut StateUpdate, +) { + handle_input( + join, + output_events, + update, + data.static_data.ability_info.input, + ); +} diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 0d18f761ed..bae3791364 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -1050,6 +1050,9 @@ pub fn is_strafing(data: &JoinData<'_>, update: &StateUpdate) -> bool { // TODO: Don't always check `character.is_aimed()`, allow the frontend to // control whether the player strafes during an aimed `CharacterState`. (update.character.is_aimed() || update.should_strafe) && data.body.can_strafe() + // no strafe with music instruments equipped in ActiveMainhand + && !matches!(unwrap_tool_data(data, EquipSlot::ActiveMainhand), + Some((ToolKind::Instrument, _))) } /// Returns tool and components diff --git a/common/systems/src/stats.rs b/common/systems/src/stats.rs index 1fb6761f51..34c6da3148 100644 --- a/common/systems/src/stats.rs +++ b/common/systems/src/stats.rs @@ -185,6 +185,7 @@ impl<'a> System<'a> for Sys { | CharacterState::SpinMelee { .. } | CharacterState::ComboMelee { .. } | CharacterState::BasicRanged { .. } + | CharacterState::Music { .. } | CharacterState::ChargedMelee { .. } | CharacterState::ChargedRanged { .. } | CharacterState::RepeaterRanged { .. } diff --git a/server/src/persistence/json_models.rs b/server/src/persistence/json_models.rs index 2e5dfecb9b..1d5e1eedb9 100644 --- a/server/src/persistence/json_models.rs +++ b/server/src/persistence/json_models.rs @@ -84,6 +84,7 @@ pub fn skill_group_to_db_string(skill_group: comp::skillset::SkillGroupKind) -> | Weapon(ToolKind::Blowgun) | Weapon(ToolKind::Debug) | Weapon(ToolKind::Farming) + | Weapon(ToolKind::Instrument) | Weapon(ToolKind::Empty) | Weapon(ToolKind::Natural) | Weapon(ToolKind::Organ) => panic!( @@ -205,6 +206,7 @@ fn tool_kind_to_string(tool: Option) -> String { Some(Farming) => "Farming", Some(Debug) => "Debug", Some(Natural) => "Natural", + Some(Instrument) => "Instrument", Some(Organ) => "Organ", Some(Empty) => "Empty", None => "None", diff --git a/voxygen/anim/src/character/alpha.rs b/voxygen/anim/src/character/alpha.rs index 878b386048..bfaafcde68 100644 --- a/voxygen/anim/src/character/alpha.rs +++ b/voxygen/anim/src/character/alpha.rs @@ -3,20 +3,20 @@ use super::{ CharacterSkeleton, SkeletonAttr, }; use common::{ - comp::item::{Hands, ToolKind}, + comp::item::{AbilitySpec, Hands, ToolKind}, states::utils::{AbilityInfo, StageSection}, }; use core::f32::consts::PI; pub struct AlphaAnimation; -type AlphaAnimationDependency = ( +type AlphaAnimationDependency<'a> = ( (Option, Option), Option, - Option, + (Option, Option<&'a AbilitySpec>), ); impl Animation for AlphaAnimation { - type Dependency<'a> = AlphaAnimationDependency; + type Dependency<'a> = AlphaAnimationDependency<'a>; type Skeleton = CharacterSkeleton; #[cfg(feature = "use-dyn-lib")] @@ -25,7 +25,7 @@ impl Animation for AlphaAnimation { #[cfg_attr(feature = "be-dyn-lib", export_name = "character_alpha")] fn update_skeleton_inner<'a>( skeleton: &Self::Skeleton, - (hands, stage_section, ability_info): Self::Dependency<'a>, + (hands, stage_section, (ability_info, active_tool_spec)): Self::Dependency<'a>, anim_time: f32, rate: &mut f32, s_a: &SkeletonAttr, @@ -78,6 +78,53 @@ impl Animation for AlphaAnimation { * Quaternion::rotation_z(0.0 + move1 * 1.5 + move2 * -2.5); next.head.orientation = Quaternion::rotation_z(0.0 + move1 * -1.5 + move2 * 2.5); }, + // TODO: create Instrument SubToolKinds to distinguish instruments + Some(ToolKind::Instrument) => { + if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { + match spec.as_str() { + "Flute" => { + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.head.position = + Vec3::new(move2 * 0.1, s_a.head.0 + move2 * 0.2, s_a.head.1); + next.chest.orientation = Quaternion::rotation_x( + 0.0 + move1 * 0.2 + move2 * -0.2 + move3 * 0.1, + ) * Quaternion::rotation_y( + 0.0 + move1 * 0.0 + move2 * 0.0 + move3 * 0.0, + ) * Quaternion::rotation_z( + 0.0 + move1 * 0.1 + move2 * -0.1 + move3 * 0.1, + ); + next.head.orientation = Quaternion::rotation_z( + 0.0 + move1 * -0.1 + move2 * 0.1 + move3 * -0.2, + ); + }, + _ => { + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.head.position = + Vec3::new(move2 * 1.0, s_a.head.0 + move2 * 1.0, s_a.head.1); + next.chest.orientation = Quaternion::rotation_x( + 0.0 + move1 * 0.2 + move2 * -0.2 + move3 * 0.1, + ) * Quaternion::rotation_y( + 0.0 + move1 * 0.0 + move2 * 0.0 + move3 * 0.0, + ) * Quaternion::rotation_z( + 0.0 + move1 * 0.3 + move2 * -0.3 + move3 * 0.2, + ); + next.head.orientation = Quaternion::rotation_z( + 0.0 + move1 * -0.1 + move2 * 0.1 + move3 * -0.2, + ); + }, + } + } + }, Some(ToolKind::Hammer) | Some(ToolKind::Pick) => { let (move1, move2, move3) = match stage_section { @@ -156,6 +203,205 @@ impl Animation for AlphaAnimation { s_a.ac.5 + move1 * -2.0 + move2 * -1.0 + move3 * 2.5, ) }, + Some(ToolKind::Instrument) => { + if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { + match spec.as_str() { + "Bass" => { + next.hand_r.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); + next.hand_l.orientation = Quaternion::rotation_x(2.0) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.40); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.0) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(-4.0, 6.0, 14.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(3.0) + * Quaternion::rotation_z(PI / -3.0); + + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, + ); + next.hand_l.position = Vec3::new( + s_a.ahl.0 + move1 * -5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahl.1 + move1 * 6.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahl.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + "Lute" => { + next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); + next.hand_l.orientation = Quaternion::rotation_x(2.0) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.40); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.0) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(-14.0, 6.0, 4.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(2.0) + * Quaternion::rotation_z(PI / -3.0); + + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, + ); + next.hand_l.position = Vec3::new( + s_a.ahl.0 + move1 * -5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahl.1 + move1 * 6.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahl.2 + move1 * -6.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + "Sitar" => { + next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); + next.hand_l.orientation = Quaternion::rotation_x(2.0) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.40); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.0) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(-14.0, 6.0, 4.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(2.0) + * Quaternion::rotation_z(PI / -3.0); + + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, + ); + next.hand_l.position = Vec3::new( + s_a.ahl.0 + move1 * -5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahl.1 + move1 * 6.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahl.2 + move1 * -6.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + "Flute" => { + next.hand_l.position = Vec3::new(-4.0, 6.0, 4.5); + next.hand_l.orientation = Quaternion::rotation_x(2.0) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.40); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.0) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(-2.5, 10.0, -12.0); + next.main.orientation = Quaternion::rotation_x(3.5) + * Quaternion::rotation_y(PI) + * Quaternion::rotation_z(0.05); + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + "Kalimba" => { + next.hand_l.position = Vec3::new(-4.0, 6.0, 2.0); + next.hand_l.orientation = Quaternion::rotation_x(1.00) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.20); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.75) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(8.0, 12.0, -6.0); + next.main.orientation = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(PI - 0.2); + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 3.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + "Melodica" => { + next.hand_l.position = Vec3::new(-3.0, 6.0, 3.5); + next.hand_l.orientation = Quaternion::rotation_x(2.0) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.40); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.0) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(-1.0, 2.0, 15.0); + next.main.orientation = Quaternion::rotation_x(0.3) + * Quaternion::rotation_y(PI) + * Quaternion::rotation_z(PI / -2.0); + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + _ => { + next.hand_l.position = Vec3::new(-4.0, 6.0, 2.0); + next.hand_l.orientation = Quaternion::rotation_x(1.00) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.20); + next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); + next.hand_r.orientation = Quaternion::rotation_x(1.75) + * Quaternion::rotation_y(0.75) + * Quaternion::rotation_z(-0.40); + next.main.position = Vec3::new(8.0, 14.0, -6.0); + next.main.orientation = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.20); + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0), + }; + next.hand_r.position = Vec3::new( + s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, + s_a.ahr.2 + move1 * 3.0 + move2 * 0.0 + move3 * 0.0, + ); + }, + } + } + }, Some(ToolKind::Hammer) | Some(ToolKind::Pick) => { let (move1, move2, move3) = match stage_section { Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), diff --git a/voxygen/anim/src/character/equip.rs b/voxygen/anim/src/character/equip.rs index 509a0502f3..f89e3c6db0 100644 --- a/voxygen/anim/src/character/equip.rs +++ b/voxygen/anim/src/character/equip.rs @@ -51,6 +51,9 @@ impl Animation for EquipAnimation { next.hand_l.position = Vec3::new(-3.0, -5.0, 9.0); next.hand_r.position = Vec3::new(-1.75, -4.5, 7.0); }, + Some(ToolKind::Instrument) => { + next.hand_l.position = Vec3::new(-5.0, -5.0, 8.0); + }, _ => {}, } diff --git a/voxygen/anim/src/character/roll.rs b/voxygen/anim/src/character/roll.rs index ff0846a6f6..861da18c2c 100644 --- a/voxygen/anim/src/character/roll.rs +++ b/voxygen/anim/src/character/roll.rs @@ -103,7 +103,7 @@ impl Animation for RollAnimation { * Quaternion::rotation_y(s_a.ac.4) * Quaternion::rotation_z(s_a.ac.5); }, - Some(ToolKind::Hammer | ToolKind::Pick) => { + Some(ToolKind::Hammer | ToolKind::Pick | ToolKind::Instrument) => { next.hand_l.position = Vec3::new(s_a.hhl.0, s_a.hhl.1, s_a.hhl.2); next.hand_l.orientation = Quaternion::rotation_x(s_a.hhl.3) * Quaternion::rotation_y(s_a.hhl.4) diff --git a/voxygen/anim/src/character/sneakequip.rs b/voxygen/anim/src/character/sneakequip.rs index 83db768bb1..e5558e384c 100644 --- a/voxygen/anim/src/character/sneakequip.rs +++ b/voxygen/anim/src/character/sneakequip.rs @@ -191,6 +191,9 @@ impl Animation for SneakEquipAnimation { next.hand_l.position = Vec3::new(-3.0, -5.0, 9.0); next.hand_r.position = Vec3::new(-1.75, -4.5, 7.0); }, + Some(ToolKind::Instrument) => { + next.hand_l.position = Vec3::new(-3.0, -5.0, 10.0); + }, _ => {}, } next diff --git a/voxygen/anim/src/character/sneakwield.rs b/voxygen/anim/src/character/sneakwield.rs index 722ed2d1ba..1a07f7a93d 100644 --- a/voxygen/anim/src/character/sneakwield.rs +++ b/voxygen/anim/src/character/sneakwield.rs @@ -2,14 +2,14 @@ use super::{ super::{vek::*, Animation}, CharacterSkeleton, SkeletonAttr, }; -use common::comp::item::{Hands, ToolKind}; +use common::comp::item::{AbilitySpec, Hands, ToolKind}; use core::{f32::consts::PI, ops::Mul}; pub struct SneakWieldAnimation; impl Animation for SneakWieldAnimation { type Dependency<'a> = ( - Option, + (Option, Option<&'a AbilitySpec>), Option, (Option, Option), Vec3, @@ -25,9 +25,15 @@ impl Animation for SneakWieldAnimation { #[cfg_attr(feature = "be-dyn-lib", export_name = "character_sneakwield")] fn update_skeleton_inner<'a>( skeleton: &Self::Skeleton, - ( active_tool_kind, + ( + (active_tool_kind, active_tool_spec), second_tool_kind, - hands, velocity, orientation, last_ori, global_time): Self::Dependency<'a>, + hands, + velocity, + orientation, + last_ori, + global_time, + ): Self::Dependency<'a>, anim_time: f32, rate: &mut f32, s_a: &SkeletonAttr, @@ -283,6 +289,24 @@ impl Animation for SneakWieldAnimation { * Quaternion::rotation_y(s_a.bc.4) * Quaternion::rotation_z(s_a.bc.5); }, + Some(ToolKind::Instrument) => { + if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { + match spec.as_str() { + "Perc" => { + next.hand_l.position = Vec3::new(-7.0, 0.0, 3.0); + next.hand_l.orientation = Quaternion::rotation_x(1.27); + next.main.position = Vec3::new(-5.0, -4.5, -5.0); + next.main.orientation = Quaternion::rotation_x(5.5); + }, + _ => { + next.hand_l.position = Vec3::new(-7.0, 4.0, 3.0); + next.hand_l.orientation = Quaternion::rotation_x(1.27); + next.main.position = Vec3::new(-5.0, 5.0, 23.0); + next.main.orientation = Quaternion::rotation_x(PI); + }, + } + } + }, Some(ToolKind::Debug) => { next.hand_l.position = Vec3::new(-7.0, 4.0, 3.0); next.hand_l.orientation = Quaternion::rotation_x(1.27); diff --git a/voxygen/anim/src/character/staggered.rs b/voxygen/anim/src/character/staggered.rs index 3389e12f73..f4a4b7309f 100644 --- a/voxygen/anim/src/character/staggered.rs +++ b/voxygen/anim/src/character/staggered.rs @@ -162,6 +162,12 @@ impl Animation for StaggeredAnimation { next.control.position = Vec3::new(-11.0, 1.8, 4.0); }, + Some(ToolKind::Instrument) => { + next.hand_l.position = Vec3::new(-7.0, 4.0, 3.0); + next.hand_l.orientation = Quaternion::rotation_x(1.27); + next.main.position = Vec3::new(-5.0, 5.0, 23.0); + next.main.orientation = Quaternion::rotation_x(PI); + }, _ => {}, } }, diff --git a/voxygen/anim/src/character/stunned.rs b/voxygen/anim/src/character/stunned.rs index 9edde52b15..4b11b8068f 100644 --- a/voxygen/anim/src/character/stunned.rs +++ b/voxygen/anim/src/character/stunned.rs @@ -155,9 +155,14 @@ impl Animation for StunnedAnimation { next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); next.main.position = Vec3::new(7.5, 7.5, 13.2); next.main.orientation = Quaternion::rotation_y(PI); - next.control.position = Vec3::new(-11.0, 1.8, 4.0); }, + Some(ToolKind::Instrument) => { + next.hand_l.position = Vec3::new(-7.0, 4.0, 3.0); + next.hand_l.orientation = Quaternion::rotation_x(1.27); + next.main.position = Vec3::new(-5.0, 5.0, 23.0); + next.main.orientation = Quaternion::rotation_x(PI); + }, _ => {}, }, (_, _) => {}, diff --git a/voxygen/anim/src/character/wield.rs b/voxygen/anim/src/character/wield.rs index 1bccde31b6..2e759ad6f3 100644 --- a/voxygen/anim/src/character/wield.rs +++ b/voxygen/anim/src/character/wield.rs @@ -3,15 +3,15 @@ use super::{ CharacterSkeleton, SkeletonAttr, }; use common::{ - comp::item::{Hands, ToolKind}, + comp::item::{AbilitySpec, Hands, ToolKind}, util::Dir, }; use core::{f32::consts::PI, ops::Mul}; pub struct WieldAnimation; -type WieldAnimationDependency = ( - Option, +type WieldAnimationDependency<'a> = ( + (Option, Option<&'a AbilitySpec>), Option, (Option, Option), Vec3, @@ -21,7 +21,7 @@ type WieldAnimationDependency = ( f32, ); impl Animation for WieldAnimation { - type Dependency<'a> = WieldAnimationDependency; + type Dependency<'a> = WieldAnimationDependency<'a>; type Skeleton = CharacterSkeleton; #[cfg(feature = "use-dyn-lib")] @@ -31,7 +31,7 @@ impl Animation for WieldAnimation { fn update_skeleton_inner<'a>( skeleton: &Self::Skeleton, ( - active_tool_kind, + (active_tool_kind, active_tool_spec), second_tool_kind, hands, orientation, @@ -281,6 +281,194 @@ impl Animation for WieldAnimation { * Quaternion::rotation_y(0.6 + u_slow * 0.1) * Quaternion::rotation_z(u_slowalt * 0.1); }, + Some(ToolKind::Instrument) => { + if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { + match spec.as_str() { + "Harp" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(0.0, 2.0, -4.0); + next.hand_l.orientation = + Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(-2.0, 10.0, 12.0); + next.main.orientation = Quaternion::rotation_y(PI); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Flute" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(-1.0, 2.0, -2.0); + next.hand_l.orientation = Quaternion::rotation_x(2.5) + * Quaternion::rotation_y(0.9) + * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(12.0, 3.0, 4.0); + next.main.orientation = + Quaternion::rotation_x(PI) * Quaternion::rotation_y(-1.2); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Bass" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(-6.0, 5.0, -5.0); + next.hand_l.orientation = Quaternion::rotation_x((PI / 2.0) + 0.3) + * Quaternion::rotation_y(0.7) + * Quaternion::rotation_y(0.25) + * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-2.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(-14.0, 4.0, -6.0); + next.main.orientation = Quaternion::rotation_x(-0.2) + * Quaternion::rotation_y(1.2) + * Quaternion::rotation_z(-1.2); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Perc" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(0.0, 2.0, -4.0); + next.hand_l.orientation = + Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(-2.0, 10.0, 12.0); + next.main.orientation = Quaternion::rotation_y(PI); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Kalimba" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(-2.0, 2.0, -4.0); + next.hand_l.orientation = + Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(-2.0, 7.0, 12.0); + next.main.orientation = + Quaternion::rotation_y(PI) * Quaternion::rotation_z(PI); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Lute" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(-2.0, 5.0, -5.0); + next.hand_l.orientation = Quaternion::rotation_x((PI / 2.0) + 0.3) + * Quaternion::rotation_y(0.7) + * Quaternion::rotation_y(0.25) + * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-5.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(-2.0, 4.0, -12.0); + next.main.orientation = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(0.2) + * Quaternion::rotation_z(-1.3); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Melodica" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(-1.0, 3.0, -2.0); + next.hand_l.orientation = Quaternion::rotation_x(2.0) + * Quaternion::rotation_z(-0.5) + * Quaternion::rotation_y(0.4) + * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(1.2) + * Quaternion::rotation_y(-0.3) + * Quaternion::rotation_z(1.5); + next.main.position = Vec3::new(-14.0, 3.0, -6.0); + next.main.orientation = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(1.1) + * Quaternion::rotation_z(-1.5); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Sitar" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(-1.0, 5.0, -2.5); + next.hand_l.orientation = Quaternion::rotation_x((PI / 2.0) + 0.3) + * Quaternion::rotation_y(0.2) + * Quaternion::rotation_y(0.25) + * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-5.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(-2.0, 4.0, -12.0); + next.main.orientation = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(0.2) + * Quaternion::rotation_z(-1.3); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + _ => {}, + } + } + }, _ => {}, }, ((_, _), _, _) => {}, diff --git a/voxygen/src/audio/sfx/event_mapper/combat/mod.rs b/voxygen/src/audio/sfx/event_mapper/combat/mod.rs index b758902c97..d04c1a7dd7 100644 --- a/voxygen/src/audio/sfx/event_mapper/combat/mod.rs +++ b/voxygen/src/audio/sfx/event_mapper/combat/mod.rs @@ -152,6 +152,13 @@ impl CombatEventMapper { CharacterAbilityType::from(character_state), data.kind, ); + } else if character_state.is_music() { + if let Some(ability_spec) = item + .ability_spec() + .map(|ability_spec| ability_spec.into_owned()) + { + return SfxEvent::Music(data.kind, ability_spec); + } } else if let Some(wield_event) = match ( previous_state.weapon_drawn, Self::weapon_drawn(character_state), diff --git a/voxygen/src/audio/sfx/mod.rs b/voxygen/src/audio/sfx/mod.rs index 723cc41c22..a712e7a2bb 100644 --- a/voxygen/src/audio/sfx/mod.rs +++ b/voxygen/src/audio/sfx/mod.rs @@ -94,7 +94,7 @@ use common::{ assets::{self, AssetExt, AssetHandle}, comp::{ beam, biped_large, biped_small, humanoid, - item::{ItemDefinitionId, ItemKind, ToolKind}, + item::{AbilitySpec, ItemDefinitionId, ItemKind, ToolKind}, object, poise::PoiseState, quadruped_low, quadruped_medium, quadruped_small, Body, CharacterAbilityType, Health, @@ -192,6 +192,7 @@ pub enum SfxEvent { GroundSlam, Utterance(UtteranceKind, VoiceKind), Lightning, + Music(ToolKind, AbilitySpec), } #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Hash, Eq)] diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index f2a932f53c..7669f11ce2 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -2833,6 +2833,7 @@ fn unlock_skill_strings(group: SkillGroupKind) -> SkillStrings<'static> { | ToolKind::Blowgun | ToolKind::Debug | ToolKind::Farming + | ToolKind::Instrument | ToolKind::Pick | ToolKind::Natural | ToolKind::Organ diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 56f6f042dd..19a36b0455 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -548,6 +548,7 @@ image_ids! { skill_axe_leap_slash: "voxygen.element.skills.skill_axe_leap_slash", skill_bow_jump_burst: "voxygen.element.skills.skill_bow_jump_burst", skill_sceptre_aura: "voxygen.element.skills.sceptre_protection", + instrument: "voxygen.element.skills.music", missing_icon: "voxygen.element.missing_icon_grey", // Buttons diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index c1dd3ebd99..bbe386c7fc 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -256,6 +256,7 @@ fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { ToolKind::Natural => i18n.get_msg("common-weapons-natural"), ToolKind::Debug => i18n.get_msg("common-tool-debug"), ToolKind::Farming => i18n.get_msg("common-tool-farming"), + ToolKind::Instrument => i18n.get_msg("common-tool-instrument"), ToolKind::Pick => i18n.get_msg("common-tool-pick"), ToolKind::Empty => i18n.get_msg("common-empty"), }; @@ -351,6 +352,15 @@ pub fn ability_image(imgs: &img_ids::Imgs, ability_id: &str) -> image::Id { "common.abilities.dagger.tempbasic" => imgs.onehdagger_m1, // Pickaxe "common.abilities.pick.swing" => imgs.mining, + // Instruments + "common.abilities.music.bass" => imgs.instrument, + "common.abilities.music.flute" => imgs.instrument, + "common.abilities.music.harp" => imgs.instrument, + "common.abilities.music.perc" => imgs.instrument, + "common.abilities.music.kalimba" => imgs.instrument, + "common.abilities.music.melodica" => imgs.instrument, + "common.abilities.music.lute" => imgs.instrument, + "common.abilities.music.sitar" => imgs.instrument, _ => imgs.not_found, } } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 4d1684dbc6..5d48961aed 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -912,7 +912,6 @@ impl FigureMgr { let (second_tool_kind, second_tool_hand, second_tool_spec) = tool_info(EquipSlot::ActiveOffhand); let second_tool_spec = second_tool_spec.as_deref(); - let hands = (active_tool_hand, second_tool_hand); // If a mount exists, get its animated mounting transform and its position @@ -1152,7 +1151,7 @@ impl FigureMgr { ( hands, Some(s.stage_section), - Some(s.static_data.ability_info), + (Some(s.static_data.ability_info), None), ), stage_progress, &mut state_animation_rate, @@ -1332,7 +1331,7 @@ impl FigureMgr { CharacterState::Boost(_) => { anim::character::AlphaAnimation::update_skeleton( &target_base, - (hands, None, None), + (hands, None, (None, None)), state.state_time, &mut state_animation_rate, skeleton_attr, @@ -1590,7 +1589,7 @@ impl FigureMgr { ( hands, Some(s.stage_section), - Some(s.static_data.ability_info), + (Some(s.static_data.ability_info), None), ), stage_progress, &mut state_animation_rate, @@ -1735,7 +1734,7 @@ impl FigureMgr { anim::character::SneakWieldAnimation::update_skeleton( &target_base, ( - active_tool_kind, + (active_tool_kind, active_tool_spec), second_tool_kind, hands, rel_vel, @@ -1752,7 +1751,7 @@ impl FigureMgr { anim::character::WieldAnimation::update_skeleton( &target_base, ( - active_tool_kind, + (active_tool_kind, active_tool_spec), second_tool_kind, hands, // TODO: Update to use the quaternion. @@ -1833,6 +1832,32 @@ impl FigureMgr { skeleton_attr, ) }, + CharacterState::Music(s) => { + let stage_time = s.timer.as_secs_f32(); + let stage_progress = match s.stage_section { + StageSection::Buildup => { + stage_time / s.static_data.buildup_duration.as_secs_f32() + }, + StageSection::Action => { + stage_time / s.static_data.play_duration.as_secs_f32() + }, + StageSection::Recover => { + stage_time / s.static_data.recover_duration.as_secs_f32() + }, + _ => 0.0, + }; + anim::character::AlphaAnimation::update_skeleton( + &target_base, + ( + hands, + Some(s.stage_section), + (Some(s.static_data.ability_info), active_tool_spec), + ), + stage_progress, + &mut state_animation_rate, + skeleton_attr, + ) + }, _ => target_base, }; From a8ff0e4e5fb695a839a0ee248b7cf5a355e258bd Mon Sep 17 00:00:00 2001 From: Sau Date: Mon, 29 Aug 2022 11:48:54 +0000 Subject: [PATCH 144/854] update the Spanish translation --- assets/voxygen/i18n/es_ES/buff.ftl | 36 +++++++++-------- assets/voxygen/i18n/es_ES/char_selection.ftl | 6 +-- assets/voxygen/i18n/es_ES/common.ftl | 27 ++++++++----- assets/voxygen/i18n/es_ES/gameinput.ftl | 42 ++++++++++---------- assets/voxygen/i18n/es_ES/main.ftl | 40 +++++++++---------- 5 files changed, 81 insertions(+), 70 deletions(-) diff --git a/assets/voxygen/i18n/es_ES/buff.ftl b/assets/voxygen/i18n/es_ES/buff.ftl index 2778845ae7..3ef41cd293 100644 --- a/assets/voxygen/i18n/es_ES/buff.ftl +++ b/assets/voxygen/i18n/es_ES/buff.ftl @@ -2,36 +2,38 @@ buff-remove = Clic para quitar buff-title-missing = Sin Título buff-desc-missing = Sin Descripción buff-title-heal = Sanación -buff-desc-heal = Restaura salud con el paso del tiempo +buff-desc-heal = Restaura salud con el paso del tiempo. buff-title-potion = Poción buff-desc-potion = Bebiendo... buff-title-saturation = Saturación -buff-desc-saturation = Restaura salud con el paso del tiempo por consumibles. -buff-title-campfire_heal = Sanación en Fogata -buff-desc-campfire_heal = Descansar en una fogata te sana un { $rate }% por segundo. +buff-desc-saturation = Restaura salud con el paso del tiempo gracias a los consumibles. +buff-title-campfire_heal = Sanación en Hoguera +buff-desc-campfire_heal = Descansar en una hoguera te sana { $rate }% por segundo. buff-title-invulnerability = Invulnerabilidad buff-desc-invulnerability = No puedes ser dañado por ningún ataque. buff-title-protectingward = Aura Protectora -buff-desc-protectingward = De alguna manera, estás protegido de los ataques. +buff-desc-protectingward = Por alguna razón, estás siendo protegido de los ataques. buff-title-frenzied = Frenético -buff-desc-frenzied = Estas imbuido con una velocidad sobrenatural y puedes ignorar heridas leves +buff-desc-frenzied = Estas imbuido con una velocidad sobrenatural y puedes ignorar heridas leves. +buff-title-hastened = Acelerado +buff-desc-hastened = Tus movimientos y ataques son más rápidos. buff-title-bleed = Sangrado buff-desc-bleed = Inflige un daño periódico. buff-title-cursed = Maldito buff-desc-cursed = Estás maldito. buff-title-burn = Ardiendo -buff-desc-burn = Te estas quemando vivo -buff-title-crippled = Lisiado -buff-desc-crippled = Te mueves lentamente porque tus piernas estan muy heridas. +buff-desc-burn = Te estás quemando vivo. +buff-title-crippled = Malherido +buff-desc-crippled = Te cuesta moverte por el estado de tus piernas. buff-title-frozen = Congelado -buff-desc-frozen = Tus movimientos y ataques son lentos. +buff-desc-frozen = Tus movimientos y ataques son más lentos. buff-title-wet = Mojado -buff-desc-wet = El suelo rechaza a tus pies, dificultando que te detengas. -buff-title-ensnared = Atrapado -buff-desc-ensnared = Enredaderas agarran tus pies, impidiéndote el movimiento. -buff-stat-health = Restaura { $str_total } salud -buff-stat-increase_max_energy = Sube la Energía Máxima en { $strength } -buff-stat-increase_max_health = Sube la Salud Máxima en { $strength } +buff-desc-wet = Resbalas sobre el suelo, dificultando que te detengas. +buff-title-ensnared = Enredado +buff-desc-ensnared = Las enredaderas te impiden moverte. +buff-stat-health = Restaura { $str_total } de salud +buff-stat-increase_max_energy = Aumenta la Energía Máxima en { $strength } +buff-stat-increase_max_health = Aumenta la Salud Máxima en { $strength } buff-stat-invulnerability = Concede invulnerabilidad buff-text-over_seconds = por { $dur_secs } segundos -buff-text-for_seconds = durante { $dur_secs } segundos \ No newline at end of file +buff-text-for_seconds = durante { $dur_secs } segundos diff --git a/assets/voxygen/i18n/es_ES/char_selection.ftl b/assets/voxygen/i18n/es_ES/char_selection.ftl index 04c917fb20..74be4dae14 100644 --- a/assets/voxygen/i18n/es_ES/char_selection.ftl +++ b/assets/voxygen/i18n/es_ES/char_selection.ftl @@ -1,6 +1,6 @@ char_selection-loading_characters = Cargando personajes... -char_selection-delete_permanently = ¿Borrar permanentemente este Personaje? -char_selection-deleting_character = Borrando Personaje... +char_selection-delete_permanently = ¿Quieres eliminar permanentemente este Personaje? +char_selection-deleting_character = Eliminando Personaje... char_selection-change_server = Cambiar de Servidor char_selection-enter_world = Entrar al Mundo char_selection-logout = Salir @@ -19,4 +19,4 @@ char_selection-skin = Piel char_selection-eyeshape = Detalle de los Ojos char_selection-accessories = Accesorios char_selection-create_info_name = ¡Tu Personaje necesita un nombre! -char_selection-version_mismatch = !Aviso! Este servidor esta ejecutando una versión diferente, posiblemente incompatible del juego. Por favor actualiza el juego. \ No newline at end of file +char_selection-version_mismatch = ¡AVISO! Este servidor esta ejecutando una versión diferente y probablemente incompatible del juego. Por favor, actualízalo. diff --git a/assets/voxygen/i18n/es_ES/common.ftl b/assets/voxygen/i18n/es_ES/common.ftl index 48d00a9a59..f6e59e22ad 100644 --- a/assets/voxygen/i18n/es_ES/common.ftl +++ b/assets/voxygen/i18n/es_ES/common.ftl @@ -1,5 +1,5 @@ common-username = Usuario -common-singleplayer = Solo +common-singleplayer = Un Jugador common-multiplayer = Multijugador common-servers = Servidores common-quit = Salir @@ -11,6 +11,7 @@ common-controls = Controles common-video = Gráficos common-sound = Sonido common-chat = Chat +common-networking = Redes common-resume = Reanudar common-characters = Personajes common-close = Cerrar @@ -40,6 +41,7 @@ common-video_settings = Ajustes Gráficos common-sound_settings = Ajustes de Sonido common-language_settings = Ajustes de Idioma common-chat_settings = Ajustes de Chat +common-networking_settings = Ajustes de Redes common-connection_lost = ¡Conexión perdida! ¿Se reinició el servidor? @@ -52,7 +54,7 @@ common-species-draugr = No muerto common-species-danari = Danari common-weapons-axe = Hacha common-weapons-dagger = Daga -common-weapons-greatsword = Gran Espada +common-weapons-greatsword = Espadón common-weapons-shortswords = Espadas Cortas common-weapons-sword = Espada common-weapons-staff = Báculo de Fuego @@ -68,17 +70,20 @@ common-weapons-staff_simple = Báculo Simple common-weapons-axe_simple = Hacha Simple common-weapons-bow_simple = Arco Simple common-weapons-unique = Único +common-weapons-organ = Organ common-tool-debug = Depuración -common-tool-faming = Herramienta Agrícola +common-tool-farming = Herramienta Agrícola common-tool-pick = Pico common-tool-mining = Minería +common-tool-instrument = Instrumento common-kind-modular_component = Componente modular +common-kind-modular_component_partial = Componente common-kind-glider = Planeador common-kind-consumable = Consumible common-kind-throwable = Puede ser lanzado common-kind-utility = Utilidad common-kind-ingredient = Ingrediente -common-kind-lantern = Linterna +common-kind-lantern = Farol common-hands-one = Una mano common-hands-two = Dos manos common-rand_appearance = Apariencia aleatoria @@ -87,19 +92,21 @@ common-stats-combat_rating = PC common-stats-power = Poder common-stats-speed = Velocidad common-stats-poise = Equilibrio -common-stats-crit_chance = Prob. Crítica -common-stats-crit_mult = Mult. Crítico +common-stats-range = Rango +common-stats-energy_efficiency = Eficiencia de Energía +common-stats-buff_strength = Fuerza de los Buffs y Debuffs. +common-stats-crit_chance = Prob. de Crítico +common-stats-crit_mult = Mult. de Crítico common-stats-armor = Armadura common-stats-poise_res = Res. Aturdimiento -common-stats-energy_max = Energía Max. +common-stats-energy_max = Energía Máx. common-stats-energy_reward = Recompensa de Energía -common-stats-crit_power = Poder Crítico +common-stats-crit_power = Poder de Crítico common-stats-stealth = Sigilo common-stats-slots = Espacios -common-tool-farming = Herramienta de colecta common-material-metal = Metal common-material-wood = Madera common-material-stone = Piedra common-material-cloth = Tela common-material-hide = Piel -common-sprite-chest = Cofre \ No newline at end of file +common-sprite-chest = Cofre diff --git a/assets/voxygen/i18n/es_ES/gameinput.ftl b/assets/voxygen/i18n/es_ES/gameinput.ftl index dee14456ff..d2171fdf89 100644 --- a/assets/voxygen/i18n/es_ES/gameinput.ftl +++ b/assets/voxygen/i18n/es_ES/gameinput.ftl @@ -1,41 +1,41 @@ gameinput-primary = Ataque Básico gameinput-secondary = Ataque Secundario gameinput-block = Bloqueo -gameinput-slot1 = Ranura 1 de barra rápida -gameinput-slot2 = Ranura 2 de barra rápida -gameinput-slot3 = Ranura 3 de barra rápida -gameinput-slot4 = Ranura 4 de barra rápida -gameinput-slot5 = Ranura 5 de barra rápida -gameinput-slot6 = Ranura 6 de barra rápida -gameinput-slot7 = Ranura 7 de barra rápida -gameinput-slot8 = Ranura 8 de barra rápida -gameinput-slot9 = Ranura 9 de barra rápida -gameinput-slot10 = Ranura 10 de barra rápida -gameinput-swaploadout = Intercambiar Armamento +gameinput-slot1 = Espacio de objeto 1 +gameinput-slot2 = Espacio de objeto 2 +gameinput-slot3 = Espacio de objeto 3 +gameinput-slot4 = Espacio de objeto 4 +gameinput-slot5 = Espacio de objeto 5 +gameinput-slot6 = Espacio de objeto 6 +gameinput-slot7 = Espacio de objeto 7 +gameinput-slot8 = Espacio de objeto 8 +gameinput-slot9 = Espacio de objeto 9 +gameinput-slot10 = Espacio de objeto 10 +gameinput-swaploadout = Cambiar de Arma gameinput-togglecursor = Alternar Cursor gameinput-help = Alternar Ventana de Ayuda gameinput-toggleinterface = Alternar Interfaz gameinput-toggledebug = Alternar FPS e Información de Depuración -gameinput-toggle_egui_debug = Alternar Info de Depuración EGUI +gameinput-toggle_egui_debug = Alternar Información de Depuración EGUI gameinput-togglechat = Alternar Chat gameinput-screenshot = Tomar captura de pantalla -gameinput-toggleingameui = Alternar Etiquetas +gameinput-toggleingameui = Alternar Nombres de Jugadores gameinput-fullscreen = Alternar Pantalla Completa -gameinput-moveforward = Moverse Hacia Delante +gameinput-moveforward = Moverse hacia Delante gameinput-moveleft = Moverse a la Izquierda gameinput-moveright = Moverse a la Derecha gameinput-moveback = Moverse hacia Atrás gameinput-jump = Saltar gameinput-glide = Planear gameinput-roll = Rodar -gameinput-climb = Ascender +gameinput-climb = Escalar gameinput-climbdown = Descender gameinput-wallleap = Salto de Pared -gameinput-togglelantern = Alternar linterna +gameinput-togglelantern = Alternar farol gameinput-mount = Montar gameinput-chat = Chat -gameinput-command = Linea Comandos -gameinput-escape = Escapar +gameinput-command = Línea de Comandos +gameinput-escape = Abrir Menú gameinput-map = Mapa gameinput-bag = Bolsa gameinput-trade = Comerciar @@ -48,7 +48,7 @@ gameinput-charge = Cargar gameinput-togglewield = Alternar Empuñadura gameinput-interact = Interactuar gameinput-freelook = Vista Libre -gameinput-autowalk = Auto Andar/Nadar +gameinput-autowalk = Auto Andar gameinput-cameraclamp = Cámara Fija gameinput-dance = Bailar gameinput-select = Seleccionar Entidad @@ -63,4 +63,6 @@ gameinput-swimup = Emerger gameinput-mapzoomin = Aumentar Zoom de Mapa gameinput-mapzoomout = Reducir Zoom de Mapa gameinput-greet = Saludar -gameinput-map-locationmarkerbutton = Establecer un punto en el Mapa \ No newline at end of file +gameinput-map-locationmarkerbutton = Establecer un punto en el Mapa +gameinput-spectatespeedboost = Ir más rápido en Modo Espectador. +gameinput-spectateviewpoint = Espectear desde el Punto de Vista de una Entidad diff --git a/assets/voxygen/i18n/es_ES/main.ftl b/assets/voxygen/i18n/es_ES/main.ftl index a6b6a05df3..ac0517528e 100644 --- a/assets/voxygen/i18n/es_ES/main.ftl +++ b/assets/voxygen/i18n/es_ES/main.ftl @@ -7,16 +7,16 @@ main-tip = Consejo: main-notice = ¡Bienvenido a la versión alfa de Veloren! - Antes de que te adentres en la diversión, por favor ten en cuenta un par de cosas: + Antes de que te adentres en el juego, por favor ten en cuenta un par de cosas: - - Esto es una alfa muy temprana. Espera errores, mecánicas de juego muy inacabadas, mecánicas sin pulir, y cosas que faltan. + - Esto es una alfa muy temprana. Espera errores, mecánicas de juego inacabadas, mecánicas sin pulir, y cosas que simplemente faltan. - - Si tienes críticas constructivas o reportes de error, puedes contactar con nosotros vía Reddit, GitLab, o nuestro servidor de Discord comunitario. + - Si tienes críticas constructivas o reportes de errores, puedes contactar con nosotros vía Reddit, GitLab, o por nuestro servidor de Discord. - Veloren se licencia bajo la licencia de código abierto GPL 3. Esto quiere decir que eres libre para jugar, modificar y redistribuir el juego tal y como desees (siempre y cuando tal trabajo se licencie también bajo la GPL 3). - Veloren es un proyecto comunitario sin ánimo de lucro, y todo aquel que trabaja en él es un voluntario. - Si te gusta lo que ves, ¡eres bienvenido de unirte a los equipos de desarrollo o arte! + Si te gusta lo que ves, ¡eres bienvenido a unirte a los equipos de desarrollo o arte! Gracias por tomarte el tiempo de leer esta noticia, ¡esperamos que disfrutes del juego! @@ -68,27 +68,27 @@ main-credits-fonts = Fuentes main-credits-other_art = Otros Artistas main-credits-contributors = Colaboradores loading-tips = - .a0 = Pulsa '{ $gameinput-togglelantern }' para encender tu linterna. - .a1 = Pulsa '{ $gameinput-help }' para ver todos las atajos de teclado predeterminados. + .a0 = Pulsa '{ $gameinput-togglelantern }' para encender tu farol. + .a1 = Pulsa '{ $gameinput-help }' para ver todos los atajos de teclado. .a2 = Puedes escribir /say o /s para chatear con jugadores que estén a tu alrededor. .a3 = Puedes escribir /region o /r para chatear con jugadores que se encuentren a doscientos bloques a tu alrededor. - .a4 = Administradores pueden usar el comando /build para entrar en modo construcción - .a5 = Puedes escribir /group o /g para chatear con jugadores en tu grupo actual. - .a6 = Para enviar mensajes privados escribe /tell seguido del nombre y tu mensaje. + .a4 = Los administradores pueden usar el comando /build para entrar en el modo de construcción. + .a5 = Puedes escribir /group o /g para chatear con jugadores en tu grupo. + .a6 = Para enviar mensajes privados escribe /tell seguido del nombre del jugador y tu mensaje. .a7 = ¡Estate atento a la comida, cofres y otros botines esparcidos por el mundo! - .a8 = ¿Inventario lleno de comida? ¡Intenta elaborar mejor comida de ella! - .a9 = ¿Preguntándote que hacer? ¡Intenta hacer una de las mazmorras marcadas del mapa! - .a10 = No te olvides de ajustar los gráficos de tu sistema. Pulsa '{ $gameinput-settings }' para abrir la configuración. + .a8 = ¿Inventario lleno de comida? ¡Intenta procesarla para conseguir mejores alimentos! + .a9 = ¿Aburrido? ¡Intenta completar una de las mazmorras marcadas en el mapa! + .a10 = No te olvides de ajustar los gráficos. Pulsa '{ $gameinput-settings }' para abrir la configuración. .a11 = ¡Jugar con otros jugadores es divertido! Pulsa '{ $gameinput-social }' para ver quien esta en línea. .a12 = Pulsa '{ $gameinput-dance }' para bailar. ¡Fiesta! .a13 = Pulsa '{ $gameinput-glide }' para desplegar tu planeador y conquistar los cielos .a14 = Veloren se encuentra todavia en Pre-Alpha. ¡Hacemos todo lo posible para mejorar la experiencia de juego día a día! .a15 = Si quieres unirte al equipo de desarrollo o conversar con nosotros, únete a nuestro servidor de Discord. - .a16 = Puedes mostrar o ocultar tu total de salud en la barra de salud en ajustes. - .a17 = Siéntate cerca de una fogata (con la tecla '{ $gameinput-sit }') para recuperarte de tus heridas. - .a18 = ¿Necesitas más bolsas o mejores armaduras para continuar tu viaje? Pulsa '{ $gameinput-crafting }' para abrir el menú de elaboración. - .a19 = Pulsa '{ $gameinput-roll }' para rodar. Rodar puede se puede usar para moverte más rápido y esquivar los ataques. - .a20 = ¿Para que sirve este objeto? Buscar 'input:' en fabricación para ver que en que recetas se usa. - .a21 = ¿Eh mira eso? Toma un pantallazo pulsando '{ $gameinput-screenshot }'. - .a22 = Intenta saltar al rodar para pasar a través de las criaturas. - .a23 = Para ver tus atributos, haz clic en el botón 'Atributos' del inventario. \ No newline at end of file + .a16 = Puedes mostrar o ocultar tu total de salud de la barra de salud en los ajustes. + .a17 = Siéntate cerca de una hoguera (con la tecla '{ $gameinput-sit }') para recuperarte de tus heridas. + .a18 = ¿Necesitas más bolsas de almacenamiento o mejores armaduras para continuar tu viaje? Pulsa '{ $gameinput-crafting }' para abrir el menú de elaboración. + .a19 = Pulsa '{ $gameinput-roll }' para rodar. Rodar te sirve para moverte más rápido y esquivar los ataques. + .a20 = ¿Para qué sirve este objeto? Busca 'input:' en fabricación para ver en qué recetas se usa. + .a21 = ¡Eh, mira eso! Toma un pantallazo pulsando '{ $gameinput-screenshot }'. + .a22 = Intenta saltar al rodar para pasar a través de los enemigos. + .a23 = Para ver tus atributos, haz clic en el botón 'Atributos' del inventario. From b892e0069978b038c333b5f1e49e27b22da54a39 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Tue, 30 Aug 2022 00:49:40 +0300 Subject: [PATCH 145/854] Fix hud-skill-sc_wardaura_duration key --- voxygen/src/hud/diary.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index 7669f11ce2..7a99eab4c4 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -3276,7 +3276,7 @@ fn sceptre_skill_strings(skill: SceptreSkill) -> SkillStrings<'static> { ), SceptreSkill::ADuration => SkillStrings::with_mult( "hud-skill-sc_wardaura_duration_title", - "hud-kill-sc_wardaura_duration", + "hud-skill-sc_wardaura_duration", modifiers.warding_aura.duration, ), SceptreSkill::ARange => SkillStrings::with_mult( From fbe0aee40d36e1f91cb656651860cbf5b934686a Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sun, 21 Aug 2022 19:16:34 +0200 Subject: [PATCH 146/854] move trading good properties (decay, transportation) from hard coded to ron file --- assets/common/economy/trading_goods.ron | 51 +++++++++++++ world/src/site/economy/cache.rs | 97 +++++++++++++++++++++++++ world/src/site/economy/mod.rs | 46 +----------- 3 files changed, 152 insertions(+), 42 deletions(-) create mode 100644 assets/common/economy/trading_goods.ron create mode 100644 world/src/site/economy/cache.rs diff --git a/assets/common/economy/trading_goods.ron b/assets/common/economy/trading_goods.ron new file mode 100644 index 0000000000..92fcacfd21 --- /dev/null +++ b/assets/common/economy/trading_goods.ron @@ -0,0 +1,51 @@ +{ + Armor: ( + // decay_rate: 0.03, // 23 years half-life + transport_effort: 2.0, // 1 person can carry half a set of entry armor + ), + Terrain(Void): ( // any terrain + transport_effort: 0.0, + storable: false, + ), + Territory(Void): ( // any territory + transport_effort: 0.0, + storable: false, + ), + Transportation: ( + storable: false, + ), + RoadSecurity: ( + transport_effort: 0.0, + storable: false, + ), + Coin: ( + transport_effort: 0.01, + ), + Potions: ( + transport_effort: 0.1, + decay_rate: 0.2, // 3 years half-life + ), + Stone: ( + transport_effort: 4.0, + ), + Food: ( + decay_rate: 0.2, // revisit + ), + Meat: ( + decay_rate: 0.25, // revisit + ), + Flour: ( + decay_rate: 0.1, // revisit + ), + Ingredients: ( + decay_rate: 0.1, // revisit + ), + Tools: ( + // TODO: Separate stone, metal, bone, wood + // decay_rate: 0.05, // 14 years half-life + ), + Wood: ( + //decay_rate: 0.1, // 6 years half-life + //transport_effort: 0.05, // 2kg/40kg + ), +} \ No newline at end of file diff --git a/world/src/site/economy/cache.rs b/world/src/site/economy/cache.rs new file mode 100644 index 0000000000..8288ddf096 --- /dev/null +++ b/world/src/site/economy/cache.rs @@ -0,0 +1,97 @@ +use super::{ + good_list, + map_types::{GoodIndex, GoodMap}, +}; +use crate::{ + assets::{self, AssetExt}, + util::DHashMap, +}; +use common::{ + terrain::BiomeKind, + trade::Good::{self, Territory}, +}; +use lazy_static::lazy_static; +use serde::{Deserialize, Serialize}; + +const fn default_one() -> f32 { 1.0 } +const fn default_true() -> bool { true } + +#[derive(Debug, Serialize, Deserialize, Clone)] +struct RawGoodProperties { + #[serde(default)] + pub decay_rate: f32, + // #[serde(default)] + // pub decay_regain: Option<(Good, f32)>, + // #[serde(default)] + // pub equivalent_to: Option<(Good, f32, EquivalenceType)>, + #[serde(default = "default_one")] + pub transport_effort: f32, + #[serde(default = "default_true")] + pub storable: bool, +} + +#[derive(Debug, Deserialize)] +#[serde(transparent)] +pub struct RawGoodPropertiesList(DHashMap); + +impl assets::Asset for RawGoodPropertiesList { + type Loader = assets::RonLoader; + + const EXTENSION: &'static str = "ron"; +} + +/// Contains all caches used for economical simulation +pub struct EconomyCache { + // professions: Vec, + // everybody: Profession, + pub(crate) transport_effort: GoodMap, + pub(crate) decay_rate: GoodMap, + pub(crate) direct_use_goods: Vec, +} + +lazy_static! { + static ref CACHE: EconomyCache = load_cache(); +} + +pub fn cache() -> &'static EconomyCache { &CACHE } + +fn load_cache() -> EconomyCache { + let good_properties = RawGoodPropertiesList::load_expect("common.economy.trading_goods") + .read() + .0 + .clone(); + let mut decay_rate: GoodMap = GoodMap::from_default(0.0); + let mut transport_effort: GoodMap = GoodMap::from_default(1.0); + let mut direct_use_goods: Vec = Vec::new(); + + for i in good_properties.iter() { + if let Ok(rawgood) = (*i.0).try_into() { + decay_rate[rawgood] = i.1.decay_rate; + if !i.1.storable { + direct_use_goods.push(rawgood); + } + transport_effort[rawgood] = i.1.transport_effort; + } else { + match *i.0 { + Territory(BiomeKind::Void) => { + for j in good_list() { + if let Territory(_) = Good::from(j) { + decay_rate[j] = i.1.decay_rate; + transport_effort[j] = i.1.transport_effort; + if !i.1.storable { + direct_use_goods.push(j); + } + } + } + }, + _ => tracing::warn!("Raw good not in index: {:?}", i.0), + } + } + } + + EconomyCache { + transport_effort, + decay_rate, + direct_use_goods, + } +} diff --git a/world/src/site/economy/mod.rs b/world/src/site/economy/mod.rs index c5fb531e8e..dcc1f25570 100644 --- a/world/src/site/economy/mod.rs +++ b/world/src/site/economy/mod.rs @@ -22,6 +22,7 @@ pub use map_types::Labor; use map_types::{GoodIndex, GoodMap, LaborIndex, LaborMap, NaturalResources}; mod context; pub use context::simulate_economy; +mod cache; const INTER_SITE_TRADE: bool = true; const DAYS_PER_MONTH: f32 = 30.0; @@ -1374,51 +1375,12 @@ fn good_list() -> impl Iterator { (0..GoodIndex::LENGTH).map(GoodIndex::from_usize) } -// cache in GoodMap ? -fn transportation_effort(g: GoodIndex) -> f32 { - match Good::from(g) { - Terrain(_) | Territory(_) | RoadSecurity => 0.0, - Coin => 0.01, - Potions => 0.1, +fn transportation_effort(g: GoodIndex) -> f32 { cache::cache().transport_effort[g] } - Armor => 2.0, - Stone => 4.0, - - _ => 1.0, - } -} - -fn decay_rate(g: GoodIndex) -> f32 { - match Good::from(g) { - Food => 0.2, - Flour => 0.1, - Meat => 0.25, - Ingredients => 0.1, - _ => 0.0, - } -} +fn decay_rate(g: GoodIndex) -> f32 { cache::cache().decay_rate[g] } /** you can't accumulate or save these options/resources for later */ -fn direct_use_goods() -> &'static [GoodIndex] { - lazy_static! { - static ref DIRECT_USE: [GoodIndex; 13] = [ - GoodIndex::try_from(Transportation).unwrap_or_default(), - GoodIndex::try_from(Territory(BiomeKind::Grassland)).unwrap_or_default(), - GoodIndex::try_from(Territory(BiomeKind::Forest)).unwrap_or_default(), - GoodIndex::try_from(Territory(BiomeKind::Lake)).unwrap_or_default(), - GoodIndex::try_from(Territory(BiomeKind::Ocean)).unwrap_or_default(), - GoodIndex::try_from(Territory(BiomeKind::Mountain)).unwrap_or_default(), - GoodIndex::try_from(RoadSecurity).unwrap_or_default(), - GoodIndex::try_from(Terrain(BiomeKind::Grassland)).unwrap_or_default(), - GoodIndex::try_from(Terrain(BiomeKind::Forest)).unwrap_or_default(), - GoodIndex::try_from(Terrain(BiomeKind::Lake)).unwrap_or_default(), - GoodIndex::try_from(Terrain(BiomeKind::Ocean)).unwrap_or_default(), - GoodIndex::try_from(Terrain(BiomeKind::Mountain)).unwrap_or_default(), - GoodIndex::try_from(Terrain(BiomeKind::Desert)).unwrap_or_default(), - ]; - } - &*DIRECT_USE -} +fn direct_use_goods() -> &'static [GoodIndex] { &cache::cache().direct_use_goods } pub struct GraphInfo { dummy: Economy, From 04b70901976a3f2dfaeefa995d2838413b69f7c3 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Mon, 22 Aug 2022 23:27:57 +0200 Subject: [PATCH 147/854] handle terrain more correctly --- world/src/site/economy/cache.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/world/src/site/economy/cache.rs b/world/src/site/economy/cache.rs index 8288ddf096..48c93f1353 100644 --- a/world/src/site/economy/cache.rs +++ b/world/src/site/economy/cache.rs @@ -8,7 +8,7 @@ use crate::{ }; use common::{ terrain::BiomeKind, - trade::Good::{self, Territory}, + trade::Good::{self, Territory, Terrain}, }; use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; @@ -20,10 +20,6 @@ const fn default_true() -> bool { true } struct RawGoodProperties { #[serde(default)] pub decay_rate: f32, - // #[serde(default)] - // pub decay_regain: Option<(Good, f32)>, - // #[serde(default)] - // pub equivalent_to: Option<(Good, f32, EquivalenceType)>, #[serde(default = "default_one")] pub transport_effort: f32, #[serde(default = "default_true")] @@ -40,10 +36,8 @@ impl assets::Asset for RawGoodPropertiesList { const EXTENSION: &'static str = "ron"; } -/// Contains all caches used for economical simulation +/// Contains caches used for economic simulation pub struct EconomyCache { - // professions: Vec, - // everybody: Profession, pub(crate) transport_effort: GoodMap, pub(crate) decay_rate: GoodMap, pub(crate) direct_use_goods: Vec, @@ -84,6 +78,17 @@ fn load_cache() -> EconomyCache { } } }, + Terrain(BiomeKind::Void) => { + for j in good_list() { + if let Terrain(_) = Good::from(j) { + decay_rate[j] = i.1.decay_rate; + transport_effort[j] = i.1.transport_effort; + if !i.1.storable { + direct_use_goods.push(j); + } + } + } + }, _ => tracing::warn!("Raw good not in index: {:?}", i.0), } } From 863f9857b50d79c76fc65bd7dc006023e19f8041 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sun, 28 Aug 2022 14:47:28 +0200 Subject: [PATCH 148/854] cargo fmt --- world/src/site/economy/cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/world/src/site/economy/cache.rs b/world/src/site/economy/cache.rs index 48c93f1353..03de60e658 100644 --- a/world/src/site/economy/cache.rs +++ b/world/src/site/economy/cache.rs @@ -8,7 +8,7 @@ use crate::{ }; use common::{ terrain::BiomeKind, - trade::Good::{self, Territory, Terrain}, + trade::Good::{self, Terrain, Territory}, }; use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; From 5e2474230e5782d307ef10037ab108363ad715f9 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Tue, 30 Aug 2022 00:34:10 +0200 Subject: [PATCH 149/854] oh, Potions do not decay in master --- assets/common/economy/trading_goods.ron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/common/economy/trading_goods.ron b/assets/common/economy/trading_goods.ron index 92fcacfd21..1dd30330f7 100644 --- a/assets/common/economy/trading_goods.ron +++ b/assets/common/economy/trading_goods.ron @@ -23,7 +23,7 @@ ), Potions: ( transport_effort: 0.1, - decay_rate: 0.2, // 3 years half-life + //decay_rate: 0.2, // 3 years half-life ), Stone: ( transport_effort: 4.0, From 8f1c45af1786ac062963f7bcd6ccfdb251091ecf Mon Sep 17 00:00:00 2001 From: MadirexRus Date: Tue, 30 Aug 2022 12:29:18 +0000 Subject: [PATCH 150/854] Russian translation fixes --- assets/voxygen/i18n/ru_RU/buff.ftl | 10 ++-- assets/voxygen/i18n/ru_RU/char_selection.ftl | 3 +- assets/voxygen/i18n/ru_RU/common.ftl | 9 ++-- assets/voxygen/i18n/ru_RU/gameinput.ftl | 12 +++-- assets/voxygen/i18n/ru_RU/hud/ability.ftl | 14 ++++++ assets/voxygen/i18n/ru_RU/hud/bag.ftl | 8 ++-- assets/voxygen/i18n/ru_RU/hud/chat.ftl | 8 ++-- assets/voxygen/i18n/ru_RU/hud/crafting.ftl | 9 ++-- assets/voxygen/i18n/ru_RU/hud/group.ftl | 2 +- assets/voxygen/i18n/ru_RU/hud/map.ftl | 1 + assets/voxygen/i18n/ru_RU/hud/misc.ftl | 7 +-- assets/voxygen/i18n/ru_RU/hud/settings.ftl | 28 +++++++---- assets/voxygen/i18n/ru_RU/hud/skills.ftl | 26 +++++----- assets/voxygen/i18n/ru_RU/hud/trade.ftl | 6 +-- assets/voxygen/i18n/ru_RU/main.ftl | 20 ++++---- assets/voxygen/i18n/ru_RU/npc.ftl | 50 ++++++++++++-------- 16 files changed, 130 insertions(+), 83 deletions(-) create mode 100644 assets/voxygen/i18n/ru_RU/hud/ability.ftl diff --git a/assets/voxygen/i18n/ru_RU/buff.ftl b/assets/voxygen/i18n/ru_RU/buff.ftl index 6ccd69a740..d02b45638a 100644 --- a/assets/voxygen/i18n/ru_RU/buff.ftl +++ b/assets/voxygen/i18n/ru_RU/buff.ftl @@ -2,11 +2,11 @@ buff-remove = Нажмите, чтобы удалить buff-title-missing = Отсутствует название buff-desc-missing = Отсутствует описание buff-title-heal = Лечение -buff-desc-heal = Постепенное восстонавление здоровья +buff-desc-heal = Постепенное восстановление здоровья buff-title-potion = Зелье -buff-desc-potion = Питье... +buff-desc-potion = Питьё... buff-title-saturation = Насыщение -buff-desc-saturation = Восстонавление здоровья за счет расходных материалов. +buff-desc-saturation = Восстановление здоровья за счет расходных материалов. buff-title-campfire_heal = Исцеление у костра buff-desc-campfire_heal = Отдых у костра лечит { $rate }% в секунду. buff-title-invulnerability = Неуязвимость @@ -28,7 +28,7 @@ buff-desc-crippled = Ваше движение затруднено, так ка buff-title-frozen = Обморожение buff-desc-frozen = Скорость движения и атак снижена. buff-title-wet = Мокрый -buff-desc-wet = Земля запутывает ваши ноги мешая хотьбе. +buff-desc-wet = Земля запутывает ваши ноги, мешая ходьбе. buff-title-ensnared = Ловушка buff-desc-ensnared = Лоза опутывает ваши ноги затрудняя движение. buff-stat-health = Восстанавливает { $str_total } здоровья @@ -36,4 +36,4 @@ buff-stat-increase_max_energy = Повышает максимум энергии buff-stat-increase_max_health = Повышает максимальное здоровье на { $strength } buff-stat-invulnerability = Дарует неуязвимость buff-text-over_seconds = более { $dur_secs } секунд(ы) -buff-text-for_seconds = на { $dur_secs } секунды \ No newline at end of file +buff-text-for_seconds = на { $dur_secs } секунд(ы) \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/char_selection.ftl b/assets/voxygen/i18n/ru_RU/char_selection.ftl index f9b4400d5d..9a3c5cffc4 100644 --- a/assets/voxygen/i18n/ru_RU/char_selection.ftl +++ b/assets/voxygen/i18n/ru_RU/char_selection.ftl @@ -3,6 +3,7 @@ char_selection-delete_permanently = Навсегда удалить этого char_selection-deleting_character = Удаление Персонажа... char_selection-change_server = Сменить сервер char_selection-enter_world = Войти в мир +char_selection-spectate = Режим наблюдателя char_selection-logout = Выход char_selection-create_new_character = Создать нового персонажа char_selection-creating_character = Создание персонажа... @@ -10,7 +11,7 @@ char_selection-character_creation = Персонаж создан char_selection-human_default = Стандартный человек char_selection-level_fmt = Уровень { $level_nb } char_selection-uncanny_valley = Дикие Земли -char_selection-plains_of_uncertainty = Plains of Uncertainty +char_selection-plains_of_uncertainty = Равнины Сомнения char_selection-beard = Борода char_selection-hair_style = Прическа char_selection-hair_color = Цвет волос diff --git a/assets/voxygen/i18n/ru_RU/common.ftl b/assets/voxygen/i18n/ru_RU/common.ftl index 17c3bc9c17..0b6a767064 100644 --- a/assets/voxygen/i18n/ru_RU/common.ftl +++ b/assets/voxygen/i18n/ru_RU/common.ftl @@ -11,6 +11,7 @@ common-controls = Управление common-video = Графика common-sound = Звук common-chat = Чат +common-networking = Сеть common-resume = Продолжить common-characters = Персонажи common-close = Закрыть @@ -40,6 +41,7 @@ common-video_settings = Графические настройки common-sound_settings = Настройки звука common-language_settings = Настройки языка common-chat_settings = Настройки чата +common-networking_settings = Настройки сети common-connection_lost = Связь потеряна! Сервер перезапущен? @@ -68,8 +70,9 @@ common-weapons-staff_simple = Простой посох common-weapons-axe_simple = Простой топор common-weapons-bow_simple = Простой лук common-weapons-unique = Уникальный -common-tool-debug = Дебаг -common-tool-farming = Инструмент +common-weapons-organ = Орган +common-tool-debug = Отладка +common-tool-farming = Фермерский инструмент common-tool-pick = Кирка common-tool-mining = Инструмент добычи common-kind-modular_component = Модульный компонент @@ -84,7 +87,7 @@ common-hands-one = Одноручное common-hands-two = Двуручное common-rand_appearance = Случайная внешность common-rand_name = Случайное имя -common-stats-combat_rating = CR +common-stats-combat_rating = БР common-stats-power = Сила common-stats-speed = Скорость common-stats-poise = Равновесие diff --git a/assets/voxygen/i18n/ru_RU/gameinput.ftl b/assets/voxygen/i18n/ru_RU/gameinput.ftl index 4e43bb44f7..768348a7fe 100644 --- a/assets/voxygen/i18n/ru_RU/gameinput.ftl +++ b/assets/voxygen/i18n/ru_RU/gameinput.ftl @@ -17,7 +17,7 @@ gameinput-help = ВКЛ/ВЫКЛ окно помощи gameinput-toggleinterface = ВКЛ/ВЫКЛ интерфейс gameinput-toggledebug = ВКЛ/ВЫКЛ FPS и отладочную информацию gameinput-toggle_egui_debug = Показать информацию для отладки EGUI -gameinput-togglechat = Переключить чат +gameinput-togglechat = ВКЛ/ВЫКЛ чат gameinput-screenshot = Сделать скриншот gameinput-toggleingameui = ВЫКЛ/ВЫКЛ никнеймы и имена gameinput-fullscreen = ВКЛ/ВЫКЛ полноэкранный режим @@ -45,7 +45,7 @@ gameinput-spellbook = Навыки gameinput-settings = Настройки gameinput-respawn = Возродиться gameinput-charge = Зарядить -gameinput-togglewield = Переключить Управление +gameinput-togglewield = Достать/Убрать оружие gameinput-interact = Взаимодействовать gameinput-freelook = Свободная камера gameinput-autowalk = Автодвижение @@ -53,14 +53,16 @@ gameinput-cameraclamp = Фиксирование камеры gameinput-dance = Танцевать gameinput-select = Выбор объекта gameinput-acceptgroupinvite = Принять приглашение в группу -gameinput-declinegroupinvite = Отвергнуть приглашение в группу +gameinput-declinegroupinvite = Отклонить приглашение в группу gameinput-cyclecamera = Переключение камеры gameinput-crafting = Крафт gameinput-fly = Полет gameinput-sneak = Красться -gameinput-swimdown = Погружение (в воду) +gameinput-swimdown = Погрузиться gameinput-swimup = Всплыть gameinput-mapzoomin = Увеличение масштаба карты gameinput-mapzoomout = Уменьшение масштаба карты gameinput-greet = Поприветствовать -gameinput-map-locationmarkerbutton = Поставить точку на карте \ No newline at end of file +gameinput-map-locationmarkerbutton = Поставить точку на карте +gameinput-spectatespeedboost = Ускорение в режиме наблюдателя +gameinput-spectateviewpoint = Режим наблюдателя \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/ability.ftl b/assets/voxygen/i18n/ru_RU/hud/ability.ftl new file mode 100644 index 0000000000..3639db690d --- /dev/null +++ b/assets/voxygen/i18n/ru_RU/hud/ability.ftl @@ -0,0 +1,14 @@ +common-abilities-debug-possess = Овладевающая Стрела + .desc = Стреляет ядовитой стрелой. Позволяет управлять вашей целью. +common-abilities-sword-spin = Вихрь + .desc = Движение вперёд, вращая мечом. +common-abilities-axe-leap = Прыжок с топором + .desc = Рубящий прыжок в место, куда направлен курсор. +common-abilities-hammer-leap = Удар Смерти + .desc = Атака с областью эффекта и с отдачей. Прыжок в позицию курсора. +common-abilities-bow-shotgun = Автомат + .desc = Запускает очередь стрел +common-abilities-staff-fireshockwave = Кольцо Огня + .desc = Поджигает землю огненной ударной волной. +common-abilities-sceptre-wardingaura = Защитная Аура + .desc = Защищает ваших союзников от вражеских атак. diff --git a/assets/voxygen/i18n/ru_RU/hud/bag.ftl b/assets/voxygen/i18n/ru_RU/hud/bag.ftl index b39f9e1f5d..e52425c01f 100644 --- a/assets/voxygen/i18n/ru_RU/hud/bag.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/bag.ftl @@ -18,17 +18,17 @@ hud-bag-legs = Ноги hud-bag-feet = Ступни hud-bag-mainhand = Правая рука hud-bag-offhand = Левая рука -hud-bag-inactive_mainhand = Правая рука -hud-bag-inactive_offhand = Левая рука +hud-bag-inactive_mainhand = Неактивный слот правой руки +hud-bag-inactive_offhand = Неактивный слот левой руки hud-bag-swap_equipped_weapons_title = Поменять местами экипированное оружие hud-bag-swap_equipped_weapons_desc = Нажмите { $key } hud-bag-bag = Рюкзак hud-bag-health = Здоровье hud-bag-energy = Энергия -hud-bag-combat_rating = Боевой рейтинг +hud-bag-combat_rating = Боевой Рейтинг hud-bag-protection = Защита hud-bag-stun_res = Устойчивость к оглушению -hud-bag-stealth = Стелс +hud-bag-stealth = Скрытность hud-bag-combat_rating_desc = Рассчитано с учетом вашего оборудования и здоровья. diff --git a/assets/voxygen/i18n/ru_RU/hud/chat.ftl b/assets/voxygen/i18n/ru_RU/hud/chat.ftl index f310eaf83b..7946f2e279 100644 --- a/assets/voxygen/i18n/ru_RU/hud/chat.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/chat.ftl @@ -5,8 +5,8 @@ hud-outcome-curse = Умер от проклятия hud-outcome-bleeding = Умер от кровотечения hud-outcome-crippled = Умер от множества травм hud-outcome-frozen = Замёрз насмерть -hud-chat-online_msg = [{ $name }] сейчас в сети -hud-chat-offline_msg = [{ $name }] вышел из сети +hud-chat-online_msg = [{ $name }] зашёл на сервер +hud-chat-offline_msg = [{ $name }] покинул сервер hud-chat-default_death_msg = [{ $name }] умер hud-chat-environmental_kill_msg = [{ $name }] умер в { $environment } hud-chat-fall_kill_msg = [{ $name }] умер от падения @@ -24,6 +24,6 @@ hud-chat-npc_explosion_kill_msg = { $attacker } взорвал [{ $victim }] hud-chat-npc_energy_kill_msg = { $attacker } убил [{ $victim }] магией hud-chat-npc_other_kill_msg = { $attacker } убил [{ $victim }] hud-chat-loot_msg = Вы подобрали [{ $item }] -hud-chat-loot_fail = Ваш инвернарь полон! +hud-chat-loot_fail = Ваш инвентарь полон! hud-chat-goodbye = До свидания! -hud-chat-connection_lost = Соединение потеряно.Выход через { $time } секунд. \ No newline at end of file +hud-chat-connection_lost = Соединение потеряно. Выход через { $time } секунд. \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/crafting.ftl b/assets/voxygen/i18n/ru_RU/hud/crafting.ftl index a9761f16a7..6b7639e4d8 100644 --- a/assets/voxygen/i18n/ru_RU/hud/crafting.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/crafting.ftl @@ -2,6 +2,7 @@ hud-crafting = Крафт hud-crafting-recipes = Рецепты hud-crafting-ingredients = Ингредиенты: hud-crafting-craft = Создать +hud-crafting-craft_all = Создать все hud-crafting-tool_cata = Необходимо: hud-crafting-req_crafting_station = Необходимо: hud-crafting-anvil = Наковальня @@ -35,10 +36,10 @@ hud-crafting-modular_desc = Перетащите сюда часть предм hud-crafting-mod_weap_prim_slot_title = Основной компонент оружия hud-crafting-mod_weap_prim_slot_desc = Поместите сюда основной компонент оружия (например клинок меча, топорище, или плечо лука). hud-crafting-mod_weap_sec_slot_title = Вторичный компонент оружия -hud-crafting-mod_weap_sec_slot_desc = Поместите сюда вторичный компонент оружи (например рукоять меча, рукоять лука или сердцевину посоха). +hud-crafting-mod_weap_sec_slot_desc = Поместите сюда вторичный компонент оружия (например рукоять меча, рукоять лука или сердцевину посоха). hud-crafting-mod_comp_metal_prim_slot_title = Металлический слиток -hud-crafting-mod_comp_metal_prim_slot_desc = Положите сюда металлический слиток, только определенные металлы можно использовать для изготовления оружия. +hud-crafting-mod_comp_metal_prim_slot_desc = Положите сюда металлический слиток, только определённые металлы можно использовать для изготовления оружия. hud-crafting-mod_comp_wood_prim_slot_title = Дерево -hud-crafting-mod_comp_wood_prim_slot_desc = Положите сюда дерево, только определенное дерево можно использовать для изготовления оружия. +hud-crafting-mod_comp_wood_prim_slot_desc = Положите сюда дерево, только определённое дерево можно использовать для изготовления оружия. hud-crafting-mod_comp_sec_slot_title = Животный материал -hud-crafting-mod_comp_sec_slot_desc = При желании поместите сюда животный материал, только определенные ингредиенты можно использовать для улучшения оружия. \ No newline at end of file +hud-crafting-mod_comp_sec_slot_desc = При желании поместите сюда животный материал, только определённые ингредиенты можно использовать для улучшения оружия. \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/group.ftl b/assets/voxygen/i18n/ru_RU/hud/group.ftl index 285b2b87cb..c4f001d185 100644 --- a/assets/voxygen/i18n/ru_RU/hud/group.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/group.ftl @@ -1,7 +1,7 @@ hud-group = Группа hud-group-invite_to_join = [{ $name }] пригласил вас в свою группу! hud-group-invite_to_trade = [{ $name }] предлогает вам поторговать. -hud-group-invite = Приглашение +hud-group-invite = Пригласить hud-group-kick = Выгнать hud-group-assign_leader = Назначить лидером hud-group-leave = Покинуть группу diff --git a/assets/voxygen/i18n/ru_RU/hud/map.ftl b/assets/voxygen/i18n/ru_RU/hud/map.ftl index a632274e16..bc2c1fb048 100644 --- a/assets/voxygen/i18n/ru_RU/hud/map.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/map.ftl @@ -35,4 +35,5 @@ hud-map-change_map_mode = Изменить режим карты hud-map-toggle_minimap_voxel = Подробная миникарта hud-map-zoom_minimap_explanation = Увеличьте миникарту, чтобы более детально рассмотреть область вокруг вас. hud-map-gnarling = Форт Гнарлингов +hud-map-chapel_site = Морская часовня hud-map-placed_by = Метка установлена { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/misc.ftl b/assets/voxygen/i18n/ru_RU/hud/misc.ftl index 19231d1f08..ca7b159899 100644 --- a/assets/voxygen/i18n/ru_RU/hud/misc.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/misc.ftl @@ -6,6 +6,7 @@ hud-waypoint_saved = Путевая точка сохранена hud-sp_arrow_txt = SP hud-inventory_full = Инвентарь полон hud-someone_else = Кто-нибудь другой +hud-another_group = Другая группа hud-owned_by_for_secs = Принадлежит { $name } в течение { $secs } сек. hud-press_key_to_show_keybindings_fmt = [{ $key }] Сочетания клавиш hud-press_key_to_toggle_lantern_fmt = [{ $key }] Фонарь @@ -18,9 +19,9 @@ hud-tutorial_click_here = Нажмите [ { $key } ], чтобы включит hud-tutorial_elements = Крафт hud-temp_quest_headline = Привет путешественник! hud-temp_quest_text = - Для начала, вы можете осматреть эту деревню и собрать немного припасов. // force update + Для начала, вы можете осмотреть эту деревню и собрать немного припасов. - Вы можете взять с собой в путешествие все, что вам нужно! + Вы можете взять с собой в путешествие всё, что вам нужно! Посмотрите в правый нижний угол экрана, чтобы найти различные вещи, такие как ваша сумка, меню крафта и карта. @@ -28,7 +29,7 @@ hud-temp_quest_text = Дикие животные по всему городу - отличный источник шкуры животных, из которой вы можете сделать защиту от опасностей этого мира. - Когда почувствуете себя готовым, постарайтесь получить еще лучшее снаряжение из множества испытаний, отмеченных на вашей карте! + Когда почувствуете себя готовым, постарайтесь получить ещё лучшее снаряжение из множества испытаний, отмеченных на вашей карте! hud-spell = Способности hud-diary = Дневник hud-free_look_indicator = Активирован свободный вид. Чтобы отключить, нажмите { $key }. diff --git a/assets/voxygen/i18n/ru_RU/hud/settings.ftl b/assets/voxygen/i18n/ru_RU/hud/settings.ftl index 8cf9f0186e..dd302bb2e8 100644 --- a/assets/voxygen/i18n/ru_RU/hud/settings.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/settings.ftl @@ -16,16 +16,21 @@ hud-settings-opacity = Прозрачность hud-settings-hotbar = Панель быстрого доступа hud-settings-toggle_shortcuts = Отображать горячие клавиши hud-settings-buffs_skillbar = Баффы на панели навыков -hud-settings-buffs_mmap = Баффы возле миникарте +hud-settings-buffs_mmap = Баффы возле миникарты hud-settings-toggle_bar_experience = Переключить панель опыта hud-settings-scrolling_combat_text = Отображение урона/исцеления -hud-settings-incoming_damage = Отдельно полученный +hud-settings-damage_accumulation_duration = Продолжительность накопления урона +hud-settings-incoming_damage = Отображение получаемого урона +hud-settings-incoming_damage_accumulation_duration = Продолжительность накопления получаемого урона +hud-settings-round_damage = Округление урона hud-settings-speech_bubble = Диалоговое окно -hud-settings-speech_bubble_self = Показывать каждое отдельное окно +hud-settings-speech_bubble_self = Показывать свои диалоговые окна hud-settings-speech_bubble_dark_mode = Диалоговое окно (тёмная тема) hud-settings-speech_bubble_icon = Иконка диалогового окна hud-settings-energybar_numbers = Значения на панели энергии hud-settings-always_show_bars = Всегда показывать панели энергии +hud-settings-experience_numbers = Очки опыта +hud-settings-accumulate_experience = Складывать очки опыта hud-settings-values = Цифры hud-settings-percentages = Проценты hud-settings-chat = Чат @@ -40,9 +45,9 @@ hud-settings-invert_scroll_zoom = Инвертировать масштаб пр hud-settings-invert_mouse_y_axis = Инвертировать ось Y мыши hud-settings-invert_controller_y_axis = Инвертировать ось Y контроллера hud-settings-enable_mouse_smoothing = Сглаживание камеры -hud-settings-free_look_behavior = Свободное поведение -hud-settings-auto_walk_behavior = Поведение при автоматической ходьбе -hud-settings-camera_clamp_behavior = Поведение вертикального фиксатора камеры +hud-settings-free_look_behavior = Переключение свободной камеры +hud-settings-auto_walk_behavior = Переключение автоматической ходьбы +hud-settings-camera_clamp_behavior = Переключение вертикального фиксатора камеры hud-settings-player_physics_behavior = Физика игрока (экспериментальная) hud-settings-stop_auto_walk_on_input = Остановить автоходьбу при движении hud-settings-auto_camera = Авто-камера @@ -87,6 +92,8 @@ hud-settings-gpu_profiler = Замеры GPU (не везде поддержив hud-settings-particles = Частицы hud-settings-lossy_terrain_compression = Сжатие рельефа с потерями hud-settings-weapon_trails = Эффект оружия +hud-settings-flashing_lights = Мигающие источники света +hud-settings-flashing_lights_info = Убирает все виды мигания, т. е. мерцание или молнии hud-settings-resolution = Разрешение hud-settings-bit_depth = Битовая глубина hud-settings-refresh_rate = Частота обновления @@ -99,7 +106,8 @@ hud-settings-shadow_rendering_mode-none = Отключено hud-settings-shadow_rendering_mode-cheap = Низкое hud-settings-shadow_rendering_mode-map = Высокое hud-settings-shadow_rendering_mode-map-resolution = Разрешение -hud-settings-lod_detail = Уровень детализации +hud-settings-rain_occlusion-resolution = Разрешение дождевой окклюзии +hud-settings-lod_detail = Уровень детализации LoD hud-settings-save_window_size = Сохранить размер окна hud-settings-reset_graphics = По умолчанию hud-settings-bloom = Свечение @@ -108,6 +116,8 @@ hud-settings-master_volume = Общая громкость hud-settings-inactive_master_volume_perc = Громкость неактивного окна hud-settings-music_volume = Громкость музыки hud-settings-sound_effect_volume = Громкость эффектов +hud-settings-ambience_volume = Громкость окружения +hud-settings-music_spacing = Интервал музыки hud-settings-audio_device = Аудио-устройство hud-settings-reset_sound = По умолчанию hud-settings-english_fallback = Отображать английский для отсутствующих переводов @@ -128,4 +138,6 @@ hud-settings-region = Регион hud-settings-say = Сказать hud-settings-all = Все hud-settings-group_only = Только группа -hud-settings-reset_chat = По умолчанию \ No newline at end of file +hud-settings-reset_chat = По умолчанию +hud-settings-third_party_integrations = Сторонние интеграции +hud-settings-enable_discord_integration = Включить интеграцию Discord \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/hud/skills.ftl b/assets/voxygen/i18n/ru_RU/hud/skills.ftl index 7a1f8f3823..dafb363217 100644 --- a/assets/voxygen/i18n/ru_RU/hud/skills.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/skills.ftl @@ -21,7 +21,7 @@ hud-skill-unlck_staff = Разблокировать древо навыков hud-skill-unlck_sceptre_title = Разблокировать скипетр hud-skill-unlck_sceptre = Разблокировать древо навыков владения скипетром{ $SP } hud-skill-dodge_title = Перекат -hud-skill-dodge = Во время переката вы игнорируете урон почти от всех атак ближнего боя. +hud-skill-dodge = Перекаты активируются средней кнопкой мыши, во время них вы игнорируете урон почти от всех атак ближнего боя. hud-skill-roll_energy_title = Расход энергии hud-skill-roll_energy = Перекат использует на { $boost }% меньше энергии{ $SP } hud-skill-roll_speed_title = Скорость @@ -29,7 +29,7 @@ hud-skill-roll_speed = Перекат на { $boost }% быстрее{ $SP } hud-skill-roll_dur_title = Продолжительность переката hud-skill-roll_dur = Перекат на { $boost }% дольше{ $SP } hud-skill-climbing_title = Скалолазание -hud-skill-climbing = Высота прыжка на вершине подъема +hud-skill-climbing = Высота прыжка на вершине подъема больше hud-skill-climbing_cost_title = Расход энергии hud-skill-climbing_cost = Скалолазание использует на { $boost }% меньше энергии{ $SP } hud-skill-climbing_speed_title = Скорость @@ -72,14 +72,14 @@ hud-skill-st_shockwave_range_title = Радиус кольца hud-skill-st_shockwave_range = Радиус больше на { $boost }%{ $SP } hud-skill-st_shockwave_cost_title = Расход энергии hud-skill-st_shockwave_cost = Затраты энергии ниже на { $boost }%{ $SP } -hud-skill-st_shockwave_knockback_title = Отбрасывание волны +hud-skill-st_shockwave_knockback_title = Волна отбрасывания hud-skill-st_shockwave_knockback = Увеличивает потенциал отбрасывания на { $boost }%{ $SP } hud-skill-st_shockwave_damage_title = Урон hud-skill-st_shockwave_damage = Увеличивает урон кольца огня на { $boost }%{ $SP } hud-skill-st_shockwave_unlock_title = Кольцо огня hud-skill-st_shockwave_unlock = Открывает возможность отбрасывать врагов с помощью огня{ $SP } hud-skill-st_flamethrower_title = Поток пламени -hud-skill-st_flamethrower = Испускает плотный поток пламени из вашего посоха +hud-skill-st_flamethrower = Испускает плотный поток пламени. Сожги всех вокруг! hud-skill-st_flame_velocity_title = Скорость hud-skill-st_flame_velocity = Скорость создания пламени выше на { $boost }%{ $SP } hud-skill-st_flamethrower_range_title = Дальность действия @@ -89,7 +89,7 @@ hud-skill-st_energy_drain = Уменьшает скорость траты эн hud-skill-st_flamethrower_damage_title = Урон hud-skill-st_flamethrower_damage = Урон от потока пламени увеличивается на { $boost }%{ $SP } hud-skill-st_explosion_radius_title = Радиус взрыва -hud-skill-st_explosion_radius = Радиус взрыва больше на { $boost }%{ $SP } +hud-skill-st_explosion_radius = Больше - лучше, увеличивает радиус взрыва на { $boost }%{ $SP } hud-skill-st_energy_regen_title = Востановление энергии hud-skill-st_energy_regen = Увеличивает прирост энергии на { $boost }%{ $SP } hud-skill-st_fireball_title = Огненый шар @@ -141,7 +141,7 @@ hud-skill-hmr_leap_damage = Увеличивает урон скачка на { hud-skill-hmr_unlock_leap_title = Разблокировать скачок hud-skill-hmr_unlock_leap = Разблокирует скачок{ $SP } hud-skill-hmr_charged_melee_title = Силовая атака -hud-skill-hmr_charged_melee = ПКМ совершает оглушающий удар. Зажатие ПКМ накапливает силу и оглушает врага отбрасывая его +hud-skill-hmr_charged_melee = ПКМ совершает оглушающий удар. Зажатие ПКМ накапливает силу и оглушает врага, отбрасывая его hud-skill-hmr_charged_rate_title = Скорость hud-skill-hmr_charged_rate = Увеличивает скорость с которой вы накапливаете силу удара на { $boost }%{ $SP } hud-skill-hmr_charged_melee_nrg_drain_title = Расход энергии @@ -151,13 +151,13 @@ hud-skill-hmr_charged_melee_damage = Увеличивает урон на { $boo hud-skill-hmr_charged_melee_knockback_title = Оглушение силовой атакой hud-skill-hmr_charged_melee_knockback = Увеличивает отбрасывание { $boost }%{ $SP } hud-skill-hmr_single_strike_title = Одиночный удар -hud-skill-hmr_single_strike = Обычный удар +hud-skill-hmr_single_strike = Такой же одинокий, как и ты hud-skill-hmr_single_strike_regen_title = Востановление энергии -hud-skill-hmr_single_strike_regen = Увеличивает прирост энергии с каждым последующим ударом{ $SP } +hud-skill-hmr_single_strike_regen = Увеличивает прирост энергии с каждым удачным ударом{ $SP } hud-skill-hmr_single_strike_speed_title = Скорость -hud-skill-hmr_single_strike_speed = Увеличивает скорость атаки с каждым последующим ударом{ $SP } +hud-skill-hmr_single_strike_speed = Увеличивает скорость атаки с каждым удачным ударом{ $SP } hud-skill-hmr_single_strike_damage_title = Урон -hud-skill-hmr_single_strike_damage = Увеличивает урон с каждым последующим ударом{ $SP } +hud-skill-hmr_single_strike_damage = Увеличивает урон с каждым удачным ударом{ $SP } hud-skill-hmr_single_strike_knockback_title = Отбрасывание hud-skill-hmr_single_strike_knockback = Увеличивает потенциал отбрасывания на { $boost }%{ $SP } hud-skill-sw_trip_str_title = Тройной удар @@ -165,9 +165,9 @@ hud-skill-sw_trip_str = Атака из трёх ударов в комбо hud-skill-sw_trip_str_combo_title = Тройной удар: Комбо hud-skill-sw_trip_str_combo = Разблокирует комбо для тройного удара{ $SP } hud-skill-sw_trip_str_dmg_title = Урон -hud-skill-sw_trip_str_dmg = Увеличивает урон, наносимый каждым последующим ударом{ $SP } +hud-skill-sw_trip_str_dmg = Увеличивает урон, наносимый каждым удачным ударом{ $SP } hud-skill-sw_trip_str_sp_title = Скорость -hud-skill-sw_trip_str_sp = Увеличивает скорость атаки, при каждом последующем ударе{ $SP } +hud-skill-sw_trip_str_sp = Увеличивает скорость атаки при каждом удачном ударе{ $SP } hud-skill-sw_trip_str_reg_title = Восстановление hud-skill-sw_trip_str_reg = Увеличивает получение энергии с каждым удачным ударом{ $SP } hud-skill-sw_dash_title = Рывок @@ -230,7 +230,7 @@ hud-skill-axe_leap_distance_title = Дистанция скачка hud-skill-axe_leap_distance = Увеличивает дистанцию скачка на { $boost }%{ $SP } hud-skill-mining_title = Добыча hud-skill-pick_strike_title = Удар киркой -hud-skill-pick_strike = Разбивай камни киркой что бы получить руду, самоцветы и опыт +hud-skill-pick_strike = Разбивай камни киркой, чтобы получить руду, самоцветы и опыт hud-skill-pick_strike_speed_title = Скорость кирки hud-skill-pick_strike_speed = Добывай быстрее{ $SP } hud-skill-pick_strike_oregain_title = Больше руды diff --git a/assets/voxygen/i18n/ru_RU/hud/trade.ftl b/assets/voxygen/i18n/ru_RU/hud/trade.ftl index d72423cfa0..2c80166443 100644 --- a/assets/voxygen/i18n/ru_RU/hud/trade.ftl +++ b/assets/voxygen/i18n/ru_RU/hud/trade.ftl @@ -1,6 +1,6 @@ hud-trade-trade_window = Торговля hud-trade-phase1_description = - Перетащите предметы, которые вы хотите обменять + Перетащите предметы, которые вы хотите обменять, в соответствующую область. hud-trade-phase2_description = Сделка теперь заблокирована, чтобы у вас было время @@ -19,8 +19,8 @@ hud-trade-result-nospace = Недостаточно места для завер hud-trade-buy_price = Цена покупки hud-trade-sell_price = Цена продажи hud-trade-coin = Монеты -hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_1 = hud-trade-tooltip_hint_2 = hud-trade-your_offer = Ваше предложение hud-trade-their_offer = Предложение скупщика -hud-trade-amount_input = Выберете предмет \ No newline at end of file +hud-trade-amount_input = Выберите предмет \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/main.ftl b/assets/voxygen/i18n/ru_RU/main.ftl index 8a2deef354..24df5adbcb 100644 --- a/assets/voxygen/i18n/ru_RU/main.ftl +++ b/assets/voxygen/i18n/ru_RU/main.ftl @@ -17,12 +17,12 @@ main-notice = - Veloren лицензирован по лицензии GPL 3 с открытым исходным кодом. Это означает, что вы можете играть, изменять и распространять игру по своему усмотрению (при условии, что производная работа также находится в рамках GPL 3). - - Велорен-это некоммерческий общественный проект, и все, кто работает над ним, являются добровольцами. + - Veloren - это некоммерческий общественный проект, и все, кто работает над ним, являются добровольцами. Если вам нравится то, что вы видите, вы можете присоединиться к командам разработчиков или художников! Спасибо, что нашли время прочитать это уведомление, мы надеемся, что вам понравится игра! - ~ Разработчики Велорена + ~ Разработчики Veloren main-login_process = Информация о процессе входа в систему: @@ -30,6 +30,7 @@ main-login_process = запись для игры на серверах с поддержкой аутентификации. Вы можете создать учетную запись по адресу + https://veloren.net/account/. main-login-server_not_found = Сервер не найден main-login-authentication_error = Ошибка аутентификации на сервере @@ -72,20 +73,23 @@ main-credits-contributors = Авторы loading-tips = .a0 = Нажмите '{ $gameinput-togglelantern }', чтобы зажечь фонарь. .a1 = Нажмите '{ $gameinput-help }', чтобы просмотреть все клавиши по умолчанию. - .a2 = Вы можете ввести /tell или /s, чтобы общаться только с игроками непосредственно вокруг вас. + .a2 = Вы можете ввести /say или /s, чтобы общаться только с игроками непосредственно вокруг вас. .a3 = Вы можете ввести /region или /r, чтобы общаться только с игроками в паре сотен блоков вокруг вас. .a4 = Администраторы могут использовать команду /build для входа в режим постройки. .a5 = Вы можете ввести /group или /g, чтобы общаться только с игроками в вашей текущей группе. .a6 = Чтобы отправить личные сообщения, введите /tell, а затем имя игрока и ваше сообщение. .a7 = Смотрите внимательно чтобы найти еду, сундуки и другие предметы, разбросанные по всему миру! - .a8 = Инвентарь заполнен едой? Попробуйте приготовить из нее еду получше! - .a9 = Интересно чем можно заняться? Попробуйте пройти одно из подземелий, отмеченных на карте! + .a8 = Инвентарь заполнен едой? Попробуйте приготовить из неё еду получше! + .a9 = Интересно чем можно заняться? Попробуйте зачистить одно из подземелий, отмеченных на карте! .a10 = Не забудьте настроить графику для вашей системы. Нажмите '{ $gameinput-settings }', чтобы открыть настройки. - .a11 = Играть с другими-это весело! Нажмите '{ $gameinput-social }', чтобы узнать, кто находится в сети. + .a11 = Играть с другими весело! Нажмите '{ $gameinput-social }', чтобы узнать, кто находится в сети. .a12 = Нажмите '{ $gameinput-dance }', чтобы танцевать. Вечеринка! .a13 = Нажмите '{ $gameinput-glide }', чтобы открыть свой дельтаплан и покорить небо. - .a14 = Veloren все еще находится в Пре-Альфе. Мы делаем все возможное, чтобы улучшать его каждый день! + .a14 = Veloren все еще находится в Пре-Альфе. Мы делаем всё возможное, чтобы улучшать его каждый день! .a15 = Если вы хотите присоединиться к команде разработчиков или просто пообщаться с нами, присоединяйтесь к нашему серверу Discord. .a16 = Вы можете переключить отображение количества здоровья на панели здоровья в настройках. .a17 = Сядьте у костра (с помощью клавиши '{ $gameinput-sit }'), чтобы залечить свои раны. - .a18 = Вам нужно больше сумок или лучшая броня, чтобы продолжить свое путешествие? Нажмите '{ $gameinput-crafting }', чтобы открыть меню крафта! \ No newline at end of file + .a18 = Вам нужно больше сумок или лучшая броня, чтобы продолжить свое путешествие? Нажмите '{ $gameinput-crafting }', чтобы открыть меню крафта! + .a19 = Нажмите '{ $gameinput-roll }' для переката. Перекаты могут быть использованы для быстрого передвижения и для уклонения от атак. + .a20 = Не знаете для чего нужен предмет? Введите 'input:' в меню крафта чтобы увидеть в каких рецептах он используется. + .a21 = Нашли что-то красивое? Сделайте скриншот при помощи '{ $gameinput-screenshot }'. \ No newline at end of file diff --git a/assets/voxygen/i18n/ru_RU/npc.ftl b/assets/voxygen/i18n/ru_RU/npc.ftl index 92976ab123..7192302cbd 100644 --- a/assets/voxygen/i18n/ru_RU/npc.ftl +++ b/assets/voxygen/i18n/ru_RU/npc.ftl @@ -2,31 +2,30 @@ npc-speech-villager = .a0 = Я люблю сыр. npc-speech-villager_open = .a0 = Интересно, что думает Catoblepas когда ест траву. - .a1 = Как ты думаешь, что заставляет Glowing Remains светься? - .a2 = Ты когда-нибудь слышал о свирепых Land Sharks? Я слышал, они живут в пустынях. + .a1 = Как ты думаешь, что заставляет Glowing Remains светиться? + .a2 = Ты когда-нибудь слышал о свирепых Land Sharks? Я слышал, что они живут в пустынях. .a3 = Интересно, что там по ту сторону гор. - .a4 = Я оставил немного сыра у родни. Теперь я не знаю, съеден сыр или нет. Я называю его сыром Шредингера. + .a4 = Я оставил немного сыра у родни. Теперь я не знаю, съеден сыр или нет. Я называю его сыром Шрёдингера. .a5 = Ты когда-нибудь ловил светлячков? - .a6 = Ходит тут один, то ли креветка, то ли кетка. Не видел такого? - .a7 = Говорят, в пещерах можно найти блестящие драгоценные камни всех видов. - .a8 = Я не могу понять, откуда приходят эти Sauroks. + .a6 = Говорят, в пещерах можно найти блестящие драгоценные камни всех видов. + .a7 = Я не могу понять, откуда приходят эти Sauroks. npc-speech-villager_adventurous = .a0 = Я надеюсь, что однажды смогу собрать свой собственный дельтаплан. .a1 = Я бы хотел исследовать пещеры, когда стану сильнее. npc-speech-villager_closed = .a0 = Ты не из местных, не так ли? - .a1 = Ты не думаешь что наша деревня лучшая? - .a2 = Говорят грибы полезный для здоровья. Никогда не ел их. + .a1 = Не кажется ли тебе, что наша деревня лучшая? + .a2 = Говорят, грибы полезны для здоровья. Никогда не ел их. .a3 = Быть или не быть? Я думаю, что буду фермером. npc-speech-villager_conscientious = - .a0 = Я все время занят. Всегда найду чем заняться. + .a0 = Я всё время занят. Всегда есть дела. .a1 = Надеюсь скоро пойдет дождь. Это было бы здорово для урожая. npc-speech-villager_busybody = .a0 = Людям надо меньше болтать и больше работать. npc-speech-villager_unconscientious = .a0 = Я думаю сейчас время для второго завтрака! - .a1 = Я бы хотел чтобы в моём доме небыло беспорядка. Но мне для этого надо было бы прибраться! Ха-ха! - .a2 = Где же я ее оставил... + .a1 = Я бы хотел, чтобы в моём доме не было беспорядка. Но мне для этого надо было бы прибраться! Ха-ха! + .a2 = Где же я её оставил... npc-speech-villager_extroverted = .a0 = Ты не поверишь, что я делал в эти выходные! .a1 = Доброго утра тебе! @@ -38,7 +37,7 @@ npc-speech-villager_extroverted = .a7 = Я люблю мёд! И ненавижу пчёл. npc-speech-villager_sociable = .a0 = Не хочешь заглянуть? Мы как раз собирались покушать сыра! - .a1 = Не хочешь глянуть на мой сад? Окей, в другой раз. + .a1 = Не хочешь взглянуть на мой сад? Окей, в другой раз. npc-speech-villager_introverted = .a0 = Привет. .a1 = А, я? Да я тут так. @@ -55,7 +54,7 @@ npc-speech-villager_neurotic = .a0 = Мысли об этих подземельях пугают меня. Надеюсь их кто-нибудь зачистит. .a1 = Кто-то должен что-то сделать с этими культистами. Желательно не я. .a2 = Я чувствую, что произойдет что-то плохое. - .a3 = Я бы хотел чтобы кто-нибудь отогнал волков подальше от деревни. + .a3 = Я бы хотел, чтобы кто-нибудь отогнал волков подальше от деревни. npc-speech-villager_sad_loner = .a0 = Я так одинок. .a1 = ... Извини за это неловкое молчание. Мне не по душе компания. @@ -69,12 +68,15 @@ npc-speech-villager_decline_trade = .a0 = Извини, мне нечем с тобой торговать. .a1 = Торговля? Как будто у меня есть что-то, что может тебя заинтересовать. .a2 = Мой дом - моя собственность, я не хочу продавать его. +npc-speech-villager_busy = + .a0 = Извини, я сейчас не могу с тобой разговаривать. + .a1 = Позже поговорим, я занят. npc-speech-merchant_advertisement = .a0 = Могу ли я заинтересовать вас сделкой? .a1 = Ты хочешь со мной поторговать? .a2 = У меня много товаров, не хочешь взглянуть? npc-speech-merchant_busy = - .a0 = Пожалуйста подожди, я здесь один на всех. + .a0 = Пожалуйста, подожди, я здесь один на всех. .a1 = Минутку, дай мне закончить. .a2 = Я занят, зайди попозже. npc-speech-merchant_busy_rude = @@ -87,6 +89,12 @@ npc-speech-merchant_trade_successful = npc-speech-merchant_trade_declined = .a0 = Может в другой раз, хорошего дня! .a1 = Жаль, тогда, может быть, в следующий раз! +npc-speech-merchant_trade_cancelled_hostile = + .a0 = Извиняюсь за прерывание, нужно решить эту проблему! + .a1 = Поторгуемся позже, сначала мне нужно разобраться с этим! +npc-speech-ambush = + .a0 = Неразумно путешествовать в одиночку! + .a1 = Всё равно что отнять конфетку у ребёнка! npc-speech-villager_cultist_alarm = .a0 = Берегись! На свободе разгуливает культист! .a1 = К оружию! Культисты атакуют! @@ -157,12 +165,12 @@ npc-speech-villager_under_attack = .a43 = Эй! Что ты возомнил о себе?! .a44 = Я тебе башку оторву! .a45 = Остановись пожалуйста. У меня ничего нет! - .a46 = Я позову брата, он больше меня + .a46 = Я позову брата, он больше меня! .a47 = Нет! Я расскажу маме! .a48 = Будь ты проклят! .a49 = Пожалуйста, не делай этого. - .a50 = Это не приятно! - .a51 = Ваше оружие работает, вы можете убрать его прямо сейчас! + .a50 = Это было не приятно! + .a51 = Ваше оружие работает, можете убрать его! .a52 = Пощади! .a53 = Пожалуйста, у меня семья! .a54 = Я слишком молод чтобы умереть! @@ -179,9 +187,9 @@ npc-speech-villager_under_attack = .a65 = Ты заплатишь за это! .a66 = Ты об этом пожалеешь! .a67 = Не заставляй меня делать тебе больно! - .a68 = Произошла какая то ошибка! + .a68 = Произошла какая-то ошибка! .a69 = Не делай этого! - .a70 = Изыди, дьявол + .a70 = Изыди, дьявол! .a71 = Это очень больно! .a72 = Зачем ты это сделал? .a73 = Ради всего святого, прекрати! @@ -189,12 +197,12 @@ npc-speech-villager_under_attack = .a75 = Я не заслуживаю этого! .a76 = Пожалуйста, больше так не делай. .a77 = Стража, утопите этого монстра в озере! - .a78 = Я натравлю своего tarasque на тебя! + .a78 = Я натравлю своего Тараска на тебя! .a79 = Почему я? npc-speech-villager_enemy_killed = .a0 = Я уничтожил врага! .a1 = Наконец-то мир! - .a2 = ... что же я наделал? + .a2 = ... что я там делал? npc-speech-menacing = .a0 = Я предупреждаю тебя! .a1 = Ещё шаг и я атакую! From 6c89cd8fbfd75b51d3a2bb441241f3620aed77ce Mon Sep 17 00:00:00 2001 From: flo Date: Tue, 30 Aug 2022 16:55:02 +0000 Subject: [PATCH 151/854] put Organ under Toolkind Instrument --- assets/common/items/npc_weapons/unique/organ.ron | 2 +- assets/voxygen/audio/sfx.ron | 2 +- assets/voxygen/i18n/en/common.ftl | 1 - common/src/bin/csv_export/main.rs | 1 - common/src/comp/inventory/item/tool.rs | 2 -- server/src/persistence/json_models.rs | 6 +----- voxygen/src/hud/diary.rs | 1 - voxygen/src/hud/util.rs | 1 - 8 files changed, 3 insertions(+), 13 deletions(-) diff --git a/assets/common/items/npc_weapons/unique/organ.ron b/assets/common/items/npc_weapons/unique/organ.ron index 87149aa32f..33163f6c29 100644 --- a/assets/common/items/npc_weapons/unique/organ.ron +++ b/assets/common/items/npc_weapons/unique/organ.ron @@ -2,7 +2,7 @@ ItemDef( name: "Organ Aura", description: "Motivational Tune", kind: Tool(( - kind: Organ, + kind: Instrument, hands: Two, stats: ( equip_time_secs: 0.0, diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index 4bdafca0e3..9ed264423b 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -450,7 +450,7 @@ ], threshold: 0.2, ), - Attack(BasicAura, Organ): ( + Attack(BasicAura, Instrument): ( files: [ "voxygen.audio.sfx.abilities.barrel_organ", ], diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl index 5c21ee0927..8329e77540 100644 --- a/assets/voxygen/i18n/en/common.ftl +++ b/assets/voxygen/i18n/en/common.ftl @@ -70,7 +70,6 @@ common-weapons-staff_simple = Simple Staff common-weapons-axe_simple = Simple Axe common-weapons-bow_simple = Simple Bow common-weapons-unique = Unique -common-weapons-organ = Organ common-tool-debug = Debug common-tool-farming = Farming Tool common-tool-pick = Pickaxe diff --git a/common/src/bin/csv_export/main.rs b/common/src/bin/csv_export/main.rs index 2626591486..cc73b25d50 100644 --- a/common/src/bin/csv_export/main.rs +++ b/common/src/bin/csv_export/main.rs @@ -176,7 +176,6 @@ fn get_tool_kind(kind: &ToolKind) -> String { ToolKind::Pick => "Pick".to_string(), ToolKind::Instrument => "Instrument".to_string(), ToolKind::Natural => "Natural".to_string(), - ToolKind::Organ => "Organ".to_string(), ToolKind::Empty => "Empty".to_string(), } } diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index 7f7414fb88..e80146ce3a 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -34,7 +34,6 @@ pub enum ToolKind { /// Intended for invisible weapons (e.g. a creature using its claws or /// biting) Natural, - Organ, /// This is an placeholder item, it is used by non-humanoid npcs to attack /// Music Instruments Instrument, @@ -59,7 +58,6 @@ impl ToolKind { ToolKind::Debug => "debug", ToolKind::Farming => "farming", ToolKind::Pick => "pickaxe", - ToolKind::Organ => "organ", ToolKind::Instrument => "instrument", ToolKind::Empty => "empty", } diff --git a/server/src/persistence/json_models.rs b/server/src/persistence/json_models.rs index 1d5e1eedb9..5d0ba9b3ef 100644 --- a/server/src/persistence/json_models.rs +++ b/server/src/persistence/json_models.rs @@ -86,8 +86,7 @@ pub fn skill_group_to_db_string(skill_group: comp::skillset::SkillGroupKind) -> | Weapon(ToolKind::Farming) | Weapon(ToolKind::Instrument) | Weapon(ToolKind::Empty) - | Weapon(ToolKind::Natural) - | Weapon(ToolKind::Organ) => panic!( + | Weapon(ToolKind::Natural) => panic!( "Tried to add unsupported skill group to database: {:?}", skill_group ), @@ -207,7 +206,6 @@ fn tool_kind_to_string(tool: Option) -> String { Some(Debug) => "Debug", Some(Natural) => "Natural", Some(Instrument) => "Instrument", - Some(Organ) => "Organ", Some(Empty) => "Empty", None => "None", }) @@ -227,11 +225,9 @@ fn tool_kind_from_string(tool: String) -> Option { "Spear" => Some(Spear), "Blowgun" => Some(Blowgun), "Pick" => Some(Pick), - "Farming" => Some(Farming), "Debug" => Some(Debug), "Natural" => Some(Natural), - "Organ" => Some(Organ), "Empty" => Some(Empty), "None" => None, unknown => { diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index 7a99eab4c4..e8f9ef044e 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -2836,7 +2836,6 @@ fn unlock_skill_strings(group: SkillGroupKind) -> SkillStrings<'static> { | ToolKind::Instrument | ToolKind::Pick | ToolKind::Natural - | ToolKind::Organ | ToolKind::Empty, ) => { tracing::warn!("Requesting title for unlocking unexpected skill group"); diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 39cacb9d3b..774ce0f63f 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -250,7 +250,6 @@ fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> Cow<'a, str> { ToolKind::Shield => i18n.get_msg("common-weapons-shield"), ToolKind::Spear => i18n.get_msg("common-weapons-spear"), ToolKind::Blowgun => i18n.get_msg("common-weapons-blowgun"), - ToolKind::Organ => i18n.get_msg("common-weapons-organ"), ToolKind::Natural => i18n.get_msg("common-weapons-natural"), ToolKind::Debug => i18n.get_msg("common-tool-debug"), ToolKind::Farming => i18n.get_msg("common-tool-farming"), From c0911707e590c240b0296369fc49887e41c4a203 Mon Sep 17 00:00:00 2001 From: kitswas <90329875+kitswas@users.noreply.github.com> Date: Wed, 31 Aug 2022 11:29:05 +0530 Subject: [PATCH 152/854] Added helper function density_factor_by_altitude --- world/src/layer/scatter.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/world/src/layer/scatter.rs b/world/src/layer/scatter.rs index 7653cfdbaf..213b0311e5 100644 --- a/world/src/layer/scatter.rs +++ b/world/src/layer/scatter.rs @@ -1,6 +1,7 @@ use crate::{column::ColumnSample, sim::SimChunk, Canvas, CONFIG}; use common::terrain::{Block, BlockKind, SpriteKind}; use noise::NoiseFn; +use num::traits::Pow; use rand::prelude::*; use std::f32; use vek::*; @@ -9,6 +10,20 @@ pub fn close(x: f32, tgt: f32, falloff: f32) -> f32 { (1.0 - (x - tgt).abs() / falloff).max(0.0).powf(0.125) } +/// Returns a decimal value between 0 and 1. +/// The density is maximum at the middle of the highest and the lowest allowed +/// altitudes, and zero otherwise. Quadratic curve. +/// +/// The formula used is: +/// +/// ```latex +/// \max\left(-\frac{4\left(x-u\right)\left(x-l\right)}{\left(u-l\right)^{2}},\ 0\right) +/// ``` +pub fn density_factor_by_altitude(lower_limit: f32, altitude: f32, upper_limit: f32) -> f32 { + let maximum: f32 = (upper_limit - lower_limit).pow(2) / 4.0f32; + (-((altitude - lower_limit) * (altitude - upper_limit)) / maximum).max(0.0) +} + const MUSH_FACT: f32 = 1.0e-4; // To balance things around the mushroom spawning rate const GRASS_FACT: f32 = 1.0e-3; // To balance things around the grass spawning rate const DEPTH_WATER_NORM: f32 = 15.0; // Water depth at which regular underwater sprites start spawning From 1064055bb204b12c4cdbed80d2babe2d9b082b83 Mon Sep 17 00:00:00 2001 From: kitswas <90329875+kitswas@users.noreply.github.com> Date: Tue, 30 Aug 2022 18:31:19 +0530 Subject: [PATCH 153/854] Cotton spawn fix Cotton now grows in low altitudes only. (mostly near rivers and lakes) Density increased to compensate for the reduction in growable area. Cotton Soil and Temperature changed. Made patch density vary by altitude. --- world/src/layer/scatter.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/world/src/layer/scatter.rs b/world/src/layer/scatter.rs index 213b0311e5..8f9d03541b 100644 --- a/world/src/layer/scatter.rs +++ b/world/src/layer/scatter.rs @@ -144,17 +144,21 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { ScatterConfig { kind: Cotton, water_mode: Ground, - permit: |b| matches!(b, BlockKind::Grass), + permit: |b| matches!(b, BlockKind::Earth | BlockKind::Grass), f: |_, col| { ( - close(col.temp, CONFIG.temperate_temp, 0.7).min(close( + close(col.temp, CONFIG.tropical_temp, 0.7).min(close( col.humidity, CONFIG.jungle_hum, 0.4, )) * col.tree_density - * MUSH_FACT - * 75.0, - Some((0.0, 256.0, 0.25)), + * MUSH_FACT + * 200.0 + * (!col.snow_cover) as i32 as f32 /* To prevent spawning in snow covered areas */ + * density_factor_by_altitude(-500.0 , col.alt, 500.0), /* To prevent + * spawning at high + * altitudes */ + Some((0.0, 128.0, 0.30)), ) }, }, From c6efafd2145356ad1023bb81c5b9ed5c6e5e043b Mon Sep 17 00:00:00 2001 From: kitswas <90329875+kitswas@users.noreply.github.com> Date: Tue, 30 Aug 2022 21:05:53 +0530 Subject: [PATCH 154/854] Flax spawn fix Flax now does not grow in the flood plains and extreme altitudes. Lowered the humidity requirement. Made Flax density vary by altitude. Flax temperature changed. --- world/src/layer/scatter.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/world/src/layer/scatter.rs b/world/src/layer/scatter.rs index 8f9d03541b..044c5e556f 100644 --- a/world/src/layer/scatter.rs +++ b/world/src/layer/scatter.rs @@ -182,10 +182,16 @@ pub fn apply_scatter_to(canvas: &mut Canvas, rng: &mut impl Rng) { permit: |b| matches!(b, BlockKind::Grass), f: |_, col| { ( - close(col.temp, 0.0, 0.7).min(close(col.humidity, CONFIG.jungle_hum, 0.4)) - * col.tree_density + close(col.temp, CONFIG.temperate_temp, 0.7).min(close( + col.humidity, + CONFIG.forest_hum, + 0.4, + )) * col.tree_density * MUSH_FACT - * 600.0, + * 600.0 + * density_factor_by_altitude(200.0, col.alt, 1000.0), /* To control + * spawning based + * on altitude */ Some((0.0, 100.0, 0.15)), ) }, From cf9f2d36d0348923978905aabdd9b1f6ea127a09 Mon Sep 17 00:00:00 2001 From: Jonathan Berglin Date: Thu, 1 Sep 2022 08:21:07 +0000 Subject: [PATCH 155/854] Update swedish translation --- assets/voxygen/i18n/sv_SE/common.ftl | 3 ++- assets/voxygen/i18n/sv_SE/hud/map.ftl | 1 + assets/voxygen/i18n/sv_SE/hud/settings.ftl | 11 ++++++----- assets/voxygen/i18n/sv_SE/hud/trade.ftl | 13 +++++++++---- assets/voxygen/i18n/sv_SE/npc.ftl | 10 ++++++++-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/assets/voxygen/i18n/sv_SE/common.ftl b/assets/voxygen/i18n/sv_SE/common.ftl index d2d6f8f0c1..26b9a5d86e 100644 --- a/assets/voxygen/i18n/sv_SE/common.ftl +++ b/assets/voxygen/i18n/sv_SE/common.ftl @@ -74,6 +74,7 @@ common-tool-debug = Felsökning common-tool-farming = Jordbruksredskap common-tool-pick = Hacka common-tool-mining = Gruvgrävande +common-weapons-instrument = Instrument common-kind-modular_component = Modulär komponent common-kind-modular_component_partial = Komponent common-kind-glider = Glidare @@ -107,4 +108,4 @@ common-material-wood = Trä common-material-stone = Sten common-material-cloth = Tyg common-material-hide = Skinn -common-sprite-chest = Kista \ No newline at end of file +common-sprite-chest = Kista diff --git a/assets/voxygen/i18n/sv_SE/hud/map.ftl b/assets/voxygen/i18n/sv_SE/hud/map.ftl index 9cc5452955..c186a75f86 100644 --- a/assets/voxygen/i18n/sv_SE/hud/map.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/map.ftl @@ -31,4 +31,5 @@ hud-map-zoom_minimap_explanation = Zooma in Minikartan för att se området runtom dig i högre detalj hud-map-gnarling = Gnarlingsfästning +hud-map-chapel_site = Sjökapell hud-map-placed_by = Placerad av { $name } \ No newline at end of file diff --git a/assets/voxygen/i18n/sv_SE/hud/settings.ftl b/assets/voxygen/i18n/sv_SE/hud/settings.ftl index 2221701473..1262cea890 100644 --- a/assets/voxygen/i18n/sv_SE/hud/settings.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/settings.ftl @@ -21,7 +21,7 @@ hud-settings-toggle_bar_experience = Visa/dölj erfarenhetsmätare hud-settings-scrolling_combat_text = Rullande stridstext hud-settings-damage_accumulation_duration = Skadeackumulationsvaraktighet hud-settings-incoming_damage = Inkommande skada -settings-incoming_damage_accumulation_duration = Inkommande Skadeackumulationsvaraktighet +hud-settings-incoming_damage_accumulation_duration = Inkommande Skadeackumulationsvaraktighet hud-settings-round_damage = Avrunda skada hud-settings-speech_bubble = Pratbubbla hud-settings-speech_bubble_self = Visa egna pratbubblor @@ -54,15 +54,16 @@ hud-settings-auto_camera = Automatisk kamera hud-settings-bow_zoom = Zooma in när du spänner bågen hud-settings-reset_gameplay = Återställ till standard hud-settings-view_distance = Visningsavstånd +hud-settings-entity_view_distance = Visningsavstånd för entiteter hud-settings-lod_distance = Detaljnivåsavstånd hud-settings-sprites_view_distance = Visningsavstånd för sprites -hud-settings-figures_view_distance = Visningsavstånd för entiteter +hud-settings-entities_detail_distance = Detaljavstånd för entiteter hud-settings-maximum_fps = Maximal bildhastighet hud-settings-background_fps = Bakgrundsbildhastighet hud-settings-present_mode = Presentationsläge -hud-settings-present_mode-fifo = Först in–först ut -hud-settings-present_mode-mailbox = Brevlåda -hud-settings-present_mode-immediate = Omedelbar +hud-settings-present_mode-vsync_capped = Vsync begränsad +hud-settings-present_mode-vsync_uncapped = Vsync obegränsad +hud-settings-present_mode-vsync_off = Vsync av hud-settings-fov = Bildvinkel (grader) hud-settings-gamma = Gamma hud-settings-exposure = Exponering diff --git a/assets/voxygen/i18n/sv_SE/hud/trade.ftl b/assets/voxygen/i18n/sv_SE/hud/trade.ftl index bafec0b5f7..41fdb56f64 100644 --- a/assets/voxygen/i18n/sv_SE/hud/trade.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/trade.ftl @@ -16,11 +16,16 @@ hud-trade-invite_sent = Bytesförfrågan har skickats till { $playername }. hud-trade-result-completed = Bytet har genomförts. hud-trade-result-declined = Bytet har avbrutits. hud-trade-result-nospace = Inte tillräckligt mycket utrymme för att genomföra bytet. -hud-trade-buy_price = Köpepris -hud-trade-sell_price = Försäljningspris -hud-trade-coin = mynt +hud-trade-buy = Buy Price: { $coin_num -> + [one] ett mynt + *[other] { $coin_formatted } mynt +} +hud-trade-sell = Sell Price: { $coin_num -> + [one] ett mynt. + *[other] { $coin_formatted } mynt +} hud-trade-tooltip_hint_1 = hud-trade-tooltip_hint_2 = hud-trade-your_offer = Ditt erbjudande hud-trade-their_offer = Deras erbjudande -hud-trade-amount_input = Välj ett föremål \ No newline at end of file +hud-trade-amount_input = Välj ett föremål diff --git a/assets/voxygen/i18n/sv_SE/npc.ftl b/assets/voxygen/i18n/sv_SE/npc.ftl index 4f2b670342..b12d2eff2b 100644 --- a/assets/voxygen/i18n/sv_SE/npc.ftl +++ b/assets/voxygen/i18n/sv_SE/npc.ftl @@ -67,8 +67,14 @@ npc-speech-villager_stable = .a2 = En underbar dag för en skogspromenad! npc-speech-villager_decline_trade = .a0 = Tyvärr har jag inget till salu. - .a1 = En vaddå? Tror inte jag har något av intresse för dig. - .a2 = Mitt hus är mitt och jag tänker inte flytta för allt i världen. + .a1 = Tyvärr, jag har inget att byta. + .a2 = En vaddå? Tror inte jag har något av intresse för dig. + .a3 = Byta? Som om jag har något som skulle intressera dig. + .a4 = Mitt hus är mitt och jag tänker inte flytta för allt i världen. + .a5 = Mitt hus är mitt och jag skulle inte byta det mot något. +npc-speech-villager_busy = + .a0 = Ursäkta, jag kan inte prata med dig just nu. + .a1 = Vi får prata senare, jag är upptagen. npc-speech-merchant_advertisement = .a0 = Kan jag fresta med någon av dessa fina varor? .a1 = Skulle du vilja köpa någonting? From 17cd06bc5eedff9878d560071ab57dce94847c30 Mon Sep 17 00:00:00 2001 From: Dong Date: Fri, 2 Sep 2022 17:51:18 +0200 Subject: [PATCH 156/854] Update Spanish translation --- assets/voxygen/i18n/es_ES/hud/ability.ftl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 assets/voxygen/i18n/es_ES/hud/ability.ftl diff --git a/assets/voxygen/i18n/es_ES/hud/ability.ftl b/assets/voxygen/i18n/es_ES/hud/ability.ftl new file mode 100644 index 0000000000..f5ea2422fb --- /dev/null +++ b/assets/voxygen/i18n/es_ES/hud/ability.ftl @@ -0,0 +1,14 @@ +common-abilities-debug-possess = Flecha Poseedora + .desc = Dispara una flecha venenosa. Te permite controlar a tu objetivo. +common-abilities-sword-spin = Torbellino + .desc = Avanzas hacia delante mientras giras con tu espada. +common-abilities-axe-leap = Salto de Hacha + .desc = Un salto de tajo a la posición del cursor. +common-abilities-hammer-leap = Golpe de la Perdición + .desc = Un ataque en área con retroceso. Salta a la posición del cursor. +common-abilities-bow-shotgun = Ráfaga + .desc = Lanza una ráfaga de flechas. +common-abilities-staff-fireshockwave = Anillo de Fuego + .desc = Incendia el suelo con una ardiente onda de choque. +common-abilities-sceptre-wardingaura = Aura de Protección + .desc = Protege a tus aliados de ataques enemigos. From 6a1e5609067da44935e42ba7d57c88159d407ec2 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Fri, 2 Sep 2022 18:21:24 +0100 Subject: [PATCH 157/854] Switched to median dt for stable dt --- common/src/clock.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/common/src/clock.rs b/common/src/clock.rs index 4654fa6065..e5231100a9 100644 --- a/common/src/clock.rs +++ b/common/src/clock.rs @@ -77,16 +77,21 @@ impl Clock { pub fn dt(&self) -> Duration { self.last_dt } pub fn get_stable_dt(&self) -> Duration { - let stable_dt = Duration::from_secs_f32( - self.last_dts - .iter() - .skip(self.last_dts.len() - NUMBER_OF_DELTAS_COMPARED) - .min() - .map_or(self.last_dt.as_secs_f32(), |t| t.into_inner()), - ); - if self.last_dts.len() >= NUMBER_OF_DELTAS_COMPARED && self.last_dt > 2 * stable_dt { - tracing::trace!(?self.last_dt, ?self.total_tick_time, "lag spike detected, unusually slow tick"); - stable_dt + if self.last_dts.len() >= NUMBER_OF_DELTAS_COMPARED { + // Take the median of the last few tick times + let mut dts = [0.0; NUMBER_OF_DELTAS_COMPARED]; + for (i, dt) in self.last_dts.iter().rev().take(NUMBER_OF_DELTAS_COMPARED).enumerate() { + dts[i] = **dt; + } + dts.sort_by_key(|x| ordered_float::OrderedFloat(*x)); + let stable_dt = Duration::from_secs_f32(dts[NUMBER_OF_DELTAS_COMPARED / 2]); + + if self.last_dt > 2 * stable_dt { + tracing::trace!(?self.last_dt, ?self.total_tick_time, "lag spike detected, unusually slow tick"); + stable_dt + } else { + self.last_dt + } } else { self.last_dt } From b9586673d5dec48d04e76ede682aa3756b35c575 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Mon, 3 Jan 2022 08:54:16 +0300 Subject: [PATCH 158/854] build(nix): update flake to use latest nix-cargo-integration --- flake.lock | 124 +++++++++++++++++++++++++++++++++++++++++++++-------- flake.nix | 35 +++------------ 2 files changed, 112 insertions(+), 47 deletions(-) diff --git a/flake.lock b/flake.lock index 196d6d02bb..f640c8e195 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,35 @@ { "nodes": { - "devshell": { + "crane": { + "flake": false, "locked": { - "lastModified": 1625086391, - "narHash": "sha256-IpNPv1v8s4L3CoxhwcgZIitGpcrnNgnj09X7TA0QV3k=", + "lastModified": 1644785799, + "narHash": "sha256-VpAJO1L0XeBvtCuNGK4IDKp6ENHIpTrlaZT7yfBCvwo=", + "owner": "ipetkov", + "repo": "crane", + "rev": "fc7a94f841347c88f2cb44217b2a3faa93e2a0b2", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "devshell": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nci", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1650900878, + "narHash": "sha256-qhNncMBSa9STnhiLfELEQpYC1L4GrYHNIzyCZ/pilsI=", "owner": "numtide", "repo": "devshell", - "rev": "4b5ac7cf7d9a1cc60b965bb51b59922f2210cbc7", + "rev": "d97df53b5ddaa1cfbea7cddbd207eb2634304733", "type": "github" }, "original": { @@ -15,20 +38,84 @@ "type": "github" } }, - "nixCargoIntegration": { + "dream2nix": { "inputs": { - "devshell": "devshell", - "nixpkgs": [ + "alejandra": [ + "nci", "nixpkgs" ], + "crane": "crane", + "flake-utils-pre-commit": [ + "nci", + "nixpkgs" + ], + "gomod2nix": [ + "nci", + "nixpkgs" + ], + "mach-nix": [ + "nci", + "nixpkgs" + ], + "nixpkgs": [ + "nci", + "nixpkgs" + ], + "node2nix": [ + "nci", + "nixpkgs" + ], + "poetry2nix": [ + "nci", + "nixpkgs" + ], + "pre-commit-hooks": [ + "nci", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1651053461, + "narHash": "sha256-OvIa0M9gHl3Vw5Nkiq3G9xmvbv5qjv4sDrVKfcpFQRI=", + "owner": "nix-community", + "repo": "dream2nix", + "rev": "1c8faf4882e91eb984d9dad18659ddeb29958b14", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "dream2nix", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1642700792, + "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nci": { + "inputs": { + "devshell": "devshell", + "dream2nix": "dream2nix", + "nixpkgs": "nixpkgs", "rustOverlay": "rustOverlay" }, "locked": { - "lastModified": 1627940369, - "narHash": "sha256-KtY837WKsX9B/pIKFDKzN0wl1t3et1JZjMjGa7SAZxI=", + "lastModified": 1651126504, + "narHash": "sha256-OUt4rJ3ld+e7nz/3rkcDSjAEk7qi9h3pRCHowSv7Vac=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "fac8518469e226db4805ff80788979c847b0c322", + "rev": "efcdcb01038d847e66ba55e23faa9242970663d7", "type": "github" }, "original": { @@ -39,34 +126,33 @@ }, "nixpkgs": { "locked": { - "lastModified": 1627814220, - "narHash": "sha256-P+MDgdZw2CBk9X1ZZaUgHgN+32pTfLFf3XVIBOXirI4=", + "lastModified": 1651007983, + "narHash": "sha256-GNay7yDPtLcRcKCNHldug85AhAvBpTtPEJWSSDYBw8U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ab5b6828af26215bf2646c31961da5d3749591ef", + "rev": "e10da1c7f542515b609f8dfbcf788f3d85b14936", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "root": { "inputs": { - "nixCargoIntegration": "nixCargoIntegration", - "nixpkgs": "nixpkgs" + "nci": "nci" } }, "rustOverlay": { "flake": false, "locked": { - "lastModified": 1627870491, - "narHash": "sha256-0Myg04QOIcTN1RhgfRNx0i/iCRyVyf/Z6rJxZUmot5k=", + "lastModified": 1651114831, + "narHash": "sha256-fbztwl7iIvnFwcm/u0Eigcvkl6uH97tEXUJqizbyl1k=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "71d825269cfaa30605d058bd92381be9af87b0be", + "rev": "89e658c1c8d81eeaad78750ab29975594f57eda2", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 8f121f9fda..64ecb4a6a8 100644 --- a/flake.nix +++ b/flake.nix @@ -1,31 +1,17 @@ { description = "Flake providing Veloren, a multiplayer voxel RPG written in Rust."; - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; - nixCargoIntegration = { - url = "github:yusdacra/nix-cargo-integration"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; + inputs.nci.url = "github:yusdacra/nix-cargo-integration"; outputs = inputs: - inputs.nixCargoIntegration.lib.makeOutputs { + inputs.nci.lib.makeOutputs { root = ./.; - buildPlatform = "crate2nix"; defaultOutputs = { package = "veloren-voxygen"; app = "veloren-voxygen"; }; overrides = { - build = common: prev: { - runTests = !prev.release && prev.runTests; - rootFeatures = - if prev.release && common.cargoPkg.name == "veloren-voxygen" - then [ "default-publish" ] - else prev.rootFeatures; - }; - crateOverrides = common: prev: + crates = common: prev: let pkgs = common.pkgs; lib = common.lib; @@ -64,15 +50,6 @@ ''; in { - # veloren-world = oldAttrs: { - # crateBin = lib.filter (bin: bin.name != "chunk_compression_benchmarks") oldAttrs.crateBin; - # }; - veloren-client = oldAttrs: { - crateBin = lib.filter (bin: bin.name != "bot") oldAttrs.crateBin; - }; - veloren-voxygen-i18n = oldAttrs: { - crateBin = lib.filter (bin: bin.name != "i18n-check") oldAttrs.crateBin; - }; veloren-common = oldAttrs: { # Disable `git-lfs` check here since we check it ourselves # We have to include the command output here, otherwise Nix won't run it @@ -80,9 +57,9 @@ # Declare env values here so that `common/build.rs` sees them NIX_GIT_HASH = prettyRev; NIX_GIT_TAG = tag; - crateBin = lib.filter (bin: bin.name != "csv_export" && bin.name != "csv_import" && bin.name != "recipe_graphviz") oldAttrs.crateBin; }; veloren-voxygen = oldAttrs: { + nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [ pkgs.makeWrapper ]; VELOREN_USERDATA_STRATEGY = "system"; preConfigure = '' substituteInPlace src/audio/soundcache.rs \ @@ -99,10 +76,12 @@ ''; }; veloren-server-cli = oldAttrs: { + nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [ pkgs.makeWrapper ]; VELOREN_USERDATA_STRATEGY = "system"; postInstall = '' if [ -f $out/bin/veloren-server-cli ]; then - wrapProgram $out/bin/veloren-server-cli --set VELOREN_ASSETS ${veloren-assets} + wrapProgram $out/bin/veloren-server-cli \ + --set VELOREN_ASSETS ${veloren-assets} fi ''; }; From a0b7446f58ccbc21cbcc01d0eca900891386f35d Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 28 Apr 2022 20:35:27 +0300 Subject: [PATCH 159/854] build(nix): format nix files, fix git lfs error --- flake.nix | 130 ++++++++++++++++++++++++------------------------ nix/default.nix | 3 +- nix/shell.nix | 3 +- nix/utils.nix | 84 +++++++++++++++++++------------ 4 files changed, 121 insertions(+), 99 deletions(-) diff --git a/flake.nix b/flake.nix index 64ecb4a6a8..881f50223d 100644 --- a/flake.nix +++ b/flake.nix @@ -11,81 +11,83 @@ app = "veloren-voxygen"; }; overrides = { - crates = common: prev: - let - pkgs = common.pkgs; - lib = common.lib; + crates = common: prev: let + pkgs = common.pkgs; + lib = common.lib; - gitLfsCheckFile = ./assets/voxygen/background/bg_main.jpg; - utils = import ./nix/utils.nix { inherit pkgs; }; + gitLfsCheckFile = ./assets/voxygen/background/bg_main.jpg; + utils = import ./nix/utils.nix {inherit pkgs;}; - sourceInfo = - if inputs.self.sourceInfo ? rev - then inputs.self.sourceInfo // { + sourceInfo = + if inputs.self.sourceInfo ? rev + then + inputs.self.sourceInfo + // { # Tag would have to be set manually for stable releases flake # because there's currently no way to get the tag via the interface. # tag = v0.9.0; } - else (throw "Can't get revision because the git tree is dirty"); + else (throw "Can't get revision because the git tree is dirty"); - prettyRev = with sourceInfo; builtins.substring 0 8 rev + "/" + utils.dateTimeFormat lastModified; + prettyRev = with sourceInfo; builtins.substring 0 8 rev + "/" + utils.dateTimeFormat lastModified; - tag = with sourceInfo; - if sourceInfo ? tag - then sourceInfo.tag - else ""; + tag = with sourceInfo; + if sourceInfo ? tag + then sourceInfo.tag + else ""; - # If gitTag has a tag (meaning the commit we are on is a *release*), use - # it as version, else: just use the prettified hash we have, if we don't - # have it the build fails. - # Must be in format f4987672/2020-12-10-12:00 - version = - if tag != "" then tag - else if prettyRev != "" then prettyRev - else throw "Need a tag or pretty revision in order to determine version"; + # If gitTag has a tag (meaning the commit we are on is a *release*), use + # it as version, else: just use the prettified hash we have, if we don't + # have it the build fails. + # Must be in format f4987672/2020-12-10-12:00 + version = + if tag != "" + then tag + else if prettyRev != "" + then prettyRev + else throw "Need a tag or pretty revision in order to determine version"; - veloren-assets = pkgs.runCommand "makeAssetsDir" { } '' - mkdir $out - ln -sf ${./assets} $out/assets - ''; - in - { - veloren-common = oldAttrs: { - # Disable `git-lfs` check here since we check it ourselves - # We have to include the command output here, otherwise Nix won't run it - DISABLE_GIT_LFS_CHECK = utils.isGitLfsSetup gitLfsCheckFile; - # Declare env values here so that `common/build.rs` sees them - NIX_GIT_HASH = prettyRev; - NIX_GIT_TAG = tag; - }; - veloren-voxygen = oldAttrs: { - nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [ pkgs.makeWrapper ]; - VELOREN_USERDATA_STRATEGY = "system"; - preConfigure = '' - substituteInPlace src/audio/soundcache.rs \ - --replace \ - "../../../assets/voxygen/audio/null.ogg" \ - "${./assets/voxygen/audio/null.ogg}" - ''; - postInstall = '' - if [ -f $out/bin/veloren-voxygen ]; then - wrapProgram $out/bin/veloren-voxygen \ - --set VELOREN_ASSETS ${veloren-assets} \ - --set LD_LIBRARY_PATH ${lib.makeLibraryPath common.runtimeLibs} - fi - ''; - }; - veloren-server-cli = oldAttrs: { - nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [ pkgs.makeWrapper ]; - VELOREN_USERDATA_STRATEGY = "system"; - postInstall = '' - if [ -f $out/bin/veloren-server-cli ]; then - wrapProgram $out/bin/veloren-server-cli \ - --set VELOREN_ASSETS ${veloren-assets} - fi - ''; - }; + veloren-assets = pkgs.runCommand "makeAssetsDir" {} '' + mkdir $out + ln -sf ${./assets} $out/assets + ''; + in { + veloren-common = oldAttrs: { + # Disable `git-lfs` check here since we check it ourselves + # We have to include the command output here, otherwise Nix won't run it + DISABLE_GIT_LFS_CHECK = utils.isGitLfsSetup gitLfsCheckFile; + # Declare env values here so that `common/build.rs` sees them + NIX_GIT_HASH = prettyRev; + NIX_GIT_TAG = tag; }; + veloren-voxygen = oldAttrs: { + nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; + VELOREN_USERDATA_STRATEGY = "system"; + preConfigure = '' + substituteInPlace src/audio/soundcache.rs \ + --replace \ + "../../../assets/voxygen/audio/null.ogg" \ + "${./assets/voxygen/audio/null.ogg}" + ''; + postInstall = '' + if [ -f $out/bin/veloren-voxygen ]; then + wrapProgram $out/bin/veloren-voxygen \ + --set VELOREN_ASSETS ${veloren-assets} \ + --set LD_LIBRARY_PATH ${lib.makeLibraryPath common.runtimeLibs} + fi + ''; + }; + veloren-server-cli = oldAttrs: { + nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; + VELOREN_USERDATA_STRATEGY = "system"; + postInstall = '' + if [ -f $out/bin/veloren-server-cli ]; then + wrapProgram $out/bin/veloren-server-cli \ + --set VELOREN_ASSETS ${veloren-assets} + fi + ''; + }; + }; }; }; } diff --git a/nix/default.nix b/nix/default.nix index 29d4c3807f..c940ee6407 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -3,4 +3,5 @@ url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; sha256 = "sha256:0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; }) - { src = ../.; }).defaultNix + {src = ../.;}) +.defaultNix diff --git a/nix/shell.nix b/nix/shell.nix index c68e85b60e..812b45462a 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -3,4 +3,5 @@ url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; sha256 = "sha256:0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; }) - { src = ../.; }).shellNix + {src = ../.;}) +.shellNix diff --git a/nix/utils.nix b/nix/utils.nix index dd47bc3c21..d815af63b8 100644 --- a/nix/utils.nix +++ b/nix/utils.nix @@ -1,15 +1,14 @@ -{ pkgs }: { - isGitLfsSetup = checkFile: - let - gitLfsCheckOutput = - builtins.readFile (pkgs.runCommand "gitLfsCheck" { } '' - ([ "$(${pkgs.file}/bin/file --mime-type ${checkFile})" = "${checkFile}: image/jpeg" ] && printf "0" || printf "1") > $out - ''); - in - if gitLfsCheckOutput == "0" then - true +{pkgs}: { + isGitLfsSetup = checkFile: let + gitLfsCheckOutput = builtins.readFile (pkgs.runCommand "gitLfsCheck" {} '' + result="$(${pkgs.file}/bin/file --mime-type ${checkFile})" + (if [ "$result" = "${checkFile}: image/jpeg" ]; then printf "0"; else printf "1"; fi) > $out + ''); + in + if gitLfsCheckOutput == "0" + then true else - abort '' + throw '' Git Large File Storage (`git-lfs`) has not been set up correctly. Most common reasons: - `git-lfs` was not installed before cloning this repository. @@ -21,28 +20,47 @@ ''; # Format number of seconds in the Unix epoch as %Y-%m-%d-%H:%M. - dateTimeFormat = t: - let - rem = x: y: x - x / y * y; - days = t / 86400; - secondsInDay = rem t 86400; - hours = secondsInDay / 3600; - minutes = (rem secondsInDay 3600) / 60; - seconds = rem t 60; + dateTimeFormat = t: let + rem = x: y: x - x / y * y; + days = t / 86400; + secondsInDay = rem t 86400; + hours = secondsInDay / 3600; + minutes = (rem secondsInDay 3600) / 60; + seconds = rem t 60; - # Courtesy of https://stackoverflow.com/a/32158604. - z = days + 719468; - era = (if z >= 0 then z else z - 146096) / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = mp + (if mp < 10 then 3 else -9); - y' = y + (if m <= 2 then 1 else 0); + # Courtesy of https://stackoverflow.com/a/32158604. + z = days + 719468; + era = + ( + if z >= 0 + then z + else z - 146096 + ) + / 146097; + doe = z - era * 146097; + yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + y = yoe + era * 400; + doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + mp = (5 * doy + 2) / 153; + d = doy - (153 * mp + 2) / 5 + 1; + m = + mp + + ( + if mp < 10 + then 3 + else -9 + ); + y' = + y + + ( + if m <= 2 + then 1 + else 0 + ); - pad = s: if builtins.stringLength s < 2 then "0" + s else s; - in - "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}"; + pad = s: + if builtins.stringLength s < 2 + then "0" + s + else s; + in "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}"; } From 1302b7da77027e2591cd7ca1e06dbef0058824f0 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 28 Apr 2022 20:44:17 +0300 Subject: [PATCH 160/854] docs(nix): update formatting instructions --- nix/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/nix/README.md b/nix/README.md index e4482b3e8d..cb94bfb186 100644 --- a/nix/README.md +++ b/nix/README.md @@ -190,11 +190,10 @@ Modify the relevant `rev` field in `flake.lock` to what you need - you can use ` ## Formatting -Use [nixpkgs-fmt](https://github.com/nix-community/nixpkgs-fmt) to format files. +Use [alejandra](https://github.com/kamadorueda/alejandra) to format files. To format every Nix file: ```shell -nixpkgs-fmt flake.nix nix/*.nix -# or -nixpkgs-fmt **/**.nix +# From repository root +alejandra . ``` From 2afcc7195b0d4821521ad4f9c9b8414d853acb9f Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 28 Apr 2022 21:35:26 +0300 Subject: [PATCH 161/854] build(nix): fix lib not found error --- flake.lock | 6 +++--- flake.nix | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index f640c8e195..c4744e093d 100644 --- a/flake.lock +++ b/flake.lock @@ -111,11 +111,11 @@ "rustOverlay": "rustOverlay" }, "locked": { - "lastModified": 1651126504, - "narHash": "sha256-OUt4rJ3ld+e7nz/3rkcDSjAEk7qi9h3pRCHowSv7Vac=", + "lastModified": 1651170881, + "narHash": "sha256-Or41btQ8PfpqCROCtUGoGrDL7SZXZroGtaVdtsyf0lQ=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "efcdcb01038d847e66ba55e23faa9242970663d7", + "rev": "01c8ca0b106b8849847f5fde64627fa33d89a537", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 881f50223d..a95be2b796 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,7 @@ overrides = { crates = common: prev: let pkgs = common.pkgs; - lib = common.lib; + lib = pkgs.lib; gitLfsCheckFile = ./assets/voxygen/background/bg_main.jpg; utils = import ./nix/utils.nix {inherit pkgs;}; From 0ffffa8496689409c1c04a1dfaba3511a99e8bea Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 28 Apr 2022 22:28:00 +0300 Subject: [PATCH 162/854] build(nix): fix file path for substitute --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index a95be2b796..2256317b06 100644 --- a/flake.nix +++ b/flake.nix @@ -64,7 +64,7 @@ nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; VELOREN_USERDATA_STRATEGY = "system"; preConfigure = '' - substituteInPlace src/audio/soundcache.rs \ + substituteInPlace voxygen/src/audio/soundcache.rs \ --replace \ "../../../assets/voxygen/audio/null.ogg" \ "${./assets/voxygen/audio/null.ogg}" From 99cb326e54a9efd8f3fd20222f80745a6fbc7d93 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 19 May 2022 00:47:32 +0300 Subject: [PATCH 163/854] chore(nix): update flake lock --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index c4744e093d..d62e4a0b82 100644 --- a/flake.lock +++ b/flake.lock @@ -25,11 +25,11 @@ ] }, "locked": { - "lastModified": 1650900878, - "narHash": "sha256-qhNncMBSa9STnhiLfELEQpYC1L4GrYHNIzyCZ/pilsI=", + "lastModified": 1652861301, + "narHash": "sha256-k7MboNn4YUoyKsyJMMnJh20jKQHoORn7F+KsWG4cxNo=", "owner": "numtide", "repo": "devshell", - "rev": "d97df53b5ddaa1cfbea7cddbd207eb2634304733", + "rev": "95713285f88af14cb96cb18430d478da7b064e93", "type": "github" }, "original": { @@ -75,11 +75,11 @@ ] }, "locked": { - "lastModified": 1651053461, - "narHash": "sha256-OvIa0M9gHl3Vw5Nkiq3G9xmvbv5qjv4sDrVKfcpFQRI=", + "lastModified": 1652903532, + "narHash": "sha256-lEDDZdgz053yryoj8AE0EldfDJSWNl/JIYOnL/cdods=", "owner": "nix-community", "repo": "dream2nix", - "rev": "1c8faf4882e91eb984d9dad18659ddeb29958b14", + "rev": "ce73e1a256a297ab056ef5389227474cd34c0518", "type": "github" }, "original": { @@ -111,11 +111,11 @@ "rustOverlay": "rustOverlay" }, "locked": { - "lastModified": 1651170881, - "narHash": "sha256-Or41btQ8PfpqCROCtUGoGrDL7SZXZroGtaVdtsyf0lQ=", + "lastModified": 1652903917, + "narHash": "sha256-osCp4hN7jEONs494YtjNV2P16KPcb/zyxg74CYrConE=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "01c8ca0b106b8849847f5fde64627fa33d89a537", + "rev": "c634e01d11fab71c3e62050c59823ff8a55df84a", "type": "github" }, "original": { @@ -126,11 +126,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1651007983, - "narHash": "sha256-GNay7yDPtLcRcKCNHldug85AhAvBpTtPEJWSSDYBw8U=", + "lastModified": 1652659998, + "narHash": "sha256-FqNrXC1EE6U2RACwXBlsAvg1lqQGLYpuYb6+W3DL9vA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e10da1c7f542515b609f8dfbcf788f3d85b14936", + "rev": "1d7db1b9e4cf1ee075a9f52e5c36f7b9f4207502", "type": "github" }, "original": { @@ -148,11 +148,11 @@ "rustOverlay": { "flake": false, "locked": { - "lastModified": 1651114831, - "narHash": "sha256-fbztwl7iIvnFwcm/u0Eigcvkl6uH97tEXUJqizbyl1k=", + "lastModified": 1652841650, + "narHash": "sha256-hp/WtX369mx38h/J7/q8A8piC/8XkzGMSW71JlXgzGM=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "89e658c1c8d81eeaad78750ab29975594f57eda2", + "rev": "65674e95c82955cda97f6c588d022e01fa72b976", "type": "github" }, "original": { From 5b901d9775bcff043ab42557651270430bddce71 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Tue, 30 Aug 2022 19:42:23 +0300 Subject: [PATCH 164/854] build(nix): update flake lock, fix stuff --- dream2nix-packages/dream-lock.json | 9176 ++++++++++++++++++++++++++++ flake.lock | 71 +- flake.nix | 38 +- voxygen/Cargo.toml | 1 - 4 files changed, 9237 insertions(+), 49 deletions(-) create mode 100644 dream2nix-packages/dream-lock.json diff --git a/dream2nix-packages/dream-lock.json b/dream2nix-packages/dream-lock.json new file mode 100644 index 0000000000..a3bb26b76c --- /dev/null +++ b/dream2nix-packages/dream-lock.json @@ -0,0 +1,9176 @@ +{ + "_generic": { + "defaultPackage": "veloren-common", + "invalidationHash": "bb5c4854ceaf0d1bc81a38495819ab4b76ed2b878d45eb30c64e6a4ae5e9a313", + "location": "", + "packages": { + "veloren-client": "0.13.0", + "veloren-common": "0.10.0", + "veloren-common-assets": "0.10.0", + "veloren-common-base": "0.10.0", + "veloren-common-ecs": "0.10.0", + "veloren-common-frontend": "0.10.0", + "veloren-common-net": "0.10.0", + "veloren-common-state": "0.10.0", + "veloren-common-systems": "0.10.0", + "veloren-network": "0.3.0", + "veloren-network-protocol": "0.6.1", + "veloren-plugin-api": "0.1.0", + "veloren-plugin-derive": "0.1.0", + "veloren-plugin-rt": "0.1.0", + "veloren-server": "0.13.0", + "veloren-server-cli": "0.13.0", + "veloren-voxygen": "0.13.0", + "veloren-voxygen-anim": "0.10.0", + "veloren-voxygen-anim-dyn": "0.10.0", + "veloren-voxygen-dynlib": "0.1.0", + "veloren-voxygen-egui": "0.9.0", + "veloren-voxygen-egui-dyn": "0.9.0", + "veloren-voxygen-i18n": "0.13.0", + "veloren-world": "0.10.0" + }, + "sourcesAggregatedHash": null, + "subsystem": "rust" + }, + "_subsystem": { + "gitSources": [ + { + "sha": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a", + "type": "rev", + "url": "https://gitlab.com/veloren/auth.git", + "value": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a" + }, + { + "sha": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", + "type": "branch", + "url": "https://gitlab.com/veloren/conrod.git", + "value": "copypasta_0.7" + }, + { + "sha": "63a002c6a9b6c016e45806dd065864431caab621", + "type": "rev", + "url": "https://github.com/hasenbanck/egui_wgpu_backend.git", + "value": "63a002c6a9b6c016e45806dd065864431caab621" + }, + { + "sha": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", + "type": "branch", + "url": "https://github.com/juliancoffee/fluent-rs.git", + "value": "patched" + }, + { + "sha": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "rev", + "url": "https://github.com/gfx-rs/gfx", + "value": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521" + }, + { + "sha": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "tag", + "url": "https://github.com/Imberflur/iced", + "value": "winit-0.25" + }, + { + "sha": "1ae010ca032a57dfe0ba01d4346a3b03bde36de0", + "type": "branch", + "url": "https://gitlab.com/Frinksy/keyboard-keynames.git", + "value": "develop" + }, + { + "sha": "057d03ad86f18e3bb3866b20901d8d4e892dd3d6", + "type": "tag", + "url": "https://github.com/gfx-rs/naga", + "value": "gfx-25" + }, + { + "sha": "df6b37872f3586ac3b21d08b56c8ec7cd92fb172", + "type": "rev", + "url": "https://github.com/xMAC94x/portpicker-rs", + "value": "df6b37872f3586ac3b21d08b56c8ec7cd92fb172" + }, + { + "sha": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", + "type": "rev", + "url": "https://gitlab.com/veloren/refinery.git", + "value": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e" + }, + { + "sha": "54b841fab6cfdb38e8dc1382176e965787964b4c", + "type": "branch", + "url": "https://github.com/fdehau/tui-rs.git", + "value": "paragraph-scroll" + }, + { + "sha": "84d5cb65841d46599a986c5477341bea4456be26", + "type": "rev", + "url": "https://github.com/yoanlcq/vek.git", + "value": "84d5cb65841d46599a986c5477341bea4456be26" + }, + { + "sha": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", + "type": "rev", + "url": "https://github.com/gfx-rs/wgpu.git", + "value": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" + }, + { + "sha": "b156eb145bc223386ef344860d9b33b3c181650c", + "type": "tag", + "url": "https://github.com/Imberflur/wgpu-profiler", + "value": "wgpu-0.8" + }, + { + "sha": "8f615dd6cd90a4ab77c45627830dde49b592b9b5", + "type": "rev", + "url": "https://github.com/Frinksy/rust-xkbcommon-sys.git", + "value": "8f615dd6cd90a4ab77c45627830dde49b592b9b5" + } + ], + "relPathReplacements": { + "veloren-client": { + "0.13.0": {} + }, + "veloren-common": { + "0.10.0": {} + }, + "veloren-common-assets": { + "0.10.0": {} + }, + "veloren-common-base": { + "0.10.0": {} + }, + "veloren-common-ecs": { + "0.10.0": {} + }, + "veloren-common-frontend": { + "0.10.0": {} + }, + "veloren-common-net": { + "0.10.0": {} + }, + "veloren-common-state": { + "0.10.0": {} + }, + "veloren-common-systems": { + "0.10.0": {} + }, + "veloren-network": { + "0.3.0": {} + }, + "veloren-network-protocol": { + "0.6.1": {} + }, + "veloren-plugin-api": { + "0.1.0": {} + }, + "veloren-plugin-derive": { + "0.1.0": {} + }, + "veloren-plugin-rt": { + "0.1.0": {} + }, + "veloren-server": { + "0.13.0": {} + }, + "veloren-server-cli": { + "0.13.0": {} + }, + "veloren-voxygen": { + "0.13.0": {} + }, + "veloren-voxygen-anim": { + "0.10.0": {} + }, + "veloren-voxygen-anim-dyn": { + "0.10.0": {} + }, + "veloren-voxygen-dynlib": { + "0.1.0": {} + }, + "veloren-voxygen-egui": { + "0.9.0": {} + }, + "veloren-voxygen-egui-dyn": { + "0.9.0": {} + }, + "veloren-voxygen-i18n": { + "0.13.0": {} + }, + "veloren-world": { + "0.10.0": {} + } + } + }, + "cyclicDependencies": {}, + "dependencies": { + "ab_glyph": { + "0.2.15": [ + [ "ab_glyph_rasterizer", "0.1.5" ], + [ "owned_ttf_parser", "0.15.0" ] + ] + }, + "addr2line": { + "0.17.0": [ + [ "gimli", "0.26.1" ] + ] + }, + "ahash": { + "0.3.8": [ + [ "const-random", "0.1.13" ] + ], + "0.7.6": [ + [ "getrandom", "0.2.6" ], + [ "once_cell", "1.10.0" ], + [ "version_check", "0.9.4" ] + ] + }, + "aho-corasick": { + "0.7.18": [ + [ "memchr", "2.4.1" ] + ] + }, + "alsa": { + "0.6.0": [ + [ "alsa-sys", "0.3.1" ], + [ "bitflags", "1.3.2" ], + [ "libc", "0.2.121" ], + [ "nix", "0.23.1" ] + ] + }, + "alsa-sys": { + "0.3.1": [ + [ "libc", "0.2.121" ], + [ "pkg-config", "0.3.25" ] + ] + }, + "andrew": { + "0.3.1": [ + [ "bitflags", "1.3.2" ], + [ "rusttype", "0.9.2" ], + [ "walkdir", "2.3.2" ], + [ "xdg", "2.4.1" ], + [ "xml-rs", "0.8.4" ] + ] + }, + "ansi-parser": { + "0.8.0": [ + [ "heapless", "0.5.6" ], + [ "nom", "4.2.3" ] + ] + }, + "ansi_term": { + "0.12.1": [ + [ "winapi", "0.3.9" ] + ] + }, + "app_dirs2": { + "2.5.2": [ + [ "jni", "0.19.0" ], + [ "ndk-context", "0.1.0" ], + [ "winapi", "0.3.9" ], + [ "xdg", "2.4.1" ] + ] + }, + "approx": { + "0.3.2": [ + [ "num-traits", "0.2.14" ] + ], + "0.4.0": [ + [ "num-traits", "0.2.14" ] + ], + "0.5.1": [ + [ "num-traits", "0.2.14" ] + ] + }, + "arr_macro": { + "0.1.3": [ + [ "arr_macro_impl", "0.1.3" ], + [ "proc-macro-hack", "0.5.19" ] + ] + }, + "arr_macro_impl": { + "0.1.3": [ + [ "proc-macro-hack", "0.5.19" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "arrayvec": { + "0.5.2": [ + [ "serde", "1.0.136" ] + ] + }, + "as-slice": { + "0.1.5": [ + [ "generic-array", "0.12.4" ], + [ "generic-array", "0.13.3" ], + [ "generic-array", "0.14.5" ], + [ "stable_deref_trait", "1.2.0" ] + ] + }, + "ash": { + "0.32.1": [ + [ "libloading", "0.7.3" ] + ] + }, + "assets_manager": { + "0.8.1": [ + [ "ab_glyph", "0.2.15" ], + [ "ahash", "0.7.6" ], + [ "bincode", "1.3.3" ], + [ "crossbeam-channel", "0.5.4" ], + [ "log", "0.4.16" ], + [ "notify", "5.0.0-pre.15" ], + [ "parking_lot", "0.12.0" ], + [ "ron", "0.7.0" ], + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ] + ] + }, + "async-channel": { + "1.6.1": [ + [ "concurrent-queue", "1.2.2" ], + [ "event-listener", "2.5.2" ], + [ "futures-core", "0.3.21" ] + ] + }, + "async-trait": { + "0.1.53": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "atomicwrites": { + "0.3.1": [ + [ "tempfile", "3.3.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "atty": { + "0.2.14": [ + [ "hermit-abi", "0.1.19" ], + [ "libc", "0.2.121" ], + [ "winapi", "0.3.9" ] + ] + }, + "auth-common": { + "0.1.0": [ + [ "rand", "0.8.5" ], + [ "serde", "1.0.136" ], + [ "uuid", "0.8.2" ] + ] + }, + "authc": { + "1.0.0": [ + [ "auth-common", "0.1.0" ], + [ "fxhash", "0.2.1" ], + [ "hex", "0.3.2" ], + [ "http", "0.2.6" ], + [ "hyper", "0.14.18" ], + [ "hyper-rustls", "0.22.1" ], + [ "rust-argon2", "0.8.3" ], + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "uuid", "0.8.2" ] + ] + }, + "backtrace": { + "0.3.65": [ + [ "addr2line", "0.17.0" ], + [ "cc", "1.0.73" ], + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "miniz_oxide", "0.5.1" ], + [ "object", "0.28.3" ], + [ "rustc-demangle", "0.1.21" ] + ] + }, + "bincode": { + "1.3.3": [ + [ "serde", "1.0.136" ] + ] + }, + "bindgen": { + "0.56.0": [ + [ "bitflags", "1.3.2" ], + [ "cexpr", "0.4.0" ], + [ "clang-sys", "1.3.1" ], + [ "clap", "2.34.0" ], + [ "env_logger", "0.8.4" ], + [ "lazy_static", "1.4.0" ], + [ "lazycell", "1.3.0" ], + [ "log", "0.4.16" ], + [ "peeking_take_while", "0.1.2" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "regex", "1.5.5" ], + [ "rustc-hash", "1.1.0" ], + [ "shlex", "0.1.1" ], + [ "which", "3.1.1" ] + ] + }, + "bit-set": { + "0.5.2": [ + [ "bit-vec", "0.6.3" ] + ] + }, + "bitvec": { + "0.22.3": [ + [ "funty", "1.2.0" ], + [ "radium", "0.6.2" ], + [ "tap", "1.0.1" ], + [ "wyz", "0.4.0" ] + ] + }, + "blake2b_simd": { + "0.5.11": [ + [ "arrayref", "0.3.6" ], + [ "arrayvec", "0.5.2" ], + [ "constant_time_eq", "0.1.5" ] + ] + }, + "block-buffer": { + "0.10.2": [ + [ "generic-array", "0.14.5" ] + ] + }, + "bstr": { + "0.2.17": [ + [ "lazy_static", "1.4.0" ], + [ "memchr", "2.4.1" ], + [ "regex-automata", "0.1.10" ], + [ "serde", "1.0.136" ] + ] + }, + "bytecheck": { + "0.6.7": [ + [ "bytecheck_derive", "0.6.7" ], + [ "ptr_meta", "0.1.4" ] + ] + }, + "bytecheck_derive": { + "0.6.7": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "bytemuck": { + "1.9.1": [ + [ "bytemuck_derive", "1.1.0" ] + ] + }, + "bytemuck_derive": { + "1.1.0": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "calloop": { + "0.6.5": [ + [ "log", "0.4.16" ], + [ "nix", "0.18.0" ] + ] + }, + "cast": { + "0.2.7": [ + [ "rustc_version", "0.4.0" ] + ] + }, + "cc": { + "1.0.73": [ + [ "jobserver", "0.1.24" ] + ] + }, + "censor": { + "0.2.0": [ + [ "once_cell", "1.10.0" ] + ] + }, + "cexpr": { + "0.4.0": [ + [ "nom", "5.1.2" ] + ] + }, + "chrono": { + "0.4.19": [ + [ "libc", "0.2.121" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ], + [ "serde", "1.0.136" ], + [ "time", "0.1.44" ], + [ "winapi", "0.3.9" ] + ] + }, + "chrono-tz": { + "0.6.1": [ + [ "chrono", "0.4.19" ], + [ "chrono-tz-build", "0.0.2" ], + [ "phf", "0.10.1" ], + [ "serde", "1.0.136" ] + ] + }, + "chrono-tz-build": { + "0.0.2": [ + [ "parse-zoneinfo", "0.3.0" ], + [ "phf", "0.10.1" ], + [ "phf_codegen", "0.10.0" ] + ] + }, + "chumsky": { + "0.8.0": [ + [ "ahash", "0.3.8" ] + ] + }, + "clang-sys": { + "1.3.1": [ + [ "glob", "0.3.0" ], + [ "libc", "0.2.121" ], + [ "libloading", "0.7.3" ] + ] + }, + "clap": { + "2.34.0": [ + [ "ansi_term", "0.12.1" ], + [ "atty", "0.2.14" ], + [ "bitflags", "1.3.2" ], + [ "strsim", "0.8.0" ], + [ "textwrap", "0.11.0" ], + [ "unicode-width", "0.1.9" ], + [ "vec_map", "0.8.2" ] + ], + "3.1.10": [ + [ "atty", "0.2.14" ], + [ "bitflags", "1.3.2" ], + [ "clap_derive", "3.1.7" ], + [ "clap_lex", "0.1.1" ], + [ "indexmap", "1.8.1" ], + [ "lazy_static", "1.4.0" ], + [ "strsim", "0.10.0" ], + [ "termcolor", "1.1.3" ], + [ "textwrap", "0.15.0" ] + ] + }, + "clap_derive": { + "3.1.7": [ + [ "heck", "0.4.0" ], + [ "proc-macro-error", "1.0.4" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "clap_lex": { + "0.1.1": [ + [ "os_str_bytes", "6.0.0" ] + ] + }, + "clipboard-win": { + "3.1.1": [ + [ "lazy-bytes-cast", "5.0.1" ], + [ "winapi", "0.3.9" ] + ], + "4.4.1": [ + [ "error-code", "2.3.1" ], + [ "str-buf", "1.0.5" ], + [ "winapi", "0.3.9" ] + ] + }, + "clipboard_macos": { + "0.1.0": [ + [ "objc", "0.2.7" ], + [ "objc-foundation", "0.1.1" ], + [ "objc_id", "0.1.1" ] + ] + }, + "clipboard_wayland": { + "0.2.0": [ + [ "smithay-clipboard", "0.6.5" ] + ] + }, + "clipboard_x11": { + "0.3.1": [ + [ "thiserror", "1.0.30" ], + [ "x11rb", "0.8.1" ] + ] + }, + "cloudabi": { + "0.0.3": [ + [ "bitflags", "1.3.2" ] + ] + }, + "cmake": { + "0.1.45": [ + [ "cc", "1.0.73" ] + ] + }, + "cocoa": { + "0.24.0": [ + [ "bitflags", "1.3.2" ], + [ "block", "0.1.6" ], + [ "cocoa-foundation", "0.1.0" ], + [ "core-foundation", "0.9.3" ], + [ "core-graphics", "0.22.3" ], + [ "foreign-types", "0.3.2" ], + [ "libc", "0.2.121" ], + [ "objc", "0.2.7" ] + ] + }, + "cocoa-foundation": { + "0.1.0": [ + [ "bitflags", "1.3.2" ], + [ "block", "0.1.6" ], + [ "core-foundation", "0.9.3" ], + [ "core-graphics-types", "0.1.1" ], + [ "foreign-types", "0.3.2" ], + [ "libc", "0.2.121" ], + [ "objc", "0.2.7" ] + ] + }, + "codespan-reporting": { + "0.11.1": [ + [ "termcolor", "1.1.3" ], + [ "unicode-width", "0.1.9" ] + ] + }, + "combine": { + "4.6.3": [ + [ "bytes", "1.1.0" ], + [ "memchr", "2.4.1" ] + ] + }, + "concurrent-queue": { + "1.2.2": [ + [ "cache-padded", "1.2.0" ] + ] + }, + "conrod_core": { + "0.63.0": [ + [ "conrod_derive", "0.63.0" ], + [ "copypasta", "0.7.1" ], + [ "daggy", "0.5.0" ], + [ "fnv", "1.0.7" ], + [ "instant", "0.1.12" ], + [ "num", "0.2.1" ], + [ "pistoncore-input", "0.24.0" ], + [ "rusttype", "0.7.9" ] + ] + }, + "conrod_derive": { + "0.63.0": [ + [ "proc-macro2", "0.4.30" ], + [ "quote", "0.6.13" ], + [ "syn", "0.15.44" ] + ] + }, + "const-random": { + "0.1.13": [ + [ "const-random-macro", "0.1.13" ], + [ "proc-macro-hack", "0.5.19" ] + ] + }, + "const-random-macro": { + "0.1.13": [ + [ "getrandom", "0.2.6" ], + [ "lazy_static", "1.4.0" ], + [ "proc-macro-hack", "0.5.19" ], + [ "tiny-keccak", "2.0.2" ] + ] + }, + "copy_dir": { + "0.1.2": [ + [ "walkdir", "0.1.8" ] + ] + }, + "copypasta": { + "0.7.1": [ + [ "clipboard-win", "3.1.1" ], + [ "objc", "0.2.7" ], + [ "objc-foundation", "0.1.1" ], + [ "objc_id", "0.1.1" ], + [ "smithay-clipboard", "0.6.5" ], + [ "x11-clipboard", "0.5.3" ] + ] + }, + "core-foundation": { + "0.6.4": [ + [ "core-foundation-sys", "0.6.2" ], + [ "libc", "0.2.121" ] + ], + "0.7.0": [ + [ "core-foundation-sys", "0.7.0" ], + [ "libc", "0.2.121" ] + ], + "0.9.3": [ + [ "core-foundation-sys", "0.8.3" ], + [ "libc", "0.2.121" ] + ] + }, + "core-graphics": { + "0.19.2": [ + [ "bitflags", "1.3.2" ], + [ "core-foundation", "0.7.0" ], + [ "foreign-types", "0.3.2" ], + [ "libc", "0.2.121" ] + ], + "0.22.3": [ + [ "bitflags", "1.3.2" ], + [ "core-foundation", "0.9.3" ], + [ "core-graphics-types", "0.1.1" ], + [ "foreign-types", "0.3.2" ], + [ "libc", "0.2.121" ] + ] + }, + "core-graphics-types": { + "0.1.1": [ + [ "bitflags", "1.3.2" ], + [ "core-foundation", "0.9.3" ], + [ "foreign-types", "0.3.2" ], + [ "libc", "0.2.121" ] + ] + }, + "core-video-sys": { + "0.1.4": [ + [ "cfg-if", "0.1.10" ], + [ "core-foundation-sys", "0.7.0" ], + [ "core-graphics", "0.19.2" ], + [ "libc", "0.2.121" ], + [ "objc", "0.2.7" ] + ] + }, + "coreaudio-rs": { + "0.10.0": [ + [ "bitflags", "1.3.2" ], + [ "coreaudio-sys", "0.2.9" ] + ] + }, + "coreaudio-sys": { + "0.2.9": [ + [ "bindgen", "0.56.0" ] + ] + }, + "cpal": { + "0.13.5": [ + [ "alsa", "0.6.0" ], + [ "core-foundation-sys", "0.8.3" ], + [ "coreaudio-rs", "0.10.0" ], + [ "jni", "0.19.0" ], + [ "js-sys", "0.3.56" ], + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "mach", "0.3.2" ], + [ "ndk", "0.6.0" ], + [ "ndk-glue", "0.6.1" ], + [ "nix", "0.23.1" ], + [ "oboe", "0.4.5" ], + [ "parking_lot", "0.11.2" ], + [ "stdweb", "0.1.3" ], + [ "thiserror", "1.0.30" ], + [ "web-sys", "0.3.50" ], + [ "winapi", "0.3.9" ] + ] + }, + "cpufeatures": { + "0.2.2": [ + [ "libc", "0.2.121" ] + ] + }, + "cranelift-bforest": { + "0.76.0": [ + [ "cranelift-entity", "0.76.0" ] + ] + }, + "cranelift-codegen": { + "0.76.0": [ + [ "cranelift-bforest", "0.76.0" ], + [ "cranelift-codegen-meta", "0.76.0" ], + [ "cranelift-codegen-shared", "0.76.0" ], + [ "cranelift-entity", "0.76.0" ], + [ "gimli", "0.25.0" ], + [ "log", "0.4.16" ], + [ "regalloc", "0.0.31" ], + [ "smallvec", "1.8.0" ], + [ "target-lexicon", "0.12.3" ] + ] + }, + "cranelift-codegen-meta": { + "0.76.0": [ + [ "cranelift-codegen-shared", "0.76.0" ], + [ "cranelift-entity", "0.76.0" ] + ] + }, + "cranelift-frontend": { + "0.76.0": [ + [ "cranelift-codegen", "0.76.0" ], + [ "log", "0.4.16" ], + [ "smallvec", "1.8.0" ], + [ "target-lexicon", "0.12.3" ] + ] + }, + "crc32fast": { + "1.3.2": [ + [ "cfg-if", "1.0.0" ] + ] + }, + "criterion": { + "0.3.4": [ + [ "atty", "0.2.14" ], + [ "cast", "0.2.7" ], + [ "clap", "2.34.0" ], + [ "criterion-plot", "0.4.4" ], + [ "csv", "1.1.6" ], + [ "futures", "0.3.21" ], + [ "itertools", "0.10.3" ], + [ "lazy_static", "1.4.0" ], + [ "num-traits", "0.2.14" ], + [ "oorandom", "11.1.3" ], + [ "plotters", "0.3.0" ], + [ "rayon", "1.5.1" ], + [ "regex", "1.5.5" ], + [ "serde", "1.0.136" ], + [ "serde_cbor", "0.11.2" ], + [ "serde_derive", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "tinytemplate", "1.2.1" ], + [ "tokio", "1.17.0" ], + [ "walkdir", "2.3.2" ] + ] + }, + "criterion-plot": { + "0.4.4": [ + [ "cast", "0.2.7" ], + [ "itertools", "0.10.3" ] + ] + }, + "crossbeam": { + "0.8.1": [ + [ "cfg-if", "1.0.0" ], + [ "crossbeam-channel", "0.5.4" ], + [ "crossbeam-deque", "0.8.1" ], + [ "crossbeam-epoch", "0.9.8" ], + [ "crossbeam-queue", "0.3.5" ], + [ "crossbeam-utils", "0.8.8" ] + ] + }, + "crossbeam-channel": { + "0.5.4": [ + [ "cfg-if", "1.0.0" ], + [ "crossbeam-utils", "0.8.8" ] + ] + }, + "crossbeam-deque": { + "0.7.4": [ + [ "crossbeam-epoch", "0.8.2" ], + [ "crossbeam-utils", "0.7.2" ], + [ "maybe-uninit", "2.0.0" ] + ], + "0.8.1": [ + [ "cfg-if", "1.0.0" ], + [ "crossbeam-epoch", "0.9.8" ], + [ "crossbeam-utils", "0.8.8" ] + ] + }, + "crossbeam-epoch": { + "0.8.2": [ + [ "autocfg", "1.1.0" ], + [ "cfg-if", "0.1.10" ], + [ "crossbeam-utils", "0.7.2" ], + [ "lazy_static", "1.4.0" ], + [ "maybe-uninit", "2.0.0" ], + [ "memoffset", "0.5.6" ], + [ "scopeguard", "1.1.0" ] + ], + "0.9.8": [ + [ "autocfg", "1.1.0" ], + [ "cfg-if", "1.0.0" ], + [ "crossbeam-utils", "0.8.8" ], + [ "lazy_static", "1.4.0" ], + [ "memoffset", "0.6.5" ], + [ "scopeguard", "1.1.0" ] + ] + }, + "crossbeam-queue": { + "0.3.5": [ + [ "cfg-if", "1.0.0" ], + [ "crossbeam-utils", "0.8.8" ] + ] + }, + "crossbeam-utils": { + "0.7.2": [ + [ "autocfg", "1.1.0" ], + [ "cfg-if", "0.1.10" ], + [ "lazy_static", "1.4.0" ] + ], + "0.8.8": [ + [ "cfg-if", "1.0.0" ], + [ "lazy_static", "1.4.0" ] + ] + }, + "crossterm": { + "0.17.7": [ + [ "bitflags", "1.3.2" ], + [ "crossterm_winapi", "0.6.2" ], + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "mio", "0.7.14" ], + [ "parking_lot", "0.10.2" ], + [ "signal-hook", "0.1.17" ], + [ "winapi", "0.3.9" ] + ], + "0.23.2": [ + [ "bitflags", "1.3.2" ], + [ "crossterm_winapi", "0.9.0" ], + [ "libc", "0.2.121" ], + [ "mio", "0.8.2" ], + [ "parking_lot", "0.12.0" ], + [ "signal-hook", "0.3.13" ], + [ "signal-hook-mio", "0.2.3" ], + [ "winapi", "0.3.9" ] + ] + }, + "crossterm_winapi": { + "0.6.2": [ + [ "winapi", "0.3.9" ] + ], + "0.9.0": [ + [ "winapi", "0.3.9" ] + ] + }, + "crypto-common": { + "0.1.3": [ + [ "generic-array", "0.14.5" ], + [ "typenum", "1.15.0" ] + ] + }, + "csv": { + "1.1.6": [ + [ "bstr", "0.2.17" ], + [ "csv-core", "0.1.10" ], + [ "itoa", "0.4.8" ], + [ "ryu", "1.0.9" ], + [ "serde", "1.0.136" ] + ] + }, + "csv-core": { + "0.1.10": [ + [ "memchr", "2.4.1" ] + ] + }, + "ct-logs": { + "0.8.0": [ + [ "sct", "0.6.1" ] + ] + }, + "d3d12": { + "0.4.1": [ + [ "bitflags", "1.3.2" ], + [ "libloading", "0.7.3" ], + [ "winapi", "0.3.9" ] + ] + }, + "daggy": { + "0.5.0": [ + [ "petgraph", "0.4.13" ] + ] + }, + "darling": { + "0.10.2": [ + [ "darling_core", "0.10.2" ], + [ "darling_macro", "0.10.2" ] + ], + "0.13.2": [ + [ "darling_core", "0.13.2" ], + [ "darling_macro", "0.13.2" ] + ] + }, + "darling_core": { + "0.10.2": [ + [ "fnv", "1.0.7" ], + [ "ident_case", "1.0.1" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "strsim", "0.9.3" ], + [ "syn", "1.0.98" ] + ], + "0.13.2": [ + [ "fnv", "1.0.7" ], + [ "ident_case", "1.0.1" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "strsim", "0.10.0" ], + [ "syn", "1.0.98" ] + ] + }, + "darling_macro": { + "0.10.2": [ + [ "darling_core", "0.10.2" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ], + "0.13.2": [ + [ "darling_core", "0.13.2" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "deflate": { + "1.0.0": [ + [ "adler32", "1.2.0" ] + ] + }, + "digest": { + "0.10.3": [ + [ "block-buffer", "0.10.2" ], + [ "crypto-common", "0.1.3" ] + ] + }, + "directories-next": { + "2.0.0": [ + [ "cfg-if", "1.0.0" ], + [ "dirs-sys-next", "0.1.2" ] + ] + }, + "dirs": { + "4.0.0": [ + [ "dirs-sys", "0.3.7" ] + ] + }, + "dirs-next": { + "2.0.0": [ + [ "cfg-if", "1.0.0" ], + [ "dirs-sys-next", "0.1.2" ] + ] + }, + "dirs-sys": { + "0.3.7": [ + [ "libc", "0.2.121" ], + [ "redox_users", "0.4.3" ], + [ "winapi", "0.3.9" ] + ] + }, + "dirs-sys-next": { + "0.1.2": [ + [ "libc", "0.2.121" ], + [ "redox_users", "0.4.3" ], + [ "winapi", "0.3.9" ] + ] + }, + "discord-sdk": { + "0.3.0": [ + [ "anyhow", "1.0.61" ], + [ "app_dirs2", "2.5.2" ], + [ "async-trait", "0.1.53" ], + [ "base64", "0.13.0" ], + [ "bitflags", "1.3.2" ], + [ "crossbeam-channel", "0.5.4" ], + [ "num-traits", "0.2.14" ], + [ "parking_lot", "0.12.0" ], + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "serde_repr", "0.1.7" ], + [ "thiserror", "1.0.30" ], + [ "time", "0.3.9" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ], + [ "url", "2.2.2" ], + [ "winreg", "0.10.1" ] + ] + }, + "dlib": { + "0.4.2": [ + [ "libloading", "0.6.7" ] + ], + "0.5.0": [ + [ "libloading", "0.7.3" ] + ] + }, + "dot_vox": { + "4.1.0": [ + [ "byteorder", "1.4.3" ], + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "nom", "4.2.3" ] + ] + }, + "egui": { + "0.12.0": [ + [ "epaint", "0.12.0" ] + ] + }, + "egui_wgpu_backend": { + "0.8.0": [ + [ "bytemuck", "1.9.1" ], + [ "epi", "0.12.0" ], + [ "wgpu", "0.8.0" ] + ] + }, + "egui_winit_platform": { + "0.8.0": [ + [ "egui", "0.12.0" ], + [ "winit", "0.25.0" ] + ] + }, + "enum-iterator": { + "0.7.0": [ + [ "enum-iterator-derive", "0.7.0" ] + ] + }, + "enum-iterator-derive": { + "0.7.0": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "enumset": { + "1.0.9": [ + [ "enumset_derive", "0.5.6" ] + ] + }, + "enumset_derive": { + "0.5.6": [ + [ "darling", "0.13.2" ], + [ "proc-macro-crate", "1.1.3" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "env_logger": { + "0.8.4": [ + [ "atty", "0.2.14" ], + [ "humantime", "2.1.0" ], + [ "log", "0.4.16" ], + [ "regex", "1.5.5" ], + [ "termcolor", "1.1.3" ] + ] + }, + "epaint": { + "0.12.0": [ + [ "ahash", "0.7.6" ], + [ "atomic_refcell", "0.1.8" ], + [ "emath", "0.12.0" ], + [ "ordered-float", "2.10.0" ], + [ "rusttype", "0.9.2" ] + ] + }, + "epi": { + "0.12.0": [ + [ "egui", "0.12.0" ] + ] + }, + "errno": { + "0.2.8": [ + [ "errno-dragonfly", "0.1.2" ], + [ "libc", "0.2.121" ], + [ "winapi", "0.3.9" ] + ] + }, + "errno-dragonfly": { + "0.1.2": [ + [ "cc", "1.0.73" ], + [ "libc", "0.2.121" ] + ] + }, + "error-code": { + "2.3.1": [ + [ "libc", "0.2.121" ], + [ "str-buf", "1.0.5" ] + ] + }, + "etagere": { + "0.2.7": [ + [ "euclid", "0.22.7" ], + [ "svg_fmt", "0.4.1" ] + ] + }, + "euc": { + "0.5.3": [ + [ "vek", "0.14.1" ] + ] + }, + "euclid": { + "0.22.7": [ + [ "num-traits", "0.2.14" ] + ] + }, + "fastrand": { + "1.7.0": [ + [ "instant", "0.1.12" ] + ] + }, + "fd-lock": { + "3.0.5": [ + [ "cfg-if", "1.0.0" ], + [ "rustix", "0.34.1" ], + [ "windows-sys", "0.30.0" ] + ] + }, + "fehler": { + "1.0.0": [ + [ "fehler-macros", "1.0.0" ] + ] + }, + "fehler-macros": { + "1.0.0": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "filetime": { + "0.2.15": [ + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "redox_syscall", "0.2.13" ], + [ "winapi", "0.3.9" ] + ] + }, + "flate2": { + "1.0.24": [ + [ "crc32fast", "1.3.2" ], + [ "miniz_oxide", "0.5.1" ] + ] + }, + "float-cmp": { + "0.9.0": [ + [ "num-traits", "0.2.14" ] + ] + }, + "fluent": { + "0.16.0": [ + [ "fluent-bundle", "0.15.2" ], + [ "unic-langid", "0.9.0" ] + ] + }, + "fluent-bundle": { + "0.15.2": [ + [ "fluent-langneg", "0.13.0" ], + [ "fluent-syntax", "0.11.0" ], + [ "intl-memoizer", "0.5.1" ], + [ "intl_pluralrules", "7.0.1" ], + [ "rustc-hash", "1.1.0" ], + [ "self_cell", "0.10.2" ], + [ "smallvec", "1.8.0" ], + [ "unic-langid", "0.9.0" ] + ] + }, + "fluent-langneg": { + "0.13.0": [ + [ "unic-langid", "0.9.0" ] + ] + }, + "fluent-syntax": { + "0.11.0": [ + [ "thiserror", "1.0.30" ] + ] + }, + "foreign-types": { + "0.3.2": [ + [ "foreign-types-shared", "0.1.1" ] + ] + }, + "form_urlencoded": { + "1.0.1": [ + [ "matches", "0.1.9" ], + [ "percent-encoding", "2.1.0" ] + ] + }, + "fsevent-sys": { + "4.1.0": [ + [ "libc", "0.2.121" ] + ] + }, + "futures": { + "0.3.21": [ + [ "futures-channel", "0.3.21" ], + [ "futures-core", "0.3.21" ], + [ "futures-executor", "0.3.21" ], + [ "futures-io", "0.3.21" ], + [ "futures-sink", "0.3.21" ], + [ "futures-task", "0.3.21" ], + [ "futures-util", "0.3.21" ] + ] + }, + "futures-channel": { + "0.3.21": [ + [ "futures-core", "0.3.21" ], + [ "futures-sink", "0.3.21" ] + ] + }, + "futures-executor": { + "0.3.21": [ + [ "futures-core", "0.3.21" ], + [ "futures-task", "0.3.21" ], + [ "futures-util", "0.3.21" ], + [ "num_cpus", "1.13.1" ] + ] + }, + "futures-macro": { + "0.3.21": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "futures-util": { + "0.3.21": [ + [ "futures-channel", "0.3.21" ], + [ "futures-core", "0.3.21" ], + [ "futures-io", "0.3.21" ], + [ "futures-macro", "0.3.21" ], + [ "futures-sink", "0.3.21" ], + [ "futures-task", "0.3.21" ], + [ "memchr", "2.4.1" ], + [ "pin-project-lite", "0.2.8" ], + [ "pin-utils", "0.1.0" ], + [ "slab", "0.4.6" ] + ] + }, + "fxhash": { + "0.2.1": [ + [ "byteorder", "1.4.3" ] + ] + }, + "generator": { + "0.7.0": [ + [ "cc", "1.0.73" ], + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "rustversion", "1.0.6" ], + [ "winapi", "0.3.9" ] + ] + }, + "generic-array": { + "0.12.4": [ + [ "typenum", "1.15.0" ] + ], + "0.13.3": [ + [ "typenum", "1.15.0" ] + ], + "0.14.5": [ + [ "typenum", "1.15.0" ], + [ "version_check", "0.9.4" ] + ] + }, + "gethostname": { + "0.2.3": [ + [ "libc", "0.2.121" ], + [ "winapi", "0.3.9" ] + ] + }, + "getrandom": { + "0.1.16": [ + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "wasi", "0.9.0+wasi-snapshot-preview1" ] + ], + "0.2.6": [ + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "wasi", "0.10.0+wasi-snapshot-preview1" ] + ] + }, + "gfx-auxil": { + "0.9.0": [ + [ "fxhash", "0.2.1" ], + [ "gfx-hal", "0.8.0" ], + [ "spirv_cross", "0.23.1" ] + ] + }, + "gfx-backend-dx11": { + "0.8.0": [ + [ "arrayvec", "0.5.2" ], + [ "bitflags", "1.3.2" ], + [ "gfx-auxil", "0.9.0" ], + [ "gfx-hal", "0.8.0" ], + [ "libloading", "0.7.3" ], + [ "log", "0.4.16" ], + [ "parking_lot", "0.11.2" ], + [ "range-alloc", "0.1.2" ], + [ "raw-window-handle", "0.3.4" ], + [ "smallvec", "1.8.0" ], + [ "spirv_cross", "0.23.1" ], + [ "thunderdome", "0.4.2" ], + [ "winapi", "0.3.9" ], + [ "wio", "0.2.2" ] + ] + }, + "gfx-backend-dx12": { + "0.8.0": [ + [ "arrayvec", "0.5.2" ], + [ "bit-set", "0.5.2" ], + [ "bitflags", "1.3.2" ], + [ "d3d12", "0.4.1" ], + [ "gfx-auxil", "0.9.0" ], + [ "gfx-hal", "0.8.0" ], + [ "log", "0.4.16" ], + [ "parking_lot", "0.11.2" ], + [ "range-alloc", "0.1.2" ], + [ "raw-window-handle", "0.3.4" ], + [ "smallvec", "1.8.0" ], + [ "spirv_cross", "0.23.1" ], + [ "thunderdome", "0.4.2" ], + [ "winapi", "0.3.9" ] + ] + }, + "gfx-backend-empty": { + "0.8.0": [ + [ "gfx-hal", "0.8.0" ], + [ "log", "0.4.16" ], + [ "raw-window-handle", "0.3.4" ] + ] + }, + "gfx-backend-gl": { + "0.8.1": [ + [ "arrayvec", "0.5.2" ], + [ "bitflags", "1.3.2" ], + [ "fxhash", "0.2.1" ], + [ "gfx-auxil", "0.9.0" ], + [ "gfx-hal", "0.8.0" ], + [ "glow", "0.9.0" ], + [ "js-sys", "0.3.56" ], + [ "khronos-egl", "4.1.0" ], + [ "libloading", "0.7.3" ], + [ "log", "0.4.16" ], + [ "naga", "0.4.0" ], + [ "parking_lot", "0.11.2" ], + [ "raw-window-handle", "0.3.4" ], + [ "spirv_cross", "0.23.1" ], + [ "wasm-bindgen", "0.2.79" ], + [ "web-sys", "0.3.50" ] + ] + }, + "gfx-backend-metal": { + "0.8.1": [ + [ "arrayvec", "0.5.2" ], + [ "bitflags", "1.3.2" ], + [ "block", "0.1.6" ], + [ "cocoa-foundation", "0.1.0" ], + [ "copyless", "0.1.5" ], + [ "foreign-types", "0.3.2" ], + [ "fxhash", "0.2.1" ], + [ "gfx-auxil", "0.9.0" ], + [ "gfx-hal", "0.8.0" ], + [ "log", "0.4.16" ], + [ "metal", "0.22.0" ], + [ "naga", "0.4.0" ], + [ "objc", "0.2.7" ], + [ "parking_lot", "0.11.2" ], + [ "profiling", "1.0.6" ], + [ "range-alloc", "0.1.2" ], + [ "raw-window-handle", "0.3.4" ], + [ "spirv_cross", "0.23.1" ], + [ "storage-map", "0.3.0" ] + ] + }, + "gfx-backend-vulkan": { + "0.8.0": [ + [ "arrayvec", "0.5.2" ], + [ "ash", "0.32.1" ], + [ "byteorder", "1.4.3" ], + [ "core-graphics-types", "0.1.1" ], + [ "gfx-hal", "0.8.0" ], + [ "inplace_it", "0.3.3" ], + [ "libloading", "0.7.3" ], + [ "log", "0.4.16" ], + [ "naga", "0.4.0" ], + [ "objc", "0.2.7" ], + [ "parking_lot", "0.11.2" ], + [ "raw-window-handle", "0.3.4" ], + [ "renderdoc-sys", "0.7.1" ], + [ "smallvec", "1.8.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "gfx-hal": { + "0.8.0": [ + [ "bitflags", "1.3.2" ], + [ "naga", "0.4.0" ], + [ "raw-window-handle", "0.3.4" ], + [ "thiserror", "1.0.30" ] + ] + }, + "gilrs": { + "0.8.2": [ + [ "fnv", "1.0.7" ], + [ "gilrs-core", "0.3.2" ], + [ "log", "0.4.16" ], + [ "serde", "1.0.136" ], + [ "uuid", "0.8.2" ], + [ "vec_map", "0.8.2" ] + ] + }, + "gilrs-core": { + "0.3.2": [ + [ "core-foundation", "0.6.4" ], + [ "io-kit-sys", "0.1.0" ], + [ "libc", "0.2.121" ], + [ "libudev-sys", "0.1.4" ], + [ "log", "0.4.16" ], + [ "nix", "0.23.1" ], + [ "rusty-xinput", "1.2.0" ], + [ "serde", "1.0.136" ], + [ "stdweb", "0.4.20" ], + [ "uuid", "0.8.2" ], + [ "vec_map", "0.8.2" ], + [ "winapi", "0.3.9" ] + ] + }, + "gimli": { + "0.25.0": [ + [ "fallible-iterator", "0.2.0" ], + [ "indexmap", "1.8.1" ], + [ "stable_deref_trait", "1.2.0" ] + ] + }, + "glam": { + "0.10.2": [ + [ "version_check", "0.9.4" ] + ] + }, + "glow": { + "0.9.0": [ + [ "js-sys", "0.3.56" ], + [ "slotmap", "0.4.3" ], + [ "wasm-bindgen", "0.2.79" ], + [ "web-sys", "0.3.50" ] + ] + }, + "glyph_brush": { + "0.7.3": [ + [ "glyph_brush_draw_cache", "0.1.5" ], + [ "glyph_brush_layout", "0.2.3" ], + [ "log", "0.4.16" ], + [ "ordered-float", "2.10.0" ], + [ "rustc-hash", "1.1.0" ], + [ "twox-hash", "1.6.2" ] + ] + }, + "glyph_brush_draw_cache": { + "0.1.5": [ + [ "ab_glyph", "0.2.15" ], + [ "crossbeam-channel", "0.5.4" ], + [ "crossbeam-deque", "0.8.1" ], + [ "linked-hash-map", "0.5.4" ], + [ "rayon", "1.5.1" ], + [ "rustc-hash", "1.1.0" ] + ] + }, + "glyph_brush_layout": { + "0.2.3": [ + [ "ab_glyph", "0.2.15" ], + [ "approx", "0.5.1" ], + [ "xi-unicode", "0.3.0" ] + ] + }, + "gpu-alloc": { + "0.4.7": [ + [ "bitflags", "1.3.2" ], + [ "gpu-alloc-types", "0.2.0" ] + ] + }, + "gpu-alloc-types": { + "0.2.0": [ + [ "bitflags", "1.3.2" ] + ] + }, + "gpu-descriptor": { + "0.1.1": [ + [ "bitflags", "1.3.2" ], + [ "gpu-descriptor-types", "0.1.1" ], + [ "hashbrown", "0.9.1" ] + ] + }, + "gpu-descriptor-types": { + "0.1.1": [ + [ "bitflags", "1.3.2" ] + ] + }, + "guillotiere": { + "0.6.2": [ + [ "euclid", "0.22.7" ], + [ "svg_fmt", "0.4.1" ] + ] + }, + "h2": { + "0.3.13": [ + [ "bytes", "1.1.0" ], + [ "fnv", "1.0.7" ], + [ "futures-core", "0.3.21" ], + [ "futures-sink", "0.3.21" ], + [ "futures-util", "0.3.21" ], + [ "http", "0.2.6" ], + [ "indexmap", "1.8.1" ], + [ "slab", "0.4.6" ], + [ "tokio", "1.17.0" ], + [ "tokio-util", "0.7.1" ], + [ "tracing", "0.1.32" ] + ] + }, + "hash32": { + "0.1.1": [ + [ "byteorder", "1.4.3" ] + ] + }, + "hashbrown": { + "0.11.2": [ + [ "ahash", "0.7.6" ] + ], + "0.12.0": [ + [ "ahash", "0.7.6" ], + [ "rayon", "1.5.1" ], + [ "serde", "1.0.136" ] + ], + "0.9.1": [ + [ "ahash", "0.4.7" ] + ] + }, + "hashlink": { + "0.6.0": [ + [ "hashbrown", "0.9.1" ] + ] + }, + "heapless": { + "0.5.6": [ + [ "as-slice", "0.1.5" ], + [ "generic-array", "0.13.3" ], + [ "hash32", "0.1.1" ], + [ "stable_deref_trait", "1.2.0" ] + ], + "0.6.1": [ + [ "as-slice", "0.1.5" ], + [ "generic-array", "0.14.5" ], + [ "hash32", "0.1.1" ], + [ "stable_deref_trait", "1.2.0" ] + ] + }, + "heck": { + "0.3.3": [ + [ "unicode-segmentation", "1.9.0" ] + ] + }, + "hermit-abi": { + "0.1.19": [ + [ "libc", "0.2.121" ] + ] + }, + "hibitset": { + "0.6.3": [ + [ "atom", "0.3.6" ], + [ "rayon", "1.5.1" ] + ] + }, + "http": { + "0.2.6": [ + [ "bytes", "1.1.0" ], + [ "fnv", "1.0.7" ], + [ "itoa", "1.0.1" ] + ] + }, + "http-body": { + "0.4.4": [ + [ "bytes", "1.1.0" ], + [ "http", "0.2.6" ], + [ "pin-project-lite", "0.2.8" ] + ] + }, + "hyper": { + "0.14.18": [ + [ "bytes", "1.1.0" ], + [ "futures-channel", "0.3.21" ], + [ "futures-core", "0.3.21" ], + [ "futures-util", "0.3.21" ], + [ "h2", "0.3.13" ], + [ "http", "0.2.6" ], + [ "http-body", "0.4.4" ], + [ "httparse", "1.6.0" ], + [ "httpdate", "1.0.2" ], + [ "itoa", "1.0.1" ], + [ "pin-project-lite", "0.2.8" ], + [ "socket2", "0.4.4" ], + [ "tokio", "1.17.0" ], + [ "tower-service", "0.3.1" ], + [ "tracing", "0.1.32" ], + [ "want", "0.3.0" ] + ] + }, + "hyper-rustls": { + "0.22.1": [ + [ "ct-logs", "0.8.0" ], + [ "futures-util", "0.3.21" ], + [ "hyper", "0.14.18" ], + [ "log", "0.4.16" ], + [ "rustls", "0.19.1" ], + [ "rustls-native-certs", "0.5.0" ], + [ "tokio", "1.17.0" ], + [ "tokio-rustls", "0.22.0" ], + [ "webpki", "0.21.4" ] + ] + }, + "iced_futures": { + "0.3.0": [ + [ "futures", "0.3.21" ], + [ "log", "0.4.16" ], + [ "wasm-bindgen-futures", "0.4.29" ] + ] + }, + "iced_graphics": { + "0.2.0": [ + [ "bytemuck", "1.9.1" ], + [ "glam", "0.10.2" ], + [ "iced_native", "0.4.0" ], + [ "iced_style", "0.3.0" ], + [ "raw-window-handle", "0.3.4" ], + [ "thiserror", "1.0.30" ] + ] + }, + "iced_native": { + "0.4.0": [ + [ "iced_core", "0.4.0" ], + [ "iced_futures", "0.3.0" ], + [ "num-traits", "0.2.14" ], + [ "twox-hash", "1.6.2" ], + [ "unicode-segmentation", "1.9.0" ] + ] + }, + "iced_style": { + "0.3.0": [ + [ "iced_core", "0.4.0" ] + ] + }, + "iced_winit": { + "0.3.0": [ + [ "iced_futures", "0.3.0" ], + [ "iced_graphics", "0.2.0" ], + [ "iced_native", "0.4.0" ], + [ "log", "0.4.16" ], + [ "thiserror", "1.0.30" ], + [ "winapi", "0.3.9" ], + [ "window_clipboard", "0.2.2" ], + [ "winit", "0.25.0" ] + ] + }, + "idna": { + "0.2.3": [ + [ "matches", "0.1.9" ], + [ "unicode-bidi", "0.3.7" ], + [ "unicode-normalization", "0.1.19" ] + ] + }, + "image": { + "0.24.2": [ + [ "bytemuck", "1.9.1" ], + [ "byteorder", "1.4.3" ], + [ "color_quant", "1.1.0" ], + [ "jpeg-decoder", "0.2.6" ], + [ "num-iter", "0.1.42" ], + [ "num-rational", "0.4.0" ], + [ "num-traits", "0.2.14" ], + [ "png", "0.17.5" ] + ] + }, + "indexmap": { + "1.8.1": [ + [ "autocfg", "1.1.0" ], + [ "hashbrown", "0.11.2" ], + [ "rayon", "1.5.1" ], + [ "serde", "1.0.136" ] + ] + }, + "inline_tweak": { + "1.0.8": [ + [ "lazy_static", "1.4.0" ] + ] + }, + "inotify": { + "0.9.6": [ + [ "bitflags", "1.3.2" ], + [ "inotify-sys", "0.1.5" ], + [ "libc", "0.2.121" ] + ] + }, + "inotify-sys": { + "0.1.5": [ + [ "libc", "0.2.121" ] + ] + }, + "instant": { + "0.1.12": [ + [ "cfg-if", "1.0.0" ] + ] + }, + "intl-memoizer": { + "0.5.1": [ + [ "type-map", "0.5.0" ], + [ "unic-langid", "0.9.0" ] + ] + }, + "intl_pluralrules": { + "7.0.1": [ + [ "tinystr", "0.3.4" ], + [ "unic-langid", "0.9.0" ] + ] + }, + "io-kit-sys": { + "0.1.0": [ + [ "core-foundation-sys", "0.6.2" ], + [ "mach", "0.2.3" ] + ] + }, + "itertools": { + "0.10.3": [ + [ "either", "1.6.1" ] + ] + }, + "jni": { + "0.19.0": [ + [ "cesu8", "1.1.0" ], + [ "combine", "4.6.3" ], + [ "jni-sys", "0.3.0" ], + [ "log", "0.4.16" ], + [ "thiserror", "1.0.30" ], + [ "walkdir", "2.3.2" ] + ] + }, + "jobserver": { + "0.1.24": [ + [ "libc", "0.2.121" ] + ] + }, + "js-sys": { + "0.3.56": [ + [ "wasm-bindgen", "0.2.79" ] + ] + }, + "kernel32-sys": { + "0.2.2": [ + [ "winapi", "0.2.8" ], + [ "winapi-build", "0.1.1" ] + ] + }, + "keyboard-keynames": { + "0.1.0": [ + [ "libc", "0.2.121" ], + [ "memmap", "0.7.0" ], + [ "wayland-client", "0.28.6" ], + [ "winapi", "0.3.9" ], + [ "winit", "0.25.0" ], + [ "xcb", "0.9.0" ], + [ "xkbcommon-sys", "0.7.6" ] + ] + }, + "khronos-egl": { + "4.1.0": [ + [ "libc", "0.2.121" ], + [ "libloading", "0.7.3" ] + ] + }, + "kiddo": { + "0.1.7": [ + [ "num-traits", "0.2.14" ] + ], + "0.2.4": [ + [ "num-traits", "0.2.14" ] + ] + }, + "kqueue": { + "1.0.4": [ + [ "kqueue-sys", "1.0.3" ], + [ "libc", "0.2.121" ] + ] + }, + "kqueue-sys": { + "1.0.3": [ + [ "bitflags", "1.3.2" ], + [ "libc", "0.2.121" ] + ] + }, + "lewton": { + "0.10.2": [ + [ "byteorder", "1.4.3" ], + [ "ogg", "0.8.0" ], + [ "tinyvec", "1.5.1" ] + ] + }, + "libloading": { + "0.6.7": [ + [ "cfg-if", "1.0.0" ], + [ "winapi", "0.3.9" ] + ], + "0.7.3": [ + [ "cfg-if", "1.0.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "libmimalloc-sys": { + "0.1.25": [ + [ "cc", "1.0.73" ] + ] + }, + "libsqlite3-sys": { + "0.20.1": [ + [ "cc", "1.0.73" ], + [ "pkg-config", "0.3.25" ], + [ "vcpkg", "0.2.15" ] + ] + }, + "libudev-sys": { + "0.1.4": [ + [ "libc", "0.2.121" ], + [ "pkg-config", "0.3.25" ] + ] + }, + "lock_api": { + "0.3.4": [ + [ "scopeguard", "1.1.0" ] + ], + "0.4.7": [ + [ "autocfg", "1.1.0" ], + [ "scopeguard", "1.1.0" ] + ] + }, + "log": { + "0.4.16": [ + [ "cfg-if", "1.0.0" ] + ] + }, + "loom": { + "0.5.4": [ + [ "cfg-if", "1.0.0" ], + [ "generator", "0.7.0" ], + [ "scoped-tls", "1.0.0" ], + [ "tracing", "0.1.32" ], + [ "tracing-subscriber", "0.3.10" ] + ] + }, + "loupe": { + "0.1.3": [ + [ "indexmap", "1.8.1" ], + [ "loupe-derive", "0.1.3" ], + [ "rustversion", "1.0.6" ] + ] + }, + "loupe-derive": { + "0.1.3": [ + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "lz-fear": { + "0.1.1": [ + [ "bitflags", "1.3.2" ], + [ "byteorder", "1.4.3" ], + [ "fehler", "1.0.0" ], + [ "thiserror", "1.0.30" ], + [ "twox-hash", "1.6.2" ] + ] + }, + "mach": { + "0.2.3": [ + [ "libc", "0.2.121" ] + ], + "0.3.2": [ + [ "libc", "0.2.121" ] + ] + }, + "malloc_buf": { + "0.0.6": [ + [ "libc", "0.2.121" ] + ] + }, + "matchers": { + "0.1.0": [ + [ "regex-automata", "0.1.10" ] + ] + }, + "memmap": { + "0.7.0": [ + [ "libc", "0.2.121" ], + [ "winapi", "0.3.9" ] + ] + }, + "memmap2": { + "0.1.0": [ + [ "libc", "0.2.121" ] + ], + "0.3.1": [ + [ "libc", "0.2.121" ] + ], + "0.5.3": [ + [ "libc", "0.2.121" ] + ] + }, + "memoffset": { + "0.5.6": [ + [ "autocfg", "1.1.0" ] + ], + "0.6.5": [ + [ "autocfg", "1.1.0" ] + ] + }, + "metal": { + "0.22.0": [ + [ "bitflags", "1.3.2" ], + [ "block", "0.1.6" ], + [ "cocoa-foundation", "0.1.0" ], + [ "foreign-types", "0.3.2" ], + [ "log", "0.4.16" ], + [ "objc", "0.2.7" ] + ] + }, + "mimalloc": { + "0.1.29": [ + [ "libmimalloc-sys", "0.1.25" ] + ] + }, + "minifb": { + "0.22.0": [ + [ "cc", "1.0.73" ], + [ "libc", "0.2.121" ], + [ "orbclient", "0.3.32" ], + [ "raw-window-handle", "0.4.3" ], + [ "tempfile", "3.3.0" ], + [ "wayland-client", "0.29.4" ], + [ "wayland-cursor", "0.29.4" ], + [ "wayland-protocols", "0.29.4" ], + [ "winapi", "0.3.9" ], + [ "x11-dl", "2.19.1" ], + [ "xkb", "0.2.1" ], + [ "xkbcommon-sys", "0.7.5" ] + ] + }, + "miniz_oxide": { + "0.5.1": [ + [ "adler", "1.0.2" ] + ] + }, + "mio": { + "0.7.14": [ + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "miow", "0.3.7" ], + [ "ntapi", "0.3.7" ], + [ "winapi", "0.3.9" ] + ], + "0.8.2": [ + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "miow", "0.3.7" ], + [ "ntapi", "0.3.7" ], + [ "wasi", "0.11.0+wasi-snapshot-preview1" ], + [ "winapi", "0.3.9" ] + ] + }, + "mio-misc": { + "1.2.2": [ + [ "crossbeam", "0.8.1" ], + [ "crossbeam-queue", "0.3.5" ], + [ "log", "0.4.16" ], + [ "mio", "0.7.14" ] + ] + }, + "miow": { + "0.3.7": [ + [ "winapi", "0.3.9" ] + ] + }, + "mumble-link": { + "0.1.0": [ + [ "kernel32-sys", "0.2.2" ], + [ "libc", "0.2.121" ], + [ "winapi", "0.2.8" ] + ] + }, + "naga": { + "0.4.0": [ + [ "bit-set", "0.5.2" ], + [ "bitflags", "1.3.2" ], + [ "codespan-reporting", "0.11.1" ], + [ "fxhash", "0.2.1" ], + [ "log", "0.4.16" ], + [ "num-traits", "0.2.14" ], + [ "petgraph", "0.5.1" ], + [ "rose_tree", "0.2.0" ], + [ "spirv_headers", "1.5.0" ], + [ "thiserror", "1.0.30" ] + ] + }, + "native-dialog": { + "0.6.3": [ + [ "block", "0.1.6" ], + [ "cocoa", "0.24.0" ], + [ "dirs-next", "2.0.0" ], + [ "objc", "0.2.7" ], + [ "objc-foundation", "0.1.1" ], + [ "objc_id", "0.1.1" ], + [ "once_cell", "1.10.0" ], + [ "raw-window-handle", "0.4.3" ], + [ "thiserror", "1.0.30" ], + [ "wfd", "0.1.7" ], + [ "which", "4.2.5" ], + [ "winapi", "0.3.9" ] + ] + }, + "ndk": { + "0.3.0": [ + [ "jni-sys", "0.3.0" ], + [ "ndk-sys", "0.2.2" ], + [ "num_enum", "0.5.7" ], + [ "thiserror", "1.0.30" ] + ], + "0.6.0": [ + [ "bitflags", "1.3.2" ], + [ "jni-sys", "0.3.0" ], + [ "ndk-sys", "0.3.0" ], + [ "num_enum", "0.5.7" ], + [ "thiserror", "1.0.30" ] + ] + }, + "ndk-glue": { + "0.3.0": [ + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "ndk", "0.3.0" ], + [ "ndk-macro", "0.2.0" ], + [ "ndk-sys", "0.2.2" ] + ], + "0.6.1": [ + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "ndk", "0.6.0" ], + [ "ndk-context", "0.1.0" ], + [ "ndk-macro", "0.3.0" ], + [ "ndk-sys", "0.3.0" ] + ] + }, + "ndk-macro": { + "0.2.0": [ + [ "darling", "0.10.2" ], + [ "proc-macro-crate", "0.1.5" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ], + "0.3.0": [ + [ "darling", "0.13.2" ], + [ "proc-macro-crate", "1.1.3" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "ndk-sys": { + "0.3.0": [ + [ "jni-sys", "0.3.0" ] + ] + }, + "nibble_vec": { + "0.1.0": [ + [ "smallvec", "1.8.0" ] + ] + }, + "nix": { + "0.18.0": [ + [ "bitflags", "1.3.2" ], + [ "cc", "1.0.73" ], + [ "cfg-if", "0.1.10" ], + [ "libc", "0.2.121" ] + ], + "0.20.0": [ + [ "bitflags", "1.3.2" ], + [ "cc", "1.0.73" ], + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ] + ], + "0.22.3": [ + [ "bitflags", "1.3.2" ], + [ "cc", "1.0.73" ], + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "memoffset", "0.6.5" ] + ], + "0.23.1": [ + [ "bitflags", "1.3.2" ], + [ "cc", "1.0.73" ], + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "memoffset", "0.6.5" ] + ] + }, + "noise": { + "0.7.0": [ + [ "rand", "0.7.3" ], + [ "rand_xorshift", "0.2.0" ] + ] + }, + "nom": { + "4.2.3": [ + [ "memchr", "2.4.1" ], + [ "version_check", "0.1.5" ] + ], + "5.1.2": [ + [ "memchr", "2.4.1" ], + [ "version_check", "0.9.4" ] + ], + "7.1.1": [ + [ "memchr", "2.4.1" ], + [ "minimal-lexical", "0.2.1" ] + ] + }, + "notify": { + "5.0.0-pre.15": [ + [ "bitflags", "1.3.2" ], + [ "crossbeam-channel", "0.5.4" ], + [ "filetime", "0.2.15" ], + [ "fsevent-sys", "4.1.0" ], + [ "inotify", "0.9.6" ], + [ "kqueue", "1.0.4" ], + [ "libc", "0.2.121" ], + [ "mio", "0.8.2" ], + [ "walkdir", "2.3.2" ], + [ "winapi", "0.3.9" ] + ] + }, + "ntapi": { + "0.3.7": [ + [ "winapi", "0.3.9" ] + ] + }, + "num": { + "0.2.1": [ + [ "num-bigint", "0.2.6" ], + [ "num-complex", "0.2.4" ], + [ "num-integer", "0.1.44" ], + [ "num-iter", "0.1.42" ], + [ "num-rational", "0.2.4" ], + [ "num-traits", "0.2.14" ] + ], + "0.4.0": [ + [ "num-bigint", "0.4.3" ], + [ "num-complex", "0.4.0" ], + [ "num-integer", "0.1.44" ], + [ "num-iter", "0.1.42" ], + [ "num-rational", "0.4.0" ], + [ "num-traits", "0.2.14" ] + ] + }, + "num-bigint": { + "0.2.6": [ + [ "autocfg", "1.1.0" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ] + ], + "0.4.3": [ + [ "autocfg", "1.1.0" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ] + ] + }, + "num-complex": { + "0.2.4": [ + [ "autocfg", "1.1.0" ], + [ "num-traits", "0.2.14" ] + ], + "0.4.0": [ + [ "num-traits", "0.2.14" ] + ] + }, + "num-derive": { + "0.3.3": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "num-integer": { + "0.1.44": [ + [ "autocfg", "1.1.0" ], + [ "num-traits", "0.2.14" ] + ] + }, + "num-iter": { + "0.1.42": [ + [ "autocfg", "1.1.0" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ] + ] + }, + "num-rational": { + "0.2.4": [ + [ "autocfg", "1.1.0" ], + [ "num-bigint", "0.2.6" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ] + ], + "0.4.0": [ + [ "autocfg", "1.1.0" ], + [ "num-bigint", "0.4.3" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ] + ] + }, + "num-traits": { + "0.2.14": [ + [ "autocfg", "1.1.0" ], + [ "libm", "0.2.2" ] + ] + }, + "num_cpus": { + "1.13.1": [ + [ "hermit-abi", "0.1.19" ], + [ "libc", "0.2.121" ] + ] + }, + "num_enum": { + "0.5.7": [ + [ "num_enum_derive", "0.5.7" ] + ] + }, + "num_enum_derive": { + "0.5.7": [ + [ "proc-macro-crate", "1.1.3" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "num_threads": { + "0.1.5": [ + [ "libc", "0.2.121" ] + ] + }, + "objc": { + "0.2.7": [ + [ "malloc_buf", "0.0.6" ], + [ "objc_exception", "0.1.2" ] + ] + }, + "objc-foundation": { + "0.1.1": [ + [ "block", "0.1.6" ], + [ "objc", "0.2.7" ], + [ "objc_id", "0.1.1" ] + ] + }, + "objc_exception": { + "0.1.2": [ + [ "cc", "1.0.73" ] + ] + }, + "objc_id": { + "0.1.1": [ + [ "objc", "0.2.7" ] + ] + }, + "object": { + "0.28.3": [ + [ "crc32fast", "1.3.2" ], + [ "hashbrown", "0.11.2" ], + [ "indexmap", "1.8.1" ], + [ "memchr", "2.4.1" ] + ] + }, + "oboe": { + "0.4.5": [ + [ "jni", "0.19.0" ], + [ "ndk", "0.6.0" ], + [ "ndk-glue", "0.6.1" ], + [ "num-derive", "0.3.3" ], + [ "num-traits", "0.2.14" ], + [ "oboe-sys", "0.4.5" ] + ] + }, + "oboe-sys": { + "0.4.5": [ + [ "cc", "1.0.73" ] + ] + }, + "ogg": { + "0.8.0": [ + [ "byteorder", "1.4.3" ] + ] + }, + "orbclient": { + "0.3.32": [ + [ "libc", "0.2.121" ], + [ "raw-window-handle", "0.3.4" ], + [ "redox_syscall", "0.2.13" ], + [ "sdl2", "0.35.2" ], + [ "sdl2-sys", "0.35.2" ], + [ "wasm-bindgen", "0.2.79" ], + [ "web-sys", "0.3.50" ] + ] + }, + "ordered-float": { + "1.1.1": [ + [ "num-traits", "0.2.14" ] + ], + "2.10.0": [ + [ "num-traits", "0.2.14" ] + ], + "3.0.0": [ + [ "num-traits", "0.2.14" ] + ] + }, + "owned_ttf_parser": { + "0.15.0": [ + [ "ttf-parser", "0.15.0" ] + ], + "0.6.0": [ + [ "ttf-parser", "0.6.2" ] + ] + }, + "packed_simd_2": { + "0.3.7": [ + [ "cfg-if", "1.0.0" ], + [ "libm", "0.1.4" ] + ] + }, + "parking_lot": { + "0.10.2": [ + [ "lock_api", "0.3.4" ], + [ "parking_lot_core", "0.7.2" ] + ], + "0.11.2": [ + [ "instant", "0.1.12" ], + [ "lock_api", "0.4.7" ], + [ "parking_lot_core", "0.8.5" ] + ], + "0.12.0": [ + [ "lock_api", "0.4.7" ], + [ "parking_lot_core", "0.9.2" ] + ] + }, + "parking_lot_core": { + "0.7.2": [ + [ "cfg-if", "0.1.10" ], + [ "cloudabi", "0.0.3" ], + [ "libc", "0.2.121" ], + [ "redox_syscall", "0.1.57" ], + [ "smallvec", "1.8.0" ], + [ "winapi", "0.3.9" ] + ], + "0.8.5": [ + [ "cfg-if", "1.0.0" ], + [ "instant", "0.1.12" ], + [ "libc", "0.2.121" ], + [ "redox_syscall", "0.2.13" ], + [ "smallvec", "1.8.0" ], + [ "winapi", "0.3.9" ] + ], + "0.9.2": [ + [ "cfg-if", "1.0.0" ], + [ "libc", "0.2.121" ], + [ "redox_syscall", "0.2.13" ], + [ "smallvec", "1.8.0" ], + [ "windows-sys", "0.34.0" ] + ] + }, + "parse-zoneinfo": { + "0.3.0": [ + [ "regex", "1.5.5" ] + ] + }, + "pem": { + "1.0.2": [ + [ "base64", "0.13.0" ] + ] + }, + "petgraph": { + "0.4.13": [ + [ "fixedbitset", "0.1.9" ] + ], + "0.5.1": [ + [ "fixedbitset", "0.2.0" ], + [ "indexmap", "1.8.1" ] + ], + "0.6.0": [ + [ "fixedbitset", "0.4.1" ], + [ "indexmap", "1.8.1" ] + ] + }, + "phf": { + "0.10.1": [ + [ "phf_shared", "0.10.0" ] + ] + }, + "phf_codegen": { + "0.10.0": [ + [ "phf_generator", "0.10.0" ], + [ "phf_shared", "0.10.0" ] + ] + }, + "phf_generator": { + "0.10.0": [ + [ "phf_shared", "0.10.0" ], + [ "rand", "0.8.5" ] + ] + }, + "phf_shared": { + "0.10.0": [ + [ "siphasher", "0.3.10" ], + [ "uncased", "0.9.6" ] + ] + }, + "piston-viewport": { + "0.5.0": [ + [ "piston-float", "0.3.0" ] + ] + }, + "pistoncore-input": { + "0.24.0": [ + [ "bitflags", "1.3.2" ], + [ "piston-viewport", "0.5.0" ], + [ "serde", "1.0.136" ], + [ "serde_derive", "1.0.136" ] + ] + }, + "plotters": { + "0.3.0": [ + [ "num-traits", "0.2.14" ], + [ "plotters-backend", "0.3.2" ], + [ "plotters-svg", "0.3.1" ], + [ "wasm-bindgen", "0.2.79" ], + [ "web-sys", "0.3.50" ] + ] + }, + "plotters-svg": { + "0.3.1": [ + [ "plotters-backend", "0.3.2" ] + ] + }, + "png": { + "0.17.5": [ + [ "bitflags", "1.3.2" ], + [ "crc32fast", "1.3.2" ], + [ "deflate", "1.0.0" ], + [ "miniz_oxide", "0.5.1" ] + ] + }, + "portpicker": { + "0.1.0": [ + [ "rand", "0.8.5" ] + ] + }, + "proc-macro-crate": { + "0.1.5": [ + [ "toml", "0.5.8" ] + ], + "1.1.3": [ + [ "thiserror", "1.0.30" ], + [ "toml", "0.5.8" ] + ] + }, + "proc-macro-error": { + "1.0.4": [ + [ "proc-macro-error-attr", "1.0.4" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ], + [ "version_check", "0.9.4" ] + ] + }, + "proc-macro-error-attr": { + "1.0.4": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "version_check", "0.9.4" ] + ] + }, + "proc-macro2": { + "0.4.30": [ + [ "unicode-xid", "0.1.0" ] + ], + "1.0.40": [ + [ "unicode-ident", "1.0.1" ] + ] + }, + "profiling": { + "1.0.6": [ + [ "profiling-procmacros", "1.0.6" ], + [ "tracy-client", "0.13.2" ] + ] + }, + "profiling-procmacros": { + "1.0.6": [ + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "prometheus": { + "0.13.0": [ + [ "cfg-if", "1.0.0" ], + [ "fnv", "1.0.7" ], + [ "lazy_static", "1.4.0" ], + [ "memchr", "2.4.1" ], + [ "parking_lot", "0.11.2" ], + [ "thiserror", "1.0.30" ] + ] + }, + "prometheus-hyper": { + "0.1.4": [ + [ "hyper", "0.14.18" ], + [ "prometheus", "0.13.0" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ] + ] + }, + "ptr_meta": { + "0.1.4": [ + [ "ptr_meta_derive", "0.1.4" ] + ] + }, + "ptr_meta_derive": { + "0.1.4": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "quick-xml": { + "0.22.0": [ + [ "memchr", "2.4.1" ] + ] + }, + "quinn": { + "0.8.2": [ + [ "bytes", "1.1.0" ], + [ "futures-channel", "0.3.21" ], + [ "futures-util", "0.3.21" ], + [ "fxhash", "0.2.1" ], + [ "quinn-proto", "0.8.2" ], + [ "quinn-udp", "0.1.1" ], + [ "rustls", "0.20.4" ], + [ "thiserror", "1.0.30" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ], + [ "webpki", "0.22.0" ] + ] + }, + "quinn-proto": { + "0.8.2": [ + [ "bytes", "1.1.0" ], + [ "fxhash", "0.2.1" ], + [ "rand", "0.8.5" ], + [ "ring", "0.16.20" ], + [ "rustls", "0.20.4" ], + [ "rustls-native-certs", "0.6.1" ], + [ "rustls-pemfile", "0.2.1" ], + [ "slab", "0.4.6" ], + [ "thiserror", "1.0.30" ], + [ "tinyvec", "1.5.1" ], + [ "tracing", "0.1.32" ], + [ "webpki", "0.22.0" ] + ] + }, + "quinn-udp": { + "0.1.1": [ + [ "futures-util", "0.3.21" ], + [ "libc", "0.2.121" ], + [ "mio", "0.7.14" ], + [ "quinn-proto", "0.8.2" ], + [ "socket2", "0.4.4" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ] + ] + }, + "quote": { + "0.6.13": [ + [ "proc-macro2", "0.4.30" ] + ], + "1.0.20": [ + [ "proc-macro2", "1.0.40" ] + ] + }, + "radix_trie": { + "0.2.1": [ + [ "endian-type", "0.1.2" ], + [ "nibble_vec", "0.1.0" ] + ] + }, + "rand": { + "0.7.3": [ + [ "getrandom", "0.1.16" ], + [ "libc", "0.2.121" ], + [ "rand_chacha", "0.2.2" ], + [ "rand_core", "0.5.1" ], + [ "rand_hc", "0.2.0" ] + ], + "0.8.5": [ + [ "libc", "0.2.121" ], + [ "rand_chacha", "0.3.1" ], + [ "rand_core", "0.6.3" ] + ] + }, + "rand_chacha": { + "0.2.2": [ + [ "ppv-lite86", "0.2.16" ], + [ "rand_core", "0.5.1" ] + ], + "0.3.1": [ + [ "ppv-lite86", "0.2.16" ], + [ "rand_core", "0.6.3" ] + ] + }, + "rand_core": { + "0.5.1": [ + [ "getrandom", "0.1.16" ] + ], + "0.6.3": [ + [ "getrandom", "0.2.6" ] + ] + }, + "rand_distr": { + "0.4.3": [ + [ "num-traits", "0.2.14" ], + [ "rand", "0.8.5" ] + ] + }, + "rand_hc": { + "0.2.0": [ + [ "rand_core", "0.5.1" ] + ] + }, + "rand_xorshift": { + "0.2.0": [ + [ "rand_core", "0.5.1" ] + ] + }, + "raw-window-handle": { + "0.3.4": [ + [ "libc", "0.2.121" ], + [ "raw-window-handle", "0.4.3" ] + ], + "0.4.3": [ + [ "cty", "0.2.2" ] + ] + }, + "rayon": { + "1.5.1": [ + [ "autocfg", "1.1.0" ], + [ "crossbeam-deque", "0.8.1" ], + [ "either", "1.6.1" ], + [ "rayon-core", "1.9.1" ] + ] + }, + "rayon-core": { + "1.9.1": [ + [ "crossbeam-channel", "0.5.4" ], + [ "crossbeam-deque", "0.8.1" ], + [ "crossbeam-utils", "0.8.8" ], + [ "lazy_static", "1.4.0" ], + [ "num_cpus", "1.13.1" ] + ] + }, + "rcgen": { + "0.9.2": [ + [ "pem", "1.0.2" ], + [ "ring", "0.16.20" ], + [ "time", "0.3.9" ], + [ "yasna", "0.5.0" ] + ] + }, + "redox_syscall": { + "0.2.13": [ + [ "bitflags", "1.3.2" ] + ] + }, + "redox_users": { + "0.4.3": [ + [ "getrandom", "0.2.6" ], + [ "redox_syscall", "0.2.13" ], + [ "thiserror", "1.0.30" ] + ] + }, + "refinery": { + "0.5.0": [ + [ "refinery-core", "0.5.0" ], + [ "refinery-macros", "0.5.0" ] + ] + }, + "refinery-core": { + "0.5.0": [ + [ "async-trait", "0.1.53" ], + [ "cfg-if", "1.0.0" ], + [ "chrono", "0.4.19" ], + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "regex", "1.5.5" ], + [ "rusqlite", "0.24.2" ], + [ "serde", "1.0.136" ], + [ "siphasher", "0.3.10" ], + [ "thiserror", "1.0.30" ], + [ "toml", "0.5.8" ], + [ "url", "2.2.2" ], + [ "walkdir", "2.3.2" ] + ] + }, + "refinery-macros": { + "0.5.0": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "refinery-core", "0.5.0" ], + [ "regex", "1.5.5" ], + [ "syn", "1.0.98" ] + ] + }, + "regalloc": { + "0.0.31": [ + [ "log", "0.4.16" ], + [ "rustc-hash", "1.1.0" ], + [ "smallvec", "1.8.0" ] + ] + }, + "regex": { + "1.5.5": [ + [ "aho-corasick", "0.7.18" ], + [ "memchr", "2.4.1" ], + [ "regex-syntax", "0.6.25" ] + ] + }, + "regex-automata": { + "0.1.10": [ + [ "regex-syntax", "0.6.25" ] + ] + }, + "region": { + "3.0.0": [ + [ "bitflags", "1.3.2" ], + [ "libc", "0.2.121" ], + [ "mach", "0.3.2" ], + [ "winapi", "0.3.9" ] + ] + }, + "remove_dir_all": { + "0.5.3": [ + [ "winapi", "0.3.9" ] + ] + }, + "rend": { + "0.3.6": [ + [ "bytecheck", "0.6.7" ] + ] + }, + "ring": { + "0.16.20": [ + [ "cc", "1.0.73" ], + [ "libc", "0.2.121" ], + [ "once_cell", "1.10.0" ], + [ "spin", "0.5.2" ], + [ "untrusted", "0.7.1" ], + [ "web-sys", "0.3.50" ], + [ "winapi", "0.3.9" ] + ] + }, + "rkyv": { + "0.7.37": [ + [ "bytecheck", "0.6.7" ], + [ "hashbrown", "0.12.0" ], + [ "ptr_meta", "0.1.4" ], + [ "rend", "0.3.6" ], + [ "rkyv_derive", "0.7.37" ], + [ "seahash", "4.1.0" ] + ] + }, + "rkyv_derive": { + "0.7.37": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "rodio": { + "0.15.0": [ + [ "cpal", "0.13.5" ], + [ "lewton", "0.10.2" ] + ] + }, + "ron": { + "0.6.6": [ + [ "base64", "0.13.0" ], + [ "bitflags", "1.3.2" ], + [ "serde", "1.0.136" ] + ], + "0.7.0": [ + [ "base64", "0.13.0" ], + [ "bitflags", "1.3.2" ], + [ "serde", "1.0.136" ] + ] + }, + "rose_tree": { + "0.2.0": [ + [ "petgraph", "0.5.1" ] + ] + }, + "roxmltree": { + "0.14.1": [ + [ "xmlparser", "0.13.3" ] + ] + }, + "rstar": { + "0.9.2": [ + [ "heapless", "0.6.1" ], + [ "num-traits", "0.2.14" ], + [ "pdqselect", "0.1.0" ], + [ "smallvec", "1.8.0" ] + ] + }, + "rusqlite": { + "0.24.2": [ + [ "bitflags", "1.3.2" ], + [ "fallible-iterator", "0.2.0" ], + [ "fallible-streaming-iterator", "0.1.9" ], + [ "hashlink", "0.6.0" ], + [ "lazy_static", "1.4.0" ], + [ "libsqlite3-sys", "0.20.1" ], + [ "memchr", "2.4.1" ], + [ "smallvec", "1.8.0" ] + ] + }, + "rust-argon2": { + "0.8.3": [ + [ "base64", "0.13.0" ], + [ "blake2b_simd", "0.5.11" ], + [ "constant_time_eq", "0.1.5" ] + ] + }, + "rustc_version": { + "0.2.3": [ + [ "semver", "0.9.0" ] + ], + "0.4.0": [ + [ "semver", "1.0.7" ] + ] + }, + "rustix": { + "0.34.1": [ + [ "bitflags", "1.3.2" ], + [ "errno", "0.2.8" ], + [ "io-lifetimes", "0.6.1" ], + [ "libc", "0.2.121" ], + [ "linux-raw-sys", "0.0.42" ], + [ "winapi", "0.3.9" ] + ] + }, + "rustls": { + "0.19.1": [ + [ "base64", "0.13.0" ], + [ "log", "0.4.16" ], + [ "ring", "0.16.20" ], + [ "sct", "0.6.1" ], + [ "webpki", "0.21.4" ] + ], + "0.20.4": [ + [ "log", "0.4.16" ], + [ "ring", "0.16.20" ], + [ "sct", "0.7.0" ], + [ "webpki", "0.22.0" ] + ] + }, + "rustls-native-certs": { + "0.5.0": [ + [ "openssl-probe", "0.1.5" ], + [ "rustls", "0.19.1" ], + [ "schannel", "0.1.19" ], + [ "security-framework", "2.6.1" ] + ], + "0.6.1": [ + [ "openssl-probe", "0.1.5" ], + [ "rustls-pemfile", "0.2.1" ], + [ "schannel", "0.1.19" ], + [ "security-framework", "2.6.1" ] + ] + }, + "rustls-pemfile": { + "0.2.1": [ + [ "base64", "0.13.0" ] + ], + "1.0.0": [ + [ "base64", "0.13.0" ] + ] + }, + "rusttype": { + "0.7.9": [ + [ "rusttype", "0.8.3" ] + ], + "0.8.3": [ + [ "approx", "0.3.2" ], + [ "crossbeam-deque", "0.7.4" ], + [ "crossbeam-utils", "0.7.2" ], + [ "linked-hash-map", "0.5.4" ], + [ "num_cpus", "1.13.1" ], + [ "ordered-float", "1.1.1" ], + [ "rustc-hash", "1.1.0" ], + [ "stb_truetype", "0.3.1" ] + ], + "0.9.2": [ + [ "ab_glyph_rasterizer", "0.1.5" ], + [ "owned_ttf_parser", "0.6.0" ] + ] + }, + "rusty-xinput": { + "1.2.0": [ + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "winapi", "0.3.9" ] + ] + }, + "rustyline": { + "9.1.2": [ + [ "bitflags", "1.3.2" ], + [ "cfg-if", "1.0.0" ], + [ "clipboard-win", "4.4.1" ], + [ "dirs-next", "2.0.0" ], + [ "fd-lock", "3.0.5" ], + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "memchr", "2.4.1" ], + [ "nix", "0.23.1" ], + [ "radix_trie", "0.2.1" ], + [ "scopeguard", "1.1.0" ], + [ "smallvec", "1.8.0" ], + [ "unicode-segmentation", "1.9.0" ], + [ "unicode-width", "0.1.9" ], + [ "utf8parse", "0.2.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "same-file": { + "1.0.6": [ + [ "winapi-util", "0.1.5" ] + ] + }, + "schannel": { + "0.1.19": [ + [ "lazy_static", "1.4.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "sct": { + "0.6.1": [ + [ "ring", "0.16.20" ], + [ "untrusted", "0.7.1" ] + ], + "0.7.0": [ + [ "ring", "0.16.20" ], + [ "untrusted", "0.7.1" ] + ] + }, + "sdl2": { + "0.35.2": [ + [ "bitflags", "1.3.2" ], + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "raw-window-handle", "0.4.3" ], + [ "sdl2-sys", "0.35.2" ] + ] + }, + "sdl2-sys": { + "0.35.2": [ + [ "cfg-if", "1.0.0" ], + [ "cmake", "0.1.45" ], + [ "libc", "0.2.121" ], + [ "version-compare", "0.1.0" ] + ] + }, + "security-framework": { + "2.6.1": [ + [ "bitflags", "1.3.2" ], + [ "core-foundation", "0.9.3" ], + [ "core-foundation-sys", "0.8.3" ], + [ "libc", "0.2.121" ], + [ "security-framework-sys", "2.6.1" ] + ] + }, + "security-framework-sys": { + "2.6.1": [ + [ "core-foundation-sys", "0.8.3" ], + [ "libc", "0.2.121" ] + ] + }, + "semver": { + "0.9.0": [ + [ "semver-parser", "0.7.0" ] + ] + }, + "serde": { + "1.0.136": [ + [ "serde_derive", "1.0.136" ] + ] + }, + "serde_bytes": { + "0.11.5": [ + [ "serde", "1.0.136" ] + ] + }, + "serde_cbor": { + "0.11.2": [ + [ "half", "1.8.2" ], + [ "serde", "1.0.136" ] + ] + }, + "serde_derive": { + "1.0.136": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "serde_json": { + "1.0.79": [ + [ "itoa", "1.0.1" ], + [ "ryu", "1.0.9" ], + [ "serde", "1.0.136" ] + ] + }, + "serde_repr": { + "0.1.7": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "sha1": { + "0.6.1": [ + [ "sha1_smol", "1.0.0" ] + ] + }, + "sha2": { + "0.10.2": [ + [ "cfg-if", "1.0.0" ], + [ "cpufeatures", "0.2.2" ], + [ "digest", "0.10.3" ] + ] + }, + "shaderc": { + "0.8.0": [ + [ "libc", "0.2.121" ], + [ "shaderc-sys", "0.8.0" ] + ] + }, + "shaderc-sys": { + "0.8.0": [ + [ "cmake", "0.1.45" ], + [ "libc", "0.2.121" ], + [ "roxmltree", "0.14.1" ] + ] + }, + "sharded-slab": { + "0.1.4": [ + [ "lazy_static", "1.4.0" ] + ] + }, + "shellexpand": { + "2.1.0": [ + [ "dirs-next", "2.0.0" ] + ] + }, + "shred": { + "0.13.0": [ + [ "arrayvec", "0.7.2" ], + [ "hashbrown", "0.12.0" ], + [ "mopa", "0.2.2" ], + [ "rayon", "1.5.1" ], + [ "shred-derive", "0.6.3" ], + [ "smallvec", "1.8.0" ], + [ "tynm", "0.1.6" ] + ] + }, + "shred-derive": { + "0.6.3": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "signal-hook": { + "0.1.17": [ + [ "libc", "0.2.121" ], + [ "mio", "0.7.14" ], + [ "signal-hook-registry", "1.4.0" ] + ], + "0.3.13": [ + [ "libc", "0.2.121" ], + [ "signal-hook-registry", "1.4.0" ] + ] + }, + "signal-hook-mio": { + "0.2.3": [ + [ "libc", "0.2.121" ], + [ "mio", "0.8.2" ], + [ "signal-hook", "0.3.13" ] + ] + }, + "signal-hook-registry": { + "1.4.0": [ + [ "libc", "0.2.121" ] + ] + }, + "slotmap": { + "1.0.6": [ + [ "serde", "1.0.136" ], + [ "version_check", "0.9.4" ] + ] + }, + "smithay-client-toolkit": { + "0.12.3": [ + [ "andrew", "0.3.1" ], + [ "bitflags", "1.3.2" ], + [ "calloop", "0.6.5" ], + [ "dlib", "0.4.2" ], + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "memmap2", "0.1.0" ], + [ "nix", "0.18.0" ], + [ "wayland-client", "0.28.6" ], + [ "wayland-cursor", "0.28.6" ], + [ "wayland-protocols", "0.28.6" ] + ], + "0.15.3": [ + [ "bitflags", "1.3.2" ], + [ "dlib", "0.5.0" ], + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "memmap2", "0.3.1" ], + [ "nix", "0.22.3" ], + [ "pkg-config", "0.3.25" ], + [ "wayland-client", "0.29.4" ], + [ "wayland-cursor", "0.29.4" ], + [ "wayland-protocols", "0.29.4" ] + ] + }, + "smithay-clipboard": { + "0.6.5": [ + [ "smithay-client-toolkit", "0.15.3" ], + [ "wayland-client", "0.29.4" ] + ] + }, + "socket2": { + "0.4.4": [ + [ "libc", "0.2.121" ], + [ "winapi", "0.3.9" ] + ] + }, + "specs": { + "0.18.0": [ + [ "crossbeam-queue", "0.3.5" ], + [ "hashbrown", "0.12.0" ], + [ "hibitset", "0.6.3" ], + [ "log", "0.4.16" ], + [ "rayon", "1.5.1" ], + [ "serde", "1.0.136" ], + [ "shred", "0.13.0" ], + [ "shrev", "1.1.1" ], + [ "specs-derive", "0.4.1" ], + [ "tuple_utils", "0.4.0" ] + ] + }, + "specs-derive": { + "0.4.1": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "spin_sleep": { + "1.1.1": [ + [ "once_cell", "1.10.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "spirv_cross": { + "0.23.1": [ + [ "cc", "1.0.73" ], + [ "js-sys", "0.3.56" ], + [ "wasm-bindgen", "0.2.79" ] + ] + }, + "spirv_headers": { + "1.5.0": [ + [ "bitflags", "1.3.2" ], + [ "num-traits", "0.2.14" ] + ] + }, + "stb_truetype": { + "0.3.1": [ + [ "byteorder", "1.4.3" ] + ] + }, + "stdweb": { + "0.4.20": [ + [ "discard", "1.0.4" ], + [ "rustc_version", "0.2.3" ], + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "stdweb-derive", "0.5.3" ], + [ "stdweb-internal-macros", "0.2.9" ], + [ "stdweb-internal-runtime", "0.1.5" ], + [ "wasm-bindgen", "0.2.79" ] + ] + }, + "stdweb-derive": { + "0.5.3": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "serde", "1.0.136" ], + [ "serde_derive", "1.0.136" ], + [ "syn", "1.0.98" ] + ] + }, + "stdweb-internal-macros": { + "0.2.9": [ + [ "base-x", "0.2.8" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "serde", "1.0.136" ], + [ "serde_derive", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "sha1", "0.6.1" ], + [ "syn", "1.0.98" ] + ] + }, + "storage-map": { + "0.3.0": [ + [ "lock_api", "0.4.7" ] + ] + }, + "structopt": { + "0.3.26": [ + [ "clap", "2.34.0" ], + [ "lazy_static", "1.4.0" ], + [ "structopt-derive", "0.4.18" ] + ] + }, + "structopt-derive": { + "0.4.18": [ + [ "heck", "0.3.3" ], + [ "proc-macro-error", "1.0.4" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "strum": { + "0.24.0": [ + [ "strum_macros", "0.24.0" ] + ] + }, + "strum_macros": { + "0.24.0": [ + [ "heck", "0.4.0" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "rustversion", "1.0.6" ], + [ "syn", "1.0.98" ] + ] + }, + "syn": { + "0.15.44": [ + [ "proc-macro2", "0.4.30" ], + [ "quote", "0.6.13" ], + [ "unicode-xid", "0.1.0" ] + ], + "1.0.98": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "unicode-ident", "1.0.1" ] + ] + }, + "tar": { + "0.4.38": [ + [ "filetime", "0.2.15" ], + [ "libc", "0.2.121" ], + [ "xattr", "0.2.2" ] + ] + }, + "tempfile": { + "3.3.0": [ + [ "cfg-if", "1.0.0" ], + [ "fastrand", "1.7.0" ], + [ "libc", "0.2.121" ], + [ "redox_syscall", "0.2.13" ], + [ "remove_dir_all", "0.5.3" ], + [ "winapi", "0.3.9" ] + ] + }, + "termcolor": { + "1.1.3": [ + [ "winapi-util", "0.1.5" ] + ] + }, + "textwrap": { + "0.11.0": [ + [ "unicode-width", "0.1.9" ] + ] + }, + "thiserror": { + "1.0.30": [ + [ "thiserror-impl", "1.0.30" ] + ] + }, + "thiserror-impl": { + "1.0.30": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "thread_local": { + "1.1.4": [ + [ "once_cell", "1.10.0" ] + ] + }, + "time": { + "0.1.44": [ + [ "libc", "0.2.121" ], + [ "wasi", "0.10.0+wasi-snapshot-preview1" ], + [ "winapi", "0.3.9" ] + ], + "0.3.9": [ + [ "itoa", "1.0.1" ], + [ "libc", "0.2.121" ], + [ "num_threads", "0.1.5" ] + ] + }, + "tiny-keccak": { + "2.0.2": [ + [ "crunchy", "0.2.2" ] + ] + }, + "tinytemplate": { + "1.2.1": [ + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ] + ] + }, + "tinyvec": { + "1.5.1": [ + [ "tinyvec_macros", "0.1.0" ] + ] + }, + "tokio": { + "1.17.0": [ + [ "bytes", "1.1.0" ], + [ "libc", "0.2.121" ], + [ "memchr", "2.4.1" ], + [ "mio", "0.8.2" ], + [ "num_cpus", "1.13.1" ], + [ "once_cell", "1.10.0" ], + [ "pin-project-lite", "0.2.8" ], + [ "signal-hook-registry", "1.4.0" ], + [ "socket2", "0.4.4" ], + [ "tokio-macros", "1.7.0" ], + [ "winapi", "0.3.9" ] + ] + }, + "tokio-macros": { + "1.7.0": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "tokio-rustls": { + "0.22.0": [ + [ "rustls", "0.19.1" ], + [ "tokio", "1.17.0" ], + [ "webpki", "0.21.4" ] + ] + }, + "tokio-stream": { + "0.1.8": [ + [ "futures-core", "0.3.21" ], + [ "pin-project-lite", "0.2.8" ], + [ "tokio", "1.17.0" ] + ] + }, + "tokio-util": { + "0.7.1": [ + [ "bytes", "1.1.0" ], + [ "futures-core", "0.3.21" ], + [ "futures-sink", "0.3.21" ], + [ "pin-project-lite", "0.2.8" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ] + ] + }, + "toml": { + "0.5.8": [ + [ "serde", "1.0.136" ] + ] + }, + "tracing": { + "0.1.32": [ + [ "cfg-if", "1.0.0" ], + [ "log", "0.4.16" ], + [ "pin-project-lite", "0.2.8" ], + [ "tracing-attributes", "0.1.20" ], + [ "tracing-core", "0.1.24" ] + ] + }, + "tracing-appender": { + "0.2.2": [ + [ "crossbeam-channel", "0.5.4" ], + [ "time", "0.3.9" ], + [ "tracing-subscriber", "0.3.10" ] + ] + }, + "tracing-attributes": { + "0.1.20": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "tracing-core": { + "0.1.24": [ + [ "lazy_static", "1.4.0" ], + [ "valuable", "0.1.0" ] + ] + }, + "tracing-log": { + "0.1.2": [ + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "tracing-core", "0.1.24" ] + ] + }, + "tracing-subscriber": { + "0.3.10": [ + [ "ansi_term", "0.12.1" ], + [ "lazy_static", "1.4.0" ], + [ "matchers", "0.1.0" ], + [ "regex", "1.5.5" ], + [ "sharded-slab", "0.1.4" ], + [ "smallvec", "1.8.0" ], + [ "thread_local", "1.1.4" ], + [ "time", "0.3.9" ], + [ "tracing", "0.1.32" ], + [ "tracing-core", "0.1.24" ], + [ "tracing-log", "0.1.2" ] + ] + }, + "tracing-tracy": { + "0.9.0": [ + [ "tracing-core", "0.1.24" ], + [ "tracing-subscriber", "0.3.10" ], + [ "tracy-client", "0.13.2" ] + ] + }, + "tracy-client": { + "0.13.2": [ + [ "loom", "0.5.4" ], + [ "once_cell", "1.10.0" ], + [ "tracy-client-sys", "0.17.0" ] + ] + }, + "tracy-client-sys": { + "0.17.0": [ + [ "cc", "1.0.73" ] + ] + }, + "treeculler": { + "0.2.0": [ + [ "num-traits", "0.2.14" ], + [ "vek", "0.14.1" ] + ] + }, + "tui": { + "0.10.0": [ + [ "bitflags", "1.3.2" ], + [ "cassowary", "0.3.0" ], + [ "crossterm", "0.17.7" ], + [ "unicode-segmentation", "1.9.0" ], + [ "unicode-width", "0.1.9" ] + ] + }, + "twox-hash": { + "1.6.2": [ + [ "cfg-if", "1.0.0" ], + [ "rand", "0.8.5" ], + [ "static_assertions", "1.1.0" ] + ] + }, + "tynm": { + "0.1.6": [ + [ "nom", "5.1.2" ] + ] + }, + "type-map": { + "0.5.0": [ + [ "rustc-hash", "1.1.0" ] + ] + }, + "uncased": { + "0.9.6": [ + [ "version_check", "0.9.4" ] + ] + }, + "unic-langid": { + "0.9.0": [ + [ "unic-langid-impl", "0.9.0" ] + ] + }, + "unic-langid-impl": { + "0.9.0": [ + [ "tinystr", "0.3.4" ] + ] + }, + "unicode-normalization": { + "0.1.19": [ + [ "tinyvec", "1.5.1" ] + ] + }, + "url": { + "2.2.2": [ + [ "form_urlencoded", "1.0.1" ], + [ "idna", "0.2.3" ], + [ "matches", "0.1.9" ], + [ "percent-encoding", "2.1.0" ] + ] + }, + "uuid": { + "0.8.2": [ + [ "getrandom", "0.2.6" ], + [ "serde", "1.0.136" ] + ] + }, + "vek": { + "0.14.1": [ + [ "approx", "0.4.0" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ], + [ "rustc_version", "0.2.3" ], + [ "serde", "1.0.136" ], + [ "static_assertions", "1.1.0" ] + ], + "0.15.8": [ + [ "approx", "0.5.1" ], + [ "num-integer", "0.1.44" ], + [ "num-traits", "0.2.14" ], + [ "rustc_version", "0.4.0" ], + [ "serde", "1.0.136" ], + [ "static_assertions", "1.1.0" ] + ] + }, + "veloren-client": { + "0.13.0": [ + [ "async-channel", "1.6.1" ], + [ "authc", "1.0.0" ], + [ "byteorder", "1.4.3" ], + [ "clap", "3.1.10" ], + [ "hashbrown", "0.12.0" ], + [ "image", "0.24.2" ], + [ "num", "0.4.0" ], + [ "quinn", "0.8.2" ], + [ "rayon", "1.5.1" ], + [ "ron", "0.7.0" ], + [ "rustyline", "9.1.2" ], + [ "serde", "1.0.136" ], + [ "specs", "0.18.0" ], + [ "structopt", "0.3.26" ], + [ "termcolor", "1.1.3" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-ecs", "0.10.0" ], + [ "veloren-common-frontend", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ], + [ "veloren-common-state", "0.10.0" ], + [ "veloren-common-systems", "0.10.0" ], + [ "veloren-network", "0.3.0" ] + ] + }, + "veloren-common": { + "0.10.0": [ + [ "approx", "0.4.0" ], + [ "bitflags", "1.3.2" ], + [ "chrono", "0.4.19" ], + [ "chrono-tz", "0.6.1" ], + [ "clap", "2.34.0" ], + [ "criterion", "0.3.4" ], + [ "crossbeam-channel", "0.5.4" ], + [ "crossbeam-utils", "0.8.8" ], + [ "csv", "1.1.6" ], + [ "dot_vox", "4.1.0" ], + [ "enum-iterator", "0.7.0" ], + [ "fxhash", "0.2.1" ], + [ "hashbrown", "0.12.0" ], + [ "indexmap", "1.8.1" ], + [ "kiddo", "0.1.7" ], + [ "lazy_static", "1.4.0" ], + [ "num-derive", "0.3.3" ], + [ "num-traits", "0.2.14" ], + [ "ordered-float", "2.10.0" ], + [ "petgraph", "0.6.0" ], + [ "rand", "0.8.5" ], + [ "rayon", "1.5.1" ], + [ "ron", "0.7.0" ], + [ "roots", "0.0.6" ], + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "serde_repr", "0.1.7" ], + [ "sha2", "0.10.2" ], + [ "slab", "0.4.6" ], + [ "slotmap", "1.0.6" ], + [ "specs", "0.18.0" ], + [ "spin_sleep", "1.1.1" ], + [ "structopt", "0.3.26" ], + [ "strum", "0.24.0" ], + [ "tracing", "0.1.32" ], + [ "tracing-subscriber", "0.3.10" ], + [ "uuid", "0.8.2" ], + [ "vek", "0.15.8" ], + [ "veloren-common-assets", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ] + ] + }, + "veloren-common-assets": { + "0.10.0": [ + [ "assets_manager", "0.8.1" ], + [ "dot_vox", "4.1.0" ], + [ "image", "0.24.2" ], + [ "lazy_static", "1.4.0" ], + [ "ron", "0.7.0" ], + [ "serde", "1.0.136" ], + [ "tracing", "0.1.32" ], + [ "walkdir", "2.3.2" ], + [ "wavefront", "0.2.2" ] + ] + }, + "veloren-common-base": { + "0.10.0": [ + [ "directories-next", "2.0.0" ], + [ "tracing", "0.1.32" ], + [ "tracy-client", "0.13.2" ] + ] + }, + "veloren-common-ecs": { + "0.10.0": [ + [ "float-cmp", "0.9.0" ], + [ "specs", "0.18.0" ], + [ "tracing", "0.1.32" ], + [ "veloren-common-base", "0.10.0" ] + ] + }, + "veloren-common-frontend": { + "0.10.0": [ + [ "termcolor", "1.1.3" ], + [ "tracing", "0.1.32" ], + [ "tracing-appender", "0.2.2" ], + [ "tracing-log", "0.1.2" ], + [ "tracing-subscriber", "0.3.10" ], + [ "tracing-tracy", "0.9.0" ], + [ "veloren-common-base", "0.10.0" ] + ] + }, + "veloren-common-net": { + "0.10.0": [ + [ "bincode", "1.3.3" ], + [ "flate2", "1.0.24" ], + [ "hashbrown", "0.12.0" ], + [ "image", "0.24.2" ], + [ "num-traits", "0.2.14" ], + [ "serde", "1.0.136" ], + [ "specs", "0.18.0" ], + [ "sum_type", "0.2.0" ], + [ "tracing", "0.1.32" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ] + ] + }, + "veloren-common-state": { + "0.10.0": [ + [ "bincode", "1.3.3" ], + [ "hashbrown", "0.12.0" ], + [ "num_cpus", "1.13.1" ], + [ "rayon", "1.5.1" ], + [ "scopeguard", "1.1.0" ], + [ "serde", "1.0.136" ], + [ "specs", "0.18.0" ], + [ "tar", "0.4.38" ], + [ "toml", "0.5.8" ], + [ "tracing", "0.1.32" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-ecs", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ], + [ "veloren-plugin-api", "0.1.0" ], + [ "wasmer", "2.2.1" ] + ] + }, + "veloren-common-systems": { + "0.10.0": [ + [ "hashbrown", "0.12.0" ], + [ "indexmap", "1.8.1" ], + [ "ordered-float", "3.0.0" ], + [ "rand", "0.8.5" ], + [ "rayon", "1.5.1" ], + [ "slab", "0.4.6" ], + [ "specs", "0.18.0" ], + [ "tracing", "0.1.32" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-ecs", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ], + [ "veloren-common-state", "0.10.0" ] + ] + }, + "veloren-network": { + "0.3.0": [ + [ "async-channel", "1.6.1" ], + [ "async-trait", "0.1.53" ], + [ "bincode", "1.3.3" ], + [ "bitflags", "1.3.2" ], + [ "bytes", "1.1.0" ], + [ "clap", "3.1.10" ], + [ "criterion", "0.3.4" ], + [ "crossbeam-channel", "0.5.4" ], + [ "futures-core", "0.3.21" ], + [ "futures-util", "0.3.21" ], + [ "hashbrown", "0.12.0" ], + [ "lazy_static", "1.4.0" ], + [ "lz-fear", "0.1.1" ], + [ "prometheus", "0.13.0" ], + [ "prometheus-hyper", "0.1.4" ], + [ "quinn", "0.8.2" ], + [ "rand", "0.8.5" ], + [ "rcgen", "0.9.2" ], + [ "rustls", "0.20.4" ], + [ "serde", "1.0.136" ], + [ "shellexpand", "2.1.0" ], + [ "socket2", "0.4.4" ], + [ "tokio", "1.17.0" ], + [ "tokio-stream", "0.1.8" ], + [ "tracing", "0.1.32" ], + [ "tracing-subscriber", "0.3.10" ], + [ "veloren-network-protocol", "0.6.1" ] + ] + }, + "veloren-network-protocol": { + "0.6.1": [ + [ "async-channel", "1.6.1" ], + [ "async-trait", "0.1.53" ], + [ "bitflags", "1.3.2" ], + [ "bytes", "1.1.0" ], + [ "criterion", "0.3.4" ], + [ "hashbrown", "0.12.0" ], + [ "prometheus", "0.13.0" ], + [ "rand", "0.8.5" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ] + ] + }, + "veloren-plugin-api": { + "0.1.0": [ + [ "bincode", "1.3.3" ], + [ "serde", "1.0.136" ], + [ "veloren-common", "0.10.0" ] + ] + }, + "veloren-plugin-derive": { + "0.1.0": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "veloren-plugin-rt": { + "0.1.0": [ + [ "bincode", "1.3.3" ], + [ "serde", "1.0.136" ], + [ "veloren-plugin-api", "0.1.0" ], + [ "veloren-plugin-derive", "0.1.0" ] + ] + }, + "veloren-server": { + "0.13.0": [ + [ "atomicwrites", "0.3.1" ], + [ "authc", "1.0.0" ], + [ "bincode", "1.3.3" ], + [ "censor", "0.2.0" ], + [ "chrono", "0.4.19" ], + [ "chrono-tz", "0.6.1" ], + [ "crossbeam-channel", "0.5.4" ], + [ "enumset", "1.0.9" ], + [ "futures-util", "0.3.21" ], + [ "hashbrown", "0.12.0" ], + [ "humantime", "2.1.0" ], + [ "itertools", "0.10.3" ], + [ "lazy_static", "1.4.0" ], + [ "noise", "0.7.0" ], + [ "num_cpus", "1.13.1" ], + [ "portpicker", "0.1.0" ], + [ "prometheus", "0.13.0" ], + [ "prometheus-hyper", "0.1.4" ], + [ "quinn", "0.8.2" ], + [ "rand", "0.8.5" ], + [ "rand_distr", "0.4.3" ], + [ "rayon", "1.5.1" ], + [ "refinery", "0.5.0" ], + [ "ron", "0.7.0" ], + [ "rusqlite", "0.24.2" ], + [ "rustls", "0.20.4" ], + [ "rustls-pemfile", "1.0.0" ], + [ "serde", "1.0.136" ], + [ "serde_json", "1.0.79" ], + [ "slab", "0.4.6" ], + [ "specs", "0.18.0" ], + [ "strum", "0.24.0" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-ecs", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ], + [ "veloren-common-state", "0.10.0" ], + [ "veloren-common-systems", "0.10.0" ], + [ "veloren-network", "0.3.0" ], + [ "veloren-plugin-api", "0.1.0" ], + [ "veloren-world", "0.10.0" ] + ] + }, + "veloren-server-cli": { + "0.13.0": [ + [ "ansi-parser", "0.8.0" ], + [ "clap", "3.1.10" ], + [ "crossterm", "0.23.2" ], + [ "lazy_static", "1.4.0" ], + [ "mimalloc", "0.1.29" ], + [ "num_cpus", "1.13.1" ], + [ "ron", "0.7.0" ], + [ "serde", "1.0.136" ], + [ "shell-words", "1.1.0" ], + [ "signal-hook", "0.3.13" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ], + [ "tui", "0.10.0" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-frontend", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ], + [ "veloren-server", "0.13.0" ] + ] + }, + "veloren-voxygen": { + "0.13.0": [ + [ "assets_manager", "0.8.1" ], + [ "backtrace", "0.3.65" ], + [ "bincode", "1.3.3" ], + [ "bytemuck", "1.9.1" ], + [ "chrono", "0.4.19" ], + [ "chumsky", "0.8.0" ], + [ "cmake", "0.1.45" ], + [ "conrod_core", "0.63.0" ], + [ "conrod_winit", "0.63.0" ], + [ "copy_dir", "0.1.2" ], + [ "cpal", "0.13.5" ], + [ "criterion", "0.3.4" ], + [ "crossbeam-channel", "0.5.4" ], + [ "crossbeam-utils", "0.8.8" ], + [ "directories-next", "2.0.0" ], + [ "discord-sdk", "0.3.0" ], + [ "dispatch", "0.1.4" ], + [ "dot_vox", "4.1.0" ], + [ "egui", "0.12.0" ], + [ "egui_wgpu_backend", "0.8.0" ], + [ "egui_winit_platform", "0.8.0" ], + [ "enum-iterator", "0.7.0" ], + [ "etagere", "0.2.7" ], + [ "euc", "0.5.3" ], + [ "gilrs", "0.8.2" ], + [ "glyph_brush", "0.7.3" ], + [ "guillotiere", "0.6.2" ], + [ "hashbrown", "0.12.0" ], + [ "iced_native", "0.4.0" ], + [ "iced_winit", "0.3.0" ], + [ "image", "0.24.2" ], + [ "inline_tweak", "1.0.8" ], + [ "itertools", "0.10.3" ], + [ "keyboard-keynames", "0.1.0" ], + [ "lazy_static", "1.4.0" ], + [ "mimalloc", "0.1.29" ], + [ "mumble-link", "0.1.0" ], + [ "native-dialog", "0.6.3" ], + [ "num", "0.4.0" ], + [ "num_cpus", "1.13.1" ], + [ "ordered-float", "3.0.0" ], + [ "profiling", "1.0.6" ], + [ "rand", "0.8.5" ], + [ "rand_chacha", "0.3.1" ], + [ "rayon", "1.5.1" ], + [ "rodio", "0.15.0" ], + [ "ron", "0.7.0" ], + [ "serde", "1.0.136" ], + [ "shaderc", "0.8.0" ], + [ "slab", "0.4.6" ], + [ "specs", "0.18.0" ], + [ "strum", "0.24.0" ], + [ "tokio", "1.17.0" ], + [ "tracing", "0.1.32" ], + [ "treeculler", "0.2.0" ], + [ "vek", "0.15.8" ], + [ "veloren-client", "0.13.0" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-ecs", "0.10.0" ], + [ "veloren-common-frontend", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ], + [ "veloren-common-state", "0.10.0" ], + [ "veloren-common-systems", "0.10.0" ], + [ "veloren-server", "0.13.0" ], + [ "veloren-voxygen-anim", "0.10.0" ], + [ "veloren-voxygen-egui", "0.9.0" ], + [ "veloren-voxygen-i18n", "0.13.0" ], + [ "veloren-world", "0.10.0" ], + [ "wgpu", "0.8.0" ], + [ "wgpu-profiler", "0.4.0" ], + [ "window_clipboard", "0.2.2" ], + [ "winit", "0.25.0" ], + [ "winres", "0.1.12" ] + ] + }, + "veloren-voxygen-anim": { + "0.10.0": [ + [ "bytemuck", "1.9.1" ], + [ "lazy_static", "1.4.0" ], + [ "mimalloc", "0.1.29" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-voxygen-dynlib", "0.1.0" ] + ] + }, + "veloren-voxygen-anim-dyn": { + "0.10.0": [ + [ "veloren-voxygen-anim", "0.10.0" ] + ] + }, + "veloren-voxygen-dynlib": { + "0.1.0": [ + [ "find_folder", "0.3.0" ], + [ "libloading", "0.7.3" ], + [ "notify", "5.0.0-pre.15" ], + [ "tracing", "0.1.32" ] + ] + }, + "veloren-voxygen-egui": { + "0.9.0": [ + [ "egui", "0.12.0" ], + [ "egui_winit_platform", "0.8.0" ], + [ "lazy_static", "1.4.0" ], + [ "veloren-client", "0.13.0" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-voxygen-dynlib", "0.1.0" ] + ] + }, + "veloren-voxygen-egui-dyn": { + "0.9.0": [ + [ "veloren-voxygen-egui", "0.9.0" ] + ] + }, + "veloren-voxygen-i18n": { + "0.13.0": [ + [ "clap", "3.1.10" ], + [ "deunicode", "1.3.1" ], + [ "fluent", "0.16.0" ], + [ "fluent-bundle", "0.15.2" ], + [ "fluent-syntax", "0.11.0" ], + [ "hashbrown", "0.12.0" ], + [ "intl-memoizer", "0.5.1" ], + [ "ron", "0.7.0" ], + [ "serde", "1.0.136" ], + [ "tracing", "0.1.32" ], + [ "unic-langid", "0.9.0" ], + [ "veloren-common-assets", "0.10.0" ] + ] + }, + "veloren-world": { + "0.10.0": [ + [ "arr_macro", "0.1.3" ], + [ "bincode", "1.3.3" ], + [ "bitvec", "0.22.3" ], + [ "clap", "3.1.10" ], + [ "criterion", "0.3.4" ], + [ "csv", "1.1.6" ], + [ "deflate", "1.0.0" ], + [ "enum-iterator", "0.7.0" ], + [ "fallible-iterator", "0.2.0" ], + [ "flate2", "1.0.24" ], + [ "fxhash", "0.2.1" ], + [ "hashbrown", "0.12.0" ], + [ "image", "0.24.2" ], + [ "itertools", "0.10.3" ], + [ "kiddo", "0.2.4" ], + [ "lazy_static", "1.4.0" ], + [ "lz-fear", "0.1.1" ], + [ "minifb", "0.22.0" ], + [ "noise", "0.7.0" ], + [ "num", "0.4.0" ], + [ "num-traits", "0.2.14" ], + [ "ordered-float", "3.0.0" ], + [ "packed_simd_2", "0.3.7" ], + [ "rand", "0.8.5" ], + [ "rand_chacha", "0.3.1" ], + [ "rayon", "1.5.1" ], + [ "ron", "0.7.0" ], + [ "rstar", "0.9.2" ], + [ "rusqlite", "0.24.2" ], + [ "serde", "1.0.136" ], + [ "structopt", "0.3.26" ], + [ "strum", "0.24.0" ], + [ "svg_fmt", "0.4.1" ], + [ "tracing", "0.1.32" ], + [ "tracing-subscriber", "0.3.10" ], + [ "vek", "0.15.8" ], + [ "veloren-common", "0.10.0" ], + [ "veloren-common-base", "0.10.0" ], + [ "veloren-common-frontend", "0.10.0" ], + [ "veloren-common-net", "0.10.0" ] + ] + }, + "walkdir": { + "0.1.8": [ + [ "kernel32-sys", "0.2.2" ], + [ "winapi", "0.2.8" ] + ], + "2.3.2": [ + [ "same-file", "1.0.6" ], + [ "winapi", "0.3.9" ], + [ "winapi-util", "0.1.5" ] + ] + }, + "want": { + "0.3.0": [ + [ "log", "0.4.16" ], + [ "try-lock", "0.2.3" ] + ] + }, + "wasm-bindgen": { + "0.2.79": [ + [ "cfg-if", "1.0.0" ], + [ "wasm-bindgen-macro", "0.2.79" ] + ] + }, + "wasm-bindgen-backend": { + "0.2.79": [ + [ "bumpalo", "3.9.1" ], + [ "lazy_static", "1.4.0" ], + [ "log", "0.4.16" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ], + [ "wasm-bindgen-shared", "0.2.79" ] + ] + }, + "wasm-bindgen-futures": { + "0.4.29": [ + [ "cfg-if", "1.0.0" ], + [ "js-sys", "0.3.56" ], + [ "wasm-bindgen", "0.2.79" ], + [ "web-sys", "0.3.50" ] + ] + }, + "wasm-bindgen-macro": { + "0.2.79": [ + [ "quote", "1.0.20" ], + [ "wasm-bindgen-macro-support", "0.2.79" ] + ] + }, + "wasm-bindgen-macro-support": { + "0.2.79": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ], + [ "wasm-bindgen-backend", "0.2.79" ], + [ "wasm-bindgen-shared", "0.2.79" ] + ] + }, + "wasmer": { + "2.2.1": [ + [ "cfg-if", "1.0.0" ], + [ "indexmap", "1.8.1" ], + [ "js-sys", "0.3.56" ], + [ "loupe", "0.1.3" ], + [ "more-asserts", "0.2.2" ], + [ "target-lexicon", "0.12.3" ], + [ "thiserror", "1.0.30" ], + [ "wasm-bindgen", "0.2.79" ], + [ "wasmer-compiler", "2.2.1" ], + [ "wasmer-compiler-cranelift", "2.2.1" ], + [ "wasmer-derive", "2.2.1" ], + [ "wasmer-engine", "2.2.1" ], + [ "wasmer-engine-dylib", "2.2.1" ], + [ "wasmer-engine-universal", "2.2.1" ], + [ "wasmer-types", "2.2.1" ], + [ "wasmer-vm", "2.2.1" ], + [ "wat", "1.0.41" ], + [ "winapi", "0.3.9" ] + ] + }, + "wasmer-compiler": { + "2.2.1": [ + [ "enumset", "1.0.9" ], + [ "loupe", "0.1.3" ], + [ "rkyv", "0.7.37" ], + [ "serde", "1.0.136" ], + [ "serde_bytes", "0.11.5" ], + [ "smallvec", "1.8.0" ], + [ "target-lexicon", "0.12.3" ], + [ "thiserror", "1.0.30" ], + [ "wasmer-types", "2.2.1" ], + [ "wasmer-vm", "2.2.1" ], + [ "wasmparser", "0.78.2" ] + ] + }, + "wasmer-compiler-cranelift": { + "2.2.1": [ + [ "cranelift-codegen", "0.76.0" ], + [ "cranelift-entity", "0.76.0" ], + [ "cranelift-frontend", "0.76.0" ], + [ "gimli", "0.25.0" ], + [ "loupe", "0.1.3" ], + [ "more-asserts", "0.2.2" ], + [ "rayon", "1.5.1" ], + [ "smallvec", "1.8.0" ], + [ "target-lexicon", "0.12.3" ], + [ "tracing", "0.1.32" ], + [ "wasmer-compiler", "2.2.1" ], + [ "wasmer-types", "2.2.1" ], + [ "wasmer-vm", "2.2.1" ] + ] + }, + "wasmer-derive": { + "2.2.1": [ + [ "proc-macro-error", "1.0.4" ], + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "syn", "1.0.98" ] + ] + }, + "wasmer-engine": { + "2.2.1": [ + [ "backtrace", "0.3.65" ], + [ "enumset", "1.0.9" ], + [ "lazy_static", "1.4.0" ], + [ "loupe", "0.1.3" ], + [ "memmap2", "0.5.3" ], + [ "more-asserts", "0.2.2" ], + [ "rustc-demangle", "0.1.21" ], + [ "serde", "1.0.136" ], + [ "serde_bytes", "0.11.5" ], + [ "target-lexicon", "0.12.3" ], + [ "thiserror", "1.0.30" ], + [ "wasmer-compiler", "2.2.1" ], + [ "wasmer-types", "2.2.1" ], + [ "wasmer-vm", "2.2.1" ] + ] + }, + "wasmer-engine-dylib": { + "2.2.1": [ + [ "cfg-if", "1.0.0" ], + [ "enum-iterator", "0.7.0" ], + [ "enumset", "1.0.9" ], + [ "leb128", "0.2.5" ], + [ "libloading", "0.7.3" ], + [ "loupe", "0.1.3" ], + [ "object", "0.28.3" ], + [ "rkyv", "0.7.37" ], + [ "serde", "1.0.136" ], + [ "tempfile", "3.3.0" ], + [ "tracing", "0.1.32" ], + [ "wasmer-compiler", "2.2.1" ], + [ "wasmer-engine", "2.2.1" ], + [ "wasmer-object", "2.2.1" ], + [ "wasmer-types", "2.2.1" ], + [ "wasmer-vm", "2.2.1" ], + [ "which", "4.2.5" ] + ] + }, + "wasmer-engine-universal": { + "2.2.1": [ + [ "cfg-if", "1.0.0" ], + [ "enum-iterator", "0.7.0" ], + [ "enumset", "1.0.9" ], + [ "leb128", "0.2.5" ], + [ "loupe", "0.1.3" ], + [ "region", "3.0.0" ], + [ "rkyv", "0.7.37" ], + [ "wasmer-compiler", "2.2.1" ], + [ "wasmer-engine", "2.2.1" ], + [ "wasmer-types", "2.2.1" ], + [ "wasmer-vm", "2.2.1" ], + [ "winapi", "0.3.9" ] + ] + }, + "wasmer-object": { + "2.2.1": [ + [ "object", "0.28.3" ], + [ "thiserror", "1.0.30" ], + [ "wasmer-compiler", "2.2.1" ], + [ "wasmer-types", "2.2.1" ] + ] + }, + "wasmer-types": { + "2.2.1": [ + [ "indexmap", "1.8.1" ], + [ "loupe", "0.1.3" ], + [ "rkyv", "0.7.37" ], + [ "serde", "1.0.136" ], + [ "thiserror", "1.0.30" ] + ] + }, + "wasmer-vm": { + "2.2.1": [ + [ "backtrace", "0.3.65" ], + [ "cc", "1.0.73" ], + [ "cfg-if", "1.0.0" ], + [ "enum-iterator", "0.7.0" ], + [ "indexmap", "1.8.1" ], + [ "libc", "0.2.121" ], + [ "loupe", "0.1.3" ], + [ "memoffset", "0.6.5" ], + [ "more-asserts", "0.2.2" ], + [ "region", "3.0.0" ], + [ "rkyv", "0.7.37" ], + [ "serde", "1.0.136" ], + [ "thiserror", "1.0.30" ], + [ "wasmer-types", "2.2.1" ], + [ "winapi", "0.3.9" ] + ] + }, + "wast": { + "39.0.0": [ + [ "leb128", "0.2.5" ], + [ "memchr", "2.4.1" ], + [ "unicode-width", "0.1.9" ] + ] + }, + "wat": { + "1.0.41": [ + [ "wast", "39.0.0" ] + ] + }, + "wavefront": { + "0.2.2": [ + [ "hashbrown", "0.9.1" ] + ] + }, + "wayland-client": { + "0.28.6": [ + [ "bitflags", "1.3.2" ], + [ "downcast-rs", "1.2.0" ], + [ "libc", "0.2.121" ], + [ "nix", "0.20.0" ], + [ "scoped-tls", "1.0.0" ], + [ "wayland-commons", "0.28.6" ], + [ "wayland-scanner", "0.28.6" ], + [ "wayland-sys", "0.28.6" ] + ], + "0.29.4": [ + [ "bitflags", "1.3.2" ], + [ "downcast-rs", "1.2.0" ], + [ "libc", "0.2.121" ], + [ "nix", "0.22.3" ], + [ "scoped-tls", "1.0.0" ], + [ "wayland-commons", "0.29.4" ], + [ "wayland-scanner", "0.29.4" ], + [ "wayland-sys", "0.29.4" ] + ] + }, + "wayland-commons": { + "0.28.6": [ + [ "nix", "0.20.0" ], + [ "once_cell", "1.10.0" ], + [ "smallvec", "1.8.0" ], + [ "wayland-sys", "0.28.6" ] + ], + "0.29.4": [ + [ "nix", "0.22.3" ], + [ "once_cell", "1.10.0" ], + [ "smallvec", "1.8.0" ], + [ "wayland-sys", "0.29.4" ] + ] + }, + "wayland-cursor": { + "0.28.6": [ + [ "nix", "0.20.0" ], + [ "wayland-client", "0.28.6" ], + [ "xcursor", "0.3.4" ] + ], + "0.29.4": [ + [ "nix", "0.22.3" ], + [ "wayland-client", "0.29.4" ], + [ "xcursor", "0.3.4" ] + ] + }, + "wayland-protocols": { + "0.28.6": [ + [ "bitflags", "1.3.2" ], + [ "wayland-client", "0.28.6" ], + [ "wayland-commons", "0.28.6" ], + [ "wayland-scanner", "0.28.6" ] + ], + "0.29.4": [ + [ "bitflags", "1.3.2" ], + [ "wayland-client", "0.29.4" ], + [ "wayland-commons", "0.29.4" ], + [ "wayland-scanner", "0.29.4" ] + ] + }, + "wayland-scanner": { + "0.28.6": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "xml-rs", "0.8.4" ] + ], + "0.29.4": [ + [ "proc-macro2", "1.0.40" ], + [ "quote", "1.0.20" ], + [ "xml-rs", "0.8.4" ] + ] + }, + "wayland-sys": { + "0.28.6": [ + [ "dlib", "0.5.0" ], + [ "lazy_static", "1.4.0" ], + [ "pkg-config", "0.3.25" ] + ], + "0.29.4": [ + [ "dlib", "0.5.0" ], + [ "lazy_static", "1.4.0" ], + [ "pkg-config", "0.3.25" ] + ] + }, + "web-sys": { + "0.3.50": [ + [ "js-sys", "0.3.56" ], + [ "wasm-bindgen", "0.2.79" ] + ] + }, + "webpki": { + "0.21.4": [ + [ "ring", "0.16.20" ], + [ "untrusted", "0.7.1" ] + ], + "0.22.0": [ + [ "ring", "0.16.20" ], + [ "untrusted", "0.7.1" ] + ] + }, + "wfd": { + "0.1.7": [ + [ "libc", "0.2.121" ], + [ "winapi", "0.3.9" ] + ] + }, + "wgpu": { + "0.8.0": [ + [ "arrayvec", "0.5.2" ], + [ "js-sys", "0.3.56" ], + [ "log", "0.4.16" ], + [ "naga", "0.4.0" ], + [ "parking_lot", "0.11.2" ], + [ "raw-window-handle", "0.3.4" ], + [ "serde", "1.0.136" ], + [ "smallvec", "1.8.0" ], + [ "wasm-bindgen", "0.2.79" ], + [ "wasm-bindgen-futures", "0.4.29" ], + [ "web-sys", "0.3.50" ], + [ "wgpu-core", "0.8.0" ], + [ "wgpu-types", "0.8.0" ] + ] + }, + "wgpu-core": { + "0.8.0": [ + [ "arrayvec", "0.5.2" ], + [ "bitflags", "1.3.2" ], + [ "cfg_aliases", "0.1.1" ], + [ "copyless", "0.1.5" ], + [ "fxhash", "0.2.1" ], + [ "gfx-backend-dx11", "0.8.0" ], + [ "gfx-backend-dx12", "0.8.0" ], + [ "gfx-backend-empty", "0.8.0" ], + [ "gfx-backend-gl", "0.8.1" ], + [ "gfx-backend-metal", "0.8.1" ], + [ "gfx-backend-vulkan", "0.8.0" ], + [ "gfx-hal", "0.8.0" ], + [ "gpu-alloc", "0.4.7" ], + [ "gpu-descriptor", "0.1.1" ], + [ "log", "0.4.16" ], + [ "naga", "0.4.0" ], + [ "parking_lot", "0.11.2" ], + [ "profiling", "1.0.6" ], + [ "raw-window-handle", "0.3.4" ], + [ "ron", "0.6.6" ], + [ "serde", "1.0.136" ], + [ "smallvec", "1.8.0" ], + [ "thiserror", "1.0.30" ], + [ "wgpu-types", "0.8.0" ] + ] + }, + "wgpu-profiler": { + "0.4.0": [ + [ "futures", "0.3.21" ], + [ "wgpu", "0.8.0" ] + ] + }, + "wgpu-types": { + "0.8.0": [ + [ "bitflags", "1.3.2" ], + [ "serde", "1.0.136" ] + ] + }, + "which": { + "3.1.1": [ + [ "libc", "0.2.121" ] + ], + "4.2.5": [ + [ "either", "1.6.1" ], + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ] + ] + }, + "winapi": { + "0.3.9": [ + [ "winapi-i686-pc-windows-gnu", "0.4.0" ], + [ "winapi-x86_64-pc-windows-gnu", "0.4.0" ] + ] + }, + "winapi-util": { + "0.1.5": [ + [ "winapi", "0.3.9" ] + ] + }, + "winapi-wsapoll": { + "0.1.1": [ + [ "winapi", "0.3.9" ] + ] + }, + "window_clipboard": { + "0.2.2": [ + [ "clipboard-win", "4.4.1" ], + [ "clipboard_macos", "0.1.0" ], + [ "clipboard_wayland", "0.2.0" ], + [ "clipboard_x11", "0.3.1" ], + [ "raw-window-handle", "0.3.4" ], + [ "thiserror", "1.0.30" ] + ] + }, + "windows-sys": { + "0.30.0": [ + [ "windows_aarch64_msvc", "0.30.0" ], + [ "windows_i686_gnu", "0.30.0" ], + [ "windows_i686_msvc", "0.30.0" ], + [ "windows_x86_64_gnu", "0.30.0" ], + [ "windows_x86_64_msvc", "0.30.0" ] + ], + "0.34.0": [ + [ "windows_aarch64_msvc", "0.34.0" ], + [ "windows_i686_gnu", "0.34.0" ], + [ "windows_i686_msvc", "0.34.0" ], + [ "windows_x86_64_gnu", "0.34.0" ], + [ "windows_x86_64_msvc", "0.34.0" ] + ] + }, + "winit": { + "0.25.0": [ + [ "bitflags", "1.3.2" ], + [ "cocoa", "0.24.0" ], + [ "core-foundation", "0.9.3" ], + [ "core-graphics", "0.22.3" ], + [ "core-video-sys", "0.1.4" ], + [ "dispatch", "0.2.0" ], + [ "instant", "0.1.12" ], + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "mio", "0.7.14" ], + [ "mio-misc", "1.2.2" ], + [ "ndk", "0.3.0" ], + [ "ndk-glue", "0.3.0" ], + [ "ndk-sys", "0.2.2" ], + [ "objc", "0.2.7" ], + [ "parking_lot", "0.11.2" ], + [ "percent-encoding", "2.1.0" ], + [ "raw-window-handle", "0.3.4" ], + [ "scopeguard", "1.1.0" ], + [ "serde", "1.0.136" ], + [ "smithay-client-toolkit", "0.12.3" ], + [ "wayland-client", "0.28.6" ], + [ "winapi", "0.3.9" ], + [ "x11-dl", "2.19.1" ] + ] + }, + "winreg": { + "0.10.1": [ + [ "winapi", "0.3.9" ] + ] + }, + "winres": { + "0.1.12": [ + [ "toml", "0.5.8" ] + ] + }, + "wio": { + "0.2.2": [ + [ "winapi", "0.3.9" ] + ] + }, + "wyz": { + "0.4.0": [ + [ "tap", "1.0.1" ] + ] + }, + "x11-clipboard": { + "0.5.3": [ + [ "xcb", "0.10.1" ] + ] + }, + "x11-dl": { + "2.19.1": [ + [ "lazy_static", "1.4.0" ], + [ "libc", "0.2.121" ], + [ "pkg-config", "0.3.25" ] + ] + }, + "x11rb": { + "0.8.1": [ + [ "gethostname", "0.2.3" ], + [ "nix", "0.20.0" ], + [ "winapi", "0.3.9" ], + [ "winapi-wsapoll", "0.1.1" ] + ] + }, + "xattr": { + "0.2.2": [ + [ "libc", "0.2.121" ] + ] + }, + "xcb": { + "0.10.1": [ + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ], + [ "quick-xml", "0.22.0" ] + ], + "0.9.0": [ + [ "libc", "0.2.121" ], + [ "log", "0.4.16" ] + ] + }, + "xcursor": { + "0.3.4": [ + [ "nom", "7.1.1" ] + ] + }, + "xdg": { + "2.4.1": [ + [ "dirs", "4.0.0" ] + ] + }, + "xkb": { + "0.2.1": [ + [ "bitflags", "1.3.2" ], + [ "libc", "0.2.121" ], + [ "xkbcommon-sys", "0.7.5" ] + ] + }, + "xkbcommon-sys": { + "0.7.5": [ + [ "bindgen", "0.56.0" ], + [ "libc", "0.2.121" ], + [ "pkg-config", "0.3.25" ] + ], + "0.7.6": [ + [ "libc", "0.2.121" ], + [ "pkg-config", "0.3.25" ] + ] + }, + "yasna": { + "0.5.0": [ + [ "time", "0.3.9" ] + ] + } + }, + "sources": { + "ab_glyph": { + "0.2.15": { + "hash": "24606928a235e73cdef55a0c909719cadd72fce573e5713d58cb2952d8f5794c", + "type": "crates-io" + } + }, + "ab_glyph_rasterizer": { + "0.1.5": { + "hash": "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e", + "type": "crates-io" + } + }, + "addr2line": { + "0.17.0": { + "hash": "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b", + "type": "crates-io" + } + }, + "adler": { + "1.0.2": { + "hash": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", + "type": "crates-io" + } + }, + "adler32": { + "1.2.0": { + "hash": "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234", + "type": "crates-io" + } + }, + "ahash": { + "0.3.8": { + "hash": "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217", + "type": "crates-io" + }, + "0.4.7": { + "hash": "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e", + "type": "crates-io" + }, + "0.7.6": { + "hash": "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47", + "type": "crates-io" + } + }, + "aho-corasick": { + "0.7.18": { + "hash": "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f", + "type": "crates-io" + } + }, + "alsa": { + "0.6.0": { + "hash": "5915f52fe2cf65e83924d037b6c5290b7cee097c6b5c8700746e6168a343fd6b", + "type": "crates-io" + } + }, + "alsa-sys": { + "0.3.1": { + "hash": "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527", + "type": "crates-io" + } + }, + "andrew": { + "0.3.1": { + "hash": "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf", + "type": "crates-io" + } + }, + "ansi-parser": { + "0.8.0": { + "hash": "bcb2392079bf27198570d6af79ecbd9ec7d8f16d3ec6b60933922fdb66287127", + "type": "crates-io" + } + }, + "ansi_term": { + "0.12.1": { + "hash": "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2", + "type": "crates-io" + } + }, + "anyhow": { + "1.0.61": { + "hash": "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8", + "type": "crates-io" + } + }, + "app_dirs2": { + "2.5.2": { + "hash": "c3564c46eaa62f4a4e50c98e2c698cbb95f95c08501bd2e3baf6ea73773ab9fc", + "type": "crates-io" + } + }, + "approx": { + "0.3.2": { + "hash": "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3", + "type": "crates-io" + }, + "0.4.0": { + "hash": "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278", + "type": "crates-io" + }, + "0.5.1": { + "hash": "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6", + "type": "crates-io" + } + }, + "arr_macro": { + "0.1.3": { + "hash": "6a105bfda48707cf19220129e78fca01e9639433ffaef4163546ed8fb04120a5", + "type": "crates-io" + } + }, + "arr_macro_impl": { + "0.1.3": { + "hash": "0609c78bd572f4edc74310dfb63a01f5609d53fa8b4dd7c4d98aef3b3e8d72d1", + "type": "crates-io" + } + }, + "arrayref": { + "0.3.6": { + "hash": "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544", + "type": "crates-io" + } + }, + "arrayvec": { + "0.5.2": { + "hash": "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b", + "type": "crates-io" + }, + "0.7.2": { + "hash": "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6", + "type": "crates-io" + } + }, + "as-slice": { + "0.1.5": { + "hash": "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0", + "type": "crates-io" + } + }, + "ash": { + "0.32.1": { + "hash": "06063a002a77d2734631db74e8f4ce7148b77fe522e6bca46f2ae7774fd48112", + "type": "crates-io" + } + }, + "assets_manager": { + "0.8.1": { + "hash": "c53a8477ada5edbd6ba3b0698aabaa76b352454aedc8c8dca0c6328fc8313b7e", + "type": "crates-io" + } + }, + "async-channel": { + "1.6.1": { + "hash": "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319", + "type": "crates-io" + } + }, + "async-trait": { + "0.1.53": { + "hash": "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600", + "type": "crates-io" + } + }, + "atom": { + "0.3.6": { + "hash": "c9ff149ed9780025acfdb36862d35b28856bb693ceb451259a7164442f22fdc3", + "type": "crates-io" + } + }, + "atomic_refcell": { + "0.1.8": { + "hash": "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d", + "type": "crates-io" + } + }, + "atomicwrites": { + "0.3.1": { + "hash": "eb8f2cd6962fa53c0e2a9d3f97eaa7dbd1e3cbbeeb4745403515b42ae07b3ff6", + "type": "crates-io" + } + }, + "atty": { + "0.2.14": { + "hash": "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8", + "type": "crates-io" + } + }, + "auth-common": { + "0.1.0": { + "rev": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a", + "type": "git", + "url": "https://gitlab.com/veloren/auth.git" + } + }, + "authc": { + "1.0.0": { + "rev": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a", + "type": "git", + "url": "https://gitlab.com/veloren/auth.git" + } + }, + "autocfg": { + "1.1.0": { + "hash": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", + "type": "crates-io" + } + }, + "backtrace": { + "0.3.65": { + "hash": "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61", + "type": "crates-io" + } + }, + "base-x": { + "0.2.8": { + "hash": "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b", + "type": "crates-io" + } + }, + "base64": { + "0.13.0": { + "hash": "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd", + "type": "crates-io" + } + }, + "bincode": { + "1.3.3": { + "hash": "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad", + "type": "crates-io" + } + }, + "bindgen": { + "0.56.0": { + "hash": "2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239", + "type": "crates-io" + } + }, + "bit-set": { + "0.5.2": { + "hash": "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de", + "type": "crates-io" + } + }, + "bit-vec": { + "0.6.3": { + "hash": "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb", + "type": "crates-io" + } + }, + "bitflags": { + "1.3.2": { + "hash": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + "type": "crates-io" + } + }, + "bitvec": { + "0.22.3": { + "hash": "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527", + "type": "crates-io" + } + }, + "blake2b_simd": { + "0.5.11": { + "hash": "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587", + "type": "crates-io" + } + }, + "block": { + "0.1.6": { + "hash": "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a", + "type": "crates-io" + } + }, + "block-buffer": { + "0.10.2": { + "hash": "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324", + "type": "crates-io" + } + }, + "bstr": { + "0.2.17": { + "hash": "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223", + "type": "crates-io" + } + }, + "bumpalo": { + "3.9.1": { + "hash": "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899", + "type": "crates-io" + } + }, + "bytecheck": { + "0.6.7": { + "hash": "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe", + "type": "crates-io" + } + }, + "bytecheck_derive": { + "0.6.7": { + "hash": "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600", + "type": "crates-io" + } + }, + "bytemuck": { + "1.9.1": { + "hash": "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc", + "type": "crates-io" + } + }, + "bytemuck_derive": { + "1.1.0": { + "hash": "562e382481975bc61d11275ac5e62a19abd00b0547d99516a415336f183dcd0e", + "type": "crates-io" + } + }, + "byteorder": { + "1.4.3": { + "hash": "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610", + "type": "crates-io" + } + }, + "bytes": { + "1.1.0": { + "hash": "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8", + "type": "crates-io" + } + }, + "cache-padded": { + "1.2.0": { + "hash": "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c", + "type": "crates-io" + } + }, + "calloop": { + "0.6.5": { + "hash": "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c", + "type": "crates-io" + } + }, + "cassowary": { + "0.3.0": { + "hash": "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53", + "type": "crates-io" + } + }, + "cast": { + "0.2.7": { + "hash": "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a", + "type": "crates-io" + } + }, + "cc": { + "1.0.73": { + "hash": "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11", + "type": "crates-io" + } + }, + "censor": { + "0.2.0": { + "hash": "5563d2728feef9a6186acdd148bccbe850dad63c5ba55a3b3355abc9137cb3eb", + "type": "crates-io" + } + }, + "cesu8": { + "1.1.0": { + "hash": "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c", + "type": "crates-io" + } + }, + "cexpr": { + "0.4.0": { + "hash": "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27", + "type": "crates-io" + } + }, + "cfg-if": { + "0.1.10": { + "hash": "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822", + "type": "crates-io" + }, + "1.0.0": { + "hash": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "type": "crates-io" + } + }, + "cfg_aliases": { + "0.1.1": { + "hash": "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e", + "type": "crates-io" + } + }, + "chrono": { + "0.4.19": { + "hash": "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73", + "type": "crates-io" + } + }, + "chrono-tz": { + "0.6.1": { + "hash": "58549f1842da3080ce63002102d5bc954c7bc843d4f47818e642abdc36253552", + "type": "crates-io" + } + }, + "chrono-tz-build": { + "0.0.2": { + "hash": "db058d493fb2f65f41861bfed7e3fe6335264a9f0f92710cab5bdf01fef09069", + "type": "crates-io" + } + }, + "chumsky": { + "0.8.0": { + "hash": "8d02796e4586c6c41aeb68eae9bfb4558a522c35f1430c14b40136c3706e09e4", + "type": "crates-io" + } + }, + "clang-sys": { + "1.3.1": { + "hash": "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21", + "type": "crates-io" + } + }, + "clap": { + "2.34.0": { + "hash": "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c", + "type": "crates-io" + }, + "3.1.10": { + "hash": "3124f3f75ce09e22d1410043e1e24f2ecc44fad3afe4f08408f1f7663d68da2b", + "type": "crates-io" + } + }, + "clap_derive": { + "3.1.7": { + "hash": "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1", + "type": "crates-io" + } + }, + "clap_lex": { + "0.1.1": { + "hash": "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669", + "type": "crates-io" + } + }, + "clipboard-win": { + "3.1.1": { + "hash": "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342", + "type": "crates-io" + }, + "4.4.1": { + "hash": "2f3e1238132dc01f081e1cbb9dace14e5ef4c3a51ee244bd982275fb514605db", + "type": "crates-io" + } + }, + "clipboard_macos": { + "0.1.0": { + "hash": "145a7f9e9b89453bc0a5e32d166456405d389cea5b578f57f1274b1397588a95", + "type": "crates-io" + } + }, + "clipboard_wayland": { + "0.2.0": { + "hash": "6f6364a9f7a66f2ac1a1a098aa1c7f6b686f2496c6ac5e5c0d773445df912747", + "type": "crates-io" + } + }, + "clipboard_x11": { + "0.3.1": { + "hash": "64240d63f1883d87e5637bfcaf9d77e5c8bd24e30fd440ea2dff5c48c0bf0b7a", + "type": "crates-io" + } + }, + "cloudabi": { + "0.0.3": { + "hash": "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f", + "type": "crates-io" + } + }, + "cmake": { + "0.1.45": { + "hash": "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855", + "type": "crates-io" + } + }, + "cocoa": { + "0.24.0": { + "hash": "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832", + "type": "crates-io" + } + }, + "cocoa-foundation": { + "0.1.0": { + "hash": "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318", + "type": "crates-io" + } + }, + "codespan-reporting": { + "0.11.1": { + "hash": "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e", + "type": "crates-io" + } + }, + "color_quant": { + "1.1.0": { + "hash": "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b", + "type": "crates-io" + } + }, + "combine": { + "4.6.3": { + "hash": "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062", + "type": "crates-io" + } + }, + "concurrent-queue": { + "1.2.2": { + "hash": "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3", + "type": "crates-io" + } + }, + "conrod_core": { + "0.63.0": { + "ref": "refs/heads/copypasta_0.7", + "rev": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", + "type": "git", + "url": "https://gitlab.com/veloren/conrod.git" + } + }, + "conrod_derive": { + "0.63.0": { + "ref": "refs/heads/copypasta_0.7", + "rev": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", + "type": "git", + "url": "https://gitlab.com/veloren/conrod.git" + } + }, + "conrod_winit": { + "0.63.0": { + "ref": "refs/heads/copypasta_0.7", + "rev": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", + "type": "git", + "url": "https://gitlab.com/veloren/conrod.git" + } + }, + "const-random": { + "0.1.13": { + "hash": "f590d95d011aa80b063ffe3253422ed5aa462af4e9867d43ce8337562bac77c4", + "type": "crates-io" + } + }, + "const-random-macro": { + "0.1.13": { + "hash": "615f6e27d000a2bffbc7f2f6a8669179378fa27ee4d0a509e985dfc0a7defb40", + "type": "crates-io" + } + }, + "constant_time_eq": { + "0.1.5": { + "hash": "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc", + "type": "crates-io" + } + }, + "copy_dir": { + "0.1.2": { + "hash": "6e4281031634644843bd2f5aa9c48cf98fc48d6b083bd90bb11becf10deaf8b0", + "type": "crates-io" + } + }, + "copyless": { + "0.1.5": { + "hash": "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536", + "type": "crates-io" + } + }, + "copypasta": { + "0.7.1": { + "hash": "4423d79fed83ebd9ab81ec21fa97144300a961782158287dc9bf7eddac37ff0b", + "type": "crates-io" + } + }, + "core-foundation": { + "0.6.4": { + "hash": "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d", + "type": "crates-io" + }, + "0.7.0": { + "hash": "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171", + "type": "crates-io" + }, + "0.9.3": { + "hash": "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146", + "type": "crates-io" + } + }, + "core-foundation-sys": { + "0.6.2": { + "hash": "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b", + "type": "crates-io" + }, + "0.7.0": { + "hash": "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac", + "type": "crates-io" + }, + "0.8.3": { + "hash": "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc", + "type": "crates-io" + } + }, + "core-graphics": { + "0.19.2": { + "hash": "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923", + "type": "crates-io" + }, + "0.22.3": { + "hash": "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb", + "type": "crates-io" + } + }, + "core-graphics-types": { + "0.1.1": { + "hash": "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b", + "type": "crates-io" + } + }, + "core-video-sys": { + "0.1.4": { + "hash": "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828", + "type": "crates-io" + } + }, + "coreaudio-rs": { + "0.10.0": { + "hash": "11894b20ebfe1ff903cbdc52259693389eea03b94918a2def2c30c3bf227ad88", + "type": "crates-io" + } + }, + "coreaudio-sys": { + "0.2.9": { + "hash": "ca4679a59dbd8c15f064c012dfe8c1163b9453224238b59bb9328c142b8b248b", + "type": "crates-io" + } + }, + "cpal": { + "0.13.5": { + "hash": "74117836a5124f3629e4b474eed03e479abaf98988b4bb317e29f08cfe0e4116", + "type": "crates-io" + } + }, + "cpufeatures": { + "0.2.2": { + "hash": "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b", + "type": "crates-io" + } + }, + "cranelift-bforest": { + "0.76.0": { + "hash": "7e6bea67967505247f54fa2c85cf4f6e0e31c4e5692c9b70e4ae58e339067333", + "type": "crates-io" + } + }, + "cranelift-codegen": { + "0.76.0": { + "hash": "48194035d2752bdd5bdae429e3ab88676e95f52a2b1355a5d4e809f9e39b1d74", + "type": "crates-io" + } + }, + "cranelift-codegen-meta": { + "0.76.0": { + "hash": "976efb22fcab4f2cd6bd4e9913764616a54d895c1a23530128d04e03633c555f", + "type": "crates-io" + } + }, + "cranelift-codegen-shared": { + "0.76.0": { + "hash": "9dabb5fe66e04d4652e434195b45ae65b5c8172d520247b8f66d8df42b2b45dc", + "type": "crates-io" + } + }, + "cranelift-entity": { + "0.76.0": { + "hash": "3329733e4d4b8e91c809efcaa4faee80bf66f20164e3dd16d707346bd3494799", + "type": "crates-io" + } + }, + "cranelift-frontend": { + "0.76.0": { + "hash": "279afcc0d3e651b773f94837c3d581177b348c8d69e928104b2e9fccb226f921", + "type": "crates-io" + } + }, + "crc32fast": { + "1.3.2": { + "hash": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d", + "type": "crates-io" + } + }, + "criterion": { + "0.3.4": { + "hash": "ab327ed7354547cc2ef43cbe20ef68b988e70b4b593cbd66a2a61733123a3d23", + "type": "crates-io" + } + }, + "criterion-plot": { + "0.4.4": { + "hash": "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57", + "type": "crates-io" + } + }, + "crossbeam": { + "0.8.1": { + "hash": "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845", + "type": "crates-io" + } + }, + "crossbeam-channel": { + "0.5.4": { + "hash": "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53", + "type": "crates-io" + } + }, + "crossbeam-deque": { + "0.7.4": { + "hash": "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed", + "type": "crates-io" + }, + "0.8.1": { + "hash": "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e", + "type": "crates-io" + } + }, + "crossbeam-epoch": { + "0.8.2": { + "hash": "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace", + "type": "crates-io" + }, + "0.9.8": { + "hash": "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c", + "type": "crates-io" + } + }, + "crossbeam-queue": { + "0.3.5": { + "hash": "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2", + "type": "crates-io" + } + }, + "crossbeam-utils": { + "0.7.2": { + "hash": "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8", + "type": "crates-io" + }, + "0.8.8": { + "hash": "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38", + "type": "crates-io" + } + }, + "crossterm": { + "0.17.7": { + "hash": "6f4919d60f26ae233e14233cc39746c8c8bb8cd7b05840ace83604917b51b6c7", + "type": "crates-io" + }, + "0.23.2": { + "hash": "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17", + "type": "crates-io" + } + }, + "crossterm_winapi": { + "0.6.2": { + "hash": "c2265c3f8e080075d9b6417aa72293fc71662f34b4af2612d8d1b074d29510db", + "type": "crates-io" + }, + "0.9.0": { + "hash": "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c", + "type": "crates-io" + } + }, + "crunchy": { + "0.2.2": { + "hash": "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7", + "type": "crates-io" + } + }, + "crypto-common": { + "0.1.3": { + "hash": "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8", + "type": "crates-io" + } + }, + "csv": { + "1.1.6": { + "hash": "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1", + "type": "crates-io" + } + }, + "csv-core": { + "0.1.10": { + "hash": "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90", + "type": "crates-io" + } + }, + "ct-logs": { + "0.8.0": { + "hash": "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8", + "type": "crates-io" + } + }, + "cty": { + "0.2.2": { + "hash": "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35", + "type": "crates-io" + } + }, + "d3d12": { + "0.4.1": { + "hash": "2daefd788d1e96e0a9d66dee4b828b883509bc3ea9ce30665f04c3246372690c", + "type": "crates-io" + } + }, + "daggy": { + "0.5.0": { + "hash": "9293a0da7d1bc1f30090ece4d9f9de79a07be7302ddb00e5eb1fefb6ee6409e2", + "type": "crates-io" + } + }, + "darling": { + "0.10.2": { + "hash": "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858", + "type": "crates-io" + }, + "0.13.2": { + "hash": "4e92cb285610dd935f60ee8b4d62dd1988bd12b7ea50579bd6a138201525318e", + "type": "crates-io" + } + }, + "darling_core": { + "0.10.2": { + "hash": "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b", + "type": "crates-io" + }, + "0.13.2": { + "hash": "5c29e95ab498b18131ea460b2c0baa18cbf041231d122b0b7bfebef8c8e88989", + "type": "crates-io" + } + }, + "darling_macro": { + "0.10.2": { + "hash": "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72", + "type": "crates-io" + }, + "0.13.2": { + "hash": "b21dd6b221dd547528bd6fb15f1a3b7ab03b9a06f76bff288a8c629bcfbe7f0e", + "type": "crates-io" + } + }, + "deflate": { + "1.0.0": { + "hash": "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f", + "type": "crates-io" + } + }, + "deunicode": { + "1.3.1": { + "hash": "f2c9736e15e7df1638a7f6eee92a6511615c738246a052af5ba86f039b65aede", + "type": "crates-io" + } + }, + "digest": { + "0.10.3": { + "hash": "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506", + "type": "crates-io" + } + }, + "directories-next": { + "2.0.0": { + "hash": "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc", + "type": "crates-io" + } + }, + "dirs": { + "4.0.0": { + "hash": "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059", + "type": "crates-io" + } + }, + "dirs-next": { + "2.0.0": { + "hash": "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1", + "type": "crates-io" + } + }, + "dirs-sys": { + "0.3.7": { + "hash": "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6", + "type": "crates-io" + } + }, + "dirs-sys-next": { + "0.1.2": { + "hash": "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d", + "type": "crates-io" + } + }, + "discard": { + "1.0.4": { + "hash": "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0", + "type": "crates-io" + } + }, + "discord-sdk": { + "0.3.0": { + "hash": "e314b59ba110cb4fad80073f5276eb62cda4cc3caabe998f5d664b19fd6a7be0", + "type": "crates-io" + } + }, + "dispatch": { + "0.1.4": { + "hash": "04e93ca78226c51902d7aa8c12c988338aadd9e85ed9c6be8aaac39192ff3605", + "type": "crates-io" + }, + "0.2.0": { + "hash": "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b", + "type": "crates-io" + } + }, + "dlib": { + "0.4.2": { + "hash": "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76", + "type": "crates-io" + }, + "0.5.0": { + "hash": "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794", + "type": "crates-io" + } + }, + "dot_vox": { + "4.1.0": { + "hash": "83c18405ef54de0398b77a3ec8394d3a1639e7bf060e1385201e8db40c44ab41", + "type": "crates-io" + } + }, + "downcast-rs": { + "1.2.0": { + "hash": "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650", + "type": "crates-io" + } + }, + "egui": { + "0.12.0": { + "hash": "788148861d80b87d28d64440a3d31cae190e50ccc3ea585597466d38428365d7", + "type": "crates-io" + } + }, + "egui_wgpu_backend": { + "0.8.0": { + "rev": "63a002c6a9b6c016e45806dd065864431caab621", + "type": "git", + "url": "https://github.com/hasenbanck/egui_wgpu_backend.git" + } + }, + "egui_winit_platform": { + "0.8.0": { + "hash": "cd4cf17c0cd4dbcf2f8fef55a3592b9b7cfd970576c7302d8ba5c521b8560371", + "type": "crates-io" + } + }, + "either": { + "1.6.1": { + "hash": "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457", + "type": "crates-io" + } + }, + "emath": { + "0.12.0": { + "hash": "3e73d6c8c70eadb71756fbbc3c303ab25e163b46b656886dd250de5636efea12", + "type": "crates-io" + } + }, + "endian-type": { + "0.1.2": { + "hash": "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d", + "type": "crates-io" + } + }, + "enum-iterator": { + "0.7.0": { + "hash": "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6", + "type": "crates-io" + } + }, + "enum-iterator-derive": { + "0.7.0": { + "hash": "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159", + "type": "crates-io" + } + }, + "enumset": { + "1.0.9": { + "hash": "42f0ae74db31a8ba0093a411d594a1d6d65c207611816ebf4e75381f3f72b1fe", + "type": "crates-io" + } + }, + "enumset_derive": { + "0.5.6": { + "hash": "5c594871f94ab3a00434cb09f03067c92fa2ece4cc657d58ba402e8377cd85a3", + "type": "crates-io" + } + }, + "env_logger": { + "0.8.4": { + "hash": "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3", + "type": "crates-io" + } + }, + "epaint": { + "0.12.0": { + "hash": "80e2db640801230bdda80629bc3a063927a462f5eaf38a98da676954e78ccb99", + "type": "crates-io" + } + }, + "epi": { + "0.12.0": { + "hash": "59c4f6cbede1fc8f836384f85295a59199a4825940abcc3a8a29cfe2e3c37583", + "type": "crates-io" + } + }, + "errno": { + "0.2.8": { + "hash": "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1", + "type": "crates-io" + } + }, + "errno-dragonfly": { + "0.1.2": { + "hash": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf", + "type": "crates-io" + } + }, + "error-code": { + "2.3.1": { + "hash": "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21", + "type": "crates-io" + } + }, + "etagere": { + "0.2.7": { + "hash": "6301151a318f367f392c31395beb1cfba5ccd9abc44d1db0db3a4b27b9601c89", + "type": "crates-io" + } + }, + "euc": { + "0.5.3": { + "hash": "0947d06646d28a4ac2862ac5eadc1062704d61ee398b3baba8b4a21e2f1ef5ed", + "type": "crates-io" + } + }, + "euclid": { + "0.22.7": { + "hash": "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade", + "type": "crates-io" + } + }, + "event-listener": { + "2.5.2": { + "hash": "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71", + "type": "crates-io" + } + }, + "fallible-iterator": { + "0.2.0": { + "hash": "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7", + "type": "crates-io" + } + }, + "fallible-streaming-iterator": { + "0.1.9": { + "hash": "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a", + "type": "crates-io" + } + }, + "fastrand": { + "1.7.0": { + "hash": "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf", + "type": "crates-io" + } + }, + "fd-lock": { + "3.0.5": { + "hash": "46e245f4c8ec30c6415c56cb132c07e69e74f1942f6b4a4061da748b49f486ca", + "type": "crates-io" + } + }, + "fehler": { + "1.0.0": { + "hash": "d5729fe49ba028cd550747b6e62cd3d841beccab5390aa398538c31a2d983635", + "type": "crates-io" + } + }, + "fehler-macros": { + "1.0.0": { + "hash": "ccb5acb1045ebbfa222e2c50679e392a71dd77030b78fb0189f2d9c5974400f9", + "type": "crates-io" + } + }, + "filetime": { + "0.2.15": { + "hash": "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98", + "type": "crates-io" + } + }, + "find_folder": { + "0.3.0": { + "hash": "9f6d018fb95a0b59f854aed68ecd96ce2b80af7911b92b1fed3c4b1fa516b91b", + "type": "crates-io" + } + }, + "fixedbitset": { + "0.1.9": { + "hash": "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33", + "type": "crates-io" + }, + "0.2.0": { + "hash": "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d", + "type": "crates-io" + }, + "0.4.1": { + "hash": "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e", + "type": "crates-io" + } + }, + "flate2": { + "1.0.24": { + "hash": "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6", + "type": "crates-io" + } + }, + "float-cmp": { + "0.9.0": { + "hash": "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4", + "type": "crates-io" + } + }, + "fluent": { + "0.16.0": { + "ref": "refs/heads/patched", + "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", + "type": "git", + "url": "https://github.com/juliancoffee/fluent-rs.git" + } + }, + "fluent-bundle": { + "0.15.2": { + "ref": "refs/heads/patched", + "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", + "type": "git", + "url": "https://github.com/juliancoffee/fluent-rs.git" + } + }, + "fluent-langneg": { + "0.13.0": { + "hash": "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94", + "type": "crates-io" + } + }, + "fluent-syntax": { + "0.11.0": { + "ref": "refs/heads/patched", + "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", + "type": "git", + "url": "https://github.com/juliancoffee/fluent-rs.git" + } + }, + "fnv": { + "1.0.7": { + "hash": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", + "type": "crates-io" + } + }, + "foreign-types": { + "0.3.2": { + "hash": "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1", + "type": "crates-io" + } + }, + "foreign-types-shared": { + "0.1.1": { + "hash": "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b", + "type": "crates-io" + } + }, + "form_urlencoded": { + "1.0.1": { + "hash": "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191", + "type": "crates-io" + } + }, + "fsevent-sys": { + "4.1.0": { + "hash": "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2", + "type": "crates-io" + } + }, + "funty": { + "1.2.0": { + "hash": "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e", + "type": "crates-io" + } + }, + "futures": { + "0.3.21": { + "hash": "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e", + "type": "crates-io" + } + }, + "futures-channel": { + "0.3.21": { + "hash": "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010", + "type": "crates-io" + } + }, + "futures-core": { + "0.3.21": { + "hash": "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3", + "type": "crates-io" + } + }, + "futures-executor": { + "0.3.21": { + "hash": "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6", + "type": "crates-io" + } + }, + "futures-io": { + "0.3.21": { + "hash": "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b", + "type": "crates-io" + } + }, + "futures-macro": { + "0.3.21": { + "hash": "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512", + "type": "crates-io" + } + }, + "futures-sink": { + "0.3.21": { + "hash": "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868", + "type": "crates-io" + } + }, + "futures-task": { + "0.3.21": { + "hash": "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a", + "type": "crates-io" + } + }, + "futures-util": { + "0.3.21": { + "hash": "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a", + "type": "crates-io" + } + }, + "fxhash": { + "0.2.1": { + "hash": "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c", + "type": "crates-io" + } + }, + "generator": { + "0.7.0": { + "hash": "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee", + "type": "crates-io" + } + }, + "generic-array": { + "0.12.4": { + "hash": "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd", + "type": "crates-io" + }, + "0.13.3": { + "hash": "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309", + "type": "crates-io" + }, + "0.14.5": { + "hash": "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803", + "type": "crates-io" + } + }, + "gethostname": { + "0.2.3": { + "hash": "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e", + "type": "crates-io" + } + }, + "getrandom": { + "0.1.16": { + "hash": "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce", + "type": "crates-io" + }, + "0.2.6": { + "hash": "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad", + "type": "crates-io" + } + }, + "gfx-auxil": { + "0.9.0": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-backend-dx11": { + "0.8.0": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-backend-dx12": { + "0.8.0": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-backend-empty": { + "0.8.0": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-backend-gl": { + "0.8.1": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-backend-metal": { + "0.8.1": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-backend-vulkan": { + "0.8.0": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gfx-hal": { + "0.8.0": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "gilrs": { + "0.8.2": { + "hash": "1550c8bdebc993576e343d600a954654708a9a1182396ee1e805d6fe60c72909", + "type": "crates-io" + } + }, + "gilrs-core": { + "0.3.2": { + "hash": "84c7262ce1e88429c9b1d847820c9d2ba00adafc955218393d9c0861d5aaab88", + "type": "crates-io" + } + }, + "gimli": { + "0.25.0": { + "hash": "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7", + "type": "crates-io" + }, + "0.26.1": { + "hash": "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4", + "type": "crates-io" + } + }, + "glam": { + "0.10.2": { + "hash": "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15", + "type": "crates-io" + } + }, + "glob": { + "0.3.0": { + "hash": "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574", + "type": "crates-io" + } + }, + "glow": { + "0.9.0": { + "hash": "4b80b98efaa8a34fce11d60dd2ce2760d5d83c373cbcc73bb87c2a3a84a54108", + "type": "crates-io" + } + }, + "glyph_brush": { + "0.7.3": { + "hash": "21932fbf719272848eec4583740d978203c6e7da4c4e203358f5b95946c97409", + "type": "crates-io" + } + }, + "glyph_brush_draw_cache": { + "0.1.5": { + "hash": "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610", + "type": "crates-io" + } + }, + "glyph_brush_layout": { + "0.2.3": { + "hash": "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38", + "type": "crates-io" + } + }, + "gpu-alloc": { + "0.4.7": { + "hash": "cbc1b6ca374e81862526786d9cb42357ce03706ed1b8761730caafd02ab91f3a", + "type": "crates-io" + } + }, + "gpu-alloc-types": { + "0.2.0": { + "hash": "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5", + "type": "crates-io" + } + }, + "gpu-descriptor": { + "0.1.1": { + "hash": "e8a70f1e87a3840ed6a3e99e02c2b861e4dbdf26f0d07e38f42ea5aff46cfce2", + "type": "crates-io" + } + }, + "gpu-descriptor-types": { + "0.1.1": { + "hash": "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126", + "type": "crates-io" + } + }, + "guillotiere": { + "0.6.2": { + "hash": "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782", + "type": "crates-io" + } + }, + "h2": { + "0.3.13": { + "hash": "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57", + "type": "crates-io" + } + }, + "half": { + "1.8.2": { + "hash": "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7", + "type": "crates-io" + } + }, + "hash32": { + "0.1.1": { + "hash": "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc", + "type": "crates-io" + } + }, + "hashbrown": { + "0.11.2": { + "hash": "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e", + "type": "crates-io" + }, + "0.12.0": { + "hash": "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758", + "type": "crates-io" + }, + "0.9.1": { + "hash": "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04", + "type": "crates-io" + } + }, + "hashlink": { + "0.6.0": { + "hash": "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8", + "type": "crates-io" + } + }, + "heapless": { + "0.5.6": { + "hash": "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1", + "type": "crates-io" + }, + "0.6.1": { + "hash": "634bd4d29cbf24424d0a4bfcbf80c6960129dc24424752a7d1d1390607023422", + "type": "crates-io" + } + }, + "heck": { + "0.3.3": { + "hash": "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c", + "type": "crates-io" + }, + "0.4.0": { + "hash": "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9", + "type": "crates-io" + } + }, + "hermit-abi": { + "0.1.19": { + "hash": "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33", + "type": "crates-io" + } + }, + "hex": { + "0.3.2": { + "hash": "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77", + "type": "crates-io" + } + }, + "hibitset": { + "0.6.3": { + "hash": "93a1bb8316a44459a7d14253c4d28dd7395cbd23cc04a68c46e851b8e46d64b1", + "type": "crates-io" + } + }, + "http": { + "0.2.6": { + "hash": "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03", + "type": "crates-io" + } + }, + "http-body": { + "0.4.4": { + "hash": "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6", + "type": "crates-io" + } + }, + "httparse": { + "1.6.0": { + "hash": "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4", + "type": "crates-io" + } + }, + "httpdate": { + "1.0.2": { + "hash": "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421", + "type": "crates-io" + } + }, + "humantime": { + "2.1.0": { + "hash": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", + "type": "crates-io" + } + }, + "hyper": { + "0.14.18": { + "hash": "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2", + "type": "crates-io" + } + }, + "hyper-rustls": { + "0.22.1": { + "hash": "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64", + "type": "crates-io" + } + }, + "iced_core": { + "0.4.0": { + "ref": "refs/tags/winit-0.25", + "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "git", + "url": "https://github.com/Imberflur/iced" + } + }, + "iced_futures": { + "0.3.0": { + "ref": "refs/tags/winit-0.25", + "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "git", + "url": "https://github.com/Imberflur/iced" + } + }, + "iced_graphics": { + "0.2.0": { + "ref": "refs/tags/winit-0.25", + "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "git", + "url": "https://github.com/Imberflur/iced" + } + }, + "iced_native": { + "0.4.0": { + "ref": "refs/tags/winit-0.25", + "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "git", + "url": "https://github.com/Imberflur/iced" + } + }, + "iced_style": { + "0.3.0": { + "ref": "refs/tags/winit-0.25", + "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "git", + "url": "https://github.com/Imberflur/iced" + } + }, + "iced_winit": { + "0.3.0": { + "ref": "refs/tags/winit-0.25", + "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", + "type": "git", + "url": "https://github.com/Imberflur/iced" + } + }, + "ident_case": { + "1.0.1": { + "hash": "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39", + "type": "crates-io" + } + }, + "idna": { + "0.2.3": { + "hash": "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8", + "type": "crates-io" + } + }, + "image": { + "0.24.2": { + "hash": "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212", + "type": "crates-io" + } + }, + "indexmap": { + "1.8.1": { + "hash": "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee", + "type": "crates-io" + } + }, + "inline_tweak": { + "1.0.8": { + "hash": "7033e97b20277cc0d043226d1940fa7719ff08d2305d1fc7421e53066d00eb4b", + "type": "crates-io" + } + }, + "inotify": { + "0.9.6": { + "hash": "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff", + "type": "crates-io" + } + }, + "inotify-sys": { + "0.1.5": { + "hash": "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb", + "type": "crates-io" + } + }, + "inplace_it": { + "0.3.3": { + "hash": "90953f308a79fe6d62a4643e51f848fbfddcd05975a38e69fdf4ab86a7baf7ca", + "type": "crates-io" + } + }, + "instant": { + "0.1.12": { + "hash": "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c", + "type": "crates-io" + } + }, + "intl-memoizer": { + "0.5.1": { + "ref": "refs/heads/patched", + "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", + "type": "git", + "url": "https://github.com/juliancoffee/fluent-rs.git" + } + }, + "intl_pluralrules": { + "7.0.1": { + "hash": "b18f988384267d7066cc2be425e6faf352900652c046b6971d2e228d3b1c5ecf", + "type": "crates-io" + } + }, + "io-kit-sys": { + "0.1.0": { + "hash": "f21dcc74995dd4cd090b147e79789f8d65959cbfb5f0b118002db869ea3bd0a0", + "type": "crates-io" + } + }, + "io-lifetimes": { + "0.6.1": { + "hash": "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504", + "type": "crates-io" + } + }, + "itertools": { + "0.10.3": { + "hash": "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3", + "type": "crates-io" + } + }, + "itoa": { + "0.4.8": { + "hash": "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4", + "type": "crates-io" + }, + "1.0.1": { + "hash": "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35", + "type": "crates-io" + } + }, + "jni": { + "0.19.0": { + "hash": "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec", + "type": "crates-io" + } + }, + "jni-sys": { + "0.3.0": { + "hash": "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130", + "type": "crates-io" + } + }, + "jobserver": { + "0.1.24": { + "hash": "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa", + "type": "crates-io" + } + }, + "jpeg-decoder": { + "0.2.6": { + "hash": "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b", + "type": "crates-io" + } + }, + "js-sys": { + "0.3.56": { + "hash": "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04", + "type": "crates-io" + } + }, + "kernel32-sys": { + "0.2.2": { + "hash": "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d", + "type": "crates-io" + } + }, + "keyboard-keynames": { + "0.1.0": { + "ref": "refs/heads/develop", + "rev": "1ae010ca032a57dfe0ba01d4346a3b03bde36de0", + "type": "git", + "url": "https://gitlab.com/Frinksy/keyboard-keynames.git" + } + }, + "khronos-egl": { + "4.1.0": { + "hash": "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3", + "type": "crates-io" + } + }, + "kiddo": { + "0.1.7": { + "hash": "8d9d9b46f84e6d21fda457c8d7a5ed0e50382355194a47f28a3747ce6b5351d4", + "type": "crates-io" + }, + "0.2.4": { + "hash": "fc0a5c92307668140bf7d63a03a23e2da0b0453801fd54888c903cb7f723c293", + "type": "crates-io" + } + }, + "kqueue": { + "1.0.4": { + "hash": "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9", + "type": "crates-io" + } + }, + "kqueue-sys": { + "1.0.3": { + "hash": "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587", + "type": "crates-io" + } + }, + "lazy-bytes-cast": { + "5.0.1": { + "hash": "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b", + "type": "crates-io" + } + }, + "lazy_static": { + "1.4.0": { + "hash": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", + "type": "crates-io" + } + }, + "lazycell": { + "1.3.0": { + "hash": "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55", + "type": "crates-io" + } + }, + "leb128": { + "0.2.5": { + "hash": "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67", + "type": "crates-io" + } + }, + "lewton": { + "0.10.2": { + "hash": "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030", + "type": "crates-io" + } + }, + "libc": { + "0.2.121": { + "hash": "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f", + "type": "crates-io" + } + }, + "libloading": { + "0.6.7": { + "hash": "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883", + "type": "crates-io" + }, + "0.7.3": { + "hash": "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd", + "type": "crates-io" + } + }, + "libm": { + "0.1.4": { + "hash": "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a", + "type": "crates-io" + }, + "0.2.2": { + "hash": "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db", + "type": "crates-io" + } + }, + "libmimalloc-sys": { + "0.1.25": { + "hash": "11ca136052550448f55df7898c6dbe651c6b574fe38a0d9ea687a9f8088a2e2c", + "type": "crates-io" + } + }, + "libsqlite3-sys": { + "0.20.1": { + "hash": "64d31059f22935e6c31830db5249ba2b7ecd54fd73a9909286f0a67aa55c2fbd", + "type": "crates-io" + } + }, + "libudev-sys": { + "0.1.4": { + "hash": "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324", + "type": "crates-io" + } + }, + "linked-hash-map": { + "0.5.4": { + "hash": "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3", + "type": "crates-io" + } + }, + "linux-raw-sys": { + "0.0.42": { + "hash": "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7", + "type": "crates-io" + } + }, + "lock_api": { + "0.3.4": { + "hash": "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75", + "type": "crates-io" + }, + "0.4.7": { + "hash": "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53", + "type": "crates-io" + } + }, + "log": { + "0.4.16": { + "hash": "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8", + "type": "crates-io" + } + }, + "loom": { + "0.5.4": { + "hash": "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309", + "type": "crates-io" + } + }, + "loupe": { + "0.1.3": { + "hash": "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d", + "type": "crates-io" + } + }, + "loupe-derive": { + "0.1.3": { + "hash": "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952", + "type": "crates-io" + } + }, + "lz-fear": { + "0.1.1": { + "hash": "06aad1ce45e4ccf7a8d7d43e0c3ad38dc5d2255174a5f29a3c39d961fbc6181d", + "type": "crates-io" + } + }, + "mach": { + "0.2.3": { + "hash": "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1", + "type": "crates-io" + }, + "0.3.2": { + "hash": "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa", + "type": "crates-io" + } + }, + "malloc_buf": { + "0.0.6": { + "hash": "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb", + "type": "crates-io" + } + }, + "matchers": { + "0.1.0": { + "hash": "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558", + "type": "crates-io" + } + }, + "matches": { + "0.1.9": { + "hash": "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f", + "type": "crates-io" + } + }, + "maybe-uninit": { + "2.0.0": { + "hash": "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00", + "type": "crates-io" + } + }, + "memchr": { + "2.4.1": { + "hash": "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a", + "type": "crates-io" + } + }, + "memmap": { + "0.7.0": { + "hash": "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b", + "type": "crates-io" + } + }, + "memmap2": { + "0.1.0": { + "hash": "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a", + "type": "crates-io" + }, + "0.3.1": { + "hash": "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357", + "type": "crates-io" + }, + "0.5.3": { + "hash": "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f", + "type": "crates-io" + } + }, + "memoffset": { + "0.5.6": { + "hash": "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa", + "type": "crates-io" + }, + "0.6.5": { + "hash": "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce", + "type": "crates-io" + } + }, + "metal": { + "0.22.0": { + "hash": "1c12e48c737ee9a55e8bb2352bcde588f79ae308d3529ee888f7cc0f469b5777", + "type": "crates-io" + } + }, + "mimalloc": { + "0.1.29": { + "hash": "2f64ad83c969af2e732e907564deb0d0ed393cec4af80776f77dd77a1a427698", + "type": "crates-io" + } + }, + "minifb": { + "0.22.0": { + "hash": "6e52abe7ff0cb18cd88a6e9d7a91ca1ff74876587e7b6b1f30d1aeee9aa89aed", + "type": "crates-io" + } + }, + "minimal-lexical": { + "0.2.1": { + "hash": "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a", + "type": "crates-io" + } + }, + "miniz_oxide": { + "0.5.1": { + "hash": "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082", + "type": "crates-io" + } + }, + "mio": { + "0.7.14": { + "hash": "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc", + "type": "crates-io" + }, + "0.8.2": { + "hash": "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9", + "type": "crates-io" + } + }, + "mio-misc": { + "1.2.2": { + "hash": "b47412f3a52115b936ff2a229b803498c7b4d332adeb87c2f1498c9da54c398c", + "type": "crates-io" + } + }, + "miow": { + "0.3.7": { + "hash": "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21", + "type": "crates-io" + } + }, + "mopa": { + "0.2.2": { + "hash": "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915", + "type": "crates-io" + } + }, + "more-asserts": { + "0.2.2": { + "hash": "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389", + "type": "crates-io" + } + }, + "mumble-link": { + "0.1.0": { + "hash": "7a92ff7d87d3ca752fda7a1ccfcde284ea3de84fc8b8a0c43bf434652226bd95", + "type": "crates-io" + } + }, + "naga": { + "0.4.0": { + "ref": "refs/tags/gfx-25", + "rev": "057d03ad86f18e3bb3866b20901d8d4e892dd3d6", + "type": "git", + "url": "https://github.com/gfx-rs/naga" + } + }, + "native-dialog": { + "0.6.3": { + "hash": "0ab637f328b31bd0855c43bd38a4a4455e74324d9e74e0aac6a803422f43abc6", + "type": "crates-io" + } + }, + "ndk": { + "0.3.0": { + "hash": "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab", + "type": "crates-io" + }, + "0.6.0": { + "hash": "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4", + "type": "crates-io" + } + }, + "ndk-context": { + "0.1.0": { + "hash": "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884", + "type": "crates-io" + } + }, + "ndk-glue": { + "0.3.0": { + "hash": "c5caf0c24d51ac1c905c27d4eda4fa0635bbe0de596b8f79235e0b17a4d29385", + "type": "crates-io" + }, + "0.6.1": { + "hash": "d9ffb7443daba48349d545028777ca98853b018b4c16624aa01223bc29e078da", + "type": "crates-io" + } + }, + "ndk-macro": { + "0.2.0": { + "hash": "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d", + "type": "crates-io" + }, + "0.3.0": { + "hash": "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c", + "type": "crates-io" + } + }, + "ndk-sys": { + "0.2.2": { + "hash": "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121", + "type": "crates-io" + }, + "0.3.0": { + "hash": "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97", + "type": "crates-io" + } + }, + "nibble_vec": { + "0.1.0": { + "hash": "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43", + "type": "crates-io" + } + }, + "nix": { + "0.18.0": { + "hash": "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055", + "type": "crates-io" + }, + "0.20.0": { + "hash": "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a", + "type": "crates-io" + }, + "0.22.3": { + "hash": "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf", + "type": "crates-io" + }, + "0.23.1": { + "hash": "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6", + "type": "crates-io" + } + }, + "noise": { + "0.7.0": { + "hash": "82051dd6745d5184c6efb7bc8be14892a7f6d4f3ad6dbf754d1c7d7d5fe24b43", + "type": "crates-io" + } + }, + "nom": { + "4.2.3": { + "hash": "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6", + "type": "crates-io" + }, + "5.1.2": { + "hash": "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af", + "type": "crates-io" + }, + "7.1.1": { + "hash": "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36", + "type": "crates-io" + } + }, + "notify": { + "5.0.0-pre.15": { + "hash": "553f9844ad0b0824605c20fb55a661679782680410abfb1a8144c2e7e437e7a7", + "type": "crates-io" + } + }, + "ntapi": { + "0.3.7": { + "hash": "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f", + "type": "crates-io" + } + }, + "num": { + "0.2.1": { + "hash": "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36", + "type": "crates-io" + }, + "0.4.0": { + "hash": "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606", + "type": "crates-io" + } + }, + "num-bigint": { + "0.2.6": { + "hash": "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304", + "type": "crates-io" + }, + "0.4.3": { + "hash": "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f", + "type": "crates-io" + } + }, + "num-complex": { + "0.2.4": { + "hash": "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95", + "type": "crates-io" + }, + "0.4.0": { + "hash": "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085", + "type": "crates-io" + } + }, + "num-derive": { + "0.3.3": { + "hash": "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d", + "type": "crates-io" + } + }, + "num-integer": { + "0.1.44": { + "hash": "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db", + "type": "crates-io" + } + }, + "num-iter": { + "0.1.42": { + "hash": "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59", + "type": "crates-io" + } + }, + "num-rational": { + "0.2.4": { + "hash": "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef", + "type": "crates-io" + }, + "0.4.0": { + "hash": "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a", + "type": "crates-io" + } + }, + "num-traits": { + "0.2.14": { + "hash": "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290", + "type": "crates-io" + } + }, + "num_cpus": { + "1.13.1": { + "hash": "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1", + "type": "crates-io" + } + }, + "num_enum": { + "0.5.7": { + "hash": "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9", + "type": "crates-io" + } + }, + "num_enum_derive": { + "0.5.7": { + "hash": "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce", + "type": "crates-io" + } + }, + "num_threads": { + "0.1.5": { + "hash": "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0", + "type": "crates-io" + } + }, + "objc": { + "0.2.7": { + "hash": "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1", + "type": "crates-io" + } + }, + "objc-foundation": { + "0.1.1": { + "hash": "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9", + "type": "crates-io" + } + }, + "objc_exception": { + "0.1.2": { + "hash": "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4", + "type": "crates-io" + } + }, + "objc_id": { + "0.1.1": { + "hash": "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b", + "type": "crates-io" + } + }, + "object": { + "0.28.3": { + "hash": "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456", + "type": "crates-io" + } + }, + "oboe": { + "0.4.5": { + "hash": "2463c8f2e19b4e0d0710a21f8e4011501ff28db1c95d7a5482a553b2100502d2", + "type": "crates-io" + } + }, + "oboe-sys": { + "0.4.5": { + "hash": "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd", + "type": "crates-io" + } + }, + "ogg": { + "0.8.0": { + "hash": "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e", + "type": "crates-io" + } + }, + "once_cell": { + "1.10.0": { + "hash": "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9", + "type": "crates-io" + } + }, + "oorandom": { + "11.1.3": { + "hash": "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575", + "type": "crates-io" + } + }, + "openssl-probe": { + "0.1.5": { + "hash": "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf", + "type": "crates-io" + } + }, + "orbclient": { + "0.3.32": { + "hash": "2d3aa1482d3a9cb7547932f54a20910090073e81b3b7b236277c91698a10f83e", + "type": "crates-io" + } + }, + "ordered-float": { + "1.1.1": { + "hash": "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7", + "type": "crates-io" + }, + "2.10.0": { + "hash": "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87", + "type": "crates-io" + }, + "3.0.0": { + "hash": "96bcbab4bfea7a59c2c0fe47211a1ac4e3e96bea6eb446d704f310bc5c732ae2", + "type": "crates-io" + } + }, + "os_str_bytes": { + "6.0.0": { + "hash": "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64", + "type": "crates-io" + } + }, + "owned_ttf_parser": { + "0.15.0": { + "hash": "4fb1e509cfe7a12db2a90bfa057dfcdbc55a347f5da677c506b53dd099cfec9d", + "type": "crates-io" + }, + "0.6.0": { + "hash": "9f923fb806c46266c02ab4a5b239735c144bdeda724a50ed058e5226f594cde3", + "type": "crates-io" + } + }, + "packed_simd_2": { + "0.3.7": { + "hash": "defdcfef86dcc44ad208f71d9ff4ce28df6537a4e0d6b0e8e845cb8ca10059a6", + "type": "crates-io" + } + }, + "parking_lot": { + "0.10.2": { + "hash": "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e", + "type": "crates-io" + }, + "0.11.2": { + "hash": "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99", + "type": "crates-io" + }, + "0.12.0": { + "hash": "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58", + "type": "crates-io" + } + }, + "parking_lot_core": { + "0.7.2": { + "hash": "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3", + "type": "crates-io" + }, + "0.8.5": { + "hash": "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216", + "type": "crates-io" + }, + "0.9.2": { + "hash": "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37", + "type": "crates-io" + } + }, + "parse-zoneinfo": { + "0.3.0": { + "hash": "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41", + "type": "crates-io" + } + }, + "pdqselect": { + "0.1.0": { + "hash": "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27", + "type": "crates-io" + } + }, + "peeking_take_while": { + "0.1.2": { + "hash": "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099", + "type": "crates-io" + } + }, + "pem": { + "1.0.2": { + "hash": "e9a3b09a20e374558580a4914d3b7d89bd61b954a5a5e1dcbea98753addb1947", + "type": "crates-io" + } + }, + "percent-encoding": { + "2.1.0": { + "hash": "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e", + "type": "crates-io" + } + }, + "petgraph": { + "0.4.13": { + "hash": "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f", + "type": "crates-io" + }, + "0.5.1": { + "hash": "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7", + "type": "crates-io" + }, + "0.6.0": { + "hash": "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f", + "type": "crates-io" + } + }, + "phf": { + "0.10.1": { + "hash": "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259", + "type": "crates-io" + } + }, + "phf_codegen": { + "0.10.0": { + "hash": "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd", + "type": "crates-io" + } + }, + "phf_generator": { + "0.10.0": { + "hash": "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6", + "type": "crates-io" + } + }, + "phf_shared": { + "0.10.0": { + "hash": "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096", + "type": "crates-io" + } + }, + "pin-project-lite": { + "0.2.8": { + "hash": "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c", + "type": "crates-io" + } + }, + "pin-utils": { + "0.1.0": { + "hash": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184", + "type": "crates-io" + } + }, + "piston-float": { + "0.3.0": { + "hash": "b058c3a640efd4bcf63266512e4bb03187192c1b29edd38b16d5a014613e3199", + "type": "crates-io" + } + }, + "piston-viewport": { + "0.5.0": { + "hash": "7d96dd995f7dabe6d57cda668ec0fda39d6fe6e1e0b23f772582f383f2013611", + "type": "crates-io" + } + }, + "pistoncore-input": { + "0.24.0": { + "hash": "0c612ce242c7bac8e96426a0ca34275fd980af440f0cca7c6c0e840ef8a4052f", + "type": "crates-io" + } + }, + "pkg-config": { + "0.3.25": { + "hash": "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae", + "type": "crates-io" + } + }, + "plotters": { + "0.3.0": { + "hash": "45ca0ae5f169d0917a7c7f5a9c1a3d3d9598f18f529dd2b8373ed988efea307a", + "type": "crates-io" + } + }, + "plotters-backend": { + "0.3.2": { + "hash": "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c", + "type": "crates-io" + } + }, + "plotters-svg": { + "0.3.1": { + "hash": "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9", + "type": "crates-io" + } + }, + "png": { + "0.17.5": { + "hash": "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba", + "type": "crates-io" + } + }, + "portpicker": { + "0.1.0": { + "rev": "df6b37872f3586ac3b21d08b56c8ec7cd92fb172", + "type": "git", + "url": "https://github.com/xMAC94x/portpicker-rs" + } + }, + "ppv-lite86": { + "0.2.16": { + "hash": "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872", + "type": "crates-io" + } + }, + "proc-macro-crate": { + "0.1.5": { + "hash": "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785", + "type": "crates-io" + }, + "1.1.3": { + "hash": "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a", + "type": "crates-io" + } + }, + "proc-macro-error": { + "1.0.4": { + "hash": "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c", + "type": "crates-io" + } + }, + "proc-macro-error-attr": { + "1.0.4": { + "hash": "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869", + "type": "crates-io" + } + }, + "proc-macro-hack": { + "0.5.19": { + "hash": "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5", + "type": "crates-io" + } + }, + "proc-macro2": { + "0.4.30": { + "hash": "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759", + "type": "crates-io" + }, + "1.0.40": { + "hash": "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7", + "type": "crates-io" + } + }, + "profiling": { + "1.0.6": { + "hash": "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d", + "type": "crates-io" + } + }, + "profiling-procmacros": { + "1.0.6": { + "hash": "98eee3c112f2a6f784b6713fe1d7fb7d6506e066121c0a49371fdb976f72bae5", + "type": "crates-io" + } + }, + "prometheus": { + "0.13.0": { + "hash": "b7f64969ffd5dd8f39bd57a68ac53c163a095ed9d0fb707146da1b27025a3504", + "type": "crates-io" + } + }, + "prometheus-hyper": { + "0.1.4": { + "hash": "8726fd64f2941cc80d6739a7d001d756a22b660737839fd7b15202f5cb7f4bf6", + "type": "crates-io" + } + }, + "ptr_meta": { + "0.1.4": { + "hash": "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1", + "type": "crates-io" + } + }, + "ptr_meta_derive": { + "0.1.4": { + "hash": "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac", + "type": "crates-io" + } + }, + "quick-xml": { + "0.22.0": { + "hash": "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b", + "type": "crates-io" + } + }, + "quinn": { + "0.8.2": { + "hash": "d147472bc9a09f13b06c044787b6683cdffa02e2865b7f0fb53d67c49ed2988e", + "type": "crates-io" + } + }, + "quinn-proto": { + "0.8.2": { + "hash": "359c5eb33845f3ee05c229e65f87cdbc503eea394964b8f1330833d460b4ff3e", + "type": "crates-io" + } + }, + "quinn-udp": { + "0.1.1": { + "hash": "df185e5e5f7611fa6e628ed8f9633df10114b03bbaecab186ec55822c44ac727", + "type": "crates-io" + } + }, + "quote": { + "0.6.13": { + "hash": "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1", + "type": "crates-io" + }, + "1.0.20": { + "hash": "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804", + "type": "crates-io" + } + }, + "radium": { + "0.6.2": { + "hash": "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb", + "type": "crates-io" + } + }, + "radix_trie": { + "0.2.1": { + "hash": "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd", + "type": "crates-io" + } + }, + "rand": { + "0.7.3": { + "hash": "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03", + "type": "crates-io" + }, + "0.8.5": { + "hash": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404", + "type": "crates-io" + } + }, + "rand_chacha": { + "0.2.2": { + "hash": "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402", + "type": "crates-io" + }, + "0.3.1": { + "hash": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", + "type": "crates-io" + } + }, + "rand_core": { + "0.5.1": { + "hash": "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19", + "type": "crates-io" + }, + "0.6.3": { + "hash": "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7", + "type": "crates-io" + } + }, + "rand_distr": { + "0.4.3": { + "hash": "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31", + "type": "crates-io" + } + }, + "rand_hc": { + "0.2.0": { + "hash": "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c", + "type": "crates-io" + } + }, + "rand_xorshift": { + "0.2.0": { + "hash": "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8", + "type": "crates-io" + } + }, + "range-alloc": { + "0.1.2": { + "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", + "type": "git", + "url": "https://github.com/gfx-rs/gfx" + } + }, + "raw-window-handle": { + "0.3.4": { + "hash": "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76", + "type": "crates-io" + }, + "0.4.3": { + "hash": "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41", + "type": "crates-io" + } + }, + "rayon": { + "1.5.1": { + "hash": "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90", + "type": "crates-io" + } + }, + "rayon-core": { + "1.9.1": { + "hash": "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e", + "type": "crates-io" + } + }, + "rcgen": { + "0.9.2": { + "hash": "d7fa2d386df8533b02184941c76ae2e0d0c1d053f5d43339169d80f21275fc5e", + "type": "crates-io" + } + }, + "redox_syscall": { + "0.1.57": { + "hash": "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce", + "type": "crates-io" + }, + "0.2.13": { + "hash": "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42", + "type": "crates-io" + } + }, + "redox_users": { + "0.4.3": { + "hash": "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b", + "type": "crates-io" + } + }, + "refinery": { + "0.5.0": { + "rev": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", + "type": "git", + "url": "https://gitlab.com/veloren/refinery.git" + } + }, + "refinery-core": { + "0.5.0": { + "rev": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", + "type": "git", + "url": "https://gitlab.com/veloren/refinery.git" + } + }, + "refinery-macros": { + "0.5.0": { + "rev": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", + "type": "git", + "url": "https://gitlab.com/veloren/refinery.git" + } + }, + "regalloc": { + "0.0.31": { + "hash": "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5", + "type": "crates-io" + } + }, + "regex": { + "1.5.5": { + "hash": "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286", + "type": "crates-io" + } + }, + "regex-automata": { + "0.1.10": { + "hash": "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132", + "type": "crates-io" + } + }, + "regex-syntax": { + "0.6.25": { + "hash": "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b", + "type": "crates-io" + } + }, + "region": { + "3.0.0": { + "hash": "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e", + "type": "crates-io" + } + }, + "remove_dir_all": { + "0.5.3": { + "hash": "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7", + "type": "crates-io" + } + }, + "rend": { + "0.3.6": { + "hash": "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95", + "type": "crates-io" + } + }, + "renderdoc-sys": { + "0.7.1": { + "hash": "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157", + "type": "crates-io" + } + }, + "ring": { + "0.16.20": { + "hash": "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc", + "type": "crates-io" + } + }, + "rkyv": { + "0.7.37": { + "hash": "1f08c8062c1fe1253064043b8fc07bfea1b9702b71b4a86c11ea3588183b12e1", + "type": "crates-io" + } + }, + "rkyv_derive": { + "0.7.37": { + "hash": "e289706df51226e84814bf6ba1a9e1013112ae29bc7a9878f73fce360520c403", + "type": "crates-io" + } + }, + "rodio": { + "0.15.0": { + "hash": "ec0939e9f626e6c6f1989adb6226a039c855ca483053f0ee7c98b90e41cf731e", + "type": "crates-io" + } + }, + "ron": { + "0.6.6": { + "hash": "86018df177b1beef6c7c8ef949969c4f7cb9a9344181b92486b23c79995bdaa4", + "type": "crates-io" + }, + "0.7.0": { + "hash": "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678", + "type": "crates-io" + } + }, + "roots": { + "0.0.6": { + "hash": "84348444bd7ad45729d0c49a4240d7cdc11c9d512c06c5ad1835c1ad4acda6db", + "type": "crates-io" + } + }, + "rose_tree": { + "0.2.0": { + "hash": "284de9dae38774e2813aaabd7e947b4a6fe9b8c58c2309f754a487cdd50de1c2", + "type": "crates-io" + } + }, + "roxmltree": { + "0.14.1": { + "hash": "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b", + "type": "crates-io" + } + }, + "rstar": { + "0.9.2": { + "hash": "1fc6fc513b8c3853e43a0c3f909ded14ffa82e5170c9c5f6fb175f9c85c8a433", + "type": "crates-io" + } + }, + "rusqlite": { + "0.24.2": { + "hash": "d5f38ee71cbab2c827ec0ac24e76f82eca723cee92c509a65f67dee393c25112", + "type": "crates-io" + } + }, + "rust-argon2": { + "0.8.3": { + "hash": "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb", + "type": "crates-io" + } + }, + "rustc-demangle": { + "0.1.21": { + "hash": "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342", + "type": "crates-io" + } + }, + "rustc-hash": { + "1.1.0": { + "hash": "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", + "type": "crates-io" + } + }, + "rustc_version": { + "0.2.3": { + "hash": "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a", + "type": "crates-io" + }, + "0.4.0": { + "hash": "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366", + "type": "crates-io" + } + }, + "rustix": { + "0.34.1": { + "hash": "cd3cc851a13d30a34cb747ba2a0c5101a4b2e8b1677a29b213ee465365ea495e", + "type": "crates-io" + } + }, + "rustls": { + "0.19.1": { + "hash": "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7", + "type": "crates-io" + }, + "0.20.4": { + "hash": "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921", + "type": "crates-io" + } + }, + "rustls-native-certs": { + "0.5.0": { + "hash": "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092", + "type": "crates-io" + }, + "0.6.1": { + "hash": "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943", + "type": "crates-io" + } + }, + "rustls-pemfile": { + "0.2.1": { + "hash": "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9", + "type": "crates-io" + }, + "1.0.0": { + "hash": "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9", + "type": "crates-io" + } + }, + "rusttype": { + "0.7.9": { + "hash": "310942406a39981bed7e12b09182a221a29e0990f3e7e0c971f131922ed135d5", + "type": "crates-io" + }, + "0.8.3": { + "hash": "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0", + "type": "crates-io" + }, + "0.9.2": { + "hash": "dc7c727aded0be18c5b80c1640eae0ac8e396abf6fa8477d96cb37d18ee5ec59", + "type": "crates-io" + } + }, + "rustversion": { + "1.0.6": { + "hash": "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f", + "type": "crates-io" + } + }, + "rusty-xinput": { + "1.2.0": { + "hash": "d2aa654bc32eb9ca14cce1a084abc9dfe43949a4547c35269a094c39272db3bb", + "type": "crates-io" + } + }, + "rustyline": { + "9.1.2": { + "hash": "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039", + "type": "crates-io" + } + }, + "ryu": { + "1.0.9": { + "hash": "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f", + "type": "crates-io" + } + }, + "same-file": { + "1.0.6": { + "hash": "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", + "type": "crates-io" + } + }, + "schannel": { + "0.1.19": { + "hash": "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75", + "type": "crates-io" + } + }, + "scoped-tls": { + "1.0.0": { + "hash": "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2", + "type": "crates-io" + } + }, + "scopeguard": { + "1.1.0": { + "hash": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd", + "type": "crates-io" + } + }, + "sct": { + "0.6.1": { + "hash": "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce", + "type": "crates-io" + }, + "0.7.0": { + "hash": "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4", + "type": "crates-io" + } + }, + "sdl2": { + "0.35.2": { + "hash": "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a", + "type": "crates-io" + } + }, + "sdl2-sys": { + "0.35.2": { + "hash": "e3586be2cf6c0a8099a79a12b4084357aa9b3e0b0d7980e3b67aaf7a9d55f9f0", + "type": "crates-io" + } + }, + "seahash": { + "4.1.0": { + "hash": "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b", + "type": "crates-io" + } + }, + "security-framework": { + "2.6.1": { + "hash": "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc", + "type": "crates-io" + } + }, + "security-framework-sys": { + "2.6.1": { + "hash": "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556", + "type": "crates-io" + } + }, + "self_cell": { + "0.10.2": { + "hash": "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af", + "type": "crates-io" + } + }, + "semver": { + "0.9.0": { + "hash": "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403", + "type": "crates-io" + }, + "1.0.7": { + "hash": "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4", + "type": "crates-io" + } + }, + "semver-parser": { + "0.7.0": { + "hash": "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3", + "type": "crates-io" + } + }, + "serde": { + "1.0.136": { + "hash": "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789", + "type": "crates-io" + } + }, + "serde_bytes": { + "0.11.5": { + "hash": "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9", + "type": "crates-io" + } + }, + "serde_cbor": { + "0.11.2": { + "hash": "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5", + "type": "crates-io" + } + }, + "serde_derive": { + "1.0.136": { + "hash": "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9", + "type": "crates-io" + } + }, + "serde_json": { + "1.0.79": { + "hash": "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95", + "type": "crates-io" + } + }, + "serde_repr": { + "0.1.7": { + "hash": "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5", + "type": "crates-io" + } + }, + "sha1": { + "0.6.1": { + "hash": "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770", + "type": "crates-io" + } + }, + "sha1_smol": { + "1.0.0": { + "hash": "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012", + "type": "crates-io" + } + }, + "sha2": { + "0.10.2": { + "hash": "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676", + "type": "crates-io" + } + }, + "shaderc": { + "0.8.0": { + "hash": "80e6fe602a861622769530a23bc40bfba31adbf186d0c8412e83f5519c5d6bee", + "type": "crates-io" + } + }, + "shaderc-sys": { + "0.8.0": { + "hash": "3794498651f8173d0afbc0bb8aca45ced111098227e755dde4c0ef2888c8d0bf", + "type": "crates-io" + } + }, + "sharded-slab": { + "0.1.4": { + "hash": "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31", + "type": "crates-io" + } + }, + "shell-words": { + "1.1.0": { + "hash": "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde", + "type": "crates-io" + } + }, + "shellexpand": { + "2.1.0": { + "hash": "83bdb7831b2d85ddf4a7b148aa19d0587eddbe8671a436b7bd1182eaad0f2829", + "type": "crates-io" + } + }, + "shlex": { + "0.1.1": { + "hash": "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2", + "type": "crates-io" + } + }, + "shred": { + "0.13.0": { + "hash": "102269e720bb814df57e136161cad841f2b6f411e003ac748fc48aaf2363bea3", + "type": "crates-io" + } + }, + "shred-derive": { + "0.6.3": { + "hash": "d5404c36bd155e41a54276ab6aafedad2fb627e5e5849d36ec439c9ddc044a2f", + "type": "crates-io" + } + }, + "shrev": { + "1.1.1": { + "hash": "b5752e017e03af9d735b4b069f53b7a7fd90fefafa04d8bd0c25581b0bff437f", + "type": "crates-io" + } + }, + "signal-hook": { + "0.1.17": { + "hash": "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729", + "type": "crates-io" + }, + "0.3.13": { + "hash": "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d", + "type": "crates-io" + } + }, + "signal-hook-mio": { + "0.2.3": { + "hash": "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af", + "type": "crates-io" + } + }, + "signal-hook-registry": { + "1.4.0": { + "hash": "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0", + "type": "crates-io" + } + }, + "siphasher": { + "0.3.10": { + "hash": "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de", + "type": "crates-io" + } + }, + "slab": { + "0.4.6": { + "hash": "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32", + "type": "crates-io" + } + }, + "slotmap": { + "0.4.3": { + "hash": "6bf34684c5767b87de9119790e92e9a1d60056be2ceeaf16a8e6ef13082aeab1", + "type": "crates-io" + }, + "1.0.6": { + "hash": "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342", + "type": "crates-io" + } + }, + "smallvec": { + "1.8.0": { + "hash": "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83", + "type": "crates-io" + } + }, + "smithay-client-toolkit": { + "0.12.3": { + "hash": "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80", + "type": "crates-io" + }, + "0.15.3": { + "hash": "1325f292209cee78d5035530932422a30aa4c8fda1a16593ac083c1de211e68a", + "type": "crates-io" + } + }, + "smithay-clipboard": { + "0.6.5": { + "hash": "610b551bd25378bfd2b8e7a0fcbd83d427e8f2f6a40c47ae0f70688e9949dd55", + "type": "crates-io" + } + }, + "socket2": { + "0.4.4": { + "hash": "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0", + "type": "crates-io" + } + }, + "specs": { + "0.18.0": { + "hash": "4ea85dac2880f84d4025ff5ace80cda6d8bc43bc88b6a389b9277fcf894b51e9", + "type": "crates-io" + } + }, + "specs-derive": { + "0.4.1": { + "hash": "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511", + "type": "crates-io" + } + }, + "spin": { + "0.5.2": { + "hash": "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d", + "type": "crates-io" + } + }, + "spin_sleep": { + "1.1.1": { + "hash": "cafa7900db085f4354dbc7025e25d7a839a14360ea13b5fc4fd717f2d3b23134", + "type": "crates-io" + } + }, + "spirv_cross": { + "0.23.1": { + "hash": "60647fadbf83c4a72f0d7ea67a7ca3a81835cf442b8deae5c134c3e0055b2e14", + "type": "crates-io" + } + }, + "spirv_headers": { + "1.5.0": { + "hash": "1f5b132530b1ac069df335577e3581765995cba5a13995cdbbdbc8fb057c532c", + "type": "crates-io" + } + }, + "stable_deref_trait": { + "1.2.0": { + "hash": "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3", + "type": "crates-io" + } + }, + "static_assertions": { + "1.1.0": { + "hash": "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f", + "type": "crates-io" + } + }, + "stb_truetype": { + "0.3.1": { + "hash": "f77b6b07e862c66a9f3e62a07588fee67cd90a9135a2b942409f195507b4fb51", + "type": "crates-io" + } + }, + "stdweb": { + "0.1.3": { + "hash": "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e", + "type": "crates-io" + }, + "0.4.20": { + "hash": "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5", + "type": "crates-io" + } + }, + "stdweb-derive": { + "0.5.3": { + "hash": "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef", + "type": "crates-io" + } + }, + "stdweb-internal-macros": { + "0.2.9": { + "hash": "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11", + "type": "crates-io" + } + }, + "stdweb-internal-runtime": { + "0.1.5": { + "hash": "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0", + "type": "crates-io" + } + }, + "storage-map": { + "0.3.0": { + "hash": "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c", + "type": "crates-io" + } + }, + "str-buf": { + "1.0.5": { + "hash": "d44a3643b4ff9caf57abcee9c2c621d6c03d9135e0d8b589bd9afb5992cb176a", + "type": "crates-io" + } + }, + "strsim": { + "0.10.0": { + "hash": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", + "type": "crates-io" + }, + "0.8.0": { + "hash": "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a", + "type": "crates-io" + }, + "0.9.3": { + "hash": "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c", + "type": "crates-io" + } + }, + "structopt": { + "0.3.26": { + "hash": "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10", + "type": "crates-io" + } + }, + "structopt-derive": { + "0.4.18": { + "hash": "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0", + "type": "crates-io" + } + }, + "strum": { + "0.24.0": { + "hash": "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8", + "type": "crates-io" + } + }, + "strum_macros": { + "0.24.0": { + "hash": "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef", + "type": "crates-io" + } + }, + "sum_type": { + "0.2.0": { + "hash": "da5b4a0c9f3c7c8e891e445a7c776627e208e8bba23ab680798066dd283e6a15", + "type": "crates-io" + } + }, + "svg_fmt": { + "0.4.1": { + "hash": "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2", + "type": "crates-io" + } + }, + "syn": { + "0.15.44": { + "hash": "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5", + "type": "crates-io" + }, + "1.0.98": { + "hash": "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd", + "type": "crates-io" + } + }, + "tap": { + "1.0.1": { + "hash": "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369", + "type": "crates-io" + } + }, + "tar": { + "0.4.38": { + "hash": "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6", + "type": "crates-io" + } + }, + "target-lexicon": { + "0.12.3": { + "hash": "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1", + "type": "crates-io" + } + }, + "tempfile": { + "3.3.0": { + "hash": "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4", + "type": "crates-io" + } + }, + "termcolor": { + "1.1.3": { + "hash": "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755", + "type": "crates-io" + } + }, + "textwrap": { + "0.11.0": { + "hash": "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060", + "type": "crates-io" + }, + "0.15.0": { + "hash": "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb", + "type": "crates-io" + } + }, + "thiserror": { + "1.0.30": { + "hash": "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417", + "type": "crates-io" + } + }, + "thiserror-impl": { + "1.0.30": { + "hash": "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b", + "type": "crates-io" + } + }, + "thread_local": { + "1.1.4": { + "hash": "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180", + "type": "crates-io" + } + }, + "thunderdome": { + "0.4.2": { + "hash": "f685624f172cd0bde6f3363412455e81c018f2379fdf5a218e0be003f1bba642", + "type": "crates-io" + } + }, + "time": { + "0.1.44": { + "hash": "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255", + "type": "crates-io" + }, + "0.3.9": { + "hash": "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd", + "type": "crates-io" + } + }, + "tiny-keccak": { + "2.0.2": { + "hash": "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237", + "type": "crates-io" + } + }, + "tinystr": { + "0.3.4": { + "hash": "29738eedb4388d9ea620eeab9384884fc3f06f586a2eddb56bedc5885126c7c1", + "type": "crates-io" + } + }, + "tinytemplate": { + "1.2.1": { + "hash": "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc", + "type": "crates-io" + } + }, + "tinyvec": { + "1.5.1": { + "hash": "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2", + "type": "crates-io" + } + }, + "tinyvec_macros": { + "0.1.0": { + "hash": "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c", + "type": "crates-io" + } + }, + "tokio": { + "1.17.0": { + "hash": "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee", + "type": "crates-io" + } + }, + "tokio-macros": { + "1.7.0": { + "hash": "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7", + "type": "crates-io" + } + }, + "tokio-rustls": { + "0.22.0": { + "hash": "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6", + "type": "crates-io" + } + }, + "tokio-stream": { + "0.1.8": { + "hash": "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3", + "type": "crates-io" + } + }, + "tokio-util": { + "0.7.1": { + "hash": "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764", + "type": "crates-io" + } + }, + "toml": { + "0.5.8": { + "hash": "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa", + "type": "crates-io" + } + }, + "tower-service": { + "0.3.1": { + "hash": "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6", + "type": "crates-io" + } + }, + "tracing": { + "0.1.32": { + "hash": "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f", + "type": "crates-io" + } + }, + "tracing-appender": { + "0.2.2": { + "hash": "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e", + "type": "crates-io" + } + }, + "tracing-attributes": { + "0.1.20": { + "hash": "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b", + "type": "crates-io" + } + }, + "tracing-core": { + "0.1.24": { + "hash": "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee", + "type": "crates-io" + } + }, + "tracing-log": { + "0.1.2": { + "hash": "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3", + "type": "crates-io" + } + }, + "tracing-subscriber": { + "0.3.10": { + "hash": "b9df98b037d039d03400d9dd06b0f8ce05486b5f25e9a2d7d36196e142ebbc52", + "type": "crates-io" + } + }, + "tracing-tracy": { + "0.9.0": { + "hash": "23a42311a35ed976d72f359de43e9fe028ec9d9f1051c4c52bd05a4f66ff3cbf", + "type": "crates-io" + } + }, + "tracy-client": { + "0.13.2": { + "hash": "42ebfe7a24c18b5ba86d8920c124b41b942352f863fbe0c84d3d63428fa1860f", + "type": "crates-io" + } + }, + "tracy-client-sys": { + "0.17.0": { + "hash": "9012b9dfeccaff16e93f5a8b02336125113a80a769902e679d334cbdd4d83f3b", + "type": "crates-io" + } + }, + "treeculler": { + "0.2.0": { + "hash": "82449b48a3494420dd1b11081f198c542f795a036246da4a9c5845b7d7427226", + "type": "crates-io" + } + }, + "try-lock": { + "0.2.3": { + "hash": "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642", + "type": "crates-io" + } + }, + "ttf-parser": { + "0.15.0": { + "hash": "c74c96594835e10fa545e2a51e8709f30b173a092bfd6036ef2cec53376244f3", + "type": "crates-io" + }, + "0.6.2": { + "hash": "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc", + "type": "crates-io" + } + }, + "tui": { + "0.10.0": { + "ref": "refs/heads/paragraph-scroll", + "rev": "54b841fab6cfdb38e8dc1382176e965787964b4c", + "type": "git", + "url": "https://github.com/fdehau/tui-rs.git" + } + }, + "tuple_utils": { + "0.4.0": { + "hash": "cffaaf9392ef73cd30828797152476aaa2fa37a17856934fa63d4843f34290e9", + "type": "crates-io" + } + }, + "twox-hash": { + "1.6.2": { + "hash": "4ee73e6e4924fe940354b8d4d98cad5231175d615cd855b758adc658c0aac6a0", + "type": "crates-io" + } + }, + "tynm": { + "0.1.6": { + "hash": "a4df2caa2dc9c3d1f7641ba981f4cd40ab229775aa7aeb834c9ab2850d50623d", + "type": "crates-io" + } + }, + "type-map": { + "0.5.0": { + "hash": "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f", + "type": "crates-io" + } + }, + "typenum": { + "1.15.0": { + "hash": "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987", + "type": "crates-io" + } + }, + "uncased": { + "0.9.6": { + "hash": "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0", + "type": "crates-io" + } + }, + "unic-langid": { + "0.9.0": { + "hash": "73328fcd730a030bdb19ddf23e192187a6b01cd98be6d3140622a89129459ce5", + "type": "crates-io" + } + }, + "unic-langid-impl": { + "0.9.0": { + "hash": "1a4a8eeaf0494862c1404c95ec2f4c33a2acff5076f64314b465e3ddae1b934d", + "type": "crates-io" + } + }, + "unicode-bidi": { + "0.3.7": { + "hash": "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f", + "type": "crates-io" + } + }, + "unicode-ident": { + "1.0.1": { + "hash": "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c", + "type": "crates-io" + } + }, + "unicode-normalization": { + "0.1.19": { + "hash": "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9", + "type": "crates-io" + } + }, + "unicode-segmentation": { + "1.9.0": { + "hash": "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99", + "type": "crates-io" + } + }, + "unicode-width": { + "0.1.9": { + "hash": "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973", + "type": "crates-io" + } + }, + "unicode-xid": { + "0.1.0": { + "hash": "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc", + "type": "crates-io" + } + }, + "untrusted": { + "0.7.1": { + "hash": "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a", + "type": "crates-io" + } + }, + "url": { + "2.2.2": { + "hash": "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c", + "type": "crates-io" + } + }, + "utf8parse": { + "0.2.0": { + "hash": "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372", + "type": "crates-io" + } + }, + "uuid": { + "0.8.2": { + "hash": "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7", + "type": "crates-io" + } + }, + "valuable": { + "0.1.0": { + "hash": "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d", + "type": "crates-io" + } + }, + "vcpkg": { + "0.2.15": { + "hash": "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426", + "type": "crates-io" + } + }, + "vec_map": { + "0.8.2": { + "hash": "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191", + "type": "crates-io" + } + }, + "vek": { + "0.14.1": { + "hash": "04d6626f32b226e2c5b35f23ea87eaf683f3d93eaeb16b4084d0683479616f0f", + "type": "crates-io" + }, + "0.15.8": { + "rev": "84d5cb65841d46599a986c5477341bea4456be26", + "type": "git", + "url": "https://github.com/yoanlcq/vek.git" + } + }, + "veloren-client": { + "0.13.0": { + "path": "client", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common": { + "0.10.0": { + "path": "", + "rootName": null, + "rootVersion": null, + "type": "path" + } + }, + "veloren-common-assets": { + "0.10.0": { + "path": "common/assets", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common-base": { + "0.10.0": { + "path": "common/base", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common-ecs": { + "0.10.0": { + "path": "common/ecs", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common-frontend": { + "0.10.0": { + "path": "common/frontend", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common-net": { + "0.10.0": { + "path": "common/net", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common-state": { + "0.10.0": { + "path": "common/state", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-common-systems": { + "0.10.0": { + "path": "common/systems", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-network": { + "0.3.0": { + "path": "network", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-network-protocol": { + "0.6.1": { + "path": "network/protocol", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-plugin-api": { + "0.1.0": { + "path": "plugin/api", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-plugin-derive": { + "0.1.0": { + "path": "plugin/derive", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-plugin-rt": { + "0.1.0": { + "path": "plugin/rt", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-server": { + "0.13.0": { + "path": "server", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-server-cli": { + "0.13.0": { + "path": "server-cli", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen": { + "0.13.0": { + "path": "voxygen", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen-anim": { + "0.10.0": { + "path": "voxygen/anim", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen-anim-dyn": { + "0.10.0": { + "path": "voxygen/anim/dyn", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen-dynlib": { + "0.1.0": { + "path": "voxygen/dynlib", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen-egui": { + "0.9.0": { + "path": "voxygen/egui", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen-egui-dyn": { + "0.9.0": { + "path": "voxygen/egui/dyn", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-voxygen-i18n": { + "0.13.0": { + "path": "voxygen/i18n", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "veloren-world": { + "0.10.0": { + "path": "world", + "rootName": "veloren-common", + "rootVersion": "0.10.0", + "type": "path" + } + }, + "version-compare": { + "0.1.0": { + "hash": "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73", + "type": "crates-io" + } + }, + "version_check": { + "0.1.5": { + "hash": "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd", + "type": "crates-io" + }, + "0.9.4": { + "hash": "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f", + "type": "crates-io" + } + }, + "walkdir": { + "0.1.8": { + "hash": "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780", + "type": "crates-io" + }, + "2.3.2": { + "hash": "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56", + "type": "crates-io" + } + }, + "want": { + "0.3.0": { + "hash": "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0", + "type": "crates-io" + } + }, + "wasi": { + "0.10.0+wasi-snapshot-preview1": { + "hash": "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f", + "type": "crates-io" + }, + "0.11.0+wasi-snapshot-preview1": { + "hash": "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423", + "type": "crates-io" + }, + "0.9.0+wasi-snapshot-preview1": { + "hash": "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519", + "type": "crates-io" + } + }, + "wasm-bindgen": { + "0.2.79": { + "hash": "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06", + "type": "crates-io" + } + }, + "wasm-bindgen-backend": { + "0.2.79": { + "hash": "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca", + "type": "crates-io" + } + }, + "wasm-bindgen-futures": { + "0.4.29": { + "hash": "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395", + "type": "crates-io" + } + }, + "wasm-bindgen-macro": { + "0.2.79": { + "hash": "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01", + "type": "crates-io" + } + }, + "wasm-bindgen-macro-support": { + "0.2.79": { + "hash": "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc", + "type": "crates-io" + } + }, + "wasm-bindgen-shared": { + "0.2.79": { + "hash": "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2", + "type": "crates-io" + } + }, + "wasmer": { + "2.2.1": { + "hash": "f727a39e7161f7438ddb8eafe571b67c576a8c2fb459f666d9053b5bba4afdea", + "type": "crates-io" + } + }, + "wasmer-compiler": { + "2.2.1": { + "hash": "4e9951599222eb12bd13d4d91bcded0a880e4c22c2dfdabdf5dc7e5e803b7bf3", + "type": "crates-io" + } + }, + "wasmer-compiler-cranelift": { + "2.2.1": { + "hash": "44c83273bce44e668f3a2b9ccb7f1193db918b1d6806f64acc5ff71f6ece5f20", + "type": "crates-io" + } + }, + "wasmer-derive": { + "2.2.1": { + "hash": "458dbd9718a837e6dbc52003aef84487d79eedef5fa28c7d28b6784be98ac08e", + "type": "crates-io" + } + }, + "wasmer-engine": { + "2.2.1": { + "hash": "6ed603a6d037ebbb14014d7f739ae996a78455a4b86c41cfa4e81c590a1253b9", + "type": "crates-io" + } + }, + "wasmer-engine-dylib": { + "2.2.1": { + "hash": "ccd7fdc60e252a795c849b3f78a81a134783051407e7e279c10b7019139ef8dc", + "type": "crates-io" + } + }, + "wasmer-engine-universal": { + "2.2.1": { + "hash": "dcff0cd2c01a8de6009fd863b14ea883132a468a24f2d2ee59dc34453d3a31b5", + "type": "crates-io" + } + }, + "wasmer-object": { + "2.2.1": { + "hash": "24ce18ac2877050e59580d27ee1a88f3192d7a31e77fbba0852abc7888d6e0b5", + "type": "crates-io" + } + }, + "wasmer-types": { + "2.2.1": { + "hash": "659fa3dd6c76f62630deff4ac8c7657b07f0b1e4d7e0f8243a552b9d9b448e24", + "type": "crates-io" + } + }, + "wasmer-vm": { + "2.2.1": { + "hash": "afdc46158517c2769f9938bc222a7d41b3bb330824196279d8aa2d667cd40641", + "type": "crates-io" + } + }, + "wasmparser": { + "0.78.2": { + "hash": "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65", + "type": "crates-io" + } + }, + "wast": { + "39.0.0": { + "hash": "e9bbbd53432b267421186feee3e52436531fa69a7cfee9403f5204352df3dd05", + "type": "crates-io" + } + }, + "wat": { + "1.0.41": { + "hash": "ab98ed25494f97c69f28758617f27c3e92e5336040b5c3a14634f2dd3fe61830", + "type": "crates-io" + } + }, + "wavefront": { + "0.2.2": { + "hash": "249b7e6cd5bd1cc78a61d0475e5790c98bebabf2dc644a94a51ad58b39298652", + "type": "crates-io" + } + }, + "wayland-client": { + "0.28.6": { + "hash": "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355", + "type": "crates-io" + }, + "0.29.4": { + "hash": "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f", + "type": "crates-io" + } + }, + "wayland-commons": { + "0.28.6": { + "hash": "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda", + "type": "crates-io" + }, + "0.29.4": { + "hash": "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e", + "type": "crates-io" + } + }, + "wayland-cursor": { + "0.28.6": { + "hash": "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a", + "type": "crates-io" + }, + "0.29.4": { + "hash": "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd", + "type": "crates-io" + } + }, + "wayland-protocols": { + "0.28.6": { + "hash": "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f", + "type": "crates-io" + }, + "0.29.4": { + "hash": "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741", + "type": "crates-io" + } + }, + "wayland-scanner": { + "0.28.6": { + "hash": "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1", + "type": "crates-io" + }, + "0.29.4": { + "hash": "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0", + "type": "crates-io" + } + }, + "wayland-sys": { + "0.28.6": { + "hash": "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8", + "type": "crates-io" + }, + "0.29.4": { + "hash": "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4", + "type": "crates-io" + } + }, + "web-sys": { + "0.3.50": { + "hash": "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be", + "type": "crates-io" + } + }, + "webpki": { + "0.21.4": { + "hash": "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea", + "type": "crates-io" + }, + "0.22.0": { + "hash": "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd", + "type": "crates-io" + } + }, + "wfd": { + "0.1.7": { + "hash": "e713040b67aae5bf1a0ae3e1ebba8cc29ab2b90da9aa1bff6e09031a8a41d7a8", + "type": "crates-io" + } + }, + "wgpu": { + "0.8.0": { + "rev": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", + "type": "git", + "url": "https://github.com/gfx-rs/wgpu.git" + } + }, + "wgpu-core": { + "0.8.0": { + "rev": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", + "type": "git", + "url": "https://github.com/gfx-rs/wgpu.git" + } + }, + "wgpu-profiler": { + "0.4.0": { + "ref": "refs/tags/wgpu-0.8", + "rev": "b156eb145bc223386ef344860d9b33b3c181650c", + "type": "git", + "url": "https://github.com/Imberflur/wgpu-profiler" + } + }, + "wgpu-types": { + "0.8.0": { + "rev": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", + "type": "git", + "url": "https://github.com/gfx-rs/wgpu.git" + } + }, + "which": { + "3.1.1": { + "hash": "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724", + "type": "crates-io" + }, + "4.2.5": { + "hash": "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae", + "type": "crates-io" + } + }, + "winapi": { + "0.2.8": { + "hash": "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a", + "type": "crates-io" + }, + "0.3.9": { + "hash": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", + "type": "crates-io" + } + }, + "winapi-build": { + "0.1.1": { + "hash": "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc", + "type": "crates-io" + } + }, + "winapi-i686-pc-windows-gnu": { + "0.4.0": { + "hash": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", + "type": "crates-io" + } + }, + "winapi-util": { + "0.1.5": { + "hash": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", + "type": "crates-io" + } + }, + "winapi-wsapoll": { + "0.1.1": { + "hash": "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e", + "type": "crates-io" + } + }, + "winapi-x86_64-pc-windows-gnu": { + "0.4.0": { + "hash": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", + "type": "crates-io" + } + }, + "window_clipboard": { + "0.2.2": { + "hash": "086ed826cc4468377b6b995300d5f7f852a2fe1eb02e6cd1ccd4a574deb9d310", + "type": "crates-io" + } + }, + "windows-sys": { + "0.30.0": { + "hash": "030b7ff91626e57a05ca64a07c481973cbb2db774e4852c9c7ca342408c6a99a", + "type": "crates-io" + }, + "0.34.0": { + "hash": "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825", + "type": "crates-io" + } + }, + "windows_aarch64_msvc": { + "0.30.0": { + "hash": "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca", + "type": "crates-io" + }, + "0.34.0": { + "hash": "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d", + "type": "crates-io" + } + }, + "windows_i686_gnu": { + "0.30.0": { + "hash": "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8", + "type": "crates-io" + }, + "0.34.0": { + "hash": "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed", + "type": "crates-io" + } + }, + "windows_i686_msvc": { + "0.30.0": { + "hash": "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6", + "type": "crates-io" + }, + "0.34.0": { + "hash": "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956", + "type": "crates-io" + } + }, + "windows_x86_64_gnu": { + "0.30.0": { + "hash": "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a", + "type": "crates-io" + }, + "0.34.0": { + "hash": "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4", + "type": "crates-io" + } + }, + "windows_x86_64_msvc": { + "0.30.0": { + "hash": "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1", + "type": "crates-io" + }, + "0.34.0": { + "hash": "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9", + "type": "crates-io" + } + }, + "winit": { + "0.25.0": { + "hash": "79610794594d5e86be473ef7763f604f2159cbac8c94debd00df8fb41e86c2f8", + "type": "crates-io" + } + }, + "winreg": { + "0.10.1": { + "hash": "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d", + "type": "crates-io" + } + }, + "winres": { + "0.1.12": { + "hash": "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c", + "type": "crates-io" + } + }, + "wio": { + "0.2.2": { + "hash": "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5", + "type": "crates-io" + } + }, + "wyz": { + "0.4.0": { + "hash": "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188", + "type": "crates-io" + } + }, + "x11-clipboard": { + "0.5.3": { + "hash": "473068b7b80ac86a18328824f1054e5e007898c47b5bbc281bd7abe32bc3653c", + "type": "crates-io" + } + }, + "x11-dl": { + "2.19.1": { + "hash": "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59", + "type": "crates-io" + } + }, + "x11rb": { + "0.8.1": { + "hash": "6ffb080b3f2f616242a4eb8e7d325035312127901025b0052bc3154a282d0f19", + "type": "crates-io" + } + }, + "xattr": { + "0.2.2": { + "hash": "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c", + "type": "crates-io" + } + }, + "xcb": { + "0.10.1": { + "hash": "771e2b996df720cd1c6dd9ff90f62d91698fd3610cc078388d0564bdd6622a9c", + "type": "crates-io" + }, + "0.9.0": { + "hash": "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6", + "type": "crates-io" + } + }, + "xcursor": { + "0.3.4": { + "hash": "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7", + "type": "crates-io" + } + }, + "xdg": { + "2.4.1": { + "hash": "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6", + "type": "crates-io" + } + }, + "xi-unicode": { + "0.3.0": { + "hash": "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a", + "type": "crates-io" + } + }, + "xkb": { + "0.2.1": { + "hash": "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2", + "type": "crates-io" + } + }, + "xkbcommon-sys": { + "0.7.5": { + "hash": "59a001b79d45b0b4541c228a501177f2b35db976bf7ee3f7fce8fa2381554ab5", + "type": "crates-io" + }, + "0.7.6": { + "rev": "8f615dd6cd90a4ab77c45627830dde49b592b9b5", + "type": "git", + "url": "https://github.com/Frinksy/rust-xkbcommon-sys.git" + } + }, + "xml-rs": { + "0.8.4": { + "hash": "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3", + "type": "crates-io" + } + }, + "xmlparser": { + "0.13.3": { + "hash": "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8", + "type": "crates-io" + } + }, + "yasna": { + "0.5.0": { + "hash": "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c", + "type": "crates-io" + } + } + } +} diff --git a/flake.lock b/flake.lock index d62e4a0b82..7d6558792f 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "crane": { "flake": false, "locked": { - "lastModified": 1644785799, - "narHash": "sha256-VpAJO1L0XeBvtCuNGK4IDKp6ENHIpTrlaZT7yfBCvwo=", + "lastModified": 1661875961, + "narHash": "sha256-f1h/2c6Teeu1ofAHWzrS8TwBPcnN+EEu+z1sRVmMQTk=", "owner": "ipetkov", "repo": "crane", - "rev": "fc7a94f841347c88f2cb44217b2a3faa93e2a0b2", + "rev": "d9f394e4e20e97c2a60c3ad82c2b6ef99be19e24", "type": "github" }, "original": { @@ -17,19 +17,13 @@ } }, "devshell": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": [ - "nci", - "nixpkgs" - ] - }, + "flake": false, "locked": { - "lastModified": 1652861301, - "narHash": "sha256-k7MboNn4YUoyKsyJMMnJh20jKQHoORn7F+KsWG4cxNo=", + "lastModified": 1660811669, + "narHash": "sha256-V6lmsaLNFz41myppL0yxglta92ijkSvpZ+XVygAh+bU=", "owner": "numtide", "repo": "devshell", - "rev": "95713285f88af14cb96cb18430d478da7b064e93", + "rev": "c2feacb46ee69949124c835419861143c4016fb5", "type": "github" }, "original": { @@ -45,6 +39,10 @@ "nixpkgs" ], "crane": "crane", + "devshell": [ + "nci", + "devshell" + ], "flake-utils-pre-commit": [ "nci", "nixpkgs" @@ -61,10 +59,6 @@ "nci", "nixpkgs" ], - "node2nix": [ - "nci", - "nixpkgs" - ], "poetry2nix": [ "nci", "nixpkgs" @@ -75,11 +69,11 @@ ] }, "locked": { - "lastModified": 1652903532, - "narHash": "sha256-lEDDZdgz053yryoj8AE0EldfDJSWNl/JIYOnL/cdods=", + "lastModified": 1662083074, + "narHash": "sha256-GL4/CLKPYUzkKD1l7oi2XB+vi3z4xGpCVLDdG3tRqvs=", "owner": "nix-community", "repo": "dream2nix", - "rev": "ce73e1a256a297ab056ef5389227474cd34c0518", + "rev": "c6c039fcc6abdf4d828b940b576944a224cf8622", "type": "github" }, "original": { @@ -88,34 +82,19 @@ "type": "github" } }, - "flake-utils": { - "locked": { - "lastModified": 1642700792, - "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "846b2ae0fc4cc943637d3d1def4454213e203cba", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nci": { "inputs": { "devshell": "devshell", "dream2nix": "dream2nix", "nixpkgs": "nixpkgs", - "rustOverlay": "rustOverlay" + "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1652903917, - "narHash": "sha256-osCp4hN7jEONs494YtjNV2P16KPcb/zyxg74CYrConE=", + "lastModified": 1662083103, + "narHash": "sha256-Dal74nxD+w9hfT1cPQ7H8LxZIYMYlOI8UOLNrfFamLM=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "c634e01d11fab71c3e62050c59823ff8a55df84a", + "rev": "df1352199d5dbf8d4c127ef60bfd458149230fd6", "type": "github" }, "original": { @@ -126,11 +105,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1652659998, - "narHash": "sha256-FqNrXC1EE6U2RACwXBlsAvg1lqQGLYpuYb6+W3DL9vA=", + "lastModified": 1662019588, + "narHash": "sha256-oPEjHKGGVbBXqwwL+UjsveJzghWiWV0n9ogo1X6l4cw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1d7db1b9e4cf1ee075a9f52e5c36f7b9f4207502", + "rev": "2da64a81275b68fdad38af669afeda43d401e94b", "type": "github" }, "original": { @@ -145,14 +124,14 @@ "nci": "nci" } }, - "rustOverlay": { + "rust-overlay": { "flake": false, "locked": { - "lastModified": 1652841650, - "narHash": "sha256-hp/WtX369mx38h/J7/q8A8piC/8XkzGMSW71JlXgzGM=", + "lastModified": 1662001050, + "narHash": "sha256-tduflWLNZ6C3Xz0eUHf5Cnnfl47Vgey2NUY5ZU9f/S4=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "65674e95c82955cda97f6c588d022e01fa72b976", + "rev": "6f27501ff78beb62728cb292daca846fcab96c9e", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 2256317b06..b00d3b7ca9 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,17 @@ package = "veloren-voxygen"; app = "veloren-voxygen"; }; + perCrateOverrides = { + veloren-voxygen = { + packageMetadata = _: { + features = rec { + release = ["default-publish"]; + debug = release; + test = release; + }; + }; + }; + }; overrides = { crates = common: prev: let pkgs = common.pkgs; @@ -31,7 +42,7 @@ prettyRev = with sourceInfo; builtins.substring 0 8 rev + "/" + utils.dateTimeFormat lastModified; - tag = with sourceInfo; + tag = if sourceInfo ? tag then sourceInfo.tag else ""; @@ -61,15 +72,37 @@ NIX_GIT_TAG = tag; }; veloren-voxygen = oldAttrs: { - nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; + inherit version; + + buildInputs = + (oldAttrs.buildInputs or []) + ++ ( + with pkgs; [ + alsa-lib + libxkbcommon + udev + xorg.libxcb + ] + ); + nativeBuildInputs = + (oldAttrs.nativeBuildInputs or []) + ++ (with pkgs; [python3 makeWrapper]); + VELOREN_USERDATA_STRATEGY = "system"; + SHADERC_LIB_DIR = "${pkgs.shaderc.lib}/lib"; + + dontUseCmakeConfigure = true; + doCheck = false; + preConfigure = '' + ${oldAttrs.preConfigure or ""} substituteInPlace voxygen/src/audio/soundcache.rs \ --replace \ "../../../assets/voxygen/audio/null.ogg" \ "${./assets/voxygen/audio/null.ogg}" ''; postInstall = '' + ${oldAttrs.postInstall or ""} if [ -f $out/bin/veloren-voxygen ]; then wrapProgram $out/bin/veloren-voxygen \ --set VELOREN_ASSETS ${veloren-assets} \ @@ -81,6 +114,7 @@ nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; VELOREN_USERDATA_STRATEGY = "system"; postInstall = '' + ${oldAttrs.postInstall or ""} if [ -f $out/bin/veloren-server-cli ]; then wrapProgram $out/bin/veloren-server-cli \ --set VELOREN_ASSETS ${veloren-assets} diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index 48d4026f18..a5b7ffe64e 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -19,7 +19,6 @@ It is inspired by games such as Cube World, Legend of Zelda: Breath of the Wild, This package includes the official client, Voxygen. """ runtimeLibs = ["libGL", "xorg.libX11", "xorg.libXcursor", "xorg.libXrandr", "xorg.libXi", "vulkan-loader", "vulkan-extension-layer"] -buildInputs = ["xorg.libxcb"] [features] hot-anim = ["anim/use-dyn-lib"] From 8dba530131321bb98e7f0e8d42c1aa36e11efc7d Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 15:47:52 +0300 Subject: [PATCH 165/854] build(nix): use mold linker --- flake.nix | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/flake.nix b/flake.nix index b00d3b7ca9..eb62259f43 100644 --- a/flake.nix +++ b/flake.nix @@ -62,6 +62,14 @@ mkdir $out ln -sf ${./assets} $out/assets ''; + + configMoldLinker = '' + echo " + [target.x86_64-unknown-linux-gnu] + linker = "clang" + rustflags = ["-C", "link-arg=-fuse-ld=${lib.getExe pkgs.mold}"] + " >> $CARGO_HOME/config.toml + ''; in { veloren-common = oldAttrs: { # Disable `git-lfs` check here since we check it ourselves @@ -71,6 +79,12 @@ NIX_GIT_HASH = prettyRev; NIX_GIT_TAG = tag; }; + veloren-voxygen-deps = oldAttrs: { + postConfigure = '' + ${oldAttrs.postConfigure or ""} + ${configMoldLinker} + ''; + }; veloren-voxygen = oldAttrs: { inherit version; @@ -101,6 +115,10 @@ "../../../assets/voxygen/audio/null.ogg" \ "${./assets/voxygen/audio/null.ogg}" ''; + postConfigure = '' + ${oldAttrs.postConfigure or ""} + ${configMoldLinker} + ''; postInstall = '' ${oldAttrs.postInstall or ""} if [ -f $out/bin/veloren-voxygen ]; then From c6bac19fe4af7dbc4747b90a7d865f4b14662875 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 15:50:30 +0300 Subject: [PATCH 166/854] build(nix): use clang --- flake.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flake.nix b/flake.nix index eb62259f43..44e2202b56 100644 --- a/flake.nix +++ b/flake.nix @@ -22,6 +22,10 @@ }; }; overrides = { + cCompiler = common: { + cCompiler = common.pkgs.clang; + useCCompilerBintools = true; + }; crates = common: prev: let pkgs = common.pkgs; lib = pkgs.lib; From 32d0da05397dfe4bb23392fdd683f5c0869484e0 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 15:52:42 +0300 Subject: [PATCH 167/854] fix: append config correctly --- flake.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 44e2202b56..64e2e375c7 100644 --- a/flake.nix +++ b/flake.nix @@ -68,11 +68,11 @@ ''; configMoldLinker = '' - echo " + cat >>$CARGO_HOME/config.toml <> $CARGO_HOME/config.toml + EOF ''; in { veloren-common = oldAttrs: { From 1c7b781b9e9608465bd43bd7822aebea449644ae Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 21:32:53 +0300 Subject: [PATCH 168/854] build(nix): dont check dependencies derivation --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index 64e2e375c7..27a5ffb48e 100644 --- a/flake.nix +++ b/flake.nix @@ -84,6 +84,8 @@ NIX_GIT_TAG = tag; }; veloren-voxygen-deps = oldAttrs: { + doCheck = false; + postConfigure = '' ${oldAttrs.postConfigure or ""} ${configMoldLinker} From 9c307e3e2386178b1aefaacf41cb4bb4c0cd365c Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 21:39:44 +0300 Subject: [PATCH 169/854] build(nix): update deps --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 7d6558792f..f767ca2f67 100644 --- a/flake.lock +++ b/flake.lock @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662083103, - "narHash": "sha256-Dal74nxD+w9hfT1cPQ7H8LxZIYMYlOI8UOLNrfFamLM=", + "lastModified": 1662143940, + "narHash": "sha256-3eJfehnZLWJGXylfpAMeLR0Q3sx8pAjGiHBQPqOH9+U=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "df1352199d5dbf8d4c127ef60bfd458149230fd6", + "rev": "e83f2598aecbe1114783ff9bdae0b85939de35a3", "type": "github" }, "original": { @@ -127,11 +127,11 @@ "rust-overlay": { "flake": false, "locked": { - "lastModified": 1662001050, - "narHash": "sha256-tduflWLNZ6C3Xz0eUHf5Cnnfl47Vgey2NUY5ZU9f/S4=", + "lastModified": 1662087605, + "narHash": "sha256-Gpf2gp2JenKGf+TylX/YJpttY2bzsnvAMLdLaxoZRyU=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "6f27501ff78beb62728cb292daca846fcab96c9e", + "rev": "60c2cfaa8b90ed8cebd18b214fac8682dcf222dd", "type": "github" }, "original": { From 5bf1a0267fee6bd630bfc0cd987d798c53cd6c92 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 23:12:36 +0300 Subject: [PATCH 170/854] build(nix): add source filtering for voxygen --- dream2nix-packages/dream-lock.json | 9176 ---------------------------- flake.nix | 32 +- 2 files changed, 20 insertions(+), 9188 deletions(-) delete mode 100644 dream2nix-packages/dream-lock.json diff --git a/dream2nix-packages/dream-lock.json b/dream2nix-packages/dream-lock.json deleted file mode 100644 index a3bb26b76c..0000000000 --- a/dream2nix-packages/dream-lock.json +++ /dev/null @@ -1,9176 +0,0 @@ -{ - "_generic": { - "defaultPackage": "veloren-common", - "invalidationHash": "bb5c4854ceaf0d1bc81a38495819ab4b76ed2b878d45eb30c64e6a4ae5e9a313", - "location": "", - "packages": { - "veloren-client": "0.13.0", - "veloren-common": "0.10.0", - "veloren-common-assets": "0.10.0", - "veloren-common-base": "0.10.0", - "veloren-common-ecs": "0.10.0", - "veloren-common-frontend": "0.10.0", - "veloren-common-net": "0.10.0", - "veloren-common-state": "0.10.0", - "veloren-common-systems": "0.10.0", - "veloren-network": "0.3.0", - "veloren-network-protocol": "0.6.1", - "veloren-plugin-api": "0.1.0", - "veloren-plugin-derive": "0.1.0", - "veloren-plugin-rt": "0.1.0", - "veloren-server": "0.13.0", - "veloren-server-cli": "0.13.0", - "veloren-voxygen": "0.13.0", - "veloren-voxygen-anim": "0.10.0", - "veloren-voxygen-anim-dyn": "0.10.0", - "veloren-voxygen-dynlib": "0.1.0", - "veloren-voxygen-egui": "0.9.0", - "veloren-voxygen-egui-dyn": "0.9.0", - "veloren-voxygen-i18n": "0.13.0", - "veloren-world": "0.10.0" - }, - "sourcesAggregatedHash": null, - "subsystem": "rust" - }, - "_subsystem": { - "gitSources": [ - { - "sha": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a", - "type": "rev", - "url": "https://gitlab.com/veloren/auth.git", - "value": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a" - }, - { - "sha": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", - "type": "branch", - "url": "https://gitlab.com/veloren/conrod.git", - "value": "copypasta_0.7" - }, - { - "sha": "63a002c6a9b6c016e45806dd065864431caab621", - "type": "rev", - "url": "https://github.com/hasenbanck/egui_wgpu_backend.git", - "value": "63a002c6a9b6c016e45806dd065864431caab621" - }, - { - "sha": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", - "type": "branch", - "url": "https://github.com/juliancoffee/fluent-rs.git", - "value": "patched" - }, - { - "sha": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "rev", - "url": "https://github.com/gfx-rs/gfx", - "value": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521" - }, - { - "sha": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "tag", - "url": "https://github.com/Imberflur/iced", - "value": "winit-0.25" - }, - { - "sha": "1ae010ca032a57dfe0ba01d4346a3b03bde36de0", - "type": "branch", - "url": "https://gitlab.com/Frinksy/keyboard-keynames.git", - "value": "develop" - }, - { - "sha": "057d03ad86f18e3bb3866b20901d8d4e892dd3d6", - "type": "tag", - "url": "https://github.com/gfx-rs/naga", - "value": "gfx-25" - }, - { - "sha": "df6b37872f3586ac3b21d08b56c8ec7cd92fb172", - "type": "rev", - "url": "https://github.com/xMAC94x/portpicker-rs", - "value": "df6b37872f3586ac3b21d08b56c8ec7cd92fb172" - }, - { - "sha": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", - "type": "rev", - "url": "https://gitlab.com/veloren/refinery.git", - "value": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e" - }, - { - "sha": "54b841fab6cfdb38e8dc1382176e965787964b4c", - "type": "branch", - "url": "https://github.com/fdehau/tui-rs.git", - "value": "paragraph-scroll" - }, - { - "sha": "84d5cb65841d46599a986c5477341bea4456be26", - "type": "rev", - "url": "https://github.com/yoanlcq/vek.git", - "value": "84d5cb65841d46599a986c5477341bea4456be26" - }, - { - "sha": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", - "type": "rev", - "url": "https://github.com/gfx-rs/wgpu.git", - "value": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" - }, - { - "sha": "b156eb145bc223386ef344860d9b33b3c181650c", - "type": "tag", - "url": "https://github.com/Imberflur/wgpu-profiler", - "value": "wgpu-0.8" - }, - { - "sha": "8f615dd6cd90a4ab77c45627830dde49b592b9b5", - "type": "rev", - "url": "https://github.com/Frinksy/rust-xkbcommon-sys.git", - "value": "8f615dd6cd90a4ab77c45627830dde49b592b9b5" - } - ], - "relPathReplacements": { - "veloren-client": { - "0.13.0": {} - }, - "veloren-common": { - "0.10.0": {} - }, - "veloren-common-assets": { - "0.10.0": {} - }, - "veloren-common-base": { - "0.10.0": {} - }, - "veloren-common-ecs": { - "0.10.0": {} - }, - "veloren-common-frontend": { - "0.10.0": {} - }, - "veloren-common-net": { - "0.10.0": {} - }, - "veloren-common-state": { - "0.10.0": {} - }, - "veloren-common-systems": { - "0.10.0": {} - }, - "veloren-network": { - "0.3.0": {} - }, - "veloren-network-protocol": { - "0.6.1": {} - }, - "veloren-plugin-api": { - "0.1.0": {} - }, - "veloren-plugin-derive": { - "0.1.0": {} - }, - "veloren-plugin-rt": { - "0.1.0": {} - }, - "veloren-server": { - "0.13.0": {} - }, - "veloren-server-cli": { - "0.13.0": {} - }, - "veloren-voxygen": { - "0.13.0": {} - }, - "veloren-voxygen-anim": { - "0.10.0": {} - }, - "veloren-voxygen-anim-dyn": { - "0.10.0": {} - }, - "veloren-voxygen-dynlib": { - "0.1.0": {} - }, - "veloren-voxygen-egui": { - "0.9.0": {} - }, - "veloren-voxygen-egui-dyn": { - "0.9.0": {} - }, - "veloren-voxygen-i18n": { - "0.13.0": {} - }, - "veloren-world": { - "0.10.0": {} - } - } - }, - "cyclicDependencies": {}, - "dependencies": { - "ab_glyph": { - "0.2.15": [ - [ "ab_glyph_rasterizer", "0.1.5" ], - [ "owned_ttf_parser", "0.15.0" ] - ] - }, - "addr2line": { - "0.17.0": [ - [ "gimli", "0.26.1" ] - ] - }, - "ahash": { - "0.3.8": [ - [ "const-random", "0.1.13" ] - ], - "0.7.6": [ - [ "getrandom", "0.2.6" ], - [ "once_cell", "1.10.0" ], - [ "version_check", "0.9.4" ] - ] - }, - "aho-corasick": { - "0.7.18": [ - [ "memchr", "2.4.1" ] - ] - }, - "alsa": { - "0.6.0": [ - [ "alsa-sys", "0.3.1" ], - [ "bitflags", "1.3.2" ], - [ "libc", "0.2.121" ], - [ "nix", "0.23.1" ] - ] - }, - "alsa-sys": { - "0.3.1": [ - [ "libc", "0.2.121" ], - [ "pkg-config", "0.3.25" ] - ] - }, - "andrew": { - "0.3.1": [ - [ "bitflags", "1.3.2" ], - [ "rusttype", "0.9.2" ], - [ "walkdir", "2.3.2" ], - [ "xdg", "2.4.1" ], - [ "xml-rs", "0.8.4" ] - ] - }, - "ansi-parser": { - "0.8.0": [ - [ "heapless", "0.5.6" ], - [ "nom", "4.2.3" ] - ] - }, - "ansi_term": { - "0.12.1": [ - [ "winapi", "0.3.9" ] - ] - }, - "app_dirs2": { - "2.5.2": [ - [ "jni", "0.19.0" ], - [ "ndk-context", "0.1.0" ], - [ "winapi", "0.3.9" ], - [ "xdg", "2.4.1" ] - ] - }, - "approx": { - "0.3.2": [ - [ "num-traits", "0.2.14" ] - ], - "0.4.0": [ - [ "num-traits", "0.2.14" ] - ], - "0.5.1": [ - [ "num-traits", "0.2.14" ] - ] - }, - "arr_macro": { - "0.1.3": [ - [ "arr_macro_impl", "0.1.3" ], - [ "proc-macro-hack", "0.5.19" ] - ] - }, - "arr_macro_impl": { - "0.1.3": [ - [ "proc-macro-hack", "0.5.19" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "arrayvec": { - "0.5.2": [ - [ "serde", "1.0.136" ] - ] - }, - "as-slice": { - "0.1.5": [ - [ "generic-array", "0.12.4" ], - [ "generic-array", "0.13.3" ], - [ "generic-array", "0.14.5" ], - [ "stable_deref_trait", "1.2.0" ] - ] - }, - "ash": { - "0.32.1": [ - [ "libloading", "0.7.3" ] - ] - }, - "assets_manager": { - "0.8.1": [ - [ "ab_glyph", "0.2.15" ], - [ "ahash", "0.7.6" ], - [ "bincode", "1.3.3" ], - [ "crossbeam-channel", "0.5.4" ], - [ "log", "0.4.16" ], - [ "notify", "5.0.0-pre.15" ], - [ "parking_lot", "0.12.0" ], - [ "ron", "0.7.0" ], - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ] - ] - }, - "async-channel": { - "1.6.1": [ - [ "concurrent-queue", "1.2.2" ], - [ "event-listener", "2.5.2" ], - [ "futures-core", "0.3.21" ] - ] - }, - "async-trait": { - "0.1.53": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "atomicwrites": { - "0.3.1": [ - [ "tempfile", "3.3.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "atty": { - "0.2.14": [ - [ "hermit-abi", "0.1.19" ], - [ "libc", "0.2.121" ], - [ "winapi", "0.3.9" ] - ] - }, - "auth-common": { - "0.1.0": [ - [ "rand", "0.8.5" ], - [ "serde", "1.0.136" ], - [ "uuid", "0.8.2" ] - ] - }, - "authc": { - "1.0.0": [ - [ "auth-common", "0.1.0" ], - [ "fxhash", "0.2.1" ], - [ "hex", "0.3.2" ], - [ "http", "0.2.6" ], - [ "hyper", "0.14.18" ], - [ "hyper-rustls", "0.22.1" ], - [ "rust-argon2", "0.8.3" ], - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "uuid", "0.8.2" ] - ] - }, - "backtrace": { - "0.3.65": [ - [ "addr2line", "0.17.0" ], - [ "cc", "1.0.73" ], - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "miniz_oxide", "0.5.1" ], - [ "object", "0.28.3" ], - [ "rustc-demangle", "0.1.21" ] - ] - }, - "bincode": { - "1.3.3": [ - [ "serde", "1.0.136" ] - ] - }, - "bindgen": { - "0.56.0": [ - [ "bitflags", "1.3.2" ], - [ "cexpr", "0.4.0" ], - [ "clang-sys", "1.3.1" ], - [ "clap", "2.34.0" ], - [ "env_logger", "0.8.4" ], - [ "lazy_static", "1.4.0" ], - [ "lazycell", "1.3.0" ], - [ "log", "0.4.16" ], - [ "peeking_take_while", "0.1.2" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "regex", "1.5.5" ], - [ "rustc-hash", "1.1.0" ], - [ "shlex", "0.1.1" ], - [ "which", "3.1.1" ] - ] - }, - "bit-set": { - "0.5.2": [ - [ "bit-vec", "0.6.3" ] - ] - }, - "bitvec": { - "0.22.3": [ - [ "funty", "1.2.0" ], - [ "radium", "0.6.2" ], - [ "tap", "1.0.1" ], - [ "wyz", "0.4.0" ] - ] - }, - "blake2b_simd": { - "0.5.11": [ - [ "arrayref", "0.3.6" ], - [ "arrayvec", "0.5.2" ], - [ "constant_time_eq", "0.1.5" ] - ] - }, - "block-buffer": { - "0.10.2": [ - [ "generic-array", "0.14.5" ] - ] - }, - "bstr": { - "0.2.17": [ - [ "lazy_static", "1.4.0" ], - [ "memchr", "2.4.1" ], - [ "regex-automata", "0.1.10" ], - [ "serde", "1.0.136" ] - ] - }, - "bytecheck": { - "0.6.7": [ - [ "bytecheck_derive", "0.6.7" ], - [ "ptr_meta", "0.1.4" ] - ] - }, - "bytecheck_derive": { - "0.6.7": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "bytemuck": { - "1.9.1": [ - [ "bytemuck_derive", "1.1.0" ] - ] - }, - "bytemuck_derive": { - "1.1.0": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "calloop": { - "0.6.5": [ - [ "log", "0.4.16" ], - [ "nix", "0.18.0" ] - ] - }, - "cast": { - "0.2.7": [ - [ "rustc_version", "0.4.0" ] - ] - }, - "cc": { - "1.0.73": [ - [ "jobserver", "0.1.24" ] - ] - }, - "censor": { - "0.2.0": [ - [ "once_cell", "1.10.0" ] - ] - }, - "cexpr": { - "0.4.0": [ - [ "nom", "5.1.2" ] - ] - }, - "chrono": { - "0.4.19": [ - [ "libc", "0.2.121" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ], - [ "serde", "1.0.136" ], - [ "time", "0.1.44" ], - [ "winapi", "0.3.9" ] - ] - }, - "chrono-tz": { - "0.6.1": [ - [ "chrono", "0.4.19" ], - [ "chrono-tz-build", "0.0.2" ], - [ "phf", "0.10.1" ], - [ "serde", "1.0.136" ] - ] - }, - "chrono-tz-build": { - "0.0.2": [ - [ "parse-zoneinfo", "0.3.0" ], - [ "phf", "0.10.1" ], - [ "phf_codegen", "0.10.0" ] - ] - }, - "chumsky": { - "0.8.0": [ - [ "ahash", "0.3.8" ] - ] - }, - "clang-sys": { - "1.3.1": [ - [ "glob", "0.3.0" ], - [ "libc", "0.2.121" ], - [ "libloading", "0.7.3" ] - ] - }, - "clap": { - "2.34.0": [ - [ "ansi_term", "0.12.1" ], - [ "atty", "0.2.14" ], - [ "bitflags", "1.3.2" ], - [ "strsim", "0.8.0" ], - [ "textwrap", "0.11.0" ], - [ "unicode-width", "0.1.9" ], - [ "vec_map", "0.8.2" ] - ], - "3.1.10": [ - [ "atty", "0.2.14" ], - [ "bitflags", "1.3.2" ], - [ "clap_derive", "3.1.7" ], - [ "clap_lex", "0.1.1" ], - [ "indexmap", "1.8.1" ], - [ "lazy_static", "1.4.0" ], - [ "strsim", "0.10.0" ], - [ "termcolor", "1.1.3" ], - [ "textwrap", "0.15.0" ] - ] - }, - "clap_derive": { - "3.1.7": [ - [ "heck", "0.4.0" ], - [ "proc-macro-error", "1.0.4" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "clap_lex": { - "0.1.1": [ - [ "os_str_bytes", "6.0.0" ] - ] - }, - "clipboard-win": { - "3.1.1": [ - [ "lazy-bytes-cast", "5.0.1" ], - [ "winapi", "0.3.9" ] - ], - "4.4.1": [ - [ "error-code", "2.3.1" ], - [ "str-buf", "1.0.5" ], - [ "winapi", "0.3.9" ] - ] - }, - "clipboard_macos": { - "0.1.0": [ - [ "objc", "0.2.7" ], - [ "objc-foundation", "0.1.1" ], - [ "objc_id", "0.1.1" ] - ] - }, - "clipboard_wayland": { - "0.2.0": [ - [ "smithay-clipboard", "0.6.5" ] - ] - }, - "clipboard_x11": { - "0.3.1": [ - [ "thiserror", "1.0.30" ], - [ "x11rb", "0.8.1" ] - ] - }, - "cloudabi": { - "0.0.3": [ - [ "bitflags", "1.3.2" ] - ] - }, - "cmake": { - "0.1.45": [ - [ "cc", "1.0.73" ] - ] - }, - "cocoa": { - "0.24.0": [ - [ "bitflags", "1.3.2" ], - [ "block", "0.1.6" ], - [ "cocoa-foundation", "0.1.0" ], - [ "core-foundation", "0.9.3" ], - [ "core-graphics", "0.22.3" ], - [ "foreign-types", "0.3.2" ], - [ "libc", "0.2.121" ], - [ "objc", "0.2.7" ] - ] - }, - "cocoa-foundation": { - "0.1.0": [ - [ "bitflags", "1.3.2" ], - [ "block", "0.1.6" ], - [ "core-foundation", "0.9.3" ], - [ "core-graphics-types", "0.1.1" ], - [ "foreign-types", "0.3.2" ], - [ "libc", "0.2.121" ], - [ "objc", "0.2.7" ] - ] - }, - "codespan-reporting": { - "0.11.1": [ - [ "termcolor", "1.1.3" ], - [ "unicode-width", "0.1.9" ] - ] - }, - "combine": { - "4.6.3": [ - [ "bytes", "1.1.0" ], - [ "memchr", "2.4.1" ] - ] - }, - "concurrent-queue": { - "1.2.2": [ - [ "cache-padded", "1.2.0" ] - ] - }, - "conrod_core": { - "0.63.0": [ - [ "conrod_derive", "0.63.0" ], - [ "copypasta", "0.7.1" ], - [ "daggy", "0.5.0" ], - [ "fnv", "1.0.7" ], - [ "instant", "0.1.12" ], - [ "num", "0.2.1" ], - [ "pistoncore-input", "0.24.0" ], - [ "rusttype", "0.7.9" ] - ] - }, - "conrod_derive": { - "0.63.0": [ - [ "proc-macro2", "0.4.30" ], - [ "quote", "0.6.13" ], - [ "syn", "0.15.44" ] - ] - }, - "const-random": { - "0.1.13": [ - [ "const-random-macro", "0.1.13" ], - [ "proc-macro-hack", "0.5.19" ] - ] - }, - "const-random-macro": { - "0.1.13": [ - [ "getrandom", "0.2.6" ], - [ "lazy_static", "1.4.0" ], - [ "proc-macro-hack", "0.5.19" ], - [ "tiny-keccak", "2.0.2" ] - ] - }, - "copy_dir": { - "0.1.2": [ - [ "walkdir", "0.1.8" ] - ] - }, - "copypasta": { - "0.7.1": [ - [ "clipboard-win", "3.1.1" ], - [ "objc", "0.2.7" ], - [ "objc-foundation", "0.1.1" ], - [ "objc_id", "0.1.1" ], - [ "smithay-clipboard", "0.6.5" ], - [ "x11-clipboard", "0.5.3" ] - ] - }, - "core-foundation": { - "0.6.4": [ - [ "core-foundation-sys", "0.6.2" ], - [ "libc", "0.2.121" ] - ], - "0.7.0": [ - [ "core-foundation-sys", "0.7.0" ], - [ "libc", "0.2.121" ] - ], - "0.9.3": [ - [ "core-foundation-sys", "0.8.3" ], - [ "libc", "0.2.121" ] - ] - }, - "core-graphics": { - "0.19.2": [ - [ "bitflags", "1.3.2" ], - [ "core-foundation", "0.7.0" ], - [ "foreign-types", "0.3.2" ], - [ "libc", "0.2.121" ] - ], - "0.22.3": [ - [ "bitflags", "1.3.2" ], - [ "core-foundation", "0.9.3" ], - [ "core-graphics-types", "0.1.1" ], - [ "foreign-types", "0.3.2" ], - [ "libc", "0.2.121" ] - ] - }, - "core-graphics-types": { - "0.1.1": [ - [ "bitflags", "1.3.2" ], - [ "core-foundation", "0.9.3" ], - [ "foreign-types", "0.3.2" ], - [ "libc", "0.2.121" ] - ] - }, - "core-video-sys": { - "0.1.4": [ - [ "cfg-if", "0.1.10" ], - [ "core-foundation-sys", "0.7.0" ], - [ "core-graphics", "0.19.2" ], - [ "libc", "0.2.121" ], - [ "objc", "0.2.7" ] - ] - }, - "coreaudio-rs": { - "0.10.0": [ - [ "bitflags", "1.3.2" ], - [ "coreaudio-sys", "0.2.9" ] - ] - }, - "coreaudio-sys": { - "0.2.9": [ - [ "bindgen", "0.56.0" ] - ] - }, - "cpal": { - "0.13.5": [ - [ "alsa", "0.6.0" ], - [ "core-foundation-sys", "0.8.3" ], - [ "coreaudio-rs", "0.10.0" ], - [ "jni", "0.19.0" ], - [ "js-sys", "0.3.56" ], - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "mach", "0.3.2" ], - [ "ndk", "0.6.0" ], - [ "ndk-glue", "0.6.1" ], - [ "nix", "0.23.1" ], - [ "oboe", "0.4.5" ], - [ "parking_lot", "0.11.2" ], - [ "stdweb", "0.1.3" ], - [ "thiserror", "1.0.30" ], - [ "web-sys", "0.3.50" ], - [ "winapi", "0.3.9" ] - ] - }, - "cpufeatures": { - "0.2.2": [ - [ "libc", "0.2.121" ] - ] - }, - "cranelift-bforest": { - "0.76.0": [ - [ "cranelift-entity", "0.76.0" ] - ] - }, - "cranelift-codegen": { - "0.76.0": [ - [ "cranelift-bforest", "0.76.0" ], - [ "cranelift-codegen-meta", "0.76.0" ], - [ "cranelift-codegen-shared", "0.76.0" ], - [ "cranelift-entity", "0.76.0" ], - [ "gimli", "0.25.0" ], - [ "log", "0.4.16" ], - [ "regalloc", "0.0.31" ], - [ "smallvec", "1.8.0" ], - [ "target-lexicon", "0.12.3" ] - ] - }, - "cranelift-codegen-meta": { - "0.76.0": [ - [ "cranelift-codegen-shared", "0.76.0" ], - [ "cranelift-entity", "0.76.0" ] - ] - }, - "cranelift-frontend": { - "0.76.0": [ - [ "cranelift-codegen", "0.76.0" ], - [ "log", "0.4.16" ], - [ "smallvec", "1.8.0" ], - [ "target-lexicon", "0.12.3" ] - ] - }, - "crc32fast": { - "1.3.2": [ - [ "cfg-if", "1.0.0" ] - ] - }, - "criterion": { - "0.3.4": [ - [ "atty", "0.2.14" ], - [ "cast", "0.2.7" ], - [ "clap", "2.34.0" ], - [ "criterion-plot", "0.4.4" ], - [ "csv", "1.1.6" ], - [ "futures", "0.3.21" ], - [ "itertools", "0.10.3" ], - [ "lazy_static", "1.4.0" ], - [ "num-traits", "0.2.14" ], - [ "oorandom", "11.1.3" ], - [ "plotters", "0.3.0" ], - [ "rayon", "1.5.1" ], - [ "regex", "1.5.5" ], - [ "serde", "1.0.136" ], - [ "serde_cbor", "0.11.2" ], - [ "serde_derive", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "tinytemplate", "1.2.1" ], - [ "tokio", "1.17.0" ], - [ "walkdir", "2.3.2" ] - ] - }, - "criterion-plot": { - "0.4.4": [ - [ "cast", "0.2.7" ], - [ "itertools", "0.10.3" ] - ] - }, - "crossbeam": { - "0.8.1": [ - [ "cfg-if", "1.0.0" ], - [ "crossbeam-channel", "0.5.4" ], - [ "crossbeam-deque", "0.8.1" ], - [ "crossbeam-epoch", "0.9.8" ], - [ "crossbeam-queue", "0.3.5" ], - [ "crossbeam-utils", "0.8.8" ] - ] - }, - "crossbeam-channel": { - "0.5.4": [ - [ "cfg-if", "1.0.0" ], - [ "crossbeam-utils", "0.8.8" ] - ] - }, - "crossbeam-deque": { - "0.7.4": [ - [ "crossbeam-epoch", "0.8.2" ], - [ "crossbeam-utils", "0.7.2" ], - [ "maybe-uninit", "2.0.0" ] - ], - "0.8.1": [ - [ "cfg-if", "1.0.0" ], - [ "crossbeam-epoch", "0.9.8" ], - [ "crossbeam-utils", "0.8.8" ] - ] - }, - "crossbeam-epoch": { - "0.8.2": [ - [ "autocfg", "1.1.0" ], - [ "cfg-if", "0.1.10" ], - [ "crossbeam-utils", "0.7.2" ], - [ "lazy_static", "1.4.0" ], - [ "maybe-uninit", "2.0.0" ], - [ "memoffset", "0.5.6" ], - [ "scopeguard", "1.1.0" ] - ], - "0.9.8": [ - [ "autocfg", "1.1.0" ], - [ "cfg-if", "1.0.0" ], - [ "crossbeam-utils", "0.8.8" ], - [ "lazy_static", "1.4.0" ], - [ "memoffset", "0.6.5" ], - [ "scopeguard", "1.1.0" ] - ] - }, - "crossbeam-queue": { - "0.3.5": [ - [ "cfg-if", "1.0.0" ], - [ "crossbeam-utils", "0.8.8" ] - ] - }, - "crossbeam-utils": { - "0.7.2": [ - [ "autocfg", "1.1.0" ], - [ "cfg-if", "0.1.10" ], - [ "lazy_static", "1.4.0" ] - ], - "0.8.8": [ - [ "cfg-if", "1.0.0" ], - [ "lazy_static", "1.4.0" ] - ] - }, - "crossterm": { - "0.17.7": [ - [ "bitflags", "1.3.2" ], - [ "crossterm_winapi", "0.6.2" ], - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "mio", "0.7.14" ], - [ "parking_lot", "0.10.2" ], - [ "signal-hook", "0.1.17" ], - [ "winapi", "0.3.9" ] - ], - "0.23.2": [ - [ "bitflags", "1.3.2" ], - [ "crossterm_winapi", "0.9.0" ], - [ "libc", "0.2.121" ], - [ "mio", "0.8.2" ], - [ "parking_lot", "0.12.0" ], - [ "signal-hook", "0.3.13" ], - [ "signal-hook-mio", "0.2.3" ], - [ "winapi", "0.3.9" ] - ] - }, - "crossterm_winapi": { - "0.6.2": [ - [ "winapi", "0.3.9" ] - ], - "0.9.0": [ - [ "winapi", "0.3.9" ] - ] - }, - "crypto-common": { - "0.1.3": [ - [ "generic-array", "0.14.5" ], - [ "typenum", "1.15.0" ] - ] - }, - "csv": { - "1.1.6": [ - [ "bstr", "0.2.17" ], - [ "csv-core", "0.1.10" ], - [ "itoa", "0.4.8" ], - [ "ryu", "1.0.9" ], - [ "serde", "1.0.136" ] - ] - }, - "csv-core": { - "0.1.10": [ - [ "memchr", "2.4.1" ] - ] - }, - "ct-logs": { - "0.8.0": [ - [ "sct", "0.6.1" ] - ] - }, - "d3d12": { - "0.4.1": [ - [ "bitflags", "1.3.2" ], - [ "libloading", "0.7.3" ], - [ "winapi", "0.3.9" ] - ] - }, - "daggy": { - "0.5.0": [ - [ "petgraph", "0.4.13" ] - ] - }, - "darling": { - "0.10.2": [ - [ "darling_core", "0.10.2" ], - [ "darling_macro", "0.10.2" ] - ], - "0.13.2": [ - [ "darling_core", "0.13.2" ], - [ "darling_macro", "0.13.2" ] - ] - }, - "darling_core": { - "0.10.2": [ - [ "fnv", "1.0.7" ], - [ "ident_case", "1.0.1" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "strsim", "0.9.3" ], - [ "syn", "1.0.98" ] - ], - "0.13.2": [ - [ "fnv", "1.0.7" ], - [ "ident_case", "1.0.1" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "strsim", "0.10.0" ], - [ "syn", "1.0.98" ] - ] - }, - "darling_macro": { - "0.10.2": [ - [ "darling_core", "0.10.2" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ], - "0.13.2": [ - [ "darling_core", "0.13.2" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "deflate": { - "1.0.0": [ - [ "adler32", "1.2.0" ] - ] - }, - "digest": { - "0.10.3": [ - [ "block-buffer", "0.10.2" ], - [ "crypto-common", "0.1.3" ] - ] - }, - "directories-next": { - "2.0.0": [ - [ "cfg-if", "1.0.0" ], - [ "dirs-sys-next", "0.1.2" ] - ] - }, - "dirs": { - "4.0.0": [ - [ "dirs-sys", "0.3.7" ] - ] - }, - "dirs-next": { - "2.0.0": [ - [ "cfg-if", "1.0.0" ], - [ "dirs-sys-next", "0.1.2" ] - ] - }, - "dirs-sys": { - "0.3.7": [ - [ "libc", "0.2.121" ], - [ "redox_users", "0.4.3" ], - [ "winapi", "0.3.9" ] - ] - }, - "dirs-sys-next": { - "0.1.2": [ - [ "libc", "0.2.121" ], - [ "redox_users", "0.4.3" ], - [ "winapi", "0.3.9" ] - ] - }, - "discord-sdk": { - "0.3.0": [ - [ "anyhow", "1.0.61" ], - [ "app_dirs2", "2.5.2" ], - [ "async-trait", "0.1.53" ], - [ "base64", "0.13.0" ], - [ "bitflags", "1.3.2" ], - [ "crossbeam-channel", "0.5.4" ], - [ "num-traits", "0.2.14" ], - [ "parking_lot", "0.12.0" ], - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "serde_repr", "0.1.7" ], - [ "thiserror", "1.0.30" ], - [ "time", "0.3.9" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ], - [ "url", "2.2.2" ], - [ "winreg", "0.10.1" ] - ] - }, - "dlib": { - "0.4.2": [ - [ "libloading", "0.6.7" ] - ], - "0.5.0": [ - [ "libloading", "0.7.3" ] - ] - }, - "dot_vox": { - "4.1.0": [ - [ "byteorder", "1.4.3" ], - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "nom", "4.2.3" ] - ] - }, - "egui": { - "0.12.0": [ - [ "epaint", "0.12.0" ] - ] - }, - "egui_wgpu_backend": { - "0.8.0": [ - [ "bytemuck", "1.9.1" ], - [ "epi", "0.12.0" ], - [ "wgpu", "0.8.0" ] - ] - }, - "egui_winit_platform": { - "0.8.0": [ - [ "egui", "0.12.0" ], - [ "winit", "0.25.0" ] - ] - }, - "enum-iterator": { - "0.7.0": [ - [ "enum-iterator-derive", "0.7.0" ] - ] - }, - "enum-iterator-derive": { - "0.7.0": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "enumset": { - "1.0.9": [ - [ "enumset_derive", "0.5.6" ] - ] - }, - "enumset_derive": { - "0.5.6": [ - [ "darling", "0.13.2" ], - [ "proc-macro-crate", "1.1.3" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "env_logger": { - "0.8.4": [ - [ "atty", "0.2.14" ], - [ "humantime", "2.1.0" ], - [ "log", "0.4.16" ], - [ "regex", "1.5.5" ], - [ "termcolor", "1.1.3" ] - ] - }, - "epaint": { - "0.12.0": [ - [ "ahash", "0.7.6" ], - [ "atomic_refcell", "0.1.8" ], - [ "emath", "0.12.0" ], - [ "ordered-float", "2.10.0" ], - [ "rusttype", "0.9.2" ] - ] - }, - "epi": { - "0.12.0": [ - [ "egui", "0.12.0" ] - ] - }, - "errno": { - "0.2.8": [ - [ "errno-dragonfly", "0.1.2" ], - [ "libc", "0.2.121" ], - [ "winapi", "0.3.9" ] - ] - }, - "errno-dragonfly": { - "0.1.2": [ - [ "cc", "1.0.73" ], - [ "libc", "0.2.121" ] - ] - }, - "error-code": { - "2.3.1": [ - [ "libc", "0.2.121" ], - [ "str-buf", "1.0.5" ] - ] - }, - "etagere": { - "0.2.7": [ - [ "euclid", "0.22.7" ], - [ "svg_fmt", "0.4.1" ] - ] - }, - "euc": { - "0.5.3": [ - [ "vek", "0.14.1" ] - ] - }, - "euclid": { - "0.22.7": [ - [ "num-traits", "0.2.14" ] - ] - }, - "fastrand": { - "1.7.0": [ - [ "instant", "0.1.12" ] - ] - }, - "fd-lock": { - "3.0.5": [ - [ "cfg-if", "1.0.0" ], - [ "rustix", "0.34.1" ], - [ "windows-sys", "0.30.0" ] - ] - }, - "fehler": { - "1.0.0": [ - [ "fehler-macros", "1.0.0" ] - ] - }, - "fehler-macros": { - "1.0.0": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "filetime": { - "0.2.15": [ - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "redox_syscall", "0.2.13" ], - [ "winapi", "0.3.9" ] - ] - }, - "flate2": { - "1.0.24": [ - [ "crc32fast", "1.3.2" ], - [ "miniz_oxide", "0.5.1" ] - ] - }, - "float-cmp": { - "0.9.0": [ - [ "num-traits", "0.2.14" ] - ] - }, - "fluent": { - "0.16.0": [ - [ "fluent-bundle", "0.15.2" ], - [ "unic-langid", "0.9.0" ] - ] - }, - "fluent-bundle": { - "0.15.2": [ - [ "fluent-langneg", "0.13.0" ], - [ "fluent-syntax", "0.11.0" ], - [ "intl-memoizer", "0.5.1" ], - [ "intl_pluralrules", "7.0.1" ], - [ "rustc-hash", "1.1.0" ], - [ "self_cell", "0.10.2" ], - [ "smallvec", "1.8.0" ], - [ "unic-langid", "0.9.0" ] - ] - }, - "fluent-langneg": { - "0.13.0": [ - [ "unic-langid", "0.9.0" ] - ] - }, - "fluent-syntax": { - "0.11.0": [ - [ "thiserror", "1.0.30" ] - ] - }, - "foreign-types": { - "0.3.2": [ - [ "foreign-types-shared", "0.1.1" ] - ] - }, - "form_urlencoded": { - "1.0.1": [ - [ "matches", "0.1.9" ], - [ "percent-encoding", "2.1.0" ] - ] - }, - "fsevent-sys": { - "4.1.0": [ - [ "libc", "0.2.121" ] - ] - }, - "futures": { - "0.3.21": [ - [ "futures-channel", "0.3.21" ], - [ "futures-core", "0.3.21" ], - [ "futures-executor", "0.3.21" ], - [ "futures-io", "0.3.21" ], - [ "futures-sink", "0.3.21" ], - [ "futures-task", "0.3.21" ], - [ "futures-util", "0.3.21" ] - ] - }, - "futures-channel": { - "0.3.21": [ - [ "futures-core", "0.3.21" ], - [ "futures-sink", "0.3.21" ] - ] - }, - "futures-executor": { - "0.3.21": [ - [ "futures-core", "0.3.21" ], - [ "futures-task", "0.3.21" ], - [ "futures-util", "0.3.21" ], - [ "num_cpus", "1.13.1" ] - ] - }, - "futures-macro": { - "0.3.21": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "futures-util": { - "0.3.21": [ - [ "futures-channel", "0.3.21" ], - [ "futures-core", "0.3.21" ], - [ "futures-io", "0.3.21" ], - [ "futures-macro", "0.3.21" ], - [ "futures-sink", "0.3.21" ], - [ "futures-task", "0.3.21" ], - [ "memchr", "2.4.1" ], - [ "pin-project-lite", "0.2.8" ], - [ "pin-utils", "0.1.0" ], - [ "slab", "0.4.6" ] - ] - }, - "fxhash": { - "0.2.1": [ - [ "byteorder", "1.4.3" ] - ] - }, - "generator": { - "0.7.0": [ - [ "cc", "1.0.73" ], - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "rustversion", "1.0.6" ], - [ "winapi", "0.3.9" ] - ] - }, - "generic-array": { - "0.12.4": [ - [ "typenum", "1.15.0" ] - ], - "0.13.3": [ - [ "typenum", "1.15.0" ] - ], - "0.14.5": [ - [ "typenum", "1.15.0" ], - [ "version_check", "0.9.4" ] - ] - }, - "gethostname": { - "0.2.3": [ - [ "libc", "0.2.121" ], - [ "winapi", "0.3.9" ] - ] - }, - "getrandom": { - "0.1.16": [ - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "wasi", "0.9.0+wasi-snapshot-preview1" ] - ], - "0.2.6": [ - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "wasi", "0.10.0+wasi-snapshot-preview1" ] - ] - }, - "gfx-auxil": { - "0.9.0": [ - [ "fxhash", "0.2.1" ], - [ "gfx-hal", "0.8.0" ], - [ "spirv_cross", "0.23.1" ] - ] - }, - "gfx-backend-dx11": { - "0.8.0": [ - [ "arrayvec", "0.5.2" ], - [ "bitflags", "1.3.2" ], - [ "gfx-auxil", "0.9.0" ], - [ "gfx-hal", "0.8.0" ], - [ "libloading", "0.7.3" ], - [ "log", "0.4.16" ], - [ "parking_lot", "0.11.2" ], - [ "range-alloc", "0.1.2" ], - [ "raw-window-handle", "0.3.4" ], - [ "smallvec", "1.8.0" ], - [ "spirv_cross", "0.23.1" ], - [ "thunderdome", "0.4.2" ], - [ "winapi", "0.3.9" ], - [ "wio", "0.2.2" ] - ] - }, - "gfx-backend-dx12": { - "0.8.0": [ - [ "arrayvec", "0.5.2" ], - [ "bit-set", "0.5.2" ], - [ "bitflags", "1.3.2" ], - [ "d3d12", "0.4.1" ], - [ "gfx-auxil", "0.9.0" ], - [ "gfx-hal", "0.8.0" ], - [ "log", "0.4.16" ], - [ "parking_lot", "0.11.2" ], - [ "range-alloc", "0.1.2" ], - [ "raw-window-handle", "0.3.4" ], - [ "smallvec", "1.8.0" ], - [ "spirv_cross", "0.23.1" ], - [ "thunderdome", "0.4.2" ], - [ "winapi", "0.3.9" ] - ] - }, - "gfx-backend-empty": { - "0.8.0": [ - [ "gfx-hal", "0.8.0" ], - [ "log", "0.4.16" ], - [ "raw-window-handle", "0.3.4" ] - ] - }, - "gfx-backend-gl": { - "0.8.1": [ - [ "arrayvec", "0.5.2" ], - [ "bitflags", "1.3.2" ], - [ "fxhash", "0.2.1" ], - [ "gfx-auxil", "0.9.0" ], - [ "gfx-hal", "0.8.0" ], - [ "glow", "0.9.0" ], - [ "js-sys", "0.3.56" ], - [ "khronos-egl", "4.1.0" ], - [ "libloading", "0.7.3" ], - [ "log", "0.4.16" ], - [ "naga", "0.4.0" ], - [ "parking_lot", "0.11.2" ], - [ "raw-window-handle", "0.3.4" ], - [ "spirv_cross", "0.23.1" ], - [ "wasm-bindgen", "0.2.79" ], - [ "web-sys", "0.3.50" ] - ] - }, - "gfx-backend-metal": { - "0.8.1": [ - [ "arrayvec", "0.5.2" ], - [ "bitflags", "1.3.2" ], - [ "block", "0.1.6" ], - [ "cocoa-foundation", "0.1.0" ], - [ "copyless", "0.1.5" ], - [ "foreign-types", "0.3.2" ], - [ "fxhash", "0.2.1" ], - [ "gfx-auxil", "0.9.0" ], - [ "gfx-hal", "0.8.0" ], - [ "log", "0.4.16" ], - [ "metal", "0.22.0" ], - [ "naga", "0.4.0" ], - [ "objc", "0.2.7" ], - [ "parking_lot", "0.11.2" ], - [ "profiling", "1.0.6" ], - [ "range-alloc", "0.1.2" ], - [ "raw-window-handle", "0.3.4" ], - [ "spirv_cross", "0.23.1" ], - [ "storage-map", "0.3.0" ] - ] - }, - "gfx-backend-vulkan": { - "0.8.0": [ - [ "arrayvec", "0.5.2" ], - [ "ash", "0.32.1" ], - [ "byteorder", "1.4.3" ], - [ "core-graphics-types", "0.1.1" ], - [ "gfx-hal", "0.8.0" ], - [ "inplace_it", "0.3.3" ], - [ "libloading", "0.7.3" ], - [ "log", "0.4.16" ], - [ "naga", "0.4.0" ], - [ "objc", "0.2.7" ], - [ "parking_lot", "0.11.2" ], - [ "raw-window-handle", "0.3.4" ], - [ "renderdoc-sys", "0.7.1" ], - [ "smallvec", "1.8.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "gfx-hal": { - "0.8.0": [ - [ "bitflags", "1.3.2" ], - [ "naga", "0.4.0" ], - [ "raw-window-handle", "0.3.4" ], - [ "thiserror", "1.0.30" ] - ] - }, - "gilrs": { - "0.8.2": [ - [ "fnv", "1.0.7" ], - [ "gilrs-core", "0.3.2" ], - [ "log", "0.4.16" ], - [ "serde", "1.0.136" ], - [ "uuid", "0.8.2" ], - [ "vec_map", "0.8.2" ] - ] - }, - "gilrs-core": { - "0.3.2": [ - [ "core-foundation", "0.6.4" ], - [ "io-kit-sys", "0.1.0" ], - [ "libc", "0.2.121" ], - [ "libudev-sys", "0.1.4" ], - [ "log", "0.4.16" ], - [ "nix", "0.23.1" ], - [ "rusty-xinput", "1.2.0" ], - [ "serde", "1.0.136" ], - [ "stdweb", "0.4.20" ], - [ "uuid", "0.8.2" ], - [ "vec_map", "0.8.2" ], - [ "winapi", "0.3.9" ] - ] - }, - "gimli": { - "0.25.0": [ - [ "fallible-iterator", "0.2.0" ], - [ "indexmap", "1.8.1" ], - [ "stable_deref_trait", "1.2.0" ] - ] - }, - "glam": { - "0.10.2": [ - [ "version_check", "0.9.4" ] - ] - }, - "glow": { - "0.9.0": [ - [ "js-sys", "0.3.56" ], - [ "slotmap", "0.4.3" ], - [ "wasm-bindgen", "0.2.79" ], - [ "web-sys", "0.3.50" ] - ] - }, - "glyph_brush": { - "0.7.3": [ - [ "glyph_brush_draw_cache", "0.1.5" ], - [ "glyph_brush_layout", "0.2.3" ], - [ "log", "0.4.16" ], - [ "ordered-float", "2.10.0" ], - [ "rustc-hash", "1.1.0" ], - [ "twox-hash", "1.6.2" ] - ] - }, - "glyph_brush_draw_cache": { - "0.1.5": [ - [ "ab_glyph", "0.2.15" ], - [ "crossbeam-channel", "0.5.4" ], - [ "crossbeam-deque", "0.8.1" ], - [ "linked-hash-map", "0.5.4" ], - [ "rayon", "1.5.1" ], - [ "rustc-hash", "1.1.0" ] - ] - }, - "glyph_brush_layout": { - "0.2.3": [ - [ "ab_glyph", "0.2.15" ], - [ "approx", "0.5.1" ], - [ "xi-unicode", "0.3.0" ] - ] - }, - "gpu-alloc": { - "0.4.7": [ - [ "bitflags", "1.3.2" ], - [ "gpu-alloc-types", "0.2.0" ] - ] - }, - "gpu-alloc-types": { - "0.2.0": [ - [ "bitflags", "1.3.2" ] - ] - }, - "gpu-descriptor": { - "0.1.1": [ - [ "bitflags", "1.3.2" ], - [ "gpu-descriptor-types", "0.1.1" ], - [ "hashbrown", "0.9.1" ] - ] - }, - "gpu-descriptor-types": { - "0.1.1": [ - [ "bitflags", "1.3.2" ] - ] - }, - "guillotiere": { - "0.6.2": [ - [ "euclid", "0.22.7" ], - [ "svg_fmt", "0.4.1" ] - ] - }, - "h2": { - "0.3.13": [ - [ "bytes", "1.1.0" ], - [ "fnv", "1.0.7" ], - [ "futures-core", "0.3.21" ], - [ "futures-sink", "0.3.21" ], - [ "futures-util", "0.3.21" ], - [ "http", "0.2.6" ], - [ "indexmap", "1.8.1" ], - [ "slab", "0.4.6" ], - [ "tokio", "1.17.0" ], - [ "tokio-util", "0.7.1" ], - [ "tracing", "0.1.32" ] - ] - }, - "hash32": { - "0.1.1": [ - [ "byteorder", "1.4.3" ] - ] - }, - "hashbrown": { - "0.11.2": [ - [ "ahash", "0.7.6" ] - ], - "0.12.0": [ - [ "ahash", "0.7.6" ], - [ "rayon", "1.5.1" ], - [ "serde", "1.0.136" ] - ], - "0.9.1": [ - [ "ahash", "0.4.7" ] - ] - }, - "hashlink": { - "0.6.0": [ - [ "hashbrown", "0.9.1" ] - ] - }, - "heapless": { - "0.5.6": [ - [ "as-slice", "0.1.5" ], - [ "generic-array", "0.13.3" ], - [ "hash32", "0.1.1" ], - [ "stable_deref_trait", "1.2.0" ] - ], - "0.6.1": [ - [ "as-slice", "0.1.5" ], - [ "generic-array", "0.14.5" ], - [ "hash32", "0.1.1" ], - [ "stable_deref_trait", "1.2.0" ] - ] - }, - "heck": { - "0.3.3": [ - [ "unicode-segmentation", "1.9.0" ] - ] - }, - "hermit-abi": { - "0.1.19": [ - [ "libc", "0.2.121" ] - ] - }, - "hibitset": { - "0.6.3": [ - [ "atom", "0.3.6" ], - [ "rayon", "1.5.1" ] - ] - }, - "http": { - "0.2.6": [ - [ "bytes", "1.1.0" ], - [ "fnv", "1.0.7" ], - [ "itoa", "1.0.1" ] - ] - }, - "http-body": { - "0.4.4": [ - [ "bytes", "1.1.0" ], - [ "http", "0.2.6" ], - [ "pin-project-lite", "0.2.8" ] - ] - }, - "hyper": { - "0.14.18": [ - [ "bytes", "1.1.0" ], - [ "futures-channel", "0.3.21" ], - [ "futures-core", "0.3.21" ], - [ "futures-util", "0.3.21" ], - [ "h2", "0.3.13" ], - [ "http", "0.2.6" ], - [ "http-body", "0.4.4" ], - [ "httparse", "1.6.0" ], - [ "httpdate", "1.0.2" ], - [ "itoa", "1.0.1" ], - [ "pin-project-lite", "0.2.8" ], - [ "socket2", "0.4.4" ], - [ "tokio", "1.17.0" ], - [ "tower-service", "0.3.1" ], - [ "tracing", "0.1.32" ], - [ "want", "0.3.0" ] - ] - }, - "hyper-rustls": { - "0.22.1": [ - [ "ct-logs", "0.8.0" ], - [ "futures-util", "0.3.21" ], - [ "hyper", "0.14.18" ], - [ "log", "0.4.16" ], - [ "rustls", "0.19.1" ], - [ "rustls-native-certs", "0.5.0" ], - [ "tokio", "1.17.0" ], - [ "tokio-rustls", "0.22.0" ], - [ "webpki", "0.21.4" ] - ] - }, - "iced_futures": { - "0.3.0": [ - [ "futures", "0.3.21" ], - [ "log", "0.4.16" ], - [ "wasm-bindgen-futures", "0.4.29" ] - ] - }, - "iced_graphics": { - "0.2.0": [ - [ "bytemuck", "1.9.1" ], - [ "glam", "0.10.2" ], - [ "iced_native", "0.4.0" ], - [ "iced_style", "0.3.0" ], - [ "raw-window-handle", "0.3.4" ], - [ "thiserror", "1.0.30" ] - ] - }, - "iced_native": { - "0.4.0": [ - [ "iced_core", "0.4.0" ], - [ "iced_futures", "0.3.0" ], - [ "num-traits", "0.2.14" ], - [ "twox-hash", "1.6.2" ], - [ "unicode-segmentation", "1.9.0" ] - ] - }, - "iced_style": { - "0.3.0": [ - [ "iced_core", "0.4.0" ] - ] - }, - "iced_winit": { - "0.3.0": [ - [ "iced_futures", "0.3.0" ], - [ "iced_graphics", "0.2.0" ], - [ "iced_native", "0.4.0" ], - [ "log", "0.4.16" ], - [ "thiserror", "1.0.30" ], - [ "winapi", "0.3.9" ], - [ "window_clipboard", "0.2.2" ], - [ "winit", "0.25.0" ] - ] - }, - "idna": { - "0.2.3": [ - [ "matches", "0.1.9" ], - [ "unicode-bidi", "0.3.7" ], - [ "unicode-normalization", "0.1.19" ] - ] - }, - "image": { - "0.24.2": [ - [ "bytemuck", "1.9.1" ], - [ "byteorder", "1.4.3" ], - [ "color_quant", "1.1.0" ], - [ "jpeg-decoder", "0.2.6" ], - [ "num-iter", "0.1.42" ], - [ "num-rational", "0.4.0" ], - [ "num-traits", "0.2.14" ], - [ "png", "0.17.5" ] - ] - }, - "indexmap": { - "1.8.1": [ - [ "autocfg", "1.1.0" ], - [ "hashbrown", "0.11.2" ], - [ "rayon", "1.5.1" ], - [ "serde", "1.0.136" ] - ] - }, - "inline_tweak": { - "1.0.8": [ - [ "lazy_static", "1.4.0" ] - ] - }, - "inotify": { - "0.9.6": [ - [ "bitflags", "1.3.2" ], - [ "inotify-sys", "0.1.5" ], - [ "libc", "0.2.121" ] - ] - }, - "inotify-sys": { - "0.1.5": [ - [ "libc", "0.2.121" ] - ] - }, - "instant": { - "0.1.12": [ - [ "cfg-if", "1.0.0" ] - ] - }, - "intl-memoizer": { - "0.5.1": [ - [ "type-map", "0.5.0" ], - [ "unic-langid", "0.9.0" ] - ] - }, - "intl_pluralrules": { - "7.0.1": [ - [ "tinystr", "0.3.4" ], - [ "unic-langid", "0.9.0" ] - ] - }, - "io-kit-sys": { - "0.1.0": [ - [ "core-foundation-sys", "0.6.2" ], - [ "mach", "0.2.3" ] - ] - }, - "itertools": { - "0.10.3": [ - [ "either", "1.6.1" ] - ] - }, - "jni": { - "0.19.0": [ - [ "cesu8", "1.1.0" ], - [ "combine", "4.6.3" ], - [ "jni-sys", "0.3.0" ], - [ "log", "0.4.16" ], - [ "thiserror", "1.0.30" ], - [ "walkdir", "2.3.2" ] - ] - }, - "jobserver": { - "0.1.24": [ - [ "libc", "0.2.121" ] - ] - }, - "js-sys": { - "0.3.56": [ - [ "wasm-bindgen", "0.2.79" ] - ] - }, - "kernel32-sys": { - "0.2.2": [ - [ "winapi", "0.2.8" ], - [ "winapi-build", "0.1.1" ] - ] - }, - "keyboard-keynames": { - "0.1.0": [ - [ "libc", "0.2.121" ], - [ "memmap", "0.7.0" ], - [ "wayland-client", "0.28.6" ], - [ "winapi", "0.3.9" ], - [ "winit", "0.25.0" ], - [ "xcb", "0.9.0" ], - [ "xkbcommon-sys", "0.7.6" ] - ] - }, - "khronos-egl": { - "4.1.0": [ - [ "libc", "0.2.121" ], - [ "libloading", "0.7.3" ] - ] - }, - "kiddo": { - "0.1.7": [ - [ "num-traits", "0.2.14" ] - ], - "0.2.4": [ - [ "num-traits", "0.2.14" ] - ] - }, - "kqueue": { - "1.0.4": [ - [ "kqueue-sys", "1.0.3" ], - [ "libc", "0.2.121" ] - ] - }, - "kqueue-sys": { - "1.0.3": [ - [ "bitflags", "1.3.2" ], - [ "libc", "0.2.121" ] - ] - }, - "lewton": { - "0.10.2": [ - [ "byteorder", "1.4.3" ], - [ "ogg", "0.8.0" ], - [ "tinyvec", "1.5.1" ] - ] - }, - "libloading": { - "0.6.7": [ - [ "cfg-if", "1.0.0" ], - [ "winapi", "0.3.9" ] - ], - "0.7.3": [ - [ "cfg-if", "1.0.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "libmimalloc-sys": { - "0.1.25": [ - [ "cc", "1.0.73" ] - ] - }, - "libsqlite3-sys": { - "0.20.1": [ - [ "cc", "1.0.73" ], - [ "pkg-config", "0.3.25" ], - [ "vcpkg", "0.2.15" ] - ] - }, - "libudev-sys": { - "0.1.4": [ - [ "libc", "0.2.121" ], - [ "pkg-config", "0.3.25" ] - ] - }, - "lock_api": { - "0.3.4": [ - [ "scopeguard", "1.1.0" ] - ], - "0.4.7": [ - [ "autocfg", "1.1.0" ], - [ "scopeguard", "1.1.0" ] - ] - }, - "log": { - "0.4.16": [ - [ "cfg-if", "1.0.0" ] - ] - }, - "loom": { - "0.5.4": [ - [ "cfg-if", "1.0.0" ], - [ "generator", "0.7.0" ], - [ "scoped-tls", "1.0.0" ], - [ "tracing", "0.1.32" ], - [ "tracing-subscriber", "0.3.10" ] - ] - }, - "loupe": { - "0.1.3": [ - [ "indexmap", "1.8.1" ], - [ "loupe-derive", "0.1.3" ], - [ "rustversion", "1.0.6" ] - ] - }, - "loupe-derive": { - "0.1.3": [ - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "lz-fear": { - "0.1.1": [ - [ "bitflags", "1.3.2" ], - [ "byteorder", "1.4.3" ], - [ "fehler", "1.0.0" ], - [ "thiserror", "1.0.30" ], - [ "twox-hash", "1.6.2" ] - ] - }, - "mach": { - "0.2.3": [ - [ "libc", "0.2.121" ] - ], - "0.3.2": [ - [ "libc", "0.2.121" ] - ] - }, - "malloc_buf": { - "0.0.6": [ - [ "libc", "0.2.121" ] - ] - }, - "matchers": { - "0.1.0": [ - [ "regex-automata", "0.1.10" ] - ] - }, - "memmap": { - "0.7.0": [ - [ "libc", "0.2.121" ], - [ "winapi", "0.3.9" ] - ] - }, - "memmap2": { - "0.1.0": [ - [ "libc", "0.2.121" ] - ], - "0.3.1": [ - [ "libc", "0.2.121" ] - ], - "0.5.3": [ - [ "libc", "0.2.121" ] - ] - }, - "memoffset": { - "0.5.6": [ - [ "autocfg", "1.1.0" ] - ], - "0.6.5": [ - [ "autocfg", "1.1.0" ] - ] - }, - "metal": { - "0.22.0": [ - [ "bitflags", "1.3.2" ], - [ "block", "0.1.6" ], - [ "cocoa-foundation", "0.1.0" ], - [ "foreign-types", "0.3.2" ], - [ "log", "0.4.16" ], - [ "objc", "0.2.7" ] - ] - }, - "mimalloc": { - "0.1.29": [ - [ "libmimalloc-sys", "0.1.25" ] - ] - }, - "minifb": { - "0.22.0": [ - [ "cc", "1.0.73" ], - [ "libc", "0.2.121" ], - [ "orbclient", "0.3.32" ], - [ "raw-window-handle", "0.4.3" ], - [ "tempfile", "3.3.0" ], - [ "wayland-client", "0.29.4" ], - [ "wayland-cursor", "0.29.4" ], - [ "wayland-protocols", "0.29.4" ], - [ "winapi", "0.3.9" ], - [ "x11-dl", "2.19.1" ], - [ "xkb", "0.2.1" ], - [ "xkbcommon-sys", "0.7.5" ] - ] - }, - "miniz_oxide": { - "0.5.1": [ - [ "adler", "1.0.2" ] - ] - }, - "mio": { - "0.7.14": [ - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "miow", "0.3.7" ], - [ "ntapi", "0.3.7" ], - [ "winapi", "0.3.9" ] - ], - "0.8.2": [ - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "miow", "0.3.7" ], - [ "ntapi", "0.3.7" ], - [ "wasi", "0.11.0+wasi-snapshot-preview1" ], - [ "winapi", "0.3.9" ] - ] - }, - "mio-misc": { - "1.2.2": [ - [ "crossbeam", "0.8.1" ], - [ "crossbeam-queue", "0.3.5" ], - [ "log", "0.4.16" ], - [ "mio", "0.7.14" ] - ] - }, - "miow": { - "0.3.7": [ - [ "winapi", "0.3.9" ] - ] - }, - "mumble-link": { - "0.1.0": [ - [ "kernel32-sys", "0.2.2" ], - [ "libc", "0.2.121" ], - [ "winapi", "0.2.8" ] - ] - }, - "naga": { - "0.4.0": [ - [ "bit-set", "0.5.2" ], - [ "bitflags", "1.3.2" ], - [ "codespan-reporting", "0.11.1" ], - [ "fxhash", "0.2.1" ], - [ "log", "0.4.16" ], - [ "num-traits", "0.2.14" ], - [ "petgraph", "0.5.1" ], - [ "rose_tree", "0.2.0" ], - [ "spirv_headers", "1.5.0" ], - [ "thiserror", "1.0.30" ] - ] - }, - "native-dialog": { - "0.6.3": [ - [ "block", "0.1.6" ], - [ "cocoa", "0.24.0" ], - [ "dirs-next", "2.0.0" ], - [ "objc", "0.2.7" ], - [ "objc-foundation", "0.1.1" ], - [ "objc_id", "0.1.1" ], - [ "once_cell", "1.10.0" ], - [ "raw-window-handle", "0.4.3" ], - [ "thiserror", "1.0.30" ], - [ "wfd", "0.1.7" ], - [ "which", "4.2.5" ], - [ "winapi", "0.3.9" ] - ] - }, - "ndk": { - "0.3.0": [ - [ "jni-sys", "0.3.0" ], - [ "ndk-sys", "0.2.2" ], - [ "num_enum", "0.5.7" ], - [ "thiserror", "1.0.30" ] - ], - "0.6.0": [ - [ "bitflags", "1.3.2" ], - [ "jni-sys", "0.3.0" ], - [ "ndk-sys", "0.3.0" ], - [ "num_enum", "0.5.7" ], - [ "thiserror", "1.0.30" ] - ] - }, - "ndk-glue": { - "0.3.0": [ - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "ndk", "0.3.0" ], - [ "ndk-macro", "0.2.0" ], - [ "ndk-sys", "0.2.2" ] - ], - "0.6.1": [ - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "ndk", "0.6.0" ], - [ "ndk-context", "0.1.0" ], - [ "ndk-macro", "0.3.0" ], - [ "ndk-sys", "0.3.0" ] - ] - }, - "ndk-macro": { - "0.2.0": [ - [ "darling", "0.10.2" ], - [ "proc-macro-crate", "0.1.5" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ], - "0.3.0": [ - [ "darling", "0.13.2" ], - [ "proc-macro-crate", "1.1.3" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "ndk-sys": { - "0.3.0": [ - [ "jni-sys", "0.3.0" ] - ] - }, - "nibble_vec": { - "0.1.0": [ - [ "smallvec", "1.8.0" ] - ] - }, - "nix": { - "0.18.0": [ - [ "bitflags", "1.3.2" ], - [ "cc", "1.0.73" ], - [ "cfg-if", "0.1.10" ], - [ "libc", "0.2.121" ] - ], - "0.20.0": [ - [ "bitflags", "1.3.2" ], - [ "cc", "1.0.73" ], - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ] - ], - "0.22.3": [ - [ "bitflags", "1.3.2" ], - [ "cc", "1.0.73" ], - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "memoffset", "0.6.5" ] - ], - "0.23.1": [ - [ "bitflags", "1.3.2" ], - [ "cc", "1.0.73" ], - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "memoffset", "0.6.5" ] - ] - }, - "noise": { - "0.7.0": [ - [ "rand", "0.7.3" ], - [ "rand_xorshift", "0.2.0" ] - ] - }, - "nom": { - "4.2.3": [ - [ "memchr", "2.4.1" ], - [ "version_check", "0.1.5" ] - ], - "5.1.2": [ - [ "memchr", "2.4.1" ], - [ "version_check", "0.9.4" ] - ], - "7.1.1": [ - [ "memchr", "2.4.1" ], - [ "minimal-lexical", "0.2.1" ] - ] - }, - "notify": { - "5.0.0-pre.15": [ - [ "bitflags", "1.3.2" ], - [ "crossbeam-channel", "0.5.4" ], - [ "filetime", "0.2.15" ], - [ "fsevent-sys", "4.1.0" ], - [ "inotify", "0.9.6" ], - [ "kqueue", "1.0.4" ], - [ "libc", "0.2.121" ], - [ "mio", "0.8.2" ], - [ "walkdir", "2.3.2" ], - [ "winapi", "0.3.9" ] - ] - }, - "ntapi": { - "0.3.7": [ - [ "winapi", "0.3.9" ] - ] - }, - "num": { - "0.2.1": [ - [ "num-bigint", "0.2.6" ], - [ "num-complex", "0.2.4" ], - [ "num-integer", "0.1.44" ], - [ "num-iter", "0.1.42" ], - [ "num-rational", "0.2.4" ], - [ "num-traits", "0.2.14" ] - ], - "0.4.0": [ - [ "num-bigint", "0.4.3" ], - [ "num-complex", "0.4.0" ], - [ "num-integer", "0.1.44" ], - [ "num-iter", "0.1.42" ], - [ "num-rational", "0.4.0" ], - [ "num-traits", "0.2.14" ] - ] - }, - "num-bigint": { - "0.2.6": [ - [ "autocfg", "1.1.0" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ] - ], - "0.4.3": [ - [ "autocfg", "1.1.0" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ] - ] - }, - "num-complex": { - "0.2.4": [ - [ "autocfg", "1.1.0" ], - [ "num-traits", "0.2.14" ] - ], - "0.4.0": [ - [ "num-traits", "0.2.14" ] - ] - }, - "num-derive": { - "0.3.3": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "num-integer": { - "0.1.44": [ - [ "autocfg", "1.1.0" ], - [ "num-traits", "0.2.14" ] - ] - }, - "num-iter": { - "0.1.42": [ - [ "autocfg", "1.1.0" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ] - ] - }, - "num-rational": { - "0.2.4": [ - [ "autocfg", "1.1.0" ], - [ "num-bigint", "0.2.6" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ] - ], - "0.4.0": [ - [ "autocfg", "1.1.0" ], - [ "num-bigint", "0.4.3" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ] - ] - }, - "num-traits": { - "0.2.14": [ - [ "autocfg", "1.1.0" ], - [ "libm", "0.2.2" ] - ] - }, - "num_cpus": { - "1.13.1": [ - [ "hermit-abi", "0.1.19" ], - [ "libc", "0.2.121" ] - ] - }, - "num_enum": { - "0.5.7": [ - [ "num_enum_derive", "0.5.7" ] - ] - }, - "num_enum_derive": { - "0.5.7": [ - [ "proc-macro-crate", "1.1.3" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "num_threads": { - "0.1.5": [ - [ "libc", "0.2.121" ] - ] - }, - "objc": { - "0.2.7": [ - [ "malloc_buf", "0.0.6" ], - [ "objc_exception", "0.1.2" ] - ] - }, - "objc-foundation": { - "0.1.1": [ - [ "block", "0.1.6" ], - [ "objc", "0.2.7" ], - [ "objc_id", "0.1.1" ] - ] - }, - "objc_exception": { - "0.1.2": [ - [ "cc", "1.0.73" ] - ] - }, - "objc_id": { - "0.1.1": [ - [ "objc", "0.2.7" ] - ] - }, - "object": { - "0.28.3": [ - [ "crc32fast", "1.3.2" ], - [ "hashbrown", "0.11.2" ], - [ "indexmap", "1.8.1" ], - [ "memchr", "2.4.1" ] - ] - }, - "oboe": { - "0.4.5": [ - [ "jni", "0.19.0" ], - [ "ndk", "0.6.0" ], - [ "ndk-glue", "0.6.1" ], - [ "num-derive", "0.3.3" ], - [ "num-traits", "0.2.14" ], - [ "oboe-sys", "0.4.5" ] - ] - }, - "oboe-sys": { - "0.4.5": [ - [ "cc", "1.0.73" ] - ] - }, - "ogg": { - "0.8.0": [ - [ "byteorder", "1.4.3" ] - ] - }, - "orbclient": { - "0.3.32": [ - [ "libc", "0.2.121" ], - [ "raw-window-handle", "0.3.4" ], - [ "redox_syscall", "0.2.13" ], - [ "sdl2", "0.35.2" ], - [ "sdl2-sys", "0.35.2" ], - [ "wasm-bindgen", "0.2.79" ], - [ "web-sys", "0.3.50" ] - ] - }, - "ordered-float": { - "1.1.1": [ - [ "num-traits", "0.2.14" ] - ], - "2.10.0": [ - [ "num-traits", "0.2.14" ] - ], - "3.0.0": [ - [ "num-traits", "0.2.14" ] - ] - }, - "owned_ttf_parser": { - "0.15.0": [ - [ "ttf-parser", "0.15.0" ] - ], - "0.6.0": [ - [ "ttf-parser", "0.6.2" ] - ] - }, - "packed_simd_2": { - "0.3.7": [ - [ "cfg-if", "1.0.0" ], - [ "libm", "0.1.4" ] - ] - }, - "parking_lot": { - "0.10.2": [ - [ "lock_api", "0.3.4" ], - [ "parking_lot_core", "0.7.2" ] - ], - "0.11.2": [ - [ "instant", "0.1.12" ], - [ "lock_api", "0.4.7" ], - [ "parking_lot_core", "0.8.5" ] - ], - "0.12.0": [ - [ "lock_api", "0.4.7" ], - [ "parking_lot_core", "0.9.2" ] - ] - }, - "parking_lot_core": { - "0.7.2": [ - [ "cfg-if", "0.1.10" ], - [ "cloudabi", "0.0.3" ], - [ "libc", "0.2.121" ], - [ "redox_syscall", "0.1.57" ], - [ "smallvec", "1.8.0" ], - [ "winapi", "0.3.9" ] - ], - "0.8.5": [ - [ "cfg-if", "1.0.0" ], - [ "instant", "0.1.12" ], - [ "libc", "0.2.121" ], - [ "redox_syscall", "0.2.13" ], - [ "smallvec", "1.8.0" ], - [ "winapi", "0.3.9" ] - ], - "0.9.2": [ - [ "cfg-if", "1.0.0" ], - [ "libc", "0.2.121" ], - [ "redox_syscall", "0.2.13" ], - [ "smallvec", "1.8.0" ], - [ "windows-sys", "0.34.0" ] - ] - }, - "parse-zoneinfo": { - "0.3.0": [ - [ "regex", "1.5.5" ] - ] - }, - "pem": { - "1.0.2": [ - [ "base64", "0.13.0" ] - ] - }, - "petgraph": { - "0.4.13": [ - [ "fixedbitset", "0.1.9" ] - ], - "0.5.1": [ - [ "fixedbitset", "0.2.0" ], - [ "indexmap", "1.8.1" ] - ], - "0.6.0": [ - [ "fixedbitset", "0.4.1" ], - [ "indexmap", "1.8.1" ] - ] - }, - "phf": { - "0.10.1": [ - [ "phf_shared", "0.10.0" ] - ] - }, - "phf_codegen": { - "0.10.0": [ - [ "phf_generator", "0.10.0" ], - [ "phf_shared", "0.10.0" ] - ] - }, - "phf_generator": { - "0.10.0": [ - [ "phf_shared", "0.10.0" ], - [ "rand", "0.8.5" ] - ] - }, - "phf_shared": { - "0.10.0": [ - [ "siphasher", "0.3.10" ], - [ "uncased", "0.9.6" ] - ] - }, - "piston-viewport": { - "0.5.0": [ - [ "piston-float", "0.3.0" ] - ] - }, - "pistoncore-input": { - "0.24.0": [ - [ "bitflags", "1.3.2" ], - [ "piston-viewport", "0.5.0" ], - [ "serde", "1.0.136" ], - [ "serde_derive", "1.0.136" ] - ] - }, - "plotters": { - "0.3.0": [ - [ "num-traits", "0.2.14" ], - [ "plotters-backend", "0.3.2" ], - [ "plotters-svg", "0.3.1" ], - [ "wasm-bindgen", "0.2.79" ], - [ "web-sys", "0.3.50" ] - ] - }, - "plotters-svg": { - "0.3.1": [ - [ "plotters-backend", "0.3.2" ] - ] - }, - "png": { - "0.17.5": [ - [ "bitflags", "1.3.2" ], - [ "crc32fast", "1.3.2" ], - [ "deflate", "1.0.0" ], - [ "miniz_oxide", "0.5.1" ] - ] - }, - "portpicker": { - "0.1.0": [ - [ "rand", "0.8.5" ] - ] - }, - "proc-macro-crate": { - "0.1.5": [ - [ "toml", "0.5.8" ] - ], - "1.1.3": [ - [ "thiserror", "1.0.30" ], - [ "toml", "0.5.8" ] - ] - }, - "proc-macro-error": { - "1.0.4": [ - [ "proc-macro-error-attr", "1.0.4" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ], - [ "version_check", "0.9.4" ] - ] - }, - "proc-macro-error-attr": { - "1.0.4": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "version_check", "0.9.4" ] - ] - }, - "proc-macro2": { - "0.4.30": [ - [ "unicode-xid", "0.1.0" ] - ], - "1.0.40": [ - [ "unicode-ident", "1.0.1" ] - ] - }, - "profiling": { - "1.0.6": [ - [ "profiling-procmacros", "1.0.6" ], - [ "tracy-client", "0.13.2" ] - ] - }, - "profiling-procmacros": { - "1.0.6": [ - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "prometheus": { - "0.13.0": [ - [ "cfg-if", "1.0.0" ], - [ "fnv", "1.0.7" ], - [ "lazy_static", "1.4.0" ], - [ "memchr", "2.4.1" ], - [ "parking_lot", "0.11.2" ], - [ "thiserror", "1.0.30" ] - ] - }, - "prometheus-hyper": { - "0.1.4": [ - [ "hyper", "0.14.18" ], - [ "prometheus", "0.13.0" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ] - ] - }, - "ptr_meta": { - "0.1.4": [ - [ "ptr_meta_derive", "0.1.4" ] - ] - }, - "ptr_meta_derive": { - "0.1.4": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "quick-xml": { - "0.22.0": [ - [ "memchr", "2.4.1" ] - ] - }, - "quinn": { - "0.8.2": [ - [ "bytes", "1.1.0" ], - [ "futures-channel", "0.3.21" ], - [ "futures-util", "0.3.21" ], - [ "fxhash", "0.2.1" ], - [ "quinn-proto", "0.8.2" ], - [ "quinn-udp", "0.1.1" ], - [ "rustls", "0.20.4" ], - [ "thiserror", "1.0.30" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ], - [ "webpki", "0.22.0" ] - ] - }, - "quinn-proto": { - "0.8.2": [ - [ "bytes", "1.1.0" ], - [ "fxhash", "0.2.1" ], - [ "rand", "0.8.5" ], - [ "ring", "0.16.20" ], - [ "rustls", "0.20.4" ], - [ "rustls-native-certs", "0.6.1" ], - [ "rustls-pemfile", "0.2.1" ], - [ "slab", "0.4.6" ], - [ "thiserror", "1.0.30" ], - [ "tinyvec", "1.5.1" ], - [ "tracing", "0.1.32" ], - [ "webpki", "0.22.0" ] - ] - }, - "quinn-udp": { - "0.1.1": [ - [ "futures-util", "0.3.21" ], - [ "libc", "0.2.121" ], - [ "mio", "0.7.14" ], - [ "quinn-proto", "0.8.2" ], - [ "socket2", "0.4.4" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ] - ] - }, - "quote": { - "0.6.13": [ - [ "proc-macro2", "0.4.30" ] - ], - "1.0.20": [ - [ "proc-macro2", "1.0.40" ] - ] - }, - "radix_trie": { - "0.2.1": [ - [ "endian-type", "0.1.2" ], - [ "nibble_vec", "0.1.0" ] - ] - }, - "rand": { - "0.7.3": [ - [ "getrandom", "0.1.16" ], - [ "libc", "0.2.121" ], - [ "rand_chacha", "0.2.2" ], - [ "rand_core", "0.5.1" ], - [ "rand_hc", "0.2.0" ] - ], - "0.8.5": [ - [ "libc", "0.2.121" ], - [ "rand_chacha", "0.3.1" ], - [ "rand_core", "0.6.3" ] - ] - }, - "rand_chacha": { - "0.2.2": [ - [ "ppv-lite86", "0.2.16" ], - [ "rand_core", "0.5.1" ] - ], - "0.3.1": [ - [ "ppv-lite86", "0.2.16" ], - [ "rand_core", "0.6.3" ] - ] - }, - "rand_core": { - "0.5.1": [ - [ "getrandom", "0.1.16" ] - ], - "0.6.3": [ - [ "getrandom", "0.2.6" ] - ] - }, - "rand_distr": { - "0.4.3": [ - [ "num-traits", "0.2.14" ], - [ "rand", "0.8.5" ] - ] - }, - "rand_hc": { - "0.2.0": [ - [ "rand_core", "0.5.1" ] - ] - }, - "rand_xorshift": { - "0.2.0": [ - [ "rand_core", "0.5.1" ] - ] - }, - "raw-window-handle": { - "0.3.4": [ - [ "libc", "0.2.121" ], - [ "raw-window-handle", "0.4.3" ] - ], - "0.4.3": [ - [ "cty", "0.2.2" ] - ] - }, - "rayon": { - "1.5.1": [ - [ "autocfg", "1.1.0" ], - [ "crossbeam-deque", "0.8.1" ], - [ "either", "1.6.1" ], - [ "rayon-core", "1.9.1" ] - ] - }, - "rayon-core": { - "1.9.1": [ - [ "crossbeam-channel", "0.5.4" ], - [ "crossbeam-deque", "0.8.1" ], - [ "crossbeam-utils", "0.8.8" ], - [ "lazy_static", "1.4.0" ], - [ "num_cpus", "1.13.1" ] - ] - }, - "rcgen": { - "0.9.2": [ - [ "pem", "1.0.2" ], - [ "ring", "0.16.20" ], - [ "time", "0.3.9" ], - [ "yasna", "0.5.0" ] - ] - }, - "redox_syscall": { - "0.2.13": [ - [ "bitflags", "1.3.2" ] - ] - }, - "redox_users": { - "0.4.3": [ - [ "getrandom", "0.2.6" ], - [ "redox_syscall", "0.2.13" ], - [ "thiserror", "1.0.30" ] - ] - }, - "refinery": { - "0.5.0": [ - [ "refinery-core", "0.5.0" ], - [ "refinery-macros", "0.5.0" ] - ] - }, - "refinery-core": { - "0.5.0": [ - [ "async-trait", "0.1.53" ], - [ "cfg-if", "1.0.0" ], - [ "chrono", "0.4.19" ], - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "regex", "1.5.5" ], - [ "rusqlite", "0.24.2" ], - [ "serde", "1.0.136" ], - [ "siphasher", "0.3.10" ], - [ "thiserror", "1.0.30" ], - [ "toml", "0.5.8" ], - [ "url", "2.2.2" ], - [ "walkdir", "2.3.2" ] - ] - }, - "refinery-macros": { - "0.5.0": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "refinery-core", "0.5.0" ], - [ "regex", "1.5.5" ], - [ "syn", "1.0.98" ] - ] - }, - "regalloc": { - "0.0.31": [ - [ "log", "0.4.16" ], - [ "rustc-hash", "1.1.0" ], - [ "smallvec", "1.8.0" ] - ] - }, - "regex": { - "1.5.5": [ - [ "aho-corasick", "0.7.18" ], - [ "memchr", "2.4.1" ], - [ "regex-syntax", "0.6.25" ] - ] - }, - "regex-automata": { - "0.1.10": [ - [ "regex-syntax", "0.6.25" ] - ] - }, - "region": { - "3.0.0": [ - [ "bitflags", "1.3.2" ], - [ "libc", "0.2.121" ], - [ "mach", "0.3.2" ], - [ "winapi", "0.3.9" ] - ] - }, - "remove_dir_all": { - "0.5.3": [ - [ "winapi", "0.3.9" ] - ] - }, - "rend": { - "0.3.6": [ - [ "bytecheck", "0.6.7" ] - ] - }, - "ring": { - "0.16.20": [ - [ "cc", "1.0.73" ], - [ "libc", "0.2.121" ], - [ "once_cell", "1.10.0" ], - [ "spin", "0.5.2" ], - [ "untrusted", "0.7.1" ], - [ "web-sys", "0.3.50" ], - [ "winapi", "0.3.9" ] - ] - }, - "rkyv": { - "0.7.37": [ - [ "bytecheck", "0.6.7" ], - [ "hashbrown", "0.12.0" ], - [ "ptr_meta", "0.1.4" ], - [ "rend", "0.3.6" ], - [ "rkyv_derive", "0.7.37" ], - [ "seahash", "4.1.0" ] - ] - }, - "rkyv_derive": { - "0.7.37": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "rodio": { - "0.15.0": [ - [ "cpal", "0.13.5" ], - [ "lewton", "0.10.2" ] - ] - }, - "ron": { - "0.6.6": [ - [ "base64", "0.13.0" ], - [ "bitflags", "1.3.2" ], - [ "serde", "1.0.136" ] - ], - "0.7.0": [ - [ "base64", "0.13.0" ], - [ "bitflags", "1.3.2" ], - [ "serde", "1.0.136" ] - ] - }, - "rose_tree": { - "0.2.0": [ - [ "petgraph", "0.5.1" ] - ] - }, - "roxmltree": { - "0.14.1": [ - [ "xmlparser", "0.13.3" ] - ] - }, - "rstar": { - "0.9.2": [ - [ "heapless", "0.6.1" ], - [ "num-traits", "0.2.14" ], - [ "pdqselect", "0.1.0" ], - [ "smallvec", "1.8.0" ] - ] - }, - "rusqlite": { - "0.24.2": [ - [ "bitflags", "1.3.2" ], - [ "fallible-iterator", "0.2.0" ], - [ "fallible-streaming-iterator", "0.1.9" ], - [ "hashlink", "0.6.0" ], - [ "lazy_static", "1.4.0" ], - [ "libsqlite3-sys", "0.20.1" ], - [ "memchr", "2.4.1" ], - [ "smallvec", "1.8.0" ] - ] - }, - "rust-argon2": { - "0.8.3": [ - [ "base64", "0.13.0" ], - [ "blake2b_simd", "0.5.11" ], - [ "constant_time_eq", "0.1.5" ] - ] - }, - "rustc_version": { - "0.2.3": [ - [ "semver", "0.9.0" ] - ], - "0.4.0": [ - [ "semver", "1.0.7" ] - ] - }, - "rustix": { - "0.34.1": [ - [ "bitflags", "1.3.2" ], - [ "errno", "0.2.8" ], - [ "io-lifetimes", "0.6.1" ], - [ "libc", "0.2.121" ], - [ "linux-raw-sys", "0.0.42" ], - [ "winapi", "0.3.9" ] - ] - }, - "rustls": { - "0.19.1": [ - [ "base64", "0.13.0" ], - [ "log", "0.4.16" ], - [ "ring", "0.16.20" ], - [ "sct", "0.6.1" ], - [ "webpki", "0.21.4" ] - ], - "0.20.4": [ - [ "log", "0.4.16" ], - [ "ring", "0.16.20" ], - [ "sct", "0.7.0" ], - [ "webpki", "0.22.0" ] - ] - }, - "rustls-native-certs": { - "0.5.0": [ - [ "openssl-probe", "0.1.5" ], - [ "rustls", "0.19.1" ], - [ "schannel", "0.1.19" ], - [ "security-framework", "2.6.1" ] - ], - "0.6.1": [ - [ "openssl-probe", "0.1.5" ], - [ "rustls-pemfile", "0.2.1" ], - [ "schannel", "0.1.19" ], - [ "security-framework", "2.6.1" ] - ] - }, - "rustls-pemfile": { - "0.2.1": [ - [ "base64", "0.13.0" ] - ], - "1.0.0": [ - [ "base64", "0.13.0" ] - ] - }, - "rusttype": { - "0.7.9": [ - [ "rusttype", "0.8.3" ] - ], - "0.8.3": [ - [ "approx", "0.3.2" ], - [ "crossbeam-deque", "0.7.4" ], - [ "crossbeam-utils", "0.7.2" ], - [ "linked-hash-map", "0.5.4" ], - [ "num_cpus", "1.13.1" ], - [ "ordered-float", "1.1.1" ], - [ "rustc-hash", "1.1.0" ], - [ "stb_truetype", "0.3.1" ] - ], - "0.9.2": [ - [ "ab_glyph_rasterizer", "0.1.5" ], - [ "owned_ttf_parser", "0.6.0" ] - ] - }, - "rusty-xinput": { - "1.2.0": [ - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "winapi", "0.3.9" ] - ] - }, - "rustyline": { - "9.1.2": [ - [ "bitflags", "1.3.2" ], - [ "cfg-if", "1.0.0" ], - [ "clipboard-win", "4.4.1" ], - [ "dirs-next", "2.0.0" ], - [ "fd-lock", "3.0.5" ], - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "memchr", "2.4.1" ], - [ "nix", "0.23.1" ], - [ "radix_trie", "0.2.1" ], - [ "scopeguard", "1.1.0" ], - [ "smallvec", "1.8.0" ], - [ "unicode-segmentation", "1.9.0" ], - [ "unicode-width", "0.1.9" ], - [ "utf8parse", "0.2.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "same-file": { - "1.0.6": [ - [ "winapi-util", "0.1.5" ] - ] - }, - "schannel": { - "0.1.19": [ - [ "lazy_static", "1.4.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "sct": { - "0.6.1": [ - [ "ring", "0.16.20" ], - [ "untrusted", "0.7.1" ] - ], - "0.7.0": [ - [ "ring", "0.16.20" ], - [ "untrusted", "0.7.1" ] - ] - }, - "sdl2": { - "0.35.2": [ - [ "bitflags", "1.3.2" ], - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "raw-window-handle", "0.4.3" ], - [ "sdl2-sys", "0.35.2" ] - ] - }, - "sdl2-sys": { - "0.35.2": [ - [ "cfg-if", "1.0.0" ], - [ "cmake", "0.1.45" ], - [ "libc", "0.2.121" ], - [ "version-compare", "0.1.0" ] - ] - }, - "security-framework": { - "2.6.1": [ - [ "bitflags", "1.3.2" ], - [ "core-foundation", "0.9.3" ], - [ "core-foundation-sys", "0.8.3" ], - [ "libc", "0.2.121" ], - [ "security-framework-sys", "2.6.1" ] - ] - }, - "security-framework-sys": { - "2.6.1": [ - [ "core-foundation-sys", "0.8.3" ], - [ "libc", "0.2.121" ] - ] - }, - "semver": { - "0.9.0": [ - [ "semver-parser", "0.7.0" ] - ] - }, - "serde": { - "1.0.136": [ - [ "serde_derive", "1.0.136" ] - ] - }, - "serde_bytes": { - "0.11.5": [ - [ "serde", "1.0.136" ] - ] - }, - "serde_cbor": { - "0.11.2": [ - [ "half", "1.8.2" ], - [ "serde", "1.0.136" ] - ] - }, - "serde_derive": { - "1.0.136": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "serde_json": { - "1.0.79": [ - [ "itoa", "1.0.1" ], - [ "ryu", "1.0.9" ], - [ "serde", "1.0.136" ] - ] - }, - "serde_repr": { - "0.1.7": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "sha1": { - "0.6.1": [ - [ "sha1_smol", "1.0.0" ] - ] - }, - "sha2": { - "0.10.2": [ - [ "cfg-if", "1.0.0" ], - [ "cpufeatures", "0.2.2" ], - [ "digest", "0.10.3" ] - ] - }, - "shaderc": { - "0.8.0": [ - [ "libc", "0.2.121" ], - [ "shaderc-sys", "0.8.0" ] - ] - }, - "shaderc-sys": { - "0.8.0": [ - [ "cmake", "0.1.45" ], - [ "libc", "0.2.121" ], - [ "roxmltree", "0.14.1" ] - ] - }, - "sharded-slab": { - "0.1.4": [ - [ "lazy_static", "1.4.0" ] - ] - }, - "shellexpand": { - "2.1.0": [ - [ "dirs-next", "2.0.0" ] - ] - }, - "shred": { - "0.13.0": [ - [ "arrayvec", "0.7.2" ], - [ "hashbrown", "0.12.0" ], - [ "mopa", "0.2.2" ], - [ "rayon", "1.5.1" ], - [ "shred-derive", "0.6.3" ], - [ "smallvec", "1.8.0" ], - [ "tynm", "0.1.6" ] - ] - }, - "shred-derive": { - "0.6.3": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "signal-hook": { - "0.1.17": [ - [ "libc", "0.2.121" ], - [ "mio", "0.7.14" ], - [ "signal-hook-registry", "1.4.0" ] - ], - "0.3.13": [ - [ "libc", "0.2.121" ], - [ "signal-hook-registry", "1.4.0" ] - ] - }, - "signal-hook-mio": { - "0.2.3": [ - [ "libc", "0.2.121" ], - [ "mio", "0.8.2" ], - [ "signal-hook", "0.3.13" ] - ] - }, - "signal-hook-registry": { - "1.4.0": [ - [ "libc", "0.2.121" ] - ] - }, - "slotmap": { - "1.0.6": [ - [ "serde", "1.0.136" ], - [ "version_check", "0.9.4" ] - ] - }, - "smithay-client-toolkit": { - "0.12.3": [ - [ "andrew", "0.3.1" ], - [ "bitflags", "1.3.2" ], - [ "calloop", "0.6.5" ], - [ "dlib", "0.4.2" ], - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "memmap2", "0.1.0" ], - [ "nix", "0.18.0" ], - [ "wayland-client", "0.28.6" ], - [ "wayland-cursor", "0.28.6" ], - [ "wayland-protocols", "0.28.6" ] - ], - "0.15.3": [ - [ "bitflags", "1.3.2" ], - [ "dlib", "0.5.0" ], - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "memmap2", "0.3.1" ], - [ "nix", "0.22.3" ], - [ "pkg-config", "0.3.25" ], - [ "wayland-client", "0.29.4" ], - [ "wayland-cursor", "0.29.4" ], - [ "wayland-protocols", "0.29.4" ] - ] - }, - "smithay-clipboard": { - "0.6.5": [ - [ "smithay-client-toolkit", "0.15.3" ], - [ "wayland-client", "0.29.4" ] - ] - }, - "socket2": { - "0.4.4": [ - [ "libc", "0.2.121" ], - [ "winapi", "0.3.9" ] - ] - }, - "specs": { - "0.18.0": [ - [ "crossbeam-queue", "0.3.5" ], - [ "hashbrown", "0.12.0" ], - [ "hibitset", "0.6.3" ], - [ "log", "0.4.16" ], - [ "rayon", "1.5.1" ], - [ "serde", "1.0.136" ], - [ "shred", "0.13.0" ], - [ "shrev", "1.1.1" ], - [ "specs-derive", "0.4.1" ], - [ "tuple_utils", "0.4.0" ] - ] - }, - "specs-derive": { - "0.4.1": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "spin_sleep": { - "1.1.1": [ - [ "once_cell", "1.10.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "spirv_cross": { - "0.23.1": [ - [ "cc", "1.0.73" ], - [ "js-sys", "0.3.56" ], - [ "wasm-bindgen", "0.2.79" ] - ] - }, - "spirv_headers": { - "1.5.0": [ - [ "bitflags", "1.3.2" ], - [ "num-traits", "0.2.14" ] - ] - }, - "stb_truetype": { - "0.3.1": [ - [ "byteorder", "1.4.3" ] - ] - }, - "stdweb": { - "0.4.20": [ - [ "discard", "1.0.4" ], - [ "rustc_version", "0.2.3" ], - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "stdweb-derive", "0.5.3" ], - [ "stdweb-internal-macros", "0.2.9" ], - [ "stdweb-internal-runtime", "0.1.5" ], - [ "wasm-bindgen", "0.2.79" ] - ] - }, - "stdweb-derive": { - "0.5.3": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "serde", "1.0.136" ], - [ "serde_derive", "1.0.136" ], - [ "syn", "1.0.98" ] - ] - }, - "stdweb-internal-macros": { - "0.2.9": [ - [ "base-x", "0.2.8" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "serde", "1.0.136" ], - [ "serde_derive", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "sha1", "0.6.1" ], - [ "syn", "1.0.98" ] - ] - }, - "storage-map": { - "0.3.0": [ - [ "lock_api", "0.4.7" ] - ] - }, - "structopt": { - "0.3.26": [ - [ "clap", "2.34.0" ], - [ "lazy_static", "1.4.0" ], - [ "structopt-derive", "0.4.18" ] - ] - }, - "structopt-derive": { - "0.4.18": [ - [ "heck", "0.3.3" ], - [ "proc-macro-error", "1.0.4" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "strum": { - "0.24.0": [ - [ "strum_macros", "0.24.0" ] - ] - }, - "strum_macros": { - "0.24.0": [ - [ "heck", "0.4.0" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "rustversion", "1.0.6" ], - [ "syn", "1.0.98" ] - ] - }, - "syn": { - "0.15.44": [ - [ "proc-macro2", "0.4.30" ], - [ "quote", "0.6.13" ], - [ "unicode-xid", "0.1.0" ] - ], - "1.0.98": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "unicode-ident", "1.0.1" ] - ] - }, - "tar": { - "0.4.38": [ - [ "filetime", "0.2.15" ], - [ "libc", "0.2.121" ], - [ "xattr", "0.2.2" ] - ] - }, - "tempfile": { - "3.3.0": [ - [ "cfg-if", "1.0.0" ], - [ "fastrand", "1.7.0" ], - [ "libc", "0.2.121" ], - [ "redox_syscall", "0.2.13" ], - [ "remove_dir_all", "0.5.3" ], - [ "winapi", "0.3.9" ] - ] - }, - "termcolor": { - "1.1.3": [ - [ "winapi-util", "0.1.5" ] - ] - }, - "textwrap": { - "0.11.0": [ - [ "unicode-width", "0.1.9" ] - ] - }, - "thiserror": { - "1.0.30": [ - [ "thiserror-impl", "1.0.30" ] - ] - }, - "thiserror-impl": { - "1.0.30": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "thread_local": { - "1.1.4": [ - [ "once_cell", "1.10.0" ] - ] - }, - "time": { - "0.1.44": [ - [ "libc", "0.2.121" ], - [ "wasi", "0.10.0+wasi-snapshot-preview1" ], - [ "winapi", "0.3.9" ] - ], - "0.3.9": [ - [ "itoa", "1.0.1" ], - [ "libc", "0.2.121" ], - [ "num_threads", "0.1.5" ] - ] - }, - "tiny-keccak": { - "2.0.2": [ - [ "crunchy", "0.2.2" ] - ] - }, - "tinytemplate": { - "1.2.1": [ - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ] - ] - }, - "tinyvec": { - "1.5.1": [ - [ "tinyvec_macros", "0.1.0" ] - ] - }, - "tokio": { - "1.17.0": [ - [ "bytes", "1.1.0" ], - [ "libc", "0.2.121" ], - [ "memchr", "2.4.1" ], - [ "mio", "0.8.2" ], - [ "num_cpus", "1.13.1" ], - [ "once_cell", "1.10.0" ], - [ "pin-project-lite", "0.2.8" ], - [ "signal-hook-registry", "1.4.0" ], - [ "socket2", "0.4.4" ], - [ "tokio-macros", "1.7.0" ], - [ "winapi", "0.3.9" ] - ] - }, - "tokio-macros": { - "1.7.0": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "tokio-rustls": { - "0.22.0": [ - [ "rustls", "0.19.1" ], - [ "tokio", "1.17.0" ], - [ "webpki", "0.21.4" ] - ] - }, - "tokio-stream": { - "0.1.8": [ - [ "futures-core", "0.3.21" ], - [ "pin-project-lite", "0.2.8" ], - [ "tokio", "1.17.0" ] - ] - }, - "tokio-util": { - "0.7.1": [ - [ "bytes", "1.1.0" ], - [ "futures-core", "0.3.21" ], - [ "futures-sink", "0.3.21" ], - [ "pin-project-lite", "0.2.8" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ] - ] - }, - "toml": { - "0.5.8": [ - [ "serde", "1.0.136" ] - ] - }, - "tracing": { - "0.1.32": [ - [ "cfg-if", "1.0.0" ], - [ "log", "0.4.16" ], - [ "pin-project-lite", "0.2.8" ], - [ "tracing-attributes", "0.1.20" ], - [ "tracing-core", "0.1.24" ] - ] - }, - "tracing-appender": { - "0.2.2": [ - [ "crossbeam-channel", "0.5.4" ], - [ "time", "0.3.9" ], - [ "tracing-subscriber", "0.3.10" ] - ] - }, - "tracing-attributes": { - "0.1.20": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "tracing-core": { - "0.1.24": [ - [ "lazy_static", "1.4.0" ], - [ "valuable", "0.1.0" ] - ] - }, - "tracing-log": { - "0.1.2": [ - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "tracing-core", "0.1.24" ] - ] - }, - "tracing-subscriber": { - "0.3.10": [ - [ "ansi_term", "0.12.1" ], - [ "lazy_static", "1.4.0" ], - [ "matchers", "0.1.0" ], - [ "regex", "1.5.5" ], - [ "sharded-slab", "0.1.4" ], - [ "smallvec", "1.8.0" ], - [ "thread_local", "1.1.4" ], - [ "time", "0.3.9" ], - [ "tracing", "0.1.32" ], - [ "tracing-core", "0.1.24" ], - [ "tracing-log", "0.1.2" ] - ] - }, - "tracing-tracy": { - "0.9.0": [ - [ "tracing-core", "0.1.24" ], - [ "tracing-subscriber", "0.3.10" ], - [ "tracy-client", "0.13.2" ] - ] - }, - "tracy-client": { - "0.13.2": [ - [ "loom", "0.5.4" ], - [ "once_cell", "1.10.0" ], - [ "tracy-client-sys", "0.17.0" ] - ] - }, - "tracy-client-sys": { - "0.17.0": [ - [ "cc", "1.0.73" ] - ] - }, - "treeculler": { - "0.2.0": [ - [ "num-traits", "0.2.14" ], - [ "vek", "0.14.1" ] - ] - }, - "tui": { - "0.10.0": [ - [ "bitflags", "1.3.2" ], - [ "cassowary", "0.3.0" ], - [ "crossterm", "0.17.7" ], - [ "unicode-segmentation", "1.9.0" ], - [ "unicode-width", "0.1.9" ] - ] - }, - "twox-hash": { - "1.6.2": [ - [ "cfg-if", "1.0.0" ], - [ "rand", "0.8.5" ], - [ "static_assertions", "1.1.0" ] - ] - }, - "tynm": { - "0.1.6": [ - [ "nom", "5.1.2" ] - ] - }, - "type-map": { - "0.5.0": [ - [ "rustc-hash", "1.1.0" ] - ] - }, - "uncased": { - "0.9.6": [ - [ "version_check", "0.9.4" ] - ] - }, - "unic-langid": { - "0.9.0": [ - [ "unic-langid-impl", "0.9.0" ] - ] - }, - "unic-langid-impl": { - "0.9.0": [ - [ "tinystr", "0.3.4" ] - ] - }, - "unicode-normalization": { - "0.1.19": [ - [ "tinyvec", "1.5.1" ] - ] - }, - "url": { - "2.2.2": [ - [ "form_urlencoded", "1.0.1" ], - [ "idna", "0.2.3" ], - [ "matches", "0.1.9" ], - [ "percent-encoding", "2.1.0" ] - ] - }, - "uuid": { - "0.8.2": [ - [ "getrandom", "0.2.6" ], - [ "serde", "1.0.136" ] - ] - }, - "vek": { - "0.14.1": [ - [ "approx", "0.4.0" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ], - [ "rustc_version", "0.2.3" ], - [ "serde", "1.0.136" ], - [ "static_assertions", "1.1.0" ] - ], - "0.15.8": [ - [ "approx", "0.5.1" ], - [ "num-integer", "0.1.44" ], - [ "num-traits", "0.2.14" ], - [ "rustc_version", "0.4.0" ], - [ "serde", "1.0.136" ], - [ "static_assertions", "1.1.0" ] - ] - }, - "veloren-client": { - "0.13.0": [ - [ "async-channel", "1.6.1" ], - [ "authc", "1.0.0" ], - [ "byteorder", "1.4.3" ], - [ "clap", "3.1.10" ], - [ "hashbrown", "0.12.0" ], - [ "image", "0.24.2" ], - [ "num", "0.4.0" ], - [ "quinn", "0.8.2" ], - [ "rayon", "1.5.1" ], - [ "ron", "0.7.0" ], - [ "rustyline", "9.1.2" ], - [ "serde", "1.0.136" ], - [ "specs", "0.18.0" ], - [ "structopt", "0.3.26" ], - [ "termcolor", "1.1.3" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-ecs", "0.10.0" ], - [ "veloren-common-frontend", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ], - [ "veloren-common-state", "0.10.0" ], - [ "veloren-common-systems", "0.10.0" ], - [ "veloren-network", "0.3.0" ] - ] - }, - "veloren-common": { - "0.10.0": [ - [ "approx", "0.4.0" ], - [ "bitflags", "1.3.2" ], - [ "chrono", "0.4.19" ], - [ "chrono-tz", "0.6.1" ], - [ "clap", "2.34.0" ], - [ "criterion", "0.3.4" ], - [ "crossbeam-channel", "0.5.4" ], - [ "crossbeam-utils", "0.8.8" ], - [ "csv", "1.1.6" ], - [ "dot_vox", "4.1.0" ], - [ "enum-iterator", "0.7.0" ], - [ "fxhash", "0.2.1" ], - [ "hashbrown", "0.12.0" ], - [ "indexmap", "1.8.1" ], - [ "kiddo", "0.1.7" ], - [ "lazy_static", "1.4.0" ], - [ "num-derive", "0.3.3" ], - [ "num-traits", "0.2.14" ], - [ "ordered-float", "2.10.0" ], - [ "petgraph", "0.6.0" ], - [ "rand", "0.8.5" ], - [ "rayon", "1.5.1" ], - [ "ron", "0.7.0" ], - [ "roots", "0.0.6" ], - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "serde_repr", "0.1.7" ], - [ "sha2", "0.10.2" ], - [ "slab", "0.4.6" ], - [ "slotmap", "1.0.6" ], - [ "specs", "0.18.0" ], - [ "spin_sleep", "1.1.1" ], - [ "structopt", "0.3.26" ], - [ "strum", "0.24.0" ], - [ "tracing", "0.1.32" ], - [ "tracing-subscriber", "0.3.10" ], - [ "uuid", "0.8.2" ], - [ "vek", "0.15.8" ], - [ "veloren-common-assets", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ] - ] - }, - "veloren-common-assets": { - "0.10.0": [ - [ "assets_manager", "0.8.1" ], - [ "dot_vox", "4.1.0" ], - [ "image", "0.24.2" ], - [ "lazy_static", "1.4.0" ], - [ "ron", "0.7.0" ], - [ "serde", "1.0.136" ], - [ "tracing", "0.1.32" ], - [ "walkdir", "2.3.2" ], - [ "wavefront", "0.2.2" ] - ] - }, - "veloren-common-base": { - "0.10.0": [ - [ "directories-next", "2.0.0" ], - [ "tracing", "0.1.32" ], - [ "tracy-client", "0.13.2" ] - ] - }, - "veloren-common-ecs": { - "0.10.0": [ - [ "float-cmp", "0.9.0" ], - [ "specs", "0.18.0" ], - [ "tracing", "0.1.32" ], - [ "veloren-common-base", "0.10.0" ] - ] - }, - "veloren-common-frontend": { - "0.10.0": [ - [ "termcolor", "1.1.3" ], - [ "tracing", "0.1.32" ], - [ "tracing-appender", "0.2.2" ], - [ "tracing-log", "0.1.2" ], - [ "tracing-subscriber", "0.3.10" ], - [ "tracing-tracy", "0.9.0" ], - [ "veloren-common-base", "0.10.0" ] - ] - }, - "veloren-common-net": { - "0.10.0": [ - [ "bincode", "1.3.3" ], - [ "flate2", "1.0.24" ], - [ "hashbrown", "0.12.0" ], - [ "image", "0.24.2" ], - [ "num-traits", "0.2.14" ], - [ "serde", "1.0.136" ], - [ "specs", "0.18.0" ], - [ "sum_type", "0.2.0" ], - [ "tracing", "0.1.32" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ] - ] - }, - "veloren-common-state": { - "0.10.0": [ - [ "bincode", "1.3.3" ], - [ "hashbrown", "0.12.0" ], - [ "num_cpus", "1.13.1" ], - [ "rayon", "1.5.1" ], - [ "scopeguard", "1.1.0" ], - [ "serde", "1.0.136" ], - [ "specs", "0.18.0" ], - [ "tar", "0.4.38" ], - [ "toml", "0.5.8" ], - [ "tracing", "0.1.32" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-ecs", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ], - [ "veloren-plugin-api", "0.1.0" ], - [ "wasmer", "2.2.1" ] - ] - }, - "veloren-common-systems": { - "0.10.0": [ - [ "hashbrown", "0.12.0" ], - [ "indexmap", "1.8.1" ], - [ "ordered-float", "3.0.0" ], - [ "rand", "0.8.5" ], - [ "rayon", "1.5.1" ], - [ "slab", "0.4.6" ], - [ "specs", "0.18.0" ], - [ "tracing", "0.1.32" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-ecs", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ], - [ "veloren-common-state", "0.10.0" ] - ] - }, - "veloren-network": { - "0.3.0": [ - [ "async-channel", "1.6.1" ], - [ "async-trait", "0.1.53" ], - [ "bincode", "1.3.3" ], - [ "bitflags", "1.3.2" ], - [ "bytes", "1.1.0" ], - [ "clap", "3.1.10" ], - [ "criterion", "0.3.4" ], - [ "crossbeam-channel", "0.5.4" ], - [ "futures-core", "0.3.21" ], - [ "futures-util", "0.3.21" ], - [ "hashbrown", "0.12.0" ], - [ "lazy_static", "1.4.0" ], - [ "lz-fear", "0.1.1" ], - [ "prometheus", "0.13.0" ], - [ "prometheus-hyper", "0.1.4" ], - [ "quinn", "0.8.2" ], - [ "rand", "0.8.5" ], - [ "rcgen", "0.9.2" ], - [ "rustls", "0.20.4" ], - [ "serde", "1.0.136" ], - [ "shellexpand", "2.1.0" ], - [ "socket2", "0.4.4" ], - [ "tokio", "1.17.0" ], - [ "tokio-stream", "0.1.8" ], - [ "tracing", "0.1.32" ], - [ "tracing-subscriber", "0.3.10" ], - [ "veloren-network-protocol", "0.6.1" ] - ] - }, - "veloren-network-protocol": { - "0.6.1": [ - [ "async-channel", "1.6.1" ], - [ "async-trait", "0.1.53" ], - [ "bitflags", "1.3.2" ], - [ "bytes", "1.1.0" ], - [ "criterion", "0.3.4" ], - [ "hashbrown", "0.12.0" ], - [ "prometheus", "0.13.0" ], - [ "rand", "0.8.5" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ] - ] - }, - "veloren-plugin-api": { - "0.1.0": [ - [ "bincode", "1.3.3" ], - [ "serde", "1.0.136" ], - [ "veloren-common", "0.10.0" ] - ] - }, - "veloren-plugin-derive": { - "0.1.0": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "veloren-plugin-rt": { - "0.1.0": [ - [ "bincode", "1.3.3" ], - [ "serde", "1.0.136" ], - [ "veloren-plugin-api", "0.1.0" ], - [ "veloren-plugin-derive", "0.1.0" ] - ] - }, - "veloren-server": { - "0.13.0": [ - [ "atomicwrites", "0.3.1" ], - [ "authc", "1.0.0" ], - [ "bincode", "1.3.3" ], - [ "censor", "0.2.0" ], - [ "chrono", "0.4.19" ], - [ "chrono-tz", "0.6.1" ], - [ "crossbeam-channel", "0.5.4" ], - [ "enumset", "1.0.9" ], - [ "futures-util", "0.3.21" ], - [ "hashbrown", "0.12.0" ], - [ "humantime", "2.1.0" ], - [ "itertools", "0.10.3" ], - [ "lazy_static", "1.4.0" ], - [ "noise", "0.7.0" ], - [ "num_cpus", "1.13.1" ], - [ "portpicker", "0.1.0" ], - [ "prometheus", "0.13.0" ], - [ "prometheus-hyper", "0.1.4" ], - [ "quinn", "0.8.2" ], - [ "rand", "0.8.5" ], - [ "rand_distr", "0.4.3" ], - [ "rayon", "1.5.1" ], - [ "refinery", "0.5.0" ], - [ "ron", "0.7.0" ], - [ "rusqlite", "0.24.2" ], - [ "rustls", "0.20.4" ], - [ "rustls-pemfile", "1.0.0" ], - [ "serde", "1.0.136" ], - [ "serde_json", "1.0.79" ], - [ "slab", "0.4.6" ], - [ "specs", "0.18.0" ], - [ "strum", "0.24.0" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-ecs", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ], - [ "veloren-common-state", "0.10.0" ], - [ "veloren-common-systems", "0.10.0" ], - [ "veloren-network", "0.3.0" ], - [ "veloren-plugin-api", "0.1.0" ], - [ "veloren-world", "0.10.0" ] - ] - }, - "veloren-server-cli": { - "0.13.0": [ - [ "ansi-parser", "0.8.0" ], - [ "clap", "3.1.10" ], - [ "crossterm", "0.23.2" ], - [ "lazy_static", "1.4.0" ], - [ "mimalloc", "0.1.29" ], - [ "num_cpus", "1.13.1" ], - [ "ron", "0.7.0" ], - [ "serde", "1.0.136" ], - [ "shell-words", "1.1.0" ], - [ "signal-hook", "0.3.13" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ], - [ "tui", "0.10.0" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-frontend", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ], - [ "veloren-server", "0.13.0" ] - ] - }, - "veloren-voxygen": { - "0.13.0": [ - [ "assets_manager", "0.8.1" ], - [ "backtrace", "0.3.65" ], - [ "bincode", "1.3.3" ], - [ "bytemuck", "1.9.1" ], - [ "chrono", "0.4.19" ], - [ "chumsky", "0.8.0" ], - [ "cmake", "0.1.45" ], - [ "conrod_core", "0.63.0" ], - [ "conrod_winit", "0.63.0" ], - [ "copy_dir", "0.1.2" ], - [ "cpal", "0.13.5" ], - [ "criterion", "0.3.4" ], - [ "crossbeam-channel", "0.5.4" ], - [ "crossbeam-utils", "0.8.8" ], - [ "directories-next", "2.0.0" ], - [ "discord-sdk", "0.3.0" ], - [ "dispatch", "0.1.4" ], - [ "dot_vox", "4.1.0" ], - [ "egui", "0.12.0" ], - [ "egui_wgpu_backend", "0.8.0" ], - [ "egui_winit_platform", "0.8.0" ], - [ "enum-iterator", "0.7.0" ], - [ "etagere", "0.2.7" ], - [ "euc", "0.5.3" ], - [ "gilrs", "0.8.2" ], - [ "glyph_brush", "0.7.3" ], - [ "guillotiere", "0.6.2" ], - [ "hashbrown", "0.12.0" ], - [ "iced_native", "0.4.0" ], - [ "iced_winit", "0.3.0" ], - [ "image", "0.24.2" ], - [ "inline_tweak", "1.0.8" ], - [ "itertools", "0.10.3" ], - [ "keyboard-keynames", "0.1.0" ], - [ "lazy_static", "1.4.0" ], - [ "mimalloc", "0.1.29" ], - [ "mumble-link", "0.1.0" ], - [ "native-dialog", "0.6.3" ], - [ "num", "0.4.0" ], - [ "num_cpus", "1.13.1" ], - [ "ordered-float", "3.0.0" ], - [ "profiling", "1.0.6" ], - [ "rand", "0.8.5" ], - [ "rand_chacha", "0.3.1" ], - [ "rayon", "1.5.1" ], - [ "rodio", "0.15.0" ], - [ "ron", "0.7.0" ], - [ "serde", "1.0.136" ], - [ "shaderc", "0.8.0" ], - [ "slab", "0.4.6" ], - [ "specs", "0.18.0" ], - [ "strum", "0.24.0" ], - [ "tokio", "1.17.0" ], - [ "tracing", "0.1.32" ], - [ "treeculler", "0.2.0" ], - [ "vek", "0.15.8" ], - [ "veloren-client", "0.13.0" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-ecs", "0.10.0" ], - [ "veloren-common-frontend", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ], - [ "veloren-common-state", "0.10.0" ], - [ "veloren-common-systems", "0.10.0" ], - [ "veloren-server", "0.13.0" ], - [ "veloren-voxygen-anim", "0.10.0" ], - [ "veloren-voxygen-egui", "0.9.0" ], - [ "veloren-voxygen-i18n", "0.13.0" ], - [ "veloren-world", "0.10.0" ], - [ "wgpu", "0.8.0" ], - [ "wgpu-profiler", "0.4.0" ], - [ "window_clipboard", "0.2.2" ], - [ "winit", "0.25.0" ], - [ "winres", "0.1.12" ] - ] - }, - "veloren-voxygen-anim": { - "0.10.0": [ - [ "bytemuck", "1.9.1" ], - [ "lazy_static", "1.4.0" ], - [ "mimalloc", "0.1.29" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-voxygen-dynlib", "0.1.0" ] - ] - }, - "veloren-voxygen-anim-dyn": { - "0.10.0": [ - [ "veloren-voxygen-anim", "0.10.0" ] - ] - }, - "veloren-voxygen-dynlib": { - "0.1.0": [ - [ "find_folder", "0.3.0" ], - [ "libloading", "0.7.3" ], - [ "notify", "5.0.0-pre.15" ], - [ "tracing", "0.1.32" ] - ] - }, - "veloren-voxygen-egui": { - "0.9.0": [ - [ "egui", "0.12.0" ], - [ "egui_winit_platform", "0.8.0" ], - [ "lazy_static", "1.4.0" ], - [ "veloren-client", "0.13.0" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-voxygen-dynlib", "0.1.0" ] - ] - }, - "veloren-voxygen-egui-dyn": { - "0.9.0": [ - [ "veloren-voxygen-egui", "0.9.0" ] - ] - }, - "veloren-voxygen-i18n": { - "0.13.0": [ - [ "clap", "3.1.10" ], - [ "deunicode", "1.3.1" ], - [ "fluent", "0.16.0" ], - [ "fluent-bundle", "0.15.2" ], - [ "fluent-syntax", "0.11.0" ], - [ "hashbrown", "0.12.0" ], - [ "intl-memoizer", "0.5.1" ], - [ "ron", "0.7.0" ], - [ "serde", "1.0.136" ], - [ "tracing", "0.1.32" ], - [ "unic-langid", "0.9.0" ], - [ "veloren-common-assets", "0.10.0" ] - ] - }, - "veloren-world": { - "0.10.0": [ - [ "arr_macro", "0.1.3" ], - [ "bincode", "1.3.3" ], - [ "bitvec", "0.22.3" ], - [ "clap", "3.1.10" ], - [ "criterion", "0.3.4" ], - [ "csv", "1.1.6" ], - [ "deflate", "1.0.0" ], - [ "enum-iterator", "0.7.0" ], - [ "fallible-iterator", "0.2.0" ], - [ "flate2", "1.0.24" ], - [ "fxhash", "0.2.1" ], - [ "hashbrown", "0.12.0" ], - [ "image", "0.24.2" ], - [ "itertools", "0.10.3" ], - [ "kiddo", "0.2.4" ], - [ "lazy_static", "1.4.0" ], - [ "lz-fear", "0.1.1" ], - [ "minifb", "0.22.0" ], - [ "noise", "0.7.0" ], - [ "num", "0.4.0" ], - [ "num-traits", "0.2.14" ], - [ "ordered-float", "3.0.0" ], - [ "packed_simd_2", "0.3.7" ], - [ "rand", "0.8.5" ], - [ "rand_chacha", "0.3.1" ], - [ "rayon", "1.5.1" ], - [ "ron", "0.7.0" ], - [ "rstar", "0.9.2" ], - [ "rusqlite", "0.24.2" ], - [ "serde", "1.0.136" ], - [ "structopt", "0.3.26" ], - [ "strum", "0.24.0" ], - [ "svg_fmt", "0.4.1" ], - [ "tracing", "0.1.32" ], - [ "tracing-subscriber", "0.3.10" ], - [ "vek", "0.15.8" ], - [ "veloren-common", "0.10.0" ], - [ "veloren-common-base", "0.10.0" ], - [ "veloren-common-frontend", "0.10.0" ], - [ "veloren-common-net", "0.10.0" ] - ] - }, - "walkdir": { - "0.1.8": [ - [ "kernel32-sys", "0.2.2" ], - [ "winapi", "0.2.8" ] - ], - "2.3.2": [ - [ "same-file", "1.0.6" ], - [ "winapi", "0.3.9" ], - [ "winapi-util", "0.1.5" ] - ] - }, - "want": { - "0.3.0": [ - [ "log", "0.4.16" ], - [ "try-lock", "0.2.3" ] - ] - }, - "wasm-bindgen": { - "0.2.79": [ - [ "cfg-if", "1.0.0" ], - [ "wasm-bindgen-macro", "0.2.79" ] - ] - }, - "wasm-bindgen-backend": { - "0.2.79": [ - [ "bumpalo", "3.9.1" ], - [ "lazy_static", "1.4.0" ], - [ "log", "0.4.16" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ], - [ "wasm-bindgen-shared", "0.2.79" ] - ] - }, - "wasm-bindgen-futures": { - "0.4.29": [ - [ "cfg-if", "1.0.0" ], - [ "js-sys", "0.3.56" ], - [ "wasm-bindgen", "0.2.79" ], - [ "web-sys", "0.3.50" ] - ] - }, - "wasm-bindgen-macro": { - "0.2.79": [ - [ "quote", "1.0.20" ], - [ "wasm-bindgen-macro-support", "0.2.79" ] - ] - }, - "wasm-bindgen-macro-support": { - "0.2.79": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ], - [ "wasm-bindgen-backend", "0.2.79" ], - [ "wasm-bindgen-shared", "0.2.79" ] - ] - }, - "wasmer": { - "2.2.1": [ - [ "cfg-if", "1.0.0" ], - [ "indexmap", "1.8.1" ], - [ "js-sys", "0.3.56" ], - [ "loupe", "0.1.3" ], - [ "more-asserts", "0.2.2" ], - [ "target-lexicon", "0.12.3" ], - [ "thiserror", "1.0.30" ], - [ "wasm-bindgen", "0.2.79" ], - [ "wasmer-compiler", "2.2.1" ], - [ "wasmer-compiler-cranelift", "2.2.1" ], - [ "wasmer-derive", "2.2.1" ], - [ "wasmer-engine", "2.2.1" ], - [ "wasmer-engine-dylib", "2.2.1" ], - [ "wasmer-engine-universal", "2.2.1" ], - [ "wasmer-types", "2.2.1" ], - [ "wasmer-vm", "2.2.1" ], - [ "wat", "1.0.41" ], - [ "winapi", "0.3.9" ] - ] - }, - "wasmer-compiler": { - "2.2.1": [ - [ "enumset", "1.0.9" ], - [ "loupe", "0.1.3" ], - [ "rkyv", "0.7.37" ], - [ "serde", "1.0.136" ], - [ "serde_bytes", "0.11.5" ], - [ "smallvec", "1.8.0" ], - [ "target-lexicon", "0.12.3" ], - [ "thiserror", "1.0.30" ], - [ "wasmer-types", "2.2.1" ], - [ "wasmer-vm", "2.2.1" ], - [ "wasmparser", "0.78.2" ] - ] - }, - "wasmer-compiler-cranelift": { - "2.2.1": [ - [ "cranelift-codegen", "0.76.0" ], - [ "cranelift-entity", "0.76.0" ], - [ "cranelift-frontend", "0.76.0" ], - [ "gimli", "0.25.0" ], - [ "loupe", "0.1.3" ], - [ "more-asserts", "0.2.2" ], - [ "rayon", "1.5.1" ], - [ "smallvec", "1.8.0" ], - [ "target-lexicon", "0.12.3" ], - [ "tracing", "0.1.32" ], - [ "wasmer-compiler", "2.2.1" ], - [ "wasmer-types", "2.2.1" ], - [ "wasmer-vm", "2.2.1" ] - ] - }, - "wasmer-derive": { - "2.2.1": [ - [ "proc-macro-error", "1.0.4" ], - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "syn", "1.0.98" ] - ] - }, - "wasmer-engine": { - "2.2.1": [ - [ "backtrace", "0.3.65" ], - [ "enumset", "1.0.9" ], - [ "lazy_static", "1.4.0" ], - [ "loupe", "0.1.3" ], - [ "memmap2", "0.5.3" ], - [ "more-asserts", "0.2.2" ], - [ "rustc-demangle", "0.1.21" ], - [ "serde", "1.0.136" ], - [ "serde_bytes", "0.11.5" ], - [ "target-lexicon", "0.12.3" ], - [ "thiserror", "1.0.30" ], - [ "wasmer-compiler", "2.2.1" ], - [ "wasmer-types", "2.2.1" ], - [ "wasmer-vm", "2.2.1" ] - ] - }, - "wasmer-engine-dylib": { - "2.2.1": [ - [ "cfg-if", "1.0.0" ], - [ "enum-iterator", "0.7.0" ], - [ "enumset", "1.0.9" ], - [ "leb128", "0.2.5" ], - [ "libloading", "0.7.3" ], - [ "loupe", "0.1.3" ], - [ "object", "0.28.3" ], - [ "rkyv", "0.7.37" ], - [ "serde", "1.0.136" ], - [ "tempfile", "3.3.0" ], - [ "tracing", "0.1.32" ], - [ "wasmer-compiler", "2.2.1" ], - [ "wasmer-engine", "2.2.1" ], - [ "wasmer-object", "2.2.1" ], - [ "wasmer-types", "2.2.1" ], - [ "wasmer-vm", "2.2.1" ], - [ "which", "4.2.5" ] - ] - }, - "wasmer-engine-universal": { - "2.2.1": [ - [ "cfg-if", "1.0.0" ], - [ "enum-iterator", "0.7.0" ], - [ "enumset", "1.0.9" ], - [ "leb128", "0.2.5" ], - [ "loupe", "0.1.3" ], - [ "region", "3.0.0" ], - [ "rkyv", "0.7.37" ], - [ "wasmer-compiler", "2.2.1" ], - [ "wasmer-engine", "2.2.1" ], - [ "wasmer-types", "2.2.1" ], - [ "wasmer-vm", "2.2.1" ], - [ "winapi", "0.3.9" ] - ] - }, - "wasmer-object": { - "2.2.1": [ - [ "object", "0.28.3" ], - [ "thiserror", "1.0.30" ], - [ "wasmer-compiler", "2.2.1" ], - [ "wasmer-types", "2.2.1" ] - ] - }, - "wasmer-types": { - "2.2.1": [ - [ "indexmap", "1.8.1" ], - [ "loupe", "0.1.3" ], - [ "rkyv", "0.7.37" ], - [ "serde", "1.0.136" ], - [ "thiserror", "1.0.30" ] - ] - }, - "wasmer-vm": { - "2.2.1": [ - [ "backtrace", "0.3.65" ], - [ "cc", "1.0.73" ], - [ "cfg-if", "1.0.0" ], - [ "enum-iterator", "0.7.0" ], - [ "indexmap", "1.8.1" ], - [ "libc", "0.2.121" ], - [ "loupe", "0.1.3" ], - [ "memoffset", "0.6.5" ], - [ "more-asserts", "0.2.2" ], - [ "region", "3.0.0" ], - [ "rkyv", "0.7.37" ], - [ "serde", "1.0.136" ], - [ "thiserror", "1.0.30" ], - [ "wasmer-types", "2.2.1" ], - [ "winapi", "0.3.9" ] - ] - }, - "wast": { - "39.0.0": [ - [ "leb128", "0.2.5" ], - [ "memchr", "2.4.1" ], - [ "unicode-width", "0.1.9" ] - ] - }, - "wat": { - "1.0.41": [ - [ "wast", "39.0.0" ] - ] - }, - "wavefront": { - "0.2.2": [ - [ "hashbrown", "0.9.1" ] - ] - }, - "wayland-client": { - "0.28.6": [ - [ "bitflags", "1.3.2" ], - [ "downcast-rs", "1.2.0" ], - [ "libc", "0.2.121" ], - [ "nix", "0.20.0" ], - [ "scoped-tls", "1.0.0" ], - [ "wayland-commons", "0.28.6" ], - [ "wayland-scanner", "0.28.6" ], - [ "wayland-sys", "0.28.6" ] - ], - "0.29.4": [ - [ "bitflags", "1.3.2" ], - [ "downcast-rs", "1.2.0" ], - [ "libc", "0.2.121" ], - [ "nix", "0.22.3" ], - [ "scoped-tls", "1.0.0" ], - [ "wayland-commons", "0.29.4" ], - [ "wayland-scanner", "0.29.4" ], - [ "wayland-sys", "0.29.4" ] - ] - }, - "wayland-commons": { - "0.28.6": [ - [ "nix", "0.20.0" ], - [ "once_cell", "1.10.0" ], - [ "smallvec", "1.8.0" ], - [ "wayland-sys", "0.28.6" ] - ], - "0.29.4": [ - [ "nix", "0.22.3" ], - [ "once_cell", "1.10.0" ], - [ "smallvec", "1.8.0" ], - [ "wayland-sys", "0.29.4" ] - ] - }, - "wayland-cursor": { - "0.28.6": [ - [ "nix", "0.20.0" ], - [ "wayland-client", "0.28.6" ], - [ "xcursor", "0.3.4" ] - ], - "0.29.4": [ - [ "nix", "0.22.3" ], - [ "wayland-client", "0.29.4" ], - [ "xcursor", "0.3.4" ] - ] - }, - "wayland-protocols": { - "0.28.6": [ - [ "bitflags", "1.3.2" ], - [ "wayland-client", "0.28.6" ], - [ "wayland-commons", "0.28.6" ], - [ "wayland-scanner", "0.28.6" ] - ], - "0.29.4": [ - [ "bitflags", "1.3.2" ], - [ "wayland-client", "0.29.4" ], - [ "wayland-commons", "0.29.4" ], - [ "wayland-scanner", "0.29.4" ] - ] - }, - "wayland-scanner": { - "0.28.6": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "xml-rs", "0.8.4" ] - ], - "0.29.4": [ - [ "proc-macro2", "1.0.40" ], - [ "quote", "1.0.20" ], - [ "xml-rs", "0.8.4" ] - ] - }, - "wayland-sys": { - "0.28.6": [ - [ "dlib", "0.5.0" ], - [ "lazy_static", "1.4.0" ], - [ "pkg-config", "0.3.25" ] - ], - "0.29.4": [ - [ "dlib", "0.5.0" ], - [ "lazy_static", "1.4.0" ], - [ "pkg-config", "0.3.25" ] - ] - }, - "web-sys": { - "0.3.50": [ - [ "js-sys", "0.3.56" ], - [ "wasm-bindgen", "0.2.79" ] - ] - }, - "webpki": { - "0.21.4": [ - [ "ring", "0.16.20" ], - [ "untrusted", "0.7.1" ] - ], - "0.22.0": [ - [ "ring", "0.16.20" ], - [ "untrusted", "0.7.1" ] - ] - }, - "wfd": { - "0.1.7": [ - [ "libc", "0.2.121" ], - [ "winapi", "0.3.9" ] - ] - }, - "wgpu": { - "0.8.0": [ - [ "arrayvec", "0.5.2" ], - [ "js-sys", "0.3.56" ], - [ "log", "0.4.16" ], - [ "naga", "0.4.0" ], - [ "parking_lot", "0.11.2" ], - [ "raw-window-handle", "0.3.4" ], - [ "serde", "1.0.136" ], - [ "smallvec", "1.8.0" ], - [ "wasm-bindgen", "0.2.79" ], - [ "wasm-bindgen-futures", "0.4.29" ], - [ "web-sys", "0.3.50" ], - [ "wgpu-core", "0.8.0" ], - [ "wgpu-types", "0.8.0" ] - ] - }, - "wgpu-core": { - "0.8.0": [ - [ "arrayvec", "0.5.2" ], - [ "bitflags", "1.3.2" ], - [ "cfg_aliases", "0.1.1" ], - [ "copyless", "0.1.5" ], - [ "fxhash", "0.2.1" ], - [ "gfx-backend-dx11", "0.8.0" ], - [ "gfx-backend-dx12", "0.8.0" ], - [ "gfx-backend-empty", "0.8.0" ], - [ "gfx-backend-gl", "0.8.1" ], - [ "gfx-backend-metal", "0.8.1" ], - [ "gfx-backend-vulkan", "0.8.0" ], - [ "gfx-hal", "0.8.0" ], - [ "gpu-alloc", "0.4.7" ], - [ "gpu-descriptor", "0.1.1" ], - [ "log", "0.4.16" ], - [ "naga", "0.4.0" ], - [ "parking_lot", "0.11.2" ], - [ "profiling", "1.0.6" ], - [ "raw-window-handle", "0.3.4" ], - [ "ron", "0.6.6" ], - [ "serde", "1.0.136" ], - [ "smallvec", "1.8.0" ], - [ "thiserror", "1.0.30" ], - [ "wgpu-types", "0.8.0" ] - ] - }, - "wgpu-profiler": { - "0.4.0": [ - [ "futures", "0.3.21" ], - [ "wgpu", "0.8.0" ] - ] - }, - "wgpu-types": { - "0.8.0": [ - [ "bitflags", "1.3.2" ], - [ "serde", "1.0.136" ] - ] - }, - "which": { - "3.1.1": [ - [ "libc", "0.2.121" ] - ], - "4.2.5": [ - [ "either", "1.6.1" ], - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ] - ] - }, - "winapi": { - "0.3.9": [ - [ "winapi-i686-pc-windows-gnu", "0.4.0" ], - [ "winapi-x86_64-pc-windows-gnu", "0.4.0" ] - ] - }, - "winapi-util": { - "0.1.5": [ - [ "winapi", "0.3.9" ] - ] - }, - "winapi-wsapoll": { - "0.1.1": [ - [ "winapi", "0.3.9" ] - ] - }, - "window_clipboard": { - "0.2.2": [ - [ "clipboard-win", "4.4.1" ], - [ "clipboard_macos", "0.1.0" ], - [ "clipboard_wayland", "0.2.0" ], - [ "clipboard_x11", "0.3.1" ], - [ "raw-window-handle", "0.3.4" ], - [ "thiserror", "1.0.30" ] - ] - }, - "windows-sys": { - "0.30.0": [ - [ "windows_aarch64_msvc", "0.30.0" ], - [ "windows_i686_gnu", "0.30.0" ], - [ "windows_i686_msvc", "0.30.0" ], - [ "windows_x86_64_gnu", "0.30.0" ], - [ "windows_x86_64_msvc", "0.30.0" ] - ], - "0.34.0": [ - [ "windows_aarch64_msvc", "0.34.0" ], - [ "windows_i686_gnu", "0.34.0" ], - [ "windows_i686_msvc", "0.34.0" ], - [ "windows_x86_64_gnu", "0.34.0" ], - [ "windows_x86_64_msvc", "0.34.0" ] - ] - }, - "winit": { - "0.25.0": [ - [ "bitflags", "1.3.2" ], - [ "cocoa", "0.24.0" ], - [ "core-foundation", "0.9.3" ], - [ "core-graphics", "0.22.3" ], - [ "core-video-sys", "0.1.4" ], - [ "dispatch", "0.2.0" ], - [ "instant", "0.1.12" ], - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "mio", "0.7.14" ], - [ "mio-misc", "1.2.2" ], - [ "ndk", "0.3.0" ], - [ "ndk-glue", "0.3.0" ], - [ "ndk-sys", "0.2.2" ], - [ "objc", "0.2.7" ], - [ "parking_lot", "0.11.2" ], - [ "percent-encoding", "2.1.0" ], - [ "raw-window-handle", "0.3.4" ], - [ "scopeguard", "1.1.0" ], - [ "serde", "1.0.136" ], - [ "smithay-client-toolkit", "0.12.3" ], - [ "wayland-client", "0.28.6" ], - [ "winapi", "0.3.9" ], - [ "x11-dl", "2.19.1" ] - ] - }, - "winreg": { - "0.10.1": [ - [ "winapi", "0.3.9" ] - ] - }, - "winres": { - "0.1.12": [ - [ "toml", "0.5.8" ] - ] - }, - "wio": { - "0.2.2": [ - [ "winapi", "0.3.9" ] - ] - }, - "wyz": { - "0.4.0": [ - [ "tap", "1.0.1" ] - ] - }, - "x11-clipboard": { - "0.5.3": [ - [ "xcb", "0.10.1" ] - ] - }, - "x11-dl": { - "2.19.1": [ - [ "lazy_static", "1.4.0" ], - [ "libc", "0.2.121" ], - [ "pkg-config", "0.3.25" ] - ] - }, - "x11rb": { - "0.8.1": [ - [ "gethostname", "0.2.3" ], - [ "nix", "0.20.0" ], - [ "winapi", "0.3.9" ], - [ "winapi-wsapoll", "0.1.1" ] - ] - }, - "xattr": { - "0.2.2": [ - [ "libc", "0.2.121" ] - ] - }, - "xcb": { - "0.10.1": [ - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ], - [ "quick-xml", "0.22.0" ] - ], - "0.9.0": [ - [ "libc", "0.2.121" ], - [ "log", "0.4.16" ] - ] - }, - "xcursor": { - "0.3.4": [ - [ "nom", "7.1.1" ] - ] - }, - "xdg": { - "2.4.1": [ - [ "dirs", "4.0.0" ] - ] - }, - "xkb": { - "0.2.1": [ - [ "bitflags", "1.3.2" ], - [ "libc", "0.2.121" ], - [ "xkbcommon-sys", "0.7.5" ] - ] - }, - "xkbcommon-sys": { - "0.7.5": [ - [ "bindgen", "0.56.0" ], - [ "libc", "0.2.121" ], - [ "pkg-config", "0.3.25" ] - ], - "0.7.6": [ - [ "libc", "0.2.121" ], - [ "pkg-config", "0.3.25" ] - ] - }, - "yasna": { - "0.5.0": [ - [ "time", "0.3.9" ] - ] - } - }, - "sources": { - "ab_glyph": { - "0.2.15": { - "hash": "24606928a235e73cdef55a0c909719cadd72fce573e5713d58cb2952d8f5794c", - "type": "crates-io" - } - }, - "ab_glyph_rasterizer": { - "0.1.5": { - "hash": "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e", - "type": "crates-io" - } - }, - "addr2line": { - "0.17.0": { - "hash": "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b", - "type": "crates-io" - } - }, - "adler": { - "1.0.2": { - "hash": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", - "type": "crates-io" - } - }, - "adler32": { - "1.2.0": { - "hash": "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234", - "type": "crates-io" - } - }, - "ahash": { - "0.3.8": { - "hash": "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217", - "type": "crates-io" - }, - "0.4.7": { - "hash": "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e", - "type": "crates-io" - }, - "0.7.6": { - "hash": "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47", - "type": "crates-io" - } - }, - "aho-corasick": { - "0.7.18": { - "hash": "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f", - "type": "crates-io" - } - }, - "alsa": { - "0.6.0": { - "hash": "5915f52fe2cf65e83924d037b6c5290b7cee097c6b5c8700746e6168a343fd6b", - "type": "crates-io" - } - }, - "alsa-sys": { - "0.3.1": { - "hash": "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527", - "type": "crates-io" - } - }, - "andrew": { - "0.3.1": { - "hash": "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf", - "type": "crates-io" - } - }, - "ansi-parser": { - "0.8.0": { - "hash": "bcb2392079bf27198570d6af79ecbd9ec7d8f16d3ec6b60933922fdb66287127", - "type": "crates-io" - } - }, - "ansi_term": { - "0.12.1": { - "hash": "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2", - "type": "crates-io" - } - }, - "anyhow": { - "1.0.61": { - "hash": "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8", - "type": "crates-io" - } - }, - "app_dirs2": { - "2.5.2": { - "hash": "c3564c46eaa62f4a4e50c98e2c698cbb95f95c08501bd2e3baf6ea73773ab9fc", - "type": "crates-io" - } - }, - "approx": { - "0.3.2": { - "hash": "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3", - "type": "crates-io" - }, - "0.4.0": { - "hash": "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278", - "type": "crates-io" - }, - "0.5.1": { - "hash": "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6", - "type": "crates-io" - } - }, - "arr_macro": { - "0.1.3": { - "hash": "6a105bfda48707cf19220129e78fca01e9639433ffaef4163546ed8fb04120a5", - "type": "crates-io" - } - }, - "arr_macro_impl": { - "0.1.3": { - "hash": "0609c78bd572f4edc74310dfb63a01f5609d53fa8b4dd7c4d98aef3b3e8d72d1", - "type": "crates-io" - } - }, - "arrayref": { - "0.3.6": { - "hash": "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544", - "type": "crates-io" - } - }, - "arrayvec": { - "0.5.2": { - "hash": "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b", - "type": "crates-io" - }, - "0.7.2": { - "hash": "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6", - "type": "crates-io" - } - }, - "as-slice": { - "0.1.5": { - "hash": "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0", - "type": "crates-io" - } - }, - "ash": { - "0.32.1": { - "hash": "06063a002a77d2734631db74e8f4ce7148b77fe522e6bca46f2ae7774fd48112", - "type": "crates-io" - } - }, - "assets_manager": { - "0.8.1": { - "hash": "c53a8477ada5edbd6ba3b0698aabaa76b352454aedc8c8dca0c6328fc8313b7e", - "type": "crates-io" - } - }, - "async-channel": { - "1.6.1": { - "hash": "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319", - "type": "crates-io" - } - }, - "async-trait": { - "0.1.53": { - "hash": "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600", - "type": "crates-io" - } - }, - "atom": { - "0.3.6": { - "hash": "c9ff149ed9780025acfdb36862d35b28856bb693ceb451259a7164442f22fdc3", - "type": "crates-io" - } - }, - "atomic_refcell": { - "0.1.8": { - "hash": "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d", - "type": "crates-io" - } - }, - "atomicwrites": { - "0.3.1": { - "hash": "eb8f2cd6962fa53c0e2a9d3f97eaa7dbd1e3cbbeeb4745403515b42ae07b3ff6", - "type": "crates-io" - } - }, - "atty": { - "0.2.14": { - "hash": "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8", - "type": "crates-io" - } - }, - "auth-common": { - "0.1.0": { - "rev": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a", - "type": "git", - "url": "https://gitlab.com/veloren/auth.git" - } - }, - "authc": { - "1.0.0": { - "rev": "fb3dcbc4962b367253f8f2f92760ef44d2679c9a", - "type": "git", - "url": "https://gitlab.com/veloren/auth.git" - } - }, - "autocfg": { - "1.1.0": { - "hash": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", - "type": "crates-io" - } - }, - "backtrace": { - "0.3.65": { - "hash": "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61", - "type": "crates-io" - } - }, - "base-x": { - "0.2.8": { - "hash": "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b", - "type": "crates-io" - } - }, - "base64": { - "0.13.0": { - "hash": "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd", - "type": "crates-io" - } - }, - "bincode": { - "1.3.3": { - "hash": "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad", - "type": "crates-io" - } - }, - "bindgen": { - "0.56.0": { - "hash": "2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239", - "type": "crates-io" - } - }, - "bit-set": { - "0.5.2": { - "hash": "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de", - "type": "crates-io" - } - }, - "bit-vec": { - "0.6.3": { - "hash": "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb", - "type": "crates-io" - } - }, - "bitflags": { - "1.3.2": { - "hash": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - "type": "crates-io" - } - }, - "bitvec": { - "0.22.3": { - "hash": "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527", - "type": "crates-io" - } - }, - "blake2b_simd": { - "0.5.11": { - "hash": "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587", - "type": "crates-io" - } - }, - "block": { - "0.1.6": { - "hash": "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a", - "type": "crates-io" - } - }, - "block-buffer": { - "0.10.2": { - "hash": "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324", - "type": "crates-io" - } - }, - "bstr": { - "0.2.17": { - "hash": "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223", - "type": "crates-io" - } - }, - "bumpalo": { - "3.9.1": { - "hash": "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899", - "type": "crates-io" - } - }, - "bytecheck": { - "0.6.7": { - "hash": "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe", - "type": "crates-io" - } - }, - "bytecheck_derive": { - "0.6.7": { - "hash": "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600", - "type": "crates-io" - } - }, - "bytemuck": { - "1.9.1": { - "hash": "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc", - "type": "crates-io" - } - }, - "bytemuck_derive": { - "1.1.0": { - "hash": "562e382481975bc61d11275ac5e62a19abd00b0547d99516a415336f183dcd0e", - "type": "crates-io" - } - }, - "byteorder": { - "1.4.3": { - "hash": "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610", - "type": "crates-io" - } - }, - "bytes": { - "1.1.0": { - "hash": "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8", - "type": "crates-io" - } - }, - "cache-padded": { - "1.2.0": { - "hash": "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c", - "type": "crates-io" - } - }, - "calloop": { - "0.6.5": { - "hash": "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c", - "type": "crates-io" - } - }, - "cassowary": { - "0.3.0": { - "hash": "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53", - "type": "crates-io" - } - }, - "cast": { - "0.2.7": { - "hash": "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a", - "type": "crates-io" - } - }, - "cc": { - "1.0.73": { - "hash": "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11", - "type": "crates-io" - } - }, - "censor": { - "0.2.0": { - "hash": "5563d2728feef9a6186acdd148bccbe850dad63c5ba55a3b3355abc9137cb3eb", - "type": "crates-io" - } - }, - "cesu8": { - "1.1.0": { - "hash": "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c", - "type": "crates-io" - } - }, - "cexpr": { - "0.4.0": { - "hash": "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27", - "type": "crates-io" - } - }, - "cfg-if": { - "0.1.10": { - "hash": "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822", - "type": "crates-io" - }, - "1.0.0": { - "hash": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", - "type": "crates-io" - } - }, - "cfg_aliases": { - "0.1.1": { - "hash": "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e", - "type": "crates-io" - } - }, - "chrono": { - "0.4.19": { - "hash": "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73", - "type": "crates-io" - } - }, - "chrono-tz": { - "0.6.1": { - "hash": "58549f1842da3080ce63002102d5bc954c7bc843d4f47818e642abdc36253552", - "type": "crates-io" - } - }, - "chrono-tz-build": { - "0.0.2": { - "hash": "db058d493fb2f65f41861bfed7e3fe6335264a9f0f92710cab5bdf01fef09069", - "type": "crates-io" - } - }, - "chumsky": { - "0.8.0": { - "hash": "8d02796e4586c6c41aeb68eae9bfb4558a522c35f1430c14b40136c3706e09e4", - "type": "crates-io" - } - }, - "clang-sys": { - "1.3.1": { - "hash": "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21", - "type": "crates-io" - } - }, - "clap": { - "2.34.0": { - "hash": "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c", - "type": "crates-io" - }, - "3.1.10": { - "hash": "3124f3f75ce09e22d1410043e1e24f2ecc44fad3afe4f08408f1f7663d68da2b", - "type": "crates-io" - } - }, - "clap_derive": { - "3.1.7": { - "hash": "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1", - "type": "crates-io" - } - }, - "clap_lex": { - "0.1.1": { - "hash": "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669", - "type": "crates-io" - } - }, - "clipboard-win": { - "3.1.1": { - "hash": "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342", - "type": "crates-io" - }, - "4.4.1": { - "hash": "2f3e1238132dc01f081e1cbb9dace14e5ef4c3a51ee244bd982275fb514605db", - "type": "crates-io" - } - }, - "clipboard_macos": { - "0.1.0": { - "hash": "145a7f9e9b89453bc0a5e32d166456405d389cea5b578f57f1274b1397588a95", - "type": "crates-io" - } - }, - "clipboard_wayland": { - "0.2.0": { - "hash": "6f6364a9f7a66f2ac1a1a098aa1c7f6b686f2496c6ac5e5c0d773445df912747", - "type": "crates-io" - } - }, - "clipboard_x11": { - "0.3.1": { - "hash": "64240d63f1883d87e5637bfcaf9d77e5c8bd24e30fd440ea2dff5c48c0bf0b7a", - "type": "crates-io" - } - }, - "cloudabi": { - "0.0.3": { - "hash": "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f", - "type": "crates-io" - } - }, - "cmake": { - "0.1.45": { - "hash": "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855", - "type": "crates-io" - } - }, - "cocoa": { - "0.24.0": { - "hash": "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832", - "type": "crates-io" - } - }, - "cocoa-foundation": { - "0.1.0": { - "hash": "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318", - "type": "crates-io" - } - }, - "codespan-reporting": { - "0.11.1": { - "hash": "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e", - "type": "crates-io" - } - }, - "color_quant": { - "1.1.0": { - "hash": "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b", - "type": "crates-io" - } - }, - "combine": { - "4.6.3": { - "hash": "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062", - "type": "crates-io" - } - }, - "concurrent-queue": { - "1.2.2": { - "hash": "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3", - "type": "crates-io" - } - }, - "conrod_core": { - "0.63.0": { - "ref": "refs/heads/copypasta_0.7", - "rev": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", - "type": "git", - "url": "https://gitlab.com/veloren/conrod.git" - } - }, - "conrod_derive": { - "0.63.0": { - "ref": "refs/heads/copypasta_0.7", - "rev": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", - "type": "git", - "url": "https://gitlab.com/veloren/conrod.git" - } - }, - "conrod_winit": { - "0.63.0": { - "ref": "refs/heads/copypasta_0.7", - "rev": "ca9fd429ca7db854e018acc6dcb2cd8abd9e070d", - "type": "git", - "url": "https://gitlab.com/veloren/conrod.git" - } - }, - "const-random": { - "0.1.13": { - "hash": "f590d95d011aa80b063ffe3253422ed5aa462af4e9867d43ce8337562bac77c4", - "type": "crates-io" - } - }, - "const-random-macro": { - "0.1.13": { - "hash": "615f6e27d000a2bffbc7f2f6a8669179378fa27ee4d0a509e985dfc0a7defb40", - "type": "crates-io" - } - }, - "constant_time_eq": { - "0.1.5": { - "hash": "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc", - "type": "crates-io" - } - }, - "copy_dir": { - "0.1.2": { - "hash": "6e4281031634644843bd2f5aa9c48cf98fc48d6b083bd90bb11becf10deaf8b0", - "type": "crates-io" - } - }, - "copyless": { - "0.1.5": { - "hash": "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536", - "type": "crates-io" - } - }, - "copypasta": { - "0.7.1": { - "hash": "4423d79fed83ebd9ab81ec21fa97144300a961782158287dc9bf7eddac37ff0b", - "type": "crates-io" - } - }, - "core-foundation": { - "0.6.4": { - "hash": "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d", - "type": "crates-io" - }, - "0.7.0": { - "hash": "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171", - "type": "crates-io" - }, - "0.9.3": { - "hash": "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146", - "type": "crates-io" - } - }, - "core-foundation-sys": { - "0.6.2": { - "hash": "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b", - "type": "crates-io" - }, - "0.7.0": { - "hash": "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac", - "type": "crates-io" - }, - "0.8.3": { - "hash": "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc", - "type": "crates-io" - } - }, - "core-graphics": { - "0.19.2": { - "hash": "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923", - "type": "crates-io" - }, - "0.22.3": { - "hash": "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb", - "type": "crates-io" - } - }, - "core-graphics-types": { - "0.1.1": { - "hash": "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b", - "type": "crates-io" - } - }, - "core-video-sys": { - "0.1.4": { - "hash": "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828", - "type": "crates-io" - } - }, - "coreaudio-rs": { - "0.10.0": { - "hash": "11894b20ebfe1ff903cbdc52259693389eea03b94918a2def2c30c3bf227ad88", - "type": "crates-io" - } - }, - "coreaudio-sys": { - "0.2.9": { - "hash": "ca4679a59dbd8c15f064c012dfe8c1163b9453224238b59bb9328c142b8b248b", - "type": "crates-io" - } - }, - "cpal": { - "0.13.5": { - "hash": "74117836a5124f3629e4b474eed03e479abaf98988b4bb317e29f08cfe0e4116", - "type": "crates-io" - } - }, - "cpufeatures": { - "0.2.2": { - "hash": "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b", - "type": "crates-io" - } - }, - "cranelift-bforest": { - "0.76.0": { - "hash": "7e6bea67967505247f54fa2c85cf4f6e0e31c4e5692c9b70e4ae58e339067333", - "type": "crates-io" - } - }, - "cranelift-codegen": { - "0.76.0": { - "hash": "48194035d2752bdd5bdae429e3ab88676e95f52a2b1355a5d4e809f9e39b1d74", - "type": "crates-io" - } - }, - "cranelift-codegen-meta": { - "0.76.0": { - "hash": "976efb22fcab4f2cd6bd4e9913764616a54d895c1a23530128d04e03633c555f", - "type": "crates-io" - } - }, - "cranelift-codegen-shared": { - "0.76.0": { - "hash": "9dabb5fe66e04d4652e434195b45ae65b5c8172d520247b8f66d8df42b2b45dc", - "type": "crates-io" - } - }, - "cranelift-entity": { - "0.76.0": { - "hash": "3329733e4d4b8e91c809efcaa4faee80bf66f20164e3dd16d707346bd3494799", - "type": "crates-io" - } - }, - "cranelift-frontend": { - "0.76.0": { - "hash": "279afcc0d3e651b773f94837c3d581177b348c8d69e928104b2e9fccb226f921", - "type": "crates-io" - } - }, - "crc32fast": { - "1.3.2": { - "hash": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d", - "type": "crates-io" - } - }, - "criterion": { - "0.3.4": { - "hash": "ab327ed7354547cc2ef43cbe20ef68b988e70b4b593cbd66a2a61733123a3d23", - "type": "crates-io" - } - }, - "criterion-plot": { - "0.4.4": { - "hash": "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57", - "type": "crates-io" - } - }, - "crossbeam": { - "0.8.1": { - "hash": "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845", - "type": "crates-io" - } - }, - "crossbeam-channel": { - "0.5.4": { - "hash": "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53", - "type": "crates-io" - } - }, - "crossbeam-deque": { - "0.7.4": { - "hash": "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed", - "type": "crates-io" - }, - "0.8.1": { - "hash": "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e", - "type": "crates-io" - } - }, - "crossbeam-epoch": { - "0.8.2": { - "hash": "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace", - "type": "crates-io" - }, - "0.9.8": { - "hash": "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c", - "type": "crates-io" - } - }, - "crossbeam-queue": { - "0.3.5": { - "hash": "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2", - "type": "crates-io" - } - }, - "crossbeam-utils": { - "0.7.2": { - "hash": "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8", - "type": "crates-io" - }, - "0.8.8": { - "hash": "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38", - "type": "crates-io" - } - }, - "crossterm": { - "0.17.7": { - "hash": "6f4919d60f26ae233e14233cc39746c8c8bb8cd7b05840ace83604917b51b6c7", - "type": "crates-io" - }, - "0.23.2": { - "hash": "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17", - "type": "crates-io" - } - }, - "crossterm_winapi": { - "0.6.2": { - "hash": "c2265c3f8e080075d9b6417aa72293fc71662f34b4af2612d8d1b074d29510db", - "type": "crates-io" - }, - "0.9.0": { - "hash": "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c", - "type": "crates-io" - } - }, - "crunchy": { - "0.2.2": { - "hash": "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7", - "type": "crates-io" - } - }, - "crypto-common": { - "0.1.3": { - "hash": "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8", - "type": "crates-io" - } - }, - "csv": { - "1.1.6": { - "hash": "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1", - "type": "crates-io" - } - }, - "csv-core": { - "0.1.10": { - "hash": "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90", - "type": "crates-io" - } - }, - "ct-logs": { - "0.8.0": { - "hash": "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8", - "type": "crates-io" - } - }, - "cty": { - "0.2.2": { - "hash": "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35", - "type": "crates-io" - } - }, - "d3d12": { - "0.4.1": { - "hash": "2daefd788d1e96e0a9d66dee4b828b883509bc3ea9ce30665f04c3246372690c", - "type": "crates-io" - } - }, - "daggy": { - "0.5.0": { - "hash": "9293a0da7d1bc1f30090ece4d9f9de79a07be7302ddb00e5eb1fefb6ee6409e2", - "type": "crates-io" - } - }, - "darling": { - "0.10.2": { - "hash": "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858", - "type": "crates-io" - }, - "0.13.2": { - "hash": "4e92cb285610dd935f60ee8b4d62dd1988bd12b7ea50579bd6a138201525318e", - "type": "crates-io" - } - }, - "darling_core": { - "0.10.2": { - "hash": "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b", - "type": "crates-io" - }, - "0.13.2": { - "hash": "5c29e95ab498b18131ea460b2c0baa18cbf041231d122b0b7bfebef8c8e88989", - "type": "crates-io" - } - }, - "darling_macro": { - "0.10.2": { - "hash": "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72", - "type": "crates-io" - }, - "0.13.2": { - "hash": "b21dd6b221dd547528bd6fb15f1a3b7ab03b9a06f76bff288a8c629bcfbe7f0e", - "type": "crates-io" - } - }, - "deflate": { - "1.0.0": { - "hash": "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f", - "type": "crates-io" - } - }, - "deunicode": { - "1.3.1": { - "hash": "f2c9736e15e7df1638a7f6eee92a6511615c738246a052af5ba86f039b65aede", - "type": "crates-io" - } - }, - "digest": { - "0.10.3": { - "hash": "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506", - "type": "crates-io" - } - }, - "directories-next": { - "2.0.0": { - "hash": "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc", - "type": "crates-io" - } - }, - "dirs": { - "4.0.0": { - "hash": "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059", - "type": "crates-io" - } - }, - "dirs-next": { - "2.0.0": { - "hash": "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1", - "type": "crates-io" - } - }, - "dirs-sys": { - "0.3.7": { - "hash": "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6", - "type": "crates-io" - } - }, - "dirs-sys-next": { - "0.1.2": { - "hash": "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d", - "type": "crates-io" - } - }, - "discard": { - "1.0.4": { - "hash": "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0", - "type": "crates-io" - } - }, - "discord-sdk": { - "0.3.0": { - "hash": "e314b59ba110cb4fad80073f5276eb62cda4cc3caabe998f5d664b19fd6a7be0", - "type": "crates-io" - } - }, - "dispatch": { - "0.1.4": { - "hash": "04e93ca78226c51902d7aa8c12c988338aadd9e85ed9c6be8aaac39192ff3605", - "type": "crates-io" - }, - "0.2.0": { - "hash": "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b", - "type": "crates-io" - } - }, - "dlib": { - "0.4.2": { - "hash": "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76", - "type": "crates-io" - }, - "0.5.0": { - "hash": "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794", - "type": "crates-io" - } - }, - "dot_vox": { - "4.1.0": { - "hash": "83c18405ef54de0398b77a3ec8394d3a1639e7bf060e1385201e8db40c44ab41", - "type": "crates-io" - } - }, - "downcast-rs": { - "1.2.0": { - "hash": "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650", - "type": "crates-io" - } - }, - "egui": { - "0.12.0": { - "hash": "788148861d80b87d28d64440a3d31cae190e50ccc3ea585597466d38428365d7", - "type": "crates-io" - } - }, - "egui_wgpu_backend": { - "0.8.0": { - "rev": "63a002c6a9b6c016e45806dd065864431caab621", - "type": "git", - "url": "https://github.com/hasenbanck/egui_wgpu_backend.git" - } - }, - "egui_winit_platform": { - "0.8.0": { - "hash": "cd4cf17c0cd4dbcf2f8fef55a3592b9b7cfd970576c7302d8ba5c521b8560371", - "type": "crates-io" - } - }, - "either": { - "1.6.1": { - "hash": "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457", - "type": "crates-io" - } - }, - "emath": { - "0.12.0": { - "hash": "3e73d6c8c70eadb71756fbbc3c303ab25e163b46b656886dd250de5636efea12", - "type": "crates-io" - } - }, - "endian-type": { - "0.1.2": { - "hash": "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d", - "type": "crates-io" - } - }, - "enum-iterator": { - "0.7.0": { - "hash": "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6", - "type": "crates-io" - } - }, - "enum-iterator-derive": { - "0.7.0": { - "hash": "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159", - "type": "crates-io" - } - }, - "enumset": { - "1.0.9": { - "hash": "42f0ae74db31a8ba0093a411d594a1d6d65c207611816ebf4e75381f3f72b1fe", - "type": "crates-io" - } - }, - "enumset_derive": { - "0.5.6": { - "hash": "5c594871f94ab3a00434cb09f03067c92fa2ece4cc657d58ba402e8377cd85a3", - "type": "crates-io" - } - }, - "env_logger": { - "0.8.4": { - "hash": "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3", - "type": "crates-io" - } - }, - "epaint": { - "0.12.0": { - "hash": "80e2db640801230bdda80629bc3a063927a462f5eaf38a98da676954e78ccb99", - "type": "crates-io" - } - }, - "epi": { - "0.12.0": { - "hash": "59c4f6cbede1fc8f836384f85295a59199a4825940abcc3a8a29cfe2e3c37583", - "type": "crates-io" - } - }, - "errno": { - "0.2.8": { - "hash": "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1", - "type": "crates-io" - } - }, - "errno-dragonfly": { - "0.1.2": { - "hash": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf", - "type": "crates-io" - } - }, - "error-code": { - "2.3.1": { - "hash": "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21", - "type": "crates-io" - } - }, - "etagere": { - "0.2.7": { - "hash": "6301151a318f367f392c31395beb1cfba5ccd9abc44d1db0db3a4b27b9601c89", - "type": "crates-io" - } - }, - "euc": { - "0.5.3": { - "hash": "0947d06646d28a4ac2862ac5eadc1062704d61ee398b3baba8b4a21e2f1ef5ed", - "type": "crates-io" - } - }, - "euclid": { - "0.22.7": { - "hash": "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade", - "type": "crates-io" - } - }, - "event-listener": { - "2.5.2": { - "hash": "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71", - "type": "crates-io" - } - }, - "fallible-iterator": { - "0.2.0": { - "hash": "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7", - "type": "crates-io" - } - }, - "fallible-streaming-iterator": { - "0.1.9": { - "hash": "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a", - "type": "crates-io" - } - }, - "fastrand": { - "1.7.0": { - "hash": "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf", - "type": "crates-io" - } - }, - "fd-lock": { - "3.0.5": { - "hash": "46e245f4c8ec30c6415c56cb132c07e69e74f1942f6b4a4061da748b49f486ca", - "type": "crates-io" - } - }, - "fehler": { - "1.0.0": { - "hash": "d5729fe49ba028cd550747b6e62cd3d841beccab5390aa398538c31a2d983635", - "type": "crates-io" - } - }, - "fehler-macros": { - "1.0.0": { - "hash": "ccb5acb1045ebbfa222e2c50679e392a71dd77030b78fb0189f2d9c5974400f9", - "type": "crates-io" - } - }, - "filetime": { - "0.2.15": { - "hash": "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98", - "type": "crates-io" - } - }, - "find_folder": { - "0.3.0": { - "hash": "9f6d018fb95a0b59f854aed68ecd96ce2b80af7911b92b1fed3c4b1fa516b91b", - "type": "crates-io" - } - }, - "fixedbitset": { - "0.1.9": { - "hash": "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33", - "type": "crates-io" - }, - "0.2.0": { - "hash": "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d", - "type": "crates-io" - }, - "0.4.1": { - "hash": "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e", - "type": "crates-io" - } - }, - "flate2": { - "1.0.24": { - "hash": "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6", - "type": "crates-io" - } - }, - "float-cmp": { - "0.9.0": { - "hash": "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4", - "type": "crates-io" - } - }, - "fluent": { - "0.16.0": { - "ref": "refs/heads/patched", - "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", - "type": "git", - "url": "https://github.com/juliancoffee/fluent-rs.git" - } - }, - "fluent-bundle": { - "0.15.2": { - "ref": "refs/heads/patched", - "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", - "type": "git", - "url": "https://github.com/juliancoffee/fluent-rs.git" - } - }, - "fluent-langneg": { - "0.13.0": { - "hash": "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94", - "type": "crates-io" - } - }, - "fluent-syntax": { - "0.11.0": { - "ref": "refs/heads/patched", - "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", - "type": "git", - "url": "https://github.com/juliancoffee/fluent-rs.git" - } - }, - "fnv": { - "1.0.7": { - "hash": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", - "type": "crates-io" - } - }, - "foreign-types": { - "0.3.2": { - "hash": "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1", - "type": "crates-io" - } - }, - "foreign-types-shared": { - "0.1.1": { - "hash": "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b", - "type": "crates-io" - } - }, - "form_urlencoded": { - "1.0.1": { - "hash": "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191", - "type": "crates-io" - } - }, - "fsevent-sys": { - "4.1.0": { - "hash": "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2", - "type": "crates-io" - } - }, - "funty": { - "1.2.0": { - "hash": "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e", - "type": "crates-io" - } - }, - "futures": { - "0.3.21": { - "hash": "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e", - "type": "crates-io" - } - }, - "futures-channel": { - "0.3.21": { - "hash": "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010", - "type": "crates-io" - } - }, - "futures-core": { - "0.3.21": { - "hash": "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3", - "type": "crates-io" - } - }, - "futures-executor": { - "0.3.21": { - "hash": "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6", - "type": "crates-io" - } - }, - "futures-io": { - "0.3.21": { - "hash": "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b", - "type": "crates-io" - } - }, - "futures-macro": { - "0.3.21": { - "hash": "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512", - "type": "crates-io" - } - }, - "futures-sink": { - "0.3.21": { - "hash": "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868", - "type": "crates-io" - } - }, - "futures-task": { - "0.3.21": { - "hash": "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a", - "type": "crates-io" - } - }, - "futures-util": { - "0.3.21": { - "hash": "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a", - "type": "crates-io" - } - }, - "fxhash": { - "0.2.1": { - "hash": "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c", - "type": "crates-io" - } - }, - "generator": { - "0.7.0": { - "hash": "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee", - "type": "crates-io" - } - }, - "generic-array": { - "0.12.4": { - "hash": "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd", - "type": "crates-io" - }, - "0.13.3": { - "hash": "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309", - "type": "crates-io" - }, - "0.14.5": { - "hash": "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803", - "type": "crates-io" - } - }, - "gethostname": { - "0.2.3": { - "hash": "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e", - "type": "crates-io" - } - }, - "getrandom": { - "0.1.16": { - "hash": "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce", - "type": "crates-io" - }, - "0.2.6": { - "hash": "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad", - "type": "crates-io" - } - }, - "gfx-auxil": { - "0.9.0": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-backend-dx11": { - "0.8.0": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-backend-dx12": { - "0.8.0": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-backend-empty": { - "0.8.0": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-backend-gl": { - "0.8.1": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-backend-metal": { - "0.8.1": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-backend-vulkan": { - "0.8.0": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gfx-hal": { - "0.8.0": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "gilrs": { - "0.8.2": { - "hash": "1550c8bdebc993576e343d600a954654708a9a1182396ee1e805d6fe60c72909", - "type": "crates-io" - } - }, - "gilrs-core": { - "0.3.2": { - "hash": "84c7262ce1e88429c9b1d847820c9d2ba00adafc955218393d9c0861d5aaab88", - "type": "crates-io" - } - }, - "gimli": { - "0.25.0": { - "hash": "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7", - "type": "crates-io" - }, - "0.26.1": { - "hash": "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4", - "type": "crates-io" - } - }, - "glam": { - "0.10.2": { - "hash": "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15", - "type": "crates-io" - } - }, - "glob": { - "0.3.0": { - "hash": "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574", - "type": "crates-io" - } - }, - "glow": { - "0.9.0": { - "hash": "4b80b98efaa8a34fce11d60dd2ce2760d5d83c373cbcc73bb87c2a3a84a54108", - "type": "crates-io" - } - }, - "glyph_brush": { - "0.7.3": { - "hash": "21932fbf719272848eec4583740d978203c6e7da4c4e203358f5b95946c97409", - "type": "crates-io" - } - }, - "glyph_brush_draw_cache": { - "0.1.5": { - "hash": "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610", - "type": "crates-io" - } - }, - "glyph_brush_layout": { - "0.2.3": { - "hash": "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38", - "type": "crates-io" - } - }, - "gpu-alloc": { - "0.4.7": { - "hash": "cbc1b6ca374e81862526786d9cb42357ce03706ed1b8761730caafd02ab91f3a", - "type": "crates-io" - } - }, - "gpu-alloc-types": { - "0.2.0": { - "hash": "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5", - "type": "crates-io" - } - }, - "gpu-descriptor": { - "0.1.1": { - "hash": "e8a70f1e87a3840ed6a3e99e02c2b861e4dbdf26f0d07e38f42ea5aff46cfce2", - "type": "crates-io" - } - }, - "gpu-descriptor-types": { - "0.1.1": { - "hash": "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126", - "type": "crates-io" - } - }, - "guillotiere": { - "0.6.2": { - "hash": "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782", - "type": "crates-io" - } - }, - "h2": { - "0.3.13": { - "hash": "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57", - "type": "crates-io" - } - }, - "half": { - "1.8.2": { - "hash": "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7", - "type": "crates-io" - } - }, - "hash32": { - "0.1.1": { - "hash": "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc", - "type": "crates-io" - } - }, - "hashbrown": { - "0.11.2": { - "hash": "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e", - "type": "crates-io" - }, - "0.12.0": { - "hash": "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758", - "type": "crates-io" - }, - "0.9.1": { - "hash": "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04", - "type": "crates-io" - } - }, - "hashlink": { - "0.6.0": { - "hash": "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8", - "type": "crates-io" - } - }, - "heapless": { - "0.5.6": { - "hash": "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1", - "type": "crates-io" - }, - "0.6.1": { - "hash": "634bd4d29cbf24424d0a4bfcbf80c6960129dc24424752a7d1d1390607023422", - "type": "crates-io" - } - }, - "heck": { - "0.3.3": { - "hash": "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c", - "type": "crates-io" - }, - "0.4.0": { - "hash": "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9", - "type": "crates-io" - } - }, - "hermit-abi": { - "0.1.19": { - "hash": "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33", - "type": "crates-io" - } - }, - "hex": { - "0.3.2": { - "hash": "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77", - "type": "crates-io" - } - }, - "hibitset": { - "0.6.3": { - "hash": "93a1bb8316a44459a7d14253c4d28dd7395cbd23cc04a68c46e851b8e46d64b1", - "type": "crates-io" - } - }, - "http": { - "0.2.6": { - "hash": "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03", - "type": "crates-io" - } - }, - "http-body": { - "0.4.4": { - "hash": "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6", - "type": "crates-io" - } - }, - "httparse": { - "1.6.0": { - "hash": "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4", - "type": "crates-io" - } - }, - "httpdate": { - "1.0.2": { - "hash": "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421", - "type": "crates-io" - } - }, - "humantime": { - "2.1.0": { - "hash": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", - "type": "crates-io" - } - }, - "hyper": { - "0.14.18": { - "hash": "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2", - "type": "crates-io" - } - }, - "hyper-rustls": { - "0.22.1": { - "hash": "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64", - "type": "crates-io" - } - }, - "iced_core": { - "0.4.0": { - "ref": "refs/tags/winit-0.25", - "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "git", - "url": "https://github.com/Imberflur/iced" - } - }, - "iced_futures": { - "0.3.0": { - "ref": "refs/tags/winit-0.25", - "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "git", - "url": "https://github.com/Imberflur/iced" - } - }, - "iced_graphics": { - "0.2.0": { - "ref": "refs/tags/winit-0.25", - "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "git", - "url": "https://github.com/Imberflur/iced" - } - }, - "iced_native": { - "0.4.0": { - "ref": "refs/tags/winit-0.25", - "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "git", - "url": "https://github.com/Imberflur/iced" - } - }, - "iced_style": { - "0.3.0": { - "ref": "refs/tags/winit-0.25", - "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "git", - "url": "https://github.com/Imberflur/iced" - } - }, - "iced_winit": { - "0.3.0": { - "ref": "refs/tags/winit-0.25", - "rev": "18a48a5eeefd2aa6e50f5dd0751ac2e94c88a9eb", - "type": "git", - "url": "https://github.com/Imberflur/iced" - } - }, - "ident_case": { - "1.0.1": { - "hash": "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39", - "type": "crates-io" - } - }, - "idna": { - "0.2.3": { - "hash": "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8", - "type": "crates-io" - } - }, - "image": { - "0.24.2": { - "hash": "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212", - "type": "crates-io" - } - }, - "indexmap": { - "1.8.1": { - "hash": "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee", - "type": "crates-io" - } - }, - "inline_tweak": { - "1.0.8": { - "hash": "7033e97b20277cc0d043226d1940fa7719ff08d2305d1fc7421e53066d00eb4b", - "type": "crates-io" - } - }, - "inotify": { - "0.9.6": { - "hash": "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff", - "type": "crates-io" - } - }, - "inotify-sys": { - "0.1.5": { - "hash": "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb", - "type": "crates-io" - } - }, - "inplace_it": { - "0.3.3": { - "hash": "90953f308a79fe6d62a4643e51f848fbfddcd05975a38e69fdf4ab86a7baf7ca", - "type": "crates-io" - } - }, - "instant": { - "0.1.12": { - "hash": "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c", - "type": "crates-io" - } - }, - "intl-memoizer": { - "0.5.1": { - "ref": "refs/heads/patched", - "rev": "929cf9512de121cce9b4cbf1cb860cd3294a1cd9", - "type": "git", - "url": "https://github.com/juliancoffee/fluent-rs.git" - } - }, - "intl_pluralrules": { - "7.0.1": { - "hash": "b18f988384267d7066cc2be425e6faf352900652c046b6971d2e228d3b1c5ecf", - "type": "crates-io" - } - }, - "io-kit-sys": { - "0.1.0": { - "hash": "f21dcc74995dd4cd090b147e79789f8d65959cbfb5f0b118002db869ea3bd0a0", - "type": "crates-io" - } - }, - "io-lifetimes": { - "0.6.1": { - "hash": "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504", - "type": "crates-io" - } - }, - "itertools": { - "0.10.3": { - "hash": "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3", - "type": "crates-io" - } - }, - "itoa": { - "0.4.8": { - "hash": "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4", - "type": "crates-io" - }, - "1.0.1": { - "hash": "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35", - "type": "crates-io" - } - }, - "jni": { - "0.19.0": { - "hash": "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec", - "type": "crates-io" - } - }, - "jni-sys": { - "0.3.0": { - "hash": "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130", - "type": "crates-io" - } - }, - "jobserver": { - "0.1.24": { - "hash": "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa", - "type": "crates-io" - } - }, - "jpeg-decoder": { - "0.2.6": { - "hash": "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b", - "type": "crates-io" - } - }, - "js-sys": { - "0.3.56": { - "hash": "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04", - "type": "crates-io" - } - }, - "kernel32-sys": { - "0.2.2": { - "hash": "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d", - "type": "crates-io" - } - }, - "keyboard-keynames": { - "0.1.0": { - "ref": "refs/heads/develop", - "rev": "1ae010ca032a57dfe0ba01d4346a3b03bde36de0", - "type": "git", - "url": "https://gitlab.com/Frinksy/keyboard-keynames.git" - } - }, - "khronos-egl": { - "4.1.0": { - "hash": "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3", - "type": "crates-io" - } - }, - "kiddo": { - "0.1.7": { - "hash": "8d9d9b46f84e6d21fda457c8d7a5ed0e50382355194a47f28a3747ce6b5351d4", - "type": "crates-io" - }, - "0.2.4": { - "hash": "fc0a5c92307668140bf7d63a03a23e2da0b0453801fd54888c903cb7f723c293", - "type": "crates-io" - } - }, - "kqueue": { - "1.0.4": { - "hash": "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9", - "type": "crates-io" - } - }, - "kqueue-sys": { - "1.0.3": { - "hash": "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587", - "type": "crates-io" - } - }, - "lazy-bytes-cast": { - "5.0.1": { - "hash": "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b", - "type": "crates-io" - } - }, - "lazy_static": { - "1.4.0": { - "hash": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", - "type": "crates-io" - } - }, - "lazycell": { - "1.3.0": { - "hash": "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55", - "type": "crates-io" - } - }, - "leb128": { - "0.2.5": { - "hash": "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67", - "type": "crates-io" - } - }, - "lewton": { - "0.10.2": { - "hash": "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030", - "type": "crates-io" - } - }, - "libc": { - "0.2.121": { - "hash": "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f", - "type": "crates-io" - } - }, - "libloading": { - "0.6.7": { - "hash": "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883", - "type": "crates-io" - }, - "0.7.3": { - "hash": "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd", - "type": "crates-io" - } - }, - "libm": { - "0.1.4": { - "hash": "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a", - "type": "crates-io" - }, - "0.2.2": { - "hash": "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db", - "type": "crates-io" - } - }, - "libmimalloc-sys": { - "0.1.25": { - "hash": "11ca136052550448f55df7898c6dbe651c6b574fe38a0d9ea687a9f8088a2e2c", - "type": "crates-io" - } - }, - "libsqlite3-sys": { - "0.20.1": { - "hash": "64d31059f22935e6c31830db5249ba2b7ecd54fd73a9909286f0a67aa55c2fbd", - "type": "crates-io" - } - }, - "libudev-sys": { - "0.1.4": { - "hash": "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324", - "type": "crates-io" - } - }, - "linked-hash-map": { - "0.5.4": { - "hash": "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3", - "type": "crates-io" - } - }, - "linux-raw-sys": { - "0.0.42": { - "hash": "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7", - "type": "crates-io" - } - }, - "lock_api": { - "0.3.4": { - "hash": "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75", - "type": "crates-io" - }, - "0.4.7": { - "hash": "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53", - "type": "crates-io" - } - }, - "log": { - "0.4.16": { - "hash": "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8", - "type": "crates-io" - } - }, - "loom": { - "0.5.4": { - "hash": "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309", - "type": "crates-io" - } - }, - "loupe": { - "0.1.3": { - "hash": "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d", - "type": "crates-io" - } - }, - "loupe-derive": { - "0.1.3": { - "hash": "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952", - "type": "crates-io" - } - }, - "lz-fear": { - "0.1.1": { - "hash": "06aad1ce45e4ccf7a8d7d43e0c3ad38dc5d2255174a5f29a3c39d961fbc6181d", - "type": "crates-io" - } - }, - "mach": { - "0.2.3": { - "hash": "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1", - "type": "crates-io" - }, - "0.3.2": { - "hash": "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa", - "type": "crates-io" - } - }, - "malloc_buf": { - "0.0.6": { - "hash": "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb", - "type": "crates-io" - } - }, - "matchers": { - "0.1.0": { - "hash": "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558", - "type": "crates-io" - } - }, - "matches": { - "0.1.9": { - "hash": "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f", - "type": "crates-io" - } - }, - "maybe-uninit": { - "2.0.0": { - "hash": "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00", - "type": "crates-io" - } - }, - "memchr": { - "2.4.1": { - "hash": "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a", - "type": "crates-io" - } - }, - "memmap": { - "0.7.0": { - "hash": "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b", - "type": "crates-io" - } - }, - "memmap2": { - "0.1.0": { - "hash": "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a", - "type": "crates-io" - }, - "0.3.1": { - "hash": "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357", - "type": "crates-io" - }, - "0.5.3": { - "hash": "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f", - "type": "crates-io" - } - }, - "memoffset": { - "0.5.6": { - "hash": "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa", - "type": "crates-io" - }, - "0.6.5": { - "hash": "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce", - "type": "crates-io" - } - }, - "metal": { - "0.22.0": { - "hash": "1c12e48c737ee9a55e8bb2352bcde588f79ae308d3529ee888f7cc0f469b5777", - "type": "crates-io" - } - }, - "mimalloc": { - "0.1.29": { - "hash": "2f64ad83c969af2e732e907564deb0d0ed393cec4af80776f77dd77a1a427698", - "type": "crates-io" - } - }, - "minifb": { - "0.22.0": { - "hash": "6e52abe7ff0cb18cd88a6e9d7a91ca1ff74876587e7b6b1f30d1aeee9aa89aed", - "type": "crates-io" - } - }, - "minimal-lexical": { - "0.2.1": { - "hash": "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a", - "type": "crates-io" - } - }, - "miniz_oxide": { - "0.5.1": { - "hash": "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082", - "type": "crates-io" - } - }, - "mio": { - "0.7.14": { - "hash": "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc", - "type": "crates-io" - }, - "0.8.2": { - "hash": "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9", - "type": "crates-io" - } - }, - "mio-misc": { - "1.2.2": { - "hash": "b47412f3a52115b936ff2a229b803498c7b4d332adeb87c2f1498c9da54c398c", - "type": "crates-io" - } - }, - "miow": { - "0.3.7": { - "hash": "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21", - "type": "crates-io" - } - }, - "mopa": { - "0.2.2": { - "hash": "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915", - "type": "crates-io" - } - }, - "more-asserts": { - "0.2.2": { - "hash": "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389", - "type": "crates-io" - } - }, - "mumble-link": { - "0.1.0": { - "hash": "7a92ff7d87d3ca752fda7a1ccfcde284ea3de84fc8b8a0c43bf434652226bd95", - "type": "crates-io" - } - }, - "naga": { - "0.4.0": { - "ref": "refs/tags/gfx-25", - "rev": "057d03ad86f18e3bb3866b20901d8d4e892dd3d6", - "type": "git", - "url": "https://github.com/gfx-rs/naga" - } - }, - "native-dialog": { - "0.6.3": { - "hash": "0ab637f328b31bd0855c43bd38a4a4455e74324d9e74e0aac6a803422f43abc6", - "type": "crates-io" - } - }, - "ndk": { - "0.3.0": { - "hash": "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab", - "type": "crates-io" - }, - "0.6.0": { - "hash": "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4", - "type": "crates-io" - } - }, - "ndk-context": { - "0.1.0": { - "hash": "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884", - "type": "crates-io" - } - }, - "ndk-glue": { - "0.3.0": { - "hash": "c5caf0c24d51ac1c905c27d4eda4fa0635bbe0de596b8f79235e0b17a4d29385", - "type": "crates-io" - }, - "0.6.1": { - "hash": "d9ffb7443daba48349d545028777ca98853b018b4c16624aa01223bc29e078da", - "type": "crates-io" - } - }, - "ndk-macro": { - "0.2.0": { - "hash": "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d", - "type": "crates-io" - }, - "0.3.0": { - "hash": "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c", - "type": "crates-io" - } - }, - "ndk-sys": { - "0.2.2": { - "hash": "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121", - "type": "crates-io" - }, - "0.3.0": { - "hash": "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97", - "type": "crates-io" - } - }, - "nibble_vec": { - "0.1.0": { - "hash": "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43", - "type": "crates-io" - } - }, - "nix": { - "0.18.0": { - "hash": "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055", - "type": "crates-io" - }, - "0.20.0": { - "hash": "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a", - "type": "crates-io" - }, - "0.22.3": { - "hash": "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf", - "type": "crates-io" - }, - "0.23.1": { - "hash": "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6", - "type": "crates-io" - } - }, - "noise": { - "0.7.0": { - "hash": "82051dd6745d5184c6efb7bc8be14892a7f6d4f3ad6dbf754d1c7d7d5fe24b43", - "type": "crates-io" - } - }, - "nom": { - "4.2.3": { - "hash": "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6", - "type": "crates-io" - }, - "5.1.2": { - "hash": "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af", - "type": "crates-io" - }, - "7.1.1": { - "hash": "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36", - "type": "crates-io" - } - }, - "notify": { - "5.0.0-pre.15": { - "hash": "553f9844ad0b0824605c20fb55a661679782680410abfb1a8144c2e7e437e7a7", - "type": "crates-io" - } - }, - "ntapi": { - "0.3.7": { - "hash": "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f", - "type": "crates-io" - } - }, - "num": { - "0.2.1": { - "hash": "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36", - "type": "crates-io" - }, - "0.4.0": { - "hash": "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606", - "type": "crates-io" - } - }, - "num-bigint": { - "0.2.6": { - "hash": "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304", - "type": "crates-io" - }, - "0.4.3": { - "hash": "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f", - "type": "crates-io" - } - }, - "num-complex": { - "0.2.4": { - "hash": "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95", - "type": "crates-io" - }, - "0.4.0": { - "hash": "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085", - "type": "crates-io" - } - }, - "num-derive": { - "0.3.3": { - "hash": "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d", - "type": "crates-io" - } - }, - "num-integer": { - "0.1.44": { - "hash": "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db", - "type": "crates-io" - } - }, - "num-iter": { - "0.1.42": { - "hash": "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59", - "type": "crates-io" - } - }, - "num-rational": { - "0.2.4": { - "hash": "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef", - "type": "crates-io" - }, - "0.4.0": { - "hash": "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a", - "type": "crates-io" - } - }, - "num-traits": { - "0.2.14": { - "hash": "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290", - "type": "crates-io" - } - }, - "num_cpus": { - "1.13.1": { - "hash": "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1", - "type": "crates-io" - } - }, - "num_enum": { - "0.5.7": { - "hash": "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9", - "type": "crates-io" - } - }, - "num_enum_derive": { - "0.5.7": { - "hash": "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce", - "type": "crates-io" - } - }, - "num_threads": { - "0.1.5": { - "hash": "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0", - "type": "crates-io" - } - }, - "objc": { - "0.2.7": { - "hash": "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1", - "type": "crates-io" - } - }, - "objc-foundation": { - "0.1.1": { - "hash": "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9", - "type": "crates-io" - } - }, - "objc_exception": { - "0.1.2": { - "hash": "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4", - "type": "crates-io" - } - }, - "objc_id": { - "0.1.1": { - "hash": "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b", - "type": "crates-io" - } - }, - "object": { - "0.28.3": { - "hash": "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456", - "type": "crates-io" - } - }, - "oboe": { - "0.4.5": { - "hash": "2463c8f2e19b4e0d0710a21f8e4011501ff28db1c95d7a5482a553b2100502d2", - "type": "crates-io" - } - }, - "oboe-sys": { - "0.4.5": { - "hash": "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd", - "type": "crates-io" - } - }, - "ogg": { - "0.8.0": { - "hash": "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e", - "type": "crates-io" - } - }, - "once_cell": { - "1.10.0": { - "hash": "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9", - "type": "crates-io" - } - }, - "oorandom": { - "11.1.3": { - "hash": "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575", - "type": "crates-io" - } - }, - "openssl-probe": { - "0.1.5": { - "hash": "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf", - "type": "crates-io" - } - }, - "orbclient": { - "0.3.32": { - "hash": "2d3aa1482d3a9cb7547932f54a20910090073e81b3b7b236277c91698a10f83e", - "type": "crates-io" - } - }, - "ordered-float": { - "1.1.1": { - "hash": "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7", - "type": "crates-io" - }, - "2.10.0": { - "hash": "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87", - "type": "crates-io" - }, - "3.0.0": { - "hash": "96bcbab4bfea7a59c2c0fe47211a1ac4e3e96bea6eb446d704f310bc5c732ae2", - "type": "crates-io" - } - }, - "os_str_bytes": { - "6.0.0": { - "hash": "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64", - "type": "crates-io" - } - }, - "owned_ttf_parser": { - "0.15.0": { - "hash": "4fb1e509cfe7a12db2a90bfa057dfcdbc55a347f5da677c506b53dd099cfec9d", - "type": "crates-io" - }, - "0.6.0": { - "hash": "9f923fb806c46266c02ab4a5b239735c144bdeda724a50ed058e5226f594cde3", - "type": "crates-io" - } - }, - "packed_simd_2": { - "0.3.7": { - "hash": "defdcfef86dcc44ad208f71d9ff4ce28df6537a4e0d6b0e8e845cb8ca10059a6", - "type": "crates-io" - } - }, - "parking_lot": { - "0.10.2": { - "hash": "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e", - "type": "crates-io" - }, - "0.11.2": { - "hash": "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99", - "type": "crates-io" - }, - "0.12.0": { - "hash": "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58", - "type": "crates-io" - } - }, - "parking_lot_core": { - "0.7.2": { - "hash": "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3", - "type": "crates-io" - }, - "0.8.5": { - "hash": "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216", - "type": "crates-io" - }, - "0.9.2": { - "hash": "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37", - "type": "crates-io" - } - }, - "parse-zoneinfo": { - "0.3.0": { - "hash": "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41", - "type": "crates-io" - } - }, - "pdqselect": { - "0.1.0": { - "hash": "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27", - "type": "crates-io" - } - }, - "peeking_take_while": { - "0.1.2": { - "hash": "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099", - "type": "crates-io" - } - }, - "pem": { - "1.0.2": { - "hash": "e9a3b09a20e374558580a4914d3b7d89bd61b954a5a5e1dcbea98753addb1947", - "type": "crates-io" - } - }, - "percent-encoding": { - "2.1.0": { - "hash": "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e", - "type": "crates-io" - } - }, - "petgraph": { - "0.4.13": { - "hash": "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f", - "type": "crates-io" - }, - "0.5.1": { - "hash": "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7", - "type": "crates-io" - }, - "0.6.0": { - "hash": "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f", - "type": "crates-io" - } - }, - "phf": { - "0.10.1": { - "hash": "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259", - "type": "crates-io" - } - }, - "phf_codegen": { - "0.10.0": { - "hash": "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd", - "type": "crates-io" - } - }, - "phf_generator": { - "0.10.0": { - "hash": "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6", - "type": "crates-io" - } - }, - "phf_shared": { - "0.10.0": { - "hash": "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096", - "type": "crates-io" - } - }, - "pin-project-lite": { - "0.2.8": { - "hash": "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c", - "type": "crates-io" - } - }, - "pin-utils": { - "0.1.0": { - "hash": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184", - "type": "crates-io" - } - }, - "piston-float": { - "0.3.0": { - "hash": "b058c3a640efd4bcf63266512e4bb03187192c1b29edd38b16d5a014613e3199", - "type": "crates-io" - } - }, - "piston-viewport": { - "0.5.0": { - "hash": "7d96dd995f7dabe6d57cda668ec0fda39d6fe6e1e0b23f772582f383f2013611", - "type": "crates-io" - } - }, - "pistoncore-input": { - "0.24.0": { - "hash": "0c612ce242c7bac8e96426a0ca34275fd980af440f0cca7c6c0e840ef8a4052f", - "type": "crates-io" - } - }, - "pkg-config": { - "0.3.25": { - "hash": "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae", - "type": "crates-io" - } - }, - "plotters": { - "0.3.0": { - "hash": "45ca0ae5f169d0917a7c7f5a9c1a3d3d9598f18f529dd2b8373ed988efea307a", - "type": "crates-io" - } - }, - "plotters-backend": { - "0.3.2": { - "hash": "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c", - "type": "crates-io" - } - }, - "plotters-svg": { - "0.3.1": { - "hash": "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9", - "type": "crates-io" - } - }, - "png": { - "0.17.5": { - "hash": "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba", - "type": "crates-io" - } - }, - "portpicker": { - "0.1.0": { - "rev": "df6b37872f3586ac3b21d08b56c8ec7cd92fb172", - "type": "git", - "url": "https://github.com/xMAC94x/portpicker-rs" - } - }, - "ppv-lite86": { - "0.2.16": { - "hash": "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872", - "type": "crates-io" - } - }, - "proc-macro-crate": { - "0.1.5": { - "hash": "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785", - "type": "crates-io" - }, - "1.1.3": { - "hash": "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a", - "type": "crates-io" - } - }, - "proc-macro-error": { - "1.0.4": { - "hash": "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c", - "type": "crates-io" - } - }, - "proc-macro-error-attr": { - "1.0.4": { - "hash": "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869", - "type": "crates-io" - } - }, - "proc-macro-hack": { - "0.5.19": { - "hash": "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5", - "type": "crates-io" - } - }, - "proc-macro2": { - "0.4.30": { - "hash": "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759", - "type": "crates-io" - }, - "1.0.40": { - "hash": "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7", - "type": "crates-io" - } - }, - "profiling": { - "1.0.6": { - "hash": "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d", - "type": "crates-io" - } - }, - "profiling-procmacros": { - "1.0.6": { - "hash": "98eee3c112f2a6f784b6713fe1d7fb7d6506e066121c0a49371fdb976f72bae5", - "type": "crates-io" - } - }, - "prometheus": { - "0.13.0": { - "hash": "b7f64969ffd5dd8f39bd57a68ac53c163a095ed9d0fb707146da1b27025a3504", - "type": "crates-io" - } - }, - "prometheus-hyper": { - "0.1.4": { - "hash": "8726fd64f2941cc80d6739a7d001d756a22b660737839fd7b15202f5cb7f4bf6", - "type": "crates-io" - } - }, - "ptr_meta": { - "0.1.4": { - "hash": "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1", - "type": "crates-io" - } - }, - "ptr_meta_derive": { - "0.1.4": { - "hash": "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac", - "type": "crates-io" - } - }, - "quick-xml": { - "0.22.0": { - "hash": "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b", - "type": "crates-io" - } - }, - "quinn": { - "0.8.2": { - "hash": "d147472bc9a09f13b06c044787b6683cdffa02e2865b7f0fb53d67c49ed2988e", - "type": "crates-io" - } - }, - "quinn-proto": { - "0.8.2": { - "hash": "359c5eb33845f3ee05c229e65f87cdbc503eea394964b8f1330833d460b4ff3e", - "type": "crates-io" - } - }, - "quinn-udp": { - "0.1.1": { - "hash": "df185e5e5f7611fa6e628ed8f9633df10114b03bbaecab186ec55822c44ac727", - "type": "crates-io" - } - }, - "quote": { - "0.6.13": { - "hash": "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1", - "type": "crates-io" - }, - "1.0.20": { - "hash": "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804", - "type": "crates-io" - } - }, - "radium": { - "0.6.2": { - "hash": "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb", - "type": "crates-io" - } - }, - "radix_trie": { - "0.2.1": { - "hash": "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd", - "type": "crates-io" - } - }, - "rand": { - "0.7.3": { - "hash": "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03", - "type": "crates-io" - }, - "0.8.5": { - "hash": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404", - "type": "crates-io" - } - }, - "rand_chacha": { - "0.2.2": { - "hash": "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402", - "type": "crates-io" - }, - "0.3.1": { - "hash": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", - "type": "crates-io" - } - }, - "rand_core": { - "0.5.1": { - "hash": "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19", - "type": "crates-io" - }, - "0.6.3": { - "hash": "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7", - "type": "crates-io" - } - }, - "rand_distr": { - "0.4.3": { - "hash": "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31", - "type": "crates-io" - } - }, - "rand_hc": { - "0.2.0": { - "hash": "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c", - "type": "crates-io" - } - }, - "rand_xorshift": { - "0.2.0": { - "hash": "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8", - "type": "crates-io" - } - }, - "range-alloc": { - "0.1.2": { - "rev": "27a1dae3796d33d23812f2bb8c7e3b5aea18b521", - "type": "git", - "url": "https://github.com/gfx-rs/gfx" - } - }, - "raw-window-handle": { - "0.3.4": { - "hash": "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76", - "type": "crates-io" - }, - "0.4.3": { - "hash": "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41", - "type": "crates-io" - } - }, - "rayon": { - "1.5.1": { - "hash": "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90", - "type": "crates-io" - } - }, - "rayon-core": { - "1.9.1": { - "hash": "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e", - "type": "crates-io" - } - }, - "rcgen": { - "0.9.2": { - "hash": "d7fa2d386df8533b02184941c76ae2e0d0c1d053f5d43339169d80f21275fc5e", - "type": "crates-io" - } - }, - "redox_syscall": { - "0.1.57": { - "hash": "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce", - "type": "crates-io" - }, - "0.2.13": { - "hash": "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42", - "type": "crates-io" - } - }, - "redox_users": { - "0.4.3": { - "hash": "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b", - "type": "crates-io" - } - }, - "refinery": { - "0.5.0": { - "rev": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", - "type": "git", - "url": "https://gitlab.com/veloren/refinery.git" - } - }, - "refinery-core": { - "0.5.0": { - "rev": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", - "type": "git", - "url": "https://gitlab.com/veloren/refinery.git" - } - }, - "refinery-macros": { - "0.5.0": { - "rev": "8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e", - "type": "git", - "url": "https://gitlab.com/veloren/refinery.git" - } - }, - "regalloc": { - "0.0.31": { - "hash": "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5", - "type": "crates-io" - } - }, - "regex": { - "1.5.5": { - "hash": "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286", - "type": "crates-io" - } - }, - "regex-automata": { - "0.1.10": { - "hash": "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132", - "type": "crates-io" - } - }, - "regex-syntax": { - "0.6.25": { - "hash": "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b", - "type": "crates-io" - } - }, - "region": { - "3.0.0": { - "hash": "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e", - "type": "crates-io" - } - }, - "remove_dir_all": { - "0.5.3": { - "hash": "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7", - "type": "crates-io" - } - }, - "rend": { - "0.3.6": { - "hash": "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95", - "type": "crates-io" - } - }, - "renderdoc-sys": { - "0.7.1": { - "hash": "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157", - "type": "crates-io" - } - }, - "ring": { - "0.16.20": { - "hash": "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc", - "type": "crates-io" - } - }, - "rkyv": { - "0.7.37": { - "hash": "1f08c8062c1fe1253064043b8fc07bfea1b9702b71b4a86c11ea3588183b12e1", - "type": "crates-io" - } - }, - "rkyv_derive": { - "0.7.37": { - "hash": "e289706df51226e84814bf6ba1a9e1013112ae29bc7a9878f73fce360520c403", - "type": "crates-io" - } - }, - "rodio": { - "0.15.0": { - "hash": "ec0939e9f626e6c6f1989adb6226a039c855ca483053f0ee7c98b90e41cf731e", - "type": "crates-io" - } - }, - "ron": { - "0.6.6": { - "hash": "86018df177b1beef6c7c8ef949969c4f7cb9a9344181b92486b23c79995bdaa4", - "type": "crates-io" - }, - "0.7.0": { - "hash": "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678", - "type": "crates-io" - } - }, - "roots": { - "0.0.6": { - "hash": "84348444bd7ad45729d0c49a4240d7cdc11c9d512c06c5ad1835c1ad4acda6db", - "type": "crates-io" - } - }, - "rose_tree": { - "0.2.0": { - "hash": "284de9dae38774e2813aaabd7e947b4a6fe9b8c58c2309f754a487cdd50de1c2", - "type": "crates-io" - } - }, - "roxmltree": { - "0.14.1": { - "hash": "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b", - "type": "crates-io" - } - }, - "rstar": { - "0.9.2": { - "hash": "1fc6fc513b8c3853e43a0c3f909ded14ffa82e5170c9c5f6fb175f9c85c8a433", - "type": "crates-io" - } - }, - "rusqlite": { - "0.24.2": { - "hash": "d5f38ee71cbab2c827ec0ac24e76f82eca723cee92c509a65f67dee393c25112", - "type": "crates-io" - } - }, - "rust-argon2": { - "0.8.3": { - "hash": "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb", - "type": "crates-io" - } - }, - "rustc-demangle": { - "0.1.21": { - "hash": "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342", - "type": "crates-io" - } - }, - "rustc-hash": { - "1.1.0": { - "hash": "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", - "type": "crates-io" - } - }, - "rustc_version": { - "0.2.3": { - "hash": "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a", - "type": "crates-io" - }, - "0.4.0": { - "hash": "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366", - "type": "crates-io" - } - }, - "rustix": { - "0.34.1": { - "hash": "cd3cc851a13d30a34cb747ba2a0c5101a4b2e8b1677a29b213ee465365ea495e", - "type": "crates-io" - } - }, - "rustls": { - "0.19.1": { - "hash": "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7", - "type": "crates-io" - }, - "0.20.4": { - "hash": "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921", - "type": "crates-io" - } - }, - "rustls-native-certs": { - "0.5.0": { - "hash": "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092", - "type": "crates-io" - }, - "0.6.1": { - "hash": "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943", - "type": "crates-io" - } - }, - "rustls-pemfile": { - "0.2.1": { - "hash": "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9", - "type": "crates-io" - }, - "1.0.0": { - "hash": "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9", - "type": "crates-io" - } - }, - "rusttype": { - "0.7.9": { - "hash": "310942406a39981bed7e12b09182a221a29e0990f3e7e0c971f131922ed135d5", - "type": "crates-io" - }, - "0.8.3": { - "hash": "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0", - "type": "crates-io" - }, - "0.9.2": { - "hash": "dc7c727aded0be18c5b80c1640eae0ac8e396abf6fa8477d96cb37d18ee5ec59", - "type": "crates-io" - } - }, - "rustversion": { - "1.0.6": { - "hash": "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f", - "type": "crates-io" - } - }, - "rusty-xinput": { - "1.2.0": { - "hash": "d2aa654bc32eb9ca14cce1a084abc9dfe43949a4547c35269a094c39272db3bb", - "type": "crates-io" - } - }, - "rustyline": { - "9.1.2": { - "hash": "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039", - "type": "crates-io" - } - }, - "ryu": { - "1.0.9": { - "hash": "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f", - "type": "crates-io" - } - }, - "same-file": { - "1.0.6": { - "hash": "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", - "type": "crates-io" - } - }, - "schannel": { - "0.1.19": { - "hash": "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75", - "type": "crates-io" - } - }, - "scoped-tls": { - "1.0.0": { - "hash": "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2", - "type": "crates-io" - } - }, - "scopeguard": { - "1.1.0": { - "hash": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd", - "type": "crates-io" - } - }, - "sct": { - "0.6.1": { - "hash": "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce", - "type": "crates-io" - }, - "0.7.0": { - "hash": "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4", - "type": "crates-io" - } - }, - "sdl2": { - "0.35.2": { - "hash": "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a", - "type": "crates-io" - } - }, - "sdl2-sys": { - "0.35.2": { - "hash": "e3586be2cf6c0a8099a79a12b4084357aa9b3e0b0d7980e3b67aaf7a9d55f9f0", - "type": "crates-io" - } - }, - "seahash": { - "4.1.0": { - "hash": "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b", - "type": "crates-io" - } - }, - "security-framework": { - "2.6.1": { - "hash": "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc", - "type": "crates-io" - } - }, - "security-framework-sys": { - "2.6.1": { - "hash": "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556", - "type": "crates-io" - } - }, - "self_cell": { - "0.10.2": { - "hash": "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af", - "type": "crates-io" - } - }, - "semver": { - "0.9.0": { - "hash": "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403", - "type": "crates-io" - }, - "1.0.7": { - "hash": "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4", - "type": "crates-io" - } - }, - "semver-parser": { - "0.7.0": { - "hash": "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3", - "type": "crates-io" - } - }, - "serde": { - "1.0.136": { - "hash": "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789", - "type": "crates-io" - } - }, - "serde_bytes": { - "0.11.5": { - "hash": "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9", - "type": "crates-io" - } - }, - "serde_cbor": { - "0.11.2": { - "hash": "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5", - "type": "crates-io" - } - }, - "serde_derive": { - "1.0.136": { - "hash": "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9", - "type": "crates-io" - } - }, - "serde_json": { - "1.0.79": { - "hash": "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95", - "type": "crates-io" - } - }, - "serde_repr": { - "0.1.7": { - "hash": "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5", - "type": "crates-io" - } - }, - "sha1": { - "0.6.1": { - "hash": "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770", - "type": "crates-io" - } - }, - "sha1_smol": { - "1.0.0": { - "hash": "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012", - "type": "crates-io" - } - }, - "sha2": { - "0.10.2": { - "hash": "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676", - "type": "crates-io" - } - }, - "shaderc": { - "0.8.0": { - "hash": "80e6fe602a861622769530a23bc40bfba31adbf186d0c8412e83f5519c5d6bee", - "type": "crates-io" - } - }, - "shaderc-sys": { - "0.8.0": { - "hash": "3794498651f8173d0afbc0bb8aca45ced111098227e755dde4c0ef2888c8d0bf", - "type": "crates-io" - } - }, - "sharded-slab": { - "0.1.4": { - "hash": "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31", - "type": "crates-io" - } - }, - "shell-words": { - "1.1.0": { - "hash": "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde", - "type": "crates-io" - } - }, - "shellexpand": { - "2.1.0": { - "hash": "83bdb7831b2d85ddf4a7b148aa19d0587eddbe8671a436b7bd1182eaad0f2829", - "type": "crates-io" - } - }, - "shlex": { - "0.1.1": { - "hash": "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2", - "type": "crates-io" - } - }, - "shred": { - "0.13.0": { - "hash": "102269e720bb814df57e136161cad841f2b6f411e003ac748fc48aaf2363bea3", - "type": "crates-io" - } - }, - "shred-derive": { - "0.6.3": { - "hash": "d5404c36bd155e41a54276ab6aafedad2fb627e5e5849d36ec439c9ddc044a2f", - "type": "crates-io" - } - }, - "shrev": { - "1.1.1": { - "hash": "b5752e017e03af9d735b4b069f53b7a7fd90fefafa04d8bd0c25581b0bff437f", - "type": "crates-io" - } - }, - "signal-hook": { - "0.1.17": { - "hash": "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729", - "type": "crates-io" - }, - "0.3.13": { - "hash": "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d", - "type": "crates-io" - } - }, - "signal-hook-mio": { - "0.2.3": { - "hash": "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af", - "type": "crates-io" - } - }, - "signal-hook-registry": { - "1.4.0": { - "hash": "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0", - "type": "crates-io" - } - }, - "siphasher": { - "0.3.10": { - "hash": "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de", - "type": "crates-io" - } - }, - "slab": { - "0.4.6": { - "hash": "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32", - "type": "crates-io" - } - }, - "slotmap": { - "0.4.3": { - "hash": "6bf34684c5767b87de9119790e92e9a1d60056be2ceeaf16a8e6ef13082aeab1", - "type": "crates-io" - }, - "1.0.6": { - "hash": "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342", - "type": "crates-io" - } - }, - "smallvec": { - "1.8.0": { - "hash": "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83", - "type": "crates-io" - } - }, - "smithay-client-toolkit": { - "0.12.3": { - "hash": "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80", - "type": "crates-io" - }, - "0.15.3": { - "hash": "1325f292209cee78d5035530932422a30aa4c8fda1a16593ac083c1de211e68a", - "type": "crates-io" - } - }, - "smithay-clipboard": { - "0.6.5": { - "hash": "610b551bd25378bfd2b8e7a0fcbd83d427e8f2f6a40c47ae0f70688e9949dd55", - "type": "crates-io" - } - }, - "socket2": { - "0.4.4": { - "hash": "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0", - "type": "crates-io" - } - }, - "specs": { - "0.18.0": { - "hash": "4ea85dac2880f84d4025ff5ace80cda6d8bc43bc88b6a389b9277fcf894b51e9", - "type": "crates-io" - } - }, - "specs-derive": { - "0.4.1": { - "hash": "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511", - "type": "crates-io" - } - }, - "spin": { - "0.5.2": { - "hash": "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d", - "type": "crates-io" - } - }, - "spin_sleep": { - "1.1.1": { - "hash": "cafa7900db085f4354dbc7025e25d7a839a14360ea13b5fc4fd717f2d3b23134", - "type": "crates-io" - } - }, - "spirv_cross": { - "0.23.1": { - "hash": "60647fadbf83c4a72f0d7ea67a7ca3a81835cf442b8deae5c134c3e0055b2e14", - "type": "crates-io" - } - }, - "spirv_headers": { - "1.5.0": { - "hash": "1f5b132530b1ac069df335577e3581765995cba5a13995cdbbdbc8fb057c532c", - "type": "crates-io" - } - }, - "stable_deref_trait": { - "1.2.0": { - "hash": "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3", - "type": "crates-io" - } - }, - "static_assertions": { - "1.1.0": { - "hash": "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f", - "type": "crates-io" - } - }, - "stb_truetype": { - "0.3.1": { - "hash": "f77b6b07e862c66a9f3e62a07588fee67cd90a9135a2b942409f195507b4fb51", - "type": "crates-io" - } - }, - "stdweb": { - "0.1.3": { - "hash": "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e", - "type": "crates-io" - }, - "0.4.20": { - "hash": "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5", - "type": "crates-io" - } - }, - "stdweb-derive": { - "0.5.3": { - "hash": "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef", - "type": "crates-io" - } - }, - "stdweb-internal-macros": { - "0.2.9": { - "hash": "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11", - "type": "crates-io" - } - }, - "stdweb-internal-runtime": { - "0.1.5": { - "hash": "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0", - "type": "crates-io" - } - }, - "storage-map": { - "0.3.0": { - "hash": "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c", - "type": "crates-io" - } - }, - "str-buf": { - "1.0.5": { - "hash": "d44a3643b4ff9caf57abcee9c2c621d6c03d9135e0d8b589bd9afb5992cb176a", - "type": "crates-io" - } - }, - "strsim": { - "0.10.0": { - "hash": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", - "type": "crates-io" - }, - "0.8.0": { - "hash": "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a", - "type": "crates-io" - }, - "0.9.3": { - "hash": "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c", - "type": "crates-io" - } - }, - "structopt": { - "0.3.26": { - "hash": "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10", - "type": "crates-io" - } - }, - "structopt-derive": { - "0.4.18": { - "hash": "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0", - "type": "crates-io" - } - }, - "strum": { - "0.24.0": { - "hash": "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8", - "type": "crates-io" - } - }, - "strum_macros": { - "0.24.0": { - "hash": "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef", - "type": "crates-io" - } - }, - "sum_type": { - "0.2.0": { - "hash": "da5b4a0c9f3c7c8e891e445a7c776627e208e8bba23ab680798066dd283e6a15", - "type": "crates-io" - } - }, - "svg_fmt": { - "0.4.1": { - "hash": "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2", - "type": "crates-io" - } - }, - "syn": { - "0.15.44": { - "hash": "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5", - "type": "crates-io" - }, - "1.0.98": { - "hash": "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd", - "type": "crates-io" - } - }, - "tap": { - "1.0.1": { - "hash": "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369", - "type": "crates-io" - } - }, - "tar": { - "0.4.38": { - "hash": "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6", - "type": "crates-io" - } - }, - "target-lexicon": { - "0.12.3": { - "hash": "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1", - "type": "crates-io" - } - }, - "tempfile": { - "3.3.0": { - "hash": "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4", - "type": "crates-io" - } - }, - "termcolor": { - "1.1.3": { - "hash": "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755", - "type": "crates-io" - } - }, - "textwrap": { - "0.11.0": { - "hash": "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060", - "type": "crates-io" - }, - "0.15.0": { - "hash": "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb", - "type": "crates-io" - } - }, - "thiserror": { - "1.0.30": { - "hash": "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417", - "type": "crates-io" - } - }, - "thiserror-impl": { - "1.0.30": { - "hash": "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b", - "type": "crates-io" - } - }, - "thread_local": { - "1.1.4": { - "hash": "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180", - "type": "crates-io" - } - }, - "thunderdome": { - "0.4.2": { - "hash": "f685624f172cd0bde6f3363412455e81c018f2379fdf5a218e0be003f1bba642", - "type": "crates-io" - } - }, - "time": { - "0.1.44": { - "hash": "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255", - "type": "crates-io" - }, - "0.3.9": { - "hash": "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd", - "type": "crates-io" - } - }, - "tiny-keccak": { - "2.0.2": { - "hash": "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237", - "type": "crates-io" - } - }, - "tinystr": { - "0.3.4": { - "hash": "29738eedb4388d9ea620eeab9384884fc3f06f586a2eddb56bedc5885126c7c1", - "type": "crates-io" - } - }, - "tinytemplate": { - "1.2.1": { - "hash": "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc", - "type": "crates-io" - } - }, - "tinyvec": { - "1.5.1": { - "hash": "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2", - "type": "crates-io" - } - }, - "tinyvec_macros": { - "0.1.0": { - "hash": "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c", - "type": "crates-io" - } - }, - "tokio": { - "1.17.0": { - "hash": "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee", - "type": "crates-io" - } - }, - "tokio-macros": { - "1.7.0": { - "hash": "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7", - "type": "crates-io" - } - }, - "tokio-rustls": { - "0.22.0": { - "hash": "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6", - "type": "crates-io" - } - }, - "tokio-stream": { - "0.1.8": { - "hash": "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3", - "type": "crates-io" - } - }, - "tokio-util": { - "0.7.1": { - "hash": "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764", - "type": "crates-io" - } - }, - "toml": { - "0.5.8": { - "hash": "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa", - "type": "crates-io" - } - }, - "tower-service": { - "0.3.1": { - "hash": "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6", - "type": "crates-io" - } - }, - "tracing": { - "0.1.32": { - "hash": "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f", - "type": "crates-io" - } - }, - "tracing-appender": { - "0.2.2": { - "hash": "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e", - "type": "crates-io" - } - }, - "tracing-attributes": { - "0.1.20": { - "hash": "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b", - "type": "crates-io" - } - }, - "tracing-core": { - "0.1.24": { - "hash": "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee", - "type": "crates-io" - } - }, - "tracing-log": { - "0.1.2": { - "hash": "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3", - "type": "crates-io" - } - }, - "tracing-subscriber": { - "0.3.10": { - "hash": "b9df98b037d039d03400d9dd06b0f8ce05486b5f25e9a2d7d36196e142ebbc52", - "type": "crates-io" - } - }, - "tracing-tracy": { - "0.9.0": { - "hash": "23a42311a35ed976d72f359de43e9fe028ec9d9f1051c4c52bd05a4f66ff3cbf", - "type": "crates-io" - } - }, - "tracy-client": { - "0.13.2": { - "hash": "42ebfe7a24c18b5ba86d8920c124b41b942352f863fbe0c84d3d63428fa1860f", - "type": "crates-io" - } - }, - "tracy-client-sys": { - "0.17.0": { - "hash": "9012b9dfeccaff16e93f5a8b02336125113a80a769902e679d334cbdd4d83f3b", - "type": "crates-io" - } - }, - "treeculler": { - "0.2.0": { - "hash": "82449b48a3494420dd1b11081f198c542f795a036246da4a9c5845b7d7427226", - "type": "crates-io" - } - }, - "try-lock": { - "0.2.3": { - "hash": "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642", - "type": "crates-io" - } - }, - "ttf-parser": { - "0.15.0": { - "hash": "c74c96594835e10fa545e2a51e8709f30b173a092bfd6036ef2cec53376244f3", - "type": "crates-io" - }, - "0.6.2": { - "hash": "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc", - "type": "crates-io" - } - }, - "tui": { - "0.10.0": { - "ref": "refs/heads/paragraph-scroll", - "rev": "54b841fab6cfdb38e8dc1382176e965787964b4c", - "type": "git", - "url": "https://github.com/fdehau/tui-rs.git" - } - }, - "tuple_utils": { - "0.4.0": { - "hash": "cffaaf9392ef73cd30828797152476aaa2fa37a17856934fa63d4843f34290e9", - "type": "crates-io" - } - }, - "twox-hash": { - "1.6.2": { - "hash": "4ee73e6e4924fe940354b8d4d98cad5231175d615cd855b758adc658c0aac6a0", - "type": "crates-io" - } - }, - "tynm": { - "0.1.6": { - "hash": "a4df2caa2dc9c3d1f7641ba981f4cd40ab229775aa7aeb834c9ab2850d50623d", - "type": "crates-io" - } - }, - "type-map": { - "0.5.0": { - "hash": "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f", - "type": "crates-io" - } - }, - "typenum": { - "1.15.0": { - "hash": "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987", - "type": "crates-io" - } - }, - "uncased": { - "0.9.6": { - "hash": "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0", - "type": "crates-io" - } - }, - "unic-langid": { - "0.9.0": { - "hash": "73328fcd730a030bdb19ddf23e192187a6b01cd98be6d3140622a89129459ce5", - "type": "crates-io" - } - }, - "unic-langid-impl": { - "0.9.0": { - "hash": "1a4a8eeaf0494862c1404c95ec2f4c33a2acff5076f64314b465e3ddae1b934d", - "type": "crates-io" - } - }, - "unicode-bidi": { - "0.3.7": { - "hash": "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f", - "type": "crates-io" - } - }, - "unicode-ident": { - "1.0.1": { - "hash": "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c", - "type": "crates-io" - } - }, - "unicode-normalization": { - "0.1.19": { - "hash": "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9", - "type": "crates-io" - } - }, - "unicode-segmentation": { - "1.9.0": { - "hash": "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99", - "type": "crates-io" - } - }, - "unicode-width": { - "0.1.9": { - "hash": "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973", - "type": "crates-io" - } - }, - "unicode-xid": { - "0.1.0": { - "hash": "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc", - "type": "crates-io" - } - }, - "untrusted": { - "0.7.1": { - "hash": "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a", - "type": "crates-io" - } - }, - "url": { - "2.2.2": { - "hash": "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c", - "type": "crates-io" - } - }, - "utf8parse": { - "0.2.0": { - "hash": "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372", - "type": "crates-io" - } - }, - "uuid": { - "0.8.2": { - "hash": "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7", - "type": "crates-io" - } - }, - "valuable": { - "0.1.0": { - "hash": "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d", - "type": "crates-io" - } - }, - "vcpkg": { - "0.2.15": { - "hash": "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426", - "type": "crates-io" - } - }, - "vec_map": { - "0.8.2": { - "hash": "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191", - "type": "crates-io" - } - }, - "vek": { - "0.14.1": { - "hash": "04d6626f32b226e2c5b35f23ea87eaf683f3d93eaeb16b4084d0683479616f0f", - "type": "crates-io" - }, - "0.15.8": { - "rev": "84d5cb65841d46599a986c5477341bea4456be26", - "type": "git", - "url": "https://github.com/yoanlcq/vek.git" - } - }, - "veloren-client": { - "0.13.0": { - "path": "client", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common": { - "0.10.0": { - "path": "", - "rootName": null, - "rootVersion": null, - "type": "path" - } - }, - "veloren-common-assets": { - "0.10.0": { - "path": "common/assets", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common-base": { - "0.10.0": { - "path": "common/base", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common-ecs": { - "0.10.0": { - "path": "common/ecs", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common-frontend": { - "0.10.0": { - "path": "common/frontend", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common-net": { - "0.10.0": { - "path": "common/net", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common-state": { - "0.10.0": { - "path": "common/state", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-common-systems": { - "0.10.0": { - "path": "common/systems", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-network": { - "0.3.0": { - "path": "network", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-network-protocol": { - "0.6.1": { - "path": "network/protocol", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-plugin-api": { - "0.1.0": { - "path": "plugin/api", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-plugin-derive": { - "0.1.0": { - "path": "plugin/derive", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-plugin-rt": { - "0.1.0": { - "path": "plugin/rt", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-server": { - "0.13.0": { - "path": "server", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-server-cli": { - "0.13.0": { - "path": "server-cli", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen": { - "0.13.0": { - "path": "voxygen", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen-anim": { - "0.10.0": { - "path": "voxygen/anim", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen-anim-dyn": { - "0.10.0": { - "path": "voxygen/anim/dyn", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen-dynlib": { - "0.1.0": { - "path": "voxygen/dynlib", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen-egui": { - "0.9.0": { - "path": "voxygen/egui", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen-egui-dyn": { - "0.9.0": { - "path": "voxygen/egui/dyn", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-voxygen-i18n": { - "0.13.0": { - "path": "voxygen/i18n", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "veloren-world": { - "0.10.0": { - "path": "world", - "rootName": "veloren-common", - "rootVersion": "0.10.0", - "type": "path" - } - }, - "version-compare": { - "0.1.0": { - "hash": "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73", - "type": "crates-io" - } - }, - "version_check": { - "0.1.5": { - "hash": "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd", - "type": "crates-io" - }, - "0.9.4": { - "hash": "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f", - "type": "crates-io" - } - }, - "walkdir": { - "0.1.8": { - "hash": "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780", - "type": "crates-io" - }, - "2.3.2": { - "hash": "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56", - "type": "crates-io" - } - }, - "want": { - "0.3.0": { - "hash": "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0", - "type": "crates-io" - } - }, - "wasi": { - "0.10.0+wasi-snapshot-preview1": { - "hash": "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f", - "type": "crates-io" - }, - "0.11.0+wasi-snapshot-preview1": { - "hash": "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423", - "type": "crates-io" - }, - "0.9.0+wasi-snapshot-preview1": { - "hash": "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519", - "type": "crates-io" - } - }, - "wasm-bindgen": { - "0.2.79": { - "hash": "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06", - "type": "crates-io" - } - }, - "wasm-bindgen-backend": { - "0.2.79": { - "hash": "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca", - "type": "crates-io" - } - }, - "wasm-bindgen-futures": { - "0.4.29": { - "hash": "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395", - "type": "crates-io" - } - }, - "wasm-bindgen-macro": { - "0.2.79": { - "hash": "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01", - "type": "crates-io" - } - }, - "wasm-bindgen-macro-support": { - "0.2.79": { - "hash": "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc", - "type": "crates-io" - } - }, - "wasm-bindgen-shared": { - "0.2.79": { - "hash": "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2", - "type": "crates-io" - } - }, - "wasmer": { - "2.2.1": { - "hash": "f727a39e7161f7438ddb8eafe571b67c576a8c2fb459f666d9053b5bba4afdea", - "type": "crates-io" - } - }, - "wasmer-compiler": { - "2.2.1": { - "hash": "4e9951599222eb12bd13d4d91bcded0a880e4c22c2dfdabdf5dc7e5e803b7bf3", - "type": "crates-io" - } - }, - "wasmer-compiler-cranelift": { - "2.2.1": { - "hash": "44c83273bce44e668f3a2b9ccb7f1193db918b1d6806f64acc5ff71f6ece5f20", - "type": "crates-io" - } - }, - "wasmer-derive": { - "2.2.1": { - "hash": "458dbd9718a837e6dbc52003aef84487d79eedef5fa28c7d28b6784be98ac08e", - "type": "crates-io" - } - }, - "wasmer-engine": { - "2.2.1": { - "hash": "6ed603a6d037ebbb14014d7f739ae996a78455a4b86c41cfa4e81c590a1253b9", - "type": "crates-io" - } - }, - "wasmer-engine-dylib": { - "2.2.1": { - "hash": "ccd7fdc60e252a795c849b3f78a81a134783051407e7e279c10b7019139ef8dc", - "type": "crates-io" - } - }, - "wasmer-engine-universal": { - "2.2.1": { - "hash": "dcff0cd2c01a8de6009fd863b14ea883132a468a24f2d2ee59dc34453d3a31b5", - "type": "crates-io" - } - }, - "wasmer-object": { - "2.2.1": { - "hash": "24ce18ac2877050e59580d27ee1a88f3192d7a31e77fbba0852abc7888d6e0b5", - "type": "crates-io" - } - }, - "wasmer-types": { - "2.2.1": { - "hash": "659fa3dd6c76f62630deff4ac8c7657b07f0b1e4d7e0f8243a552b9d9b448e24", - "type": "crates-io" - } - }, - "wasmer-vm": { - "2.2.1": { - "hash": "afdc46158517c2769f9938bc222a7d41b3bb330824196279d8aa2d667cd40641", - "type": "crates-io" - } - }, - "wasmparser": { - "0.78.2": { - "hash": "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65", - "type": "crates-io" - } - }, - "wast": { - "39.0.0": { - "hash": "e9bbbd53432b267421186feee3e52436531fa69a7cfee9403f5204352df3dd05", - "type": "crates-io" - } - }, - "wat": { - "1.0.41": { - "hash": "ab98ed25494f97c69f28758617f27c3e92e5336040b5c3a14634f2dd3fe61830", - "type": "crates-io" - } - }, - "wavefront": { - "0.2.2": { - "hash": "249b7e6cd5bd1cc78a61d0475e5790c98bebabf2dc644a94a51ad58b39298652", - "type": "crates-io" - } - }, - "wayland-client": { - "0.28.6": { - "hash": "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355", - "type": "crates-io" - }, - "0.29.4": { - "hash": "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f", - "type": "crates-io" - } - }, - "wayland-commons": { - "0.28.6": { - "hash": "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda", - "type": "crates-io" - }, - "0.29.4": { - "hash": "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e", - "type": "crates-io" - } - }, - "wayland-cursor": { - "0.28.6": { - "hash": "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a", - "type": "crates-io" - }, - "0.29.4": { - "hash": "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd", - "type": "crates-io" - } - }, - "wayland-protocols": { - "0.28.6": { - "hash": "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f", - "type": "crates-io" - }, - "0.29.4": { - "hash": "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741", - "type": "crates-io" - } - }, - "wayland-scanner": { - "0.28.6": { - "hash": "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1", - "type": "crates-io" - }, - "0.29.4": { - "hash": "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0", - "type": "crates-io" - } - }, - "wayland-sys": { - "0.28.6": { - "hash": "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8", - "type": "crates-io" - }, - "0.29.4": { - "hash": "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4", - "type": "crates-io" - } - }, - "web-sys": { - "0.3.50": { - "hash": "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be", - "type": "crates-io" - } - }, - "webpki": { - "0.21.4": { - "hash": "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea", - "type": "crates-io" - }, - "0.22.0": { - "hash": "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd", - "type": "crates-io" - } - }, - "wfd": { - "0.1.7": { - "hash": "e713040b67aae5bf1a0ae3e1ebba8cc29ab2b90da9aa1bff6e09031a8a41d7a8", - "type": "crates-io" - } - }, - "wgpu": { - "0.8.0": { - "rev": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", - "type": "git", - "url": "https://github.com/gfx-rs/wgpu.git" - } - }, - "wgpu-core": { - "0.8.0": { - "rev": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", - "type": "git", - "url": "https://github.com/gfx-rs/wgpu.git" - } - }, - "wgpu-profiler": { - "0.4.0": { - "ref": "refs/tags/wgpu-0.8", - "rev": "b156eb145bc223386ef344860d9b33b3c181650c", - "type": "git", - "url": "https://github.com/Imberflur/wgpu-profiler" - } - }, - "wgpu-types": { - "0.8.0": { - "rev": "a92b8549a8e2cb9dac781bafc5ed32828f3caf46", - "type": "git", - "url": "https://github.com/gfx-rs/wgpu.git" - } - }, - "which": { - "3.1.1": { - "hash": "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724", - "type": "crates-io" - }, - "4.2.5": { - "hash": "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae", - "type": "crates-io" - } - }, - "winapi": { - "0.2.8": { - "hash": "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a", - "type": "crates-io" - }, - "0.3.9": { - "hash": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "type": "crates-io" - } - }, - "winapi-build": { - "0.1.1": { - "hash": "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc", - "type": "crates-io" - } - }, - "winapi-i686-pc-windows-gnu": { - "0.4.0": { - "hash": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", - "type": "crates-io" - } - }, - "winapi-util": { - "0.1.5": { - "hash": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", - "type": "crates-io" - } - }, - "winapi-wsapoll": { - "0.1.1": { - "hash": "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e", - "type": "crates-io" - } - }, - "winapi-x86_64-pc-windows-gnu": { - "0.4.0": { - "hash": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", - "type": "crates-io" - } - }, - "window_clipboard": { - "0.2.2": { - "hash": "086ed826cc4468377b6b995300d5f7f852a2fe1eb02e6cd1ccd4a574deb9d310", - "type": "crates-io" - } - }, - "windows-sys": { - "0.30.0": { - "hash": "030b7ff91626e57a05ca64a07c481973cbb2db774e4852c9c7ca342408c6a99a", - "type": "crates-io" - }, - "0.34.0": { - "hash": "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825", - "type": "crates-io" - } - }, - "windows_aarch64_msvc": { - "0.30.0": { - "hash": "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca", - "type": "crates-io" - }, - "0.34.0": { - "hash": "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d", - "type": "crates-io" - } - }, - "windows_i686_gnu": { - "0.30.0": { - "hash": "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8", - "type": "crates-io" - }, - "0.34.0": { - "hash": "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed", - "type": "crates-io" - } - }, - "windows_i686_msvc": { - "0.30.0": { - "hash": "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6", - "type": "crates-io" - }, - "0.34.0": { - "hash": "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956", - "type": "crates-io" - } - }, - "windows_x86_64_gnu": { - "0.30.0": { - "hash": "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a", - "type": "crates-io" - }, - "0.34.0": { - "hash": "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4", - "type": "crates-io" - } - }, - "windows_x86_64_msvc": { - "0.30.0": { - "hash": "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1", - "type": "crates-io" - }, - "0.34.0": { - "hash": "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9", - "type": "crates-io" - } - }, - "winit": { - "0.25.0": { - "hash": "79610794594d5e86be473ef7763f604f2159cbac8c94debd00df8fb41e86c2f8", - "type": "crates-io" - } - }, - "winreg": { - "0.10.1": { - "hash": "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d", - "type": "crates-io" - } - }, - "winres": { - "0.1.12": { - "hash": "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c", - "type": "crates-io" - } - }, - "wio": { - "0.2.2": { - "hash": "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5", - "type": "crates-io" - } - }, - "wyz": { - "0.4.0": { - "hash": "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188", - "type": "crates-io" - } - }, - "x11-clipboard": { - "0.5.3": { - "hash": "473068b7b80ac86a18328824f1054e5e007898c47b5bbc281bd7abe32bc3653c", - "type": "crates-io" - } - }, - "x11-dl": { - "2.19.1": { - "hash": "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59", - "type": "crates-io" - } - }, - "x11rb": { - "0.8.1": { - "hash": "6ffb080b3f2f616242a4eb8e7d325035312127901025b0052bc3154a282d0f19", - "type": "crates-io" - } - }, - "xattr": { - "0.2.2": { - "hash": "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c", - "type": "crates-io" - } - }, - "xcb": { - "0.10.1": { - "hash": "771e2b996df720cd1c6dd9ff90f62d91698fd3610cc078388d0564bdd6622a9c", - "type": "crates-io" - }, - "0.9.0": { - "hash": "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6", - "type": "crates-io" - } - }, - "xcursor": { - "0.3.4": { - "hash": "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7", - "type": "crates-io" - } - }, - "xdg": { - "2.4.1": { - "hash": "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6", - "type": "crates-io" - } - }, - "xi-unicode": { - "0.3.0": { - "hash": "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a", - "type": "crates-io" - } - }, - "xkb": { - "0.2.1": { - "hash": "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2", - "type": "crates-io" - } - }, - "xkbcommon-sys": { - "0.7.5": { - "hash": "59a001b79d45b0b4541c228a501177f2b35db976bf7ee3f7fce8fa2381554ab5", - "type": "crates-io" - }, - "0.7.6": { - "rev": "8f615dd6cd90a4ab77c45627830dde49b592b9b5", - "type": "git", - "url": "https://github.com/Frinksy/rust-xkbcommon-sys.git" - } - }, - "xml-rs": { - "0.8.4": { - "hash": "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3", - "type": "crates-io" - } - }, - "xmlparser": { - "0.13.3": { - "hash": "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8", - "type": "crates-io" - } - }, - "yasna": { - "0.5.0": { - "hash": "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c", - "type": "crates-io" - } - } - } -} diff --git a/flake.nix b/flake.nix index 27a5ffb48e..885d2aa0da 100644 --- a/flake.nix +++ b/flake.nix @@ -51,17 +51,6 @@ then sourceInfo.tag else ""; - # If gitTag has a tag (meaning the commit we are on is a *release*), use - # it as version, else: just use the prettified hash we have, if we don't - # have it the build fails. - # Must be in format f4987672/2020-12-10-12:00 - version = - if tag != "" - then tag - else if prettyRev != "" - then prettyRev - else throw "Need a tag or pretty revision in order to determine version"; - veloren-assets = pkgs.runCommand "makeAssetsDir" {} '' mkdir $out ln -sf ${./assets} $out/assets @@ -92,7 +81,26 @@ ''; }; veloren-voxygen = oldAttrs: { - inherit version; + src = builtins.path { + name = "veloren-source"; + path = toString ./.; + # filter out unnecessary paths + filter = path: type: + lib.all + (n: builtins.baseNameOf path != n) + [ + "flake.nix" + "flake.lock" + "nix" + "assets" + "README.md" + "CONTRIBUTING.md" + "CHANGELOG.md" + "CODE_OF_CONDUCT.md" + "clippy.toml" + "server-cli" + ]; + }; buildInputs = (oldAttrs.buildInputs or []) From b442b016a63cf9c29adba0af199d865fab9955e9 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Fri, 2 Sep 2022 23:15:48 +0300 Subject: [PATCH 171/854] build(nix): add source filtering for server-cli, use mold for server-cli too --- flake.lock | 6 +++--- flake.nix | 63 ++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/flake.lock b/flake.lock index f767ca2f67..43245c58e1 100644 --- a/flake.lock +++ b/flake.lock @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662143940, - "narHash": "sha256-3eJfehnZLWJGXylfpAMeLR0Q3sx8pAjGiHBQPqOH9+U=", + "lastModified": 1662158571, + "narHash": "sha256-w+iLHikl1gdbzT9bM5Iu8u9k6/e2LljoTLyTWO0c0nk=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "e83f2598aecbe1114783ff9bdae0b85939de35a3", + "rev": "013350ad83767cf359882e900de381a624445947", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 885d2aa0da..c567314bd9 100644 --- a/flake.nix +++ b/flake.nix @@ -63,6 +63,30 @@ rustflags = ["-C", "link-arg=-fuse-ld=${lib.getExe pkgs.mold}"] EOF ''; + + pathsToIgnore = [ + "flake.nix" + "flake.lock" + "nix" + "assets" + "README.md" + "CONTRIBUTING.md" + "CHANGELOG.md" + "CODE_OF_CONDUCT.md" + "clippy.toml" + ]; + ignorePaths = path: type: let + split = lib.splitString "/" path; + actual = lib.drop 4 split; + _path = lib.concatStringsSep "/" actual; + in + lib.all (n: ! (lib.hasPrefix n _path)) pathsToIgnore; + filteredSource = builtins.path { + name = "veloren-source"; + path = toString ./.; + # filter out unnecessary paths + filter = ignorePaths; + }; in { veloren-common = oldAttrs: { # Disable `git-lfs` check here since we check it ourselves @@ -81,26 +105,7 @@ ''; }; veloren-voxygen = oldAttrs: { - src = builtins.path { - name = "veloren-source"; - path = toString ./.; - # filter out unnecessary paths - filter = path: type: - lib.all - (n: builtins.baseNameOf path != n) - [ - "flake.nix" - "flake.lock" - "nix" - "assets" - "README.md" - "CONTRIBUTING.md" - "CHANGELOG.md" - "CODE_OF_CONDUCT.md" - "clippy.toml" - "server-cli" - ]; - }; + src = filteredSource; buildInputs = (oldAttrs.buildInputs or []) @@ -142,9 +147,25 @@ fi ''; }; + veloren-server-cli-deps = oldAttrs: { + doCheck = false; + + postConfigure = '' + ${oldAttrs.postConfigure or ""} + ${configMoldLinker} + ''; + }; veloren-server-cli = oldAttrs: { - nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; + src = filteredSource; + VELOREN_USERDATA_STRATEGY = "system"; + + nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; + + postConfigure = '' + ${oldAttrs.postConfigure or ""} + ${configMoldLinker} + ''; postInstall = '' ${oldAttrs.postInstall or ""} if [ -f $out/bin/veloren-server-cli ]; then From 767041ae5c9dfd6dbe0ec5da08b4f3bb0428fe43 Mon Sep 17 00:00:00 2001 From: Sau Date: Fri, 2 Sep 2022 23:29:40 +0000 Subject: [PATCH 172/854] update the Spanish translation --- assets/voxygen/i18n/es_ES/buff.ftl | 2 +- assets/voxygen/i18n/es_ES/common.ftl | 6 +- assets/voxygen/i18n/es_ES/esc_menu.ftl | 2 +- assets/voxygen/i18n/es_ES/gameinput.ftl | 4 +- assets/voxygen/i18n/es_ES/hud/bag.ftl | 8 +- assets/voxygen/i18n/es_ES/hud/chat.ftl | 6 +- assets/voxygen/i18n/es_ES/hud/group.ftl | 6 +- assets/voxygen/i18n/es_ES/hud/misc.ftl | 20 ++-- assets/voxygen/i18n/es_ES/hud/sct.ftl | 2 +- assets/voxygen/i18n/es_ES/hud/settings.ftl | 14 +-- assets/voxygen/i18n/es_ES/hud/skills.ftl | 46 ++++----- assets/voxygen/i18n/es_ES/npc.ftl | 104 ++++++++++----------- 12 files changed, 110 insertions(+), 110 deletions(-) diff --git a/assets/voxygen/i18n/es_ES/buff.ftl b/assets/voxygen/i18n/es_ES/buff.ftl index 3ef41cd293..c530714bc1 100644 --- a/assets/voxygen/i18n/es_ES/buff.ftl +++ b/assets/voxygen/i18n/es_ES/buff.ftl @@ -14,7 +14,7 @@ buff-desc-invulnerability = No puedes ser dañado por ningún ataque. buff-title-protectingward = Aura Protectora buff-desc-protectingward = Por alguna razón, estás siendo protegido de los ataques. buff-title-frenzied = Frenético -buff-desc-frenzied = Estas imbuido con una velocidad sobrenatural y puedes ignorar heridas leves. +buff-desc-frenzied = Estás imbuido con una velocidad sobrenatural y puedes ignorar heridas leves. buff-title-hastened = Acelerado buff-desc-hastened = Tus movimientos y ataques son más rápidos. buff-title-bleed = Sangrado diff --git a/assets/voxygen/i18n/es_ES/common.ftl b/assets/voxygen/i18n/es_ES/common.ftl index f6e59e22ad..15c7452b61 100644 --- a/assets/voxygen/i18n/es_ES/common.ftl +++ b/assets/voxygen/i18n/es_ES/common.ftl @@ -11,7 +11,7 @@ common-controls = Controles common-video = Gráficos common-sound = Sonido common-chat = Chat -common-networking = Redes +common-networking = Red common-resume = Reanudar common-characters = Personajes common-close = Cerrar @@ -41,7 +41,7 @@ common-video_settings = Ajustes Gráficos common-sound_settings = Ajustes de Sonido common-language_settings = Ajustes de Idioma common-chat_settings = Ajustes de Chat -common-networking_settings = Ajustes de Redes +common-networking_settings = Ajustes de Red common-connection_lost = ¡Conexión perdida! ¿Se reinició el servidor? @@ -70,7 +70,7 @@ common-weapons-staff_simple = Báculo Simple common-weapons-axe_simple = Hacha Simple common-weapons-bow_simple = Arco Simple common-weapons-unique = Único -common-weapons-organ = Organ +common-weapons-organ = Órgano common-tool-debug = Depuración common-tool-farming = Herramienta Agrícola common-tool-pick = Pico diff --git a/assets/voxygen/i18n/es_ES/esc_menu.ftl b/assets/voxygen/i18n/es_ES/esc_menu.ftl index f8f3b09eab..4286da042f 100644 --- a/assets/voxygen/i18n/es_ES/esc_menu.ftl +++ b/assets/voxygen/i18n/es_ES/esc_menu.ftl @@ -1,2 +1,2 @@ esc_menu-logout = Salir -esc_menu-quit_game = Salir del juego \ No newline at end of file +esc_menu-quit_game = Salir del juego diff --git a/assets/voxygen/i18n/es_ES/gameinput.ftl b/assets/voxygen/i18n/es_ES/gameinput.ftl index d2171fdf89..8a95cf0f12 100644 --- a/assets/voxygen/i18n/es_ES/gameinput.ftl +++ b/assets/voxygen/i18n/es_ES/gameinput.ftl @@ -64,5 +64,5 @@ gameinput-mapzoomin = Aumentar Zoom de Mapa gameinput-mapzoomout = Reducir Zoom de Mapa gameinput-greet = Saludar gameinput-map-locationmarkerbutton = Establecer un punto en el Mapa -gameinput-spectatespeedboost = Ir más rápido en Modo Espectador. -gameinput-spectateviewpoint = Espectear desde el Punto de Vista de una Entidad +gameinput-spectatespeedboost = Ir más rápido en Modo Espectador +gameinput-spectateviewpoint = Punto de vista del Modo Espectador diff --git a/assets/voxygen/i18n/es_ES/hud/bag.ftl b/assets/voxygen/i18n/es_ES/hud/bag.ftl index 5b8dbe14ab..f2c20e3255 100644 --- a/assets/voxygen/i18n/es_ES/hud/bag.ftl +++ b/assets/voxygen/i18n/es_ES/hud/bag.ftl @@ -9,7 +9,7 @@ hud-bag-tabard = Tabardo hud-bag-shoulders = Hombros hud-bag-chest = Pecho hud-bag-hands = Manos -hud-bag-lantern = Linterna +hud-bag-lantern = Farol hud-bag-glider = Planeador hud-bag-belt = Cinturón hud-bag-ring = Anillo @@ -22,7 +22,7 @@ hud-bag-inactive_mainhand = Mano Principal Inactiva hud-bag-inactive_offhand = Mano Secundaria Inactiva hud-bag-swap_equipped_weapons_title = Intercambiar armas equipadas hud-bag-swap_equipped_weapons_desc = Pulsa { $key } -hud-bag-bag = Mochila +hud-bag-bag = Bolsa hud-bag-health = Salud hud-bag-energy = Energía hud-bag-combat_rating = Puntuación de Combate @@ -31,10 +31,10 @@ hud-bag-stun_res = Resistencia a Aturdimiento hud-bag-combat_rating_desc = Calculado por tu equipamiento y salud -hud-bag-protection_desc = Reducción de daño por armadura +hud-bag-protection_desc = Reducción de daño por armadura. hud-bag-stun_res_desc = Resistencia a ser aturdido por golpes consecutivos. Se regenera como la Energía. hud-bag-sort_by_name = Ordenar por Nombre hud-bag-sort_by_quality = Ordenar por Calidad -hud-bag-sort_by_category = Ordenar por Categoría \ No newline at end of file +hud-bag-sort_by_category = Ordenar por Categoría diff --git a/assets/voxygen/i18n/es_ES/hud/chat.ftl b/assets/voxygen/i18n/es_ES/hud/chat.ftl index f9523fce9c..e7db571861 100644 --- a/assets/voxygen/i18n/es_ES/hud/chat.ftl +++ b/assets/voxygen/i18n/es_ES/hud/chat.ftl @@ -3,7 +3,7 @@ hud-chat-chat_tab_hover_tooltip = Click derecho para opciones hud-outcome-burning = murió: quemado hud-outcome-curse = murió: maldito hud-outcome-bleeding = murió: desangrado -hud-outcome-crippled = murió: lisiado +hud-outcome-crippled = murió: malherido hud-outcome-frozen = murió: congelado hud-chat-online_msg = [{ $name }] se ha conectado. hud-chat-offline_msg = { $name } se ha desconectado. @@ -17,7 +17,7 @@ hud-chat-pvp_ranged_kill_msg = [{ $attacker }] disparó a [{ $victim }] hud-chat-pvp_explosion_kill_msg = [{ $attacker }] hizo explotar a [{ $victim }] hud-chat-pvp_energy_kill_msg = [{ $attacker }] mató a [{ $victim }] con magia hud-chat-died_of_buff_nonexistent_msg = [{ $victim }] { $died_of_buff } -hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } causado por { $attacker } +hud-chat-died_of_npc_buff_msg = [{ $victim }] { $died_of_buff } a manos de { $attacker } hud-chat-npc_melee_kill_msg = { $attacker } mató a [{ $victim }] hud-chat-npc_ranged_kill_msg = { $attacker } disparó a [{ $victim }] hud-chat-npc_explosion_kill_msg = { $attacker } hizo explotar a [{ $victim }] @@ -26,4 +26,4 @@ hud-chat-npc_other_kill_msg = [{ $attacker }] mató a [{ $victim }] hud-chat-loot_msg = Recogiste [{ $item }] hud-chat-loot_fail = ¡Tu inventario está lleno! hud-chat-goodbye = ¡Adiós! -hud-chat-connection_lost = Conexión perdida. Expulsando en { $time } segundos. \ No newline at end of file +hud-chat-connection_lost = Conexión perdida. Expulsando en { $time } segundos. diff --git a/assets/voxygen/i18n/es_ES/hud/group.ftl b/assets/voxygen/i18n/es_ES/hud/group.ftl index 4a1e036626..5f6ed2a92c 100644 --- a/assets/voxygen/i18n/es_ES/hud/group.ftl +++ b/assets/voxygen/i18n/es_ES/hud/group.ftl @@ -1,6 +1,6 @@ hud-group = Grupo -hud-group-invite_to_join = ¡{ $name } Te invito a su grupo! -hud-group-invite_to_trade = [{ $name }] le gustaria comerciar contigo. +hud-group-invite_to_join = ¡{ $name } te invitó a su grupo! +hud-group-invite_to_trade = A [{ $name }] le gustaría comerciar contigo. hud-group-invite = Invitar hud-group-kick = Expulsar hud-group-assign_leader = Asignar Lider @@ -10,4 +10,4 @@ hud-group-out_of_range = Fuera de Alcance hud-group-add_friend = Agregar a Amigos hud-group-link_group = Conectar Grupos hud-group-in_menu = En el Menu -hud-group-members = Miembros del Grupo \ No newline at end of file +hud-group-members = Miembros del Grupo diff --git a/assets/voxygen/i18n/es_ES/hud/misc.ftl b/assets/voxygen/i18n/es_ES/hud/misc.ftl index 9ea208e18d..1218bcb612 100644 --- a/assets/voxygen/i18n/es_ES/hud/misc.ftl +++ b/assets/voxygen/i18n/es_ES/hud/misc.ftl @@ -2,17 +2,17 @@ hud-do_not_show_on_startup = No mostrar esto al Inicio hud-show_tips = Mostrar Consejos hud-quests = Misiones hud-you_died = Has Muerto -hud-waypoint_saved = Punto de Ruta Guardado +hud-waypoint_saved = Punto de Control Guardado hud-sp_arrow_txt = PH hud-inventory_full = Inventario Lleno hud-press_key_to_show_keybindings_fmt = Pulsa { $key } para mostrar Atajos de Teclado -hud-press_key_to_toggle_lantern_fmt = [{ $key }] Linterna +hud-press_key_to_toggle_lantern_fmt = [{ $key }] Farol hud-press_key_to_show_debug_info_fmt = Pulsa { $key } para mostrar info. de depuración hud-press_key_to_toggle_keybindings_fmt = Pulsa { $key } para alternar atajos de teclado hud-press_key_to_toggle_debug_info_fmt = Pulsa { $key } para alternar la información de depuración -hud-press_key_to_respawn = Pulsa { $key } para aparecer en el último campamento visitado. +hud-press_key_to_respawn = Pulsa { $key } para aparecer en el último Punto de Control. hud-tutorial_btn = Tutorial -hud-tutorial_click_here = Pulsa [ { $key } ] para liberar tu cursor y clica en el botón! +hud-tutorial_click_here = ¡Pulsa [ { $key } ] para liberar tu cursor y clicar en el botón! hud-tutorial_elements = Fabricación hud-temp_quest_headline = Saludos Viajero! hud-temp_quest_text = @@ -20,18 +20,18 @@ hud-temp_quest_text = ¡Puedes llevarte todo lo que necesites en tu viaje! - Mira en la parte inferior derecha de la pantalla para encontrar cosas como tu bolsa, el menú de fabricación y el mapa. + En la parte inferior derecha de la pantalla encontrarás cosas como tu bolsa, el menú de fabricación y el mapa. - El menú de fabricación te permite crear armaduras, armas, comida y mucho más! + El menú de fabricación te permite crear armaduras, armas, comida y ¡mucho más! - Los animales salvajes que rodean la ciudad son una gran fuente de Pieles de Animal para crear algunas protecciones contra los peligros del mundo. + Los animales salvajes que rodean la ciudad son una gran fuente de Pieles para crear algunas armaduras para defenderte de los peligros del mundo. - Cuando te sientas preparado, ¡intenta conseguir un equipo aún mejor en los numerosos desafíos marcados en tu mapa! + Cuando te sientas preparado, intenta conseguir un equipo aún mejor en las mazmorras y cuevas marcadas en tu mapa. hud-spell = Hechizos hud-diary = Diario hud-free_look_indicator = Vista libre activa. Pulsa { $key } para desactivarla. hud-camera_clamp_indicator = Cámara fija vertical activa. Pulsa { $key } para desactivarla. -hud-auto_walk_indicator = Auto andar/nadar activado +hud-auto_walk_indicator = Auto andar activado hud-collect = Recolectar hud-pick_up = Recoger hud-open = Abrir @@ -40,4 +40,4 @@ hud-mine = Picar hud-talk = Hablar hud-trade = Comerciar hud-mount = Montar -hud-sit = Sentarse \ No newline at end of file +hud-sit = Sentarse diff --git a/assets/voxygen/i18n/es_ES/hud/sct.ftl b/assets/voxygen/i18n/es_ES/hud/sct.ftl index f19983caf4..a716928a5c 100644 --- a/assets/voxygen/i18n/es_ES/hud/sct.ftl +++ b/assets/voxygen/i18n/es_ES/hud/sct.ftl @@ -1,2 +1,2 @@ hud-sct-experience = Experiencia { $amount } -hud-sct-block = BLOQUEADO \ No newline at end of file +hud-sct-block = BLOQUEADO diff --git a/assets/voxygen/i18n/es_ES/hud/settings.ftl b/assets/voxygen/i18n/es_ES/hud/settings.ftl index f8e21e20d0..03c6a521b3 100644 --- a/assets/voxygen/i18n/es_ES/hud/settings.ftl +++ b/assets/voxygen/i18n/es_ES/hud/settings.ftl @@ -4,7 +4,7 @@ hud-settings-press_behavior-toggle = Alternar hud-settings-press_behavior-hold = Mantener hud-settings-help_window = Ventana de Ayuda hud-settings-debug_info = Info de Depuración -hud-settings-show_hitboxes = Mostrar cajas de golpe +hud-settings-show_hitboxes = Mostrar hitboxes hud-settings-show_chat = Mostrar chat hud-settings-show_hotkey_hints = Mostrar sugerencias de atajos hud-settings-tips_on_startup = Consejos Iniciales @@ -13,7 +13,7 @@ hud-settings-relative_scaling = Escala Relativa hud-settings-custom_scaling = Escala Personalizada hud-settings-crosshair = Punto de Mira hud-settings-opacity = Opacidad -hud-settings-hotbar = Barra Rápida +hud-settings-hotbar = Barra de Objetos hud-settings-toggle_shortcuts = Alternar Atajos hud-settings-buffs_skillbar = Estados en Barra de Habilidades. hud-settings-buffs_mmap = Estados en el Minimapa @@ -21,8 +21,8 @@ hud-settings-toggle_bar_experience = Alternar Barra de Experiencia hud-settings-scrolling_combat_text = Texto de Combate Deslizante hud-settings-incoming_damage = Daño Entrante hud-settings-speech_bubble = Burbuja de Diálogo -hud-settings-speech_bubble_self = Mostrar Diálogos propios en Burbuja -hud-settings-speech_bubble_dark_mode = Modo Oscuro de Burbuja de Diálogo +hud-settings-speech_bubble_self = Mostrar mis Diálogos en Burbuja de Diálogo +hud-settings-speech_bubble_dark_mode = Modo Oscuro de la Burbuja de Diálogo hud-settings-speech_bubble_icon = Icono de Burbuja de Diálogo hud-settings-energybar_numbers = Números de Barra de Energía hud-settings-always_show_bars = Siempre Mostrar Barras de Energía @@ -64,7 +64,7 @@ hud-settings-antialiasing_mode = Modo AntiAliasing hud-settings-upscale_factor = Resolución Interna hud-settings-cloud_rendering_mode = Modo Renderizado de Nubes hud-settings-fluid_rendering_mode = Modo Renderizado de Fluido -hud-settings-fluid_rendering_mode-cheap = Barato +hud-settings-fluid_rendering_mode-cheap = Rápido hud-settings-fluid_rendering_mode-shiny = Brillante hud-settings-cloud_rendering_mode-minimal = Mínimo hud-settings-cloud_rendering_mode-low = Bajo @@ -87,7 +87,7 @@ hud-settings-lighting_rendering_mode-blinnphong = Tipo B - Medio hud-settings-lighting_rendering_mode-lambertian = Tipo L - Barato hud-settings-shadow_rendering_mode = Modo de Renderizado de Sombras hud-settings-shadow_rendering_mode-none = Ninguno -hud-settings-shadow_rendering_mode-cheap = Barato +hud-settings-shadow_rendering_mode-cheap = Rápido hud-settings-shadow_rendering_mode-map = Mapeado hud-settings-shadow_rendering_mode-map-resolution = Resolución hud-settings-lod_detail = Nivel de Detalle @@ -118,4 +118,4 @@ hud-settings-region = Región hud-settings-say = Decir hud-settings-all = Todo hud-settings-group_only = Solo a grupo -hud-settings-reset_chat = Restablecer Valores Por Defecto \ No newline at end of file +hud-settings-reset_chat = Restablecer Valores Por Defecto diff --git a/assets/voxygen/i18n/es_ES/hud/skills.ftl b/assets/voxygen/i18n/es_ES/hud/skills.ftl index bae257e8c5..82bacb0dec 100644 --- a/assets/voxygen/i18n/es_ES/hud/skills.ftl +++ b/assets/voxygen/i18n/es_ES/hud/skills.ftl @@ -21,7 +21,7 @@ hud-skill-unlck_staff = Desbloquea el árbol de habilidades del báculo{ $SP } hud-skill-unlck_sceptre_title = Desbloquear Cetro hud-skill-unlck_sceptre = Desbloquea el árbol de habilidades del cetro{ $SP } hud-skill-dodge_title = Esquivar -hud-skill-dodge = Esquivar al rodar es desencadenado con el botón central del ratón y concede inmunidad temporal a los ataques cuerpo a cuerpo (iframes) mientras ruedas +hud-skill-dodge = Pulsando la rueda del ratón, ruedas, obteniendo inmunidad a los ataques(i-frames) mientras ruedes. hud-skill-roll_energy_title = Coste de Energía al Rodar hud-skill-roll_energy = Rodar usa un { $boost }% menos de energía{ $SP } hud-skill-roll_speed_title = Velocidad al Rodar @@ -29,17 +29,17 @@ hud-skill-roll_speed = Rodar es un { $boost }% más rápido{ $SP } hud-skill-roll_dur_title = Duración de Rodar hud-skill-roll_dur = Rodar dura un { $boost }% más de tiempo{ $SP } hud-skill-climbing_title = Escalada -hud-skill-climbing = Llegar más alto +hud-skill-climbing = Subir pendientes hud-skill-climbing_cost_title = Coste de Energía de Escalar hud-skill-climbing_cost = Escalar usa un { $boost }% menos de energía{ $SP } hud-skill-climbing_speed_title = Velocidad al Escalar hud-skill-climbing_speed = Escalar es un { $boost }% más rápido{ $SP } hud-skill-swim_title = Nadar -hud-skill-swim = Moverte por entornos húmedos +hud-skill-swim = Moverte por el agua hud-skill-swim_speed_title = Velocidad al Nadar hud-skill-swim_speed = Nadas un { $boost }% más rápido{ $SP } -hud-skill-sc_lifesteal_title = Rayo Robavida -hud-skill-sc_lifesteal = Succiona la vida de tus enemigos +hud-skill-sc_lifesteal_title = Rayo Drenador +hud-skill-sc_lifesteal = Succiona la salud de tus enemigos hud-skill-sc_lifesteal_damage_title = Daño hud-skill-sc_lifesteal_damage = Hace un { $boost }% más de daño{ $SP } hud-skill-sc_lifesteal_range_title = Alcance @@ -49,7 +49,7 @@ hud-skill-sc_lifesteal_lifesteal = Convierte un { $boost }% adicional del daño hud-skill-sc_lifesteal_regen_title = Regeneración de Energía hud-skill-sc_lifesteal_regen = Recupera un { $boost }% de energía adicional{ $SP } hud-skill-sc_heal_title = Aura Sanadora -hud-skill-sc_heal = Sanas a tus aliados usando la sangre de tus enemigos, requiere combate para ser activado +hud-skill-sc_heal = Sanas a tus aliados usando la sangre de tus enemigos, tienes que atacar a una entidad para usarlo hud-skill-sc_heal_heal_title = Sanación hud-skill-sc_heal_heal = Incrementa la Sanación que haces en un { $boost }%{ $SP } hud-skill-sc_heal_cost_title = Coste de Energía @@ -63,7 +63,7 @@ hud-skill-sc_wardaura_unlock = Te permite proteger a tus aliados de los ataques hud-skill-sc_wardaura_strength_title = Fuerza hud-skill-sc_wardaura_strength = La fuerza de tu protección se incrementa en un { $boost }%{ $SP } hud-skill-sc_wardaura_duration_title = Duración -hud-skill-sc_wardaura_duration = Los efectos de tu última protección duran un { $boost }% más{ $SP } +hud-skill-sc_wardaura_duration = Los efectos de tu protección duran un { $boost }% más{ $SP } hud-skill-sc_wardaura_range_title = Radio hud-skill-sc_wardaura_range = Tu protección llega un { $boost }% más lejos{ $SP } hud-skill-sc_wardaura_cost_title = Coste de Energía @@ -71,25 +71,25 @@ hud-skill-sc_wardaura_cost = Crear la protección requiere un { $boost }% menos hud-skill-st_shockwave_range_title = Alcance de Onda de Choque hud-skill-st_shockwave_range = Lanza cosas que antes estaban fuera de tu alcance, alcance incrementado { $boost }%{ $SP } hud-skill-st_shockwave_cost_title = Coste de Onda de Choque -hud-skill-st_shockwave_cost = Reduce el coste de energía para lanzar aldeanos indefensos en un { $boost }%{ $SP } +hud-skill-st_shockwave_cost = Reduce el coste de energía para lanzar a pobres aldeanos indefensos en un { $boost }%{ $SP } hud-skill-st_shockwave_knockback_title = Retroceso de Onda de Choque hud-skill-st_shockwave_knockback = Incrementa el potencial de lanzamiento por { $boost }%{ $SP } hud-skill-st_shockwave_damage_title = Daño de Onda de Choque hud-skill-st_shockwave_damage = Incrementa el daño causado en un { $boost }%{ $SP } hud-skill-st_shockwave_unlock_title = Desbloquear Onda De Choque -hud-skill-st_shockwave_unlock = Desbloquea la habilidad de lanzar a los enemigos usando fuego{ $SP } +hud-skill-st_shockwave_unlock = Desbloquea la habilidad de lanzar por los aires a los enemigos usando fuego{ $SP } hud-skill-st_flamethrower_title = Lanzallamas -hud-skill-st_flamethrower = Lanza fuego, cocínalos a todos +hud-skill-st_flamethrower = Lanza fuego para cocinar a tus enemigos hud-skill-st_flame_velocity_title = Velocidad de la Llama hud-skill-st_flame_velocity = Haz que el fuego vaya más rápido, en un { $boost }%{ $SP } hud-skill-st_flamethrower_range_title = Alcance del Lanzallamas -hud-skill-st_flamethrower_range = Para cuando las llamas no llegan, un { $boost }% más lejos{ $SP } +hud-skill-st_flamethrower_range = Las llamas llegan un { $boost }% más lejos{ $SP } hud-skill-st_energy_drain_title = Drenaje de Energía hud-skill-st_energy_drain = Reduce la tasa de drenaje de energía en un { $boost }%{ $SP } hud-skill-st_flamethrower_damage_title = Daño del Lanzallamas hud-skill-st_flamethrower_damage = Incrementa el daño en un { $boost }%{ $SP } hud-skill-st_explosion_radius_title = Radio de explosión -hud-skill-st_explosion_radius = Más grande es mejor, Incrementa el radio de explosión en un { $boost }%{ $SP } +hud-skill-st_explosion_radius = Cuanto más grande, mejor. Incrementa el radio de explosión en un { $boost }%{ $SP } hud-skill-st_energy_regen_title = Regeneración de Energía hud-skill-st_energy_regen = Incrementa la regeneración de energía en un { $boost }%{ $SP } hud-skill-st_fireball_title = Bola de Fuego @@ -99,7 +99,7 @@ hud-skill-st_damage = Incrementa el daño en un { $boost }%{ $SP } hud-skill-bow_projectile_speed_title = Velocidad de proyectil hud-skill-bow_projectile_speed = Te permite disparar flechas más lejos, más rápido, en un { $boost }%{ $SP } hud-skill-bow_charged_title = Tiro Cargado -hud-skill-bow_charged = Porque esperastes mucho +hud-skill-bow_charged = Cargas los disparos de tu arco hud-skill-bow_charged_damage_title = Daño Cargado hud-skill-bow_charged_damage = Incrementa el daño en un { $boost }%{ $SP } hud-skill-bow_energy_regen_title = Regeneración Cargada @@ -111,7 +111,7 @@ hud-skill-bow_charged_speed = Incrementa la velocidad a la que cargas el ataque hud-skill-bow_charged_move_speed_title = Velocidad de Mov. Cargado hud-skill-bow_charged_move_speed = Incrementa la velocidad con la que puedes desplazarte mientras cargas el ataque en un { $boost }%{ $SP } hud-skill-bow_repeater_title = Repetidor -hud-skill-bow_repeater = Dispara más rápido cuanto más disparas +hud-skill-bow_repeater = Dispara varias fechas, cada vez más rápido hud-skill-bow_repeater_damage_title = Daño Repetidor hud-skill-bow_repeater_damage = Incrementa el daño realizado en un { $boost }%{ $SP } hud-skill-bow_repeater_cost_title = Coste Repetidor @@ -126,10 +126,10 @@ hud-skill-bow_shotgun_cost_title = Coste Escopeta hud-skill-bow_shotgun_cost = Reduce el coste de escopeta en un { $boost }%{ $SP } hud-skill-bow_shotgun_arrow_count_title = Flechas Escopeta hud-skill-bow_shotgun_arrow_count = Incrementa el número de flechas por disparo en { $boost }{ $SP } -hud-skill-bow_shotgun_spread_title = Difusión Escopeta +hud-skill-bow_shotgun_spread_title = Dispersión Escopeta hud-skill-bow_shotgun_spread = Reduce la dispersión de las flechas en un { $boost }%{ $SP } hud-skill-hmr_leap_radius_title = Radio de Salto -hud-skill-hmr_leap_radius = Incrementa el radio de ataque en el suelo del golpe en { $boost } metro{ $SP } +hud-skill-hmr_leap_radius = Incrementa el radio del golpe en salto al suelo en { $boost } metros{ $SP } hud-skill-hmr_leap_distance_title = Distancia de Salto hud-skill-hmr_leap_distance = Incrementa la distancia del salto en un { $boost }%{ $SP } hud-skill-hmr_leap_cost_title = Coste del Salto @@ -139,9 +139,9 @@ hud-skill-hmr_leap_knockback = Incrementa el retroceso del salto en un { $boost hud-skill-hmr_leap_damage_title = Daño de Salto hud-skill-hmr_leap_damage = Incrementa el daño del salto en un { $boost }%{ $SP } hud-skill-hmr_unlock_leap_title = Desbloquear Salto -hud-skill-hmr_unlock_leap = Desbloquea un Salto{ $SP } +hud-skill-hmr_unlock_leap = Desbloquea el Salto{ $SP } hud-skill-hmr_charged_melee_title = Cuerpo a Cuerpo Cargado -hud-skill-hmr_charged_melee = Cuerpo a cuerpo pero cargado +hud-skill-hmr_charged_melee = Cuerpo a cuerpo pero... cargado hud-skill-hmr_charged_rate_title = Tasa de Cargado hud-skill-hmr_charged_rate = Incrementa la tasa de carga del golpe en un { $boost }%{ $SP } hud-skill-hmr_charged_melee_nrg_drain_title = Drenaje Energía Cuerpo a Cuerpo Cargado @@ -151,7 +151,7 @@ hud-skill-hmr_charged_melee_damage = Incrementa el daño del golpe cargado en un hud-skill-hmr_charged_melee_knockback_title = Retroceso Cuerpo a Cuerpo Cargado hud-skill-hmr_charged_melee_knockback = Incrementa masivamente el potencial de lanzamiento del golpe en un { $boost }%{ $SP } hud-skill-hmr_single_strike_title = Golpe único -hud-skill-hmr_single_strike = Tan único como tú +hud-skill-hmr_single_strike = Tan único como tú uWu hud-skill-hmr_single_strike_regen_title = Regeneración de Golpe Único hud-skill-hmr_single_strike_regen = Incrementa la energía ganada con cada golpe sucesivo{ $SP } hud-skill-hmr_single_strike_speed_title = Velocidad de Golpe Único @@ -161,7 +161,7 @@ hud-skill-hmr_single_strike_damage = Incrementa el daño con cada golpe sucesivo hud-skill-hmr_single_strike_knockback_title = Retroceso de Golpe Único hud-skill-hmr_single_strike_knockback = Incrementa el retroceso de los golpes en un { $boost }%{ $SP } hud-skill-sw_trip_str_title = Golpe triple -hud-skill-sw_trip_str = Golpe, hasta tres veces +hud-skill-sw_trip_str = Golpea hasta tres veces hud-skill-sw_trip_str_combo_title = Combo de Golpe Triple hud-skill-sw_trip_str_combo = Desbloquea el combo potente de golpe triple{ $SP } hud-skill-sw_trip_str_dmg_title = Daño de Golpe Triple @@ -181,7 +181,7 @@ hud-skill-sw_dash_cost = Reduce el coste inicial de la embestida en un { $boost hud-skill-sw_dash_speed_title = Velocidad de Embestida hud-skill-sw_dash_speed = Incrementa la velocidad al embestir en un { $boost }%{ $SP } hud-skill-sw_dash_charge_through_title = Embestida Atravesante -hud-skill-sw_dash_charge_through = Te permite embestir atravesando los primeros enemigos que golpeas{ $SP } +hud-skill-sw_dash_charge_through = Te permite embestir atravesando a los primeros enemigos que golpeas{ $SP } hud-skill-sw_dash_scale_title = Intensidad Daño de Embestida hud-skill-sw_dash_scale = Incrementa el daño cuanto más embistes en un { $boost }%{ $SP } hud-skill-sw_spin_title = Desbloquear Giro @@ -234,6 +234,6 @@ hud-skill-pick_strike = Pica rocas con el pico para ganar minerales, gemas y exp hud-skill-pick_strike_speed_title = Velocidad Golpe de Pico hud-skill-pick_strike_speed = Pica rocas más rápido{ $SP } hud-skill-pick_strike_oregain_title = Producción de Minerales de Golpe de Pico -hud-skill-pick_strike_oregain = Probabilidad de ganar minerales extras un ({ $boost }% por nivel){ $SP } +hud-skill-pick_strike_oregain = Probabilidad de ganar minerales extras. Un ({ $boost }% por nivel){ $SP } hud-skill-pick_strike_gemgain_title = Producción de Gemas de Golpe de Pico -hud-skill-pick_strike_gemgain = Probabilidad de ganar gemas extras un ({ $boost }% por nivel){ $SP } \ No newline at end of file +hud-skill-pick_strike_gemgain = Probabilidad de ganar gemas extras. Un ({ $boost }% por nivel){ $SP } diff --git a/assets/voxygen/i18n/es_ES/npc.ftl b/assets/voxygen/i18n/es_ES/npc.ftl index 4953bc3184..c1b76cf9e5 100644 --- a/assets/voxygen/i18n/es_ES/npc.ftl +++ b/assets/voxygen/i18n/es_ES/npc.ftl @@ -2,49 +2,49 @@ npc-speech-villager = .a0 = ¿A que hace un buen día? .a1 = ¿Cómo estás hoy? .a2 = ¡Que tengas una buena mañana! - .a3 = Me pregunto qué piensa el Catoblepas cuando come hierba + .a3 = Me pregunto qué piensa el Catoblepas cuando come hierba. .a4 = ¿Qué piensas de este tiempo? - .a5 = Solo pensar en esas mazmorras y me asusto. Espero que alguien pueda poner orden ahí dentro - .a6 = Me gustaría hacer espeleología en una cueva cuando sea más fuerte - .a7 = ¿Has visto mi gato? - .a8 = ¿Has oído hablar de los feroces Tiburones de Tierra? He oído que viven en los desiertos - .a9 = Dicen que en las cuevas se pueden encontrar gemas brillantes de todo tipo - .a10 = ¡Sólo me interesan crackers con queso! + .a5 = De solo pensar en esas mazmorras me asusto. Espero que alguien pueda poner algo de orden ahí dentro. + .a6 = Me gustaría hacer espeleología en una cueva cuando sea más fuerte. + .a7 = ¿Has visto a mi gato? + .a8 = ¿Has oído hablar de los feroces Tiburones de Tierra? He oído que viven en los desiertos. + .a9 = Dicen que en las cuevas se pueden encontrar gemas brillantes de todo tipo. + .a10 = ¡Sólo me interesan los crackers con queso! .a11 = ¿No vas a entrar? ¡Estábamos a punto de comer queso! - .a12 = Dicen que las setas son buenas para tu salud. Yo nunca las he comido - .a13 = ¡No te olvides los crackers! - .a14 = Adoro el queso enano. Me encantaria aprender hacerlo - .a15 = Me pregunto qué habrá al otro lado de las montañas - .a16 = Espero hacer mi propio planeador algún día - .a17 = ¿Te gustaría ver mi jardín? Bueno, tal vez en otro momento + .a12 = Dicen que las setas son buenas para tu salud. Yo nunca las he probado. + .a13 = ¡No te olvides de los crackers! + .a14 = Adoro el queso enano. Me encantaría aprender a hacerlo. + .a15 = Me pregunto qué habrá al otro lado de las montañas. + .a16 = Espero poder hacer mi propio planeador algún día. + .a17 = ¿Te gustaría ver mi jardín? Bueno, tal vez en otro momento. .a18 = ¡Hace un día precioso para pasear por el bosque! - .a19 = ¿Ser o no ser? Creo que seré granjero + .a19 = ¿Ser o no ser? ¡Pues yo quiero ser granjero! .a20 = ¿No crees que nuestro pueblo es el mejor? - .a21 = ¿Qué supones que hace brillar a los Restos Luminosos? - .a22 = ¡Creo que es la hora del segundo desayuno! + .a21 = ¿Qué crees que hace brillar a los Restos Luminosos? + .a22 = ¡Ya va siendo hora del segundo desayuno! .a23 = ¿Has cogido alguna vez una luciérnaga? - .a24 = No puedo entender de dónde vienen esos Sauroks - .a25 = Me gustaría que alguien mantuviera a los lobos alejados del pueblo - .a26 = Anoche tuve un sueño maravilloso sobre el queso. ¿Qué significa? - .a27 = He dejado algo de queso con mi hermano. Ahora no se si existe o no. Lo llamo el queso de Schrödinger. - .a28 = He dejado algo de queso con mi hermana. Ahora no se si existe o no. Lo llamo el queso de Schrödinger. - .a29 = Alguien debería de hacer algo con esos cultistas. Preferiblemente alguien que no sea yo + .a24 = No puedo entender de dónde vienen esos Sauroks. + .a25 = Me gustaría que alguien mantuviera a los lobos alejados del pueblo. + .a26 = Anoche tuve un sueño maravilloso sobre el queso. Me pregunto qué significará. + .a27 = He dejado algo de queso con mi hermano. Ahora no sé si existe o no. Es el queso de Schrödinger. + .a28 = He dejado algo de queso con mi hermana. Ahora no sé si existe o no. Es el queso de Schrödinger. + .a29 = Alguien debería de hacer algo con esos cultistas. Preferiblemente alguien que no sea yo. .a30 = Espero que llueva pronto. Sería bueno para los cultivos. - .a31 = ¡Me encanta la miel! Y odio las abejas. - .a32 = Quiero ver el mundo algun día. Tiene que haber algo más en esta vida que este pueblo. + .a31 = ¡Me encanta la miel! Y odio las abejas... + .a32 = ¡Quiero ver el mundo algun día! Tiene que haber algo más en esta vida que este pueblo. npc-speech-villager_decline_trade = .a0 = Lo siento, no tengo nada para comerciar. - .a1 = ¿Comerciar? Como si tuviera algo que te pudiera interesar. - .a2 = Mi casa es mía y no la cambiaré por nada. + .a1 = ¿Comerciar contigo? Como si tuviera algo que pudiera interesarte. + .a2 = ¡Mi casa es mía y no la cambiaré por nada! Aunque si tienes queso... npc-speech-merchant_advertisement = .a0 = ¿Te interesaría comerciar conmigo? .a1 = ¿Querrías comerciar conmigo? - .a2 = Tengo muchos bienes. ¿Quieres echar un vistazo? + .a2 = Tengo un montón de artículos. ¿Te gustaría echar un ojo? npc-speech-merchant_busy = - .a0 = Hey, espera tu turno + .a0 = Hey, espera tu turno. .a1 = Ten paciencia, solo soy una persona. .a2 = ¿No ves que estoy comerciando con alguien? - .a3 = Un momento, dejame acabar. + .a3 = Un momento, déjame acabar. .a4 = Nada de colarse. .a5 = Estoy ocupado, vuelve más tarde. npc-speech-merchant_trade_successful = @@ -56,20 +56,20 @@ npc-speech-merchant_trade_declined = npc-speech-villager_cultist_alarm = .a0 = ¡Cuidado! ¡Hay cultistas sueltos! .a1 = ¡A las armas! ¡Los cultistas nos atacan! - .a2 = ¡Como se atreven los cultistas a atacar esta aldea! + .a2 = ¡¿Cómo se atreven los cultistas a atacar esta aldea?! .a3 = ¡Muerte a los cultistas! .a4 = ¡Aquí no toleramos a los cultistas! - .a5 = ¡Cultista asesino! + .a5 = ¡Cultista, asesino! .a6 = ¡Prueba el filo de mi espada, sucio cultista! .a7 = ¡Nada podrá limpiar la sangre de tus manos, cultista! - .a8 = ¡Billones de percebes azules! ¡Un cultista entre nosotros! - .a9 = ¡Esos malvados cultistas seran aniquilados! + .a8 = ¡Por las barbas del Minotauro! ¡Un cultista entre nosotros! + .a9 = ¡Esos malvados cultistas serán aniquilados! .a10 = ¡Este cultista es mío! .a11 = ¡Prepárate para conocer a tu creador, sucio cultista! .a12 = ¡Veo un cultista! ¡Atrapadlo! .a13 = ¡Veo un cultista! ¡Atacadlo! .a14 = ¡Veo un cultista! ¡No dejéis que escape! - .a15 = ¿Le importaría al más honorable de los cultistas un poco de MUERTE? + .a15 = ¿Le gustaría al más honorable de los cultistas un poco de MUERTE? .a16 = ¡Nunca perdonamos!¡Nunca olvidamos!¡Muere, cultista! .a17 = ¡Muere, cultista! .a18 = ¡Tu reinado de terror llegará a su fin! @@ -110,28 +110,28 @@ npc-speech-villager_under_attack = .a30 = ¡Ayuda! ¡Por favor! .a31 = ¡Aaah! ¡Guardias! ¡Ayuda! .a32 = ¡Vienen a por mí! - .a33 = ¡Ayuda! ¡Ayuda! Me están reprimiendo - .a34 = Ah, ahora vemos la violencia inherente al sistema. + .a33 = ¡Ayuda! ¡Ayuda! ¡Me están agrediendo! + .a34 = Ah, aquí tenemos la violencia, inherente al sistema... .a35 = ¡Esto, bah, un rasguño! .a36 = ¡Deja de hacer eso! .a37 = ¡¿Qué te he hecho?! .a38 = ¡Por favor, deja de atacarme! .a39 = ¡Eh! ¡Mira a dónde apuntas esa cosa! - .a40 = Desgraciado, vete de aqui! - .a41 = Para ya! Vete! + .a40 = ¡Desgraciado, vete de aqui! + .a41 = ¡Para ya! ¡Vete! .a42 = ¡Me estas haciendo enfadar! .a43 = ¡Oye! ¡¿Quién te crees que eres?! - .a44 = Te arrancaré la cabeza por eso! + .a44 = ¡Te pienso arrancar la cabeza por eso! .a45 = ¡Para, por favor! ¡No llevo nada de valor! - .a46 = ¡Mi hermano es más grande que yo y te machacará! + .a46 = ¡Cuando se entere mi hermano seguro que no eres tan valiente! .a47 = ¡Nooo, se lo voy a decir a mamá! .a48 = ¡Maldito seas! - .a49 = Por favor, no hagas eso + .a49 = Por favor, no hagas eso. .a50 = ¡Eso no fue muy agradable! - .a51 = Tu arma funciona, ahora aléjala! + .a51 = ¡Tu arma funciona, ahora aléjala! .a52 = ¡Perdóname! .a53 = ¡Por favor, tengo familia! - .a54 = ¡Soy demasiado joven para morir! + .a54 = ¡Soy demasiado joven y atractivo como para morir! .a55 = ¿Podemos hablar de esto? .a56 = ¡La violencia nunca es la respuesta! .a57 = Hoy se está torciendo el día... @@ -139,8 +139,8 @@ npc-speech-villager_under_attack = .a59 = ¡Ayy! .a60 = ¡Qué grosero! .a61 = ¡Para, te lo ruego! - .a62 = ¡Ojala te enfermes! - .a63 = Esto no es divertido + .a62 = ¡Ojalá te enfermes! + .a63 = Esto no es divertido... .a64 = ¡¿Cómo te atreves?! .a65 = ¡Pagarás por eso! .a66 = ¡Sigue así y te arrepentirás! @@ -155,23 +155,23 @@ npc-speech-villager_under_attack = .a75 = ¡No me merezco esto! .a76 = Por favor, no vuelvas a hacer eso. .a77 = ¡Guardias, arrojad a este monstruo al lago! - .a78 = ¡Enviare mi tarasca a por ti! - .a79 = ¿Porque Yoooooo? + .a78 = ¡Enviaré a mi tarasca a por ti! + .a79 = ¿Por qué yoooooo? npc-speech-villager_enemy_killed = - .a0 = ¡He destruido a mi enemigo! + .a0 = ¡He destruído a mi enemigo! .a1 = ¡Por fin, paz! .a2 = ... ahora, ¿qué estaba haciendo? npc-speech-menacing = - .a0 = ¡Te lo advierto! + .a0 = ¡Te lo advertí! .a1 = ¡Si te acercas te atacaré! .a2 = ¡No me das miedo! .a3 = ¡Vete de aquí! .a4 = ¡Da la vuelta y vete si quieres vivir! .a5 = ¡No eres bienvenido aquí! npc-speech-cultist_low_health_fleeing = - .a0 = ¡Retirada por la causa! + .a0 = ¡Volveré a por ti cuando muera! .a1 = ¡Retirada! .a2 = ¡Maldito Seas! .a3 = ¡Te maldeciré en el más allá! - .a4 = ¡Debo descansar! - .a5 = ¡Son demasiado fuertes! \ No newline at end of file + .a4 = ¡Tengo que descansar! + .a5 = ¡Son demasiado fuertes! From 7f3100cc2c085a2cb1eb75f2492d853b6f7323ea Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 02:32:38 +0300 Subject: [PATCH 173/854] build(nix): update flake deps --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 43245c58e1..a43120cdb2 100644 --- a/flake.lock +++ b/flake.lock @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662158571, - "narHash": "sha256-w+iLHikl1gdbzT9bM5Iu8u9k6/e2LljoTLyTWO0c0nk=", + "lastModified": 1662160947, + "narHash": "sha256-Od2FPpAV0FXJ12Al8z1xSHIgjTPGbYQD71lQlfN7Wb4=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "013350ad83767cf359882e900de381a624445947", + "rev": "66408a2008f08b8d5d65f76b4b99dbb3040a6a3e", "type": "github" }, "original": { From d64417b41a2c9d57727e26840ca67c2a054b0428 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 03:00:08 +0300 Subject: [PATCH 174/854] build(nix): wrap packages with assets in another derivation --- flake.nix | 80 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/flake.nix b/flake.nix index c567314bd9..59bd9342f8 100644 --- a/flake.nix +++ b/flake.nix @@ -3,8 +3,9 @@ inputs.nci.url = "github:yusdacra/nix-cargo-integration"; - outputs = inputs: - inputs.nci.lib.makeOutputs { + outputs = inputs: let + lib = inputs.nci.inputs.nixpkgs.lib; + outputs = inputs.nci.lib.makeOutputs { root = ./.; defaultOutputs = { package = "veloren-voxygen"; @@ -44,18 +45,16 @@ } else (throw "Can't get revision because the git tree is dirty"); - prettyRev = with sourceInfo; builtins.substring 0 8 rev + "/" + utils.dateTimeFormat lastModified; + prettyRev = with sourceInfo; + builtins.substring 0 8 rev + + "/" + + utils.dateTimeFormat lastModified; tag = if sourceInfo ? tag then sourceInfo.tag else ""; - veloren-assets = pkgs.runCommand "makeAssetsDir" {} '' - mkdir $out - ln -sf ${./assets} $out/assets - ''; - configMoldLinker = '' cat >>$CARGO_HOME/config.toml < Date: Sat, 3 Sep 2022 03:34:10 +0300 Subject: [PATCH 175/854] build(nix): add missing library for voxygen --- flake.nix | 8 -------- voxygen/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/flake.nix b/flake.nix index 59bd9342f8..c5f717139f 100644 --- a/flake.nix +++ b/flake.nix @@ -137,11 +137,6 @@ ${oldAttrs.postConfigure or ""} ${configMoldLinker} ''; - postInstall = '' - ${oldAttrs.postInstall or ""} - wrapProgram $out/bin/veloren-voxygen \ - --set LD_LIBRARY_PATH ${lib.makeLibraryPath common.runtimeLibs} - ''; }; veloren-server-cli-deps = oldAttrs: { doCheck = false; @@ -164,9 +159,6 @@ ${oldAttrs.postConfigure or ""} ${configMoldLinker} ''; - postInstall = '' - ${oldAttrs.postInstall or ""} - ''; }; }; }; diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index a5b7ffe64e..ea9826dbf7 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -18,7 +18,7 @@ It is inspired by games such as Cube World, Legend of Zelda: Breath of the Wild, This package includes the official client, Voxygen. """ -runtimeLibs = ["libGL", "xorg.libX11", "xorg.libXcursor", "xorg.libXrandr", "xorg.libXi", "vulkan-loader", "vulkan-extension-layer"] +runtimeLibs = ["libGL", "xorg.libX11", "xorg.libXcursor", "xorg.libXrandr", "xorg.libXi", "vulkan-loader", "vulkan-extension-layer", "shaderc.lib"] [features] hot-anim = ["anim/use-dyn-lib"] From 8c4c0c20210e978cbecf93900978c54cabd91b68 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 07:06:56 +0300 Subject: [PATCH 176/854] build(nix): update flake deps --- flake.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index a43120cdb2..7f7a701aaf 100644 --- a/flake.lock +++ b/flake.lock @@ -69,11 +69,11 @@ ] }, "locked": { - "lastModified": 1662083074, - "narHash": "sha256-GL4/CLKPYUzkKD1l7oi2XB+vi3z4xGpCVLDdG3tRqvs=", + "lastModified": 1662176993, + "narHash": "sha256-Sy7DsGAveDUFBb6YDsUSYZd/AcXfP/MOMIwMt/NgY84=", "owner": "nix-community", "repo": "dream2nix", - "rev": "c6c039fcc6abdf4d828b940b576944a224cf8622", + "rev": "809bc5940214744eb29778a9a0b03f161979c1b2", "type": "github" }, "original": { @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662160947, - "narHash": "sha256-Od2FPpAV0FXJ12Al8z1xSHIgjTPGbYQD71lQlfN7Wb4=", + "lastModified": 1662177071, + "narHash": "sha256-x6XF//RdZlw81tFAYM1TkjY+iQIpyMCWZ46r9o4wVQY=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "66408a2008f08b8d5d65f76b4b99dbb3040a6a3e", + "rev": "65270dea87bb82fc02102a15221677eea237680e", "type": "github" }, "original": { @@ -127,11 +127,11 @@ "rust-overlay": { "flake": false, "locked": { - "lastModified": 1662087605, - "narHash": "sha256-Gpf2gp2JenKGf+TylX/YJpttY2bzsnvAMLdLaxoZRyU=", + "lastModified": 1662173844, + "narHash": "sha256-+ZgW98Y8fZkgFSylE+Mzalumw+kw3SVivZznbJqQaj8=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "60c2cfaa8b90ed8cebd18b214fac8682dcf222dd", + "rev": "8ac6d40380dc4ec86f1ff591d5c14c8ae1d77a18", "type": "github" }, "original": { From 7a2d6474002233cd37a8db3c5fc59fce039cc626 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 07:12:18 +0300 Subject: [PATCH 177/854] build(nix): wrap veloren-voxygen in wrapper derivation --- flake.nix | 13 ++++++++++++- voxygen/Cargo.toml | 1 - 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index c5f717139f..63a2177839 100644 --- a/flake.nix +++ b/flake.nix @@ -165,6 +165,15 @@ }; wrapWithAssets = system: old: let pkgs = inputs.nci.inputs.nixpkgs.legacyPackages.${system}; + runtimeLibs = with pkgs; [ + xorg.libX11 + xorg.libXcursor + xorg.libXrandr + xorg.libXi + vulkan-loader + vulkan-extension-layer + shaderc.lib + ]; assets = pkgs.runCommand "veloren-assets" {} '' mkdir $out ln -sf ${./assets} $out/assets @@ -181,7 +190,9 @@ rm -rf $out/bin mkdir $out/bin ln -sf ${old}/bin/* $out/bin/ - wrapProgram $out/bin/* --set VELOREN_ASSETS ${assets} + wrapProgram $out/bin/* \ + ${lib.optionalString (old.pname == "veloren-voxygen") "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs}"} \ + --set VELOREN_ASSETS ${assets} ''; in wrapped; diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index ea9826dbf7..fb8fcdf8a3 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -18,7 +18,6 @@ It is inspired by games such as Cube World, Legend of Zelda: Breath of the Wild, This package includes the official client, Voxygen. """ -runtimeLibs = ["libGL", "xorg.libX11", "xorg.libXcursor", "xorg.libXrandr", "xorg.libXi", "vulkan-loader", "vulkan-extension-layer", "shaderc.lib"] [features] hot-anim = ["anim/use-dyn-lib"] From 19021e6d80a6aacb55911277ac0cdd4114636f65 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 07:25:45 +0300 Subject: [PATCH 178/854] build(nix): add missing library for voxygen --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 63a2177839..186d25c137 100644 --- a/flake.nix +++ b/flake.nix @@ -170,6 +170,7 @@ xorg.libXcursor xorg.libXrandr xorg.libXi + xorg.libxcb vulkan-loader vulkan-extension-layer shaderc.lib From 8d3b8f444b768562452decf12cbb98a85dcbec05 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 08:00:06 +0300 Subject: [PATCH 179/854] build(nix): disable check for server cli --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index 186d25c137..6ef7c7cc2d 100644 --- a/flake.nix +++ b/flake.nix @@ -155,6 +155,8 @@ (oldAttrs.nativeBuildInputs or []) ++ [pkgs.makeWrapper]; + doCheck = false; + postConfigure = '' ${oldAttrs.postConfigure or ""} ${configMoldLinker} From 12fb3254de8404bc35ffef5fe1a656718a345d39 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 15:20:27 +0300 Subject: [PATCH 180/854] build(nix): add missing library for voxygen --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 6ef7c7cc2d..98875fc8b7 100644 --- a/flake.nix +++ b/flake.nix @@ -173,6 +173,7 @@ xorg.libXrandr xorg.libXi xorg.libxcb + libxkbcommon vulkan-loader vulkan-extension-layer shaderc.lib From 999984d15a2d1f550f0d918a9d9cff838f5e09fe Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 16:00:11 +0300 Subject: [PATCH 181/854] build(nix): refactor, dont pass git hash and tag --- flake.nix | 52 +++++++++++++++------------------ nix/dateTimeFormat.nix | 21 ++++++++++++++ nix/utils.nix | 66 ------------------------------------------ 3 files changed, 45 insertions(+), 94 deletions(-) create mode 100644 nix/dateTimeFormat.nix delete mode 100644 nix/utils.nix diff --git a/flake.nix b/flake.nix index 98875fc8b7..e349b0303c 100644 --- a/flake.nix +++ b/flake.nix @@ -31,30 +31,6 @@ pkgs = common.pkgs; lib = pkgs.lib; - gitLfsCheckFile = ./assets/voxygen/background/bg_main.jpg; - utils = import ./nix/utils.nix {inherit pkgs;}; - - sourceInfo = - if inputs.self.sourceInfo ? rev - then - inputs.self.sourceInfo - // { - # Tag would have to be set manually for stable releases flake - # because there's currently no way to get the tag via the interface. - # tag = v0.9.0; - } - else (throw "Can't get revision because the git tree is dirty"); - - prettyRev = with sourceInfo; - builtins.substring 0 8 rev - + "/" - + utils.dateTimeFormat lastModified; - - tag = - if sourceInfo ? tag - then sourceInfo.tag - else ""; - configMoldLinker = '' cat >>$CARGO_HOME/config.toml <= 0 then z else z - 146096) / 146097; + doe = z - era * 146097; + yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + y = yoe + era * 400; + doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + mp = (5 * doy + 2) / 153; + d = doy - (153 * mp + 2) / 5 + 1; + m = mp + (if mp < 10 then 3 else -9); + y' = y + (if m <= 2 then 1 else 0); + + pad = s: if builtins.stringLength s < 2 then "0" + s else s; +in "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}" diff --git a/nix/utils.nix b/nix/utils.nix deleted file mode 100644 index d815af63b8..0000000000 --- a/nix/utils.nix +++ /dev/null @@ -1,66 +0,0 @@ -{pkgs}: { - isGitLfsSetup = checkFile: let - gitLfsCheckOutput = builtins.readFile (pkgs.runCommand "gitLfsCheck" {} '' - result="$(${pkgs.file}/bin/file --mime-type ${checkFile})" - (if [ "$result" = "${checkFile}: image/jpeg" ]; then printf "0"; else printf "1"; fi) > $out - ''); - in - if gitLfsCheckOutput == "0" - then true - else - throw '' - Git Large File Storage (`git-lfs`) has not been set up correctly. - Most common reasons: - - `git-lfs` was not installed before cloning this repository. - - This repository was not cloned from the primary GitLab mirror. - - The GitHub mirror does not support LFS. - See the book at https://book.veloren.net/ for details. - Run `nix-shell -p git git-lfs --run "git lfs install --local && git lfs fetch && git lfs checkout"` - or `nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c "git lfs install --local && git lfs fetch && git lfs checkout"`. - ''; - - # Format number of seconds in the Unix epoch as %Y-%m-%d-%H:%M. - dateTimeFormat = t: let - rem = x: y: x - x / y * y; - days = t / 86400; - secondsInDay = rem t 86400; - hours = secondsInDay / 3600; - minutes = (rem secondsInDay 3600) / 60; - seconds = rem t 60; - - # Courtesy of https://stackoverflow.com/a/32158604. - z = days + 719468; - era = - ( - if z >= 0 - then z - else z - 146096 - ) - / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = - mp - + ( - if mp < 10 - then 3 - else -9 - ); - y' = - y - + ( - if m <= 2 - then 1 - else 0 - ); - - pad = s: - if builtins.stringLength s < 2 - then "0" + s - else s; - in "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}"; -} From 2af2b34d849f462d676035050fb9dce2a77af5d4 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 16:26:10 +0300 Subject: [PATCH 182/854] build: allow common to read git version information at runtime --- common/src/util/mod.rs | 14 ++++++++++++-- flake.nix | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/common/src/util/mod.rs b/common/src/util/mod.rs index 3aafea07cd..5ae200d307 100644 --- a/common/src/util/mod.rs +++ b/common/src/util/mod.rs @@ -8,11 +8,21 @@ pub mod projection; /// entities mod spatial_grid; -pub const GIT_VERSION: &str = include_str!(concat!(env!("OUT_DIR"), "/githash")); -pub const GIT_TAG: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag")); +pub const GIT_VERSION_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/githash")); +pub const GIT_TAG_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag")); pub const VELOREN_VERSION_STAGE: &str = "Pre-Alpha"; lazy_static::lazy_static! { + pub static ref GIT_VERSION: String = if GIT_VERSION_BUILD.is_empty() { + std::env::var("VELOREN_GIT_VERSION").expect("failed to get git version") + } else { + GIT_VERSION_BUILD.to_string() + }; + pub static ref GIT_TAG: String = if GIT_TAG_BUILD.is_empty() { + std::env::var("VELOREN_GIT_TAG").expect("failed to get git tag") + } else { + GIT_TAG_BUILD.to_string() + }; pub static ref GIT_HASH: &'static str = GIT_VERSION.split('/').next().expect("failed to retrieve git_hash!"); static ref GIT_DATETIME: &'static str = GIT_VERSION.split('/').nth(1).expect("failed to retrieve git_datetime!"); pub static ref GIT_DATE: String = GIT_DATETIME.split('-').take(3).collect::>().join("-"); diff --git a/flake.nix b/flake.nix index e349b0303c..db4b65fa1a 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,15 @@ outputs = inputs: let lib = inputs.nci.inputs.nixpkgs.lib; + git = let + sourceInfo = inputs.self.sourceInfo; + dateTimeFormat = import ./nix/dateTimeFormat.nix; + dateTime = dateTimeFormat sourceInfo.lastModified; + rev = sourceInfo.rev or "dirty"; + in { + prettyRev = (builtins.substring 0 8 rev) + "/" + dateTime; + tag = ""; + }; outputs = inputs.nci.lib.makeOutputs { root = ./.; defaultOutputs = { @@ -68,8 +77,8 @@ # We have to include the command output here, otherwise Nix won't run it DISABLE_GIT_LFS_CHECK = true; # We don't add in any information here because otherwise anything - # that depends on common will be recompiled. Ideally we should have - # a way to pass these in a wrapper, at runtime, rather than build time. + # that depends on common will be recompiled. We will set these in + # our wrapper instead. NIX_GIT_HASH = ""; NIX_GIT_TAG = ""; }; @@ -192,7 +201,9 @@ ln -sf ${old}/bin/* $out/bin/ wrapProgram $out/bin/* \ ${lib.optionalString (old.pname == "veloren-voxygen") "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs}"} \ - --set VELOREN_ASSETS ${assets} + --set VELOREN_ASSETS ${assets} \ + --set VELOREN_GIT_VERSION "${git.prettyRev}" \ + --set VELOREN_GIT_TAG "${git.tag}" ''; in wrapped; From e94acbec8bcfb04015087ab71b7b3bb2918feb51 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 16:31:52 +0300 Subject: [PATCH 183/854] fix: use as_str to get rid of doesn't implement display --- common/src/util/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/util/mod.rs b/common/src/util/mod.rs index 5ae200d307..ddbc9fb10d 100644 --- a/common/src/util/mod.rs +++ b/common/src/util/mod.rs @@ -30,12 +30,12 @@ lazy_static::lazy_static! { pub static ref DISPLAY_VERSION: String = if GIT_TAG.is_empty() { format!("{}-{}", VELOREN_VERSION_STAGE, *GIT_DATE) } else { - format!("{}-{}", VELOREN_VERSION_STAGE, GIT_TAG) + format!("{}-{}", VELOREN_VERSION_STAGE, GIT_TAG.as_str()) }; pub static ref DISPLAY_VERSION_LONG: String = if GIT_TAG.is_empty() { format!("{} ({})", DISPLAY_VERSION.as_str(), *GIT_HASH) } else { - format!("{} ({})", DISPLAY_VERSION.as_str(), GIT_VERSION) + format!("{} ({})", DISPLAY_VERSION.as_str(), GIT_VERSION.as_str()) }; } From 149763d54adc13ec15434b602d3347945b81cb4a Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 16:39:44 +0300 Subject: [PATCH 184/854] build(nix): add missing libraries for voxygen --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index db4b65fa1a..e10709342d 100644 --- a/flake.nix +++ b/flake.nix @@ -164,6 +164,8 @@ vulkan-loader vulkan-extension-layer shaderc.lib + udev + alsa-lib ]; assets = pkgs.runCommand "veloren-assets" {} '' mkdir $out From 8014730d640d3567a842ef2c76c8d361ed2ab6a8 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 16:51:26 +0300 Subject: [PATCH 185/854] build(nix): refactor some code --- flake.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index e10709342d..0eb2211d98 100644 --- a/flake.nix +++ b/flake.nix @@ -9,9 +9,9 @@ sourceInfo = inputs.self.sourceInfo; dateTimeFormat = import ./nix/dateTimeFormat.nix; dateTime = dateTimeFormat sourceInfo.lastModified; - rev = sourceInfo.rev or "dirty"; + shortRev = sourceInfo.shortRev or "dirty"; in { - prettyRev = (builtins.substring 0 8 rev) + "/" + dateTime; + prettyRev = shortRev + "/" + dateTime; tag = ""; }; outputs = inputs.nci.lib.makeOutputs { From 558f6be22200c33b8254daed6b33fc6794180aa0 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sat, 3 Sep 2022 17:37:38 +0300 Subject: [PATCH 186/854] build(nix): remove unused stuff --- flake.nix | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/flake.nix b/flake.nix index 0eb2211d98..3dc51b2832 100644 --- a/flake.nix +++ b/flake.nix @@ -105,7 +105,7 @@ ); nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) - ++ (with pkgs; [python3 makeWrapper]); + ++ (with pkgs; [python3]); VELOREN_USERDATA_STRATEGY = "system"; SHADERC_LIB_DIR = "${pkgs.shaderc.lib}/lib"; @@ -138,10 +138,6 @@ VELOREN_USERDATA_STRATEGY = "system"; - nativeBuildInputs = - (oldAttrs.nativeBuildInputs or []) - ++ [pkgs.makeWrapper]; - doCheck = false; postConfigure = '' From 6605c2657f08d77bb2b142389815aa3f4b35b89e Mon Sep 17 00:00:00 2001 From: Mckol Date: Mon, 9 May 2022 03:11:34 +0200 Subject: [PATCH 187/854] Added mute buttons for all of the audio sliders in settings --- .../element/ui/generic/buttons/mute_btn.png | 3 + .../ui/generic/buttons/mute_btn_hover.png | 3 + .../element/ui/generic/buttons/muted_btn.png | 3 + .../ui/generic/buttons/muted_btn_hover.png | 3 + voxygen/src/hud/img_ids.rs | 7 + voxygen/src/hud/settings_window/sound.rs | 127 +++++++++++++++--- voxygen/src/main.rs | 8 +- voxygen/src/run.rs | 10 +- voxygen/src/session/settings_change.rs | 78 +++++++++-- voxygen/src/settings/audio.rs | 38 ++++-- 10 files changed, 232 insertions(+), 48 deletions(-) create mode 100644 assets/voxygen/element/ui/generic/buttons/mute_btn.png create mode 100644 assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png create mode 100644 assets/voxygen/element/ui/generic/buttons/muted_btn.png create mode 100644 assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn.png b/assets/voxygen/element/ui/generic/buttons/mute_btn.png new file mode 100644 index 0000000000..dedca5520c --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af54ab92914772171fe25abb02b79bda3b2fab8bbf3491f6d50dfa3ab4a62825 +size 9711 diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png b/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png new file mode 100644 index 0000000000..2efe112e80 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a3cb4d6bf5262474233e1df5799b30d00bc145b180d6f121307ca8ede3b6b3c +size 9578 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn.png b/assets/voxygen/element/ui/generic/buttons/muted_btn.png new file mode 100644 index 0000000000..4c75976525 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2b2a9f0cbd164f066fe8d49524f5b08ec3e5b3f3070200fd0c3e1dcb8557f96 +size 8151 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png b/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png new file mode 100644 index 0000000000..91b3973e0b --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7412295437dc9dcde313d436fd84830e580506c52e5d7ff9c2622d2126075783 +size 8007 diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 19a36b0455..4153bee932 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -556,6 +556,13 @@ image_ids! { button_hover: "voxygen.element.ui.generic.buttons.button_hover", button_press: "voxygen.element.ui.generic.buttons.button_press", + // Mute Buttons + button_mute: "voxygen.element.ui.generic.buttons.mute_btn", + button_mute_hover: "voxygen.element.ui.generic.buttons.mute_btn_hover", + button_muted: "voxygen.element.ui.generic.buttons.muted_btn", + button_muted_hover: "voxygen.element.ui.generic.buttons.muted_btn_hover", + + // Enemy Healthbar enemy_health: "voxygen.element.ui.generic.frames.enemybar", enemy_health_bg: "voxygen.element.ui.generic.frames.enemybar_bg", diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index a575753b49..ba361f3376 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -3,7 +3,7 @@ use super::{RESET_BUTTONS_HEIGHT, RESET_BUTTONS_WIDTH}; use crate::{ hud::{img_ids::Imgs, TEXT_COLOR}, session::settings_change::{Audio as AudioChange, Audio::*}, - ui::{fonts::Fonts, ImageSlider}, + ui::{fonts::Fonts, ImageSlider, ToggleButton}, GlobalState, }; use conrod_core::{ @@ -22,18 +22,23 @@ widget_ids! { master_volume_text, master_volume_slider, master_volume_number, + master_volume_muted, inactive_master_volume_text, inactive_master_volume_slider, inactive_master_volume_number, + inactive_master_volume_muted, music_volume_text, music_volume_slider, music_volume_number, + music_volume_muted, sfx_volume_text, sfx_volume_slider, sfx_volume_number, + sfx_volume_muted, ambience_volume_text, ambience_volume_slider, ambience_volume_number, + ambience_volume_muted, music_spacing_text, music_spacing_slider, music_spacing_number, @@ -116,14 +121,14 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.master_volume_text, ui); // Master Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.master_volume, + self.global_state.settings.audio.master_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.master_volume_text, 10.0) + .right_from(state.ids.master_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -134,13 +139,26 @@ impl<'a> Widget for Sound<'a> { // Master Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.master_volume * 100.0 + self.global_state.settings.audio.master_volume.volume * 100.0 )) .right_from(state.ids.master_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.master_volume_number, ui); + // Master Volume Muted Indicator + let master_muted = ToggleButton::new( + self.global_state.settings.audio.master_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.master_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.master_volume_muted, ui); + if master_muted != self.global_state.settings.audio.master_volume.muted { + events.push(MuteMasterVolume(master_muted)); + } // Master Volume (inactive window) Text::new( @@ -148,21 +166,25 @@ impl<'a> Widget for Sound<'a> { .localized_strings .get_msg("hud-settings-inactive_master_volume_perc"), ) - .down_from(state.ids.master_volume_slider, 10.0) + .down_from(state.ids.master_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.inactive_master_volume_text, ui); // Master Volume (inactive window) Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.inactive_master_volume_perc, + self.global_state + .settings + .audio + .inactive_master_volume_perc + .volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.inactive_master_volume_text, 10.0) + .right_from(state.ids.inactive_master_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -173,31 +195,60 @@ impl<'a> Widget for Sound<'a> { // Master Volume (inactive window) Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.inactive_master_volume_perc * 100.0 + self.global_state + .settings + .audio + .inactive_master_volume_perc + .volume + * 100.0 )) .right_from(state.ids.inactive_master_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.inactive_master_volume_number, ui); + // Master Volume (inactive window) Muted Indicator + let inactive_master_muted = ToggleButton::new( + self.global_state + .settings + .audio + .inactive_master_volume_perc + .muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.inactive_master_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.inactive_master_volume_muted, ui); + if inactive_master_muted + != self + .global_state + .settings + .audio + .inactive_master_volume_perc + .muted + { + events.push(MuteInactiveMasterVolume(inactive_master_muted)); + } // Music Volume Text::new(&self.localized_strings.get_msg("hud-settings-music_volume")) - .down_from(state.ids.inactive_master_volume_slider, 10.0) + .down_from(state.ids.inactive_master_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.music_volume_text, ui); // Music Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.music_volume, + self.global_state.settings.audio.music_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.music_volume_text, 10.0) + .right_from(state.ids.music_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -208,13 +259,26 @@ impl<'a> Widget for Sound<'a> { // Music Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.music_volume * 100.0 + self.global_state.settings.audio.music_volume.volume * 100.0 )) .right_from(state.ids.music_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.music_volume_number, ui); + // Music Muted Indicator + let music_muted = ToggleButton::new( + self.global_state.settings.audio.music_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.music_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.music_volume_muted, ui); + if music_muted != self.global_state.settings.audio.music_volume.muted { + events.push(MuteMusicVolume(music_muted)); + } // SFX Volume Text::new( @@ -222,21 +286,21 @@ impl<'a> Widget for Sound<'a> { .localized_strings .get_msg("hud-settings-sound_effect_volume"), ) - .down_from(state.ids.music_volume_slider, 10.0) + .down_from(state.ids.music_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.sfx_volume_text, ui); // SFX Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.sfx_volume, + self.global_state.settings.audio.sfx_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.sfx_volume_text, 10.0) + .right_from(state.ids.sfx_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -247,13 +311,27 @@ impl<'a> Widget for Sound<'a> { // SFX Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.sfx_volume * 100.0 + self.global_state.settings.audio.sfx_volume.volume * 100.0 )) .right_from(state.ids.sfx_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.sfx_volume_number, ui); + // SFX Volume Muted Indicator + let sfx_muted = ToggleButton::new( + self.global_state.settings.audio.sfx_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.sfx_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.sfx_volume_muted, ui); + if sfx_muted != self.global_state.settings.audio.sfx_volume.muted { + events.push(MuteSfxVolume(sfx_muted)); + } + // Ambience Volume Text::new( &self @@ -267,7 +345,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.ambience_volume_text, ui); // Ambience Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.ambience_volume, + self.global_state.settings.audio.ambience_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, @@ -285,13 +363,26 @@ impl<'a> Widget for Sound<'a> { // Ambience Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.ambience_volume * 100.0 + self.global_state.settings.audio.ambience_volume.volume * 100.0 )) .right_from(state.ids.ambience_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.ambience_volume_number, ui); + // Ambience Volume Muted Indicator + let ambience_muted = ToggleButton::new( + self.global_state.settings.audio.ambience_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.ambience_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.ambience_volume_muted, ui); + if ambience_muted != self.global_state.settings.audio.ambience_volume.muted { + events.push(MuteAmbienceVolume(ambience_muted)); + } // Music spacing Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing")) diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 4e3f8ae100..0f0e76cfef 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -230,10 +230,10 @@ fn main() { // AudioOutput::Device(ref dev) => Some(dev.clone()), }; - audio.set_master_volume(settings.audio.master_volume); - audio.set_music_volume(settings.audio.music_volume); - audio.set_sfx_volume(settings.audio.sfx_volume); - audio.set_ambience_volume(settings.audio.ambience_volume); + audio.set_master_volume(settings.audio.master_volume.get_checked()); + audio.set_music_volume(settings.audio.music_volume.get_checked()); + audio.set_sfx_volume(settings.audio.sfx_volume.get_checked()); + audio.set_ambience_volume(settings.audio.ambience_volume.get_checked()); audio.set_music_spacing(settings.audio.music_spacing); // Load the profile. diff --git a/voxygen/src/run.rs b/voxygen/src/run.rs index 64a09ecd09..472eb4bbcc 100644 --- a/voxygen/src/run.rs +++ b/voxygen/src/run.rs @@ -89,10 +89,14 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) { if let winit::event::WindowEvent::Focused(focused) = event { global_state.audio.set_master_volume(if focused { - global_state.settings.audio.master_volume + global_state.settings.audio.master_volume.get_checked() } else { - global_state.settings.audio.inactive_master_volume_perc - * global_state.settings.audio.master_volume + global_state + .settings + .audio + .inactive_master_volume_perc + .get_checked() + * global_state.settings.audio.master_volume.get_checked() }); } diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 4c82431be8..56f413e996 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -8,8 +8,8 @@ use crate::{ }, render::RenderMode, settings::{ - AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings, GameplaySettings, - GraphicsSettings, InterfaceSettings, + audio::AudioVolume, AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings, + GameplaySettings, GraphicsSettings, InterfaceSettings, }, window::FullScreenSettings, GlobalState, @@ -19,10 +19,15 @@ use i18n::{LanguageMetadata, LocalizationHandle}; #[derive(Clone)] pub enum Audio { AdjustMasterVolume(f32), + MuteMasterVolume(bool), AdjustInactiveMasterVolume(f32), + MuteInactiveMasterVolume(bool), AdjustMusicVolume(f32), + MuteMusicVolume(bool), AdjustSfxVolume(f32), + MuteSfxVolume(bool), AdjustAmbienceVolume(f32), + MuteAmbienceVolume(bool), AdjustMusicSpacing(f32), //ChangeAudioDevice(String), ResetAudioSettings, @@ -194,31 +199,73 @@ settings_change_from!(Networking); impl SettingsChange { pub fn process(self, global_state: &mut GlobalState, session_state: &mut SessionState) { let mut settings = &mut global_state.settings; + match self { SettingsChange::Audio(audio_change) => { + fn update_volume(audio: &mut AudioVolume, volume: f32) -> f32 { + audio.volume = volume; + audio.get_checked() + } + fn update_muted(audio: &mut AudioVolume, muted: bool) -> f32 { + audio.muted = muted; + audio.get_checked() + } + match audio_change { Audio::AdjustMasterVolume(master_volume) => { - global_state.audio.set_master_volume(master_volume); + let volume_checked = + update_volume(&mut settings.audio.master_volume, master_volume); - settings.audio.master_volume = master_volume; + global_state.audio.set_master_volume(volume_checked); + }, + Audio::MuteMasterVolume(master_muted) => { + let volume_checked = + update_muted(&mut settings.audio.master_volume, master_muted); + + global_state.audio.set_master_volume(volume_checked); }, Audio::AdjustInactiveMasterVolume(inactive_master_volume_perc) => { - settings.audio.inactive_master_volume_perc = inactive_master_volume_perc; + settings.audio.inactive_master_volume_perc.volume = + inactive_master_volume_perc; + }, + Audio::MuteInactiveMasterVolume(inactive_master_volume_muted) => { + settings.audio.inactive_master_volume_perc.muted = + inactive_master_volume_muted; }, Audio::AdjustMusicVolume(music_volume) => { - global_state.audio.set_music_volume(music_volume); + let volume_checked = + update_volume(&mut settings.audio.music_volume, music_volume); - settings.audio.music_volume = music_volume; + global_state.audio.set_music_volume(volume_checked); + }, + Audio::MuteMusicVolume(music_muted) => { + let volume_checked = + update_muted(&mut settings.audio.music_volume, music_muted); + + global_state.audio.set_music_volume(volume_checked); }, Audio::AdjustSfxVolume(sfx_volume) => { - global_state.audio.set_sfx_volume(sfx_volume); + let volume_checked = + update_volume(&mut settings.audio.sfx_volume, sfx_volume); - settings.audio.sfx_volume = sfx_volume; + global_state.audio.set_sfx_volume(volume_checked); + }, + Audio::MuteSfxVolume(sfx_muted) => { + let volume_checked = + update_muted(&mut settings.audio.sfx_volume, sfx_muted); + + global_state.audio.set_sfx_volume(volume_checked); }, Audio::AdjustAmbienceVolume(ambience_volume) => { global_state.audio.set_ambience_volume(ambience_volume); - settings.audio.ambience_volume = ambience_volume; + settings.audio.ambience_volume.volume = ambience_volume; + }, + Audio::MuteAmbienceVolume(ambience_muted) => { + let volume_checked = + update_muted(&mut settings.audio.ambience_volume, ambience_muted); + + global_state.audio.set_ambience_volume(volume_checked); }, Audio::AdjustMusicSpacing(multiplier) => { global_state.audio.set_music_spacing(multiplier); @@ -232,9 +279,14 @@ impl SettingsChange { //}, Audio::ResetAudioSettings => { settings.audio = AudioSettings::default(); - let audio = &settings.audio; - global_state.audio.set_music_volume(audio.music_volume); - global_state.audio.set_sfx_volume(audio.sfx_volume); + + let audio = &mut global_state.audio; + + // TODO: check if updating the master volume is necessary + // (it wasn't done before) + audio.set_master_volume(settings.audio.master_volume.get_checked()); + audio.set_music_volume(settings.audio.music_volume.get_checked()); + audio.set_sfx_volume(settings.audio.sfx_volume.get_checked()); }, } }, diff --git a/voxygen/src/settings/audio.rs b/voxygen/src/settings/audio.rs index 11758daa9f..7e43300b3a 100644 --- a/voxygen/src/settings/audio.rs +++ b/voxygen/src/settings/audio.rs @@ -15,17 +15,35 @@ pub enum AudioOutput { impl AudioOutput { pub fn is_enabled(&self) -> bool { !matches!(self, Self::Off) } } + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub struct AudioVolume { + pub volume: f32, + pub muted: bool, +} + +impl AudioVolume { + pub fn new(volume: f32, muted: bool) -> Self { Self { volume, muted } } + + pub fn get_checked(&self) -> f32 { + match self.muted { + true => 0.0, + false => self.volume, + } + } +} + /// `AudioSettings` controls the volume of different audio subsystems and which /// device is used. #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default)] pub struct AudioSettings { - pub master_volume: f32, + pub master_volume: AudioVolume, #[serde(rename = "inactive_master_volume")] - pub inactive_master_volume_perc: f32, - pub music_volume: f32, - pub sfx_volume: f32, - pub ambience_volume: f32, + pub inactive_master_volume_perc: AudioVolume, + pub music_volume: AudioVolume, + pub sfx_volume: AudioVolume, + pub ambience_volume: AudioVolume, pub num_sfx_channels: usize, pub num_ui_channels: usize, pub music_spacing: f32, @@ -37,11 +55,11 @@ pub struct AudioSettings { impl Default for AudioSettings { fn default() -> Self { Self { - master_volume: 1.0, - inactive_master_volume_perc: 0.5, - music_volume: 0.25, - sfx_volume: 0.6, - ambience_volume: 0.6, + master_volume: AudioVolume::new(1.0, false), + inactive_master_volume_perc: AudioVolume::new(0.5, false), + music_volume: AudioVolume::new(0.4, false), + sfx_volume: AudioVolume::new(0.6, false), + ambience_volume: AudioVolume::new(0.6, false), num_sfx_channels: 60, num_ui_channels: 10, music_spacing: 1.0, From e4b213cac549cba6837552c9936782e0d4425795 Mon Sep 17 00:00:00 2001 From: Mckol Date: Mon, 9 May 2022 11:55:18 +0200 Subject: [PATCH 188/854] Added a keybind for muting the music [F8] --- voxygen/src/game_input.rs | 2 ++ voxygen/src/hud/mod.rs | 13 ++++++++++++- voxygen/src/settings/control.rs | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/voxygen/src/game_input.rs b/voxygen/src/game_input.rs index 537e954f26..c48a08c1aa 100644 --- a/voxygen/src/game_input.rs +++ b/voxygen/src/game_input.rs @@ -152,6 +152,8 @@ pub enum GameInput { SpectateSpeedBoost, #[strum(serialize = "gameinput-spectateviewpoint")] SpectateViewpoint, + #[strum(serialize = "gameinput-mute-music")] + MuteMusic, } impl GameInput { diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 5d950626d1..d03d2f969b 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -67,7 +67,9 @@ use crate::{ }, session::{ interactable::Interactable, - settings_change::{Chat as ChatChange, Interface as InterfaceChange, SettingsChange}, + settings_change::{ + Audio, Chat as ChatChange, Interface as InterfaceChange, SettingsChange, + }, }, settings::chat::ChatFilter, ui::{ @@ -4187,6 +4189,15 @@ impl Hud { GameInput::MapZoomOut if state => { handle_map_zoom(0.5, self.world_map.1, &self.show, global_state) }, + GameInput::MuteMusic if state => { + self.events + .push(Event::SettingsChange(SettingsChange::Audio( + Audio::MuteMusicVolume( + !global_state.settings.audio.music_volume.muted, + ), + ))); + true + }, // Skillbar input => { if let Some(slot) = try_hotbar_slot_from_input(input) { diff --git a/voxygen/src/settings/control.rs b/voxygen/src/settings/control.rs index 6ed306bc90..2e844c3cf6 100644 --- a/voxygen/src/settings/control.rs +++ b/voxygen/src/settings/control.rs @@ -191,6 +191,7 @@ impl ControlSettings { GameInput::MapSetMarker => KeyMouse::Mouse(MouseButton::Middle), GameInput::SpectateSpeedBoost => KeyMouse::Key(VirtualKeyCode::LControl), GameInput::SpectateViewpoint => KeyMouse::Mouse(MouseButton::Middle), + GameInput::MuteMusic => KeyMouse::Key(VirtualKeyCode::F8), } } } From e9ba3ffa4a2893c586b163d663f813ba78ef4e98 Mon Sep 17 00:00:00 2001 From: Mckol Date: Sun, 29 May 2022 20:17:02 +0200 Subject: [PATCH 189/854] Added the possibility to not assign a default keybind to a GameInput --- voxygen/src/menu/main/ui/connecting.rs | 5 +- voxygen/src/settings/control.rs | 143 +++++++++++++------------ 2 files changed, 77 insertions(+), 71 deletions(-) diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index 29cd0caacc..6778d52918 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -103,7 +103,10 @@ impl Screen { let key = |code| match controls.keybindings.get(&code) { Some(Some(key_mouse)) => key_mouse.display_string(key_layout), Some(None) => i18n.get_msg("main-unbound_key_tip").into_owned(), - None => ControlSettings::default_binding(code).display_string(key_layout), + None => match ControlSettings::default_binding(code) { + Some(key_mouse) => key_mouse.display_string(key_layout), + None => i18n.get_msg("main-unbound_key_tip").into_owned(), + }, }; let keys = i18n::fluent_args! { "gameinput-togglelantern" => key(GameInput::ToggleLantern), diff --git a/voxygen/src/settings/control.rs b/voxygen/src/settings/control.rs index 2e844c3cf6..28c5a96309 100644 --- a/voxygen/src/settings/control.rs +++ b/voxygen/src/settings/control.rs @@ -17,7 +17,7 @@ impl From for ControlSettingsSerde { // Do a delta between default() ControlSettings and the argument, and let // keybindings be only the custom keybindings chosen by the user. for (k, v) in control_settings.keybindings { - if Some(ControlSettings::default_binding(k)) != v { + if ControlSettings::default_binding(k) != v { // Keybinding chosen by the user user_bindings.insert(k, v); } @@ -121,77 +121,77 @@ impl ControlSettings { false } - pub fn default_binding(game_input: GameInput) -> KeyMouse { + pub fn default_binding(game_input: GameInput) -> Option { // If a new GameInput is added, be sure to update GameInput::iterator() too! match game_input { - GameInput::Primary => KeyMouse::Mouse(MouseButton::Left), - GameInput::Secondary => KeyMouse::Mouse(MouseButton::Right), - GameInput::Block => KeyMouse::Key(VirtualKeyCode::LAlt), - GameInput::ToggleCursor => KeyMouse::Key(VirtualKeyCode::Comma), - GameInput::Escape => KeyMouse::Key(VirtualKeyCode::Escape), - GameInput::Chat => KeyMouse::Key(VirtualKeyCode::Return), - GameInput::Command => KeyMouse::Key(VirtualKeyCode::Slash), - GameInput::MoveForward => KeyMouse::Key(VirtualKeyCode::W), - GameInput::MoveLeft => KeyMouse::Key(VirtualKeyCode::A), - GameInput::MoveBack => KeyMouse::Key(VirtualKeyCode::S), - GameInput::MoveRight => KeyMouse::Key(VirtualKeyCode::D), - GameInput::Jump => KeyMouse::Key(VirtualKeyCode::Space), - GameInput::Sit => KeyMouse::Key(VirtualKeyCode::K), - GameInput::Dance => KeyMouse::Key(VirtualKeyCode::J), - GameInput::Greet => KeyMouse::Key(VirtualKeyCode::H), - GameInput::Glide => KeyMouse::Key(VirtualKeyCode::LControl), - GameInput::Climb => KeyMouse::Key(VirtualKeyCode::Space), - GameInput::ClimbDown => KeyMouse::Key(VirtualKeyCode::LShift), - GameInput::SwimUp => KeyMouse::Key(VirtualKeyCode::Space), - GameInput::SwimDown => KeyMouse::Key(VirtualKeyCode::LShift), - GameInput::Fly => KeyMouse::Key(VirtualKeyCode::H), - GameInput::Sneak => KeyMouse::Key(VirtualKeyCode::LShift), - GameInput::ToggleLantern => KeyMouse::Key(VirtualKeyCode::G), - GameInput::Mount => KeyMouse::Key(VirtualKeyCode::F), - GameInput::Map => KeyMouse::Key(VirtualKeyCode::M), - GameInput::Bag => KeyMouse::Key(VirtualKeyCode::B), - GameInput::Trade => KeyMouse::Key(VirtualKeyCode::T), - GameInput::Social => KeyMouse::Key(VirtualKeyCode::O), - GameInput::Crafting => KeyMouse::Key(VirtualKeyCode::C), - GameInput::Spellbook => KeyMouse::Key(VirtualKeyCode::P), - GameInput::Settings => KeyMouse::Key(VirtualKeyCode::F10), - GameInput::Help => KeyMouse::Key(VirtualKeyCode::F1), - GameInput::ToggleInterface => KeyMouse::Key(VirtualKeyCode::F2), - GameInput::ToggleDebug => KeyMouse::Key(VirtualKeyCode::F3), + GameInput::Primary => Some(KeyMouse::Mouse(MouseButton::Left)), + GameInput::Secondary => Some(KeyMouse::Mouse(MouseButton::Right)), + GameInput::Block => Some(KeyMouse::Key(VirtualKeyCode::LAlt)), + GameInput::ToggleCursor => Some(KeyMouse::Key(VirtualKeyCode::Comma)), + GameInput::Escape => Some(KeyMouse::Key(VirtualKeyCode::Escape)), + GameInput::Chat => Some(KeyMouse::Key(VirtualKeyCode::Return)), + GameInput::Command => Some(KeyMouse::Key(VirtualKeyCode::Slash)), + GameInput::MoveForward => Some(KeyMouse::Key(VirtualKeyCode::W)), + GameInput::MoveLeft => Some(KeyMouse::Key(VirtualKeyCode::A)), + GameInput::MoveBack => Some(KeyMouse::Key(VirtualKeyCode::S)), + GameInput::MoveRight => Some(KeyMouse::Key(VirtualKeyCode::D)), + GameInput::Jump => Some(KeyMouse::Key(VirtualKeyCode::Space)), + GameInput::Sit => Some(KeyMouse::Key(VirtualKeyCode::K)), + GameInput::Dance => Some(KeyMouse::Key(VirtualKeyCode::J)), + GameInput::Greet => Some(KeyMouse::Key(VirtualKeyCode::H)), + GameInput::Glide => Some(KeyMouse::Key(VirtualKeyCode::LControl)), + GameInput::Climb => Some(KeyMouse::Key(VirtualKeyCode::Space)), + GameInput::ClimbDown => Some(KeyMouse::Key(VirtualKeyCode::LShift)), + GameInput::SwimUp => Some(KeyMouse::Key(VirtualKeyCode::Space)), + GameInput::SwimDown => Some(KeyMouse::Key(VirtualKeyCode::LShift)), + GameInput::Fly => Some(KeyMouse::Key(VirtualKeyCode::H)), + GameInput::Sneak => Some(KeyMouse::Key(VirtualKeyCode::LShift)), + GameInput::ToggleLantern => Some(KeyMouse::Key(VirtualKeyCode::G)), + GameInput::Mount => Some(KeyMouse::Key(VirtualKeyCode::F)), + GameInput::Map => Some(KeyMouse::Key(VirtualKeyCode::M)), + GameInput::Bag => Some(KeyMouse::Key(VirtualKeyCode::B)), + GameInput::Trade => Some(KeyMouse::Key(VirtualKeyCode::T)), + GameInput::Social => Some(KeyMouse::Key(VirtualKeyCode::O)), + GameInput::Crafting => Some(KeyMouse::Key(VirtualKeyCode::C)), + GameInput::Spellbook => Some(KeyMouse::Key(VirtualKeyCode::P)), + GameInput::Settings => Some(KeyMouse::Key(VirtualKeyCode::F10)), + GameInput::Help => Some(KeyMouse::Key(VirtualKeyCode::F1)), + GameInput::ToggleInterface => Some(KeyMouse::Key(VirtualKeyCode::F2)), + GameInput::ToggleDebug => Some(KeyMouse::Key(VirtualKeyCode::F3)), #[cfg(feature = "egui-ui")] - GameInput::ToggleEguiDebug => KeyMouse::Key(VirtualKeyCode::F7), - GameInput::ToggleChat => KeyMouse::Key(VirtualKeyCode::F5), - GameInput::Fullscreen => KeyMouse::Key(VirtualKeyCode::F11), - GameInput::Screenshot => KeyMouse::Key(VirtualKeyCode::F4), - GameInput::ToggleIngameUi => KeyMouse::Key(VirtualKeyCode::F6), - GameInput::Roll => MIDDLE_CLICK_KEY, - GameInput::Respawn => KeyMouse::Key(VirtualKeyCode::Space), - GameInput::Interact => KeyMouse::Key(VirtualKeyCode::E), - GameInput::ToggleWield => KeyMouse::Key(VirtualKeyCode::R), - GameInput::FreeLook => KeyMouse::Key(VirtualKeyCode::L), - GameInput::AutoWalk => KeyMouse::Key(VirtualKeyCode::Period), - GameInput::CameraClamp => KeyMouse::Key(VirtualKeyCode::Apostrophe), - GameInput::CycleCamera => KeyMouse::Key(VirtualKeyCode::Key0), - GameInput::Slot1 => KeyMouse::Key(VirtualKeyCode::Key1), - GameInput::Slot2 => KeyMouse::Key(VirtualKeyCode::Key2), - GameInput::Slot3 => KeyMouse::Key(VirtualKeyCode::Key3), - GameInput::Slot4 => KeyMouse::Key(VirtualKeyCode::Key4), - GameInput::Slot5 => KeyMouse::Key(VirtualKeyCode::Key5), - GameInput::Slot6 => KeyMouse::Key(VirtualKeyCode::Key6), - GameInput::Slot7 => KeyMouse::Key(VirtualKeyCode::Key7), - GameInput::Slot8 => KeyMouse::Key(VirtualKeyCode::Key8), - GameInput::Slot9 => KeyMouse::Key(VirtualKeyCode::Key9), - GameInput::Slot10 => KeyMouse::Key(VirtualKeyCode::Q), - GameInput::SwapLoadout => KeyMouse::Key(VirtualKeyCode::Tab), - GameInput::Select => KeyMouse::Key(VirtualKeyCode::X), - GameInput::AcceptGroupInvite => KeyMouse::Key(VirtualKeyCode::Y), - GameInput::DeclineGroupInvite => KeyMouse::Key(VirtualKeyCode::N), - GameInput::MapZoomIn => KeyMouse::Key(VirtualKeyCode::Plus), - GameInput::MapZoomOut => KeyMouse::Key(VirtualKeyCode::Minus), - GameInput::MapSetMarker => KeyMouse::Mouse(MouseButton::Middle), - GameInput::SpectateSpeedBoost => KeyMouse::Key(VirtualKeyCode::LControl), - GameInput::SpectateViewpoint => KeyMouse::Mouse(MouseButton::Middle), - GameInput::MuteMusic => KeyMouse::Key(VirtualKeyCode::F8), + GameInput::ToggleEguiDebug => Some(KeyMouse::Key(VirtualKeyCode::F7)), + GameInput::ToggleChat => Some(KeyMouse::Key(VirtualKeyCode::F5)), + GameInput::Fullscreen => Some(KeyMouse::Key(VirtualKeyCode::F11)), + GameInput::Screenshot => Some(KeyMouse::Key(VirtualKeyCode::F4)), + GameInput::ToggleIngameUi => Some(KeyMouse::Key(VirtualKeyCode::F6)), + GameInput::Roll => Some(MIDDLE_CLICK_KEY), + GameInput::Respawn => Some(KeyMouse::Key(VirtualKeyCode::Space)), + GameInput::Interact => Some(KeyMouse::Key(VirtualKeyCode::E)), + GameInput::ToggleWield => Some(KeyMouse::Key(VirtualKeyCode::R)), + GameInput::FreeLook => Some(KeyMouse::Key(VirtualKeyCode::L)), + GameInput::AutoWalk => Some(KeyMouse::Key(VirtualKeyCode::Period)), + GameInput::CameraClamp => Some(KeyMouse::Key(VirtualKeyCode::Apostrophe)), + GameInput::CycleCamera => Some(KeyMouse::Key(VirtualKeyCode::Key0)), + GameInput::Slot1 => Some(KeyMouse::Key(VirtualKeyCode::Key1)), + GameInput::Slot2 => Some(KeyMouse::Key(VirtualKeyCode::Key2)), + GameInput::Slot3 => Some(KeyMouse::Key(VirtualKeyCode::Key3)), + GameInput::Slot4 => Some(KeyMouse::Key(VirtualKeyCode::Key4)), + GameInput::Slot5 => Some(KeyMouse::Key(VirtualKeyCode::Key5)), + GameInput::Slot6 => Some(KeyMouse::Key(VirtualKeyCode::Key6)), + GameInput::Slot7 => Some(KeyMouse::Key(VirtualKeyCode::Key7)), + GameInput::Slot8 => Some(KeyMouse::Key(VirtualKeyCode::Key8)), + GameInput::Slot9 => Some(KeyMouse::Key(VirtualKeyCode::Key9)), + GameInput::Slot10 => Some(KeyMouse::Key(VirtualKeyCode::Q)), + GameInput::SwapLoadout => Some(KeyMouse::Key(VirtualKeyCode::Tab)), + GameInput::Select => Some(KeyMouse::Key(VirtualKeyCode::X)), + GameInput::AcceptGroupInvite => Some(KeyMouse::Key(VirtualKeyCode::Y)), + GameInput::DeclineGroupInvite => Some(KeyMouse::Key(VirtualKeyCode::N)), + GameInput::MapZoomIn => Some(KeyMouse::Key(VirtualKeyCode::Plus)), + GameInput::MapZoomOut => Some(KeyMouse::Key(VirtualKeyCode::Minus)), + GameInput::MapSetMarker => Some(KeyMouse::Mouse(MouseButton::Middle)), + GameInput::SpectateSpeedBoost => Some(KeyMouse::Key(VirtualKeyCode::LControl)), + GameInput::SpectateViewpoint => Some(KeyMouse::Mouse(MouseButton::Middle)), + GameInput::MuteMusic => Some(KeyMouse::Key(VirtualKeyCode::F8)), } } } @@ -204,7 +204,10 @@ impl Default for ControlSettings { }; // Sets the initial keybindings for those GameInputs. for game_input in GameInput::iter() { - new_settings.insert_binding(game_input, ControlSettings::default_binding(game_input)); + match ControlSettings::default_binding(game_input) { + None => {}, + Some(default) => new_settings.insert_binding(game_input, default), + }; } new_settings } From c01d32e273bf3aab5da9fcb9a677fc64acc096b3 Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Tue, 23 Aug 2022 11:30:43 +0200 Subject: [PATCH 190/854] Updated my entry in the mailmap file. --- .mailmap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mailmap b/.mailmap index 7e6c959c6d..e39ddbfab0 100644 --- a/.mailmap +++ b/.mailmap @@ -1 +1 @@ -Mckol +LunarEclipse From 33ded63da919a15b269fcc59afb5aa8ba6d91b8a Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Tue, 23 Aug 2022 12:08:04 +0200 Subject: [PATCH 191/854] Improved mute button assets (TODO merge with a5f446a7) --- assets/voxygen/element/ui/generic/buttons/mute_btn.png | 4 ++-- assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png | 4 ++-- .../voxygen/element/ui/generic/buttons/mute_btn_pressed.png | 3 +++ assets/voxygen/element/ui/generic/buttons/muted_btn.png | 4 ++-- assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png | 4 ++-- .../voxygen/element/ui/generic/buttons/muted_btn_pressed.png | 3 +++ 6 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 assets/voxygen/element/ui/generic/buttons/mute_btn_pressed.png create mode 100644 assets/voxygen/element/ui/generic/buttons/muted_btn_pressed.png diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn.png b/assets/voxygen/element/ui/generic/buttons/mute_btn.png index dedca5520c..94ea3386d7 100644 --- a/assets/voxygen/element/ui/generic/buttons/mute_btn.png +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af54ab92914772171fe25abb02b79bda3b2fab8bbf3491f6d50dfa3ab4a62825 -size 9711 +oid sha256:255e7db2caa517127155a7020bed541a73370a331095005e7f28674d3fa5c012 +size 10569 diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png b/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png index 2efe112e80..f7d01e4027 100644 --- a/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a3cb4d6bf5262474233e1df5799b30d00bc145b180d6f121307ca8ede3b6b3c -size 9578 +oid sha256:c9fa85824ca6549635af6da138c910433f2bd53dec153cdee1f1f3cb5c5dca55 +size 10095 diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn_pressed.png b/assets/voxygen/element/ui/generic/buttons/mute_btn_pressed.png new file mode 100644 index 0000000000..a0df75c94c --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn_pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38221a4250b6a0f2ae4aa6dfbb4e58161eec91fd4bb9633dc8112209a22f9d81 +size 9905 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn.png b/assets/voxygen/element/ui/generic/buttons/muted_btn.png index 4c75976525..b30c5e8c79 100644 --- a/assets/voxygen/element/ui/generic/buttons/muted_btn.png +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e2b2a9f0cbd164f066fe8d49524f5b08ec3e5b3f3070200fd0c3e1dcb8557f96 -size 8151 +oid sha256:e82eb2392e8b410e45c2f94a5f4a7b0b38fd464ea3c10643c445723f75231767 +size 8919 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png b/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png index 91b3973e0b..9ecb77e7b6 100644 --- a/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7412295437dc9dcde313d436fd84830e580506c52e5d7ff9c2622d2126075783 -size 8007 +oid sha256:c38155c4e65598ed137574416c48f9380b150d5932f0c93d92472413faea276e +size 8384 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn_pressed.png b/assets/voxygen/element/ui/generic/buttons/muted_btn_pressed.png new file mode 100644 index 0000000000..6bc90734ae --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn_pressed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e3ac975ef54cb831bba6094df7e1f75ded1e4c2e731a3e878fee4b15e557da8 +size 8396 From 36167f2e3a7932ac3ec63058086a700afa8d5018 Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Sat, 3 Sep 2022 18:03:04 +0200 Subject: [PATCH 192/854] Renamed some files, added missing img_ids. --- .../buttons/{mute_btn_pressed.png => mute_btn_press.png} | 0 .../buttons/{muted_btn_pressed.png => muted_btn_press.png} | 0 voxygen/src/hud/img_ids.rs | 2 ++ 3 files changed, 2 insertions(+) rename assets/voxygen/element/ui/generic/buttons/{mute_btn_pressed.png => mute_btn_press.png} (100%) rename assets/voxygen/element/ui/generic/buttons/{muted_btn_pressed.png => muted_btn_press.png} (100%) diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn_pressed.png b/assets/voxygen/element/ui/generic/buttons/mute_btn_press.png similarity index 100% rename from assets/voxygen/element/ui/generic/buttons/mute_btn_pressed.png rename to assets/voxygen/element/ui/generic/buttons/mute_btn_press.png diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn_pressed.png b/assets/voxygen/element/ui/generic/buttons/muted_btn_press.png similarity index 100% rename from assets/voxygen/element/ui/generic/buttons/muted_btn_pressed.png rename to assets/voxygen/element/ui/generic/buttons/muted_btn_press.png diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 4153bee932..7d55e98875 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -559,8 +559,10 @@ image_ids! { // Mute Buttons button_mute: "voxygen.element.ui.generic.buttons.mute_btn", button_mute_hover: "voxygen.element.ui.generic.buttons.mute_btn_hover", + button_mute_press: "voxygen.element.ui.generic.buttons.mute_btn_press", button_muted: "voxygen.element.ui.generic.buttons.muted_btn", button_muted_hover: "voxygen.element.ui.generic.buttons.muted_btn_hover", + button_muted_press: "voxygen.element.ui.generic.buttons.muted_btn_press", // Enemy Healthbar From 24c50fab3b6a2958b4130531ee605be188e87430 Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Sat, 3 Sep 2022 20:08:15 +0200 Subject: [PATCH 193/854] Updated the code to use the new hover icons --- voxygen/src/hud/settings_window/sound.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index ba361f3376..4be0bf751f 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -154,7 +154,8 @@ impl<'a> Widget for Sound<'a> { ) .w_h(24.0, 25.0) .down_from(state.ids.master_volume_text, 10.0) - .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .press_images(self.imgs.button_mute_press, self.imgs.button_muted_press) .set(state.ids.master_volume_muted, ui); if master_muted != self.global_state.settings.audio.master_volume.muted { events.push(MuteMasterVolume(master_muted)); @@ -219,7 +220,8 @@ impl<'a> Widget for Sound<'a> { ) .w_h(24.0, 25.0) .down_from(state.ids.inactive_master_volume_text, 10.0) - .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .press_images(self.imgs.button_mute_press, self.imgs.button_muted_press) .set(state.ids.inactive_master_volume_muted, ui); if inactive_master_muted != self @@ -274,7 +276,8 @@ impl<'a> Widget for Sound<'a> { ) .w_h(24.0, 25.0) .down_from(state.ids.music_volume_text, 10.0) - .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .press_images(self.imgs.button_mute_press, self.imgs.button_muted_press) .set(state.ids.music_volume_muted, ui); if music_muted != self.global_state.settings.audio.music_volume.muted { events.push(MuteMusicVolume(music_muted)); @@ -326,7 +329,8 @@ impl<'a> Widget for Sound<'a> { ) .w_h(24.0, 25.0) .down_from(state.ids.sfx_volume_text, 10.0) - .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .press_images(self.imgs.button_mute_press, self.imgs.button_muted_press) .set(state.ids.sfx_volume_muted, ui); if sfx_muted != self.global_state.settings.audio.sfx_volume.muted { events.push(MuteSfxVolume(sfx_muted)); @@ -378,7 +382,8 @@ impl<'a> Widget for Sound<'a> { ) .w_h(24.0, 25.0) .down_from(state.ids.ambience_volume_text, 10.0) - .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .press_images(self.imgs.button_mute_press, self.imgs.button_muted_press) .set(state.ids.ambience_volume_muted, ui); if ambience_muted != self.global_state.settings.audio.ambience_volume.muted { events.push(MuteAmbienceVolume(ambience_muted)); From be9e0497d1bfedd81a05becca086a63baff15418 Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Sat, 3 Sep 2022 20:15:50 +0200 Subject: [PATCH 194/854] Fixed the ambience volume ui element positions --- voxygen/src/hud/settings_window/sound.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index 4be0bf751f..253402f57c 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -8,7 +8,7 @@ use crate::{ }; use conrod_core::{ color, - position::Relative, + position::{Align, Relative}, widget::{self, Button, Rectangle, Scrollbar, Text}, widget_ids, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon, }; @@ -342,7 +342,7 @@ impl<'a> Widget for Sound<'a> { .localized_strings .get_msg("hud-settings-ambience_volume"), ) - .down_from(state.ids.sfx_volume_slider, 10.0) + .down_from(state.ids.sfx_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) @@ -356,7 +356,7 @@ impl<'a> Widget for Sound<'a> { self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.ambience_volume_text, 10.0) + .right_from(state.ids.ambience_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -391,7 +391,7 @@ impl<'a> Widget for Sound<'a> { // Music spacing Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing")) - .down_from(state.ids.ambience_volume_slider, 10.0) + .down_from(state.ids.ambience_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) @@ -406,6 +406,7 @@ impl<'a> Widget for Sound<'a> { ) .w_h(104.0, 22.0) .down_from(state.ids.music_spacing_text, 10.0) + .x_align_to(state.ids.ambience_volume_slider, Align::Start) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -457,6 +458,7 @@ impl<'a> Widget for Sound<'a> { .hover_image(self.imgs.button_hover) .press_image(self.imgs.button_press) .down_from(state.ids.music_spacing_slider, 12.0) + .x_align_to(state.ids.ambience_volume_text, Align::Start) .label(&self.localized_strings.get_msg("hud-settings-reset_sound")) .label_font_size(self.fonts.cyri.scale(14)) .label_color(TEXT_COLOR) From 18888639151962c9546b589643249bd5112f6cee Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 3 Sep 2022 17:22:28 -0400 Subject: [PATCH 195/854] Add CLI argument to voxygen that allows specifying a value to place into the server field in the main menu. --- Cargo.lock | 29 +++++++++++++++-------------- voxygen/Cargo.toml | 3 +++ voxygen/src/cli.rs | 19 +++++++++++++++++++ voxygen/src/main.rs | 8 +++++++- voxygen/src/menu/main/mod.rs | 4 ++-- voxygen/src/menu/main/ui/mod.rs | 6 ++++-- voxygen/src/run.rs | 5 +++-- 7 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 voxygen/src/cli.rs diff --git a/Cargo.lock b/Cargo.lock index e21d2fbd2e..4e841742f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -687,16 +687,16 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.10" +version = "3.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3124f3f75ce09e22d1410043e1e24f2ecc44fad3afe4f08408f1f7663d68da2b" +checksum = "23b71c3ce99b7611011217b366d923f1d0a7e07a92bb2dbf1e84508c673ca3bd" dependencies = [ "atty", "bitflags", "clap_derive", "clap_lex", "indexmap", - "lazy_static", + "once_cell", "strsim 0.10.0", "termcolor", "textwrap 0.15.0", @@ -704,9 +704,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.1.7" +version = "3.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -717,9 +717,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.1.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" dependencies = [ "os_str_bytes", ] @@ -4016,9 +4016,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" [[package]] name = "oorandom" @@ -6501,7 +6501,7 @@ dependencies = [ "async-channel", "authc", "byteorder", - "clap 3.1.10", + "clap 3.2.20", "hashbrown 0.12.0", "image", "num 0.4.0", @@ -6688,7 +6688,7 @@ dependencies = [ "bincode", "bitflags", "bytes", - "clap 3.1.10", + "clap 3.2.20", "criterion", "crossbeam-channel", "futures-core", @@ -6811,7 +6811,7 @@ name = "veloren-server-cli" version = "0.13.0" dependencies = [ "ansi-parser", - "clap 3.1.10", + "clap 3.2.20", "crossterm 0.23.2", "lazy_static", "mimalloc", @@ -6840,6 +6840,7 @@ dependencies = [ "bytemuck", "chrono", "chumsky", + "clap 3.2.20", "cmake", "conrod_core", "conrod_winit", @@ -6962,7 +6963,7 @@ dependencies = [ name = "veloren-voxygen-i18n" version = "0.13.0" dependencies = [ - "clap 3.1.10", + "clap 3.2.20", "deunicode", "fluent", "fluent-bundle", @@ -6983,7 +6984,7 @@ dependencies = [ "arr_macro", "bincode", "bitvec", - "clap 3.1.10", + "clap 3.2.20", "criterion", "csv", "deflate", diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index 48d4026f18..e8b08ba855 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -91,6 +91,9 @@ gilrs = {version = "0.8.0", features = ["serde-serialize"]} # Singleplayer server = { package = "veloren-server", path = "../server", optional = true, default-features = false, features = ["worldgen"] } +# CLI +clap = { version = "3.2.20", features = ["derive"] } + # Utility assets_manager = {version = "0.8", features = ["ab_glyph"]} backtrace = "0.3.40" diff --git a/voxygen/src/cli.rs b/voxygen/src/cli.rs new file mode 100644 index 0000000000..2aefc2abe9 --- /dev/null +++ b/voxygen/src/cli.rs @@ -0,0 +1,19 @@ +//! NOTE: Some of these arguments are used by airshipper, so those needs to be +//! kept fairly stable (probably with some sort of migration period if we need +//! to modify the name or semantics). +//! +//! The arguments used by airshipper are: +//! * `server` +//! +//! Airshipper should only use arguments listed above! Since we will not try to +//! be careful about their stability otherwise. +use clap::Parser; + +#[derive(Parser)] +pub struct Args { + /// Value to auto-fill into the server field. + /// + /// This allows passing in server selection performed in airshipper. + #[clap(short, long)] + pub server: Option, +} diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 4e3f8ae100..8bde511768 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -2,6 +2,8 @@ #![feature(bool_to_option)] #![recursion_limit = "2048"] +mod cli; + #[cfg(all( target_os = "windows", not(feature = "tracy-memory"), @@ -182,6 +184,10 @@ fn main() { default_hook(panic_info); })); + // Process CLI arguments + use clap::Parser; + let args = cli::Args::parse(); + // Setup tokio runtime use common::consts::MIN_RECOMMENDED_TOKIO_THREADS; use std::sync::{ @@ -317,5 +323,5 @@ fn main() { discord, }; - run::run(global_state, event_loop); + run::run(global_state, event_loop, args.server); } diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 7b7d3cfa1e..8be7c547da 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -54,9 +54,9 @@ pub struct MainMenuState { impl MainMenuState { /// Create a new `MainMenuState`. - pub fn new(global_state: &mut GlobalState) -> Self { + pub fn new(global_state: &mut GlobalState, server: Option) -> Self { Self { - main_menu_ui: MainMenuUi::new(global_state), + main_menu_ui: MainMenuUi::new(global_state, server), init: InitState::None, scene: Scene::new(global_state.window.renderer_mut()), } diff --git a/voxygen/src/menu/main/ui/mod.rs b/voxygen/src/menu/main/ui/mod.rs index f68ffabafc..265be09371 100644 --- a/voxygen/src/menu/main/ui/mod.rs +++ b/voxygen/src/menu/main/ui/mod.rs @@ -180,6 +180,7 @@ impl Controls { bg_img: widget::image::Handle, i18n: LocalizationHandle, settings: &Settings, + server: Option, ) -> Self { let version = common::util::DISPLAY_VERSION_LONG.clone(); let alpha = format!("Veloren {}", common::util::DISPLAY_VERSION.as_str()); @@ -201,7 +202,7 @@ impl Controls { let login_info = LoginInfo { username: settings.networking.username.clone(), password: String::new(), - server: settings.networking.default_server.clone(), + server: server.unwrap_or_else(|| settings.networking.default_server.clone()), }; let selected_server_index = settings .networking @@ -517,7 +518,7 @@ pub struct MainMenuUi { } impl MainMenuUi { - pub fn new(global_state: &mut GlobalState) -> Self { + pub fn new(global_state: &mut GlobalState, server: Option) -> Self { // Load language let i18n = &global_state.i18n.read(); // TODO: don't add default font twice @@ -541,6 +542,7 @@ impl MainMenuUi { ui.add_graphic(Graphic::Image(bg_img, None)), global_state.i18n, &global_state.settings, + server, ); Self { ui, controls } diff --git a/voxygen/src/run.rs b/voxygen/src/run.rs index 64a09ecd09..8e2da638f8 100644 --- a/voxygen/src/run.rs +++ b/voxygen/src/run.rs @@ -9,9 +9,10 @@ use common_base::{prof_span, span}; use std::{mem, time::Duration}; use tracing::debug; -pub fn run(mut global_state: GlobalState, event_loop: EventLoop) { +pub fn run(mut global_state: GlobalState, event_loop: EventLoop, server: Option) { // Set up the initial play state. - let mut states: Vec> = vec![Box::new(MainMenuState::new(&mut global_state))]; + let mut states: Vec> = + vec![Box::new(MainMenuState::new(&mut global_state, server))]; states.last_mut().map(|current_state| { current_state.enter(&mut global_state, Direction::Forwards); let current_state = current_state.name(); From 960aac307d1b87066e82d4d558b097cec0e40d4c Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sun, 4 Sep 2022 01:26:34 +0300 Subject: [PATCH 196/854] build(nix): refactor flake with new nci --- flake.lock | 6 +- flake.nix | 193 +++++++++++++++++++++++------------------------------ 2 files changed, 86 insertions(+), 113 deletions(-) diff --git a/flake.lock b/flake.lock index 7f7a701aaf..537f6061b5 100644 --- a/flake.lock +++ b/flake.lock @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662177071, - "narHash": "sha256-x6XF//RdZlw81tFAYM1TkjY+iQIpyMCWZ46r9o4wVQY=", + "lastModified": 1662234098, + "narHash": "sha256-zl52sS2Jr2lOguuC4DpLYLU+JYFzjV0xaFycwllKFAE=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "65270dea87bb82fc02102a15221677eea237680e", + "rev": "3066def381d38288a9ecdf9a620fbb756c588ec1", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 3dc51b2832..4d023463e3 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,7 @@ outputs = inputs: let lib = inputs.nci.inputs.nixpkgs.lib; + git = let sourceInfo = inputs.self.sourceInfo; dateTimeFormat = import ./nix/dateTimeFormat.nix; @@ -14,7 +15,86 @@ prettyRev = shortRev + "/" + dateTime; tag = ""; }; - outputs = inputs.nci.lib.makeOutputs { + + filteredSource = let + pathsToIgnore = [ + "flake.nix" + "flake.lock" + "nix" + "assets" + "README.md" + "CONTRIBUTING.md" + "CHANGELOG.md" + "CODE_OF_CONDUCT.md" + "clippy.toml" + ]; + ignorePaths = path: type: let + split = lib.splitString "/" path; + actual = lib.drop 4 split; + _path = lib.concatStringsSep "/" actual; + in + lib.all (n: ! (lib.hasPrefix n _path)) pathsToIgnore; + in + builtins.path { + name = "veloren-source"; + path = toString ./.; + # filter out unnecessary paths + filter = ignorePaths; + }; + + wrapWithAssets = common: _: old: let + pkgs = common.pkgs; + runtimeLibs = with pkgs; [ + xorg.libX11 + xorg.libXi + xorg.libxcb + xorg.libXcursor + xorg.libXrandr + libxkbcommon + shaderc.lib + udev + alsa-lib + vulkan-loader + ]; + assets = pkgs.runCommand "veloren-assets" {} '' + mkdir $out + ln -sf ${./assets} $out/assets + # check if LFS was setup properly + checkFile="$out/assets/voxygen/background/bg_main.jpg" + result="$(${pkgs.file}/bin/file --mime-type $checkFile)" + if [ "$result" = "$checkFile: image/jpeg" ]; then + echo "Git LFS seems to be setup properly." + else + echo " + Git Large File Storage (git-lfs) has not been set up correctly. + Most common reasons: + - git-lfs was not installed before cloning this repository. + - This repository was not cloned from the primary GitLab mirror. + - The GitHub mirror does not support LFS. + See the book at https://book.veloren.net/ for details. + Run 'nix-shell -p git git-lfs --run \"git lfs install --local && git lfs fetch && git lfs checkout\"' + or 'nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c \"git lfs install --local && git lfs fetch && git lfs checkout\"'. + " + false + fi + ''; + wrapped = + common.internal.nci-pkgs.utils.wrapDerivation old + {nativeBuildInputs = [pkgs.makeWrapper];} + '' + rm -rf $out/bin + mkdir $out/bin + ln -sf ${old}/bin/* $out/bin/ + wrapProgram $out/bin/* \ + ${lib.optionalString (old.pname == "veloren-voxygen") "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs}"} \ + --set VELOREN_ASSETS ${assets} \ + --set VELOREN_GIT_VERSION "${git.prettyRev}" \ + --set VELOREN_GIT_TAG "${git.tag}" + ''; + in + wrapped; + in + inputs.nci.lib.makeOutputs { root = ./.; defaultOutputs = { package = "veloren-voxygen"; @@ -29,7 +109,9 @@ test = release; }; }; + wrapper = wrapWithAssets; }; + veloren-server-cli.wrapper = wrapWithAssets; }; overrides = { cCompiler = common: { @@ -47,30 +129,6 @@ rustflags = ["-C", "link-arg=-fuse-ld=${lib.getExe pkgs.mold}"] EOF ''; - - pathsToIgnore = [ - "flake.nix" - "flake.lock" - "nix" - "assets" - "README.md" - "CONTRIBUTING.md" - "CHANGELOG.md" - "CODE_OF_CONDUCT.md" - "clippy.toml" - ]; - ignorePaths = path: type: let - split = lib.splitString "/" path; - actual = lib.drop 4 split; - _path = lib.concatStringsSep "/" actual; - in - lib.all (n: ! (lib.hasPrefix n _path)) pathsToIgnore; - filteredSource = builtins.path { - name = "veloren-source"; - path = toString ./.; - # filter out unnecessary paths - filter = ignorePaths; - }; in { veloren-common = oldAttrs: { # Disable `git-lfs` check here since we check it ourselves @@ -148,89 +206,4 @@ }; }; }; - wrapWithAssets = system: old: let - pkgs = inputs.nci.inputs.nixpkgs.legacyPackages.${system}; - runtimeLibs = with pkgs; [ - xorg.libX11 - xorg.libXcursor - xorg.libXrandr - xorg.libXi - xorg.libxcb - libxkbcommon - vulkan-loader - vulkan-extension-layer - shaderc.lib - udev - alsa-lib - ]; - assets = pkgs.runCommand "veloren-assets" {} '' - mkdir $out - ln -sf ${./assets} $out/assets - # check if LFS was setup properly - checkFile="$out/assets/voxygen/background/bg_main.jpg" - result="$(${pkgs.file}/bin/file --mime-type $checkFile)" - if [ "$result" = "$checkFile: image/jpeg" ]; then - echo "Git LFS seems to be setup properly." - else - echo " - Git Large File Storage (git-lfs) has not been set up correctly. - Most common reasons: - - git-lfs was not installed before cloning this repository. - - This repository was not cloned from the primary GitLab mirror. - - The GitHub mirror does not support LFS. - See the book at https://book.veloren.net/ for details. - Run 'nix-shell -p git git-lfs --run \"git lfs install --local && git lfs fetch && git lfs checkout\"' - or 'nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c \"git lfs install --local && git lfs fetch && git lfs checkout\"'. - " - false - fi - ''; - wrapped = - pkgs.runCommand "${old.name}-wrapped" - { - inherit (old) pname version meta; - nativeBuildInputs = [pkgs.makeWrapper]; - } - '' - mkdir -p $out - ln -sf ${old}/* $out/ - rm -rf $out/bin - mkdir $out/bin - ln -sf ${old}/bin/* $out/bin/ - wrapProgram $out/bin/* \ - ${lib.optionalString (old.pname == "veloren-voxygen") "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs}"} \ - --set VELOREN_ASSETS ${assets} \ - --set VELOREN_GIT_VERSION "${git.prettyRev}" \ - --set VELOREN_GIT_TAG "${git.tag}" - ''; - in - wrapped; - in - outputs - // rec { - apps = - lib.mapAttrs - (system: _: rec { - default = veloren; - veloren = { - type = "app"; - program = lib.getExe packages.${system}.veloren-voxygen; - }; - veloren-server = { - type = "app"; - program = lib.getExe packages.${system}.veloren-server-cli; - }; - }) - outputs.apps; - packages = - lib.mapAttrs - (system: pkgs: rec { - default = veloren-voxygen; - veloren-voxygen = wrapWithAssets system pkgs.veloren-voxygen; - veloren-voxygen-debug = wrapWithAssets system pkgs.veloren-voxygen-debug; - veloren-server-cli = wrapWithAssets system pkgs.veloren-server-cli; - veloren-server-cli-debug = wrapWithAssets system pkgs.veloren-server-cli-debug; - }) - outputs.packages; - }; } From 9dbff4c342b51eaaf37554f8bdbeb388848326d4 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sat, 3 Sep 2022 20:24:50 -0400 Subject: [PATCH 197/854] [voxygen] Disable editing server address if it is supplied via CLI and hide server list button (with an unlock button to re-enable editing) --- .../element/ui/generic/buttons/unlock.png | 3 + .../ui/generic/buttons/unlock_hover.png | 3 + .../ui/generic/buttons/unlock_press.png | 3 + voxygen/src/menu/main/ui/login.rs | 101 ++++++++++++++---- voxygen/src/menu/main/ui/mod.rs | 19 +++- 5 files changed, 105 insertions(+), 24 deletions(-) create mode 100644 assets/voxygen/element/ui/generic/buttons/unlock.png create mode 100644 assets/voxygen/element/ui/generic/buttons/unlock_hover.png create mode 100644 assets/voxygen/element/ui/generic/buttons/unlock_press.png diff --git a/assets/voxygen/element/ui/generic/buttons/unlock.png b/assets/voxygen/element/ui/generic/buttons/unlock.png new file mode 100644 index 0000000000..cb4c4fef50 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/unlock.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:100af979da48f36d3e27abd4feae5a1cc50d7aa8c8ca07527fcab5a03289ad87 +size 354 diff --git a/assets/voxygen/element/ui/generic/buttons/unlock_hover.png b/assets/voxygen/element/ui/generic/buttons/unlock_hover.png new file mode 100644 index 0000000000..6ec528cfb0 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/unlock_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ceaf4c86825b72c22da051bc280ff229fc5eb0921011003321772e8abcde4c7e +size 392 diff --git a/assets/voxygen/element/ui/generic/buttons/unlock_press.png b/assets/voxygen/element/ui/generic/buttons/unlock_press.png new file mode 100644 index 0000000000..3137577145 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/unlock_press.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48a857665864c0eed8372aa84a49ac9585008acd9d05ee989897bb45e9945eb6 +size 389 diff --git a/voxygen/src/menu/main/ui/login.rs b/voxygen/src/menu/main/ui/login.rs index 56ccc16ac8..b924f4889a 100644 --- a/voxygen/src/menu/main/ui/login.rs +++ b/voxygen/src/menu/main/ui/login.rs @@ -6,7 +6,7 @@ use crate::ui::{ style, widget::{ compound_graphic::{CompoundGraphic, Graphic}, - BackgroundContainer, Image, Padding, + AspectRatioContainer, BackgroundContainer, Image, Padding, }, Element, }, @@ -55,6 +55,7 @@ impl Screen { &mut self, fonts: &Fonts, imgs: &Imgs, + server_field_locked: bool, login_info: &LoginInfo, error: Option<&str>, i18n: &Localization, @@ -64,14 +65,19 @@ impl Screen { button_style: style::button::Style, version: &str, ) -> Element { - let buttons = Column::with_children(vec![ - neat_button( + let mut buttons = Vec::new(); + // If the server field is locked, we don't want to show the server selection + // list! + if !server_field_locked { + buttons.push(neat_button( &mut self.servers_button, i18n.get_msg("common-servers"), FILL_FRAC_ONE, button_style, Some(Message::ShowServers), - ), + )) + } + buttons.extend([ // neat_button( // &mut self.settings_button, // i18n.get_msg("common-settings"), @@ -100,15 +106,17 @@ impl Screen { button_style, Some(Message::Quit), ), - ]) - .width(Length::Fill) - .max_width(100) - .spacing(5); + ]); - let buttons = Container::new(buttons) - .width(Length::Fill) - .height(Length::Fill) - .align_y(Align::End); + let buttons = Container::new( + Column::with_children(buttons) + .width(Length::Fill) + .max_width(100) + .spacing(5), + ) + .width(Length::Fill) + .height(Length::Fill) + .align_y(Align::End); let intro_text = i18n.get_msg("main-login_process"); @@ -173,8 +181,14 @@ impl Screen { button_style, ) } else { - self.banner - .view(fonts, imgs, login_info, i18n, button_style) + self.banner.view( + fonts, + imgs, + server_field_locked, + login_info, + i18n, + button_style, + ) }; let central_column = Container::new(central_content) @@ -330,6 +344,8 @@ pub struct LoginBanner { multiplayer_button: button::State, #[cfg(feature = "singleplayer")] singleplayer_button: button::State, + + unlock_server_field_button: button::State, } impl LoginBanner { @@ -342,6 +358,8 @@ impl LoginBanner { multiplayer_button: Default::default(), #[cfg(feature = "singleplayer")] singleplayer_button: Default::default(), + + unlock_server_field_button: Default::default(), } } @@ -349,12 +367,56 @@ impl LoginBanner { &mut self, fonts: &Fonts, imgs: &Imgs, + server_field_locked: bool, login_info: &LoginInfo, i18n: &Localization, button_style: style::button::Style, ) -> Element { let input_text_size = fonts.cyri.scale(INPUT_TEXT_SIZE); + let server_field: Element = if server_field_locked { + let unlock_style = style::button::Style::new(imgs.unlock) + .hover_image(imgs.unlock_hover) + .press_image(imgs.unlock_press); + + let unlock_button = Button::new( + &mut self.unlock_server_field_button, + Space::new(Length::Fill, Length::Fill), + ) + .style(unlock_style) + .width(Length::Fill) + .height(Length::Fill) + .on_press(Message::UnlockServerField); + + let container = AspectRatioContainer::new(unlock_button); + let container = match unlock_style.active().0 { + Some((img, _)) => container.ratio_of_image(img), + None => container, + }; + + Row::with_children(vec![ + Text::new(&login_info.server) + .size(input_text_size) + .width(Length::Fill) + .height(Length::Shrink) + .into(), + container.into(), + ]) + .align_items(Align::Center) + .height(Length::Fill) + .into() + } else { + TextInput::new( + &mut self.server, + &i18n.get_msg("main-server"), + &login_info.server, + Message::Server, + ) + .size(input_text_size) + .on_submit(Message::Multiplayer) + .into() + }; + let banner_content = Column::with_children(vec![ Column::with_children(vec![ BackgroundContainer::new( @@ -392,16 +454,9 @@ impl LoginBanner { Image::new(imgs.input_bg) .width(Length::Units(INPUT_WIDTH)) .fix_aspect_ratio(), - TextInput::new( - &mut self.server, - &i18n.get_msg("main-server"), - &login_info.server, - Message::Server, - ) - .size(input_text_size) - .on_submit(Message::Multiplayer), + server_field, ) - .padding(Padding::new().horizontal(7).top(5)) + .padding(Padding::new().horizontal(7).vertical(5)) .into(), ]) .spacing(5) diff --git a/voxygen/src/menu/main/ui/mod.rs b/voxygen/src/menu/main/ui/mod.rs index 265be09371..eb514c3c22 100644 --- a/voxygen/src/menu/main/ui/mod.rs +++ b/voxygen/src/menu/main/ui/mod.rs @@ -53,6 +53,9 @@ image_ids_ice! { selection: "voxygen.element.ui.generic.frames.selection", selection_hover: "voxygen.element.ui.generic.frames.selection_hover", selection_press: "voxygen.element.ui.generic.frames.selection_press", + unlock: "voxygen.element.ui.generic.buttons.unlock", + unlock_hover: "voxygen.element.ui.generic.buttons.unlock_hover", + unlock_press: "voxygen.element.ui.generic.buttons.unlock_press", } } @@ -137,6 +140,10 @@ struct Controls { alpha: String, credits: Credits, + // If a server address was provided via cli argument we hide the server list button and replace + // the server field with a plain label (with a button to exit this mode and freely edit the + // field). + server_field_locked: bool, selected_server_index: Option, login_info: LoginInfo, @@ -157,6 +164,7 @@ enum Message { #[cfg(feature = "singleplayer")] Singleplayer, Multiplayer, + UnlockServerField, LanguageChanged(usize), OpenLanguageMenu, Username(String), @@ -199,6 +207,7 @@ impl Controls { }; //}; + let server_field_locked = server.is_some(); let login_info = LoginInfo { username: settings.networking.username.clone(), password: String::new(), @@ -224,6 +233,7 @@ impl Controls { alpha, credits, + server_field_locked, selected_server_index, login_info, @@ -292,6 +302,7 @@ impl Controls { Screen::Login { screen, error } => screen.view( &self.fonts, &self.imgs, + self.server_field_locked, &self.login_info, error.as_deref(), &self.i18n.read(), @@ -387,6 +398,7 @@ impl Controls { server_address: self.login_info.server.clone(), }); }, + Message::UnlockServerField => self.server_field_locked = false, Message::Username(new_value) => self.login_info.username = new_value, Message::LanguageChanged(new_value) => { events.push(Event::ChangeLanguage(language_metadatas.remove(new_value))); @@ -496,7 +508,12 @@ impl Controls { screen.banner.password.move_cursor_to_end(); } else if screen.banner.password.is_focused() { screen.banner.password = text_input::State::new(); - screen.banner.server = text_input::State::focused(); + // Skip focusing server field if it isn't editable! + if self.server_field_locked { + screen.banner.username = text_input::State::focused(); + } else { + screen.banner.server = text_input::State::focused(); + } screen.banner.server.move_cursor_to_end(); } else if screen.banner.server.is_focused() { screen.banner.server = text_input::State::new(); From 511922baa5f3817286671a8570e1012f46b38340 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Sun, 4 Sep 2022 16:46:45 +0300 Subject: [PATCH 198/854] build(nix): use correct linker in main derivation compile --- Cargo.toml | 4 ---- flake.lock | 12 ++++++------ flake.nix | 16 +++++++++------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fec9ce5a35..ad93cf13cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -115,10 +115,6 @@ systems = ["x86_64-linux"] name = "veloren-nix" key = "veloren-nix.cachix.org-1:zokfKJqVsNV6kI/oJdLF6TYBdNPYGSb+diMVQPn/5Rc=" -[workspace.metadata.nix.crateOverride.veloren-network] -buildInputs = ["openssl"] -nativeBuildInputs = ["pkg-config"] - [patch.crates-io] vek = { git = "https://github.com/yoanlcq/vek.git", rev = "84d5cb65841d46599a986c5477341bea4456be26" } # patch wgpu so we can use wgpu-profiler crate diff --git a/flake.lock b/flake.lock index 537f6061b5..aa94d53a08 100644 --- a/flake.lock +++ b/flake.lock @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662234098, - "narHash": "sha256-zl52sS2Jr2lOguuC4DpLYLU+JYFzjV0xaFycwllKFAE=", + "lastModified": 1662298979, + "narHash": "sha256-jHAqNmTGZb9xzUXlAjZcsOGgtsswRXw+eUUjk/wGFho=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "3066def381d38288a9ecdf9a620fbb756c588ec1", + "rev": "a415e5728613de0fe596a4bebc04483074b1c1e0", "type": "github" }, "original": { @@ -127,11 +127,11 @@ "rust-overlay": { "flake": false, "locked": { - "lastModified": 1662173844, - "narHash": "sha256-+ZgW98Y8fZkgFSylE+Mzalumw+kw3SVivZznbJqQaj8=", + "lastModified": 1662260299, + "narHash": "sha256-FYJk/Pn+VuSyl5Q3KXwTmOD7hprlv3CZPIRMGGT61IM=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "8ac6d40380dc4ec86f1ff591d5c14c8ae1d77a18", + "rev": "fe73170ff8b29c4230c26b85e82c25c73c35481d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 4d023463e3..f84106b513 100644 --- a/flake.nix +++ b/flake.nix @@ -27,6 +27,7 @@ "CHANGELOG.md" "CODE_OF_CONDUCT.md" "clippy.toml" + ".cargo" ]; ignorePaths = path: type: let split = lib.splitString "/" path; @@ -114,19 +115,16 @@ veloren-server-cli.wrapper = wrapWithAssets; }; overrides = { - cCompiler = common: { - cCompiler = common.pkgs.clang; - useCCompilerBintools = true; - }; + cCompiler = common: common.pkgs.clang; crates = common: prev: let pkgs = common.pkgs; - lib = pkgs.lib; configMoldLinker = '' + touch $CARGO_HOME/config.toml cat >>$CARGO_HOME/config.toml < Date: Sun, 4 Sep 2022 22:13:09 +0300 Subject: [PATCH 199/854] Add functions to generate collection of modulars --- common/src/comp/inventory/item/modular.rs | 135 ++++++++++++++++++---- 1 file changed, 111 insertions(+), 24 deletions(-) diff --git a/common/src/comp/inventory/item/modular.rs b/common/src/comp/inventory/item/modular.rs index c73bf03b87..37f4338989 100644 --- a/common/src/comp/inventory/item/modular.rs +++ b/common/src/comp/inventory/item/modular.rs @@ -317,24 +317,37 @@ lazy_static! { static ref PRIMARY_COMPONENT_POOL: PrimaryComponentPool = { let mut component_pool = HashMap::new(); - // Load recipe book (done to check that material is valid for a particular component) + // Load recipe book + // (done to check that material is valid for a particular component) use crate::recipe::ComponentKey; let recipes = recipe::default_component_recipe_book().read(); let ability_map = &AbilityMap::load().read(); let msm = &MaterialStatManifest::load().read(); - recipes - .iter() - .for_each(|(ComponentKey { toolkind, material, .. }, recipe)| { + recipes.iter().for_each( + |( + ComponentKey { + toolkind, material, .. + }, + recipe, + )| { let component = recipe.item_output(ability_map, msm); - let hand_restriction = if let ItemKind::ModularComponent(ModularComponent::ToolPrimaryComponent { hand_restriction, .. }) = &*component.kind() { - *hand_restriction - } else { - return; - }; - let entry = component_pool.entry((*toolkind, String::from(material))).or_insert(Vec::new()); + let hand_restriction = + if let ItemKind::ModularComponent(ModularComponent::ToolPrimaryComponent { + hand_restriction, + .. + }) = &*component.kind() + { + *hand_restriction + } else { + return; + }; + let entry = component_pool + .entry((*toolkind, String::from(material))) + .or_insert(Vec::new()); entry.push((component, hand_restriction)); - }); + }, + ); component_pool }; @@ -352,7 +365,12 @@ lazy_static! { .filter_map(|comp| Some(comp.item_definition_id().itemdef_id()?.to_owned())) .filter_map(|id| Arc::::load_cloned(&id).ok()) .for_each(|comp_def| { - if let ItemKind::ModularComponent(ModularComponent::ToolSecondaryComponent { hand_restriction, .. }) = comp_def.kind { + if let ItemKind::ModularComponent( + ModularComponent::ToolSecondaryComponent { + hand_restriction, .. + }, + ) = comp_def.kind + { let entry = component_pool.entry(toolkind).or_insert(Vec::new()); entry.push((Arc::clone(&comp_def), hand_restriction)); } @@ -371,14 +389,41 @@ pub enum ModularWeaponCreationError { SecondaryComponentNotFound, } +/// Generate all primary components for specific tool and material. +/// +/// Read [random_weapon_primary_component] for more. +pub fn generate_weapon_primary_components( + tool: ToolKind, + material: Material, + hand_restriction: Option, +) -> Result)>, ModularWeaponCreationError> { + if let Some(material_id) = material.asset_identifier() { + // Loads default ability map and material stat manifest for later use + let ability_map = &AbilityMap::load().read(); + let msm = &MaterialStatManifest::load().read(); + + Ok(PRIMARY_COMPONENT_POOL + .get(&(tool, material_id.to_owned())) + .into_iter() + .flatten() + .filter(|(_comp, hand)| { + hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() + }) + .map(|(c, h)| (c.duplicate(ability_map, msm), hand_restriction.or(*h))) + .collect()) + } else { + Err(ModularWeaponCreationError::MaterialNotFound) + } +} + /// Creates a random modular weapon primary component when provided with a /// toolkind, material, and optionally the handedness /// -/// Note: The component produced is not necessarily restricted to that +/// NOTE: The component produced is not necessarily restricted to that /// handedness, but rather is able to produce a weapon of that handedness /// depending on what secondary component is used /// -/// Returns the comptabile handednesses that can be used with provided +/// Returns the compatible handednesses that can be used with provided /// restriction and generated component (useful for cases where no restriction /// was passed in, but generated component has a restriction) pub fn random_weapon_primary_component( @@ -387,7 +432,7 @@ pub fn random_weapon_primary_component( hand_restriction: Option, mut rng: &mut impl Rng, ) -> Result<(Item, Option), ModularWeaponCreationError> { - let result = (|| { + let result = { if let Some(material_id) = material.asset_identifier() { // Loads default ability map and material stat manifest for later use let ability_map = &AbilityMap::load().read(); @@ -397,9 +442,8 @@ pub fn random_weapon_primary_component( .get(&(tool, material_id.to_owned())) .into_iter() .flatten() - .filter(|(_comp, hand)| match (hand_restriction, hand) { - (Some(restriction), Some(hand)) => restriction == *hand, - (None, _) | (_, None) => true, + .filter(|(_comp, hand)| { + hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() }) .collect::>(); @@ -411,7 +455,8 @@ pub fn random_weapon_primary_component( } else { Err(ModularWeaponCreationError::MaterialNotFound) } - })(); + }; + if let Err(err) = &result { let error_str = format!( "Failed to synthesize a primary component for a modular {tool:?} made of {material:?} \ @@ -422,6 +467,48 @@ pub fn random_weapon_primary_component( result } +pub fn generate_weapons( + tool: ToolKind, + material: Material, + hand_restriction: Option, +) -> Result, ModularWeaponCreationError> { + // Loads default ability map and material stat manifest for later use + let ability_map = &AbilityMap::load().read(); + let msm = &MaterialStatManifest::load().read(); + + let primaries = generate_weapon_primary_components(tool, material, hand_restriction)?; + let mut weapons = Vec::new(); + + // TODO: should we always ignore handness? + // We seems to do so in `random_weapon` + for (comp, _hand) in primaries { + let secondaries = SECONDARY_COMPONENT_POOL + .get(&tool) + .into_iter() + .flatten() + .filter(|(_def, hand)| { + hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() + }); + + for (def, _hand) in secondaries { + let secondary = Item::new_from_item_base( + ItemBase::Simple(Arc::clone(def)), + Vec::new(), + ability_map, + msm, + ); + weapons.push(Item::new_from_item_base( + ItemBase::Modular(ModularBase::Tool), + vec![comp.duplicate(ability_map, msm), secondary], + ability_map, + msm, + )); + } + } + + Ok(weapons) +} + /// Creates a random modular weapon when provided with a toolkind, material, and /// optionally the handedness pub fn random_weapon( @@ -430,7 +517,7 @@ pub fn random_weapon( hand_restriction: Option, mut rng: &mut impl Rng, ) -> Result { - let result = (|| { + let result = { // Loads default ability map and material stat manifest for later use let ability_map = &AbilityMap::load().read(); let msm = &MaterialStatManifest::load().read(); @@ -442,9 +529,8 @@ pub fn random_weapon( .get(&tool) .into_iter() .flatten() - .filter(|(_def, hand)| match (hand_restriction, hand) { - (Some(restriction), Some(hand)) => restriction == *hand, - (None, _) | (_, None) => true, + .filter(|(_def, hand)| { + hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() }) .collect::>(); @@ -453,6 +539,7 @@ pub fn random_weapon( .choose(&mut rng) .ok_or(ModularWeaponCreationError::SecondaryComponentNotFound)? .0; + Item::new_from_item_base( ItemBase::Simple(Arc::clone(def)), Vec::new(), @@ -468,7 +555,7 @@ pub fn random_weapon( ability_map, msm, )) - })(); + }; if let Err(err) = &result { let error_str = format!( "Failed to synthesize a modular {tool:?} made of {material:?} that had a hand \ From 421aa44d5f0b6961c2e3347ee2fca70e432fbd5a Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 5 Sep 2022 00:10:30 +0300 Subject: [PATCH 200/854] Make kit generate all possible modulars --- common/src/comp/inventory/item/modular.rs | 11 +-- server/src/cmd.rs | 87 ++++++++++++++--------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/common/src/comp/inventory/item/modular.rs b/common/src/comp/inventory/item/modular.rs index 37f4338989..a3ce9f6104 100644 --- a/common/src/comp/inventory/item/modular.rs +++ b/common/src/comp/inventory/item/modular.rs @@ -479,9 +479,7 @@ pub fn generate_weapons( let primaries = generate_weapon_primary_components(tool, material, hand_restriction)?; let mut weapons = Vec::new(); - // TODO: should we always ignore handness? - // We seems to do so in `random_weapon` - for (comp, _hand) in primaries { + for (comp, comp_hand) in primaries { let secondaries = SECONDARY_COMPONENT_POOL .get(&tool) .into_iter() @@ -490,7 +488,12 @@ pub fn generate_weapons( hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() }); - for (def, _hand) in secondaries { + for (def, hand) in secondaries { + if comp_hand.is_some() && hand.is_some() && comp_hand != *hand { + // if handedness of components incompatible, skip + continue; + } + let secondary = Item::new_from_item_base( ItemBase::Simple(Arc::clone(def)), Vec::new(), diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 79be96586f..d868cfef3c 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -1944,51 +1944,72 @@ where if target_inventory.free_slots() < count { return Err("Inventory doesn't have enough slots".to_owned()); } - let mut rng = thread_rng(); - for (item_id, quantity) in kit { - let mut item = match &item_id { - KitSpec::Item(item_id) => Item::new_from_asset(item_id) - .map_err(|_| format!("Unknown item: {:#?}", item_id))?, - KitSpec::ModularWeapon { tool, material } => { - comp::item::modular::random_weapon(*tool, *material, None, &mut rng) - .map_err(|err| format!("{:#?}", err))? - }, - }; - let mut res = Ok(()); - // Either push stack or push one by one. - if item.is_stackable() { - // FIXME: in theory, this can fail, - // but we don't have stack sizes yet. - let _ = item.set_amount(quantity); - res = target_inventory.push(item); + for (item_id, quantity) in kit { + push_item(item_id, quantity, server, &mut |item| { + let res = target_inventory.push(item); let _ = target_inv_update.insert( target, comp::InventoryUpdate::new(comp::InventoryUpdateEvent::Debug), ); - } else { - let ability_map = server.state.ecs().read_resource::(); - let msm = server.state.ecs().read_resource::(); - for _ in 0..quantity { - res = target_inventory.push(item.duplicate(&ability_map, &msm)); - let _ = target_inv_update.insert( - target, - comp::InventoryUpdate::new(comp::InventoryUpdateEvent::Debug), - ); - } - } - // I think it's possible to pick-up item during this loop - // and fail into case where you had space but now you don't? - if res.is_err() { - return Err("Can't fit item to inventory".to_owned()); - } + + res + })?; } + Ok(()) } else { Err("Could not get inventory".to_string()) } } +fn push_item( + item_id: KitSpec, + quantity: u32, + server: &Server, + push: &mut dyn FnMut(Item) -> Result<(), Item>, +) -> CmdResult<()> { + let items = match &item_id { + KitSpec::Item(item_id) => vec![ + Item::new_from_asset(item_id).map_err(|_| format!("Unknown item: {:#?}", item_id))?, + ], + KitSpec::ModularWeapon { tool, material } => { + comp::item::modular::generate_weapons(*tool, *material, None) + .map_err(|err| format!("{:#?}", err))? + }, + }; + + let mut res = Ok(()); + for mut item in items { + // Either push stack or push one by one. + if item.is_stackable() { + // FIXME: in theory, this can fail, + // but we don't have stack sizes yet. + let _ = item.set_amount(quantity); + res = push(item); + } else { + let ability_map = server.state.ecs().read_resource::(); + let msm = server.state.ecs().read_resource::(); + + for _ in 0..quantity { + res = push(item.duplicate(&ability_map, &msm)); + + if res.is_err() { + break; + } + } + } + + // I think it's possible to pick-up item during this loop + // and fail into case where you had space but now you don't? + if res.is_err() { + return Err("Can't fit item to inventory".to_owned()); + } + } + + Ok(()) +} + fn handle_object( server: &mut Server, client: EcsEntity, From 54a1adea318e116c119efd7e9fe16cbb1f9e06b6 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 5 Sep 2022 00:21:30 +0300 Subject: [PATCH 201/854] Assets work * Remove endgame /kit, move cultist weapons to cultist, move legendaries to tier-5 * Remove root_evil sceptre from endgame travelers --- assets/common/entity/world/traveler3.ron | 3 +- assets/server/manifests/kits.ron | 35 +++++++++++------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/assets/common/entity/world/traveler3.ron b/assets/common/entity/world/traveler3.ron index 1e09b5784c..36a4c3306e 100644 --- a/assets/common/entity/world/traveler3.ron +++ b/assets/common/entity/world/traveler3.ron @@ -28,7 +28,6 @@ (2, Item("common.items.weapons.axe.parashu")), (2, Item("common.items.weapons.bow.sagitta")), (2, Item("common.items.weapons.staff.laevateinn")), - (1, Item("common.items.weapons.sceptre.root_evil")), (1, Item("common.items.weapons.sceptre.caduceus")), ]), None)), )), @@ -39,4 +38,4 @@ meta: [ SkillSetAsset("common.skillset.preset.rank5.fullskill"), ], -) \ No newline at end of file +) diff --git a/assets/server/manifests/kits.ron b/assets/server/manifests/kits.ron index 4101b3779c..0cbbde29bc 100644 --- a/assets/server/manifests/kits.ron +++ b/assets/server/manifests/kits.ron @@ -74,25 +74,6 @@ (Item("common.items.armor.misc.ring.gold"), 2), (Item("common.items.armor.cultist.ring"), 2), ], - "endgame": [ - // Cultist weapons - (Item("common.items.weapons.hammer.cultist_purp_2h-0"),1), - (Item("common.items.weapons.staff.cultist_staff"),1), - (Item("common.items.weapons.sword.cultist"),1), - (Item("common.items.weapons.bow.velorite"),1), - (Item("common.items.weapons.axe.malachite_axe-0"),1), - (Item("common.items.weapons.sceptre.sceptre_velorite_0"),1), - - // Legendaries - (Item("common.items.weapons.hammer.mjolnir"),1), - (Item("common.items.weapons.staff.laevateinn"),1), - (Item("common.items.weapons.sword.caladbolg"),1), - (Item("common.items.weapons.bow.sagitta"),1), - (Item("common.items.weapons.axe.parashu"),1), - (Item("common.items.weapons.sceptre.caduceus"),1), - (Item("common.items.weapons.sceptre.root_evil"),1), - - ], "tier-5": [ // Hide (Item("common.items.armor.hide.dragonscale.back"), 1), @@ -129,6 +110,14 @@ (ModularWeapon(tool: Staff, material: Eldwood),1), (ModularWeapon(tool: Sceptre, material: Eldwood),1), + // Legendaries + (Item("common.items.weapons.hammer.mjolnir"),1), + (Item("common.items.weapons.staff.laevateinn"),1), + (Item("common.items.weapons.sword.caladbolg"),1), + (Item("common.items.weapons.bow.sagitta"),1), + (Item("common.items.weapons.axe.parashu"),1), + (Item("common.items.weapons.sceptre.caduceus"),1), + // Potion Kit (Item("common.items.consumable.potion_med"), 100), ], @@ -337,6 +326,14 @@ (Item("common.items.armor.ferocious.back"),1), ], "cultist": [ + // Cultist weapons + (Item("common.items.weapons.hammer.cultist_purp_2h-0"),1), + (Item("common.items.weapons.staff.cultist_staff"),1), + (Item("common.items.weapons.sword.cultist"),1), + (Item("common.items.weapons.bow.velorite"),1), + (Item("common.items.weapons.axe.malachite_axe-0"),1), + (Item("common.items.weapons.sceptre.sceptre_velorite_0"),1), + // Clothes (Item("common.items.armor.cultist.chest"), 1), (Item("common.items.armor.cultist.pants"), 1), (Item("common.items.armor.cultist.hand"), 1), From 68da12ab6bb1177d2f809a5094da57ccabe9eea3 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 5 Sep 2022 02:17:15 +0300 Subject: [PATCH 202/854] Reduce traversal_config min dist * Fix LOS pillar cheesing --- server/src/sys/agent.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index bcf2c83207..fecb5948ac 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -1539,7 +1539,7 @@ impl<'a> AgentData<'a> { self.vel.0, pathing_pos, TraversalConfig { - min_tgt_dist: 1.25, + min_tgt_dist: 0.25, ..self.traversal_config }, ) { From 18e1b48006a68fd365efbaa187781d6e6436ca5f Mon Sep 17 00:00:00 2001 From: zDrag0nG Date: Sun, 4 Sep 2022 23:41:15 +0000 Subject: [PATCH 203/854] Update Spanish Translation --- assets/voxygen/i18n/en/hud/bag.ftl | 2 +- assets/voxygen/i18n/en/hud/skills.ftl | 4 +- assets/voxygen/i18n/es_ES/buff.ftl | 2 +- assets/voxygen/i18n/es_ES/char_selection.ftl | 1 + assets/voxygen/i18n/es_ES/hud/bag.ftl | 5 ++- assets/voxygen/i18n/es_ES/hud/crafting.ftl | 23 ++++++++--- assets/voxygen/i18n/es_ES/hud/group.ftl | 2 +- assets/voxygen/i18n/es_ES/hud/map.ftl | 16 +++++--- assets/voxygen/i18n/es_ES/hud/misc.ftl | 15 ++++--- assets/voxygen/i18n/es_ES/hud/settings.ftl | 41 ++++++++++++++------ assets/voxygen/i18n/es_ES/hud/skills.ftl | 14 +++---- assets/voxygen/i18n/es_ES/hud/social.ftl | 2 +- assets/voxygen/i18n/es_ES/hud/trade.ftl | 19 ++++----- assets/voxygen/i18n/es_ES/main.ftl | 15 ++++--- 14 files changed, 101 insertions(+), 60 deletions(-) diff --git a/assets/voxygen/i18n/en/hud/bag.ftl b/assets/voxygen/i18n/en/hud/bag.ftl index 5a098aa99b..55b1dea99e 100644 --- a/assets/voxygen/i18n/en/hud/bag.ftl +++ b/assets/voxygen/i18n/en/hud/bag.ftl @@ -32,7 +32,7 @@ hud-bag-stealth = Stealth hud-bag-combat_rating_desc = Calculated from your equipment and health. -hud-bag-protection_desc = Damage reduction through armor +hud-bag-protection_desc = Damage reduction through armor. hud-bag-stun_res_desc = Resilience against being stunned by consecutive hits. Regenerates like Energy. diff --git a/assets/voxygen/i18n/en/hud/skills.ftl b/assets/voxygen/i18n/en/hud/skills.ftl index ef4677c5f7..2c9e38aa08 100644 --- a/assets/voxygen/i18n/en/hud/skills.ftl +++ b/assets/voxygen/i18n/en/hud/skills.ftl @@ -67,9 +67,9 @@ hud-skill-sc_wardaura_duration = The effects of your ward last { $boost }% longe hud-skill-sc_wardaura_range_title = Radius hud-skill-sc_wardaura_range = Your ward reaches { $boost }% further{ $SP } hud-skill-sc_wardaura_cost_title = Energy Cost -hud-skill-sc_wardaura_cost = Creating the ward requries { $boost }% less energy{ $SP } +hud-skill-sc_wardaura_cost = Creating the ward requires { $boost }% less energy{ $SP } hud-skill-st_shockwave_range_title = Shockwave Range -hud-skill-st_shockwave_range = throw things that used to be out of reach, range increased { $boost }%{ $SP } +hud-skill-st_shockwave_range = Throw things that used to be out of reach, range increased { $boost }%{ $SP } hud-skill-st_shockwave_cost_title = Shockwave Cost hud-skill-st_shockwave_cost = Decreases the energy cost to throw helpless villagers by { $boost }%{ $SP } hud-skill-st_shockwave_knockback_title = Shockwave Knockback diff --git a/assets/voxygen/i18n/es_ES/buff.ftl b/assets/voxygen/i18n/es_ES/buff.ftl index c530714bc1..5748517e89 100644 --- a/assets/voxygen/i18n/es_ES/buff.ftl +++ b/assets/voxygen/i18n/es_ES/buff.ftl @@ -24,7 +24,7 @@ buff-desc-cursed = Estás maldito. buff-title-burn = Ardiendo buff-desc-burn = Te estás quemando vivo. buff-title-crippled = Malherido -buff-desc-crippled = Te cuesta moverte por el estado de tus piernas. +buff-desc-crippled = Te cuesta moverte por el mal estado de tus piernas. buff-title-frozen = Congelado buff-desc-frozen = Tus movimientos y ataques son más lentos. buff-title-wet = Mojado diff --git a/assets/voxygen/i18n/es_ES/char_selection.ftl b/assets/voxygen/i18n/es_ES/char_selection.ftl index 74be4dae14..a8e62ec217 100644 --- a/assets/voxygen/i18n/es_ES/char_selection.ftl +++ b/assets/voxygen/i18n/es_ES/char_selection.ftl @@ -3,6 +3,7 @@ char_selection-delete_permanently = ¿Quieres eliminar permanentemente este Pers char_selection-deleting_character = Eliminando Personaje... char_selection-change_server = Cambiar de Servidor char_selection-enter_world = Entrar al Mundo +char_selection-spectate = Espectar Mundo char_selection-logout = Salir char_selection-create_new_character = Crear Nuevo Personaje char_selection-creating_character = Creando Personaje... diff --git a/assets/voxygen/i18n/es_ES/hud/bag.ftl b/assets/voxygen/i18n/es_ES/hud/bag.ftl index f2c20e3255..0e924dd0b1 100644 --- a/assets/voxygen/i18n/es_ES/hud/bag.ftl +++ b/assets/voxygen/i18n/es_ES/hud/bag.ftl @@ -27,10 +27,11 @@ hud-bag-health = Salud hud-bag-energy = Energía hud-bag-combat_rating = Puntuación de Combate hud-bag-protection = Protección -hud-bag-stun_res = Resistencia a Aturdimiento +hud-bag-stun_res = Resistencia al Aturdimiento +hud-bag-stealth = Sigilo hud-bag-combat_rating_desc = Calculado por tu - equipamiento y salud + equipamiento y salud. hud-bag-protection_desc = Reducción de daño por armadura. hud-bag-stun_res_desc = Resistencia a ser aturdido por golpes consecutivos. diff --git a/assets/voxygen/i18n/es_ES/hud/crafting.ftl b/assets/voxygen/i18n/es_ES/hud/crafting.ftl index 4b09d5cd30..05d4dc93c7 100644 --- a/assets/voxygen/i18n/es_ES/hud/crafting.ftl +++ b/assets/voxygen/i18n/es_ES/hud/crafting.ftl @@ -7,13 +7,13 @@ hud-crafting-tool_cata = Requisitos: hud-crafting-req_crafting_station = Requisitos: hud-crafting-anvil = Yunque hud-crafting-cauldron = Caldero -hud-crafting-cooking_pot = Olla de Cocina +hud-crafting-cooking_pot = Olla de Cocción hud-crafting-crafting_bench = Mesa de Fabricación hud-crafting-forge = Forja hud-crafting-loom = Telar hud-crafting-spinning_wheel = Rueca hud-crafting-tanning_rack = Estante de Curtido -hud-crafting-salvaging_station = Banco de desmantelado +hud-crafting-salvaging_station = Banco de desmantelamiento hud-crafting-campfire = Fogata hud-crafting-tabs-all = Todo hud-crafting-tabs-armor = Armadura @@ -28,8 +28,19 @@ hud-crafting-tabs-bag = Bolsas hud-crafting-tabs-processed_material = Materiales hud-crafting-dismantle_title = Desmontaje hud-crafting-dismantle_explanation = - Pon el ratón encima de los objetos de - tu inventario para ver que puedes - desmontar en partes + Pon el cursor sobre los objetos de + tu inventario para ver qué puedes + desmontar en partes. - Doble-Click para empezar a desmontar. \ No newline at end of file + Dales Doble-Clic para empezar a desmontar. +hud-crafting-modular_desc = Arrastra aquí componentes de objetos para fabricar un arma +hud-crafting-mod_weap_prim_slot_title = Componente Primaria del Arma +hud-crafting-mod_weap_prim_slot_desc = Coloca aquí una componente primaria del arma (p. ej. una hoja de espada, cabeza de hacha, o palas de arco). +hud-crafting-mod_weap_sec_slot_title = Componente Secundaria del Arma +hud-crafting-mod_weap_sec_slot_desc = Coloca aquí una componente secundaria del arma (p. ej. una empuñadura de espada, empuñadura de arco, o nucleo de báculo). +hud-crafting-mod_comp_metal_prim_slot_title = Lingote de Metal +hud-crafting-mod_comp_metal_prim_slot_desc = Coloca aquí un lingote de metal, sólo ciertos metales pueden ser usados para fabricar armas. +hud-crafting-mod_comp_wood_prim_slot_title = Madera +hud-crafting-mod_comp_wood_prim_slot_desc = Coloca aquí un tipo de madera, sólo ciertas maderas pueden ser usadas para fabricar armas. +hud-crafting-mod_comp_sec_slot_title = Material de Animal +hud-crafting-mod_comp_sec_slot_desc = Coloca opcionalmente un ingrediente de artesanía animal, sólo ciertos ingredientes pueden ser usados para mejorar armas. \ No newline at end of file diff --git a/assets/voxygen/i18n/es_ES/hud/group.ftl b/assets/voxygen/i18n/es_ES/hud/group.ftl index 5f6ed2a92c..05582885bb 100644 --- a/assets/voxygen/i18n/es_ES/hud/group.ftl +++ b/assets/voxygen/i18n/es_ES/hud/group.ftl @@ -9,5 +9,5 @@ hud-group-dead = Muerto hud-group-out_of_range = Fuera de Alcance hud-group-add_friend = Agregar a Amigos hud-group-link_group = Conectar Grupos -hud-group-in_menu = En el Menu +hud-group-in_menu = En el Menú hud-group-members = Miembros del Grupo diff --git a/assets/voxygen/i18n/es_ES/hud/map.ftl b/assets/voxygen/i18n/es_ES/hud/map.ftl index 0f1573543f..c1f6b02848 100644 --- a/assets/voxygen/i18n/es_ES/hud/map.ftl +++ b/assets/voxygen/i18n/es_ES/hud/map.ftl @@ -8,16 +8,17 @@ hud-map-dungeons = Mazmorras hud-map-caves = Cuevas hud-map-cave = Cueva hud-map-peaks = Montañas +hud-map-biomes = Biomas hud-map-voxel_map = Mapa de Voxel -hud-map-trees = Árboles Enormes -hud-map-tree = Árbol Enorme +hud-map-trees = Árboles Gigantes +hud-map-tree = Árbol Gigante hud-map-town = Pueblo hud-map-castle = Castillo hud-map-dungeon = Mazmorra hud-map-difficulty_dungeon = Dificultad de - mazmorra: { $difficulty } + Mazmorra: { $difficulty } hud-map-drag = Arrastrar hud-map-zoom = Zoom hud-map-mid_click = Poner Marcador @@ -25,7 +26,10 @@ hud-map-recenter = Recentrar hud-map-marked_location = Ubicación Marcada hud-map-marked_location_remove = Click para quitar hud-map-change_map_mode = Cambiar Modo de Mapa -hud-map-toggle_minimap_voxel = Alternar Vista Voxel Minimapa +hud-map-toggle_minimap_voxel = Alternar Vista Voxel del Minimapa hud-map-zoom_minimap_explanation = - Zoom en el Minimapa para ver - la zona de alrededor con mayor detalle \ No newline at end of file + Hazle Zoom al Minimapa para ver + la zona a tu alrededor con mayor detalle +hud-map-gnarling = Fortificación de Gnarlings +hud-map-chapel_site = Capilla Marina +hud-map-placed_by = Colocado por { $name } diff --git a/assets/voxygen/i18n/es_ES/hud/misc.ftl b/assets/voxygen/i18n/es_ES/hud/misc.ftl index 1218bcb612..5c7648ffca 100644 --- a/assets/voxygen/i18n/es_ES/hud/misc.ftl +++ b/assets/voxygen/i18n/es_ES/hud/misc.ftl @@ -5,18 +5,21 @@ hud-you_died = Has Muerto hud-waypoint_saved = Punto de Control Guardado hud-sp_arrow_txt = PH hud-inventory_full = Inventario Lleno +hud-someone_else = alguien más +hud-another_group = otro grupo +hud-owned_by_for_secs = Propiedad de { $name } por { $secs } segundos hud-press_key_to_show_keybindings_fmt = Pulsa { $key } para mostrar Atajos de Teclado hud-press_key_to_toggle_lantern_fmt = [{ $key }] Farol hud-press_key_to_show_debug_info_fmt = Pulsa { $key } para mostrar info. de depuración hud-press_key_to_toggle_keybindings_fmt = Pulsa { $key } para alternar atajos de teclado hud-press_key_to_toggle_debug_info_fmt = Pulsa { $key } para alternar la información de depuración -hud-press_key_to_respawn = Pulsa { $key } para aparecer en el último Punto de Control. +hud-press_key_to_respawn = Pulsa { $key } para reaparecer en la última hoguera que has visitado. hud-tutorial_btn = Tutorial -hud-tutorial_click_here = ¡Pulsa [ { $key } ] para liberar tu cursor y clicar en el botón! +hud-tutorial_click_here = ¡Pulsa [ { $key } ] para liberar tu cursor y clicar en este botón! hud-tutorial_elements = Fabricación -hud-temp_quest_headline = Saludos Viajero! +hud-temp_quest_headline = ¡Saludos Viajero! hud-temp_quest_text = - Para comenzar tu viaje puedes empezar a buscar en esta aldea y recoger algunos suministros. + Para comenzar tu viaje puedes ir empezando a buscar en esta aldea y recolectar algunos suministros. ¡Puedes llevarte todo lo que necesites en tu viaje! @@ -26,12 +29,12 @@ hud-temp_quest_text = Los animales salvajes que rodean la ciudad son una gran fuente de Pieles para crear algunas armaduras para defenderte de los peligros del mundo. - Cuando te sientas preparado, intenta conseguir un equipo aún mejor en las mazmorras y cuevas marcadas en tu mapa. + ¡Cuando te sientas preparado, intenta conseguir aún mejor equipamiento en las mazmorras y cuevas marcadas en tu mapa! hud-spell = Hechizos hud-diary = Diario hud-free_look_indicator = Vista libre activa. Pulsa { $key } para desactivarla. hud-camera_clamp_indicator = Cámara fija vertical activa. Pulsa { $key } para desactivarla. -hud-auto_walk_indicator = Auto andar activado +hud-auto_walk_indicator = Auto andar/nadar activa hud-collect = Recolectar hud-pick_up = Recoger hud-open = Abrir diff --git a/assets/voxygen/i18n/es_ES/hud/settings.ftl b/assets/voxygen/i18n/es_ES/hud/settings.ftl index 03c6a521b3..3357f2ef15 100644 --- a/assets/voxygen/i18n/es_ES/hud/settings.ftl +++ b/assets/voxygen/i18n/es_ES/hud/settings.ftl @@ -19,19 +19,24 @@ hud-settings-buffs_skillbar = Estados en Barra de Habilidades. hud-settings-buffs_mmap = Estados en el Minimapa hud-settings-toggle_bar_experience = Alternar Barra de Experiencia hud-settings-scrolling_combat_text = Texto de Combate Deslizante +hud-settings-damage_accumulation_duration = Duración de la Acumulación de Daño hud-settings-incoming_damage = Daño Entrante +hud-settings-incoming_damage_accumulation_duration = Duración de la Acumulación de Daño Entrante +hud-settings-round_damage = Redondear Daño hud-settings-speech_bubble = Burbuja de Diálogo -hud-settings-speech_bubble_self = Mostrar mis Diálogos en Burbuja de Diálogo +hud-settings-speech_bubble_self = Mostrar mis propias Burbujas de Diálogo hud-settings-speech_bubble_dark_mode = Modo Oscuro de la Burbuja de Diálogo hud-settings-speech_bubble_icon = Icono de Burbuja de Diálogo hud-settings-energybar_numbers = Números de Barra de Energía -hud-settings-always_show_bars = Siempre Mostrar Barras de Energía +hud-settings-always_show_bars = Mostrar Siempre Barras de Energía +hud-settings-experience_numbers = Números de Experiencia +hud-settings-accumulate_experience = Acumular Números de Experiencia hud-settings-values = Valores hud-settings-percentages = Porcentajes hud-settings-chat = Chat hud-settings-background_opacity = Opacidad del Fondo hud-settings-chat_character_name = Nombres de Personajes en el chat -hud-settings-loading_tips = Consejos mientras se carga +hud-settings-loading_tips = Consejos en la Pantalla de Carga hud-settings-reset_interface = Restablecer Por Defecto hud-settings-pan_sensitivity = Sensibilidad de Paneo hud-settings-zoom_sensitivity = Sensibilidad de Zoom @@ -40,22 +45,25 @@ hud-settings-invert_scroll_zoom = Invertir el Deslizamiento del Zoom hud-settings-invert_mouse_y_axis = Invertir Eje Y del Ratón hud-settings-invert_controller_y_axis = Invert Eje Y del Mando hud-settings-enable_mouse_smoothing = Suavizado de Cámara -hud-settings-free_look_behavior = Comportamiento de vista libre -hud-settings-auto_walk_behavior = Comportamiento de autoandar +hud-settings-free_look_behavior = Comportamiento de la Vista libre +hud-settings-auto_walk_behavior = Comportamiento del Autoandar hud-settings-camera_clamp_behavior = Comportamiento de la cámara fija -hud-settings-player_physics_behavior = Física de Jugador (experimental) +hud-settings-player_physics_behavior = Física del Jugador (experimental) hud-settings-stop_auto_walk_on_input = Detener autoandar en movimiento hud-settings-auto_camera = Cámara automática +hud-settings-bow_zoom = Hacer Zoom al cargar el arco hud-settings-reset_gameplay = Restablecer Valores Por Defecto hud-settings-view_distance = Distancia de Visión +hud-settings-entity_view_distance = Distancia de Visión de Entidades +hud-settings-lod_distance = Distancia del Nivel de Detalle hud-settings-sprites_view_distance = Distancia de Visión de Sprites -hud-settings-figures_view_distance = Distancia de Visión de Entidades +hud-settings-entities_detail_distance = Distancia de Detalles de Entidades hud-settings-maximum_fps = FPS Máximos hud-settings-background_fps = FPS de Fondo hud-settings-present_mode = Modo Presente -hud-settings-present_mode-fifo = Fifo -hud-settings-present_mode-mailbox = Mailbox -hud-settings-present_mode-immediate = Inmediato +hud-settings-present_mode-vsync_capped = Vsync limitado +hud-settings-present_mode-vsync_uncapped = Vsync ilimitado +hud-settings-present_mode-vsync_off = Vsync desactivado hud-settings-fov = Campo de visión en (grados) hud-settings-gamma = Gamma hud-settings-exposure = Exposición @@ -78,26 +86,33 @@ hud-settings-fullscreen_mode-borderless = Sin bordes hud-settings-gpu_profiler = Habilitar GPU timing (no soportado en todos los sistemas) hud-settings-particles = Partículas hud-settings-lossy_terrain_compression = Comprensión del terreno +hud-settings-weapon_trails = Rastros de Armas +hud-settings-flashing_lights = Luces brillantes +hud-settings-flashing_lights_info = Desactiva todo tipo de brillos, p. ej. parpadeos o relámpagos hud-settings-resolution = Resolución hud-settings-bit_depth = Profundidad de Bits hud-settings-refresh_rate = Tasa de Refresco hud-settings-lighting_rendering_mode = Modo de Renderizado de Luz hud-settings-lighting_rendering_mode-ashikhmin = Tipo A - Alto hud-settings-lighting_rendering_mode-blinnphong = Tipo B - Medio -hud-settings-lighting_rendering_mode-lambertian = Tipo L - Barato +hud-settings-lighting_rendering_mode-lambertian = Tipo L - Rápido hud-settings-shadow_rendering_mode = Modo de Renderizado de Sombras hud-settings-shadow_rendering_mode-none = Ninguno hud-settings-shadow_rendering_mode-cheap = Rápido hud-settings-shadow_rendering_mode-map = Mapeado hud-settings-shadow_rendering_mode-map-resolution = Resolución +hud-settings-rain_occlusion-resolution = Resolución de Oclusión por Lluvia hud-settings-lod_detail = Nivel de Detalle hud-settings-save_window_size = Guardar tamaño de ventana hud-settings-reset_graphics = Restablecer Valores Por Defecto hud-settings-bloom = Efecto Cámara +hud-settings-point_glow = Brillo Puntual hud-settings-master_volume = Volumen Principal -hud-settings-inactive_master_volume_perc = Volumen Ventana Inactivo +hud-settings-inactive_master_volume_perc = Volumen de Ventana Inactivo hud-settings-music_volume = Volumen de Música hud-settings-sound_effect_volume = Volumen de Efectos de Sonido +hud-settings-ambience_volume = Volumen de Ambiente +hud-settings-music_spacing = Espaciado de Música hud-settings-audio_device = Dispositivo de Audio hud-settings-reset_sound = Restablecer Valores Por Defecto hud-settings-english_fallback = Mostrar inglés para traducciones pendientes @@ -119,3 +134,5 @@ hud-settings-say = Decir hud-settings-all = Todo hud-settings-group_only = Solo a grupo hud-settings-reset_chat = Restablecer Valores Por Defecto +hud-settings-third_party_integrations = Integraciones de Terceros +hud-settings-enable_discord_integration = Habilitar Integración de Discord diff --git a/assets/voxygen/i18n/es_ES/hud/skills.ftl b/assets/voxygen/i18n/es_ES/hud/skills.ftl index 82bacb0dec..086fa895c4 100644 --- a/assets/voxygen/i18n/es_ES/hud/skills.ftl +++ b/assets/voxygen/i18n/es_ES/hud/skills.ftl @@ -21,19 +21,19 @@ hud-skill-unlck_staff = Desbloquea el árbol de habilidades del báculo{ $SP } hud-skill-unlck_sceptre_title = Desbloquear Cetro hud-skill-unlck_sceptre = Desbloquea el árbol de habilidades del cetro{ $SP } hud-skill-dodge_title = Esquivar -hud-skill-dodge = Pulsando la rueda del ratón, ruedas, obteniendo inmunidad a los ataques(i-frames) mientras ruedes. +hud-skill-dodge = Puedes rodar clicando la rueda del ratón, obteniendo inmunidad a los ataques cuerpo a cuerpo(i-frames) mientras ruedes. hud-skill-roll_energy_title = Coste de Energía al Rodar -hud-skill-roll_energy = Rodar usa un { $boost }% menos de energía{ $SP } +hud-skill-roll_energy = Rodar consume un { $boost }% menos de energía{ $SP } hud-skill-roll_speed_title = Velocidad al Rodar -hud-skill-roll_speed = Rodar es un { $boost }% más rápido{ $SP } +hud-skill-roll_speed = Ruedas un { $boost }% más rápido{ $SP } hud-skill-roll_dur_title = Duración de Rodar -hud-skill-roll_dur = Rodar dura un { $boost }% más de tiempo{ $SP } +hud-skill-roll_dur = Ruedas un { $boost }% más de tiempo{ $SP } hud-skill-climbing_title = Escalada hud-skill-climbing = Subir pendientes hud-skill-climbing_cost_title = Coste de Energía de Escalar -hud-skill-climbing_cost = Escalar usa un { $boost }% menos de energía{ $SP } +hud-skill-climbing_cost = Escalar consume un { $boost }% menos de energía{ $SP } hud-skill-climbing_speed_title = Velocidad al Escalar -hud-skill-climbing_speed = Escalar es un { $boost }% más rápido{ $SP } +hud-skill-climbing_speed = Escalas un { $boost }% más rápido{ $SP } hud-skill-swim_title = Nadar hud-skill-swim = Moverte por el agua hud-skill-swim_speed_title = Velocidad al Nadar @@ -79,7 +79,7 @@ hud-skill-st_shockwave_damage = Incrementa el daño causado en un { $boost }%{ $ hud-skill-st_shockwave_unlock_title = Desbloquear Onda De Choque hud-skill-st_shockwave_unlock = Desbloquea la habilidad de lanzar por los aires a los enemigos usando fuego{ $SP } hud-skill-st_flamethrower_title = Lanzallamas -hud-skill-st_flamethrower = Lanza fuego para cocinar a tus enemigos +hud-skill-st_flamethrower = Lanza fuego, ¡fríelos a todos! hud-skill-st_flame_velocity_title = Velocidad de la Llama hud-skill-st_flame_velocity = Haz que el fuego vaya más rápido, en un { $boost }%{ $SP } hud-skill-st_flamethrower_range_title = Alcance del Lanzallamas diff --git a/assets/voxygen/i18n/es_ES/hud/social.ftl b/assets/voxygen/i18n/es_ES/hud/social.ftl index c646610030..1671bc918b 100644 --- a/assets/voxygen/i18n/es_ES/hud/social.ftl +++ b/assets/voxygen/i18n/es_ES/hud/social.ftl @@ -1,5 +1,5 @@ hud-social = Otros jugadores -hud-social-online = Conectados +hud-social-online = Conectados: hud-social-friends = Amigos hud-social-not_yet_available = No disponible todavía hud-social-faction = Facción diff --git a/assets/voxygen/i18n/es_ES/hud/trade.ftl b/assets/voxygen/i18n/es_ES/hud/trade.ftl index eb4c37c0ad..41d9693d92 100644 --- a/assets/voxygen/i18n/es_ES/hud/trade.ftl +++ b/assets/voxygen/i18n/es_ES/hud/trade.ftl @@ -1,11 +1,11 @@ hud-trade-trade_window = Comercio hud-trade-phase1_description = - Arrastra los objetos a comerciar - al área correspondiente + Arrastra los objetos que quieres comerciar + al área correspondiente. hud-trade-phase2_description = El comercio está ahora bloqueado para darte - tiempo a revisarlo -hud-trade-phase3_description = El trato está siendo procesado + tiempo a revisarlo. +hud-trade-phase3_description = El trato está siendo procesado. hud-trade-persons_offer = Oferta de { $playername } hud-trade-has_accepted = { $playername } @@ -13,13 +13,14 @@ hud-trade-has_accepted = hud-trade-accept = Aceptar hud-trade-decline = Rechazar hud-trade-invite_sent = Solicitud de comercio enviada a { $playername } -hud-trade-result-completed = Trato completado con éxito -hud-trade-result-declined = Trato rechazado -hud-trade-result-nospace = No hay suficiente espacio para completar el comercio +hud-trade-result-completed = Trato completado con éxito. +hud-trade-result-declined = Trato rechazado. +hud-trade-result-nospace = No hay suficiente espacio para completar el comercio. hud-trade-buy_price = Precio de Compra hud-trade-sell_price = Precio de Venta hud-trade-coin = moneda(s) -hud-trade-tooltip_hint_1 = +hud-trade-tooltip_hint_1 = hud-trade-tooltip_hint_2 = hud-trade-your_offer = Tu oferta -hud-trade-their_offer = Su oferta \ No newline at end of file +hud-trade-their_offer = Su oferta +hud-trade-amount_input = Seleciona un objeto diff --git a/assets/voxygen/i18n/es_ES/main.ftl b/assets/voxygen/i18n/es_ES/main.ftl index ac0517528e..5113207441 100644 --- a/assets/voxygen/i18n/es_ES/main.ftl +++ b/assets/voxygen/i18n/es_ES/main.ftl @@ -30,8 +30,11 @@ main-login_process = Puedes crear una cuenta en https://veloren.net/account/. + + main-login-server_not_found = Servidor no encontrado main-login-authentication_error = Error de autenticación al servidor +main-login-internal_error = Error interno en el cliente (lo más probable es que se haya borrado el personaje) main-login-failed_auth_server_url_invalid = Fallo al conectar con el servidor de Autenticación main-login-insecure_auth_scheme = El esquema HTTP no esta soportado. ¡Es inseguro! Para propósitos de desarrollo, HTTP esta permitido para 'localhost' o versiones de depuración main-login-server_full = El servidor está lleno @@ -58,10 +61,10 @@ main-servers-singleplayer_error = Fallo al conectar con el servidor interno: { $ main-servers-network_error = Red de Servidor/Error de socket: { $raw_error } main-servers-participant_error = Desconexión de Participante/error protocolo: { $raw_error } main-servers-stream_error = Conexión de cliente/compression/error (de)serialización: { $raw_error } -main-servers-database_error = Error servidor base de datos: { $raw_error } -main-servers-persistence_error = Error servidor persistente (Probablemente datos Asset/Personaje): { $raw_error } -main-servers-other_error = Error servidor general: { $raw_error } -main-credits = Creditos +main-servers-database_error = Error en la base de datos del servidor: { $raw_error } +main-servers-persistence_error = Error de persistencia del servidor (Probablemente datos de Asset/Personaje): { $raw_error } +main-servers-other_error = Error general del servidor : { $raw_error } +main-credits = Créditos main-credits-created_by = creado por main-credits-music = Música main-credits-fonts = Fuentes @@ -70,8 +73,8 @@ main-credits-contributors = Colaboradores loading-tips = .a0 = Pulsa '{ $gameinput-togglelantern }' para encender tu farol. .a1 = Pulsa '{ $gameinput-help }' para ver todos los atajos de teclado. - .a2 = Puedes escribir /say o /s para chatear con jugadores que estén a tu alrededor. - .a3 = Puedes escribir /region o /r para chatear con jugadores que se encuentren a doscientos bloques a tu alrededor. + .a2 = Puedes emplear el comando /say o /s para chatear con jugadores que se encuentren justo a tu lado. + .a3 = Puedes emplear el comando /region o /r para chatear con jugadores que se encuentren a menos de 200 bloques de tu alrededor. .a4 = Los administradores pueden usar el comando /build para entrar en el modo de construcción. .a5 = Puedes escribir /group o /g para chatear con jugadores en tu grupo. .a6 = Para enviar mensajes privados escribe /tell seguido del nombre del jugador y tu mensaje. From 2b3cfe690d062597a5f821f38d906c31fda2e0f4 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Tue, 6 Sep 2022 00:59:15 +0300 Subject: [PATCH 204/854] Adress review * Make compatible_handndess check its own function and get back to `match` --- common/src/comp/inventory/item/modular.rs | 34 +++++++++++------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/common/src/comp/inventory/item/modular.rs b/common/src/comp/inventory/item/modular.rs index a3ce9f6104..23acc1305d 100644 --- a/common/src/comp/inventory/item/modular.rs +++ b/common/src/comp/inventory/item/modular.rs @@ -389,6 +389,16 @@ pub enum ModularWeaponCreationError { SecondaryComponentNotFound, } +/// Check if hand restrictions are compatible. +/// +/// If at least on of them is omitted, check is passed. +fn compatible_handndess(a: Option, b: Option) -> bool { + match (a, b) { + (Some(a), Some(b)) => a == b, + _ => true, + } +} + /// Generate all primary components for specific tool and material. /// /// Read [random_weapon_primary_component] for more. @@ -406,9 +416,7 @@ pub fn generate_weapon_primary_components( .get(&(tool, material_id.to_owned())) .into_iter() .flatten() - .filter(|(_comp, hand)| { - hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() - }) + .filter(|(_comp, hand)| compatible_handndess(hand_restriction, *hand)) .map(|(c, h)| (c.duplicate(ability_map, msm), hand_restriction.or(*h))) .collect()) } else { @@ -442,9 +450,7 @@ pub fn random_weapon_primary_component( .get(&(tool, material_id.to_owned())) .into_iter() .flatten() - .filter(|(_comp, hand)| { - hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() - }) + .filter(|(_comp, hand)| compatible_handndess(hand_restriction, *hand)) .collect::>(); let (comp, hand) = primary_components @@ -484,16 +490,10 @@ pub fn generate_weapons( .get(&tool) .into_iter() .flatten() - .filter(|(_def, hand)| { - hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() - }); - - for (def, hand) in secondaries { - if comp_hand.is_some() && hand.is_some() && comp_hand != *hand { - // if handedness of components incompatible, skip - continue; - } + .filter(|(_def, hand)| compatible_handndess(hand_restriction, *hand)) + .filter(|(_def, hand)| compatible_handndess(comp_hand, *hand)); + for (def, _hand) in secondaries { let secondary = Item::new_from_item_base( ItemBase::Simple(Arc::clone(def)), Vec::new(), @@ -532,9 +532,7 @@ pub fn random_weapon( .get(&tool) .into_iter() .flatten() - .filter(|(_def, hand)| { - hand_restriction == *hand || hand_restriction.is_none() || hand.is_none() - }) + .filter(|(_def, hand)| compatible_handndess(hand_restriction, *hand)) .collect::>(); let secondary_component = { From e4a3671345621b40c5ac93573aea3330b9a3d611 Mon Sep 17 00:00:00 2001 From: flo Date: Tue, 6 Sep 2022 10:35:10 +0000 Subject: [PATCH 205/854] Creature model updates --- .../entity/wild/aggressive/dodarock.ron | 2 +- .../{quad_small => theropod}/dodarock.ron | 0 assets/common/npc_names.ron | 34 +- .../voxel/bird_large_central_manifest.ron | 234 +++++++++++- .../voxel/bird_large_lateral_manifest.ron | 352 +++++++++++++++++- .../voxygen/voxel/golem_central_manifest.ron | 12 +- .../voxygen/voxel/npc/dodarock/male/chest.vox | 3 - .../voxel/npc/dodarock/male/chest_back.vox | 3 + .../voxel/npc/dodarock/male/chest_front.vox | 3 + .../voxel/npc/dodarock/male/foot_br.vox | 3 - .../voxel/npc/dodarock/male/foot_fr.vox | 3 - .../voxel/npc/dodarock/male/foot_r.vox | 3 + .../voxel/npc/dodarock/male/hand_r.vox | 3 + .../voxygen/voxel/npc/dodarock/male/head.vox | 4 +- .../voxel/npc/dodarock/male/head_lower.vox | 3 + .../voxygen/voxel/npc/dodarock/male/jaw.vox | 3 + .../voxygen/voxel/npc/dodarock/male/leg_r.vox | 3 + .../voxygen/voxel/npc/dodarock/male/neck.vox | 3 + .../voxel/npc/dodarock/male/tail_back.vox | 3 + .../voxel/npc/dodarock/male/tail_front.vox | 3 + .../voxel/npc/lavadrake/male/chest.vox | 2 +- .../voxel/npc/lavadrake/male/foot_br.vox | 2 +- .../voxel/npc/lavadrake/male/foot_fr.vox | 2 +- .../voxel/npc/lavadrake/male/head_lower.vox | 2 +- .../voxel/npc/lavadrake/male/head_upper.vox | 2 +- .../voxygen/voxel/npc/lavadrake/male/jaw.vox | 2 +- .../voxel/npc/lavadrake/male/tail_front.vox | 2 +- .../voxel/npc/lavadrake/male/tail_rear.vox | 2 +- .../voxel/npc/reefsnapper/male/chest.vox | 3 + .../voxel/npc/reefsnapper/male/foot_br.vox | 3 + .../voxel/npc/reefsnapper/male/foot_fr.vox | 3 + .../voxel/npc/reefsnapper/male/head_lower.vox | 3 + .../voxel/npc/reefsnapper/male/head_upper.vox | 3 + .../voxel/npc/reefsnapper/male/jaw.vox | 3 + .../voxel/npc/reefsnapper/male/tail_front.vox | 3 + .../voxel/npc/reefsnapper/male/tail_rear.vox | 3 + .../voxel/npc/rootsnapper/male/chest.vox | 3 + .../voxel/npc/rootsnapper/male/foot_br.vox | 3 + .../voxel/npc/rootsnapper/male/foot_fr.vox | 3 + .../voxel/npc/rootsnapper/male/head_lower.vox | 3 + .../voxel/npc/rootsnapper/male/head_upper.vox | 3 + .../voxel/npc/rootsnapper/male/jaw.vox | 3 + .../voxel/npc/rootsnapper/male/tail_front.vox | 3 + .../voxel/npc/rootsnapper/male/tail_rear.vox | 3 + assets/voxygen/voxel/npc/saber/male/ears.vox | 2 +- .../voxygen/voxel/npc/saber/male/foot_br.vox | 4 +- .../voxygen/voxel/npc/saber/male/foot_fr.vox | 4 +- assets/voxygen/voxel/npc/saber/male/head.vox | 4 +- assets/voxygen/voxel/npc/saber/male/jaw.vox | 4 +- .../voxygen/voxel/npc/saber/male/leg_br.vox | 4 +- .../voxygen/voxel/npc/saber/male/leg_fr.vox | 4 +- assets/voxygen/voxel/npc/saber/male/neck.vox | 4 +- assets/voxygen/voxel/npc/saber/male/tail.vox | 4 +- .../voxel/npc/saber/male/torso_back.vox | 4 +- .../voxel/npc/saber/male/torso_front.vox | 4 +- .../voxel/npc/salamander/female/chest.vox | 4 +- .../voxel/npc/salamander/female/foot_br.vox | 4 +- .../voxel/npc/salamander/female/foot_fr.vox | 2 +- .../npc/salamander/female/head_lower.vox | 4 +- .../npc/salamander/female/head_upper.vox | 4 +- .../voxel/npc/salamander/female/jaw.vox | 4 +- .../npc/salamander/female/tail_front.vox | 4 +- .../voxel/npc/salamander/female/tail_rear.vox | 4 +- .../voxel/npc/treant/male/chest_lower.vox | 4 +- .../voxel/npc/treant/male/chest_upper.vox | 4 +- .../voxygen/voxel/npc/treant/male/foot_l.vox | 4 +- .../voxygen/voxel/npc/treant/male/foot_r.vox | 4 +- .../voxygen/voxel/npc/treant/male/hand_l.vox | 2 +- .../voxygen/voxel/npc/treant/male/hand_r.vox | 2 +- assets/voxygen/voxel/npc/treant/male/head.vox | 4 +- assets/voxygen/voxel/npc/treant/male/jaw.vox | 4 +- .../voxygen/voxel/npc/treant/male/leg_l.vox | 4 +- .../voxygen/voxel/npc/treant/male/leg_r.vox | 4 +- .../voxel/npc/treant/male/shoulder_l.vox | 4 +- .../voxel/npc/treant/male/shoulder_r.vox | 4 +- .../voxel/npc/wyvern_cloud/male/beak.vox | 3 + .../voxel/npc/wyvern_cloud/male/chest.vox | 3 + .../voxel/npc/wyvern_cloud/male/foot_r.vox | 3 + .../voxel/npc/wyvern_cloud/male/head.vox | 3 + .../voxel/npc/wyvern_cloud/male/jaw.vox | 3 + .../voxel/npc/wyvern_cloud/male/leg_r.vox | 3 + .../voxel/npc/wyvern_cloud/male/neck.vox | 3 + .../npc/wyvern_cloud/male/tail_front.vox | 3 + .../voxel/npc/wyvern_cloud/male/tail_rear.vox | 3 + .../voxel/npc/wyvern_cloud/male/wing_in_r.vox | 3 + .../npc/wyvern_cloud/male/wing_mid_r.vox | 3 + .../npc/wyvern_cloud/male/wing_out_r.vox | 3 + .../voxel/npc/wyvern_flame/male/beak.vox | 4 +- .../voxel/npc/wyvern_flame/male/chest.vox | 4 +- .../voxel/npc/wyvern_flame/male/foot_r.vox | 2 +- .../voxel/npc/wyvern_flame/male/head.vox | 4 +- .../voxel/npc/wyvern_flame/male/leg_r.vox | 2 +- .../voxel/npc/wyvern_flame/male/neck.vox | 4 +- .../npc/wyvern_flame/male/tail_front.vox | 4 +- .../voxel/npc/wyvern_flame/male/tail_rear.vox | 4 +- .../voxel/npc/wyvern_flame/male/wing_in_r.vox | 4 +- .../npc/wyvern_flame/male/wing_mid_r.vox | 4 +- .../npc/wyvern_flame/male/wing_out_r.vox | 4 +- .../voxel/npc/wyvern_frost/male/beak.vox | 3 + .../voxel/npc/wyvern_frost/male/chest.vox | 3 + .../voxel/npc/wyvern_frost/male/foot_r.vox | 3 + .../voxel/npc/wyvern_frost/male/head.vox | 3 + .../voxel/npc/wyvern_frost/male/leg_r.vox | 3 + .../voxel/npc/wyvern_frost/male/neck.vox | 3 + .../npc/wyvern_frost/male/tail_front.vox | 3 + .../voxel/npc/wyvern_frost/male/tail_rear.vox | 3 + .../voxel/npc/wyvern_frost/male/wing_in_r.vox | 3 + .../npc/wyvern_frost/male/wing_mid_r.vox | 3 + .../npc/wyvern_frost/male/wing_out_r.vox | 3 + .../voxel/npc/wyvern_sea/male/beak.vox | 3 + .../voxel/npc/wyvern_sea/male/chest.vox | 3 + .../voxel/npc/wyvern_sea/male/foot_r.vox | 3 + .../voxel/npc/wyvern_sea/male/head.vox | 3 + .../voxel/npc/wyvern_sea/male/leg_r.vox | 3 + .../voxel/npc/wyvern_sea/male/neck.vox | 3 + .../voxel/npc/wyvern_sea/male/tail_front.vox | 3 + .../voxel/npc/wyvern_sea/male/tail_rear.vox | 3 + .../voxel/npc/wyvern_sea/male/wing_in_r.vox | 3 + .../voxel/npc/wyvern_sea/male/wing_mid_r.vox | 3 + .../voxel/npc/wyvern_sea/male/wing_out_r.vox | 3 + .../voxel/npc/wyvern_weald/male/beak.vox | 3 + .../voxel/npc/wyvern_weald/male/chest.vox | 3 + .../voxel/npc/wyvern_weald/male/foot_r.vox | 3 + .../voxel/npc/wyvern_weald/male/head.vox | 3 + .../voxel/npc/wyvern_weald/male/leg_r.vox | 3 + .../voxel/npc/wyvern_weald/male/neck.vox | 3 + .../npc/wyvern_weald/male/tail_front.vox | 3 + .../voxel/npc/wyvern_weald/male/tail_rear.vox | 3 + .../voxel/npc/wyvern_weald/male/wing_in_r.vox | 3 + .../npc/wyvern_weald/male/wing_mid_r.vox | 3 + .../npc/wyvern_weald/male/wing_out_r.vox | 3 + .../voxel/quadruped_low_central_manifest.ron | 114 +++++- .../voxel/quadruped_low_lateral_manifest.ron | 74 +++- .../quadruped_medium_central_manifest.ron | 24 +- .../quadruped_medium_lateral_manifest.ron | 16 +- .../quadruped_small_central_manifest.ron | 28 -- .../quadruped_small_lateral_manifest.ron | 36 -- .../voxel/theropod_central_manifest.ron | 60 +++ .../voxel/theropod_lateral_manifest.ron | 52 +++ common/src/comp/agent.rs | 3 +- common/src/comp/body.rs | 21 +- common/src/comp/body/bird_large.rs | 18 +- common/src/comp/body/quadruped_low.rs | 32 +- common/src/comp/body/quadruped_small.rs | 8 +- common/src/comp/body/theropod.rs | 6 +- common/src/comp/inventory/loadout_builder.rs | 16 +- common/src/states/utils.rs | 6 +- voxygen/anim/src/bird_large/mod.rs | 73 +++- voxygen/anim/src/quadruped_low/mod.rs | 22 ++ voxygen/anim/src/quadruped_small/mod.rs | 16 +- voxygen/anim/src/theropod/mod.rs | 19 +- 151 files changed, 1400 insertions(+), 276 deletions(-) rename assets/common/loot_tables/creature/{quad_small => theropod}/dodarock.ron (100%) delete mode 100644 assets/voxygen/voxel/npc/dodarock/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/chest_back.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/chest_front.vox delete mode 100644 assets/voxygen/voxel/npc/dodarock/male/foot_br.vox delete mode 100644 assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/hand_r.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/head_lower.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/neck.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/tail_back.vox create mode 100644 assets/voxygen/voxel/npc/dodarock/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/head_lower.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/head_upper.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/reefsnapper/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/head_lower.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/head_upper.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/rootsnapper/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/beak.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/head.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/neck.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/wing_in_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/wing_mid_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_cloud/male/wing_out_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/beak.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/head.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/neck.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/wing_in_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/wing_mid_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_frost/male/wing_out_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/beak.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/head.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/neck.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/wing_in_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/wing_mid_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_sea/male/wing_out_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/beak.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/head.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/neck.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/wing_in_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/wing_mid_r.vox create mode 100644 assets/voxygen/voxel/npc/wyvern_weald/male/wing_out_r.vox diff --git a/assets/common/entity/wild/aggressive/dodarock.ron b/assets/common/entity/wild/aggressive/dodarock.ron index db8c9630a8..822eb208b2 100644 --- a/assets/common/entity/wild/aggressive/dodarock.ron +++ b/assets/common/entity/wild/aggressive/dodarock.ron @@ -3,7 +3,7 @@ name: Automatic, body: RandomWith("dodarock"), alignment: Alignment(Enemy), - loot: LootTable("common.loot_tables.creature.quad_small.dodarock"), + loot: LootTable("common.loot_tables.creature.theropod.dodarock"), inventory: ( loadout: FromBody, ), diff --git a/assets/common/loot_tables/creature/quad_small/dodarock.ron b/assets/common/loot_tables/creature/theropod/dodarock.ron similarity index 100% rename from assets/common/loot_tables/creature/quad_small/dodarock.ron rename to assets/common/loot_tables/creature/theropod/dodarock.ron diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index 54c843d971..d471f3bbe4 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -718,10 +718,6 @@ keyword: "quokka", generic: "Quokka" ), - dodarock: ( - keyword: "dodarock", - generic: "Dodarock" - ), holladon: ( keyword: "holladon", generic: "Holladon" @@ -989,7 +985,11 @@ ntouka: ( keyword: "ntouka", generic: "Ntouka" - ) + ), + dodarock: ( + keyword: "dodarock", + generic: "Dodarock" + ), ) ), dragon: ( @@ -1143,6 +1143,22 @@ keyword: "wyvern_flame", generic: "Flame Wyvern" ), + wyvern_cloud: ( + keyword: "wyvern_cloud", + generic: "Cloud Wyvern" + ), + wyvern_frost: ( + keyword: "wyvern_frost", + generic: "Frost Wyvern" + ), + wyvern_sea: ( + keyword: "wyvern_sea", + generic: "Sea Wyvern" + ), + wyvern_weald: ( + keyword: "wyvern_weald", + generic: "Weald Wyvern" + ), ) ), quadruped_low: ( @@ -1185,6 +1201,14 @@ keyword: "rocksnapper", generic: "Rock Snapper" ), + rootsnapper: ( + keyword: "rootsnapper", + generic: "Root Snapper" + ), + reefsnapper: ( + keyword: "reefsnapper", + generic: "Reef Snapper" + ), pangolin: ( keyword: "pangolin", generic: "Pangolin" diff --git a/assets/voxygen/voxel/bird_large_central_manifest.ron b/assets/voxygen/voxel/bird_large_central_manifest.ron index 6617997b69..2a851fcf55 100644 --- a/assets/voxygen/voxel/bird_large_central_manifest.ron +++ b/assets/voxygen/voxel/bird_large_central_manifest.ron @@ -157,54 +157,262 @@ ), (FlameWyvern, Male): ( head: ( - offset: (-5.5, -5.0, 0.0), + offset: (-7.5, -5.0, 0.0), central: ("npc.wyvern_flame.male.head"), ), beak: ( - offset: (-2.5, 0.0, -5.0), + offset: (-6.5, 0.0, -7.0), central: ("npc.wyvern_flame.male.beak"), ), neck: ( - offset: (-2.5, 0.0, -3.5), + offset: (-3.5, 0.0, -5.0), central: ("npc.wyvern_flame.male.neck"), ), chest: ( - offset: (-6.5, -12.0, -9.0), + offset: (-8.5, -12.0, -10.0), central: ("npc.wyvern_flame.male.chest"), ), tail_front: ( - offset: (-2.5, -12.0, -7.0), + offset: (-3.5, -12.0, -8.5), central: ("npc.wyvern_flame.male.tail_front"), ), tail_rear: ( - offset: (-4.5, -29.0, -8.0), + offset: (-5.5, -27.0, -8.0), central: ("npc.wyvern_flame.male.tail_rear"), ) ), (FlameWyvern, Female): ( head: ( - offset: (-5.5, -5.0, 0.0), + offset: (-7.5, -5.0, 0.0), central: ("npc.wyvern_flame.male.head"), ), beak: ( - offset: (-2.5, 0.0, -5.0), + offset: (-6.5, 0.0, -7.0), central: ("npc.wyvern_flame.male.beak"), ), neck: ( - offset: (-2.5, 0.0, -3.5), + offset: (-3.5, 0.0, -5.0), central: ("npc.wyvern_flame.male.neck"), ), chest: ( - offset: (-6.5, -12.0, -9.0), + offset: (-8.5, -12.0, -10.0), central: ("npc.wyvern_flame.male.chest"), ), tail_front: ( - offset: (-2.5, -12.0, -7.0), + offset: (-3.5, -12.0, -8.5), central: ("npc.wyvern_flame.male.tail_front"), ), tail_rear: ( - offset: (-4.5, -29.0, -8.0), + offset: (-5.5, -27.0, -8.0), central: ("npc.wyvern_flame.male.tail_rear"), ) ), -}) + (CloudWyvern, Male): ( + head: ( + offset: (-3.5, -5.0, 0.0), + central: ("npc.wyvern_cloud.male.head"), + ), + beak: ( + offset: (-2.5, 0.0, -6.0), + central: ("npc.wyvern_cloud.male.beak"), + ), + neck: ( + offset: (-2.5, 0.0, -5.0), + central: ("npc.wyvern_cloud.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_cloud.male.chest"), + ), + tail_front: ( + offset: (-10.5, -14.0, -7.5), + central: ("npc.wyvern_cloud.male.tail_front"), + ), + tail_rear: ( + offset: (-11.5, -29.0, -7.0), + central: ("npc.wyvern_cloud.male.tail_rear"), + ) + ), + (CloudWyvern, Female): ( + head: ( + offset: (-3.5, -5.0, 0.0), + central: ("npc.wyvern_cloud.male.head"), + ), + beak: ( + offset: (-2.5, 0.0, -6.0), + central: ("npc.wyvern_cloud.male.beak"), + ), + neck: ( + offset: (-2.5, 0.0, -5.0), + central: ("npc.wyvern_cloud.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_cloud.male.chest"), + ), + tail_front: ( + offset: (-10.5, -14.0, -7.5), + central: ("npc.wyvern_cloud.male.tail_front"), + ), + tail_rear: ( + offset: (-11.5, -29.0, -7.0), + central: ("npc.wyvern_cloud.male.tail_rear"), + ) + ), + (FrostWyvern, Male): ( + head: ( + offset: (-15.5, -5.0, 0.0), + central: ("npc.wyvern_frost.male.head"), + ), + beak: ( + offset: (-2.5, 1.0, -5.0), + central: ("npc.wyvern_frost.male.beak"), + ), + neck: ( + offset: (-3.5, 0.0, -5.0), + central: ("npc.wyvern_frost.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_frost.male.chest"), + ), + tail_front: ( + offset: (-3.5, -12.0, -7.5), + central: ("npc.wyvern_frost.male.tail_front"), + ), + tail_rear: ( + offset: (-8.5, -26.0, -7.0), + central: ("npc.wyvern_frost.male.tail_rear"), + ) + ), + (FrostWyvern, Female): ( + head: ( + offset: (-15.5, -5.0, 0.0), + central: ("npc.wyvern_frost.male.head"), + ), + beak: ( + offset: (-2.5, 1.0, -5.0), + central: ("npc.wyvern_frost.male.beak"), + ), + neck: ( + offset: (-3.5, 0.0, -5.0), + central: ("npc.wyvern_frost.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_frost.male.chest"), + ), + tail_front: ( + offset: (-3.5, -12.0, -7.5), + central: ("npc.wyvern_frost.male.tail_front"), + ), + tail_rear: ( + offset: (-8.5, -26.0, -7.0), + central: ("npc.wyvern_frost.male.tail_rear"), + ) + ), + (SeaWyvern, Male): ( + head: ( + offset: (-3.5, -2.0, 4.0), + central: ("npc.wyvern_sea.male.head"), + ), + beak: ( + offset: (-3.5, 3.0, -3.0), + central: ("npc.wyvern_sea.male.beak"), + ), + neck: ( + offset: (-3.5, -2.0, -6.0), + central: ("npc.wyvern_sea.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_sea.male.chest"), + ), + tail_front: ( + offset: (-2.5, -13.0, -4.5), + central: ("npc.wyvern_sea.male.tail_front"), + ), + tail_rear: ( + offset: (-10.5, -39.0, -4.0), + central: ("npc.wyvern_sea.male.tail_rear"), + ) + ), + (SeaWyvern, Female): ( + head: ( + offset: (-3.5, -2.0, 4.0), + central: ("npc.wyvern_sea.male.head"), + ), + beak: ( + offset: (-3.5, 3.0, -3.0), + central: ("npc.wyvern_sea.male.beak"), + ), + neck: ( + offset: (-3.5, -2.0, -6.0), + central: ("npc.wyvern_sea.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_sea.male.chest"), + ), + tail_front: ( + offset: (-2.5, -13.0, -4.5), + central: ("npc.wyvern_sea.male.tail_front"), + ), + tail_rear: ( + offset: (-10.5, -39.0, -4.0), + central: ("npc.wyvern_sea.male.tail_rear"), + ) + ), + (WealdWyvern, Male): ( + head: ( + offset: (-4.5, -7.0, 0.0), + central: ("npc.wyvern_weald.male.head"), + ), + beak: ( + offset: (-2.5, 1.0, -9.0), + central: ("npc.wyvern_weald.male.beak"), + ), + neck: ( + offset: (-2.5, 0.0, -2.0), + central: ("npc.wyvern_weald.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_weald.male.chest"), + ), + tail_front: ( + offset: (-2.5, -12.0, -6.5), + central: ("npc.wyvern_weald.male.tail_front"), + ), + tail_rear: ( + offset: (-10.5, -34.0, -6.0), + central: ("npc.wyvern_weald.male.tail_rear"), + ) + ), + (WealdWyvern, Female): ( + head: ( + offset: (-4.5, -7.0, 0.0), + central: ("npc.wyvern_weald.male.head"), + ), + beak: ( + offset: (-2.5, 1.0, -9.0), + central: ("npc.wyvern_weald.male.beak"), + ), + neck: ( + offset: (-2.5, 0.0, -2.0), + central: ("npc.wyvern_weald.male.neck"), + ), + chest: ( + offset: (-6.5, -12.0, -10.0), + central: ("npc.wyvern_weald.male.chest"), + ), + tail_front: ( + offset: (-2.5, -12.0, -6.5), + central: ("npc.wyvern_weald.male.tail_front"), + ), + tail_rear: ( + offset: (-10.5, -34.0, -6.0), + central: ("npc.wyvern_weald.male.tail_rear"), + ) + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/bird_large_lateral_manifest.ron b/assets/voxygen/voxel/bird_large_lateral_manifest.ron index 0ea680f5eb..33b56d68d2 100644 --- a/assets/voxygen/voxel/bird_large_lateral_manifest.ron +++ b/assets/voxygen/voxel/bird_large_lateral_manifest.ron @@ -261,19 +261,19 @@ lateral: ("npc.wyvern_flame.male.wing_in_r"), ), wing_mid_l: ( - offset: (-17.0, -27.0, -2.0), + offset: (-17.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_mid_r"), ), wing_mid_r: ( - offset: (0.0, -27.0, -2.0), + offset: (0.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_mid_r"), ), wing_out_l: ( - offset: (-18.0, -27.0, -2.0), + offset: (-24.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_out_r"), ), wing_out_r: ( - offset: (0.0, -27.0, -2.0), + offset: (-9.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_out_r"), ), leg_l: ( @@ -303,19 +303,19 @@ lateral: ("npc.wyvern_flame.male.wing_in_r"), ), wing_mid_l: ( - offset: (-17.0, -27.0, -2.0), + offset: (-17.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_mid_r"), ), wing_mid_r: ( - offset: (0.0, -27.0, -2.0), + offset: (0.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_mid_r"), ), wing_out_l: ( - offset: (-18.0, -27.0, -2.0), + offset: (-24.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_out_r"), ), wing_out_r: ( - offset: (0.0, -27.0, -2.0), + offset: (-9.0, -26.5, -2.0), lateral: ("npc.wyvern_flame.male.wing_out_r"), ), leg_l: ( @@ -335,4 +335,340 @@ lateral: ("npc.wyvern_flame.male.foot_r"), ) ), + (CloudWyvern, Male): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_cloud.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_cloud.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-24.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_out_r"), + ), + wing_out_r: ( + offset: (-9.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_cloud.male.leg_r"), + ), + leg_r: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_cloud.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_cloud.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_cloud.male.foot_r"), + ) + ), + (CloudWyvern, Female): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_cloud.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_cloud.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-24.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_out_r"), + ), + wing_out_r: ( + offset: (-9.0, -26.5, -2.0), + lateral: ("npc.wyvern_cloud.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_cloud.male.leg_r"), + ), + leg_r: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_cloud.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_cloud.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_cloud.male.foot_r"), + ) + ), + (FrostWyvern, Male): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_frost.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_frost.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-24.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_out_r"), + ), + wing_out_r: ( + offset: (-9.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_frost.male.leg_r"), + ), + leg_r: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_frost.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_frost.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_frost.male.foot_r"), + ) + ), + (FrostWyvern, Female): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_frost.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_frost.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-24.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_out_r"), + ), + wing_out_r: ( + offset: (-9.0, -26.5, -2.0), + lateral: ("npc.wyvern_frost.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_frost.male.leg_r"), + ), + leg_r: ( + offset: (-3.5, -5.0, -8.0), + lateral: ("npc.wyvern_frost.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_frost.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_frost.male.foot_r"), + ) + ), + (SeaWyvern, Male): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_sea.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_sea.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-24.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_out_r"), + ), + wing_out_r: ( + offset: (-9.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_sea.male.leg_r"), + ), + leg_r: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_sea.male.leg_r"), + ), + foot_l: ( + offset: (-5.5, -6.5, -13.0), + lateral: ("npc.wyvern_sea.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_sea.male.foot_r"), + ) + ), + (SeaWyvern, Female): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_sea.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_sea.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-24.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_out_r"), + ), + wing_out_r: ( + offset: (-9.0, -26.5, -2.0), + lateral: ("npc.wyvern_sea.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_sea.male.leg_r"), + ), + leg_r: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_sea.male.leg_r"), + ), + foot_l: ( + offset: (-5.5, -6.5, -13.0), + lateral: ("npc.wyvern_sea.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_sea.male.foot_r"), + ) + ), + (WealdWyvern, Male): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_weald.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_weald.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -27.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -27.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-18.0, -23.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_out_r"), + ), + wing_out_r: ( + offset: (0.0, -23.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_weald.male.leg_r"), + ), + leg_r: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_weald.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_weald.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_weald.male.foot_r"), + ) + ), + (WealdWyvern, Female): ( + wing_in_l: ( + offset: (-24.0, -9.0, -4.0), + lateral: ("npc.wyvern_weald.male.wing_in_r"), + ), + wing_in_r: ( + offset: (0.0, -9.0, -4.0), + lateral: ("npc.wyvern_weald.male.wing_in_r"), + ), + wing_mid_l: ( + offset: (-17.0, -27.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_mid_r"), + ), + wing_mid_r: ( + offset: (0.0, -27.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_mid_r"), + ), + wing_out_l: ( + offset: (-18.0, -23.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_out_r"), + ), + wing_out_r: ( + offset: (0.0, -23.0, -2.0), + lateral: ("npc.wyvern_weald.male.wing_out_r"), + ), + leg_l: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_weald.male.leg_r"), + ), + leg_r: ( + offset: (-3.0, -4.5, -8.0), + lateral: ("npc.wyvern_weald.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_weald.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -6.5, -13.0), + lateral: ("npc.wyvern_weald.male.foot_r"), + ) + ), }) \ No newline at end of file diff --git a/assets/voxygen/voxel/golem_central_manifest.ron b/assets/voxygen/voxel/golem_central_manifest.ron index 2d33f6636b..d872ec79c0 100644 --- a/assets/voxygen/voxel/golem_central_manifest.ron +++ b/assets/voxygen/voxel/golem_central_manifest.ron @@ -37,11 +37,11 @@ ), (Treant, Male): ( head: ( - offset: (-6.0, -6.5, -0.0), + offset: (-6.0, -6.5, 5.0), central: ("npc.treant.male.head"), ), jaw: ( - offset: (-4.0, 0.0, -3.0), + offset: (-7.0, 0.0, -3.0), central: ("npc.treant.male.jaw"), ), torso_upper: ( @@ -49,17 +49,17 @@ central: ("npc.treant.male.chest_upper"), ), torso_lower: ( - offset: (-8.0, -9.0, -8.0), + offset: (-8.0, -15.0, -10.0), central: ("npc.treant.male.chest_lower"), ), ), (Treant, Female): ( head: ( - offset: (-6.0, -6.5, -0.0), + offset: (-6.0, -6.5, 5.0), central: ("npc.treant.male.head"), ), jaw: ( - offset: (-4.0, 0.0, -3.0), + offset: (-7.0, 0.0, -3.0), central: ("npc.treant.male.jaw"), ), torso_upper: ( @@ -67,7 +67,7 @@ central: ("npc.treant.male.chest_upper"), ), torso_lower: ( - offset: (-8.0, -9.0, -8.0), + offset: (-8.0, -15.0, -10.0), central: ("npc.treant.male.chest_lower"), ), ), diff --git a/assets/voxygen/voxel/npc/dodarock/male/chest.vox b/assets/voxygen/voxel/npc/dodarock/male/chest.vox deleted file mode 100644 index 59dc7b843a..0000000000 --- a/assets/voxygen/voxel/npc/dodarock/male/chest.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5b99efdd84befab454aaaece9ff2685da8316bfff3c7b02e8b57be75f5db943 -size 3608 diff --git a/assets/voxygen/voxel/npc/dodarock/male/chest_back.vox b/assets/voxygen/voxel/npc/dodarock/male/chest_back.vox new file mode 100644 index 0000000000..dc7c917492 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/chest_back.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b17bf2859c9548c4fac4a97f1357cd05a608d9790bbdef9bbfbd5c84b45d058 +size 2128 diff --git a/assets/voxygen/voxel/npc/dodarock/male/chest_front.vox b/assets/voxygen/voxel/npc/dodarock/male/chest_front.vox new file mode 100644 index 0000000000..2bae5c3f95 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/chest_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94ff469a56b59d0472b6f4c6466780ab05711d559d251ab125760006cee9485b +size 2356 diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_br.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_br.vox deleted file mode 100644 index 689ab86790..0000000000 --- a/assets/voxygen/voxel/npc/dodarock/male/foot_br.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b6dad625318c31c13ca8c6a035877109e08a7e2c72ea1eff2d6155b47d4ec7b -size 1252 diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox deleted file mode 100644 index 0129e65c20..0000000000 --- a/assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:843dead8905b5b753843a55775a89b6f8b07a4fb94376ccfc6a032d7fdc448a7 -size 1552 diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_r.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_r.vox new file mode 100644 index 0000000000..71d729e5b7 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c1c16f72a34a4cb2b0cbe7cf6cdf1c3789eb90afa16f8aa9837d6e3c36f61b5 +size 1476 diff --git a/assets/voxygen/voxel/npc/dodarock/male/hand_r.vox b/assets/voxygen/voxel/npc/dodarock/male/hand_r.vox new file mode 100644 index 0000000000..fdcfc8bbf2 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/hand_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:672fa727cd9be27ca438540e955ee127c2aa1c44c472292e4d2f035b14b84e97 +size 1196 diff --git a/assets/voxygen/voxel/npc/dodarock/male/head.vox b/assets/voxygen/voxel/npc/dodarock/male/head.vox index 04237a7cb1..654d77031b 100644 --- a/assets/voxygen/voxel/npc/dodarock/male/head.vox +++ b/assets/voxygen/voxel/npc/dodarock/male/head.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d773d52265a88f9ff32f98506796235832f8fa5342ff19867aebf6e6e228791a -size 3476 +oid sha256:b12c2c27d45ccbfa505409e7b1f729887fff5b3b63fe92a44fbfef8638ba90f5 +size 2072 diff --git a/assets/voxygen/voxel/npc/dodarock/male/head_lower.vox b/assets/voxygen/voxel/npc/dodarock/male/head_lower.vox new file mode 100644 index 0000000000..8c0f49dd34 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/head_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d035b63d3948eddc3f8fee316bbea468160a9c8502965f9a06bbc1067915db +size 1556 diff --git a/assets/voxygen/voxel/npc/dodarock/male/jaw.vox b/assets/voxygen/voxel/npc/dodarock/male/jaw.vox new file mode 100644 index 0000000000..d568e39b39 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3131a4344c454b3b8854c3bc1c00f2c4572e5be713cd4daa974f85beb2e372e7 +size 2228 diff --git a/assets/voxygen/voxel/npc/dodarock/male/leg_r.vox b/assets/voxygen/voxel/npc/dodarock/male/leg_r.vox new file mode 100644 index 0000000000..bad3e2b99d --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fd1d8df616d6268e7f247924256ba2021876eb34dfc346063260ca66dcb2599 +size 1464 diff --git a/assets/voxygen/voxel/npc/dodarock/male/neck.vox b/assets/voxygen/voxel/npc/dodarock/male/neck.vox new file mode 100644 index 0000000000..8c0f49dd34 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d035b63d3948eddc3f8fee316bbea468160a9c8502965f9a06bbc1067915db +size 1556 diff --git a/assets/voxygen/voxel/npc/dodarock/male/tail_back.vox b/assets/voxygen/voxel/npc/dodarock/male/tail_back.vox new file mode 100644 index 0000000000..c3f45a4d19 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/tail_back.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca163032b3811900101cda41dcf4b59a665dd542de97b9ac597758c82e17f07d +size 2712 diff --git a/assets/voxygen/voxel/npc/dodarock/male/tail_front.vox b/assets/voxygen/voxel/npc/dodarock/male/tail_front.vox new file mode 100644 index 0000000000..cc47b09a07 --- /dev/null +++ b/assets/voxygen/voxel/npc/dodarock/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3f7928ce9fc64f70254ae77e649bde5b80781bdddb176d3f4b0821f55cc7e1f +size 1436 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/chest.vox b/assets/voxygen/voxel/npc/lavadrake/male/chest.vox index 47e3cb22ab..ccb8c34bd0 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/chest.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/chest.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f3029c9a647b47b13cddaec53f30c437441e6269036db44eaef987713a4d943 +oid sha256:8c2c6b3875bedbac4773401f55d66d52a5c80d4a998025547315fd03dd6d7692 size 13236 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/foot_br.vox b/assets/voxygen/voxel/npc/lavadrake/male/foot_br.vox index 0e6e71ff5c..26aef4008d 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/foot_br.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/foot_br.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d237ea643dd4c25ab493a8cf8b089fd7ba708a40b26d32ac8545a1310c540a13 +oid sha256:bee4edd594b158d7b35af86af11d5b071da75574b09dd4280f71e8af937d78f5 size 2284 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/foot_fr.vox b/assets/voxygen/voxel/npc/lavadrake/male/foot_fr.vox index e36f0ed846..19ffe97cdd 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/foot_fr.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/foot_fr.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4e02a5d12aa6c7404147a10accb193b83c20c7a2a1eb9453cbfd3cd419f28da +oid sha256:7177d78e479a261d96a24f842b30029db5af9bf85bc403ddd24474bd379df85c size 2748 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/head_lower.vox b/assets/voxygen/voxel/npc/lavadrake/male/head_lower.vox index e323389b25..84a5408012 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/head_lower.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/head_lower.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0efc717dc655bc9a269d18bb8f7f97d412d05cc9d004a288245d696d42c21d25 +oid sha256:f511ad916f4f96d6c5b74457ca05a3bf17667113ff51e8f34243f50bf462afe0 size 3704 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/head_upper.vox b/assets/voxygen/voxel/npc/lavadrake/male/head_upper.vox index eed174a510..39d1bf85a6 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/head_upper.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/head_upper.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b91b537a022073269d475ecbd04b6050b702fda8a46d0bb7f3ee14f6cfd7de70 +oid sha256:9226365b7d239c2a68d03c1e9a01071d6a7699a608ce8841e0dbcb3aa6df73f2 size 3676 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/jaw.vox b/assets/voxygen/voxel/npc/lavadrake/male/jaw.vox index 7bb1da4633..8441e6f399 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/jaw.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/jaw.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:322165ecfa95ce5b66e576c9f30d84227b946a6d1779bfb7273b036828a122da +oid sha256:92e626dea6b686f88193b7b83015b82ca403fdde93527c9c277aca85e9221611 size 1892 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/tail_front.vox b/assets/voxygen/voxel/npc/lavadrake/male/tail_front.vox index 528c02f781..70e7312c1b 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/tail_front.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/tail_front.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61606ad99db159a4842c64137cd7467360ce270af4f01e2cab29e754d53002bb +oid sha256:705e630a7c39e40fd3ac7771c6697752a7bb0c15557c1a0a83f850a44c53a60f size 3476 diff --git a/assets/voxygen/voxel/npc/lavadrake/male/tail_rear.vox b/assets/voxygen/voxel/npc/lavadrake/male/tail_rear.vox index 95f362bc41..77e4d6776f 100644 --- a/assets/voxygen/voxel/npc/lavadrake/male/tail_rear.vox +++ b/assets/voxygen/voxel/npc/lavadrake/male/tail_rear.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:572d285f973d4bcd44a4e1a9bf118e8d0088b89e0f2ccee9a1fbefd3198510b3 +oid sha256:88fd6b1e4bc65f59b5de6518451b573b22ee7aa42d46d630e9eb36086637f4d3 size 2592 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/chest.vox b/assets/voxygen/voxel/npc/reefsnapper/male/chest.vox new file mode 100644 index 0000000000..50040d97a7 --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3298319049f68c60846aede4f6ec499655aecc470309c10392aeaea34916259 +size 27684 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/foot_br.vox b/assets/voxygen/voxel/npc/reefsnapper/male/foot_br.vox new file mode 100644 index 0000000000..2d274c6130 --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/foot_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88a779af4237045c4e33d72c0d54e5c4481a1e38a7803c1c73803d07beab675f +size 2016 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox b/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox new file mode 100644 index 0000000000..519e487117 --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e62fce92e139290bd843604b0463286fc560f4db97bf420d97b8863bc0ec800 +size 2404 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/head_lower.vox b/assets/voxygen/voxel/npc/reefsnapper/male/head_lower.vox new file mode 100644 index 0000000000..bcc798f2f6 --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/head_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcbff1ee9c2825e710638ec36bb70aeb8c59d5143b23abe44e46aaa91189f899 +size 2540 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/head_upper.vox b/assets/voxygen/voxel/npc/reefsnapper/male/head_upper.vox new file mode 100644 index 0000000000..dfdd2c1438 --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/head_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69464dddb458f5062f99fb2d2e882409e5bef3ebdc611880f2e9acd9d7c91b12 +size 2040 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/jaw.vox b/assets/voxygen/voxel/npc/reefsnapper/male/jaw.vox new file mode 100644 index 0000000000..b7c0fd104a --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:949595d1476617318ad71d720ef276355dd8db5c89d51a6079028c86b80567aa +size 1868 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/tail_front.vox b/assets/voxygen/voxel/npc/reefsnapper/male/tail_front.vox new file mode 100644 index 0000000000..fe6dc07eaa --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97bdb83d5a69bfd2620ffc38b1c669ef7bf4358a8ac6e69c38c7cadd0b10ec59 +size 2128 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/tail_rear.vox b/assets/voxygen/voxel/npc/reefsnapper/male/tail_rear.vox new file mode 100644 index 0000000000..fc9aa20c95 --- /dev/null +++ b/assets/voxygen/voxel/npc/reefsnapper/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d59dc17f0f14b279c3d6a5dadb5776627146e7c967f7261d432c05d98c4485 +size 1248 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/chest.vox b/assets/voxygen/voxel/npc/rootsnapper/male/chest.vox new file mode 100644 index 0000000000..284575dd3c --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2388f0dc532d57677083dbf4cdd54ae71324e7cedc4882d284b8b881038ce049 +size 44460 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/foot_br.vox b/assets/voxygen/voxel/npc/rootsnapper/male/foot_br.vox new file mode 100644 index 0000000000..0f7d855470 --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/foot_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4be24eedbea0b2ff576b77aa7316bf33e74cd8db16ed11f644471d3978fc550e +size 2284 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/foot_fr.vox b/assets/voxygen/voxel/npc/rootsnapper/male/foot_fr.vox new file mode 100644 index 0000000000..6bfecb59dc --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/foot_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e61f0473792a68759255e1773af2122be9d56342b41c5ec3b6baffabe71681df +size 3204 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/head_lower.vox b/assets/voxygen/voxel/npc/rootsnapper/male/head_lower.vox new file mode 100644 index 0000000000..bc8e55074b --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/head_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06eb7ed1c32b0223fe04333a2f45f93d601cb80933454681bde5c00a04c44cd2 +size 2808 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/head_upper.vox b/assets/voxygen/voxel/npc/rootsnapper/male/head_upper.vox new file mode 100644 index 0000000000..908ad94bee --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/head_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75fe5ad95729869db51ce220d61327914282fdea15538400748b843f48a0c570 +size 2424 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/jaw.vox b/assets/voxygen/voxel/npc/rootsnapper/male/jaw.vox new file mode 100644 index 0000000000..3717a7d556 --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b6c649037293f3e051a63589bb1c3f7a3586bd0812875ee3908558ff320a8ef +size 1876 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/tail_front.vox b/assets/voxygen/voxel/npc/rootsnapper/male/tail_front.vox new file mode 100644 index 0000000000..4e17c9e147 --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1eeb093567d930239511698c5597e95385ffbd8b7b20bfcf5fc89f4ae1bda54 +size 1940 diff --git a/assets/voxygen/voxel/npc/rootsnapper/male/tail_rear.vox b/assets/voxygen/voxel/npc/rootsnapper/male/tail_rear.vox new file mode 100644 index 0000000000..e0f7645492 --- /dev/null +++ b/assets/voxygen/voxel/npc/rootsnapper/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a67fd8e650e400b900a18714903b4b2bce19983b8302dff20f91b816e940f01c +size 1300 diff --git a/assets/voxygen/voxel/npc/saber/male/ears.vox b/assets/voxygen/voxel/npc/saber/male/ears.vox index 4aa1597ed0..792cb2b406 100644 --- a/assets/voxygen/voxel/npc/saber/male/ears.vox +++ b/assets/voxygen/voxel/npc/saber/male/ears.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df2cadbe19870a3547e2a88d8e4a0d73e4392c45a78334a50dc1cd31843dbc55 +oid sha256:6308f1061ee63fab3dc8f239b7ecb9b5a08a27d8302739b1f863a004702f48f5 size 1212 diff --git a/assets/voxygen/voxel/npc/saber/male/foot_br.vox b/assets/voxygen/voxel/npc/saber/male/foot_br.vox index c34896d602..30f75b7f63 100644 --- a/assets/voxygen/voxel/npc/saber/male/foot_br.vox +++ b/assets/voxygen/voxel/npc/saber/male/foot_br.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:924c16b464d9bf82ab4b4a29809c1c05ab310563ee47410783d6d57e0ed0fc80 -size 1452 +oid sha256:7a238b8b78b91075a79967566d897f43c21af21b9aa600ca46f35ec253c3a9dd +size 1460 diff --git a/assets/voxygen/voxel/npc/saber/male/foot_fr.vox b/assets/voxygen/voxel/npc/saber/male/foot_fr.vox index 64ec1e52fd..9abe71f241 100644 --- a/assets/voxygen/voxel/npc/saber/male/foot_fr.vox +++ b/assets/voxygen/voxel/npc/saber/male/foot_fr.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae66cdfd498cc6ef8ddc97cf4a1b976e889b472d36a166c62e07602f2038d1ec -size 1528 +oid sha256:8e11c9e5d7b2989d22717d0d1585c5801b0872794f6d8c00eff69d7af30bf009 +size 1636 diff --git a/assets/voxygen/voxel/npc/saber/male/head.vox b/assets/voxygen/voxel/npc/saber/male/head.vox index 9ad5d724c5..84adbcca7c 100644 --- a/assets/voxygen/voxel/npc/saber/male/head.vox +++ b/assets/voxygen/voxel/npc/saber/male/head.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d817c7c6f866fb22a83bbd05be19b5d310a7bdc2bc9b451a82110dcfd850fe9 -size 2836 +oid sha256:9133bfa04a804c81a6fe2d52e7fa8f2a32a9b3c03e4e7e38fc46812e70227353 +size 3004 diff --git a/assets/voxygen/voxel/npc/saber/male/jaw.vox b/assets/voxygen/voxel/npc/saber/male/jaw.vox index 5ce073fb99..2a04349bb8 100644 --- a/assets/voxygen/voxel/npc/saber/male/jaw.vox +++ b/assets/voxygen/voxel/npc/saber/male/jaw.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b25edc93bc79aabe51704e9d7e09b83d0df98a1dd0fbf2e65bc705eb4ef6027a -size 1280 +oid sha256:8c7be1b22c6668d903ef80b5042afb6e807c8d23cb87075e1afaee5598c12e8c +size 1312 diff --git a/assets/voxygen/voxel/npc/saber/male/leg_br.vox b/assets/voxygen/voxel/npc/saber/male/leg_br.vox index 2970ddfcb4..fb478cbc8e 100644 --- a/assets/voxygen/voxel/npc/saber/male/leg_br.vox +++ b/assets/voxygen/voxel/npc/saber/male/leg_br.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a5f342f5578a6e8af4935720993419923f649a3f501cbf49c71ffbd8028523d6 -size 1480 +oid sha256:9e03b0b214d53cfc29bb938301d95edb37ffe0846bc114d9d0142770ed60e2f6 +size 1648 diff --git a/assets/voxygen/voxel/npc/saber/male/leg_fr.vox b/assets/voxygen/voxel/npc/saber/male/leg_fr.vox index 78ca8f1f42..441c9d89e9 100644 --- a/assets/voxygen/voxel/npc/saber/male/leg_fr.vox +++ b/assets/voxygen/voxel/npc/saber/male/leg_fr.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b63c1d176b76434ab14610cf7a42fa042dfb354d0cc507cae179bcaa68e15cec -size 1616 +oid sha256:40d50bc2ffd27b55605c30389327429f5d0f4c2d4b858ee1c5a3ea3cfdc158ff +size 1888 diff --git a/assets/voxygen/voxel/npc/saber/male/neck.vox b/assets/voxygen/voxel/npc/saber/male/neck.vox index 17c9e6e952..a3e1b60d93 100644 --- a/assets/voxygen/voxel/npc/saber/male/neck.vox +++ b/assets/voxygen/voxel/npc/saber/male/neck.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b2f818308a97e33551efef0d8fe5f536f51cb118072ecf141f5c13fb29b5a507 -size 2456 +oid sha256:5b1f97e7024fd8cd04ba98a88ce6df5f3c0a79d12eea1201f45a8910c8a50d32 +size 2112 diff --git a/assets/voxygen/voxel/npc/saber/male/tail.vox b/assets/voxygen/voxel/npc/saber/male/tail.vox index 46fcc59f8b..17a40351f7 100644 --- a/assets/voxygen/voxel/npc/saber/male/tail.vox +++ b/assets/voxygen/voxel/npc/saber/male/tail.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b84e9aa06f9f1869683e1b79158a977b3fc444d230b0a15066d8d7a5e5bb0a20 -size 1304 +oid sha256:40410387249b9eb9893940b648be0f761a8d33b98d8624677fc0431939516cdf +size 1352 diff --git a/assets/voxygen/voxel/npc/saber/male/torso_back.vox b/assets/voxygen/voxel/npc/saber/male/torso_back.vox index 95606d2368..1b6f6edf07 100644 --- a/assets/voxygen/voxel/npc/saber/male/torso_back.vox +++ b/assets/voxygen/voxel/npc/saber/male/torso_back.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9576a4a5d2c9ababecdff0f046f6469cde7f03c985e5b04d68e0cfb9f00e08a1 -size 4352 +oid sha256:3397f101981e9270ce36e3fca569abe9d7cb2567bf3ebac3d8cb77177bcbb241 +size 4584 diff --git a/assets/voxygen/voxel/npc/saber/male/torso_front.vox b/assets/voxygen/voxel/npc/saber/male/torso_front.vox index 6eb955bddb..b6b2e0d298 100644 --- a/assets/voxygen/voxel/npc/saber/male/torso_front.vox +++ b/assets/voxygen/voxel/npc/saber/male/torso_front.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2eed77cc8cfb3b21c5aad47dd5937cb0b3f4996d50456e97c7ef640a01dcd4e1 -size 5956 +oid sha256:10852b7dab6da3f1bdf7f2698e76ad2d7503851aa0218ceeacbf422693505451 +size 6860 diff --git a/assets/voxygen/voxel/npc/salamander/female/chest.vox b/assets/voxygen/voxel/npc/salamander/female/chest.vox index 22af2b69a6..a58798bf77 100644 --- a/assets/voxygen/voxel/npc/salamander/female/chest.vox +++ b/assets/voxygen/voxel/npc/salamander/female/chest.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee51d809c2aca42f0c6fdc46027c9b33d0a95af75bf0a8579c16786a05a19031 -size 4696 +oid sha256:952fc49ba90cb07242e4164767a3c753ab74c5dead9d585b71d0dfd3e145a08f +size 4536 diff --git a/assets/voxygen/voxel/npc/salamander/female/foot_br.vox b/assets/voxygen/voxel/npc/salamander/female/foot_br.vox index 3a5deefea3..0b4f1a8a0c 100644 --- a/assets/voxygen/voxel/npc/salamander/female/foot_br.vox +++ b/assets/voxygen/voxel/npc/salamander/female/foot_br.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cafe678aa536939f1a027d3c9c8b8f296cd3f535a70c56c5f72cbc802cdb6a56 -size 1260 +oid sha256:681c1b0501ab17079a4b018265950b7183524b6375ecaf63743069a5875df73f +size 1244 diff --git a/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox b/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox index e68328e7ef..871875e0d7 100644 --- a/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox +++ b/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab4a353c17629a085c23a6da38402af8ef642acb82d3324134300f9168512a8c +oid sha256:139e71370808c38e82624e88d93ff691b4a573565424380107dfd2ffc51d6d90 size 1268 diff --git a/assets/voxygen/voxel/npc/salamander/female/head_lower.vox b/assets/voxygen/voxel/npc/salamander/female/head_lower.vox index 5f4102c45c..e80d87d18c 100644 --- a/assets/voxygen/voxel/npc/salamander/female/head_lower.vox +++ b/assets/voxygen/voxel/npc/salamander/female/head_lower.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8bbb5fd2f36770cf69162a2da72e29b10c60f927235de56c7b0866359d19e861 -size 1608 +oid sha256:226483231a86635979bc382498ed2ed92178bad83d8d26b1ce3cd5a331ca9a07 +size 1616 diff --git a/assets/voxygen/voxel/npc/salamander/female/head_upper.vox b/assets/voxygen/voxel/npc/salamander/female/head_upper.vox index 66e69ddf25..77b1ad274f 100644 --- a/assets/voxygen/voxel/npc/salamander/female/head_upper.vox +++ b/assets/voxygen/voxel/npc/salamander/female/head_upper.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f390e583f17db94502aee1ef20f786fee23e9688a41b81ca82d9a0d72356e21f -size 3032 +oid sha256:23cf7b5d2fb775189ae73daac879dd14ae07b4a17e714cfa32bbc1c001eacebd +size 2632 diff --git a/assets/voxygen/voxel/npc/salamander/female/jaw.vox b/assets/voxygen/voxel/npc/salamander/female/jaw.vox index 365d8a4cca..f62946b658 100644 --- a/assets/voxygen/voxel/npc/salamander/female/jaw.vox +++ b/assets/voxygen/voxel/npc/salamander/female/jaw.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d87667aaf0f64890b0a2812dbb05bff6c103373399f47379c5905dd2a398fb81 -size 2040 +oid sha256:5daf93e147bcbf8909f0c4950b3c7cb77f8a4c900127cf3c7b0eeef092f119e2 +size 2240 diff --git a/assets/voxygen/voxel/npc/salamander/female/tail_front.vox b/assets/voxygen/voxel/npc/salamander/female/tail_front.vox index 51d464df39..43042c8619 100644 --- a/assets/voxygen/voxel/npc/salamander/female/tail_front.vox +++ b/assets/voxygen/voxel/npc/salamander/female/tail_front.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d76e69b888e1aabc8628bcd5c369a2574e391b272161cdaa756c7699572631b -size 1988 +oid sha256:837bc286eacc45aaad97aac778f5ecc024f2a298a98b40336a6b66a9e62857d2 +size 2276 diff --git a/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox b/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox index 4c908e2b93..03779fcf66 100644 --- a/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox +++ b/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:80aeba8583353a90663ce83a2030d9599154ccecf397e47c6d22eff87c34e5dd -size 2208 +oid sha256:0358f1adedfab8ba38e71daeded7b0bf8213e576607d1f121ca652cf73a73f1d +size 1880 diff --git a/assets/voxygen/voxel/npc/treant/male/chest_lower.vox b/assets/voxygen/voxel/npc/treant/male/chest_lower.vox index 92f5105e41..5c5cbb738c 100644 --- a/assets/voxygen/voxel/npc/treant/male/chest_lower.vox +++ b/assets/voxygen/voxel/npc/treant/male/chest_lower.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3468c22115a2a404d5db97f8aa6cc09dde2cc6ede893c1533512885b526eee14 -size 3096 +oid sha256:b877cfca0001dffa15ebc8a93e3e45895d38c5f5e545c2b4c3664fdd509ea970 +size 4032 diff --git a/assets/voxygen/voxel/npc/treant/male/chest_upper.vox b/assets/voxygen/voxel/npc/treant/male/chest_upper.vox index 968e931ac4..534a9ff220 100644 --- a/assets/voxygen/voxel/npc/treant/male/chest_upper.vox +++ b/assets/voxygen/voxel/npc/treant/male/chest_upper.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1aaa561b55d39913f5a0e2e06b2fc3508baa8435a4a28db8e0f9040c5f35389a -size 26440 +oid sha256:3f5c0efc375f29995b6b2d0a5c2cd15a8a6d2a77ad630176de221f595fb15e04 +size 29268 diff --git a/assets/voxygen/voxel/npc/treant/male/foot_l.vox b/assets/voxygen/voxel/npc/treant/male/foot_l.vox index ea222ea030..dd5032bc38 100644 --- a/assets/voxygen/voxel/npc/treant/male/foot_l.vox +++ b/assets/voxygen/voxel/npc/treant/male/foot_l.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fbd3555d9f86cffb2ece92386a4174b5faad584d00b4512eeb0c2ac70734656 -size 1652 +oid sha256:0d43d7934d99b0d0cfb6055e057570afb47f6f286df050d17182b897a2a286ca +size 1704 diff --git a/assets/voxygen/voxel/npc/treant/male/foot_r.vox b/assets/voxygen/voxel/npc/treant/male/foot_r.vox index db14bf1c13..24eea252e5 100644 --- a/assets/voxygen/voxel/npc/treant/male/foot_r.vox +++ b/assets/voxygen/voxel/npc/treant/male/foot_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c02fe81fe3689e9bcb0cf077fb4bc2bed8a49c4c5c4791d9ca915e0a484fd367 -size 1652 +oid sha256:7e258471b7c573e658c45b60dad48013d937b06d876a452c03498ae02bcbf297 +size 1704 diff --git a/assets/voxygen/voxel/npc/treant/male/hand_l.vox b/assets/voxygen/voxel/npc/treant/male/hand_l.vox index d2b1786bf0..6f97f0d901 100644 --- a/assets/voxygen/voxel/npc/treant/male/hand_l.vox +++ b/assets/voxygen/voxel/npc/treant/male/hand_l.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b699568f0789cdd006db4770bb1b9be12c88aaf3ea63a37c5d917b68f1aea217 +oid sha256:76b2fc5b75c05b49a728b4a624975d26be1072d822a777fdcec164016b782b85 size 4756 diff --git a/assets/voxygen/voxel/npc/treant/male/hand_r.vox b/assets/voxygen/voxel/npc/treant/male/hand_r.vox index 05eb4dc8df..648dfab0a4 100644 --- a/assets/voxygen/voxel/npc/treant/male/hand_r.vox +++ b/assets/voxygen/voxel/npc/treant/male/hand_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b812372fef96ff02b0f2664835ef15e998aca09ced35544ccdea26d55571acbc +oid sha256:be3b472aa5e435fda9eba74bcce0c30c1b0b4213986950c98876d5efcaea4b11 size 4748 diff --git a/assets/voxygen/voxel/npc/treant/male/head.vox b/assets/voxygen/voxel/npc/treant/male/head.vox index fd3b18983d..7a715521d2 100644 --- a/assets/voxygen/voxel/npc/treant/male/head.vox +++ b/assets/voxygen/voxel/npc/treant/male/head.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e57d5b9a067e79fccf9cc0ec1dded36bc63a40cd3ea217d595c3953e8bda064e -size 2488 +oid sha256:40834cb9537dc5c6deba9156b15db248e143497967733b5efd3d5832cf4ea110 +size 3196 diff --git a/assets/voxygen/voxel/npc/treant/male/jaw.vox b/assets/voxygen/voxel/npc/treant/male/jaw.vox index 259997c7ff..7d2674f1d7 100644 --- a/assets/voxygen/voxel/npc/treant/male/jaw.vox +++ b/assets/voxygen/voxel/npc/treant/male/jaw.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d7357347b3493085b035132a48a864a9d0bcabf6945ea327ac948d5526e7ecb -size 1656 +oid sha256:beb2ba9b754b430583a78fc690c4a0e27b59b5e9fc8a82ca352ea26bb47a6d33 +size 3032 diff --git a/assets/voxygen/voxel/npc/treant/male/leg_l.vox b/assets/voxygen/voxel/npc/treant/male/leg_l.vox index 14e7a26fd1..2f8a63cb9a 100644 --- a/assets/voxygen/voxel/npc/treant/male/leg_l.vox +++ b/assets/voxygen/voxel/npc/treant/male/leg_l.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5690058d4d4568694d14adedabaa17fec689b5243de283219190fe90c770841e -size 1808 +oid sha256:743bd2cb4ba7e37701a147043fd86d9efb60b607b0d3cee0c46019bc2de973ad +size 1864 diff --git a/assets/voxygen/voxel/npc/treant/male/leg_r.vox b/assets/voxygen/voxel/npc/treant/male/leg_r.vox index 77e96dc05b..9653fad16a 100644 --- a/assets/voxygen/voxel/npc/treant/male/leg_r.vox +++ b/assets/voxygen/voxel/npc/treant/male/leg_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8f68a8db8666159d8a9acd68de27f11606427aa0c517ce6e190a5bcbde6b9ab -size 1808 +oid sha256:63ab0e3987864df9b7e605957acf04cd786b7c6067e58cba712bb944cb83740e +size 1864 diff --git a/assets/voxygen/voxel/npc/treant/male/shoulder_l.vox b/assets/voxygen/voxel/npc/treant/male/shoulder_l.vox index 9127b6df98..c2015bc7e1 100644 --- a/assets/voxygen/voxel/npc/treant/male/shoulder_l.vox +++ b/assets/voxygen/voxel/npc/treant/male/shoulder_l.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ba4baf7f52faab77322eebedb6025441e9a204dc2550aca9fc64781085cbe1c -size 4452 +oid sha256:9b78aa81a5b797219ee39b04e8cb1be67939cf2e7718e1635df680cfc7dee16f +size 4356 diff --git a/assets/voxygen/voxel/npc/treant/male/shoulder_r.vox b/assets/voxygen/voxel/npc/treant/male/shoulder_r.vox index 8e5a549192..53b50cbc67 100644 --- a/assets/voxygen/voxel/npc/treant/male/shoulder_r.vox +++ b/assets/voxygen/voxel/npc/treant/male/shoulder_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67cfb2841a83d19216c3a2663a1718aa39d65a756af5f3fdf0ea80b12cd7b525 -size 4440 +oid sha256:0b261dc467ce5c1e16e237ce1c876b790ddbaa763728ca595282efb51a39c77b +size 4304 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/beak.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/beak.vox new file mode 100644 index 0000000000..29b41b4b5a --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/beak.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36d4f5e1ffe1aa92d5b7281031d905449d726a778e08ebbb71dc08fec431391f +size 1664 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/chest.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/chest.vox new file mode 100644 index 0000000000..be7807b9a1 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ca2f5216c5ef407aacb26853e19365bd3ce265e9718388cd07be12bfd5949b9 +size 11548 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/foot_r.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/foot_r.vox new file mode 100644 index 0000000000..445f8eeaf6 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74633cff008be45f6d7a2d427e9a4e832b6d5617c40cfdce8b246240068d9f0f +size 1960 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/head.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/head.vox new file mode 100644 index 0000000000..2646211d41 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fcf64ed4deb991091813bd4bba16f9c581f0658440b4e57db1fa05148fd5a6c +size 3116 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/jaw.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/jaw.vox new file mode 100644 index 0000000000..29b41b4b5a --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36d4f5e1ffe1aa92d5b7281031d905449d726a778e08ebbb71dc08fec431391f +size 1664 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/leg_r.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/leg_r.vox new file mode 100644 index 0000000000..583771eb11 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6867ea00968c2cc075b856a2663da8ae77e6517d3b7b06dceb96677421d1257 +size 2544 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/neck.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/neck.vox new file mode 100644 index 0000000000..e677dca4ef --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd4bdd666832d4701dc918dc5bc5ae0a9f0955fff384b78bbf0b39c8d863fa94 +size 2400 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/tail_front.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/tail_front.vox new file mode 100644 index 0000000000..505f9cd048 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5515f7a542bf02740b1588d5b82cdfc1a3c4848394d97d88d2a04cb35b22e11e +size 3080 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/tail_rear.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/tail_rear.vox new file mode 100644 index 0000000000..5d4cc3ffa6 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bee0e6df2eea6ad2b1a0b004f5f5b85c1634cec934dc2ba52d2542969468ead8 +size 3332 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_in_r.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_in_r.vox new file mode 100644 index 0000000000..465a96ee57 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_in_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1b1bf9c52bba8cdc1419326a767c94b0d7f4ce4914749adef9551a0d936aec6 +size 3876 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_mid_r.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_mid_r.vox new file mode 100644 index 0000000000..4ea599b420 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_mid_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:577b552b271b0bbd9b1f3dabde3a842634c74787f5c0dd27cd8aee447740d75e +size 3828 diff --git a/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_out_r.vox b/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_out_r.vox new file mode 100644 index 0000000000..a51807d374 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_cloud/male/wing_out_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48dc175fbc1d195687f4f59eeb9d748517358f36e29850b64f21990942a46fb5 +size 3748 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox index a9e07d1f0f..bb36da471d 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/beak.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd57daae57284d5361d2b06c998c3f795c35b552e3231fd8a6846f66d8f777b5 -size 1624 +oid sha256:08b91f1430ce53f7e7bc8f1317ae52bb3ba3c83870a5923fda9718e77bb408e8 +size 2724 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox index dcdb4ad549..76917d567c 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/chest.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42d64663c830e60c06b0d201914867c0afc3d1c065624a60df2360160f35ee73 -size 11124 +oid sha256:0d0c8e4e24ff929eb405b725730a6988f43642fb2425a419f0e9db408b66475d +size 16808 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox index 4b26f2e20d..7bd98dc25b 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/foot_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:404b5d23587593f6b1dbadd51e9f4c68f7ffecaf35583a287bf5fa80934ec869 +oid sha256:62d1e811268040deee34ea2c91157dab43472c8251817f54e5d68903776179bb size 1960 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox index f6f6116c95..33ef807a3d 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/head.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:913ebab8a33288051ce0813db2146f2b24dac63baebf608b59f5b1a231ebdd9c -size 2704 +oid sha256:281a9d10819dfecc124f12da73a108beabce47fdf6d8bd47a00ef21d996fa690 +size 3340 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox index 8aed222e76..4ca36c211b 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/leg_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:751e1560b00f067c20cd3f6a56e82199d8eeddb8146b75fe6936dfa294f9651f +oid sha256:5fc145966caa27b2f9a2ff1d1415b0dd90b29a4a2f9f74e7496cd431b14fa586 size 2248 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox index fc727abf14..c32a6ba38f 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/neck.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39ee2a8f564263ff2291d45772e632b3076fc47f0c688ffb0fa5ef2ff7ce2e5c -size 2132 +oid sha256:aca696a15deb4ee68f2b32e6d3026b4ebcff32410e34b21465c9fae2e991c5ff +size 3372 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox index a8d1bee79f..c027f78e44 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_front.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84ee697628508e55464a1f9f2a1740c772839c502423a688f8702114b102d20a -size 2276 +oid sha256:e995dce09265b464ff30556f7435797b34bff31f51a66651b3889971240daa49 +size 2824 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox index b8c7df970e..52cf3fe796 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/tail_rear.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6b12d66a475a1b079d003bd7588320afeba1180f99900feef8cc8c80f120ce82 -size 2508 +oid sha256:60c9b5e8b7d2b98d8196b32461d0c3cbf92fd1a69f03b05c5c7fd64a9498826d +size 3280 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox index aedeb542ab..f5c08192ad 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_in_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15cfcfcf4633d8f25825c13ee81f0509075d0223b5a1e47fb082442da8bfb876 -size 3484 +oid sha256:336e23e84c580ed82267284d8d622bc3ab897fda4b8a2c50fc127d6996b43824 +size 3668 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox index f680643bb4..83d87ec7ed 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_mid_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc34faf908c37cde975c79610c05373fe75c81f8da54b9e7ed10ecd821731d1b -size 2460 +oid sha256:fbf17f1f9d85002f655954be343bb6a282f02a8b7f3028e08f3b8e7b455fd95f +size 2104 diff --git a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox index 99d22e1af9..fd4e3a091f 100644 --- a/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox +++ b/assets/voxygen/voxel/npc/wyvern_flame/male/wing_out_r.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0dd91e1e74eb978dbccef1b93d867a60667eca38dda161d1c92e0c56d9691d31 -size 1940 +oid sha256:25e1a73a12c91ab03b8b7c86859501f695c9d66844efa61e5ac8314f81212e98 +size 2240 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/beak.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/beak.vox new file mode 100644 index 0000000000..03f4a504ac --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/beak.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a66389a46495c8e5b543663b336362449f354135c24c4e16ad6f9d3f1efa04f1 +size 1724 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/chest.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/chest.vox new file mode 100644 index 0000000000..5becf4f21e --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bcde1b6649ba0bd63bef1d027c81ec2d5fc1d497f00ef43af6212b5cc541a929 +size 12116 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/foot_r.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/foot_r.vox new file mode 100644 index 0000000000..b68bc0110b --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bf1396dd870b8bdef3cebf38528daa64e15405cc8bf4d8f88699f127d6f74f5 +size 1960 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/head.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/head.vox new file mode 100644 index 0000000000..bd7ff32418 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bed239a4e6eda14b5a18ef9ed212c1461ee3cf9f869a1682e25a28dc63e7b011 +size 3772 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/leg_r.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/leg_r.vox new file mode 100644 index 0000000000..1d74f3ee86 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bca3bef3d59a59d9ff44c34239fb11443dd575bd6b33b78ad66fc179cbe2115 +size 2260 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/neck.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/neck.vox new file mode 100644 index 0000000000..06bf6145d9 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d17e5093d23b33a36d54a08606f1b439ded0a80ba7ed5b25b932a4c9e7b263b1 +size 2764 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/tail_front.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/tail_front.vox new file mode 100644 index 0000000000..dd98b5e27a --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a367cf74aa48fa07582673f4cbe97a91f592a8c62c92cdc8a07fb761bd288ac8 +size 2776 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/tail_rear.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/tail_rear.vox new file mode 100644 index 0000000000..306f004b2c --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a5c19d61ed86fe4188c1d015625accfe9fc16319ca16b5315f730b34793d306 +size 4100 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/wing_in_r.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/wing_in_r.vox new file mode 100644 index 0000000000..ca07a6c5f5 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/wing_in_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da5cb479de2f9ccbc9e12f680948af6019e83867c789b3fb75951eea7bf7ce41 +size 3860 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/wing_mid_r.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/wing_mid_r.vox new file mode 100644 index 0000000000..1215f9dfc2 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/wing_mid_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16b8f3d0c2713f2c3636d9dabdf805dfdf735f7a46ba80c19c66a5fbf073b9b8 +size 2316 diff --git a/assets/voxygen/voxel/npc/wyvern_frost/male/wing_out_r.vox b/assets/voxygen/voxel/npc/wyvern_frost/male/wing_out_r.vox new file mode 100644 index 0000000000..09805722f8 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_frost/male/wing_out_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06b838348ca7c73661543e490aa0a24a8f734d3c6272f0d1657d5683d96f4e37 +size 2624 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/beak.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/beak.vox new file mode 100644 index 0000000000..29514e77d6 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/beak.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5c280f923a9a009ba8db06ccd41d19b05ec25d55b7e85368f7637c9aa3d428a +size 2144 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/chest.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/chest.vox new file mode 100644 index 0000000000..da6ffe868d --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b2059f03e96012dd27151e9ad0f00d9c0dfc3e47dced87526aed9e3e9c6f76a +size 12068 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/foot_r.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/foot_r.vox new file mode 100644 index 0000000000..41afab95e5 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6f49b8af23bcbc40154bc0e82f7dfe191f00f2242b4acb609a2cf6c6402aa55 +size 2092 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/head.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/head.vox new file mode 100644 index 0000000000..be0ea88ab7 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2baa9789cb5fa0be6f5b0c5a9c30d026200a5a24a551d237b047dcdaf6fdb66b +size 3004 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/leg_r.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/leg_r.vox new file mode 100644 index 0000000000..a77f197bb6 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36cbb84bcebcb1dc11871637f1720c94439fee64d2b365063fa4df7631a2aa04 +size 2248 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/neck.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/neck.vox new file mode 100644 index 0000000000..5df02d1fa4 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfb89f8b4fcd185f2dab41aebe1c8eff10772e588c6a2c2a6e3311fd5bbe0049 +size 3660 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/tail_front.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/tail_front.vox new file mode 100644 index 0000000000..ef8e3dbfb5 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62d4e3df716dbe1f153df145c79bd05add27cd824d9225be80e8b2d089ad73d7 +size 2356 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/tail_rear.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/tail_rear.vox new file mode 100644 index 0000000000..ad05de58ec --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:332a3444226802851ab078e8a771935075a4d0e9888f43d141eb2e40e56788f2 +size 3852 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/wing_in_r.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/wing_in_r.vox new file mode 100644 index 0000000000..2426ce802c --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/wing_in_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fd9f8b2d06c3e8efa406cab6e9789ff907a24e03213e298327605c616177ae9 +size 3476 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/wing_mid_r.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/wing_mid_r.vox new file mode 100644 index 0000000000..208b413876 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/wing_mid_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8ec9edc4cd1f0817225d2a0dbc464be512f07c32f867938d8e4925e5db3a7ee +size 2308 diff --git a/assets/voxygen/voxel/npc/wyvern_sea/male/wing_out_r.vox b/assets/voxygen/voxel/npc/wyvern_sea/male/wing_out_r.vox new file mode 100644 index 0000000000..5502f7eb7f --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_sea/male/wing_out_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2039c18fc80373a52b4120f338ac744f9fa1a5f54a282406b7509f44462ad0c1 +size 2352 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/beak.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/beak.vox new file mode 100644 index 0000000000..205efdfbdf --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/beak.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3467e173ff3c4b8c6daa7e13e93093f9777d8350a22dad4adc591495cee324a8 +size 1872 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/chest.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/chest.vox new file mode 100644 index 0000000000..477bbf2ec4 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02acba132a049f4cc599f83f7d8305027d06ca60855a22194f15385473fbc18b +size 11276 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/foot_r.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/foot_r.vox new file mode 100644 index 0000000000..454ae00303 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d75d02b8246ac85e6d0a4e158d2eea244ef17111c221f842ecc13461e7413a18 +size 2112 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/head.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/head.vox new file mode 100644 index 0000000000..f058530430 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72a759b362eb1bb2988d2fa7df57b93328b014380bb5e35a396d761519aa5173 +size 3028 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/leg_r.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/leg_r.vox new file mode 100644 index 0000000000..225b8f40ac --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4008d8048b4647f9aa11b4170c4a494a551eef04adf13f347c7f0aed3b959117 +size 2244 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/neck.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/neck.vox new file mode 100644 index 0000000000..40d05f8230 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/neck.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85c639b56db17176db78fa420534c7e83aeee34ee0a976d8c84a756aa14ec3e6 +size 2344 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/tail_front.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/tail_front.vox new file mode 100644 index 0000000000..ce86690d03 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b430134eb040c0fe28a08c4d80174396c62556e89eb4fcd6677ee52b2d96550f +size 2420 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/tail_rear.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/tail_rear.vox new file mode 100644 index 0000000000..a51895efb2 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76e45465860d5e6f2efb02d1f6b3e64982513432447033b3fea5259f26ad01e6 +size 3492 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/wing_in_r.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/wing_in_r.vox new file mode 100644 index 0000000000..471b00fe89 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/wing_in_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3afd6c3858aa82449ba76ee343d774c46b98fb3cd467b43c78baf6f7bd343702 +size 3416 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/wing_mid_r.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/wing_mid_r.vox new file mode 100644 index 0000000000..b8b3154ab1 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/wing_mid_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfe7415a1e44710b14bb9900558fa3b2439743bf89f50590de91c0f486de65e6 +size 3104 diff --git a/assets/voxygen/voxel/npc/wyvern_weald/male/wing_out_r.vox b/assets/voxygen/voxel/npc/wyvern_weald/male/wing_out_r.vox new file mode 100644 index 0000000000..554e6b4101 --- /dev/null +++ b/assets/voxygen/voxel/npc/wyvern_weald/male/wing_out_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d152dd57ac2dfc432206fa9faf43e33ff5adbd0176f9172df74e9da7dc727eb9 +size 2384 diff --git a/assets/voxygen/voxel/quadruped_low_central_manifest.ron b/assets/voxygen/voxel/quadruped_low_central_manifest.ron index c1d95b2214..5390e20698 100644 --- a/assets/voxygen/voxel/quadruped_low_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_low_central_manifest.ron @@ -183,23 +183,23 @@ ), (Salamander, Female): ( upper: ( - offset: (-9.5, 0.0, -2.0), + offset: (-6.5, 0.0, -2.0), central: ("npc.salamander.female.head_upper"), ), lower: ( - offset: (-4.5, -1.5, -3.0), + offset: (-4.5, -2.0, -3.0), central: ("npc.salamander.female.head_lower"), ), jaw: ( - offset: (-6.5, 0.0, -2.0), + offset: (-6.5, 0.0, -3.5,), central: ("npc.salamander.female.jaw"), ), chest: ( - offset: (-8.5, -8.5, -3.0), + offset: (-6.5, -8.5, -3.0), central: ("npc.salamander.female.chest"), ), tail_rear: ( - offset: (-6.5, -13.0, -2.5), + offset: (-3.5, -13.0, -2.5), central: ("npc.salamander.female.tail_rear"), ), tail_front: ( @@ -416,6 +416,110 @@ central: ("npc.rocksnapper.male.tail_front"), ), ), + (Rootsnapper, Male): ( + upper: ( + offset: (-3.5, -3.5, 3.0), + central: ("npc.rootsnapper.male.head_upper"), + ), + lower: ( + offset: (-3.5, -4.0, 0.5), + central: ("npc.rootsnapper.male.head_lower"), + ), + jaw: ( + offset: (-3.5, 3.0, 5.0), + central: ("npc.rootsnapper.male.jaw"), + ), + chest: ( + offset: (-12.5, -17.0, -17.5), + central: ("npc.rootsnapper.male.chest"), + ), + tail_rear: ( + offset: (-1.5, -5.0, -2.5), + central: ("npc.rootsnapper.male.tail_rear"), + ), + tail_front: ( + offset: (-2.5, -12.0, -5.5), + central: ("npc.rootsnapper.male.tail_front"), + ), + ), + (Rootsnapper, Female): ( + upper: ( + offset: (-3.5, -3.5, 3.0), + central: ("npc.rootsnapper.male.head_upper"), + ), + lower: ( + offset: (-3.5, -4.0, 0.5), + central: ("npc.rootsnapper.male.head_lower"), + ), + jaw: ( + offset: (-3.5, 3.0, 5.0), + central: ("npc.rootsnapper.male.jaw"), + ), + chest: ( + offset: (-12.5, -17.0, -17.5), + central: ("npc.rootsnapper.male.chest"), + ), + tail_rear: ( + offset: (-1.5, -5.0, -2.5), + central: ("npc.rootsnapper.male.tail_rear"), + ), + tail_front: ( + offset: (-2.5, -12.0, -5.5), + central: ("npc.rootsnapper.male.tail_front"), + ), + ), + (Reefsnapper, Male): ( + upper: ( + offset: (-3.5, 1.5, -4.0), + central: ("npc.reefsnapper.male.head_upper"), + ), + lower: ( + offset: (-3.5, -1.0, -6.0), + central: ("npc.reefsnapper.male.head_lower"), + ), + jaw: ( + offset: (-4.5, 7.0, -5.0), + central: ("npc.reefsnapper.male.jaw"), + ), + chest: ( + offset: (-13.5, -15.0, -15.5), + central: ("npc.reefsnapper.male.chest"), + ), + tail_rear: ( + offset: (-3.5, -8.0, -5.5), + central: ("npc.reefsnapper.male.tail_rear"), + ), + tail_front: ( + offset: (-4.5, -15.0, -7.5), + central: ("npc.reefsnapper.male.tail_front"), + ), + ), + (Reefsnapper, Female): ( + upper: ( + offset: (-3.5, 1.5, -4.0), + central: ("npc.reefsnapper.male.head_upper"), + ), + lower: ( + offset: (-3.5, -1.0, -6.0), + central: ("npc.reefsnapper.male.head_lower"), + ), + jaw: ( + offset: (-4.5, 7.0, -5.0), + central: ("npc.reefsnapper.male.jaw"), + ), + chest: ( + offset: (-13.5, -15.0, -15.5), + central: ("npc.reefsnapper.male.chest"), + ), + tail_rear: ( + offset: (-3.5, -8.0, -5.5), + central: ("npc.reefsnapper.male.tail_rear"), + ), + tail_front: ( + offset: (-4.5, -15.0, -7.5), + central: ("npc.reefsnapper.male.tail_front"), + ), + ), (Pangolin, Male): ( upper: ( offset: (-2.5, 0.0, -3.0), diff --git a/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron index 26e1b3a8b8..5a43cf79aa 100644 --- a/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron @@ -135,7 +135,7 @@ lateral: ("npc.salamander.female.foot_fr", false), ), back_left: ( - offset: (-8.0, 0.0, -3.0), + offset: (-7.5, 0.0, -3.0), lateral: ("npc.salamander.female.foot_br", false), ), back_right: ( @@ -287,6 +287,78 @@ lateral: ("npc.rocksnapper.male.foot_br", false), ), ), + (Rootsnapper, Male): ( + front_left: ( + offset: (-12.0, -1.0, -10.0), + lateral: ("npc.rootsnapper.male.foot_fr", false), + ), + front_right: ( + offset: (0.0, -1.0, -10.0), + lateral: ("npc.rootsnapper.male.foot_fr", false), + ), + back_left: ( + offset: (-11.0, -5.0, -9.0), + lateral: ("npc.rootsnapper.male.foot_br", false), + ), + back_right: ( + offset: (0.0, -5.0, -9.0), + lateral: ("npc.rootsnapper.male.foot_br", false), + ), + ), + (Rootsnapper, Female): ( + front_left: ( + offset: (-12.0, -1.0, -10.0), + lateral: ("npc.rootsnapper.male.foot_fr", false), + ), + front_right: ( + offset: (0.0, -1.0, -10.0), + lateral: ("npc.rootsnapper.male.foot_fr", false), + ), + back_left: ( + offset: (-11.0, -5.0, -9.0), + lateral: ("npc.rootsnapper.male.foot_br", false), + ), + back_right: ( + offset: (0.0, -5.0, -9.0), + lateral: ("npc.rootsnapper.male.foot_br", false), + ), + ), + (Reefsnapper, Male): ( + front_left: ( + offset: (-12.0, 0.0, -10.0), + lateral: ("npc.reefsnapper.male.foot_fr", false), + ), + front_right: ( + offset: (-3.0, 0.0, -10.0), + lateral: ("npc.reefsnapper.male.foot_fr", false), + ), + back_left: ( + offset: (-11.0, -7.0, -9.0), + lateral: ("npc.reefsnapper.male.foot_br", false), + ), + back_right: ( + offset: (0.0, -7.0, -9.0), + lateral: ("npc.reefsnapper.male.foot_br", false), + ), + ), + (Reefsnapper, Female): ( + front_left: ( + offset: (-12.0, 0.0, -10.0), + lateral: ("npc.reefsnapper.male.foot_fr", false), + ), + front_right: ( + offset: (-3.0, 0.0, -10.0), + lateral: ("npc.reefsnapper.male.foot_fr", false), + ), + back_left: ( + offset: (-11.0, -7.0, -9.0), + lateral: ("npc.reefsnapper.male.foot_br", false), + ), + back_right: ( + offset: (0.0, -7.0, -9.0), + lateral: ("npc.reefsnapper.male.foot_br", false), + ), + ), (Pangolin, Male): ( front_left: ( offset: (-1.5, 0.0, -6.0),//unique diff --git a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron index 74d0b82cf8..58a87f3988 100644 --- a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron @@ -61,15 +61,15 @@ ), (Saber, Male): ( head: ( - offset: (-5.5, 0.0, -6.5), + offset: (-6.5, 0.5, -6.5), central: ("npc.saber.male.head"), ), neck: ( - offset: (-4.0, -2.0, -4.0), + offset: (-4.0, 1.0, -3.0), central: ("npc.saber.male.neck"), ), jaw: ( - offset: (-2.5, 0.0, -1.5), + offset: (-2.5, 2.0, -1.5), central: ("npc.saber.male.jaw"), ), torso_front: ( @@ -77,29 +77,29 @@ central: ("npc.saber.male.torso_front"), ), torso_back: ( - offset: (-5.0, -12.0, -5.0), + offset: (-5.0, -11.5, -8.0), central: ("npc.saber.male.torso_back"), ), ears: ( - offset: (-5.5, -1.0, 0.0), + offset: (-5.0, -2.0, 0.0), central: ("npc.saber.male.ears"), ), tail: ( - offset: (-2.0, -8.0, -5.0), + offset: (-2.0, -7.0, -6.0), central: ("npc.saber.male.tail"), ), ), (Saber, Female): ( head: ( - offset: (-5.5, 0.0, -6.5), + offset: (-6.5, 0.5, -6.5), central: ("npc.saber.male.head"), ), neck: ( - offset: (-4.0, -2.0, -4.0), + offset: (-4.0, 1.0, -3.0), central: ("npc.saber.male.neck"), ), jaw: ( - offset: (-2.5, 0.0, -1.5), + offset: (-2.5, 2.0, -1.5), central: ("npc.saber.male.jaw"), ), torso_front: ( @@ -107,15 +107,15 @@ central: ("npc.saber.male.torso_front"), ), torso_back: ( - offset: (-5.0, -12.0, -5.0), + offset: (-5.0, -11.5, -8.0), central: ("npc.saber.male.torso_back"), ), ears: ( - offset: (-5.5, -1.0, 0.0), + offset: (-5.0, -2.0, 0.0), central: ("npc.saber.male.ears"), ), tail: ( - offset: (-2.0, -8.0, -5.0), + offset: (-2.0, -7.0, -6.0), central: ("npc.saber.male.tail"), ), ), diff --git a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron index 5594d88959..f1a1bb3c90 100644 --- a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron @@ -69,19 +69,19 @@ ), (Saber, Male): ( leg_fl: ( - offset: (-2.0, -6.0, -4.5), + offset: (-2.0, -10.0, -4.5), lateral: ("npc.saber.male.leg_fr"), ), leg_fr: ( - offset: (-2.0, -6.0, -4.5), + offset: (-2.0, -10.0, -4.5), lateral: ("npc.saber.male.leg_fr"), ), leg_bl: ( - offset: (-2.0, -3.0, -4.0), + offset: (-2.0, -5.0, -4.0), lateral: ("npc.saber.male.leg_br"), ), leg_br: ( - offset: (-2.0, -3.0, -4.0), + offset: (-2.0, -5.0, -4.0), lateral: ("npc.saber.male.leg_br"), ), foot_fl: ( @@ -103,19 +103,19 @@ ), (Saber, Female): ( leg_fl: ( - offset: (-2.0, -6.0, -4.5), + offset: (-2.0, -10.0, -4.5), lateral: ("npc.saber.male.leg_fr"), ), leg_fr: ( - offset: (-2.0, -6.0, -4.5), + offset: (-2.0, -10.0, -4.5), lateral: ("npc.saber.male.leg_fr"), ), leg_bl: ( - offset: (-2.0, -3.0, -4.0), + offset: (-2.0, -5.0, -4.0), lateral: ("npc.saber.male.leg_br"), ), leg_br: ( - offset: (-2.0, -3.0, -4.0), + offset: (-2.0, -5.0, -4.0), lateral: ("npc.saber.male.leg_br"), ), foot_fl: ( diff --git a/assets/voxygen/voxel/quadruped_small_central_manifest.ron b/assets/voxygen/voxel/quadruped_small_central_manifest.ron index dd13227ab7..37a5fbfd8d 100644 --- a/assets/voxygen/voxel/quadruped_small_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_small_central_manifest.ron @@ -279,34 +279,6 @@ central: ("npc.quokka.male.tail"), ), ), - (Dodarock, Male):( - head: ( - offset: (-4.5, 0.0, -2.5), - central: ("npc.dodarock.male.head"), - ), - chest: ( - offset: (-4.5, -8.0, -4.5), - central: ("npc.dodarock.male.chest"), - ), - tail: ( - offset: (-1.5, -7.5, -2.5), - central: ("armor.empty"), - ), - ), - (Dodarock, Female):( - head: ( - offset: (-4.5, 0.0, -2.5), - central: ("npc.dodarock.male.head"), - ), - chest: ( - offset: (-4.5, -8.0, -4.5), - central: ("npc.dodarock.male.chest"), - ), - tail: ( - offset: (-1.5, -7.5, -2.5), - central: ("armor.empty"), - ), - ), (Holladon, Male):( head: ( offset: (-3.5, 0.0, -4.0), diff --git a/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron index f11040990d..8313cb5233 100644 --- a/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron @@ -361,42 +361,6 @@ lateral: ("npc.quokka.male.foot_br"), ), ), - (Dodarock, Male): ( - left_front: ( - offset: (-2.0, -3.0, -6.5), - lateral: ("npc.dodarock.male.foot_fr"), - ), - right_front: ( - offset: (-2.0, -3.0, -6.5), - lateral: ("npc.dodarock.male.foot_fr"), - ), - left_back: ( - offset: (-1.5, -2.0, -5.0), - lateral: ("npc.dodarock.male.foot_br"), - ), - right_back: ( - offset: (-1.5, -2.0, -5.0), - lateral: ("npc.dodarock.male.foot_br"), - ), - ), - (Dodarock, Female): ( - left_front: ( - offset: (-2.0, -3.0, -6.5), - lateral: ("npc.dodarock.male.foot_fr"), - ), - right_front: ( - offset: (-2.0, -3.0, -6.5), - lateral: ("npc.dodarock.male.foot_fr"), - ), - left_back: ( - offset: (-1.5, -2.0, -5.0), - lateral: ("npc.dodarock.male.foot_br"), - ), - right_back: ( - offset: (-1.5, -2.0, -5.0), - lateral: ("npc.dodarock.male.foot_br"), - ), - ), (Holladon, Male): ( left_front: ( offset: (-1.0, -2.5, -6.0), diff --git a/assets/voxygen/voxel/theropod_central_manifest.ron b/assets/voxygen/voxel/theropod_central_manifest.ron index 341c6d447d..4333c6e87c 100644 --- a/assets/voxygen/voxel/theropod_central_manifest.ron +++ b/assets/voxygen/voxel/theropod_central_manifest.ron @@ -419,6 +419,66 @@ central: ("npc.yale.male.tail_back"), ), ), + (Dodarock, Male): ( + head: ( + offset: (-3.5, -1.0, -3.5), + central: ("npc.dodarock.male.head"), + ), + jaw: ( + offset: (-5.5, -1.0, -3.0), + central: ("npc.dodarock.male.jaw"), + ), + neck: ( + offset: (-2.5, -1.0, -5.0), + central: ("npc.dodarock.male.neck"), + ), + chest_front: ( + offset: (-4.5, -1.0, -6.0), + central: ("npc.dodarock.male.chest_front"), + ), + chest_back: ( + offset: (-4.5, -1.0, -5.0), + central: ("npc.dodarock.male.chest_back"), + ), + tail_front: ( + offset: (-2.5, -1.0, -1.0), + central: ("npc.dodarock.male.tail_front"), + ), + tail_back: ( + offset: (-4.5, -1.0, -2.5), + central: ("npc.dodarock.male.tail_back"), + ), + ), + (Dodarock, Female): ( + head: ( + offset: (-3.5, -1.0, -3.5), + central: ("npc.dodarock.male.head"), + ), + jaw: ( + offset: (-5.5, -1.0, -3.0), + central: ("npc.dodarock.male.jaw"), + ), + neck: ( + offset: (-2.5, -1.0, -5.0), + central: ("npc.dodarock.male.neck"), + ), + chest_front: ( + offset: (-4.5, -1.0, -6.0), + central: ("npc.dodarock.male.chest_front"), + ), + chest_back: ( + offset: (-4.5, -1.0, -5.0), + central: ("npc.dodarock.male.chest_back"), + ), + tail_front: ( + offset: (-2.5, -1.0, -1.0), + central: ("npc.dodarock.male.tail_front"), + ), + tail_back: ( + offset: (-4.5, -1.0, -2.5), + central: ("npc.dodarock.male.tail_back"), + ), + ), (Ntouka, Male): ( head: ( offset: (-11.5, -8.0, -5.0), diff --git a/assets/voxygen/voxel/theropod_lateral_manifest.ron b/assets/voxygen/voxel/theropod_lateral_manifest.ron index 7036d052c7..fdc46daeff 100644 --- a/assets/voxygen/voxel/theropod_lateral_manifest.ron +++ b/assets/voxygen/voxel/theropod_lateral_manifest.ron @@ -363,6 +363,58 @@ lateral: ("npc.yale.male.foot_r"), ), ), + (Dodarock, Male): ( + hand_l: ( + offset: (-2.5, -1.0, -6.0), + lateral: ("npc.dodarock.male.hand_r"), + ), + hand_r: ( + offset: (-2.5, -1.0, -6.0), + lateral: ("npc.dodarock.male.hand_r"), + ), + leg_l: ( + offset: (-2.0, -1.0, -3.0), + lateral: ("npc.dodarock.male.leg_r"), + ), + leg_r: ( + offset: (-2.0, -1.0, -3.0), + lateral: ("npc.dodarock.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -1.0, -3.0), + lateral: ("npc.dodarock.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -1.0, -3.0), + lateral: ("npc.dodarock.male.foot_r"), + ), + ), + (Dodarock, Female): ( + hand_l: ( + offset: (-2.5, -1.0, -6.0), + lateral: ("npc.dodarock.male.hand_r"), + ), + hand_r: ( + offset: (-2.5, -1.0, -6.0), + lateral: ("npc.dodarock.male.hand_r"), + ), + leg_l: ( + offset: (-2.0, -1.0, -3.0), + lateral: ("npc.dodarock.male.leg_r"), + ), + leg_r: ( + offset: (-2.0, -1.0, -3.0), + lateral: ("npc.dodarock.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -1.0, -3.0), + lateral: ("npc.dodarock.male.foot_r"), + ), + foot_r: ( + offset: (-3.5, -1.0, -3.0), + lateral: ("npc.dodarock.male.foot_r"), + ), + ), (Ntouka, Male): ( hand_l: ( offset: (-4.0, -2.5, -8.0), diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 02768a9a49..8e0c63f8ae 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -206,7 +206,6 @@ impl<'a> From<&'a Body> for Psyche { quadruped_small::Species::Cat => 0.9, quadruped_small::Species::Batfox => 0.1, quadruped_small::Species::Raccoon => 0.6, - quadruped_small::Species::Dodarock => 0.0, quadruped_small::Species::Holladon => 0.0, quadruped_small::Species::Hyena => 0.2, quadruped_small::Species::Dog => 0.8, @@ -237,6 +236,8 @@ impl<'a> From<&'a Body> for Psyche { quadruped_low::Species::Pangolin => 0.6, quadruped_low::Species::Tortoise => 0.2, quadruped_low::Species::Rocksnapper => 0.05, + quadruped_low::Species::Rootsnapper => 0.05, + quadruped_low::Species::Reefsnapper => 0.05, quadruped_low::Species::Asp => 0.05, _ => 0.0, }, diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 8cf7018d74..657c5aa35c 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -335,8 +335,7 @@ impl Body { quadruped_small::Species::Beaver => 10.0, quadruped_small::Species::Boar => 80.0, // ~✅ (60-100 kg) quadruped_small::Species::Cat => 4.0, // ~✅ (4-5 kg) - quadruped_small::Species::Dodarock => 500.0, - quadruped_small::Species::Dog => 30.0, // ~✅ (German Shepherd: 30-40 kg) + quadruped_small::Species::Dog => 30.0, // ~✅ (German Shepherd: 30-40 kg) quadruped_small::Species::Fox => 10.0, quadruped_small::Species::Frog => 1.0, quadruped_small::Species::Fungome => 10.0, @@ -364,7 +363,7 @@ impl Body { theropod::Species::Archaeos => 13_000.0, theropod::Species::Ntouka => 13_000.0, theropod::Species::Odonto => 13_000.0, - + theropod::Species::Dodarock => 700.0, theropod::Species::Sandraptor => 500.0, theropod::Species::Snowraptor => 500.0, theropod::Species::Sunlizard => 500.0, @@ -458,7 +457,6 @@ impl Body { }, Body::QuadrupedSmall(body) => match body.species { quadruped_small::Species::Batfox => Vec3::new(1.4, 1.7, 1.3), - quadruped_small::Species::Dodarock => Vec3::new(1.2, 1.9, 1.5), quadruped_small::Species::Holladon => Vec3::new(1.3, 1.9, 1.5), quadruped_small::Species::Hyena => Vec3::new(1.2, 1.4, 1.3), quadruped_small::Species::Truffler => Vec3::new(1.2, 1.8, 2.2), @@ -477,6 +475,8 @@ impl Body { quadruped_low::Species::Monitor => Vec3::new(1.4, 3.2, 1.3), quadruped_low::Species::Pangolin => Vec3::new(1.0, 2.6, 1.1), quadruped_low::Species::Rocksnapper => Vec3::new(2.5, 3.5, 2.9), + quadruped_low::Species::Rootsnapper => Vec3::new(2.5, 3.5, 2.9), + quadruped_low::Species::Reefsnapper => Vec3::new(2.5, 3.5, 2.9), quadruped_low::Species::Sandshark => Vec3::new(2.1, 4.3, 1.7), quadruped_low::Species::Basilisk => Vec3::new(2.7, 6.0, 2.9), quadruped_low::Species::Salamander => Vec3::new(1.7, 4.0, 1.3), @@ -488,6 +488,7 @@ impl Body { theropod::Species::Archaeos => Vec3::new(4.0, 8.5, 8.0), theropod::Species::Ntouka => Vec3::new(4.0, 9.0, 6.6), theropod::Species::Odonto => Vec3::new(4.0, 8.0, 6.6), + theropod::Species::Dodarock => Vec3::new(2.0, 3.0, 2.6), theropod::Species::Sandraptor => Vec3::new(2.0, 3.0, 2.6), theropod::Species::Snowraptor => Vec3::new(2.0, 3.0, 2.6), theropod::Species::Sunlizard => Vec3::new(2.0, 3.6, 2.5), @@ -623,6 +624,10 @@ impl Body { bird_large::Species::Phoenix => 600, bird_large::Species::Roc => 500, bird_large::Species::FlameWyvern => 600, + bird_large::Species::CloudWyvern => 600, + bird_large::Species::FrostWyvern => 600, + bird_large::Species::SeaWyvern => 600, + bird_large::Species::WealdWyvern => 600, }, Body::Humanoid(_) => 75, _ => 100, @@ -636,7 +641,6 @@ impl Body { Body::QuadrupedSmall(quadruped_small) => match quadruped_small.species { quadruped_small::Species::Boar => 70, quadruped_small::Species::Batfox => 40, - quadruped_small::Species::Dodarock => 100, quadruped_small::Species::Holladon => 80, quadruped_small::Species::Hyena => 45, quadruped_small::Species::Truffler => 45, @@ -753,6 +757,7 @@ impl Body { Body::Theropod(theropod) => match theropod.species { theropod::Species::Archaeos => 350, theropod::Species::Yale => 280, + theropod::Species::Dodarock => 200, theropod::Species::Odonto => 300, theropod::Species::Ntouka => 300, _ => 110, @@ -765,6 +770,8 @@ impl Body { quadruped_low::Species::Asp => 75, quadruped_low::Species::Tortoise => 90, quadruped_low::Species::Rocksnapper => 140, + quadruped_low::Species::Rootsnapper => 140, + quadruped_low::Species::Reefsnapper => 140, quadruped_low::Species::Pangolin => 40, quadruped_low::Species::Maneater => 130, quadruped_low::Species::Sandshark => 110, @@ -816,6 +823,10 @@ impl Body { bird_large::Species::Phoenix | bird_large::Species::Cockatrice | bird_large::Species::FlameWyvern + | bird_large::Species::CloudWyvern + | bird_large::Species::FrostWyvern + | bird_large::Species::SeaWyvern + | bird_large::Species::WealdWyvern ), Body::Arthropod(b) => matches!(b.species, arthropod::Species::Moltencrawler), _ => false, diff --git a/common/src/comp/body/bird_large.rs b/common/src/comp/body/bird_large.rs index fdc2dfdec0..8560aad74a 100644 --- a/common/src/comp/body/bird_large.rs +++ b/common/src/comp/body/bird_large.rs @@ -38,6 +38,10 @@ make_case_elim!( Cockatrice = 1, Roc = 2, FlameWyvern = 3, + CloudWyvern = 4, + FrostWyvern = 5, + SeaWyvern = 6, + WealdWyvern = 7, } ); @@ -50,6 +54,10 @@ pub struct AllSpecies { pub cockatrice: SpeciesMeta, pub roc: SpeciesMeta, pub wyvern_flame: SpeciesMeta, + pub wyvern_cloud: SpeciesMeta, + pub wyvern_frost: SpeciesMeta, + pub wyvern_sea: SpeciesMeta, + pub wyvern_weald: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -62,15 +70,23 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Cockatrice => &self.cockatrice, Species::Roc => &self.roc, Species::FlameWyvern => &self.wyvern_flame, + Species::CloudWyvern => &self.wyvern_cloud, + Species::FrostWyvern => &self.wyvern_frost, + Species::SeaWyvern => &self.wyvern_sea, + Species::WealdWyvern => &self.wyvern_weald, } } } -pub const ALL_SPECIES: [Species; 4] = [ +pub const ALL_SPECIES: [Species; 8] = [ Species::Phoenix, Species::Cockatrice, Species::Roc, Species::FlameWyvern, + Species::CloudWyvern, + Species::FrostWyvern, + Species::SeaWyvern, + Species::WealdWyvern, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/body/quadruped_low.rs b/common/src/comp/body/quadruped_low.rs index e779d70c5d..7affcab6bf 100644 --- a/common/src/comp/body/quadruped_low.rs +++ b/common/src/comp/body/quadruped_low.rs @@ -45,17 +45,19 @@ make_case_elim!( Monitor = 3, Asp = 4, Tortoise = 5, - Rocksnapper = 6, - Pangolin = 7, - Maneater = 8, - Sandshark = 9, - Hakulaq = 10, - Lavadrake = 11, - Basilisk = 12, - Deadwood = 13, - Icedrake = 14, - SeaCrocodile = 15, - Dagon = 16, + Pangolin = 6, + Maneater = 7, + Sandshark = 8, + Hakulaq = 9, + Lavadrake = 10, + Basilisk = 11, + Deadwood = 12, + Icedrake = 13, + SeaCrocodile = 14, + Dagon = 15, + Rocksnapper = 16, + Rootsnapper = 17, + Reefsnapper = 18, } ); @@ -72,6 +74,8 @@ pub struct AllSpecies { pub asp: SpeciesMeta, pub tortoise: SpeciesMeta, pub rocksnapper: SpeciesMeta, + pub rootsnapper: SpeciesMeta, + pub reefsnapper: SpeciesMeta, pub pangolin: SpeciesMeta, pub maneater: SpeciesMeta, pub sandshark: SpeciesMeta, @@ -97,6 +101,8 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Asp => &self.asp, Species::Tortoise => &self.tortoise, Species::Rocksnapper => &self.rocksnapper, + Species::Rootsnapper => &self.rootsnapper, + Species::Reefsnapper => &self.reefsnapper, Species::Pangolin => &self.pangolin, Species::Maneater => &self.maneater, Species::Sandshark => &self.sandshark, @@ -110,7 +116,7 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies } } -pub const ALL_SPECIES: [Species; 17] = [ +pub const ALL_SPECIES: [Species; 19] = [ Species::Crocodile, Species::SeaCrocodile, Species::Alligator, @@ -119,6 +125,8 @@ pub const ALL_SPECIES: [Species; 17] = [ Species::Asp, Species::Tortoise, Species::Rocksnapper, + Species::Rootsnapper, + Species::Reefsnapper, Species::Pangolin, Species::Maneater, Species::Sandshark, diff --git a/common/src/comp/body/quadruped_small.rs b/common/src/comp/body/quadruped_small.rs index 75a5428283..0a23d4fbb8 100644 --- a/common/src/comp/body/quadruped_small.rs +++ b/common/src/comp/body/quadruped_small.rs @@ -45,7 +45,7 @@ pub enum Species { Batfox = 7, Raccoon = 8, Quokka = 9, - Dodarock = 10, + Goat = 10, Holladon = 11, Hyena = 12, Rabbit = 13, @@ -61,7 +61,6 @@ pub enum Species { Beaver = 23, Hare = 24, Dog = 25, - Goat = 26, } /// Data representing per-species generic data. @@ -79,7 +78,6 @@ pub struct AllSpecies { pub batfox: SpeciesMeta, pub raccoon: SpeciesMeta, pub quokka: SpeciesMeta, - pub dodarock: SpeciesMeta, pub holladon: SpeciesMeta, pub hyena: SpeciesMeta, pub rabbit: SpeciesMeta, @@ -114,7 +112,6 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Batfox => &self.batfox, Species::Raccoon => &self.raccoon, Species::Quokka => &self.quokka, - Species::Dodarock => &self.dodarock, Species::Holladon => &self.holladon, Species::Hyena => &self.hyena, Species::Rabbit => &self.rabbit, @@ -135,7 +132,7 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies } } -pub const ALL_SPECIES: [Species; 27] = [ +pub const ALL_SPECIES: [Species; 26] = [ Species::Pig, Species::Fox, Species::Sheep, @@ -146,7 +143,6 @@ pub const ALL_SPECIES: [Species; 27] = [ Species::Batfox, Species::Raccoon, Species::Quokka, - Species::Dodarock, Species::Holladon, Species::Hyena, Species::Rabbit, diff --git a/common/src/comp/body/theropod.rs b/common/src/comp/body/theropod.rs index 5f1abcda53..5ef4df981f 100644 --- a/common/src/comp/body/theropod.rs +++ b/common/src/comp/body/theropod.rs @@ -36,6 +36,7 @@ pub enum Species { Sunlizard = 5, Yale = 6, Ntouka = 7, + Dodarock = 8, } /// Data representing per-species generic data. @@ -48,6 +49,7 @@ pub struct AllSpecies { pub raptor_wood: SpeciesMeta, pub sunlizard: SpeciesMeta, pub yale: SpeciesMeta, + pub dodarock: SpeciesMeta, pub ntouka: SpeciesMeta, } @@ -64,12 +66,13 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Woodraptor => &self.raptor_wood, Species::Sunlizard => &self.sunlizard, Species::Yale => &self.yale, + Species::Dodarock => &self.dodarock, Species::Ntouka => &self.ntouka, } } } -pub const ALL_SPECIES: [Species; 8] = [ +pub const ALL_SPECIES: [Species; 9] = [ Species::Archaeos, Species::Odonto, Species::Sandraptor, @@ -77,6 +80,7 @@ pub const ALL_SPECIES: [Species; 8] = [ Species::Woodraptor, Species::Sunlizard, Species::Yale, + Species::Dodarock, Species::Ntouka, ]; diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 74ecb92091..2e0f1c6cfc 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -756,9 +756,17 @@ fn default_main_tool(body: &Body) -> Item { )), }, Body::BirdLarge(bird_large) => match (bird_large.species, bird_large.body_type) { - (bird_large::Species::Cockatrice | bird_large::Species::FlameWyvern, _) => Some( - Item::new_from_asset_expect("common.items.npc_weapons.unique.birdlargebreathe"), - ), + ( + bird_large::Species::Cockatrice + | bird_large::Species::FlameWyvern + | bird_large::Species::CloudWyvern + | bird_large::Species::FrostWyvern + | bird_large::Species::SeaWyvern + | bird_large::Species::WealdWyvern, + _, + ) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.birdlargebreathe", + )), (bird_large::Species::Phoenix, _) => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.birdlargefire", )), @@ -892,6 +900,8 @@ impl LoadoutBuilder { | quadruped_low::Species::Lavadrake | quadruped_low::Species::Maneater | quadruped_low::Species::Rocksnapper + | quadruped_low::Species::Rootsnapper + | quadruped_low::Species::Reefsnapper | quadruped_low::Species::Sandshark => { Some("common.items.npc_armor.quadruped_low.generic") }, diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index bae3791364..5dfa4a0897 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -43,7 +43,6 @@ impl Body { quadruped_small::Species::Fungome => 70.0, quadruped_small::Species::Goat => 80.0, quadruped_small::Species::Raccoon => 100.0, - quadruped_small::Species::Dodarock => 80.0, quadruped_small::Species::Frog => 150.0, quadruped_small::Species::Porcupine => 100.0, quadruped_small::Species::Beaver => 100.0, @@ -122,6 +121,8 @@ impl Body { quadruped_low::Species::Asp => 110.0, quadruped_low::Species::Tortoise => 60.0, quadruped_low::Species::Rocksnapper => 70.0, + quadruped_low::Species::Rootsnapper => 70.0, + quadruped_low::Species::Reefsnapper => 70.0, quadruped_low::Species::Pangolin => 90.0, quadruped_low::Species::Maneater => 80.0, quadruped_low::Species::Sandshark => 160.0, @@ -192,12 +193,14 @@ impl Body { theropod::Species::Archaeos => 2.3, theropod::Species::Odonto => 2.3, theropod::Species::Ntouka => 2.3, + theropod::Species::Dodarock => 2.0, _ => 2.5, }, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { quadruped_low::Species::Asp => 2.2, quadruped_low::Species::Tortoise => 1.5, quadruped_low::Species::Rocksnapper => 1.8, + quadruped_low::Species::Rootsnapper => 1.8, quadruped_low::Species::Lavadrake => 1.7, quadruped_low::Species::Icedrake => 1.7, _ => 2.0, @@ -226,6 +229,7 @@ impl Body { | theropod::Species::Snowraptor | theropod::Species::Sunlizard | theropod::Species::Woodraptor + | theropod::Species::Dodarock | theropod::Species::Yale => Some(200.0 * self.mass().0), _ => Some(100.0 * self.mass().0), }, diff --git a/voxygen/anim/src/bird_large/mod.rs b/voxygen/anim/src/bird_large/mod.rs index 75c32a2d83..c7232e012b 100644 --- a/voxygen/anim/src/bird_large/mod.rs +++ b/voxygen/anim/src/bird_large/mod.rs @@ -170,80 +170,139 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Cockatrice, _) => (2.5, 16.0), (Roc, _) => (2.5, 27.5), (FlameWyvern, _) => (2.5, 20.5), + (CloudWyvern, _) => (2.5, 20.5), + (FrostWyvern, _) => (2.5, 20.5), + (SeaWyvern, _) => (2.5, 20.5), + (WealdWyvern, _) => (2.5, 20.5), }, neck: match (body.species, body.body_type) { (Phoenix, _) => (2.5, -5.5), (Cockatrice, _) => (5.0, -1.5), (Roc, _) => (9.5, -1.5), (FlameWyvern, _) => (11.0, -0.5), + (CloudWyvern, _) => (11.0, -0.5), + (FrostWyvern, _) => (11.0, -0.5), + (SeaWyvern, _) => (11.0, -0.5), + (WealdWyvern, _) => (11.0, -0.5), }, head: match (body.species, body.body_type) { (Phoenix, _) => (6.0, 12.0), (Cockatrice, _) => (8.0, 4.5), (Roc, _) => (17.0, -3.5), (FlameWyvern, _) => (10.0, -1.5), + (CloudWyvern, _) => (10.0, -1.5), + (FrostWyvern, _) => (10.0, -1.5), + (SeaWyvern, _) => (10.0, -1.5), + (WealdWyvern, _) => (10.0, -1.5), }, beak: match (body.species, body.body_type) { (Phoenix, _) => (5.0, 3.0), (Cockatrice, _) => (2.0, -3.0), (Roc, _) => (0.0, -3.0), - (FlameWyvern, _) => (-1.0, 2.0), + (FlameWyvern, _) => (-3.0, 2.0), + (CloudWyvern, _) => (-3.0, 2.0), + (FrostWyvern, _) => (-3.0, 2.0), + (SeaWyvern, _) => (-3.0, 2.0), + (WealdWyvern, _) => (-3.0, 2.0), }, tail_front: match (body.species, body.body_type) { (Phoenix, _) => (-9.5, -1.0), (Cockatrice, _) => (-5.0, -2.5), (Roc, _) => (-7.5, -3.5), (FlameWyvern, _) => (-10.0, -5.0), + (CloudWyvern, _) => (-10.0, -5.0), + (FrostWyvern, _) => (-10.0, -5.0), + (SeaWyvern, _) => (-10.0, -5.0), + (WealdWyvern, _) => (-10.0, -5.0), }, tail_rear: match (body.species, body.body_type) { (Phoenix, _) => (-11.0, 0.0), (Cockatrice, _) => (-8.0, -3.0), (Roc, _) => (-8.0, -3.0), (FlameWyvern, _) => (-11.0, -1.0), + (CloudWyvern, _) => (-11.0, -1.0), + (FrostWyvern, _) => (-11.0, -1.0), + (SeaWyvern, _) => (-11.0, -1.0), + (WealdWyvern, _) => (-11.0, -1.0), }, wing_in: match (body.species, body.body_type) { (Phoenix, _) => (3.0, 2.5, 2.0), (Cockatrice, _) => (3.5, 7.0, 3.5), (Roc, _) => (5.5, 7.5, -1.0), - (FlameWyvern, _) => (5.5, 5.0, -2.0), + (FlameWyvern, _) => (6.5, 5.0, -2.0), + (CloudWyvern, _) => (4.5, 5.0, -4.0), + (FrostWyvern, _) => (6.5, 5.0, -2.0), + (SeaWyvern, _) => (6.5, 5.0, -2.0), + (WealdWyvern, _) => (5.0, 5.0, -2.0), }, wing_mid: match (body.species, body.body_type) { (Phoenix, _) => (10.0, 1.0, 0.0), (Cockatrice, _) => (6.0, 0.0, 0.0), (Roc, _) => (12.0, 1.0, -0.5), (FlameWyvern, _) => (19.0, 15.0, -1.0), + (CloudWyvern, _) => (19.0, 15.0, -1.0), + (FrostWyvern, _) => (19.0, 15.0, -1.0), + (SeaWyvern, _) => (19.0, 15.0, -1.0), + (WealdWyvern, _) => (19.0, 15.0, -1.0), }, wing_out: match (body.species, body.body_type) { (Phoenix, _) => (7.0, 2.0, 1.5), (Cockatrice, _) => (4.0, -1.0, 1.0), (Roc, _) => (10.0, -2.0, 0.0), - (FlameWyvern, _) => (16.0, -3.0, 0.0), + (FlameWyvern, _) => (10.0, -3.0, 0.0), + (CloudWyvern, _) => (10.0, -3.0, 0.0), + (FrostWyvern, _) => (10.0, -3.0, 0.0), + (SeaWyvern, _) => (10.0, -3.0, 0.0), + (WealdWyvern, _) => (16.0, -3.0, 0.0), }, leg: match (body.species, body.body_type) { (Phoenix, _) => (4.0, 1.5, 12.0), (Cockatrice, _) => (3.5, 2.5, 13.0), (Roc, _) => (5.5, -1.5, 17.5), - (FlameWyvern, _) => (5.5, -2.0, 15.5), + (FlameWyvern, _) => (5.5, 2.0, 15.5), + (CloudWyvern, _) => (5.5, 2.0, 15.5), + (FrostWyvern, _) => (5.5, 2.0, 15.5), + (SeaWyvern, _) => (5.5, 2.0, 15.5), + (WealdWyvern, _) => (5.5, 2.0, 15.5), }, foot: match (body.species, body.body_type) { (Phoenix, _) => (0.5, -0.5, -2.5), (Cockatrice, _) => (0.5, -3.0, -3.0), (Roc, _) => (2.5, -2.5, -5.5), (FlameWyvern, _) => (0.5, 0.0, -3.5), + (CloudWyvern, _) => (0.5, 0.0, -3.5), + (FrostWyvern, _) => (0.5, 0.0, -3.5), + (SeaWyvern, _) => (0.5, 0.0, -3.5), + (WealdWyvern, _) => (0.5, 0.0, -3.5), }, scaler: match (body.species, body.body_type) { (Phoenix, _) => (1.0), (Cockatrice, _) => (1.0), (Roc, _) => (1.0), - (FlameWyvern, _) => (1.0), + (FlameWyvern, _) + | (CloudWyvern, _) + | (FrostWyvern, _) + | (SeaWyvern, _) + | (WealdWyvern, _) => (1.0), }, feed: match (body.species, body.body_type) { (Phoenix, _) => (-0.65), (Cockatrice, _) => (-0.5), (Roc, _) => (-0.4), - (FlameWyvern, _) => (-0.65), + (FlameWyvern, _) + | (CloudWyvern, _) + | (FrostWyvern, _) + | (SeaWyvern, _) + | (WealdWyvern, _) => (-0.65), }, - wyvern: matches!((body.species, body.body_type), (FlameWyvern, _)), + wyvern: matches!( + (body.species, body.body_type), + (FlameWyvern, _) + | (CloudWyvern, _) + | (FrostWyvern, _) + | (SeaWyvern, _) + | (WealdWyvern, _) + ), } } } diff --git a/voxygen/anim/src/quadruped_low/mod.rs b/voxygen/anim/src/quadruped_low/mod.rs index 2b0a2df6db..e21d486d3e 100644 --- a/voxygen/anim/src/quadruped_low/mod.rs +++ b/voxygen/anim/src/quadruped_low/mod.rs @@ -160,6 +160,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (4.5, 10.5), (Tortoise, _) => (5.0, 1.0), (Rocksnapper, _) => (6.0, 0.5), + (Rootsnapper, _) => (6.0, 0.5), + (Reefsnapper, _) => (6.0, 0.5), (Pangolin, _) => (-0.5, 8.0), (Maneater, _) => (7.0, 11.5), (Sandshark, _) => (8.5, 0.5), @@ -180,6 +182,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (6.0, -2.5), (Tortoise, _) => (12.0, -3.5), (Rocksnapper, _) => (12.0, -9.0), + (Rootsnapper, _) => (12.0, -9.0), + (Reefsnapper, _) => (12.0, -9.0), (Pangolin, _) => (8.0, -9.0), (Maneater, _) => (1.0, 4.5), (Sandshark, _) => (13.5, -10.5), @@ -200,6 +204,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (2.0, -2.0), (Tortoise, _) => (-3.5, -2.0), (Rocksnapper, _) => (-5.0, -1.5), + (Rootsnapper, _) => (-5.0, -1.5), + (Reefsnapper, _) => (-5.0, -1.5), (Pangolin, _) => (0.0, 0.0), (Maneater, _) => (-1.0, 4.0), (Sandshark, _) => (-8.0, -5.5), @@ -220,6 +226,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (0.0, 8.0), (Tortoise, _) => (0.0, 11.0), (Rocksnapper, _) => (0.0, 18.5), + (Rootsnapper, _) => (0.0, 18.5), + (Reefsnapper, _) => (0.0, 18.5), (Pangolin, _) => (0.0, 7.0), (Maneater, _) => (0.0, 12.0), (Sandshark, _) => (0.0, 20.0), @@ -240,6 +248,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (-14.0, -2.0), (Tortoise, _) => (-10.0, -1.5), (Rocksnapper, _) => (-14.5, -2.0), + (Rootsnapper, _) => (-14.5, -2.0), + (Reefsnapper, _) => (-14.5, -2.0), (Pangolin, _) => (-7.0, -3.0), (Maneater, _) => (-15.0, 4.0), (Sandshark, _) => (-10.0, 0.5), @@ -260,6 +270,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (-6.0, -2.0), (Tortoise, _) => (-13.0, -3.5), (Rocksnapper, _) => (-13.5, -6.5), + (Rootsnapper, _) => (-13.5, -6.5), + (Reefsnapper, _) => (-13.5, -6.5), (Pangolin, _) => (-7.5, -0.5), (Maneater, _) => (-1.0, 4.0), (Sandshark, _) => (-13.0, -8.0), @@ -280,6 +292,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (1.5, 4.0, -1.0), (Tortoise, _) => (5.5, 6.5, -3.0), (Rocksnapper, _) => (7.5, 5.0, -8.5), + (Rootsnapper, _) => (7.5, 5.0, -8.5), + (Reefsnapper, _) => (7.5, 5.0, -8.5), (Pangolin, _) => (5.5, 5.5, -1.0), (Maneater, _) => (4.5, 4.0, -5.5), (Sandshark, _) => (5.5, 2.0, -8.0), @@ -300,6 +314,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Asp, _) => (2.5, -5.5, -1.0), (Tortoise, _) => (5.5, -11.5, -3.0), (Rocksnapper, _) => (8.0, -12.0, -9.5), + (Rootsnapper, _) => (8.0, -12.0, -9.5), + (Reefsnapper, _) => (8.0, -12.0, -9.5), (Pangolin, _) => (6.5, -3.5, -1.0), (Maneater, _) => (4.5, -2.5, -3.0), (Sandshark, _) => (3.5, -15.0, -14.0), @@ -322,6 +338,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Monitor, _) => (0.9), (Asp, _) => (1.12), (Rocksnapper, _) => (1.12), + (Rootsnapper, _) => (1.12), + (Reefsnapper, _) => (1.12), (Hakulaq, _) => (1.05), (Dagon, _) => (1.05), (Pangolin, _) => (1.05), @@ -339,6 +357,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Monitor, _) => (1.4), (Tortoise, _) => (0.7), (Rocksnapper, _) => (0.7), + (Rootsnapper, _) => (0.7), + (Reefsnapper, _) => (0.7), (Hakulaq, _) => (1.2), (Dagon, _) => (1.2), (Pangolin, _) => (1.15), @@ -363,6 +383,8 @@ fn mount_point(body: &Body) -> Vec3 { (Asp, _) => (0.0, 2.0, 0.0), (Tortoise, _) => (0.0, -7.0, -1.0), (Rocksnapper, _) => (0.0, -7.0, 4.5), + (Rootsnapper, _) => (0.0, -7.0, 4.5), + (Reefsnapper, _) => (0.0, -7.0, 4.5), (Pangolin, _) => (0.0, -6.5, -2.0), (Maneater, _) => (0.0, 4.0, -11.5), (Sandshark, _) => (0.0, -4.0, -2.0), diff --git a/voxygen/anim/src/quadruped_small/mod.rs b/voxygen/anim/src/quadruped_small/mod.rs index 644f4c8a95..ded341a054 100644 --- a/voxygen/anim/src/quadruped_small/mod.rs +++ b/voxygen/anim/src/quadruped_small/mod.rs @@ -57,11 +57,7 @@ impl Skeleton for QuadrupedSmallSkeleton { make_bone(chest_mat * Mat4::::from(self.leg_br)), make_bone(chest_mat * Mat4::::from(self.tail)), ]; - use comp::quadruped_small::Species::*; - let (mount_bone_mat, mount_bone_ori) = match (body.species, body.body_type) { - (Dodarock, _) => (head_mat, self.chest.orientation * self.head.orientation), - _ => (chest_mat, self.chest.orientation), - }; + let (mount_bone_mat, mount_bone_ori) = (chest_mat, self.chest.orientation); let mount_position = (mount_bone_mat * Vec4::from_point(mount_point(&body))) .homogenized() .xyz(); @@ -139,7 +135,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Batfox, _) => (5.0, 1.0), (Raccoon, _) => (5.0, 2.0), (Quokka, _) => (6.0, 2.0), - (Dodarock, _) => (6.0, -2.0), (Holladon, _) => (7.0, 1.0), (Hyena, _) => (7.5, 2.0), (Rabbit, _) => (4.0, 3.0), @@ -169,7 +164,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Batfox, _) => (-2.0, 6.0), (Raccoon, _) => (0.0, 5.5), (Quokka, _) => (2.0, 6.5), - (Dodarock, _) => (-2.0, 9.0), (Holladon, _) => (-2.0, 9.0), (Hyena, _) => (-2.0, 9.0), (Rabbit, _) => (-2.0, 6.0), @@ -199,7 +193,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Batfox, _) => (3.0, 4.0, -0.5), (Raccoon, _) => (4.0, 4.0, -0.0), (Quokka, _) => (3.0, 4.0, -1.0), - (Dodarock, _) => (5.0, 5.0, -2.5), (Holladon, _) => (5.0, 4.0, -2.5), (Hyena, _) => (2.5, 5.0, -4.0), (Rabbit, _) => (3.0, 3.0, -3.0), @@ -229,7 +222,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Batfox, _) => (3.5, -2.0, -0.5), (Raccoon, _) => (4.5, -3.0, 0.5), (Quokka, _) => (4.0, -4.0, -1.0), - (Dodarock, _) => (3.5, -3.0, -4.0), (Holladon, _) => (4.0, -2.0, -3.0), (Hyena, _) => (3.0, -5.0, -2.5), (Rabbit, _) => (3.5, -2.0, -1.0), @@ -259,7 +251,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Batfox, _) => (0.0, 5.0), (Raccoon, _) => (-4.0, 1.0), (Quokka, _) => (-6.0, 1.0), - (Dodarock, _) => (0.0, 5.0), (Holladon, _) => (-1.0, 4.0), (Hyena, _) => (-7.0, 0.0), (Rabbit, _) => (-4.0, -0.0), @@ -286,7 +277,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Skunk, _) => (0.72), (Cat, _) => (0.67), (Batfox, _) => (0.9), - (Dodarock, _) => (0.95), (Holladon, _) => (1.12), (Rabbit, _) => (0.56), (Frog, _) => (0.56), @@ -339,7 +329,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Skunk, _) => (0.9), (Cat, _) => (0.8), (Quokka, _) => (0.9), - (Dodarock, _) => (0.9), (Holladon, _) => (0.7), (Hyena, _) => (1.4), (Rabbit, _) => (0.8), @@ -360,7 +349,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Batfox, _) => (1.1), (Raccoon, _) => (1.1), (Quokka, _) => (1.3), - (Dodarock, _) => (0.9), (Holladon, _) => (0.7), (Hyena, _) => (1.4), (Rabbit, _) => (2.5), @@ -382,7 +370,6 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Skunk, _) => (0.8), (Batfox, _) => (0.7), (Raccoon, _) => (0.8), - (Dodarock, _) => (0.7), (Rabbit, _) => (1.2), (Truffler, _) => (0.6), (Frog, _) => (0.7), @@ -416,7 +403,6 @@ fn mount_point(body: &Body) -> Vec3 { (Batfox, _) => (0.0, -4.0, -3.0), (Raccoon, _) => (0.0, -4.0, -2.5), (Quokka, _) => (0.0, -3.0, -3.5), - (Dodarock, _) => (0.0, 0.0, 2.5), (Holladon, _) => (0.0, -2.0, -2.5), (Hyena, _) => (0.0, -4.0, -3.5), (Rabbit, _) => (0.0, -4.0, -3.5), diff --git a/voxygen/anim/src/theropod/mod.rs b/voxygen/anim/src/theropod/mod.rs index 582a24fd1e..22397bfd80 100644 --- a/voxygen/anim/src/theropod/mod.rs +++ b/voxygen/anim/src/theropod/mod.rs @@ -145,6 +145,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (8.0, 5.0), (Sunlizard, _) => (6.5, 3.5), (Yale, _) => (7.0, 14.0), + (Dodarock, _) => (2.0, 1.5), (Ntouka, _) => (2.0, 2.5), }, jaw: match (body.species, body.body_type) { @@ -155,7 +156,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (0.0, -4.0), (Sunlizard, _) => (2.0, -2.5), (Yale, _) => (2.0, -9.5), - (Ntouka, _) => (0.0, -4.0), + (Dodarock, _) => (0.0, -5.0), + (Ntouka, _) => (0.0, 0.0), }, neck: match (body.species, body.body_type) { (Archaeos, _) => (4.5, -2.0), @@ -165,6 +167,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (4.0, 2.5), (Sunlizard, _) => (2.5, 1.5), (Yale, _) => (2.0, 4.0), + (Dodarock, _) => (5.0, -1.0), (Ntouka, _) => (4.0, 0.0), }, chest_front: match (body.species, body.body_type) { @@ -175,6 +178,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (0.0, 15.5), (Sunlizard, _) => (0.0, 14.0), (Yale, _) => (0.0, 19.5), + (Dodarock, _) => (0.0, 12.0), (Ntouka, _) => (0.0, 13.0), }, chest_back: match (body.species, body.body_type) { @@ -185,6 +189,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (-3.0, 0.5), (Sunlizard, _) => (-2.0, 0.0), (Yale, _) => (-3.0, -1.0), + (Dodarock, _) => (-4.5, -2.0), (Ntouka, _) => (-4.5, 1.0), }, tail_front: match (body.species, body.body_type) { @@ -195,6 +200,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (-9.5, -1.0), (Sunlizard, _) => (-8.5, -2.0), (Yale, _) => (-9.5, -4.0), + (Dodarock, _) => (-4.5, -4.5), (Ntouka, _) => (-9.5, -3.5), }, tail_back: match (body.species, body.body_type) { @@ -203,9 +209,10 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Sandraptor, _) => (-10.5, 0.5), (Snowraptor, _) => (-10.5, 1.0), (Woodraptor, _) => (-10.5, 0.5), - (Sunlizard, _) => (-10.0, -0.5), + (Sunlizard, _) => (-10.0, -1.5), (Yale, _) => (-5.0, -2.5), - (Ntouka, _) => (-9.5, -2.0), + (Dodarock, _) => (-8.5, -2.0), + (Ntouka, _) => (-9.5, -2.5), }, hand: match (body.species, body.body_type) { (Archaeos, _) => (3.0, 0.0, -4.0), @@ -215,7 +222,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (2.5, 3.0, 1.0), (Sunlizard, _) => (2.5, 1.5, -0.5), (Yale, _) => (3.0, 2.0, -0.5), - (Ntouka, _) => (3.5, 3.0, -4.0), + (Dodarock, _) => (3.5, 3.0, -5.0), + (Ntouka, _) => (3.5, 3.0, 1.0), }, leg: match (body.species, body.body_type) { (Archaeos, _) => (2.5, -3.0, -4.0), @@ -225,6 +233,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (1.5, -2.5, -3.0), (Sunlizard, _) => (2.5, -2.5, -3.0), (Yale, _) => (3.0, -3.5, -4.0), + (Dodarock, _) => (3.5, 1.5, -4.0), (Ntouka, _) => (4.5, -5.5, -4.0), }, foot: match (body.species, body.body_type) { @@ -235,6 +244,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (2.0, 0.0, -3.0), (Sunlizard, _) => (1.0, -0.5, -2.5), (Yale, _) => (1.5, 1.0, -3.5), + (Dodarock, _) => (1.5, -1.0, -3.5), (Ntouka, _) => (1.5, -1.0, -2.5), }, scaler: match (body.species, body.body_type) { @@ -245,6 +255,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Woodraptor, _) => (1.1), (Sunlizard, _) => (1.1), (Yale, _) => (1.26), + (Dodarock, _) => (1.1), (Ntouka, _) => (2.93), }, } From 54c48c71128a5983c5b13ed2b084c9cb1207743c Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 5 Sep 2022 15:48:23 +0300 Subject: [PATCH 206/854] Extract buff executor into own function --- common/systems/src/buff.rs | 349 ++++++++++++++++++++----------------- 1 file changed, 186 insertions(+), 163 deletions(-) diff --git a/common/systems/src/buff.rs b/common/systems/src/buff.rs index caf755edb0..56d47e933c 100644 --- a/common/systems/src/buff.rs +++ b/common/systems/src/buff.rs @@ -11,10 +11,10 @@ use common::{ Energy, Group, Health, HealthChange, Inventory, LightEmitter, ModifierKind, PhysicsState, Stats, }, - event::{EventBus, ServerEvent}, + event::{Emitter, EventBus, ServerEvent}, resources::{DeltaTime, Time}, terrain::SpriteKind, - uid::UidAllocator, + uid::{Uid, UidAllocator}, Damage, DamageSource, }; use common_base::prof_span; @@ -22,8 +22,8 @@ use common_ecs::{Job, Origin, ParMode, Phase, System}; use hashbrown::HashMap; use rayon::iter::ParallelIterator; use specs::{ - saveload::MarkerAllocator, shred::ResourceId, Entities, Join, ParJoin, Read, ReadExpect, - ReadStorage, SystemData, World, WriteStorage, + saveload::MarkerAllocator, shred::ResourceId, Entities, Entity, Join, ParJoin, Read, + ReadExpect, ReadStorage, SystemData, World, WriteStorage, }; use std::time::Duration; @@ -257,165 +257,19 @@ impl<'a> System<'a> for Sys { // Now, execute the buff, based on it's delta for effect in &mut buff.effects { - match effect { - BuffEffect::HealthChangeOverTime { - rate, - accumulated, - kind, - instance, - } => { - *accumulated += *rate * dt; - // Apply health change only once per second, per health, or - // when a buff is removed - if accumulated.abs() > rate.abs().min(1.0) - || buff.time.map_or(false, |dur| dur == Duration::default()) - { - let (cause, by) = if *accumulated != 0.0 { - (Some(DamageSource::Buff(buff.kind)), buff_owner) - } else { - (None, None) - }; - let amount = match *kind { - ModifierKind::Additive => *accumulated, - ModifierKind::Fractional => health.maximum() * *accumulated, - }; - let damage_contributor = by.and_then(|uid| { - read_data.uid_allocator.retrieve_entity_internal(uid.0).map( - |entity| { - DamageContributor::new( - uid, - read_data.groups.get(entity).cloned(), - ) - }, - ) - }); - server_emitter.emit(ServerEvent::HealthChange { - entity, - change: HealthChange { - amount, - by: damage_contributor, - cause, - time: *read_data.time, - crit: false, - instance: *instance, - }, - }); - *accumulated = 0.0; - }; - }, - BuffEffect::EnergyChangeOverTime { - rate, - accumulated, - kind, - } => { - *accumulated += *rate * dt; - // Apply energy change only once per second, per energy, or - // when a buff is removed - if accumulated.abs() > rate.abs().min(10.0) - || buff.time.map_or(false, |dur| dur == Duration::default()) - { - let amount = match *kind { - ModifierKind::Additive => *accumulated, - ModifierKind::Fractional => { - energy.maximum() as f32 * *accumulated - }, - }; - server_emitter.emit(ServerEvent::EnergyChange { - entity, - change: amount, - }); - *accumulated = 0.0; - }; - }, - BuffEffect::MaxHealthModifier { value, kind } => match kind { - ModifierKind::Additive => { - stat.max_health_modifiers.add_mod += *value; - }, - ModifierKind::Fractional => { - stat.max_health_modifiers.mult_mod *= *value; - }, - }, - BuffEffect::MaxEnergyModifier { value, kind } => match kind { - ModifierKind::Additive => { - stat.max_energy_modifiers.add_mod += *value; - }, - ModifierKind::Fractional => { - stat.max_energy_modifiers.mult_mod *= *value; - }, - }, - BuffEffect::DamageReduction(dr) => { - stat.damage_reduction = stat.damage_reduction.max(*dr).min(1.0); - }, - BuffEffect::MaxHealthChangeOverTime { - rate, - kind, - target_fraction, - achieved_fraction, - } => { - // Current fraction uses information from last tick, which is - // necessary as buffs from this tick are not guaranteed to have - // finished applying - let current_fraction = health.maximum() / health.base_max(); - - // If achieved_fraction not initialized, initialize it to health - // fraction - if achieved_fraction.is_none() { - *achieved_fraction = Some(current_fraction) - } - - if let Some(achieved_fraction) = achieved_fraction { - // Percentage change that should be applied to max_health - let health_tick = match kind { - ModifierKind::Additive => { - // `rate * dt` is amount of health, dividing by base max - // creates fraction - *rate * dt / health.base_max() as f32 - }, - ModifierKind::Fractional => { - // `rate * dt` is the fraction - *rate * dt - }, - }; - - let potential_fraction = *achieved_fraction + health_tick; - - // Potential progress towards target fraction, if - // target_fraction ~ 1.0 then set progress to 1.0 to avoid - // divide by zero - let progress = if (1.0 - *target_fraction).abs() > f32::EPSILON - { - (1.0 - potential_fraction) / (1.0 - *target_fraction) - } else { - 1.0 - }; - - // Change achieved_fraction depending on what other buffs have - // occurred - if progress > 1.0 { - // If potential fraction already beyond target fraction, - // simply multiply max_health_modifier by the target - // fraction, and set achieved fraction to target_fraction - *achieved_fraction = *target_fraction; - } else { - // Else have not achieved target yet, update - // achieved_fraction - *achieved_fraction = potential_fraction; - } - - // Apply achieved_fraction to max_health_modifier - stat.max_health_modifiers.mult_mod *= *achieved_fraction; - } - }, - BuffEffect::MovementSpeed(speed) => { - stat.move_speed_modifier *= *speed; - }, - BuffEffect::AttackSpeed(speed) => { - stat.attack_speed_modifier *= *speed; - }, - BuffEffect::GroundFriction(gf) => { - stat.friction_modifier *= *gf; - }, - }; + execute_effect( + effect, + buff.kind, + buff.time, + &read_data, + &mut *stat, + health, + energy, + entity, + buff_owner, + &mut server_emitter, + dt, + ); } } } @@ -446,6 +300,175 @@ impl<'a> System<'a> for Sys { } } +fn execute_effect( + effect: &mut BuffEffect, + buff_kind: BuffKind, + buff_time: Option, + read_data: &ReadData, + stat: &mut Stats, + health: &Health, + energy: &Energy, + entity: Entity, + buff_owner: Option, + server_emitter: &mut Emitter, + dt: f32, +) { + match effect { + BuffEffect::HealthChangeOverTime { + rate, + accumulated, + kind, + instance, + } => { + *accumulated += *rate * dt; + // Apply health change only once per second, per health, or + // when a buff is removed + if accumulated.abs() > rate.abs().min(1.0) + || buff_time.map_or(false, |dur| dur == Duration::default()) + { + let (cause, by) = if *accumulated != 0.0 { + (Some(DamageSource::Buff(buff_kind)), buff_owner) + } else { + (None, None) + }; + let amount = match *kind { + ModifierKind::Additive => *accumulated, + ModifierKind::Fractional => health.maximum() * *accumulated, + }; + let damage_contributor = by.and_then(|uid| { + read_data + .uid_allocator + .retrieve_entity_internal(uid.0) + .map(|entity| { + DamageContributor::new(uid, read_data.groups.get(entity).cloned()) + }) + }); + server_emitter.emit(ServerEvent::HealthChange { + entity, + change: HealthChange { + amount, + by: damage_contributor, + cause, + time: *read_data.time, + crit: false, + instance: *instance, + }, + }); + *accumulated = 0.0; + }; + }, + BuffEffect::EnergyChangeOverTime { + rate, + accumulated, + kind, + } => { + *accumulated += *rate * dt; + // Apply energy change only once per second, per energy, or + // when a buff is removed + if accumulated.abs() > rate.abs().min(10.0) + || buff_time.map_or(false, |dur| dur == Duration::default()) + { + let amount = match *kind { + ModifierKind::Additive => *accumulated, + ModifierKind::Fractional => energy.maximum() as f32 * *accumulated, + }; + server_emitter.emit(ServerEvent::EnergyChange { + entity, + change: amount, + }); + *accumulated = 0.0; + }; + }, + BuffEffect::MaxHealthModifier { value, kind } => match kind { + ModifierKind::Additive => { + stat.max_health_modifiers.add_mod += *value; + }, + ModifierKind::Fractional => { + stat.max_health_modifiers.mult_mod *= *value; + }, + }, + BuffEffect::MaxEnergyModifier { value, kind } => match kind { + ModifierKind::Additive => { + stat.max_energy_modifiers.add_mod += *value; + }, + ModifierKind::Fractional => { + stat.max_energy_modifiers.mult_mod *= *value; + }, + }, + BuffEffect::DamageReduction(dr) => { + stat.damage_reduction = stat.damage_reduction.max(*dr).min(1.0); + }, + BuffEffect::MaxHealthChangeOverTime { + rate, + kind, + target_fraction, + achieved_fraction, + } => { + // Current fraction uses information from last tick, which is + // necessary as buffs from this tick are not guaranteed to have + // finished applying + let current_fraction = health.maximum() / health.base_max(); + + // If achieved_fraction not initialized, initialize it to health + // fraction + if achieved_fraction.is_none() { + *achieved_fraction = Some(current_fraction) + } + + if let Some(achieved_fraction) = achieved_fraction { + // Percentage change that should be applied to max_health + let health_tick = match kind { + ModifierKind::Additive => { + // `rate * dt` is amount of health, dividing by base max + // creates fraction + *rate * dt / health.base_max() as f32 + }, + ModifierKind::Fractional => { + // `rate * dt` is the fraction + *rate * dt + }, + }; + + let potential_fraction = *achieved_fraction + health_tick; + + // Potential progress towards target fraction, if + // target_fraction ~ 1.0 then set progress to 1.0 to avoid + // divide by zero + let progress = if (1.0 - *target_fraction).abs() > f32::EPSILON { + (1.0 - potential_fraction) / (1.0 - *target_fraction) + } else { + 1.0 + }; + + // Change achieved_fraction depending on what other buffs have + // occurred + if progress > 1.0 { + // If potential fraction already beyond target fraction, + // simply multiply max_health_modifier by the target + // fraction, and set achieved fraction to target_fraction + *achieved_fraction = *target_fraction; + } else { + // Else have not achieved target yet, update + // achieved_fraction + *achieved_fraction = potential_fraction; + } + + // Apply achieved_fraction to max_health_modifier + stat.max_health_modifiers.mult_mod *= *achieved_fraction; + } + }, + BuffEffect::MovementSpeed(speed) => { + stat.move_speed_modifier *= *speed; + }, + BuffEffect::AttackSpeed(speed) => { + stat.attack_speed_modifier *= *speed; + }, + BuffEffect::GroundFriction(gf) => { + stat.friction_modifier *= *gf; + }, + }; +} + fn tick_buff(id: u64, buff: &mut Buff, dt: f32, mut expire_buff: impl FnMut(u64)) { // If a buff is recently applied from an aura, do not tick duration if buff From 34c5e95d8a3e779639608d686edd776016be9c11 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 5 Sep 2022 17:16:18 +0300 Subject: [PATCH 207/854] Add Energy regen buff * Fix broken i18n keys for health and energy increases * Better handle buff descriptions Calculate infobox lines for item stats to set correct infobox frame dimensions --- assets/voxygen/i18n/en/buff.ftl | 44 ++++++++-- assets/voxygen/i18n/uk_UA/buff.ftl | 43 ++++++++-- common/src/cmd.rs | 5 +- common/src/comp/buff.rs | 18 ++++- voxygen/src/hud/chat.rs | 1 + voxygen/src/hud/mod.rs | 13 ++- voxygen/src/hud/util.rs | 107 ++++++++++++++----------- voxygen/src/ui/widgets/item_tooltip.rs | 5 +- 8 files changed, 163 insertions(+), 73 deletions(-) diff --git a/assets/voxygen/i18n/en/buff.ftl b/assets/voxygen/i18n/en/buff.ftl index 8aefd0a07d..3cd5c8464d 100644 --- a/assets/voxygen/i18n/en/buff.ftl +++ b/assets/voxygen/i18n/en/buff.ftl @@ -1,39 +1,67 @@ -buff-remove = Click to remove -buff-title-missing = Missing Title -buff-desc-missing = Missing Description +## Regeneration buff-title-heal = Heal buff-desc-heal = Gain health over time. +buff-stat-health = Restores { $str_total } Health +## Potion buff-title-potion = Potion buff-desc-potion = Drinking... +## Saturation buff-title-saturation = Saturation buff-desc-saturation = Gain health over time from consumables. +## Campfire buff-title-campfire_heal = Campfire Heal buff-desc-campfire_heal = Resting at a campfire heals { $rate }% per second. +## Energy Regen +buff-title-energy_regen = Energy Regeneration +buff-desc-energy_regen = Faster energy regeneration +buff-stat-energy_regen = Restores { $str_total } Energy +## Health Increase +buff-title-increase_max_health = Increase Max Health +buff-desc-increase_max_health = Raise your max health cap +buff-stat-increase_max_health = + Raises maximum health + by { $strength } +## Energy Increase +buff-title-increase_max_energy = Increase Max Energy +buff-desc-increase_max_energy = Raise your max energy cap +buff-stat-increase_max_energy = + Raises maximum energy + by { $strength } +## Invulnerability buff-title-invulnerability = Invulnerability buff-desc-invulnerability = You cannot be damaged by any attack. +buff-stat-invulnerability = Grants invulnerability +## Protection Ward buff-title-protectingward = Protecting Ward buff-desc-protectingward = You are protected, somewhat, from attacks. +## Frenzied buff-title-frenzied = Frenzied buff-desc-frenzied = You are imbued with unnatural speed and can ignore minor injuries. +## Haste buff-title-hastened = Hastened buff-desc-hastened = Your movements and attacks are faster. +## Bleeding buff-title-bleed = Bleeding buff-desc-bleed = Inflicts regular damage. +## Curse buff-title-cursed = Cursed buff-desc-cursed = You are cursed. +## Burning buff-title-burn = On Fire buff-desc-burn = You are burning alive +## Crippled buff-title-crippled = Crippled buff-desc-crippled = Your movement is crippled as your legs are heavily injured. +## Freeze buff-title-frozen = Frozen buff-desc-frozen = Your movements and attacks are slowed. +## Wet buff-title-wet = Wet buff-desc-wet = The ground rejects your feet, making it hard to stop. +## Ensnared buff-title-ensnared = Ensnared buff-desc-ensnared = Vines grasp at your legs, impeding your movement. -buff-stat-health = Restores { $str_total } Health -buff-stat-increase_max_energy = Raises Maximum Energy by { $strength } -buff-stat-increase_max_health = Raises Maximum Health by { $strength } -buff-stat-invulnerability = Grants invulnerability +## Util buff-text-over_seconds = over { $dur_secs } seconds -buff-text-for_seconds = for { $dur_secs } seconds \ No newline at end of file +buff-text-for_seconds = for { $dur_secs } seconds +buff-remove = Click to remove diff --git a/assets/voxygen/i18n/uk_UA/buff.ftl b/assets/voxygen/i18n/uk_UA/buff.ftl index 103fbb6ff6..a80c6d9ba9 100644 --- a/assets/voxygen/i18n/uk_UA/buff.ftl +++ b/assets/voxygen/i18n/uk_UA/buff.ftl @@ -1,37 +1,64 @@ -buff-remove = Клікніть, щоб видалити -buff-title-missing = Назва відсутня -buff-desc-missing = Опис відсутній +## Regeneration buff-title-heal = Зцілення buff-desc-heal = Поступово відновлює Здоров'я. +buff-stat-health = Відновлює { $str_total } ОЗ +## Potion buff-title-potion = Зілля buff-desc-potion = Пиття... +## Saturation buff-title-saturation = Насичення buff-desc-saturation = Поступово відновлює Здоров'я з їжі. +## Campfire buff-title-campfire_heal = Відновлення біля ватри buff-desc-campfire_heal = Відпочинок біля ватри лікує на { $rate }% за секунду. +## Energy Regen +buff-title-energy_regen = Відновлення Енергії +buff-desc-energy_regen = Поступово відновляє Eнергію +buff-stat-energy-regen = Відновлює { $str_total } енергії +## Health Increase +buff-title-increase_max_health = Підвищення Максимального Здоров'я +buff-desc-increase_max_health = Піднімає ліміт вашого здоров'я +buff-stat-increase_max_health = + Підвищує максимальне здоров'я + на { $strength } +## Energy Increase +buff-title-increase_max_energy = Підвищення Максимальної Енергії +buff-desc-increase_max_energy = Піднімає ліміт вашої енергії +buff-stat-increase_max_energy = + Підвищує максимальну енергію + на { $strength } +## Invulnerability buff-title-invulnerability = Невразливість buff-desc-invulnerability = Ви невразливий, тільки тримайтесь подалі від омели. +buff-stat-invulnerability = Дає невразливість +## Protection Ward buff-title-protectingward = Захисна Аура buff-desc-protectingward = Ви захищені від атак, у якомусь сенсі. +## Frenized buff-title-frenzied = Манія buff-desc-frenzied = Кров тече швидше, прискоруючи ваш рух та помалу зцілюючи вас. +## Cursed buff-title-cursed = Проклін buff-desc-cursed = Вас прокляли. +## Bleeding buff-title-bleed = Кровотеча buff-desc-bleed = Завдає регулярних пошкодженнь. +## Burning buff-title-burn = У Вогні buff-desc-burn = Ви згораєте заживо. +## Crippled buff-title-crippled = Калічення buff-desc-crippled = Ваші рухи дуже скуті через отримані травми. +## Freeze buff-title-frozen = Обмороження buff-desc-frozen = Швидкість пересування та атак знижена. +## Wet buff-title-wet = Волога buff-desc-wet = Земля плутає ваші ноги ускладнючи пересування. +## Ensnared buff-title-ensnared = Пастка buff-desc-ensnared = Ліани опутують ваші ноги, перешкоджаючи ходьбі. -buff-stat-health = Відновлює { $str_total } ОЗ -buff-stat-increase_max_health = Підвищує Максимальне Здоров'я на { $strength } -buff-stat-increase_max_energy = Підвищує Максимальну Енергію на { $strength } -buff-stat-invulnerability = Дає невразливість +## Util buff-text-for_seconds = протягом { $dur_secs } сек. -buff-text-over_seconds = впродовж { $dur_secs } сек. \ No newline at end of file +buff-text-over_seconds = впродовж { $dur_secs } сек. +buff-remove = Клікніть, щоб видалити diff --git a/common/src/cmd.rs b/common/src/cmd.rs index ed8c986797..c0a4e330e8 100644 --- a/common/src/cmd.rs +++ b/common/src/cmd.rs @@ -141,6 +141,7 @@ lazy_static! { BuffKind::Cursed => "cursed", BuffKind::Potion => "potion", BuffKind::CampfireHeal => "campfire_heal", + BuffKind::EnergyRegen => "energy_regen", BuffKind::IncreaseMaxEnergy => "increase_max_energy", BuffKind::IncreaseMaxHealth => "increase_max_health", BuffKind::Invulnerability => "invulnerability", @@ -154,7 +155,9 @@ lazy_static! { BuffKind::Hastened => "hastened", }; let mut buff_parser = HashMap::new(); - BuffKind::iter().for_each(|kind| {buff_parser.insert(string_from_buff(kind).to_string(), kind);}); + for kind in BuffKind::iter() { + buff_parser.insert(string_from_buff(kind).to_string(), kind); + } buff_parser }; diff --git a/common/src/comp/buff.rs b/common/src/comp/buff.rs index db2b4c32dc..572b5e8af3 100644 --- a/common/src/comp/buff.rs +++ b/common/src/comp/buff.rs @@ -27,6 +27,9 @@ pub enum BuffKind { /// Applied when sitting at a campfire /// Strength is fraction of health restored per second CampfireHeal, + /// Restores energy/time for some period + /// Strength should be the healing per second + EnergyRegen, /// Raises maximum energy /// Strength should be 10x the effect to max energy IncreaseMaxEnergy, @@ -91,6 +94,7 @@ impl BuffKind { | BuffKind::Potion | BuffKind::CampfireHeal | BuffKind::Frenzied + | BuffKind::EnergyRegen | BuffKind::IncreaseMaxEnergy | BuffKind::IncreaseMaxHealth | BuffKind::Invulnerability @@ -279,6 +283,14 @@ impl Buff { ], data.duration, ), + BuffKind::EnergyRegen => ( + vec![BuffEffect::EnergyChangeOverTime { + rate: data.strength, + accumulated: 0.0, + kind: ModifierKind::Additive, + }], + data.duration, + ), BuffKind::IncreaseMaxEnergy => ( vec![BuffEffect::MaxEnergyModifier { value: data.strength, @@ -296,9 +308,9 @@ impl Buff { BuffKind::Invulnerability => (vec![BuffEffect::DamageReduction(1.0)], data.duration), BuffKind::ProtectingWard => ( vec![BuffEffect::DamageReduction( - // Causes non-linearity in effect strength, but necessary to allow for tool - // power and other things to affect the strength. 0.5 also still provides 50% - // damage reduction. + // Causes non-linearity in effect strength, but necessary + // to allow for tool power and other things to affect the + // strength. 0.5 also still provides 50% damage reduction. nn_scaling(data.strength), )], data.duration, diff --git a/voxygen/src/hud/chat.rs b/voxygen/src/hud/chat.rs index 6ec3d2c32b..3c4896a4fc 100644 --- a/voxygen/src/hud/chat.rs +++ b/voxygen/src/hud/chat.rs @@ -788,6 +788,7 @@ fn insert_killing_buff(buff: BuffKind, localized_strings: &Localization, templat | BuffKind::Saturation | BuffKind::Potion | BuffKind::CampfireHeal + | BuffKind::EnergyRegen | BuffKind::IncreaseMaxEnergy | BuffKind::IncreaseMaxHealth | BuffKind::Invulnerability diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 5d950626d1..23c1e8d970 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -4564,6 +4564,7 @@ pub fn get_buff_image(buff: BuffKind, imgs: &Imgs) -> conrod_core::image::Id { BuffKind::Saturation { .. } => imgs.buff_saturation_0, BuffKind::Potion { .. } => imgs.buff_potion_0, BuffKind::CampfireHeal { .. } => imgs.buff_campfire_heal_0, + BuffKind::EnergyRegen { .. } => imgs.buff_energyplus_0, BuffKind::IncreaseMaxEnergy { .. } => imgs.buff_energyplus_0, BuffKind::IncreaseMaxHealth { .. } => imgs.buff_healthplus_0, BuffKind::Invulnerability => imgs.buff_invincibility_0, @@ -4589,10 +4590,13 @@ pub fn get_buff_title(buff: BuffKind, localized_strings: &Localization) -> Cow localized_strings.get_msg("buff-title-saturation"), BuffKind::Potion { .. } => localized_strings.get_msg("buff-title-potion"), BuffKind::CampfireHeal { .. } => localized_strings.get_msg("buff-title-campfire_heal"), + BuffKind::EnergyRegen { .. } => localized_strings.get_msg("buff-title-energy_regen"), BuffKind::IncreaseMaxHealth { .. } => { - localized_strings.get_msg("buff-title-IncreaseMaxHealth") + localized_strings.get_msg("buff-title-increase_max_health") + }, + BuffKind::IncreaseMaxEnergy { .. } => { + localized_strings.get_msg("buff-title-increase_max_energy") }, - BuffKind::IncreaseMaxEnergy { .. } => localized_strings.get_msg("buff-title-energyup"), BuffKind::Invulnerability => localized_strings.get_msg("buff-title-invulnerability"), BuffKind::ProtectingWard => localized_strings.get_msg("buff-title-protectingward"), BuffKind::Frenzied => localized_strings.get_msg("buff-title-frenzied"), @@ -4620,11 +4624,12 @@ pub fn get_buff_desc(buff: BuffKind, data: BuffData, localized_strings: &Localiz "rate" => data.strength * 100.0 }) }, + BuffKind::EnergyRegen { .. } => localized_strings.get_msg("buff-desc-energy_regen"), BuffKind::IncreaseMaxHealth { .. } => { - localized_strings.get_msg("buff-desc-IncreaseMaxHealth") + localized_strings.get_msg("buff-desc-increase_max_health") }, BuffKind::IncreaseMaxEnergy { .. } => { - localized_strings.get_msg("buff-desc-IncreaseMaxEnergy") + localized_strings.get_msg("buff-desc-increase_max_energy") }, BuffKind::Invulnerability => localized_strings.get_msg("buff-desc-invulnerability"), BuffKind::ProtectingWard => localized_strings.get_msg("buff-desc-protectingward"), diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 774ce0f63f..5c4eff6369 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -21,51 +21,43 @@ pub fn price_desc<'a>( item_definition_id: ItemDefinitionId<'_>, i18n: &'a Localization, ) -> Option<(Cow<'a, str>, Cow<'a, str>, f32)> { - if let Some(prices) = prices { - if let Some(materials) = TradePricing::get_materials(&item_definition_id) { - let coinprice = prices.values.get(&Good::Coin).cloned().unwrap_or(1.0); - let buyprice: f32 = materials - .iter() - .map(|e| prices.values.get(&e.1).cloned().unwrap_or_default() * e.0) - .sum(); - let sellprice: f32 = materials - .iter() - .map(|e| { - prices.values.get(&e.1).cloned().unwrap_or_default() * e.0 * e.1.trade_margin() - }) - .sum(); + let prices = prices.as_ref()?; + let materials = TradePricing::get_materials(&item_definition_id)?; + let coinprice = prices.values.get(&Good::Coin).cloned().unwrap_or(1.0); + let buyprice: f32 = materials + .iter() + .map(|e| prices.values.get(&e.1).cloned().unwrap_or_default() * e.0) + .sum(); + let sellprice: f32 = materials + .iter() + .map(|e| prices.values.get(&e.1).cloned().unwrap_or_default() * e.0 * e.1.trade_margin()) + .sum(); - let deal_goodness: f32 = materials - .iter() - .map(|e| prices.values.get(&e.1).cloned().unwrap_or(0.0)) - .sum::() - / prices.values.get(&Good::Coin).cloned().unwrap_or(1.0) - / (materials.len() as f32); - let deal_goodness = deal_goodness.log(2.0); + let deal_goodness: f32 = materials + .iter() + .map(|e| prices.values.get(&e.1).cloned().unwrap_or(0.0)) + .sum::() + / prices.values.get(&Good::Coin).cloned().unwrap_or(1.0) + / (materials.len() as f32); + let deal_goodness = deal_goodness.log(2.0); - let buy_string = i18n.get_msg_ctx("hud-trade-buy", &fluent_args! { - "coin_num" => buyprice / coinprice, - "coin_formatted" => format!("{:0.1}", buyprice / coinprice), - }); - let sell_string = i18n.get_msg_ctx("hud-trade-sell", &fluent_args! { - "coin_num" => sellprice / coinprice, - "coin_formatted" => format!("{:0.1}", sellprice / coinprice), - }); + let buy_string = i18n.get_msg_ctx("hud-trade-buy", &fluent_args! { + "coin_num" => buyprice / coinprice, + "coin_formatted" => format!("{:0.1}", buyprice / coinprice), + }); + let sell_string = i18n.get_msg_ctx("hud-trade-sell", &fluent_args! { + "coin_num" => sellprice / coinprice, + "coin_formatted" => format!("{:0.1}", sellprice / coinprice), + }); - let deal_goodness = match deal_goodness { - x if x < -2.5 => 0.0, - x if x < -1.05 => 0.25, - x if x < -0.95 => 0.5, - x if x < 0.0 => 0.75, - _ => 1.0, - }; - Some((buy_string, sell_string, deal_goodness)) - } else { - None - } - } else { - None - } + let deal_goodness = match deal_goodness { + x if x < -2.5 => 0.0, + x if x < -1.05 => 0.25, + x if x < -0.95 => 0.5, + x if x < 0.0 => 0.75, + _ => 1.0, + }; + Some((buy_string, sell_string, deal_goodness)) } pub fn kind_text<'a>(kind: &ItemKind, i18n: &'a Localization) -> Cow<'a, str> { @@ -126,6 +118,21 @@ pub fn stats_count(item: &dyn ItemDesc, msm: &MaterialStatManifest) -> usize { } } +pub fn line_count(item: &dyn ItemDesc, msm: &MaterialStatManifest, i18n: &Localization) -> usize { + match &*item.kind() { + ItemKind::Consumable { effects, .. } => { + let descs = consumable_desc(effects, i18n); + let mut lines = 0; + for desc in descs { + lines += desc.matches('\n').count() + 1; + } + + lines + }, + _ => stats_count(item, msm), + } +} + /// Takes N `effects` and returns N effect descriptions /// If effect isn't intended to have description, returns empty string /// @@ -149,6 +156,11 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { .get_msg_ctx("buff-stat-health", &i18n::fluent_args! { "str_total" => format_float(str_total), }), + BuffKind::EnergyRegen => { + i18n.get_msg_ctx("buff-stat-energy_regen", &i18n::fluent_args! { + "str_total" => format_float(str_total), + }) + }, BuffKind::IncreaseMaxEnergy => { i18n.get_msg_ctx("buff-stat-increase_max_energy", &i18n::fluent_args! { "strength" => format_float(strength), @@ -178,11 +190,10 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { let dur_desc = if let Some(dur_secs) = dur_secs { match buff.kind { - BuffKind::Saturation | BuffKind::Regeneration => { - i18n.get_msg_ctx("buff-text-over_seconds", &i18n::fluent_args! { + BuffKind::Saturation | BuffKind::Regeneration | BuffKind::EnergyRegen => i18n + .get_msg_ctx("buff-text-over_seconds", &i18n::fluent_args! { "dur_secs" => dur_secs - }) - }, + }), BuffKind::IncreaseMaxEnergy | BuffKind::IncreaseMaxHealth | BuffKind::Invulnerability => { @@ -204,7 +215,9 @@ pub fn consumable_desc(effects: &[Effect], i18n: &Localization) -> Vec { | BuffKind::Poisoned | BuffKind::Hastened => Cow::Borrowed(""), } - } else if let BuffKind::Saturation | BuffKind::Regeneration = buff.kind { + } else if let BuffKind::Saturation | BuffKind::Regeneration | BuffKind::EnergyRegen = + buff.kind + { i18n.get_msg("buff-text-every_second") } else { Cow::Borrowed("") diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index ba86d89af7..e8d06bf9a4 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -1248,7 +1248,7 @@ impl<'a> Widget for ItemTooltip<'a> { let frame_h = ICON_SIZE[1] + V_PAD; // Stats - let stats_count = util::stats_count(self.item, self.msm); + let stats_count = util::line_count(self.item, self.msm, self.localized_strings); let stat_h = if stats_count > 0 { widget::Text::new("placeholder") .with_style(self.style.desc) @@ -1294,7 +1294,8 @@ impl<'a> Widget for ItemTooltip<'a> { 0.0 }; - let height = frame_h + stat_h + desc_h + price_h + V_PAD + 5.0; // extra padding to fit frame top padding + // extra padding to fit frame top padding + let height = frame_h + stat_h + desc_h + price_h + V_PAD + 5.0; Dimension::Absolute(height) } } From 3cbfe02a8e1a687ee50b4564f680df3571727243 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Mon, 5 Sep 2022 21:57:45 +0300 Subject: [PATCH 208/854] Add Golden Cheese debug item --- assets/common/items/debug/golden_cheese.ron | 55 +++++++++++++++++++++ assets/server/manifests/kits.ron | 1 + assets/voxygen/item_image_manifest.ron | 5 ++ 3 files changed, 61 insertions(+) create mode 100644 assets/common/items/debug/golden_cheese.ron diff --git a/assets/common/items/debug/golden_cheese.ron b/assets/common/items/debug/golden_cheese.ron new file mode 100644 index 0000000000..37d23c0fa0 --- /dev/null +++ b/assets/common/items/debug/golden_cheese.ron @@ -0,0 +1,55 @@ +ItemDef( + name: "Golden Cheese", + description: "They say gods eat it to get eternal youth.", + kind: Consumable( + kind: Drink, + effects: [ + Buff(( + kind: Regeneration, + data: ( + strength: 1000, + duration: Some(( + secs: 999, + nanos: 0, + )), + ), + cat_ids: [Natural], + )), + Buff(( + kind: EnergyRegen, + data: ( + strength: 1000, + duration: Some(( + secs: 999, + nanos: 0, + )), + ), + cat_ids: [Natural], + )), + Buff(( + kind: IncreaseMaxHealth, + data: ( + strength: 50000, + duration: Some(( + secs: 999, + nanos: 0, + )), + ), + cat_ids: [Natural], + )), + Buff(( + kind: IncreaseMaxEnergy, + data: ( + strength: 50000, + duration: Some(( + secs: 999, + nanos: 0, + )), + ), + cat_ids: [Natural], + )), + ] + ), + quality: Debug, + tags: [Food], +) diff --git a/assets/server/manifests/kits.ron b/assets/server/manifests/kits.ron index 0cbbde29bc..e6b2bd4bcf 100644 --- a/assets/server/manifests/kits.ron +++ b/assets/server/manifests/kits.ron @@ -5,6 +5,7 @@ (Item("common.items.debug.admin_sword"),1), (Item("common.items.debug.velorite_bow_debug"), 1), (Item("common.items.debug.admin"),1), + (Item("common.items.debug.golden_cheese"),100), ], "consumables": [ (Item("common.items.consumable.potion_big"), 100), diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index 7dd0e4a4c0..8e341d120c 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -3189,6 +3189,11 @@ "voxel.sprite.food.salad_tomato", (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.8, ), + // Admin consumables + Simple("common.items.debug.golden_cheese"): VoxTrans( + "voxel.object.item_cheese", + (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.7, + ), // Throwables Simple("common.items.utility.bomb"): VoxTrans( "voxel.object.bomb", From cdfb2ae040e97ab580330f3ff5036139c83cd5f9 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Wed, 7 Sep 2022 02:42:37 +0300 Subject: [PATCH 209/854] build(nix): fix recompilation issues and improve build overhead --- flake.lock | 18 +++++------ flake.nix | 88 +++++++++++++++++++++++++----------------------------- 2 files changed, 50 insertions(+), 56 deletions(-) diff --git a/flake.lock b/flake.lock index aa94d53a08..d769ed60d5 100644 --- a/flake.lock +++ b/flake.lock @@ -69,11 +69,11 @@ ] }, "locked": { - "lastModified": 1662176993, - "narHash": "sha256-Sy7DsGAveDUFBb6YDsUSYZd/AcXfP/MOMIwMt/NgY84=", + "lastModified": 1662507674, + "narHash": "sha256-vnXfje4pfTqDEqI837GCT+hNKqzfVwPen++gnLVO9F0=", "owner": "nix-community", "repo": "dream2nix", - "rev": "809bc5940214744eb29778a9a0b03f161979c1b2", + "rev": "5ba9061857e3e265538c9785bb56bda2bb8f9bca", "type": "github" }, "original": { @@ -90,11 +90,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1662298979, - "narHash": "sha256-jHAqNmTGZb9xzUXlAjZcsOGgtsswRXw+eUUjk/wGFho=", + "lastModified": 1662507702, + "narHash": "sha256-Q8zfpLNCJublP7t4oHizr5tgsCS4BHFk7Fc7wzWbrzE=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "a415e5728613de0fe596a4bebc04483074b1c1e0", + "rev": "97aa58c683ccf628175118052b3306f40ac21ca0", "type": "github" }, "original": { @@ -127,11 +127,11 @@ "rust-overlay": { "flake": false, "locked": { - "lastModified": 1662260299, - "narHash": "sha256-FYJk/Pn+VuSyl5Q3KXwTmOD7hprlv3CZPIRMGGT61IM=", + "lastModified": 1662433378, + "narHash": "sha256-DqMtTtIownl+UIPG1O917IH10UF0Hwql636p22vOJfw=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "fe73170ff8b29c4230c26b85e82c25c73c35481d", + "rev": "12aa8ea4381b28b7a3118f96682dc3ffb13fb6b6", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index f84106b513..e584466f7b 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,7 @@ outputs = inputs: let lib = inputs.nci.inputs.nixpkgs.lib; + ncl = inputs.nci.lib.nci-lib; git = let sourceInfo = inputs.self.sourceInfo; @@ -114,6 +115,7 @@ }; veloren-server-cli.wrapper = wrapWithAssets; }; + disableVendoredCrateOverrides = true; overrides = { cCompiler = common: common.pkgs.clang; crates = common: prev: let @@ -127,7 +129,7 @@ rustflags = ["-C", "link-arg=-fuse-ld=mold"] EOF ''; - in { + in rec { veloren-common = oldAttrs: { # Disable `git-lfs` check here since we check it ourselves # We have to include the command output here, otherwise Nix won't run it @@ -139,64 +141,47 @@ NIX_GIT_TAG = ""; }; veloren-voxygen-deps = oldAttrs: { - doCheck = false; - + buildInputs = ncl.addBuildInputs prev ( + with pkgs; [ + alsa-lib + libxkbcommon + udev + xorg.libxcb + ] + ); nativeBuildInputs = - (oldAttrs.nativeBuildInputs or []) - ++ [pkgs.mold]; + ncl.addNativeBuildInputs prev (with pkgs; [python3 pkg-config mold]); - postConfigure = '' - ${oldAttrs.postConfigure or ""} - ${configMoldLinker} - ''; - }; - veloren-voxygen = oldAttrs: { - src = filteredSource; - - buildInputs = - (oldAttrs.buildInputs or []) - ++ ( - with pkgs; [ - alsa-lib - libxkbcommon - udev - xorg.libxcb - ] - ); - nativeBuildInputs = - (oldAttrs.nativeBuildInputs or []) - ++ (with pkgs; [python3 pkg-config mold]); - - VELOREN_USERDATA_STRATEGY = "system"; SHADERC_LIB_DIR = "${pkgs.shaderc.lib}/lib"; - dontUseCmakeConfigure = true; doCheck = false; - preConfigure = '' - ${oldAttrs.preConfigure or ""} - substituteInPlace voxygen/src/audio/soundcache.rs \ - --replace \ - "../../../assets/voxygen/audio/null.ogg" \ - "${./assets/voxygen/audio/null.ogg}" - ''; postConfigure = '' ${oldAttrs.postConfigure or ""} ${configMoldLinker} ''; }; + veloren-voxygen = prev: + ncl.computeOverridesResult prev [ + veloren-voxygen-deps + (oldAttrs: { + src = filteredSource; + + VELOREN_USERDATA_STRATEGY = "system"; + + dontUseCmakeConfigure = true; + + preConfigure = '' + ${oldAttrs.preConfigure or ""} + substituteInPlace voxygen/src/audio/soundcache.rs \ + --replace \ + "../../../assets/voxygen/audio/null.ogg" \ + "${./assets/voxygen/audio/null.ogg}" + ''; + }) + ]; veloren-server-cli-deps = oldAttrs: { - doCheck = false; - - postConfigure = '' - ${oldAttrs.postConfigure or ""} - ${configMoldLinker} - ''; - }; - veloren-server-cli = oldAttrs: { - src = filteredSource; - - VELOREN_USERDATA_STRATEGY = "system"; + nativeBuildInputs = ncl.addNativeBuildInputs prev [pkgs.mold]; doCheck = false; @@ -205,6 +190,15 @@ ${configMoldLinker} ''; }; + veloren-server-cli = prev: + ncl.computeOverridesResult prev [ + veloren-server-cli-deps + (oldAttrs: { + src = filteredSource; + + VELOREN_USERDATA_STRATEGY = "system"; + }) + ]; }; }; }; From f5aee1d2a7d2426953918b2c3546601f2b2591e8 Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Tue, 6 Sep 2022 20:59:41 -0700 Subject: [PATCH 210/854] Allow mods/admins to log in when server is full. As a side effect, this moves the initial game server sync message into the login code, since that's the first place we can check for admin permissions and we want to avoid sending large messages to users who are not authenticated (especially if the player cap has been reached; previously, the player cap check limited the damage that could be done by unauthenticated players). Some fallout from this is that we don't synchronize the Player component anymore, which had some minor effects on voxygen. This update also breaks Torvus, since Client::new now expects the username and password to be provided from the getgo--an accompanying MR will be submitted to fix it. --- CHANGELOG.md | 1 + client/examples/chat-cli/main.rs | 15 +++--- client/src/bin/bot/main.rs | 47 ++++++++++------ client/src/bin/swarm/main.rs | 18 ++++--- client/src/lib.rs | 68 +++++++++++++---------- common/net/src/msg/server.rs | 2 +- common/net/src/synced_components.rs | 9 +--- server/src/lib.rs | 81 ++++------------------------ server/src/login_provider.rs | 8 ++- server/src/sys/entity_sync.rs | 5 +- server/src/sys/msg/register.rs | 43 +++++++++++++-- voxygen/src/hud/mod.rs | 6 +-- voxygen/src/menu/main/client_init.rs | 12 ++--- 13 files changed, 156 insertions(+), 159 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bad552cbf6..bc5dc7c8b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed bug where the view distance selection was not immediately applied to entity syncing when first joining a server and when changing the view distance (previously this required moving to a new chunk for the initial setting or subsequent change to apply). +- Moderators and admins are no longer blocked from logging in when there are too many players. ## [0.13.0] - 2022-07-23 diff --git a/client/examples/chat-cli/main.rs b/client/examples/chat-cli/main.rs index ee79e3bc3f..87f9113870 100644 --- a/client/examples/chat-cli/main.rs +++ b/client/examples/chat-cli/main.rs @@ -51,19 +51,20 @@ fn main() { // Create a client. let mut client = runtime - .block_on(Client::new(addr, runtime2, &mut None)) + .block_on(Client::new( + addr, + runtime2, + &mut None, + &username, + &password, + |provider| provider == "https://auth.veloren.net", + )) .expect("Failed to create client instance"); println!("Server info: {:?}", client.server_info()); println!("Players online: {:?}", client.players().collect::>()); - runtime - .block_on(client.register(username, password, |provider| { - provider == "https://auth.veloren.net" - })) - .unwrap(); - let (tx, rx) = mpsc::channel(); thread::spawn(move || { loop { diff --git a/client/src/bin/bot/main.rs b/client/src/bin/bot/main.rs index ce4bacff73..9fcdade262 100644 --- a/client/src/bin/bot/main.rs +++ b/client/src/bin/bot/main.rs @@ -13,6 +13,7 @@ mod settings; mod tui; use common::comp::body::humanoid::Body; +use common_net::msg::ServerInfo; use settings::Settings; use tui::Cmd; @@ -46,31 +47,47 @@ pub fn main() { pub struct BotClient { settings: Settings, runtime: Arc, - menu_client: Client, + server_info: ServerInfo, bot_clients: HashMap, clock: Clock, } -pub fn make_client(runtime: &Arc, server: &str) -> Client { +pub fn make_client( + runtime: &Arc, + server: &str, + server_info: &mut Option, + username: &str, + password: &str, +) -> Option { let runtime_clone = Arc::clone(runtime); let addr = ConnectionArgs::Tcp { prefer_ipv6: false, hostname: server.to_owned(), }; runtime - .block_on(Client::new(addr, runtime_clone, &mut None)) - .expect("Failed to connect to server") + .block_on(Client::new( + addr, + runtime_clone, + server_info, + username, + password, + |_| true, + )) + .ok() } impl BotClient { pub fn new(settings: Settings) -> BotClient { let runtime = Arc::new(Runtime::new().unwrap()); - let menu_client: Client = make_client(&runtime, &settings.server); + let mut server_info = None; + // Don't care if we connect, just trying to grab the server info. + let _ = make_client(&runtime, &settings.server, &mut server_info, "", ""); + let server_info = server_info.expect("Failed to connect to server."); let clock = Clock::new(Duration::from_secs_f64(1.0 / 60.0)); BotClient { settings, runtime, - menu_client, + server_info, bot_clients: HashMap::new(), clock, } @@ -106,7 +123,7 @@ impl BotClient { None => vec![prefix.to_string()], }; info!("usernames: {:?}", usernames); - if let Some(auth_addr) = self.menu_client.server_info().auth_provider.as_ref() { + if let Some(auth_addr) = self.server_info.auth_provider.as_ref() { let (scheme, authority) = auth_addr.split_once("://").expect("invalid auth url"); let scheme = scheme .parse::() @@ -156,20 +173,16 @@ impl BotClient { for cred in creds.iter() { let runtime = Arc::clone(&self.runtime); - let server = self.settings.server.clone(); + let server = &self.settings.server; + // TODO: log the clients in in parallel instead of in series let client = self .bot_clients .entry(cred.username.clone()) - .or_insert_with(|| make_client(&runtime, &server)); + .or_insert_with(|| { + make_client(&runtime, server, &mut None, &cred.username, &cred.password) + .expect("Failed to connect to server") + }); - // TODO: log the clients in in parallel instead of in series - if let Err(e) = runtime.block_on(client.register( - cred.username.clone(), - cred.password.clone(), - |_| true, - )) { - warn!("error logging in {:?}: {:?}", cred.username, e); - } let body = BotClient::create_default_body(); client.create_character( cred.username.clone(), diff --git a/client/src/bin/swarm/main.rs b/client/src/bin/swarm/main.rs index 90e345f6ad..7284ddb95b 100644 --- a/client/src/bin/swarm/main.rs +++ b/client/src/bin/swarm/main.rs @@ -108,15 +108,17 @@ fn run_client( hostname: "localhost".into(), }; let runtime_clone = Arc::clone(&runtime); - let mut client = runtime - .block_on(Client::new(addr, runtime_clone, &mut None)) - .expect("Failed to connect to the server"); - - // Login // NOTE: use a no-auth server - runtime - .block_on(client.register(username.clone(), String::new(), |_| false)) - .expect("Failed to log in"); + let mut client = runtime + .block_on(Client::new( + addr, + runtime_clone, + &mut None, + &username, + "", + |_| false, + )) + .expect("Failed to connect to the server"); let mut clock = common::clock::Clock::new(Duration::from_secs_f32(1.0 / 30.0)); diff --git a/client/src/lib.rs b/client/src/lib.rs index 1138e9ab4f..d07bd78f85 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -275,6 +275,9 @@ impl Client { runtime: Arc, // TODO: refactor to avoid needing to use this out parameter mismatched_server_info: &mut Option, + username: &str, + password: &str, + auth_trusted: impl FnMut(&str) -> bool, ) -> Result { let network = Network::new(Pid::new(), &runtime); @@ -317,15 +320,24 @@ impl Client { common::util::GIT_HASH.to_string(), common::util::GIT_DATE.to_string(), ); - - // Pass the server info back to the caller to ensure they can access it even - // if this function errors. - mem::swap(mismatched_server_info, &mut Some(server_info.clone())); } + // Pass the server info back to the caller to ensure they can access it even + // if this function errors. + mem::swap(mismatched_server_info, &mut Some(server_info.clone())); debug!("Auth Server: {:?}", server_info.auth_provider); ping_stream.send(PingMsg::Ping)?; + // Register client + Self::register( + username, + password, + auth_trusted, + &server_info, + &mut register_stream, + ) + .await?; + // Wait for initial sync let mut ping_interval = tokio::time::interval(Duration::from_secs(1)); let ( @@ -632,7 +644,7 @@ impl Client { let map_bounds = Vec2::new(sea_level, max_height); debug!("Done preparing image..."); - Ok(( + ( state, lod_base, lod_alt, @@ -644,16 +656,15 @@ impl Client { component_recipe_book, max_group_size, client_timeout, - )) + ) }, - ServerInit::TooManyPlayers => Err(Error::TooManyPlayers), - }?; + }; ping_stream.send(PingMsg::Ping)?; debug!("Initial sync done"); Ok(Self { - registered: false, + registered: true, presence: None, runtime, server_info, @@ -722,14 +733,15 @@ impl Client { } /// Request a state transition to `ClientState::Registered`. - pub async fn register( - &mut self, - username: String, - password: String, + async fn register( + username: &str, + password: &str, mut auth_trusted: impl FnMut(&str) -> bool, + server_info: &ServerInfo, + register_stream: &mut Stream, ) -> Result<(), Error> { // Authentication - let token_or_username = match &self.server_info.auth_provider { + let token_or_username = match &server_info.auth_provider { Some(addr) => { // Query whether this is a trusted auth server if auth_trusted(addr) { @@ -749,26 +761,29 @@ impl Client { }; Ok(authc::AuthClient::new(scheme, authority)? - .sign_in(&username, &password) + .sign_in(username, password) .await? .serialize()) } else { Err(Error::AuthServerNotTrusted) } }, - None => Ok(username), + None => Ok(username.to_owned()), }?; - self.send_msg_err(ClientRegister { token_or_username })?; + debug!("Registering client..."); - match self.register_stream.recv::().await? { + register_stream.send(ClientRegister { token_or_username })?; + + match register_stream.recv::().await? { Err(RegisterError::AuthError(err)) => Err(Error::AuthErr(err)), Err(RegisterError::InvalidCharacter) => Err(Error::InvalidCharacter), Err(RegisterError::NotOnWhitelist) => Err(Error::NotOnWhitelist), Err(RegisterError::Kicked(err)) => Err(Error::Kicked(err)), Err(RegisterError::Banned(reason)) => Err(Error::Banned(reason)), + Err(RegisterError::TooManyPlayers) => Err(Error::TooManyPlayers), Ok(()) => { - self.registered = true; + debug!("Client registered successfully."); Ok(()) }, } @@ -2917,6 +2932,9 @@ mod tests { let runtime = Arc::new(Runtime::new().unwrap()); let runtime2 = Arc::clone(&runtime); + let username = "Foo"; + let password = "Bar"; + let auth_server = "auth.veloren.net"; let veloren_client: Result = runtime.block_on(Client::new( ConnectionArgs::Tcp { hostname: "127.0.0.1:9000".to_owned(), @@ -2924,18 +2942,12 @@ mod tests { }, runtime2, &mut None, + username, + password, + |suggestion: &str| suggestion == auth_server, )); let _ = veloren_client.map(|mut client| { - //register - let username: String = "Foo".to_string(); - let password: String = "Bar".to_string(); - let auth_server: String = "auth.veloren.net".to_string(); - let _result: Result<(), Error> = - runtime.block_on(client.register(username, password, |suggestion: &str| { - suggestion == auth_server - })); - //clock let mut clock = Clock::new(Duration::from_secs_f64(SPT)); diff --git a/common/net/src/msg/server.rs b/common/net/src/msg/server.rs index 948f9a80a2..4280416174 100644 --- a/common/net/src/msg/server.rs +++ b/common/net/src/msg/server.rs @@ -55,7 +55,6 @@ pub struct ServerInfo { #[derive(Debug, Clone, Serialize, Deserialize)] #[allow(clippy::large_enum_variant)] pub enum ServerInit { - TooManyPlayers, GameSync { entity_package: sync::EntityPackage, time_of_day: TimeOfDay, @@ -275,6 +274,7 @@ pub enum RegisterError { Kicked(String), InvalidCharacter, NotOnWhitelist, + TooManyPlayers, //TODO: InvalidAlias, } diff --git a/common/net/src/synced_components.rs b/common/net/src/synced_components.rs index 2675eec32b..1dfdf57da7 100644 --- a/common/net/src/synced_components.rs +++ b/common/net/src/synced_components.rs @@ -42,9 +42,6 @@ macro_rules! synced_components { shockwave: Shockwave, beam_segment: BeamSegment, alignment: Alignment, - // TODO: evaluate if this is used on the client, - // and if so what it is used for - player: Player, // TODO: change this to `SyncFrom::ClientEntity` and sync the bare minimum // from other entities (e.g. just keys needed to show appearance // based on their loadout). Also, it looks like this actually has @@ -210,10 +207,6 @@ impl NetSync for Alignment { const SYNC_FROM: SyncFrom = SyncFrom::AnyEntity; } -impl NetSync for Player { - const SYNC_FROM: SyncFrom = SyncFrom::AnyEntity; -} - impl NetSync for Inventory { const SYNC_FROM: SyncFrom = SyncFrom::AnyEntity; } @@ -222,7 +215,7 @@ impl NetSync for SkillSet { const SYNC_FROM: SyncFrom = SyncFrom::AnyEntity; } -// These are synced only from the client's own entity. +// These are synced only from the client's own entity. impl NetSync for Combo { const SYNC_FROM: SyncFrom = SyncFrom::ClientEntity; diff --git a/server/src/lib.rs b/server/src/lib.rs index c3205fc944..b8185565da 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -67,7 +67,7 @@ use crate::{ presence::{Presence, RegionSubscription, RepositionOnChunkLoad}, rtsim::RtSim, state_ext::StateExt, - sys::sentinel::{DeletedEntities, TrackedStorages}, + sys::sentinel::DeletedEntities, }; use censor::Censor; #[cfg(not(feature = "worldgen"))] @@ -79,7 +79,6 @@ use common::{ cmd::ServerChatCommand, comp, event::{EventBus, ServerEvent}, - recipe::{default_component_recipe_book, default_recipe_book}, resources::{BattleMode, Time, TimeOfDay}, rtsim::RtSimEntity, slowjob::SlowJobPool, @@ -88,9 +87,7 @@ use common::{ }; use common_ecs::run_now; use common_net::{ - msg::{ - ClientType, DisconnectReason, ServerGeneral, ServerInfo, ServerInit, ServerMsg, WorldMapMsg, - }, + msg::{ClientType, DisconnectReason, ServerGeneral, ServerInfo, ServerMsg}, sync::WorldSyncExt, }; use common_state::{BuildAreas, State}; @@ -103,7 +100,7 @@ use persistence::{ }; use prometheus::Registry; use prometheus_hyper::Server as PrometheusServer; -use specs::{join::Join, Builder, Entity as EcsEntity, Entity, SystemData, WorldExt}; +use specs::{join::Join, Builder, Entity as EcsEntity, Entity, WorldExt}; use std::{ i32, ops::{Deref, DerefMut}, @@ -201,7 +198,6 @@ pub struct Server { state: State, world: Arc, index: IndexOwned, - map: WorldMapMsg, connection_handler: ConnectionHandler, @@ -387,6 +383,8 @@ impl Server { pois: Vec::new(), }; + state.ecs_mut().insert(map); + #[cfg(feature = "worldgen")] let spawn_point = SpawnPoint({ let index = index.as_index_ref(); @@ -562,8 +560,6 @@ impl Server { state, world, index, - map, - connection_handler, runtime, @@ -630,9 +626,6 @@ impl Server { /// Get a reference to the server's world. pub fn world(&self) -> &World { &self.world } - /// Get a reference to the server's world map. - pub fn map(&self) -> &WorldMapMsg { &self.map } - /// Execute a single server tick, handle input and update the game state by /// the given duration. pub fn tick(&mut self, _input: Input, dt: Duration) -> Result, Error> { @@ -1029,19 +1022,7 @@ impl Server { .map(|mut t| t.maintain()); } - fn initialize_client( - &mut self, - client: connection_handler::IncomingClient, - ) -> Result, Error> { - if self.settings().max_players <= self.state.ecs().read_storage::().join().count() { - trace!( - ?client.participant, - "to many players, wont allow participant to connect" - ); - client.send(ServerInit::TooManyPlayers)?; - return Ok(None); - } - + fn initialize_client(&mut self, client: connection_handler::IncomingClient) -> Entity { let entity = self .state .ecs_mut() @@ -1053,43 +1034,7 @@ impl Server { .read_resource::() .clients_connected .inc(); - // Send client all the tracked components currently attached to its entity as - // well as synced resources (currently only `TimeOfDay`) - debug!("Starting initial sync with client."); - self.state - .ecs() - .read_storage::() - .get(entity) - .expect( - "We just created this entity with a Client component using build(), and we have \ - &mut access to the ecs so it can't have been deleted yet.", - ) - .send(ServerInit::GameSync { - // Send client their entity - entity_package: TrackedStorages::fetch(self.state.ecs()) - .create_entity_package(entity, None, None, None) - .expect( - "We just created this entity as marked() (using create_entity_synced) so \ - it definitely has a uid", - ), - time_of_day: *self.state.ecs().read_resource(), - max_group_size: self.settings().max_player_group_size, - client_timeout: self.settings().client_timeout, - world_map: self.map.clone(), - recipe_book: default_recipe_book().cloned(), - component_recipe_book: default_component_recipe_book().cloned(), - material_stats: (&*self - .state - .ecs() - .read_resource::()) - .clone(), - ability_map: (&*self - .state - .ecs() - .read_resource::()) - .clone(), - })?; - Ok(Some(entity)) + entity } /// Disconnects all clients if requested by either an admin command or @@ -1155,16 +1100,8 @@ impl Server { } while let Ok(incoming) = self.connection_handler.client_receiver.try_recv() { - match self.initialize_client(incoming) { - Ok(None) => (), - Ok(Some(entity)) => { - frontend_events.push(Event::ClientConnected { entity }); - debug!("Done initial sync with client."); - }, - Err(e) => { - debug!(?e, "failed initializing a new client"); - }, - } + let entity = self.initialize_client(incoming); + frontend_events.push(Event::ClientConnected { entity }); } } diff --git a/server/src/login_provider.rs b/server/src/login_provider.rs index 96d4d8d69f..1da5b95a18 100644 --- a/server/src/login_provider.rs +++ b/server/src/login_provider.rs @@ -97,7 +97,7 @@ impl LoginProvider { PendingLogin { pending_r } } - pub fn login( + pub(crate) fn login( &mut self, pending: &mut PendingLogin, #[cfg(feature = "plugins")] world: &EcsWorld, @@ -105,6 +105,7 @@ impl LoginProvider { admins: &HashMap, whitelist: &HashMap, banlist: &HashMap, + player_count_exceeded: bool, ) -> Option> { match pending.pending_r.try_recv() { Ok(Err(e)) => Some(Err(e)), @@ -137,6 +138,11 @@ impl LoginProvider { return Some(Err(RegisterError::NotOnWhitelist)); } + // non-admins can only join if the player count has not been exceeded. + if admin.is_none() && player_count_exceeded { + return Some(Err(RegisterError::TooManyPlayers)); + } + #[cfg(feature = "plugins")] { // Plugin player join hooks execute for all players, but are only allowed to diff --git a/server/src/sys/entity_sync.rs b/server/src/sys/entity_sync.rs index dc303e732f..8032765efa 100644 --- a/server/src/sys/entity_sync.rs +++ b/server/src/sys/entity_sync.rs @@ -6,7 +6,7 @@ use crate::{ }; use common::{ calendar::Calendar, - comp::{Collider, ForceUpdate, InventoryUpdate, Last, Ori, Pos, Vel}, + comp::{Collider, ForceUpdate, InventoryUpdate, Last, Ori, Player, Pos, Vel}, event::EventBus, outcome::Outcome, region::{Event as RegionEvent, RegionMap}, @@ -40,6 +40,7 @@ impl<'a> System<'a> for Sys { ReadStorage<'a, Vel>, ReadStorage<'a, Ori>, ReadStorage<'a, RegionSubscription>, + ReadStorage<'a, Player>, ReadStorage<'a, Presence>, ReadStorage<'a, Client>, WriteStorage<'a, Last>, @@ -70,6 +71,7 @@ impl<'a> System<'a> for Sys { velocities, orientations, subscriptions, + players, presences, clients, mut last_pos, @@ -88,7 +90,6 @@ impl<'a> System<'a> for Sys { let uids = &tracked_storages.uid; let colliders = &tracked_storages.collider; let inventories = &tracked_storages.inventory; - let players = &tracked_storages.player; let is_rider = &tracked_storages.is_rider; // To send entity updates diff --git a/server/src/sys/msg/register.rs b/server/src/sys/msg/register.rs index 8d751b094f..147d8e117d 100644 --- a/server/src/sys/msg/register.rs +++ b/server/src/sys/msg/register.rs @@ -2,17 +2,20 @@ use crate::{ client::Client, login_provider::{LoginProvider, PendingLogin}, metrics::PlayerMetrics, + sys::sentinel::TrackedStorages, EditableSettings, Settings, }; use common::{ - comp::{Admin, Player, Stats}, + comp::{self, Admin, Player, Stats}, event::{EventBus, ServerEvent}, + recipe::{default_component_recipe_book, default_recipe_book}, + resources::TimeOfDay, uid::{Uid, UidAllocator}, }; use common_ecs::{Job, Origin, Phase, System}; use common_net::msg::{ CharacterInfo, ClientRegister, DisconnectReason, PlayerInfo, PlayerListUpdate, RegisterError, - ServerGeneral, + ServerGeneral, ServerInit, WorldMapMsg, }; use hashbrown::HashMap; use plugin_api::Health; @@ -20,7 +23,7 @@ use specs::{ shred::ResourceId, storage::StorageEntry, Entities, Join, Read, ReadExpect, ReadStorage, SystemData, World, WriteExpect, WriteStorage, }; -use tracing::trace; +use tracing::{debug, trace}; #[cfg(feature = "plugins")] use {common_state::plugin::memory_manager::EcsWorld, common_state::plugin::PluginMgr}; @@ -40,6 +43,11 @@ pub struct ReadData<'a> { player_metrics: ReadExpect<'a, PlayerMetrics>, settings: ReadExpect<'a, Settings>, editable_settings: ReadExpect<'a, EditableSettings>, + time_of_day: Read<'a, TimeOfDay>, + material_stats: ReadExpect<'a, comp::item::MaterialStatManifest>, + ability_map: ReadExpect<'a, comp::item::tool::AbilityMap>, + map: ReadExpect<'a, WorldMapMsg>, + trackers: TrackedStorages<'a>, _healths: ReadStorage<'a, Health>, // used by plugin feature _plugin_mgr: ReadPlugin<'a>, // used by plugin feature _uid_allocator: Read<'a, UidAllocator>, // used by plugin feature @@ -107,6 +115,8 @@ impl<'a> System<'a> for Sys { let mut finished_pending = vec![]; let mut retries = vec![]; + let mut player_count = player_list.len(); + let max_players = read_data.settings.max_players; for (entity, client, pending) in (&read_data.entities, &read_data.clients, &mut pending_logins).join() { @@ -129,6 +139,7 @@ impl<'a> System<'a> for Sys { &*read_data.editable_settings.admins, &*read_data.editable_settings.whitelist, &*read_data.editable_settings.banlist, + player_count >= max_players, ) { None => return Ok(()), Some(r) => { @@ -190,6 +201,7 @@ impl<'a> System<'a> for Sys { if let Ok(StorageEntry::Vacant(v)) = players.entry(entity) { // Add Player component to this client, if the entity exists. v.insert(player); + player_count += 1; read_data.player_metrics.players_connected.inc(); // Give the Admin component to the player if their name exists in @@ -203,6 +215,31 @@ impl<'a> System<'a> for Sys { // Tell the client its request was successful. client.send(Ok(()))?; + // Send client all the tracked components currently attached to its entity as + // well as synced resources (currently only `TimeOfDay`) + debug!("Starting initial sync with client."); + client.send(ServerInit::GameSync { + // Send client their entity + entity_package: + read_data.trackers + .create_entity_package(entity, None, None, None) + // NOTE: We are apparently okay with crashing if a uid is removed from + // a non-logged-in player without removing the whole thing. + .expect( + "We created this entity as marked() (using create_entity_synced) so \ + it definitely has a uid", + ), + time_of_day: *read_data.time_of_day, + max_group_size: read_data.settings.max_player_group_size, + client_timeout: read_data.settings.client_timeout, + world_map: (&*read_data.map).clone(), + recipe_book: default_recipe_book().cloned(), + component_recipe_book: default_component_recipe_book().cloned(), + material_stats: (&*read_data.material_stats).clone(), + ability_map: (&*read_data.ability_map).clone(), + })?; + debug!("Done initial sync with client."); + // Send initial player list client.send(ServerGeneral::PlayerListUpdate(PlayerListUpdate::Init( player_list.clone(), diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 5d950626d1..a14c97dd06 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1278,7 +1278,6 @@ impl Hud { let bodies = ecs.read_storage::(); let items = ecs.read_storage::(); let inventories = ecs.read_storage::(); - let players = ecs.read_storage::(); let msm = ecs.read_resource::(); let entities = ecs.entities(); let me = info.viewpoint_entity; @@ -1978,7 +1977,6 @@ impl Hud { &mut hp_floater_lists, &uids, &inventories, - players.maybe(), poises.maybe(), (alignments.maybe(), is_mount.maybe()), ) @@ -2002,7 +2000,6 @@ impl Hud { hpfl, uid, inventory, - player, poise, (alignment, is_mount), )| { @@ -2013,7 +2010,8 @@ impl Hud { // TODO: once the site2 rework lands and merchants have dedicated stalls or // buildings, they no longer need to be emphasized via the higher overhead // text radius relative to other NPCs - let is_merchant = stats.name == "Merchant" && player.is_none(); + let is_merchant = + stats.name == "Merchant" && client.player_list().get(uid).is_none(); let dist_sqr = pos.distance_squared(player_pos); // Determine whether to display nametag and healthbar based on whether the // entity has been damaged, is targeted/selected, or is in your group diff --git a/voxygen/src/menu/main/client_init.rs b/voxygen/src/menu/main/client_init.rs index 5cc0b5b791..cf5ab2daf2 100644 --- a/voxygen/src/menu/main/client_init.rs +++ b/voxygen/src/menu/main/client_init.rs @@ -77,17 +77,13 @@ impl ClientInit { connection_args.clone(), Arc::clone(&runtime2), &mut mismatched_server_info, + &username, + &password, + trust_fn, ) .await { - Ok(mut client) => { - if let Err(e) = client.register(username, password, trust_fn).await { - last_err = Some(Error::ClientError { - error: e, - mismatched_server_info: None, - }); - break 'tries; - } + Ok(client) => { let _ = tx.send(Msg::Done(Ok(client))); tokio::task::block_in_place(move || drop(runtime2)); return; From e55b541bccdfc136af93c7b6882b8b0248467fab Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Thu, 8 Sep 2022 08:33:35 +0000 Subject: [PATCH 211/854] Revert "Merge branch 'yusdacra/chore/nix' into 'master'" This reverts merge request !2951 --- Cargo.toml | 4 + common/src/util/mod.rs | 18 +-- flake.lock | 107 +++------------ flake.nix | 287 ++++++++++++++--------------------------- nix/README.md | 7 +- nix/dateTimeFormat.nix | 21 --- nix/default.nix | 3 +- nix/shell.nix | 3 +- nix/utils.nix | 48 +++++++ voxygen/Cargo.toml | 2 + 10 files changed, 182 insertions(+), 318 deletions(-) delete mode 100644 nix/dateTimeFormat.nix create mode 100644 nix/utils.nix diff --git a/Cargo.toml b/Cargo.toml index ad93cf13cf..fec9ce5a35 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -115,6 +115,10 @@ systems = ["x86_64-linux"] name = "veloren-nix" key = "veloren-nix.cachix.org-1:zokfKJqVsNV6kI/oJdLF6TYBdNPYGSb+diMVQPn/5Rc=" +[workspace.metadata.nix.crateOverride.veloren-network] +buildInputs = ["openssl"] +nativeBuildInputs = ["pkg-config"] + [patch.crates-io] vek = { git = "https://github.com/yoanlcq/vek.git", rev = "84d5cb65841d46599a986c5477341bea4456be26" } # patch wgpu so we can use wgpu-profiler crate diff --git a/common/src/util/mod.rs b/common/src/util/mod.rs index ddbc9fb10d..3aafea07cd 100644 --- a/common/src/util/mod.rs +++ b/common/src/util/mod.rs @@ -8,21 +8,11 @@ pub mod projection; /// entities mod spatial_grid; -pub const GIT_VERSION_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/githash")); -pub const GIT_TAG_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag")); +pub const GIT_VERSION: &str = include_str!(concat!(env!("OUT_DIR"), "/githash")); +pub const GIT_TAG: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag")); pub const VELOREN_VERSION_STAGE: &str = "Pre-Alpha"; lazy_static::lazy_static! { - pub static ref GIT_VERSION: String = if GIT_VERSION_BUILD.is_empty() { - std::env::var("VELOREN_GIT_VERSION").expect("failed to get git version") - } else { - GIT_VERSION_BUILD.to_string() - }; - pub static ref GIT_TAG: String = if GIT_TAG_BUILD.is_empty() { - std::env::var("VELOREN_GIT_TAG").expect("failed to get git tag") - } else { - GIT_TAG_BUILD.to_string() - }; pub static ref GIT_HASH: &'static str = GIT_VERSION.split('/').next().expect("failed to retrieve git_hash!"); static ref GIT_DATETIME: &'static str = GIT_VERSION.split('/').nth(1).expect("failed to retrieve git_datetime!"); pub static ref GIT_DATE: String = GIT_DATETIME.split('-').take(3).collect::>().join("-"); @@ -30,12 +20,12 @@ lazy_static::lazy_static! { pub static ref DISPLAY_VERSION: String = if GIT_TAG.is_empty() { format!("{}-{}", VELOREN_VERSION_STAGE, *GIT_DATE) } else { - format!("{}-{}", VELOREN_VERSION_STAGE, GIT_TAG.as_str()) + format!("{}-{}", VELOREN_VERSION_STAGE, GIT_TAG) }; pub static ref DISPLAY_VERSION_LONG: String = if GIT_TAG.is_empty() { format!("{} ({})", DISPLAY_VERSION.as_str(), *GIT_HASH) } else { - format!("{} ({})", DISPLAY_VERSION.as_str(), GIT_VERSION.as_str()) + format!("{} ({})", DISPLAY_VERSION.as_str(), GIT_VERSION) }; } diff --git a/flake.lock b/flake.lock index d769ed60d5..196d6d02bb 100644 --- a/flake.lock +++ b/flake.lock @@ -1,29 +1,12 @@ { "nodes": { - "crane": { - "flake": false, - "locked": { - "lastModified": 1661875961, - "narHash": "sha256-f1h/2c6Teeu1ofAHWzrS8TwBPcnN+EEu+z1sRVmMQTk=", - "owner": "ipetkov", - "repo": "crane", - "rev": "d9f394e4e20e97c2a60c3ad82c2b6ef99be19e24", - "type": "github" - }, - "original": { - "owner": "ipetkov", - "repo": "crane", - "type": "github" - } - }, "devshell": { - "flake": false, "locked": { - "lastModified": 1660811669, - "narHash": "sha256-V6lmsaLNFz41myppL0yxglta92ijkSvpZ+XVygAh+bU=", + "lastModified": 1625086391, + "narHash": "sha256-IpNPv1v8s4L3CoxhwcgZIitGpcrnNgnj09X7TA0QV3k=", "owner": "numtide", "repo": "devshell", - "rev": "c2feacb46ee69949124c835419861143c4016fb5", + "rev": "4b5ac7cf7d9a1cc60b965bb51b59922f2210cbc7", "type": "github" }, "original": { @@ -32,69 +15,20 @@ "type": "github" } }, - "dream2nix": { - "inputs": { - "alejandra": [ - "nci", - "nixpkgs" - ], - "crane": "crane", - "devshell": [ - "nci", - "devshell" - ], - "flake-utils-pre-commit": [ - "nci", - "nixpkgs" - ], - "gomod2nix": [ - "nci", - "nixpkgs" - ], - "mach-nix": [ - "nci", - "nixpkgs" - ], - "nixpkgs": [ - "nci", - "nixpkgs" - ], - "poetry2nix": [ - "nci", - "nixpkgs" - ], - "pre-commit-hooks": [ - "nci", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1662507674, - "narHash": "sha256-vnXfje4pfTqDEqI837GCT+hNKqzfVwPen++gnLVO9F0=", - "owner": "nix-community", - "repo": "dream2nix", - "rev": "5ba9061857e3e265538c9785bb56bda2bb8f9bca", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "dream2nix", - "type": "github" - } - }, - "nci": { + "nixCargoIntegration": { "inputs": { "devshell": "devshell", - "dream2nix": "dream2nix", - "nixpkgs": "nixpkgs", - "rust-overlay": "rust-overlay" + "nixpkgs": [ + "nixpkgs" + ], + "rustOverlay": "rustOverlay" }, "locked": { - "lastModified": 1662507702, - "narHash": "sha256-Q8zfpLNCJublP7t4oHizr5tgsCS4BHFk7Fc7wzWbrzE=", + "lastModified": 1627940369, + "narHash": "sha256-KtY837WKsX9B/pIKFDKzN0wl1t3et1JZjMjGa7SAZxI=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "97aa58c683ccf628175118052b3306f40ac21ca0", + "rev": "fac8518469e226db4805ff80788979c847b0c322", "type": "github" }, "original": { @@ -105,33 +39,34 @@ }, "nixpkgs": { "locked": { - "lastModified": 1662019588, - "narHash": "sha256-oPEjHKGGVbBXqwwL+UjsveJzghWiWV0n9ogo1X6l4cw=", + "lastModified": 1627814220, + "narHash": "sha256-P+MDgdZw2CBk9X1ZZaUgHgN+32pTfLFf3XVIBOXirI4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2da64a81275b68fdad38af669afeda43d401e94b", + "rev": "ab5b6828af26215bf2646c31961da5d3749591ef", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "root": { "inputs": { - "nci": "nci" + "nixCargoIntegration": "nixCargoIntegration", + "nixpkgs": "nixpkgs" } }, - "rust-overlay": { + "rustOverlay": { "flake": false, "locked": { - "lastModified": 1662433378, - "narHash": "sha256-DqMtTtIownl+UIPG1O917IH10UF0Hwql636p22vOJfw=", + "lastModified": 1627870491, + "narHash": "sha256-0Myg04QOIcTN1RhgfRNx0i/iCRyVyf/Z6rJxZUmot5k=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "12aa8ea4381b28b7a3118f96682dc3ffb13fb6b6", + "rev": "71d825269cfaa30605d058bd92381be9af87b0be", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index e584466f7b..8f121f9fda 100644 --- a/flake.nix +++ b/flake.nix @@ -1,205 +1,112 @@ { description = "Flake providing Veloren, a multiplayer voxel RPG written in Rust."; - inputs.nci.url = "github:yusdacra/nix-cargo-integration"; - - outputs = inputs: let - lib = inputs.nci.inputs.nixpkgs.lib; - ncl = inputs.nci.lib.nci-lib; - - git = let - sourceInfo = inputs.self.sourceInfo; - dateTimeFormat = import ./nix/dateTimeFormat.nix; - dateTime = dateTimeFormat sourceInfo.lastModified; - shortRev = sourceInfo.shortRev or "dirty"; - in { - prettyRev = shortRev + "/" + dateTime; - tag = ""; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + nixCargoIntegration = { + url = "github:yusdacra/nix-cargo-integration"; + inputs.nixpkgs.follows = "nixpkgs"; }; + }; - filteredSource = let - pathsToIgnore = [ - "flake.nix" - "flake.lock" - "nix" - "assets" - "README.md" - "CONTRIBUTING.md" - "CHANGELOG.md" - "CODE_OF_CONDUCT.md" - "clippy.toml" - ".cargo" - ]; - ignorePaths = path: type: let - split = lib.splitString "/" path; - actual = lib.drop 4 split; - _path = lib.concatStringsSep "/" actual; - in - lib.all (n: ! (lib.hasPrefix n _path)) pathsToIgnore; - in - builtins.path { - name = "veloren-source"; - path = toString ./.; - # filter out unnecessary paths - filter = ignorePaths; - }; - - wrapWithAssets = common: _: old: let - pkgs = common.pkgs; - runtimeLibs = with pkgs; [ - xorg.libX11 - xorg.libXi - xorg.libxcb - xorg.libXcursor - xorg.libXrandr - libxkbcommon - shaderc.lib - udev - alsa-lib - vulkan-loader - ]; - assets = pkgs.runCommand "veloren-assets" {} '' - mkdir $out - ln -sf ${./assets} $out/assets - # check if LFS was setup properly - checkFile="$out/assets/voxygen/background/bg_main.jpg" - result="$(${pkgs.file}/bin/file --mime-type $checkFile)" - if [ "$result" = "$checkFile: image/jpeg" ]; then - echo "Git LFS seems to be setup properly." - else - echo " - Git Large File Storage (git-lfs) has not been set up correctly. - Most common reasons: - - git-lfs was not installed before cloning this repository. - - This repository was not cloned from the primary GitLab mirror. - - The GitHub mirror does not support LFS. - See the book at https://book.veloren.net/ for details. - Run 'nix-shell -p git git-lfs --run \"git lfs install --local && git lfs fetch && git lfs checkout\"' - or 'nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c \"git lfs install --local && git lfs fetch && git lfs checkout\"'. - " - false - fi - ''; - wrapped = - common.internal.nci-pkgs.utils.wrapDerivation old - {nativeBuildInputs = [pkgs.makeWrapper];} - '' - rm -rf $out/bin - mkdir $out/bin - ln -sf ${old}/bin/* $out/bin/ - wrapProgram $out/bin/* \ - ${lib.optionalString (old.pname == "veloren-voxygen") "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs}"} \ - --set VELOREN_ASSETS ${assets} \ - --set VELOREN_GIT_VERSION "${git.prettyRev}" \ - --set VELOREN_GIT_TAG "${git.tag}" - ''; - in - wrapped; - in - inputs.nci.lib.makeOutputs { + outputs = inputs: + inputs.nixCargoIntegration.lib.makeOutputs { root = ./.; + buildPlatform = "crate2nix"; defaultOutputs = { package = "veloren-voxygen"; app = "veloren-voxygen"; }; - perCrateOverrides = { - veloren-voxygen = { - packageMetadata = _: { - features = rec { - release = ["default-publish"]; - debug = release; - test = release; + overrides = { + build = common: prev: { + runTests = !prev.release && prev.runTests; + rootFeatures = + if prev.release && common.cargoPkg.name == "veloren-voxygen" + then [ "default-publish" ] + else prev.rootFeatures; + }; + crateOverrides = common: prev: + let + pkgs = common.pkgs; + lib = common.lib; + + gitLfsCheckFile = ./assets/voxygen/background/bg_main.jpg; + utils = import ./nix/utils.nix { inherit pkgs; }; + + sourceInfo = + if inputs.self.sourceInfo ? rev + then inputs.self.sourceInfo // { + # Tag would have to be set manually for stable releases flake + # because there's currently no way to get the tag via the interface. + # tag = v0.9.0; + } + else (throw "Can't get revision because the git tree is dirty"); + + prettyRev = with sourceInfo; builtins.substring 0 8 rev + "/" + utils.dateTimeFormat lastModified; + + tag = with sourceInfo; + if sourceInfo ? tag + then sourceInfo.tag + else ""; + + # If gitTag has a tag (meaning the commit we are on is a *release*), use + # it as version, else: just use the prettified hash we have, if we don't + # have it the build fails. + # Must be in format f4987672/2020-12-10-12:00 + version = + if tag != "" then tag + else if prettyRev != "" then prettyRev + else throw "Need a tag or pretty revision in order to determine version"; + + veloren-assets = pkgs.runCommand "makeAssetsDir" { } '' + mkdir $out + ln -sf ${./assets} $out/assets + ''; + in + { + # veloren-world = oldAttrs: { + # crateBin = lib.filter (bin: bin.name != "chunk_compression_benchmarks") oldAttrs.crateBin; + # }; + veloren-client = oldAttrs: { + crateBin = lib.filter (bin: bin.name != "bot") oldAttrs.crateBin; + }; + veloren-voxygen-i18n = oldAttrs: { + crateBin = lib.filter (bin: bin.name != "i18n-check") oldAttrs.crateBin; + }; + veloren-common = oldAttrs: { + # Disable `git-lfs` check here since we check it ourselves + # We have to include the command output here, otherwise Nix won't run it + DISABLE_GIT_LFS_CHECK = utils.isGitLfsSetup gitLfsCheckFile; + # Declare env values here so that `common/build.rs` sees them + NIX_GIT_HASH = prettyRev; + NIX_GIT_TAG = tag; + crateBin = lib.filter (bin: bin.name != "csv_export" && bin.name != "csv_import" && bin.name != "recipe_graphviz") oldAttrs.crateBin; + }; + veloren-voxygen = oldAttrs: { + VELOREN_USERDATA_STRATEGY = "system"; + preConfigure = '' + substituteInPlace src/audio/soundcache.rs \ + --replace \ + "../../../assets/voxygen/audio/null.ogg" \ + "${./assets/voxygen/audio/null.ogg}" + ''; + postInstall = '' + if [ -f $out/bin/veloren-voxygen ]; then + wrapProgram $out/bin/veloren-voxygen \ + --set VELOREN_ASSETS ${veloren-assets} \ + --set LD_LIBRARY_PATH ${lib.makeLibraryPath common.runtimeLibs} + fi + ''; + }; + veloren-server-cli = oldAttrs: { + VELOREN_USERDATA_STRATEGY = "system"; + postInstall = '' + if [ -f $out/bin/veloren-server-cli ]; then + wrapProgram $out/bin/veloren-server-cli --set VELOREN_ASSETS ${veloren-assets} + fi + ''; }; }; - wrapper = wrapWithAssets; - }; - veloren-server-cli.wrapper = wrapWithAssets; - }; - disableVendoredCrateOverrides = true; - overrides = { - cCompiler = common: common.pkgs.clang; - crates = common: prev: let - pkgs = common.pkgs; - - configMoldLinker = '' - touch $CARGO_HOME/config.toml - cat >>$CARGO_HOME/config.toml <= 0 then z else z - 146096) / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = mp + (if mp < 10 then 3 else -9); - y' = y + (if m <= 2 then 1 else 0); - - pad = s: if builtins.stringLength s < 2 then "0" + s else s; -in "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}" diff --git a/nix/default.nix b/nix/default.nix index c940ee6407..29d4c3807f 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -3,5 +3,4 @@ url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; sha256 = "sha256:0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; }) - {src = ../.;}) -.defaultNix + { src = ../.; }).defaultNix diff --git a/nix/shell.nix b/nix/shell.nix index 812b45462a..c68e85b60e 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -3,5 +3,4 @@ url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; sha256 = "sha256:0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; }) - {src = ../.;}) -.shellNix + { src = ../.; }).shellNix diff --git a/nix/utils.nix b/nix/utils.nix new file mode 100644 index 0000000000..dd47bc3c21 --- /dev/null +++ b/nix/utils.nix @@ -0,0 +1,48 @@ +{ pkgs }: { + isGitLfsSetup = checkFile: + let + gitLfsCheckOutput = + builtins.readFile (pkgs.runCommand "gitLfsCheck" { } '' + ([ "$(${pkgs.file}/bin/file --mime-type ${checkFile})" = "${checkFile}: image/jpeg" ] && printf "0" || printf "1") > $out + ''); + in + if gitLfsCheckOutput == "0" then + true + else + abort '' + Git Large File Storage (`git-lfs`) has not been set up correctly. + Most common reasons: + - `git-lfs` was not installed before cloning this repository. + - This repository was not cloned from the primary GitLab mirror. + - The GitHub mirror does not support LFS. + See the book at https://book.veloren.net/ for details. + Run `nix-shell -p git git-lfs --run "git lfs install --local && git lfs fetch && git lfs checkout"` + or `nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c "git lfs install --local && git lfs fetch && git lfs checkout"`. + ''; + + # Format number of seconds in the Unix epoch as %Y-%m-%d-%H:%M. + dateTimeFormat = t: + let + rem = x: y: x - x / y * y; + days = t / 86400; + secondsInDay = rem t 86400; + hours = secondsInDay / 3600; + minutes = (rem secondsInDay 3600) / 60; + seconds = rem t 60; + + # Courtesy of https://stackoverflow.com/a/32158604. + z = days + 719468; + era = (if z >= 0 then z else z - 146096) / 146097; + doe = z - era * 146097; + yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + y = yoe + era * 400; + doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + mp = (5 * doy + 2) / 153; + d = doy - (153 * mp + 2) / 5 + 1; + m = mp + (if mp < 10 then 3 else -9); + y' = y + (if m <= 2 then 1 else 0); + + pad = s: if builtins.stringLength s < 2 then "0" + s else s; + in + "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}"; +} diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index 14d65eb8ff..e8b08ba855 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -18,6 +18,8 @@ It is inspired by games such as Cube World, Legend of Zelda: Breath of the Wild, This package includes the official client, Voxygen. """ +runtimeLibs = ["libGL", "xorg.libX11", "xorg.libXcursor", "xorg.libXrandr", "xorg.libXi", "vulkan-loader", "vulkan-extension-layer"] +buildInputs = ["xorg.libxcb"] [features] hot-anim = ["anim/use-dyn-lib"] From 58e74a26cda78741b395c356c29694e25629c763 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 8 Sep 2022 12:28:56 +0300 Subject: [PATCH 212/854] Revert "Merge branch 'revert-441acd3e' into 'master'" This reverts commit f170da4da6bb424c62846ab9aa4af04e698ebab6, reversing changes made to aa7569061b4721809d42efdc09412c0955f1262a. --- Cargo.toml | 4 - common/src/util/mod.rs | 18 ++- flake.lock | 107 ++++++++++++--- flake.nix | 289 +++++++++++++++++++++++++++-------------- nix/README.md | 7 +- nix/dateTimeFormat.nix | 21 +++ nix/default.nix | 3 +- nix/shell.nix | 3 +- nix/utils.nix | 48 ------- voxygen/Cargo.toml | 2 - 10 files changed, 319 insertions(+), 183 deletions(-) create mode 100644 nix/dateTimeFormat.nix delete mode 100644 nix/utils.nix diff --git a/Cargo.toml b/Cargo.toml index fec9ce5a35..ad93cf13cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -115,10 +115,6 @@ systems = ["x86_64-linux"] name = "veloren-nix" key = "veloren-nix.cachix.org-1:zokfKJqVsNV6kI/oJdLF6TYBdNPYGSb+diMVQPn/5Rc=" -[workspace.metadata.nix.crateOverride.veloren-network] -buildInputs = ["openssl"] -nativeBuildInputs = ["pkg-config"] - [patch.crates-io] vek = { git = "https://github.com/yoanlcq/vek.git", rev = "84d5cb65841d46599a986c5477341bea4456be26" } # patch wgpu so we can use wgpu-profiler crate diff --git a/common/src/util/mod.rs b/common/src/util/mod.rs index 3aafea07cd..ddbc9fb10d 100644 --- a/common/src/util/mod.rs +++ b/common/src/util/mod.rs @@ -8,11 +8,21 @@ pub mod projection; /// entities mod spatial_grid; -pub const GIT_VERSION: &str = include_str!(concat!(env!("OUT_DIR"), "/githash")); -pub const GIT_TAG: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag")); +pub const GIT_VERSION_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/githash")); +pub const GIT_TAG_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag")); pub const VELOREN_VERSION_STAGE: &str = "Pre-Alpha"; lazy_static::lazy_static! { + pub static ref GIT_VERSION: String = if GIT_VERSION_BUILD.is_empty() { + std::env::var("VELOREN_GIT_VERSION").expect("failed to get git version") + } else { + GIT_VERSION_BUILD.to_string() + }; + pub static ref GIT_TAG: String = if GIT_TAG_BUILD.is_empty() { + std::env::var("VELOREN_GIT_TAG").expect("failed to get git tag") + } else { + GIT_TAG_BUILD.to_string() + }; pub static ref GIT_HASH: &'static str = GIT_VERSION.split('/').next().expect("failed to retrieve git_hash!"); static ref GIT_DATETIME: &'static str = GIT_VERSION.split('/').nth(1).expect("failed to retrieve git_datetime!"); pub static ref GIT_DATE: String = GIT_DATETIME.split('-').take(3).collect::>().join("-"); @@ -20,12 +30,12 @@ lazy_static::lazy_static! { pub static ref DISPLAY_VERSION: String = if GIT_TAG.is_empty() { format!("{}-{}", VELOREN_VERSION_STAGE, *GIT_DATE) } else { - format!("{}-{}", VELOREN_VERSION_STAGE, GIT_TAG) + format!("{}-{}", VELOREN_VERSION_STAGE, GIT_TAG.as_str()) }; pub static ref DISPLAY_VERSION_LONG: String = if GIT_TAG.is_empty() { format!("{} ({})", DISPLAY_VERSION.as_str(), *GIT_HASH) } else { - format!("{} ({})", DISPLAY_VERSION.as_str(), GIT_VERSION) + format!("{} ({})", DISPLAY_VERSION.as_str(), GIT_VERSION.as_str()) }; } diff --git a/flake.lock b/flake.lock index 196d6d02bb..d769ed60d5 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,29 @@ { "nodes": { - "devshell": { + "crane": { + "flake": false, "locked": { - "lastModified": 1625086391, - "narHash": "sha256-IpNPv1v8s4L3CoxhwcgZIitGpcrnNgnj09X7TA0QV3k=", + "lastModified": 1661875961, + "narHash": "sha256-f1h/2c6Teeu1ofAHWzrS8TwBPcnN+EEu+z1sRVmMQTk=", + "owner": "ipetkov", + "repo": "crane", + "rev": "d9f394e4e20e97c2a60c3ad82c2b6ef99be19e24", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "devshell": { + "flake": false, + "locked": { + "lastModified": 1660811669, + "narHash": "sha256-V6lmsaLNFz41myppL0yxglta92ijkSvpZ+XVygAh+bU=", "owner": "numtide", "repo": "devshell", - "rev": "4b5ac7cf7d9a1cc60b965bb51b59922f2210cbc7", + "rev": "c2feacb46ee69949124c835419861143c4016fb5", "type": "github" }, "original": { @@ -15,20 +32,69 @@ "type": "github" } }, - "nixCargoIntegration": { + "dream2nix": { "inputs": { - "devshell": "devshell", - "nixpkgs": [ + "alejandra": [ + "nci", "nixpkgs" ], - "rustOverlay": "rustOverlay" + "crane": "crane", + "devshell": [ + "nci", + "devshell" + ], + "flake-utils-pre-commit": [ + "nci", + "nixpkgs" + ], + "gomod2nix": [ + "nci", + "nixpkgs" + ], + "mach-nix": [ + "nci", + "nixpkgs" + ], + "nixpkgs": [ + "nci", + "nixpkgs" + ], + "poetry2nix": [ + "nci", + "nixpkgs" + ], + "pre-commit-hooks": [ + "nci", + "nixpkgs" + ] }, "locked": { - "lastModified": 1627940369, - "narHash": "sha256-KtY837WKsX9B/pIKFDKzN0wl1t3et1JZjMjGa7SAZxI=", + "lastModified": 1662507674, + "narHash": "sha256-vnXfje4pfTqDEqI837GCT+hNKqzfVwPen++gnLVO9F0=", + "owner": "nix-community", + "repo": "dream2nix", + "rev": "5ba9061857e3e265538c9785bb56bda2bb8f9bca", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "dream2nix", + "type": "github" + } + }, + "nci": { + "inputs": { + "devshell": "devshell", + "dream2nix": "dream2nix", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1662507702, + "narHash": "sha256-Q8zfpLNCJublP7t4oHizr5tgsCS4BHFk7Fc7wzWbrzE=", "owner": "yusdacra", "repo": "nix-cargo-integration", - "rev": "fac8518469e226db4805ff80788979c847b0c322", + "rev": "97aa58c683ccf628175118052b3306f40ac21ca0", "type": "github" }, "original": { @@ -39,34 +105,33 @@ }, "nixpkgs": { "locked": { - "lastModified": 1627814220, - "narHash": "sha256-P+MDgdZw2CBk9X1ZZaUgHgN+32pTfLFf3XVIBOXirI4=", + "lastModified": 1662019588, + "narHash": "sha256-oPEjHKGGVbBXqwwL+UjsveJzghWiWV0n9ogo1X6l4cw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ab5b6828af26215bf2646c31961da5d3749591ef", + "rev": "2da64a81275b68fdad38af669afeda43d401e94b", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "root": { "inputs": { - "nixCargoIntegration": "nixCargoIntegration", - "nixpkgs": "nixpkgs" + "nci": "nci" } }, - "rustOverlay": { + "rust-overlay": { "flake": false, "locked": { - "lastModified": 1627870491, - "narHash": "sha256-0Myg04QOIcTN1RhgfRNx0i/iCRyVyf/Z6rJxZUmot5k=", + "lastModified": 1662433378, + "narHash": "sha256-DqMtTtIownl+UIPG1O917IH10UF0Hwql636p22vOJfw=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "71d825269cfaa30605d058bd92381be9af87b0be", + "rev": "12aa8ea4381b28b7a3118f96682dc3ffb13fb6b6", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 8f121f9fda..e584466f7b 100644 --- a/flake.nix +++ b/flake.nix @@ -1,112 +1,205 @@ { description = "Flake providing Veloren, a multiplayer voxel RPG written in Rust."; - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; - nixCargoIntegration = { - url = "github:yusdacra/nix-cargo-integration"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; + inputs.nci.url = "github:yusdacra/nix-cargo-integration"; - outputs = inputs: - inputs.nixCargoIntegration.lib.makeOutputs { + outputs = inputs: let + lib = inputs.nci.inputs.nixpkgs.lib; + ncl = inputs.nci.lib.nci-lib; + + git = let + sourceInfo = inputs.self.sourceInfo; + dateTimeFormat = import ./nix/dateTimeFormat.nix; + dateTime = dateTimeFormat sourceInfo.lastModified; + shortRev = sourceInfo.shortRev or "dirty"; + in { + prettyRev = shortRev + "/" + dateTime; + tag = ""; + }; + + filteredSource = let + pathsToIgnore = [ + "flake.nix" + "flake.lock" + "nix" + "assets" + "README.md" + "CONTRIBUTING.md" + "CHANGELOG.md" + "CODE_OF_CONDUCT.md" + "clippy.toml" + ".cargo" + ]; + ignorePaths = path: type: let + split = lib.splitString "/" path; + actual = lib.drop 4 split; + _path = lib.concatStringsSep "/" actual; + in + lib.all (n: ! (lib.hasPrefix n _path)) pathsToIgnore; + in + builtins.path { + name = "veloren-source"; + path = toString ./.; + # filter out unnecessary paths + filter = ignorePaths; + }; + + wrapWithAssets = common: _: old: let + pkgs = common.pkgs; + runtimeLibs = with pkgs; [ + xorg.libX11 + xorg.libXi + xorg.libxcb + xorg.libXcursor + xorg.libXrandr + libxkbcommon + shaderc.lib + udev + alsa-lib + vulkan-loader + ]; + assets = pkgs.runCommand "veloren-assets" {} '' + mkdir $out + ln -sf ${./assets} $out/assets + # check if LFS was setup properly + checkFile="$out/assets/voxygen/background/bg_main.jpg" + result="$(${pkgs.file}/bin/file --mime-type $checkFile)" + if [ "$result" = "$checkFile: image/jpeg" ]; then + echo "Git LFS seems to be setup properly." + else + echo " + Git Large File Storage (git-lfs) has not been set up correctly. + Most common reasons: + - git-lfs was not installed before cloning this repository. + - This repository was not cloned from the primary GitLab mirror. + - The GitHub mirror does not support LFS. + See the book at https://book.veloren.net/ for details. + Run 'nix-shell -p git git-lfs --run \"git lfs install --local && git lfs fetch && git lfs checkout\"' + or 'nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c \"git lfs install --local && git lfs fetch && git lfs checkout\"'. + " + false + fi + ''; + wrapped = + common.internal.nci-pkgs.utils.wrapDerivation old + {nativeBuildInputs = [pkgs.makeWrapper];} + '' + rm -rf $out/bin + mkdir $out/bin + ln -sf ${old}/bin/* $out/bin/ + wrapProgram $out/bin/* \ + ${lib.optionalString (old.pname == "veloren-voxygen") "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs}"} \ + --set VELOREN_ASSETS ${assets} \ + --set VELOREN_GIT_VERSION "${git.prettyRev}" \ + --set VELOREN_GIT_TAG "${git.tag}" + ''; + in + wrapped; + in + inputs.nci.lib.makeOutputs { root = ./.; - buildPlatform = "crate2nix"; defaultOutputs = { package = "veloren-voxygen"; app = "veloren-voxygen"; }; - overrides = { - build = common: prev: { - runTests = !prev.release && prev.runTests; - rootFeatures = - if prev.release && common.cargoPkg.name == "veloren-voxygen" - then [ "default-publish" ] - else prev.rootFeatures; - }; - crateOverrides = common: prev: - let - pkgs = common.pkgs; - lib = common.lib; - - gitLfsCheckFile = ./assets/voxygen/background/bg_main.jpg; - utils = import ./nix/utils.nix { inherit pkgs; }; - - sourceInfo = - if inputs.self.sourceInfo ? rev - then inputs.self.sourceInfo // { - # Tag would have to be set manually for stable releases flake - # because there's currently no way to get the tag via the interface. - # tag = v0.9.0; - } - else (throw "Can't get revision because the git tree is dirty"); - - prettyRev = with sourceInfo; builtins.substring 0 8 rev + "/" + utils.dateTimeFormat lastModified; - - tag = with sourceInfo; - if sourceInfo ? tag - then sourceInfo.tag - else ""; - - # If gitTag has a tag (meaning the commit we are on is a *release*), use - # it as version, else: just use the prettified hash we have, if we don't - # have it the build fails. - # Must be in format f4987672/2020-12-10-12:00 - version = - if tag != "" then tag - else if prettyRev != "" then prettyRev - else throw "Need a tag or pretty revision in order to determine version"; - - veloren-assets = pkgs.runCommand "makeAssetsDir" { } '' - mkdir $out - ln -sf ${./assets} $out/assets - ''; - in - { - # veloren-world = oldAttrs: { - # crateBin = lib.filter (bin: bin.name != "chunk_compression_benchmarks") oldAttrs.crateBin; - # }; - veloren-client = oldAttrs: { - crateBin = lib.filter (bin: bin.name != "bot") oldAttrs.crateBin; - }; - veloren-voxygen-i18n = oldAttrs: { - crateBin = lib.filter (bin: bin.name != "i18n-check") oldAttrs.crateBin; - }; - veloren-common = oldAttrs: { - # Disable `git-lfs` check here since we check it ourselves - # We have to include the command output here, otherwise Nix won't run it - DISABLE_GIT_LFS_CHECK = utils.isGitLfsSetup gitLfsCheckFile; - # Declare env values here so that `common/build.rs` sees them - NIX_GIT_HASH = prettyRev; - NIX_GIT_TAG = tag; - crateBin = lib.filter (bin: bin.name != "csv_export" && bin.name != "csv_import" && bin.name != "recipe_graphviz") oldAttrs.crateBin; - }; - veloren-voxygen = oldAttrs: { - VELOREN_USERDATA_STRATEGY = "system"; - preConfigure = '' - substituteInPlace src/audio/soundcache.rs \ - --replace \ - "../../../assets/voxygen/audio/null.ogg" \ - "${./assets/voxygen/audio/null.ogg}" - ''; - postInstall = '' - if [ -f $out/bin/veloren-voxygen ]; then - wrapProgram $out/bin/veloren-voxygen \ - --set VELOREN_ASSETS ${veloren-assets} \ - --set LD_LIBRARY_PATH ${lib.makeLibraryPath common.runtimeLibs} - fi - ''; - }; - veloren-server-cli = oldAttrs: { - VELOREN_USERDATA_STRATEGY = "system"; - postInstall = '' - if [ -f $out/bin/veloren-server-cli ]; then - wrapProgram $out/bin/veloren-server-cli --set VELOREN_ASSETS ${veloren-assets} - fi - ''; + perCrateOverrides = { + veloren-voxygen = { + packageMetadata = _: { + features = rec { + release = ["default-publish"]; + debug = release; + test = release; }; }; + wrapper = wrapWithAssets; + }; + veloren-server-cli.wrapper = wrapWithAssets; + }; + disableVendoredCrateOverrides = true; + overrides = { + cCompiler = common: common.pkgs.clang; + crates = common: prev: let + pkgs = common.pkgs; + + configMoldLinker = '' + touch $CARGO_HOME/config.toml + cat >>$CARGO_HOME/config.toml <= 0 then z else z - 146096) / 146097; + doe = z - era * 146097; + yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + y = yoe + era * 400; + doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + mp = (5 * doy + 2) / 153; + d = doy - (153 * mp + 2) / 5 + 1; + m = mp + (if mp < 10 then 3 else -9); + y' = y + (if m <= 2 then 1 else 0); + + pad = s: if builtins.stringLength s < 2 then "0" + s else s; +in "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}" diff --git a/nix/default.nix b/nix/default.nix index 29d4c3807f..c940ee6407 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -3,4 +3,5 @@ url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; sha256 = "sha256:0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; }) - { src = ../.; }).defaultNix + {src = ../.;}) +.defaultNix diff --git a/nix/shell.nix b/nix/shell.nix index c68e85b60e..812b45462a 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -3,4 +3,5 @@ url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; sha256 = "sha256:0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; }) - { src = ../.; }).shellNix + {src = ../.;}) +.shellNix diff --git a/nix/utils.nix b/nix/utils.nix deleted file mode 100644 index dd47bc3c21..0000000000 --- a/nix/utils.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ pkgs }: { - isGitLfsSetup = checkFile: - let - gitLfsCheckOutput = - builtins.readFile (pkgs.runCommand "gitLfsCheck" { } '' - ([ "$(${pkgs.file}/bin/file --mime-type ${checkFile})" = "${checkFile}: image/jpeg" ] && printf "0" || printf "1") > $out - ''); - in - if gitLfsCheckOutput == "0" then - true - else - abort '' - Git Large File Storage (`git-lfs`) has not been set up correctly. - Most common reasons: - - `git-lfs` was not installed before cloning this repository. - - This repository was not cloned from the primary GitLab mirror. - - The GitHub mirror does not support LFS. - See the book at https://book.veloren.net/ for details. - Run `nix-shell -p git git-lfs --run "git lfs install --local && git lfs fetch && git lfs checkout"` - or `nix shell nixpkgs#git-lfs nixpkgs#git -c sh -c "git lfs install --local && git lfs fetch && git lfs checkout"`. - ''; - - # Format number of seconds in the Unix epoch as %Y-%m-%d-%H:%M. - dateTimeFormat = t: - let - rem = x: y: x - x / y * y; - days = t / 86400; - secondsInDay = rem t 86400; - hours = secondsInDay / 3600; - minutes = (rem secondsInDay 3600) / 60; - seconds = rem t 60; - - # Courtesy of https://stackoverflow.com/a/32158604. - z = days + 719468; - era = (if z >= 0 then z else z - 146096) / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = mp + (if mp < 10 then 3 else -9); - y' = y + (if m <= 2 then 1 else 0); - - pad = s: if builtins.stringLength s < 2 then "0" + s else s; - in - "${toString y'}-${pad (toString m)}-${pad (toString d)}-${pad (toString hours)}:${pad (toString minutes)}"; -} diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index e8b08ba855..14d65eb8ff 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -18,8 +18,6 @@ It is inspired by games such as Cube World, Legend of Zelda: Breath of the Wild, This package includes the official client, Voxygen. """ -runtimeLibs = ["libGL", "xorg.libX11", "xorg.libXcursor", "xorg.libXrandr", "xorg.libXi", "vulkan-loader", "vulkan-extension-layer"] -buildInputs = ["xorg.libxcb"] [features] hot-anim = ["anim/use-dyn-lib"] From 812298cb632a5edc30abab052f05b396f79b59c1 Mon Sep 17 00:00:00 2001 From: Yusuf Bera Ertan Date: Thu, 8 Sep 2022 12:29:17 +0300 Subject: [PATCH 213/854] fix: default to build detected git version / tag if we can't get runtime variables --- common/src/util/mod.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/common/src/util/mod.rs b/common/src/util/mod.rs index ddbc9fb10d..ffb62ca4d7 100644 --- a/common/src/util/mod.rs +++ b/common/src/util/mod.rs @@ -13,16 +13,10 @@ pub const GIT_TAG_BUILD: &str = include_str!(concat!(env!("OUT_DIR"), "/gittag") pub const VELOREN_VERSION_STAGE: &str = "Pre-Alpha"; lazy_static::lazy_static! { - pub static ref GIT_VERSION: String = if GIT_VERSION_BUILD.is_empty() { - std::env::var("VELOREN_GIT_VERSION").expect("failed to get git version") - } else { - GIT_VERSION_BUILD.to_string() - }; - pub static ref GIT_TAG: String = if GIT_TAG_BUILD.is_empty() { - std::env::var("VELOREN_GIT_TAG").expect("failed to get git tag") - } else { - GIT_TAG_BUILD.to_string() - }; + pub static ref GIT_VERSION: String = + std::env::var("VELOREN_GIT_VERSION").unwrap_or_else(|_| GIT_VERSION_BUILD.to_string()); + pub static ref GIT_TAG: String = + std::env::var("VELOREN_GIT_TAG").unwrap_or_else(|_| GIT_TAG_BUILD.to_string()); pub static ref GIT_HASH: &'static str = GIT_VERSION.split('/').next().expect("failed to retrieve git_hash!"); static ref GIT_DATETIME: &'static str = GIT_VERSION.split('/').nth(1).expect("failed to retrieve git_datetime!"); pub static ref GIT_DATE: String = GIT_DATETIME.split('-').take(3).collect::>().join("-"); From 5bb27d9292ffaa98f429919bc172b11fe6857052 Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Thu, 8 Sep 2022 04:00:46 -0700 Subject: [PATCH 214/854] Fix swallowed network error messages. --- voxygen/src/menu/main/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 8be7c547da..5cd3201780 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -415,7 +415,9 @@ fn get_client_msg_error( // and server version it is almost definitely due to this mismatch rather than // a true networking error. let net_error = |error: String, mismatched_server_info: Option| -> String { - if let Some(server_info) = mismatched_server_info { + if let Some(server_info) = + mismatched_server_info.filter(|info| info.git_hash != *common::util::GIT_HASH) + { format!( "{} {}: {} ({}) {}: {} ({})", localization.get_msg("main-login-network_wrong_version"), From d9e6f106886e59c95c7e55b2406dda2420ec9e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 8 Sep 2022 23:24:14 +0200 Subject: [PATCH 215/854] update dependencies --- Cargo.lock | 535 +++++++++++++++++++---------------- client/Cargo.toml | 4 +- client/src/bin/bot/tui.rs | 2 +- common/Cargo.toml | 4 +- common/assets/Cargo.toml | 2 +- common/frontend/Cargo.toml | 2 +- common/src/terrain/sprite.rs | 6 +- server-cli/Cargo.toml | 4 +- server/Cargo.toml | 4 +- voxygen/Cargo.toml | 10 +- voxygen/dynlib/Cargo.toml | 2 +- voxygen/i18n/Cargo.toml | 2 +- voxygen/src/scene/terrain.rs | 5 +- world/Cargo.toml | 8 +- world/src/all.rs | 4 +- world/src/sim/mod.rs | 5 +- 16 files changed, 326 insertions(+), 273 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e841742f6..7ac18ef6ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,6 +65,18 @@ dependencies = [ "version_check 0.9.4", ] +[[package]] +name = "ahash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e6e951cfbb2db8de1828d49073a113a29fd7117b1596caa781a258c7e38d72" +dependencies = [ + "cfg-if 1.0.0", + "getrandom 0.2.6", + "once_cell", + "version_check 0.9.4", +] + [[package]] name = "aho-corasick" version = "0.7.18" @@ -109,6 +121,15 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi-parser" version = "0.8.0" @@ -238,18 +259,18 @@ dependencies = [ [[package]] name = "assets_manager" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c53a8477ada5edbd6ba3b0698aabaa76b352454aedc8c8dca0c6328fc8313b7e" +checksum = "881c75fa0f271acf5440031d68d05398cea3e17dc8a418300839eaf0fed57cd2" dependencies = [ "ab_glyph", - "ahash 0.7.6", + "ahash 0.8.0", "bincode", "crossbeam-channel", "log", "notify", "parking_lot 0.12.0", - "ron 0.7.0", + "ron 0.8.0", "serde", "serde_json", ] @@ -316,7 +337,7 @@ source = "git+https://gitlab.com/veloren/auth.git?rev=fb3dcbc4962b367253f8f2f927 dependencies = [ "rand 0.8.5", "serde", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -333,7 +354,7 @@ dependencies = [ "rust-argon2", "serde", "serde_json", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -357,12 +378,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" - [[package]] name = "base64" version = "0.13.0" @@ -387,18 +402,14 @@ dependencies = [ "bitflags", "cexpr", "clang-sys", - "clap 2.34.0", - "env_logger", "lazy_static", "lazycell", - "log", "peeking_take_while", "proc-macro2 1.0.40", "quote 1.0.20", "regex", "rustc-hash", "shlex", - "which 3.1.1", ] [[package]] @@ -424,9 +435,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" -version = "0.22.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", "radium", @@ -615,15 +626,17 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", "time 0.1.44", + "wasm-bindgen", "winapi 0.3.9", ] @@ -946,16 +959,6 @@ dependencies = [ "x11-clipboard", ] -[[package]] -name = "core-foundation" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -dependencies = [ - "core-foundation-sys 0.6.2", - "libc", -] - [[package]] name = "core-foundation" version = "0.7.0" @@ -976,12 +979,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" - [[package]] name = "core-foundation-sys" version = "0.7.0" @@ -1076,18 +1073,43 @@ dependencies = [ "js-sys", "lazy_static", "libc", - "mach 0.3.2", + "mach", "ndk 0.6.0", "ndk-glue 0.6.1", "nix 0.23.1", "oboe", "parking_lot 0.11.2", - "stdweb 0.1.3", + "stdweb", "thiserror", "web-sys", "winapi 0.3.9", ] +[[package]] +name = "cpal" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d466b47cf0ea4100186a7c12d7d0166813dda7cf648553554c9c39c6324841b" +dependencies = [ + "alsa", + "core-foundation-sys 0.8.3", + "coreaudio-rs", + "jni", + "js-sys", + "libc", + "mach", + "ndk 0.7.0", + "ndk-context", + "nix 0.23.1", + "oboe", + "once_cell", + "parking_lot 0.12.0", + "stdweb", + "thiserror", + "web-sys", + "windows", +] + [[package]] name = "cpufeatures" version = "0.2.2" @@ -1328,9 +1350,9 @@ dependencies = [ [[package]] name = "crossterm" -version = "0.23.2" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17" +checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" dependencies = [ "bitflags", "crossterm_winapi 0.9.0", @@ -1579,12 +1601,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - [[package]] name = "discord-sdk" version = "0.3.0" @@ -1711,7 +1727,16 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" dependencies = [ - "enum-iterator-derive", + "enum-iterator-derive 0.7.0", +] + +[[package]] +name = "enum-iterator" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a0ac4aeb3a18f92eaf09c6bb9b3ac30ff61ca95514fc58cbead1c9a6bf5401" +dependencies = [ + "enum-iterator-derive 1.1.0", ] [[package]] @@ -1725,6 +1750,17 @@ dependencies = [ "syn 1.0.98", ] +[[package]] +name = "enum-iterator-derive" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce" +dependencies = [ + "proc-macro2 1.0.40", + "quote 1.0.20", + "syn 1.0.98", +] + [[package]] name = "enumset" version = "1.0.9" @@ -1747,19 +1783,6 @@ dependencies = [ "syn 1.0.98", ] -[[package]] -name = "env_logger" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "epaint" version = "0.12.0" @@ -2037,9 +2060,9 @@ dependencies = [ [[package]] name = "funty" -version = "1.2.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" @@ -2359,35 +2382,37 @@ dependencies = [ [[package]] name = "gilrs" -version = "0.8.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1550c8bdebc993576e343d600a954654708a9a1182396ee1e805d6fe60c72909" +checksum = "1d6ba7c37bf8ea7ba0c3e3795dfa1a7771b1e47c4bb417c4d27c7b338d79685f" dependencies = [ "fnv", "gilrs-core", "log", "serde", - "uuid", + "uuid 1.1.2", "vec_map", ] [[package]] name = "gilrs-core" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c7262ce1e88429c9b1d847820c9d2ba00adafc955218393d9c0861d5aaab88" +checksum = "96a8d94a7fc5afd27e894e08a4cfe5a49237f85bcc7140e90721bad3399c7d02" dependencies = [ - "core-foundation 0.6.4", + "core-foundation 0.9.3", "io-kit-sys", + "js-sys", "libc", "libudev-sys", "log", - "nix 0.23.1", + "nix 0.24.2", "rusty-xinput", "serde", - "stdweb 0.4.20", - "uuid", + "uuid 1.1.2", "vec_map", + "wasm-bindgen", + "web-sys", "winapi 0.3.9", ] @@ -2740,6 +2765,20 @@ dependencies = [ "webpki 0.21.4", ] +[[package]] +name = "iana-time-zone" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c495f162af0bf17656d0014a0eded5f3cd2f365fdd204548c2869db89359dc7" +dependencies = [ + "android_system_properties", + "core-foundation-sys 0.8.3", + "js-sys", + "once_cell", + "wasm-bindgen", + "winapi 0.3.9", +] + [[package]] name = "iced_core" version = "0.4.0" @@ -2890,6 +2929,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -2913,12 +2955,12 @@ dependencies = [ [[package]] name = "io-kit-sys" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21dcc74995dd4cd090b147e79789f8d65959cbfb5f0b118002db869ea3bd0a0" +checksum = "7789f7f3c9686f96164f5109d69152de759e76e284f736bd57661c6df5091919" dependencies = [ - "core-foundation-sys 0.6.2", - "mach 0.2.3", + "core-foundation-sys 0.8.3", + "mach", ] [[package]] @@ -2985,9 +3027,9 @@ checksum = "9478aa10f73e7528198d75109c8be5cd7d15fb530238040148d5f9a22d4c5b3b" [[package]] name = "js-sys" -version = "0.3.56" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" dependencies = [ "wasm-bindgen", ] @@ -3013,7 +3055,7 @@ dependencies = [ "winapi 0.3.9", "winit", "xcb 0.9.0", - "xkbcommon-sys 0.7.6", + "xkbcommon-sys", ] [[package]] @@ -3101,9 +3143,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.121" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "libloading" @@ -3254,15 +3296,6 @@ dependencies = [ "twox-hash", ] -[[package]] -name = "mach" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1" -dependencies = [ - "libc", -] - [[package]] name = "mach" version = "0.3.2" @@ -3388,22 +3421,28 @@ dependencies = [ [[package]] name = "minifb" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e52abe7ff0cb18cd88a6e9d7a91ca1ff74876587e7b6b1f30d1aeee9aa89aed" +checksum = "d9e21c5f89bb820c7878c300c5b944e65de0f1b2a75e0be92ce670b95943740e" dependencies = [ "cc", + "dlib 0.5.0", + "futures", + "instant", + "js-sys", + "lazy_static", "libc", "orbclient", "raw-window-handle 0.4.3", + "serde", + "serde_derive", "tempfile", + "wasm-bindgen-futures", "wayland-client 0.29.4", "wayland-cursor 0.29.4", "wayland-protocols 0.29.4", "winapi 0.3.9", "x11-dl", - "xkb", - "xkbcommon-sys 0.7.5", ] [[package]] @@ -3525,7 +3564,7 @@ dependencies = [ "raw-window-handle 0.4.3", "thiserror", "wfd", - "which 4.2.5", + "which", "winapi 0.3.9", ] @@ -3555,10 +3594,24 @@ dependencies = [ ] [[package]] -name = "ndk-context" -version = "0.1.0" +name = "ndk" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys 0.4.0", + "num_enum", + "raw-window-handle 0.5.0", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-glue" @@ -3630,6 +3683,15 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "ndk-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d83ec9c63ec5bf950200a8e508bdad6659972187b625469f58ef8c08e29046" +dependencies = [ + "jni-sys", +] + [[package]] name = "nibble_vec" version = "0.1.0" @@ -3689,6 +3751,17 @@ dependencies = [ "memoffset 0.6.5", ] +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "noise" version = "0.7.0" @@ -3731,9 +3804,9 @@ dependencies = [ [[package]] name = "notify" -version = "5.0.0-pre.15" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "553f9844ad0b0824605c20fb55a661679782680410abfb1a8144c2e7e437e7a7" +checksum = "ed2c66da08abae1c024c01d635253e402341b4060a12e99b31c7594063bf490a" dependencies = [ "bitflags", "crossbeam-channel", @@ -4457,7 +4530,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d" dependencies = [ "profiling-procmacros", - "tracy-client", + "tracy-client 0.13.2", ] [[package]] @@ -4599,9 +4672,9 @@ dependencies = [ [[package]] name = "radium" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "radix_trie" @@ -4727,6 +4800,15 @@ dependencies = [ "cty", ] +[[package]] +name = "raw-window-handle" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" +dependencies = [ + "cty", +] + [[package]] name = "rayon" version = "1.5.1" @@ -4876,7 +4958,7 @@ checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" dependencies = [ "bitflags", "libc", - "mach 0.3.2", + "mach", "winapi 0.3.9", ] @@ -4950,7 +5032,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0939e9f626e6c6f1989adb6226a039c855ca483053f0ee7c98b90e41cf731e" dependencies = [ - "cpal", + "cpal 0.13.5", "lewton", ] @@ -4976,6 +5058,17 @@ dependencies = [ "serde", ] +[[package]] +name = "ron" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" +dependencies = [ + "base64", + "bitflags", + "serde", +] + [[package]] name = "roots" version = "0.0.6" @@ -5204,9 +5297,9 @@ dependencies = [ [[package]] name = "rustyline" -version = "9.1.2" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" +checksum = "1d1cd5ae51d3f7bf65d7969d579d502168ef578f289452bd8ccc91de28fda20e" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -5216,10 +5309,9 @@ dependencies = [ "libc", "log", "memchr", - "nix 0.23.1", + "nix 0.24.2", "radix_trie", "scopeguard", - "smallvec", "unicode-segmentation", "unicode-width", "utf8parse", @@ -5425,21 +5517,6 @@ dependencies = [ "syn 1.0.98", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sha2" version = "0.10.2" @@ -5759,57 +5836,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "serde", - "serde_json", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "serde", - "serde_derive", - "syn 1.0.98", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2 1.0.40", - "quote 1.0.20", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn 1.0.98", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "storage-map" version = "0.3.0" @@ -6239,13 +6265,13 @@ dependencies = [ [[package]] name = "tracing-tracy" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a42311a35ed976d72f359de43e9fe028ec9d9f1051c4c52bd05a4f66ff3cbf" +checksum = "ed3ebef1f9f0d00aaa29239537effef65b82c56040c680f540fc6cedfac7b230" dependencies = [ "tracing-core", "tracing-subscriber", - "tracy-client", + "tracy-client 0.14.0", ] [[package]] @@ -6259,6 +6285,17 @@ dependencies = [ "tracy-client-sys", ] +[[package]] +name = "tracy-client" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f901ea566c34f5fdc987962495ebfea20c18d781e271967edcc0f9897e339815" +dependencies = [ + "loom", + "once_cell", + "tracy-client-sys", +] + [[package]] name = "tracy-client-sys" version = "0.17.0" @@ -6449,6 +6486,12 @@ dependencies = [ "serde", ] +[[package]] +name = "uuid" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" + [[package]] name = "valuable" version = "0.1.0" @@ -6507,7 +6550,7 @@ dependencies = [ "num 0.4.0", "quinn", "rayon", - "ron 0.7.0", + "ron 0.8.0", "rustyline", "serde", "specs", @@ -6540,7 +6583,7 @@ dependencies = [ "crossbeam-utils 0.8.8", "csv", "dot_vox", - "enum-iterator", + "enum-iterator 1.1.3", "fxhash", "hashbrown 0.12.0", "indexmap", @@ -6566,7 +6609,7 @@ dependencies = [ "strum", "tracing", "tracing-subscriber", - "uuid", + "uuid 0.8.2", "vek 0.15.8", "veloren-common-assets", "veloren-common-base", @@ -6580,7 +6623,7 @@ dependencies = [ "dot_vox", "image", "lazy_static", - "ron 0.7.0", + "ron 0.8.0", "serde", "tracing", "walkdir 2.3.2", @@ -6593,7 +6636,7 @@ version = "0.10.0" dependencies = [ "directories-next", "tracing", - "tracy-client", + "tracy-client 0.13.2", ] [[package]] @@ -6783,7 +6826,7 @@ dependencies = [ "rand_distr", "rayon", "refinery", - "ron 0.7.0", + "ron 0.8.0", "rusqlite", "rustls 0.20.4", "rustls-pemfile 1.0.0", @@ -6812,11 +6855,11 @@ version = "0.13.0" dependencies = [ "ansi-parser", "clap 3.2.20", - "crossterm 0.23.2", + "crossterm 0.25.0", "lazy_static", "mimalloc", "num_cpus", - "ron 0.7.0", + "ron 0.8.0", "serde", "shell-words", "signal-hook 0.3.13", @@ -6845,7 +6888,7 @@ dependencies = [ "conrod_core", "conrod_winit", "copy_dir", - "cpal", + "cpal 0.14.0", "criterion", "crossbeam-channel", "crossbeam-utils 0.8.8", @@ -6856,7 +6899,7 @@ dependencies = [ "egui", "egui_wgpu_backend", "egui_winit_platform", - "enum-iterator", + "enum-iterator 1.1.3", "etagere", "euc", "gilrs", @@ -6881,7 +6924,7 @@ dependencies = [ "rand_chacha 0.3.1", "rayon", "rodio", - "ron 0.7.0", + "ron 0.8.0", "serde", "shaderc", "slab", @@ -6970,7 +7013,7 @@ dependencies = [ "fluent-syntax", "hashbrown 0.12.0", "intl-memoizer", - "ron 0.7.0", + "ron 0.8.0", "serde", "tracing", "unic-langid", @@ -6988,7 +7031,7 @@ dependencies = [ "criterion", "csv", "deflate", - "enum-iterator", + "enum-iterator 1.1.3", "fallible-iterator", "flate2", "fxhash", @@ -7007,7 +7050,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rayon", - "ron 0.7.0", + "ron 0.8.0", "rstar", "rusqlite", "serde", @@ -7092,9 +7135,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.79" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -7102,13 +7145,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.79" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2 1.0.40", "quote 1.0.20", "syn 1.0.98", @@ -7129,9 +7172,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.79" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" dependencies = [ "quote 1.0.20", "wasm-bindgen-macro-support", @@ -7139,9 +7182,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.79" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" dependencies = [ "proc-macro2 1.0.40", "quote 1.0.20", @@ -7152,9 +7195,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.79" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" [[package]] name = "wasmer" @@ -7263,7 +7306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccd7fdc60e252a795c849b3f78a81a134783051407e7e279c10b7019139ef8dc" dependencies = [ "cfg-if 1.0.0", - "enum-iterator", + "enum-iterator 0.7.0", "enumset", "leb128", "libloading 0.7.3", @@ -7278,7 +7321,7 @@ dependencies = [ "wasmer-object", "wasmer-types", "wasmer-vm", - "which 4.2.5", + "which", ] [[package]] @@ -7288,7 +7331,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcff0cd2c01a8de6009fd863b14ea883132a468a24f2d2ee59dc34453d3a31b5" dependencies = [ "cfg-if 1.0.0", - "enum-iterator", + "enum-iterator 0.7.0", "enumset", "leb128", "loupe", @@ -7335,7 +7378,7 @@ dependencies = [ "backtrace", "cc", "cfg-if 1.0.0", - "enum-iterator", + "enum-iterator 0.7.0", "indexmap", "libc", "loupe", @@ -7639,15 +7682,6 @@ dependencies = [ "serde", ] -[[package]] -name = "which" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" -dependencies = [ - "libc", -] - [[package]] name = "which" version = "4.2.5" @@ -7725,6 +7759,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + [[package]] name = "windows-sys" version = "0.30.0" @@ -7763,6 +7810,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + [[package]] name = "windows_i686_gnu" version = "0.30.0" @@ -7775,6 +7828,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + [[package]] name = "windows_i686_msvc" version = "0.30.0" @@ -7787,6 +7846,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + [[package]] name = "windows_x86_64_gnu" version = "0.30.0" @@ -7799,6 +7864,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + [[package]] name = "windows_x86_64_msvc" version = "0.30.0" @@ -7811,6 +7882,12 @@ version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + [[package]] name = "winit" version = "0.25.0" @@ -7873,9 +7950,9 @@ dependencies = [ [[package]] name = "wyz" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" dependencies = [ "tap", ] @@ -7966,28 +8043,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" -[[package]] -name = "xkb" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2" -dependencies = [ - "bitflags", - "libc", - "xkbcommon-sys 0.7.5", -] - -[[package]] -name = "xkbcommon-sys" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a001b79d45b0b4541c228a501177f2b35db976bf7ee3f7fce8fa2381554ab5" -dependencies = [ - "bindgen", - "libc", - "pkg-config", -] - [[package]] name = "xkbcommon-sys" version = "0.7.6" diff --git a/client/Cargo.toml b/client/Cargo.toml index d0de4c59ca..525d79f4c8 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -38,10 +38,10 @@ authc = { git = "https://gitlab.com/veloren/auth.git", rev = "fb3dcbc4962b367253 async-channel = { version = "1.6", optional = true } common-ecs = { package = "veloren-common-ecs", path = "../common/ecs", optional = true } serde = { version = "1.0", features = [ "rc", "derive" ], optional = true } -ron = { version = "0.7", default-features = false, optional = true } +ron = { version = "0.8", default-features = false, optional = true } clap = { version = "3.1.8", optional = true, features = ["color", "std"] } structopt = { version = "0.3.13", optional = true } -rustyline = { version = "9.0.0", optional = true } +rustyline = { version = "10.0.0", optional = true } ## logging termcolor = { version = "1.1", optional = true } common-frontend = { package = "veloren-common-frontend", path = "../common/frontend", optional = true } diff --git a/client/src/bin/bot/tui.rs b/client/src/bin/bot/tui.rs index 504a75333e..2a704e592a 100644 --- a/client/src/bin/bot/tui.rs +++ b/client/src/bin/bot/tui.rs @@ -26,7 +26,7 @@ impl Tui { let handle = thread::spawn(move || { thread::sleep(Duration::from_millis(20)); - let mut readline = rustyline::Editor::<()>::new(); + let mut readline = rustyline::Editor::<()>::new().unwrap(); while let Ok(cmd) = readline.readline("\n\nbotclient> ") { let keep_going = Self::process_command(&cmd, &mut commands_s); readline.add_history_entry(cmd); diff --git a/common/Cargo.toml b/common/Cargo.toml index e21c7c9b6f..e563ba27ed 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -26,9 +26,9 @@ common-base = { package = "veloren-common-base", path = "base" } serde = { version = "1.0.110", features = ["derive", "rc"] } # Util -enum-iterator = "0.7" +enum-iterator = "1.1.0" vek = { version = "0.15.8", features = ["serde"] } -chrono = "0.4" +chrono = "0.4.22" chrono-tz = "0.6" sha2 = "0.10" serde_json = "1.0.50" diff --git a/common/assets/Cargo.toml b/common/assets/Cargo.toml index f27cc9b57f..e32406915d 100644 --- a/common/assets/Cargo.toml +++ b/common/assets/Cargo.toml @@ -8,7 +8,7 @@ version = "0.10.0" [dependencies] lazy_static = "1.4.0" assets_manager = {version = "0.8.1", features = ["bincode", "ron", "json"]} -ron = { version = "0.7", default-features = false } +ron = { version = "0.8", default-features = false } dot_vox = "4.0" wavefront = "0.2" # TODO: Use vertex-colors branch when we have models that have them image = { version = "0.24", default-features = false, features = ["png"] } diff --git a/common/frontend/Cargo.toml b/common/frontend/Cargo.toml index e123a8ca7a..2cf82e68d9 100644 --- a/common/frontend/Cargo.toml +++ b/common/frontend/Cargo.toml @@ -19,4 +19,4 @@ tracing-log = "0.1.1" tracing-subscriber = { version = "0.3.7", default-features = false, features = ["env-filter", "fmt", "time", "ansi", "smallvec", "tracing-log"]} # Tracy -tracing-tracy = { version = "0.9.0", optional = true } +tracing-tracy = { version = "0.10.0", optional = true } diff --git a/common/src/terrain/sprite.rs b/common/src/terrain/sprite.rs index 14709accc8..881f3a0661 100644 --- a/common/src/terrain/sprite.rs +++ b/common/src/terrain/sprite.rs @@ -1,5 +1,5 @@ use crate::{comp::tool::ToolKind, lottery::LootSpec, make_case_elim}; -use enum_iterator::IntoEnumIterator; +use enum_iterator::Sequence; use hashbrown::HashMap; use lazy_static::lazy_static; use num_derive::FromPrimitive; @@ -17,7 +17,7 @@ make_case_elim!( PartialEq, Serialize, Deserialize, - IntoEnumIterator, + Sequence, FromPrimitive, )] #[repr(u8)] @@ -558,7 +558,7 @@ impl fmt::Display for SpriteKind { } lazy_static! { - pub static ref SPRITE_KINDS: HashMap = SpriteKind::into_enum_iter() + pub static ref SPRITE_KINDS: HashMap = enum_iterator::all::() .map(|sk| (sk.to_string(), sk)) .collect(); } diff --git a/server-cli/Cargo.toml b/server-cli/Cargo.toml index f3e23b5841..5dba0aa830 100644 --- a/server-cli/Cargo.toml +++ b/server-cli/Cargo.toml @@ -35,12 +35,12 @@ tokio = { version = "1.14", default-features = false, features = ["rt-multi-thre num_cpus = "1.0" ansi-parser = "0.8" clap = { version = "3.1.8", features = ["derive"] } -crossterm = "0.23" +crossterm = "0.25" lazy_static = "1" signal-hook = "0.3.6" shell-words = "1.0.0" tracing = { version = "0.1", default-features = false } -ron = {version = "0.7", default-features = false} +ron = {version = "0.8", default-features = false} serde = {version = "1.0", features = [ "rc", "derive" ]} [target.'cfg(windows)'.dependencies] diff --git a/server/Cargo.toml b/server/Cargo.toml index 1f4c91b95d..b59b5e3cc4 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -39,12 +39,12 @@ quinn = "0.8" rustls = { version = "0.20", default-features = false } rustls-pemfile = { version = "1", default-features = false } atomicwrites = "0.3.0" -chrono = { version = "0.4.19", features = ["serde"] } +chrono = { version = "0.4.22", features = ["serde"] } chrono-tz = { version = "0.6", features = ["serde"] } humantime = "2.1.0" itertools = "0.10" lazy_static = "1.4.0" -ron = { version = "0.7", default-features = false } +ron = { version = "0.8", default-features = false } serde = { version = "1.0.110", features = ["derive"] } serde_json = "1.0.50" rand = { version = "0.8", features = ["small_rng"] } diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index e8b08ba855..180eab04e1 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -86,7 +86,7 @@ specs = { version = "0.18", features = ["serde", "storage-event-control", "deriv vek = {version = "0.15.8", features = ["serde"]} # Controller -gilrs = {version = "0.8.0", features = ["serde-serialize"]} +gilrs = {version = "0.9.0", features = ["serde-serialize"]} # Singleplayer server = { package = "veloren-server", path = "../server", optional = true, default-features = false, features = ["worldgen"] } @@ -98,16 +98,16 @@ clap = { version = "3.2.20", features = ["derive"] } assets_manager = {version = "0.8", features = ["ab_glyph"]} backtrace = "0.3.40" bincode = "1.3.1" -chrono = { version = "0.4.19", features = ["serde"] } +chrono = { version = "0.4.22", features = ["serde"] } chumsky = "0.8" -cpal = "0.13" +cpal = "0.14" copy_dir = "0.1.2" crossbeam-utils = "0.8.1" crossbeam-channel = "0.5" # TODO: remove directories-next = "2.0" dot_vox = "4.0" -enum-iterator = "0.7" +enum-iterator = "1.1.0" guillotiere = "0.6.2" etagere = "0.2.7" hashbrown = {version = "0.12", features = ["rayon", "serde", "nightly"]} @@ -120,7 +120,7 @@ rand = "0.8" rand_chacha = "0.3" rayon = "1.5" rodio = {version = "0.15", default-features = false, features = ["vorbis"]} -ron = {version = "0.7", default-features = false} +ron = {version = "0.8", default-features = false} serde = {version = "1.0", features = [ "rc", "derive" ]} slab = "0.4.2" strum = { version = "0.24", features = ["derive"] } diff --git a/voxygen/dynlib/Cargo.toml b/voxygen/dynlib/Cargo.toml index 5eccc940d9..f8e301a5fd 100644 --- a/voxygen/dynlib/Cargo.toml +++ b/voxygen/dynlib/Cargo.toml @@ -7,5 +7,5 @@ edition = "2021" [dependencies] find_folder = {version = "0.3.0"} libloading = {version = "0.7"} -notify = {version = "5.0.0-pre.13"} +notify = {version = "5.0.0"} tracing = "0.1" diff --git a/voxygen/i18n/Cargo.toml b/voxygen/i18n/Cargo.toml index 7f69709878..2e0061c969 100644 --- a/voxygen/i18n/Cargo.toml +++ b/voxygen/i18n/Cargo.toml @@ -8,7 +8,7 @@ version = "0.13.0" [dependencies] # Assets common-assets = {package = "veloren-common-assets", path = "../../common/assets"} -ron = "0.7" +ron = "0.8" serde = { version = "1.0", features = ["derive"] } # Localization unic-langid = { version = "0.9"} diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 4112c07458..c6074c9f89 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -31,7 +31,6 @@ use common::{ use common_base::{prof_span, span}; use core::{f32, fmt::Debug, marker::PhantomData, time::Duration}; use crossbeam_channel as channel; -use enum_iterator::IntoEnumIterator; use guillotiere::AtlasAllocator; use hashbrown::HashMap; use serde::Deserialize; @@ -196,7 +195,7 @@ impl TryFrom>>> for SpriteSpec { mut map: HashMap>>, ) -> Result { let mut array = [(); 256].map(|()| None); - let sprites_missing = SpriteKind::into_enum_iter() + let sprites_missing = enum_iterator::all::() .filter(|kind| match map.remove(kind) { Some(config) => { array[*kind as usize] = config; @@ -454,7 +453,7 @@ impl SpriteRenderContext { ); let mut sprite_mesh = Mesh::new(); // NOTE: Tracks the start vertex of the next model to be meshed. - let sprite_data: HashMap<(SpriteKind, usize), _> = SpriteKind::into_enum_iter() + let sprite_data: HashMap<(SpriteKind, usize), _> = enum_iterator::all::() .filter_map(|kind| Some((kind, sprite_config.get(kind)?))) .flat_map(|(kind, sprite_config)| { sprite_config.variations.iter().enumerate().map( diff --git a/world/Cargo.toml b/world/Cargo.toml index 6706ae4b46..a1f5428df4 100644 --- a/world/Cargo.toml +++ b/world/Cargo.toml @@ -16,8 +16,8 @@ common_base = { package = "veloren-common-base", path = "../common/base"} common-net = { package = "veloren-common-net", path = "../common/net" } bincode = "1.3.1" -bitvec = "0.22" -enum-iterator = "0.7" +bitvec = "1.0.1" +enum-iterator = "1.1.3" fxhash = "0.2.1" image = { version = "0.24", default-features = false, features = ["png"] } itertools = "0.10" @@ -34,7 +34,7 @@ arr_macro = "0.1.2" packed_simd = { package = "packed_simd_2", version = "0.3.5", optional = true } rayon = "1.5" serde = { version = "1.0.110", features = ["derive"] } -ron = { version = "0.7", default-features = false } +ron = { version = "0.8", default-features = false } # inline_tweak = "1.0.2" kiddo = "0.2" @@ -53,7 +53,7 @@ common-frontend = { package = "veloren-common-frontend", path = "../common/front criterion = "0.3" csv = "1.1.3" tracing-subscriber = { version = "0.3.7", default-features = false, features = ["fmt", "time", "ansi", "smallvec", "env-filter"] } -minifb = "0.22" +minifb = "0.23" rusqlite = { version = "0.24.2", features = ["array", "vtab", "bundled", "trace"] } svg_fmt = "0.4" structopt = "0.3" diff --git a/world/src/all.rs b/world/src/all.rs index 6f28ce0e9a..d60aa0ccf8 100644 --- a/world/src/all.rs +++ b/world/src/all.rs @@ -1,9 +1,9 @@ use crate::util::math::close; -use enum_iterator::IntoEnumIterator; +use enum_iterator::Sequence; use std::ops::Range; use vek::Vec2; -#[derive(Copy, Clone, Debug, IntoEnumIterator)] +#[derive(Copy, Clone, Debug, Sequence)] pub enum ForestKind { Palm, Acacia, diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs index 736aeab529..90e148cad1 100644 --- a/world/src/sim/mod.rs +++ b/world/src/sim/mod.rs @@ -52,7 +52,6 @@ use common::{ vol::RectVolSize, }; use common_net::msg::WorldMapMsg; -use enum_iterator::IntoEnumIterator; use noise::{ BasicMulti, Billow, Fbm, HybridMulti, MultiFractal, NoiseFn, RangeFunction, RidgedMulti, Seedable, SuperSimplex, Worley, @@ -2234,7 +2233,7 @@ impl WorldSim { }; let env = chunk.get_environment(); Lottery::from( - ForestKind::into_enum_iter() + enum_iterator::all::() .enumerate() .map(|(i, fk)| { const CLUSTER_SIZE: f64 = 48.0; @@ -2547,7 +2546,7 @@ impl SimChunk { }, }; - ForestKind::into_enum_iter() + enum_iterator::all::() .max_by_key(|fk| (fk.proclivity(&env) * 10000.0) as u32) .unwrap() // Can't fail }, From f653c4f36ff291baa93be7850d87c6e1596f5d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 8 Sep 2022 23:43:11 +0200 Subject: [PATCH 216/854] run cargo update --- Cargo.lock | 1783 +++++++++++++++++++++++++++++----------------------- 1 file changed, 1008 insertions(+), 775 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7ac18ef6ab..667075b0f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,19 +4,19 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24606928a235e73cdef55a0c909719cadd72fce573e5713d58cb2952d8f5794c" +checksum = "04a9283dace1c41c265496614998d5b9c4a97b3eb770e804f007c5144bf03f2b" dependencies = [ "ab_glyph_rasterizer", - "owned_ttf_parser 0.15.0", + "owned_ttf_parser 0.15.2", ] [[package]] name = "ab_glyph_rasterizer" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e" +checksum = "363b9b88fad3af3be80bc8f762c9a3f9dfe906fd0327b8e92f1c12e5ae1b8bbb" [[package]] name = "addr2line" @@ -24,7 +24,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ - "gimli 0.26.1", + "gimli", ] [[package]] @@ -60,7 +60,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "once_cell", "version_check 0.9.4", ] @@ -72,16 +72,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57e6e951cfbb2db8de1828d49073a113a29fd7117b1596caa781a258c7e38d72" dependencies = [ "cfg-if 1.0.0", - "getrandom 0.2.6", + "getrandom 0.2.7", "once_cell", "version_check 0.9.4", ] [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" dependencies = [ "memchr", ] @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8" +checksum = "b9a8f622bcf6ff3df478e9deba3e03e4e04b300f8e6a139e192c05fa3490afc7" [[package]] name = "app_dirs2" @@ -211,8 +211,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0609c78bd572f4edc74310dfb63a01f5609d53fa8b4dd7c4d98aef3b3e8d72d1" dependencies = [ "proc-macro-hack", - "quote 1.0.20", - "syn 1.0.98", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -244,7 +244,7 @@ checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" dependencies = [ "generic-array 0.12.4", "generic-array 0.13.3", - "generic-array 0.14.5", + "generic-array 0.14.6", "stable_deref_trait", ] @@ -269,7 +269,7 @@ dependencies = [ "crossbeam-channel", "log", "notify", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "ron 0.8.0", "serde", "serde_json", @@ -277,9 +277,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +checksum = "e14485364214912d3b19cc3435dde4df66065127f05fa0d75c712f36f12c2f28" dependencies = [ "concurrent-queue", "event-listener", @@ -288,13 +288,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.53" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -303,6 +303,15 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9ff149ed9780025acfdb36862d35b28856bb693ceb451259a7164442f22fdc3" +[[package]] +name = "atomic-polyfill" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c041a8d9751a520ee19656232a18971f18946a7900f1520ee4400002244dd89" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic_refcell" version = "0.1.8" @@ -365,19 +374,34 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object", + "object 0.29.0", "rustc-demangle", ] +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +dependencies = [ + "rustc_version 0.2.3", +] + +[[package]] +name = "bare-metal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" + [[package]] name = "base64" version = "0.13.0" @@ -395,9 +419,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.56.0" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239" +checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" dependencies = [ "bitflags", "cexpr", @@ -405,8 +429,8 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "regex", "rustc-hash", "shlex", @@ -414,9 +438,9 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] @@ -427,6 +451,18 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit_field" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + [[package]] name = "bitflags" version = "1.3.2" @@ -464,11 +500,11 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ - "generic-array 0.14.5", + "generic-array 0.14.6", ] [[package]] @@ -485,15 +521,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" [[package]] name = "bytecheck" -version = "0.6.7" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" +checksum = "d11cac2c12b5adc6570dad2ee1b87eff4955dac476fe12d81e5fdd352e52406f" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -501,33 +537,33 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.7" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" +checksum = "13e576ebe98e605500b3c8041bb888e966653577172df6dd97398714eb30b9bf" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "bytemuck" -version = "1.9.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc" +checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562e382481975bc61d11275ac5e62a19abd00b0547d99516a415336f183dcd0e" +checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -538,9 +574,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" [[package]] name = "cache-padded" @@ -573,6 +609,12 @@ dependencies = [ "rustc_version 0.4.0", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" version = "1.0.73" @@ -599,11 +641,11 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cexpr" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom 5.1.2", + "nom 7.1.1", ] [[package]] @@ -642,9 +684,9 @@ dependencies = [ [[package]] name = "chrono-tz" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58549f1842da3080ce63002102d5bc954c7bc843d4f47818e642abdc36253552" +checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" dependencies = [ "chrono", "chrono-tz-build", @@ -654,9 +696,9 @@ dependencies = [ [[package]] name = "chrono-tz-build" -version = "0.0.2" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db058d493fb2f65f41861bfed7e3fe6335264a9f0f92710cab5bdf01fef09069" +checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" dependencies = [ "parse-zoneinfo", "phf", @@ -674,9 +716,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" dependencies = [ "glob", "libc", @@ -723,9 +765,9 @@ checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ "heck 0.4.0", "proc-macro-error", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -749,9 +791,9 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "4.4.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3e1238132dc01f081e1cbb9dace14e5ef4c3a51ee244bd982275fb514605db" +checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" dependencies = [ "error-code", "str-buf", @@ -780,9 +822,9 @@ dependencies = [ [[package]] name = "clipboard_x11" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64240d63f1883d87e5637bfcaf9d77e5c8bd24e30fd440ea2dff5c48c0bf0b7a" +checksum = "983a7010836ecd04dde2c6d27a0cb56ec5d21572177e782bdcb24a600124e921" dependencies = [ "thiserror", "x11rb", @@ -855,9 +897,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "combine" -version = "4.6.3" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" dependencies = [ "bytes", "memchr", @@ -865,9 +907,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "1.2.2" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" dependencies = [ "cache-padded", ] @@ -918,7 +960,7 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "615f6e27d000a2bffbc7f2f6a8669179378fa27ee4d0a509e985dfc0a7defb40" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "lazy_static", "proc-macro-hack", "tiny-keccak", @@ -1053,13 +1095,38 @@ dependencies = [ [[package]] name = "coreaudio-sys" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca4679a59dbd8c15f064c012dfe8c1163b9453224238b59bb9328c142b8b248b" +checksum = "3dff444d80630d7073077d38d40b4501fd518bd2b922c2a55edcc8b0f7be57e6" dependencies = [ "bindgen", ] +[[package]] +name = "corosensei" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "libc", + "scopeguard", + "windows-sys 0.33.0", +] + +[[package]] +name = "cortex-m" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70858629a458fdfd39f9675c4dc309411f2a3f83bede76988d81bf1a0ecee9e0" +dependencies = [ + "bare-metal 0.2.5", + "bitfield", + "embedded-hal", + "volatile-register", +] + [[package]] name = "cpal" version = "0.13.5" @@ -1075,7 +1142,7 @@ dependencies = [ "libc", "mach", "ndk 0.6.0", - "ndk-glue 0.6.1", + "ndk-glue 0.6.2", "nix 0.23.1", "oboe", "parking_lot 0.11.2", @@ -1103,42 +1170,42 @@ dependencies = [ "nix 0.23.1", "oboe", "once_cell", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "stdweb", "thiserror", "web-sys", - "windows", + "windows 0.37.0", ] [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" dependencies = [ "libc", ] [[package]] name = "cranelift-bforest" -version = "0.76.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6bea67967505247f54fa2c85cf4f6e0e31c4e5692c9b70e4ae58e339067333" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.76.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48194035d2752bdd5bdae429e3ab88676e95f52a2b1355a5d4e809f9e39b1d74" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" dependencies = [ "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.25.0", + "gimli", "log", "regalloc", "smallvec", @@ -1147,31 +1214,30 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.76.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976efb22fcab4f2cd6bd4e9913764616a54d895c1a23530128d04e03633c555f" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" dependencies = [ "cranelift-codegen-shared", - "cranelift-entity", ] [[package]] name = "cranelift-codegen-shared" -version = "0.76.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dabb5fe66e04d4652e434195b45ae65b5c8172d520247b8f66d8df42b2b45dc" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" [[package]] name = "cranelift-entity" -version = "0.76.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3329733e4d4b8e91c809efcaa4faee80bf66f20164e3dd16d707346bd3494799" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" [[package]] name = "cranelift-frontend" -version = "0.76.0" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279afcc0d3e651b773f94837c3d581177b348c8d69e928104b2e9fccb226f921" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" dependencies = [ "cranelift-codegen", "log", @@ -1195,7 +1261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab327ed7354547cc2ef43cbe20ef68b988e70b4b593cbd66a2a61733123a3d23" dependencies = [ "atty", - "cast", + "cast 0.2.7", "clap 2.34.0", "criterion-plot", "csv", @@ -1218,36 +1284,48 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57" +checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" dependencies = [ - "cast", + "cast 0.3.0", "itertools", ] [[package]] -name = "crossbeam" -version = "0.8.1" +name = "critical-section" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845" +checksum = "95da181745b56d4bd339530ec393508910c909c784e8962d15d722bacf0bcbcd" +dependencies = [ + "bare-metal 1.0.0", + "cfg-if 1.0.0", + "cortex-m", + "riscv", +] + +[[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" dependencies = [ "cfg-if 1.0.0", "crossbeam-channel", - "crossbeam-deque 0.8.1", - "crossbeam-epoch 0.9.8", + "crossbeam-deque 0.8.2", + "crossbeam-epoch 0.9.10", "crossbeam-queue", - "crossbeam-utils 0.8.8", + "crossbeam-utils 0.8.11", ] [[package]] name = "crossbeam-channel" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.8", + "crossbeam-utils 0.8.11", ] [[package]] @@ -1263,13 +1341,13 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if 1.0.0", - "crossbeam-epoch 0.9.8", - "crossbeam-utils 0.8.8", + "crossbeam-epoch 0.9.10", + "crossbeam-utils 0.8.11", ] [[package]] @@ -1289,26 +1367,26 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ "autocfg", "cfg-if 1.0.0", - "crossbeam-utils 0.8.8", - "lazy_static", + "crossbeam-utils 0.8.11", "memoffset 0.6.5", + "once_cell", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" +checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.8", + "crossbeam-utils 0.8.11", ] [[package]] @@ -1324,12 +1402,12 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if 1.0.0", - "lazy_static", + "once_cell", ] [[package]] @@ -1357,9 +1435,9 @@ dependencies = [ "bitflags", "crossterm_winapi 0.9.0", "libc", - "mio 0.8.2", - "parking_lot 0.12.0", - "signal-hook 0.3.13", + "mio 0.8.4", + "parking_lot 0.12.1", + "signal-hook 0.3.14", "signal-hook-mio", "winapi 0.3.9", ] @@ -1390,11 +1468,11 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.5", + "generic-array 0.14.6", "typenum", ] @@ -1467,12 +1545,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e92cb285610dd935f60ee8b4d62dd1988bd12b7ea50579bd6a138201525318e" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core 0.13.2", - "darling_macro 0.13.2", + "darling_core 0.13.4", + "darling_macro 0.13.4", ] [[package]] @@ -1483,24 +1561,24 @@ checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "strsim 0.9.3", - "syn 1.0.98", + "syn 1.0.99", ] [[package]] name = "darling_core" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c29e95ab498b18131ea460b2c0baa18cbf041231d122b0b7bfebef8c8e88989" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "strsim 0.10.0", - "syn 1.0.98", + "syn 1.0.99", ] [[package]] @@ -1510,19 +1588,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core 0.10.2", - "quote 1.0.20", - "syn 1.0.98", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "darling_macro" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b21dd6b221dd547528bd6fb15f1a3b7ab03b9a06f76bff288a8c629bcfbe7f0e" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core 0.13.2", - "quote 1.0.20", - "syn 1.0.98", + "darling_core 0.13.4", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -1536,9 +1614,9 @@ dependencies = [ [[package]] name = "deunicode" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c9736e15e7df1638a7f6eee92a6511615c738246a052af5ba86f039b65aede" +checksum = "08ff6a4480d42625e59bc4e8b5dc3723279fd24d83afe8aa20df217276261cd6" [[package]] name = "digest" @@ -1614,12 +1692,12 @@ dependencies = [ "bitflags", "crossbeam-channel", "num-traits", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "serde", "serde_json", "serde_repr", "thiserror", - "time 0.3.9", + "time 0.3.14", "tokio", "tracing", "url", @@ -1705,9 +1783,9 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "emath" @@ -1715,6 +1793,16 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e73d6c8c70eadb71756fbbc3c303ab25e163b46b656886dd250de5636efea12" +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + [[package]] name = "endian-type" version = "0.1.2" @@ -1745,9 +1833,9 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -1756,31 +1844,30 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "enumset" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f0ae74db31a8ba0093a411d594a1d6d65c207611816ebf4e75381f3f72b1fe" +checksum = "4799cdb24d48f1f8a7a98d06b7fde65a85a2d1e42b25a889f5406aa1fbefe074" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.5.6" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c594871f94ab3a00434cb09f03067c92fa2ece4cc657d58ba402e8377cd85a3" +checksum = "ea83a3fbdc1d999ccfbcbee717eab36f8edf2d71693a23ce0d7cca19e085304c" dependencies = [ - "darling 0.13.2", - "proc-macro-crate 1.1.3", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "darling 0.13.4", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -1866,9 +1953,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fallible-iterator" @@ -1884,22 +1971,22 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] [[package]] name = "fd-lock" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e245f4c8ec30c6415c56cb132c07e69e74f1942f6b4a4061da748b49f486ca" +checksum = "e11dcc7e4d79a8c89b9ab4c6f5c30b1fc4a83c420792da3542fd31179ed5f517" dependencies = [ "cfg-if 1.0.0", "rustix", - "windows-sys 0.30.0", + "windows-sys 0.36.1", ] [[package]] @@ -1917,21 +2004,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccb5acb1045ebbfa222e2c50679e392a71dd77030b78fb0189f2d9c5974400f9" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.13", - "winapi 0.3.9", + "redox_syscall 0.2.16", + "windows-sys 0.36.1", ] [[package]] @@ -1954,9 +2041,9 @@ checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" [[package]] name = "fixedbitset" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" @@ -2041,11 +2128,10 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] @@ -2066,9 +2152,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" dependencies = [ "futures-channel", "futures-core", @@ -2081,9 +2167,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" dependencies = [ "futures-core", "futures-sink", @@ -2091,15 +2177,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" dependencies = [ "futures-core", "futures-task", @@ -2109,38 +2195,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" dependencies = [ "futures-channel", "futures-core", @@ -2165,15 +2251,15 @@ dependencies = [ [[package]] name = "generator" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" +checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7" dependencies = [ "cc", "libc", "log", "rustversion", - "winapi 0.3.9", + "windows 0.32.0", ] [[package]] @@ -2196,9 +2282,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", "version_check 0.9.4", @@ -2227,13 +2313,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -2418,21 +2504,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.25.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ "fallible-iterator", "indexmap", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" - [[package]] name = "glam" version = "0.10.2" @@ -2462,14 +2542,14 @@ dependencies = [ [[package]] name = "glyph_brush" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21932fbf719272848eec4583740d978203c6e7da4c4e203358f5b95946c97409" +checksum = "ac02497410cdb5062cc056a33f2e1e19ff69fbf26a4be9a02bf29d6e17ea105b" dependencies = [ "glyph_brush_draw_cache", "glyph_brush_layout", "log", - "ordered-float 2.10.0", + "ordered-float 3.0.0", "rustc-hash", "twox-hash", ] @@ -2482,7 +2562,7 @@ checksum = "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610" dependencies = [ "ab_glyph", "crossbeam-channel", - "crossbeam-deque 0.8.1", + "crossbeam-deque 0.8.2", "linked-hash-map", "rayon", "rustc-hash", @@ -2550,9 +2630,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" dependencies = [ "bytes", "fnv", @@ -2582,6 +2662,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.9.1" @@ -2602,9 +2691,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash 0.7.6", "rayon", @@ -2628,19 +2717,20 @@ checksum = "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1" dependencies = [ "as-slice", "generic-array 0.13.3", - "hash32", + "hash32 0.1.1", "stable_deref_trait", ] [[package]] name = "heapless" -version = "0.6.1" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634bd4d29cbf24424d0a4bfcbf80c6960129dc24424752a7d1d1390607023422" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" dependencies = [ - "as-slice", - "generic-array 0.14.5", - "hash32", + "atomic-polyfill", + "hash32 0.2.1", + "rustc_version 0.4.0", + "spin 0.9.4", "stable_deref_trait", ] @@ -2686,20 +2776,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 1.0.1", + "itoa 1.0.3", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -2708,9 +2798,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" @@ -2726,9 +2816,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.18" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ "bytes", "futures-channel", @@ -2739,7 +2829,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.1", + "itoa 1.0.3", "pin-project-lite", "socket2", "tokio", @@ -2850,39 +2940,37 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "image" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" +checksum = "7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964" dependencies = [ "bytemuck", "byteorder", "color_quant", "jpeg-decoder", - "num-iter", - "num-rational 0.4.0", + "num-rational 0.4.1", "num-traits", "png", ] [[package]] name = "indexmap" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown 0.11.2", + "hashbrown 0.12.3", "rayon", "serde", ] @@ -2918,9 +3006,9 @@ dependencies = [ [[package]] name = "inplace_it" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90953f308a79fe6d62a4643e51f848fbfddcd05975a38e69fdf4ab86a7baf7ca" +checksum = "67f0347836f3f6362c1e7efdadde2b1c4b4556d211310b70631bae7eb692070b" [[package]] name = "instant" @@ -2965,9 +3053,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "0.6.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504" +checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06" [[package]] name = "itertools" @@ -2986,9 +3074,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" [[package]] name = "jni" @@ -3088,9 +3176,9 @@ dependencies = [ [[package]] name = "kqueue" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9" +checksum = "4d6112e8f37b59803ac47a42d14f1f3a59bbf72fc6857ffc5be455e28a691f8e" dependencies = [ "kqueue-sys", "libc", @@ -3175,9 +3263,9 @@ checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" [[package]] name = "libm" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" +checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565" [[package]] name = "libmimalloc-sys" @@ -3211,15 +3299,15 @@ dependencies = [ [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.0.42" +version = "0.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" +checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" [[package]] name = "lock_api" @@ -3232,9 +3320,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" dependencies = [ "autocfg", "scopeguard", @@ -3242,18 +3330,18 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "loom" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if 1.0.0", "generator", @@ -3279,8 +3367,8 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" dependencies = [ - "quote 1.0.20", - "syn 1.0.98", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -3323,12 +3411,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - [[package]] name = "maybe-uninit" version = "2.0.0" @@ -3337,9 +3419,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap" @@ -3362,18 +3444,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.3.1" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" -dependencies = [ - "libc", -] - -[[package]] -name = "memmap2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f" +checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" dependencies = [ "libc", ] @@ -3438,9 +3511,9 @@ dependencies = [ "serde_derive", "tempfile", "wasm-bindgen-futures", - "wayland-client 0.29.4", - "wayland-cursor 0.29.4", - "wayland-protocols 0.29.4", + "wayland-client 0.29.5", + "wayland-cursor 0.29.5", + "wayland-protocols 0.29.5", "winapi 0.3.9", "x11-dl", ] @@ -3453,9 +3526,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" dependencies = [ "adler", ] @@ -3475,16 +3548,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "miow", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi 0.3.9", + "windows-sys 0.36.1", ] [[package]] @@ -3568,6 +3639,21 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.0.0", +] + +[[package]] +name = "nb" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "546c37ac5d9e56f55e73b677106873d9d9f5190605e41a856503623648488cae" + [[package]] name = "ndk" version = "0.3.0" @@ -3629,9 +3715,9 @@ dependencies = [ [[package]] name = "ndk-glue" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ffb7443daba48349d545028777ca98853b018b4c16624aa01223bc29e078da" +checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" dependencies = [ "lazy_static", "libc", @@ -3650,9 +3736,9 @@ checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" dependencies = [ "darling 0.10.2", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -3661,11 +3747,11 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" dependencies = [ - "darling 0.13.2", - "proc-macro-crate 1.1.3", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "darling 0.13.4", + "proc-macro-crate 1.2.1", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -3760,6 +3846,7 @@ dependencies = [ "bitflags", "cfg-if 1.0.0", "libc", + "memoffset 0.6.5", ] [[package]] @@ -3815,7 +3902,7 @@ dependencies = [ "inotify", "kqueue", "libc", - "mio 0.8.2", + "mio 0.8.4", "walkdir 2.3.2", "winapi 0.3.9", ] @@ -3850,10 +3937,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" dependencies = [ "num-bigint 0.4.3", - "num-complex 0.4.0", + "num-complex 0.4.2", "num-integer", "num-iter", - "num-rational 0.4.0", + "num-rational 0.4.1", "num-traits", ] @@ -3891,9 +3978,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" dependencies = [ "num-traits", ] @@ -3904,16 +3991,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -3921,9 +4008,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", @@ -3944,9 +4031,9 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", "num-bigint 0.4.3", @@ -3956,12 +4043,12 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", - "libm 0.2.2", + "libm 0.2.5", ] [[package]] @@ -3989,17 +4076,17 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro-crate 1.2.1", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "num_threads" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] @@ -4045,9 +4132,9 @@ dependencies = [ [[package]] name = "object" -version = "0.28.3" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "crc32fast", "hashbrown 0.11.2", @@ -4056,14 +4143,23 @@ dependencies = [ ] [[package]] -name = "oboe" -version = "0.4.5" +name = "object" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2463c8f2e19b4e0d0710a21f8e4011501ff28db1c95d7a5482a553b2100502d2" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "memchr", +] + +[[package]] +name = "oboe" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f63c358b4fa0fbcfefd7c8be5cfc39c08ce2389f5325687e7762a48d30a5c1" dependencies = [ "jni", "ndk 0.6.0", - "ndk-glue 0.6.1", + "ndk-context", "num-derive", "num-traits", "oboe-sys", @@ -4113,7 +4209,7 @@ checksum = "2d3aa1482d3a9cb7547932f54a20910090073e81b3b7b236277c91698a10f83e" dependencies = [ "libc", "raw-window-handle 0.3.4", - "redox_syscall 0.2.13", + "redox_syscall 0.2.16", "sdl2", "sdl2-sys", "wasm-bindgen", @@ -4149,9 +4245,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" [[package]] name = "owned_ttf_parser" @@ -4164,18 +4260,18 @@ dependencies = [ [[package]] name = "owned_ttf_parser" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1e509cfe7a12db2a90bfa057dfcdbc55a347f5da677c506b53dd099cfec9d" +checksum = "05e6affeb1632d6ff6a23d2cd40ffed138e82f1532571a26f527c8a284bb2fbb" dependencies = [ - "ttf-parser 0.15.0", + "ttf-parser 0.15.2", ] [[package]] name = "packed_simd_2" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defdcfef86dcc44ad208f71d9ff4ce28df6537a4e0d6b0e8e845cb8ca10059a6" +checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" dependencies = [ "cfg-if 1.0.0", "libm 0.1.4", @@ -4198,18 +4294,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api 0.4.7", + "lock_api 0.4.8", "parking_lot_core 0.8.5", ] [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "lock_api 0.4.7", - "parking_lot_core 0.9.2", + "lock_api 0.4.8", + "parking_lot_core 0.9.3", ] [[package]] @@ -4235,22 +4331,22 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.2.13", + "redox_syscall 0.2.16", "smallvec", "winapi 0.3.9", ] [[package]] name = "parking_lot_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.13", + "redox_syscall 0.2.16", "smallvec", - "windows-sys 0.34.0", + "windows-sys 0.36.1", ] [[package]] @@ -4262,12 +4358,6 @@ dependencies = [ "regex", ] -[[package]] -name = "pdqselect" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27" - [[package]] name = "peeking_take_while" version = "0.1.2" @@ -4276,18 +4366,18 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "pem" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9a3b09a20e374558580a4914d3b7d89bd61b954a5a5e1dcbea98753addb1947" +checksum = "03c64931a1a212348ec4f3b4362585eca7159d0d09cbdf4a7f74f02173596fd4" dependencies = [ "base64", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "petgraph" @@ -4310,28 +4400,28 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" dependencies = [ - "fixedbitset 0.4.1", + "fixedbitset 0.4.2", "indexmap", ] [[package]] name = "phf" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" dependencies = [ "phf_shared", ] [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" dependencies = [ "phf_generator", "phf_shared", @@ -4339,9 +4429,9 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" dependencies = [ "phf_shared", "rand 0.8.5", @@ -4349,9 +4439,9 @@ dependencies = [ [[package]] name = "phf_shared" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" dependencies = [ "siphasher", "uncased", @@ -4359,9 +4449,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -4417,28 +4507,28 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-svg" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" dependencies = [ "plotters-backend", ] [[package]] name = "png" -version = "0.17.5" +version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" +checksum = "8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c" dependencies = [ "bitflags", "crc32fast", - "deflate", + "flate2", "miniz_oxide", ] @@ -4467,10 +4557,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.1.3" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ + "once_cell", "thiserror", "toml", ] @@ -4482,9 +4573,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", "version_check 0.9.4", ] @@ -4494,8 +4585,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "version_check 0.9.4", ] @@ -4516,9 +4607,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] @@ -4539,29 +4630,29 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98eee3c112f2a6f784b6713fe1d7fb7d6506e066121c0a49371fdb976f72bae5" dependencies = [ - "quote 1.0.20", - "syn 1.0.98", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "prometheus" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f64969ffd5dd8f39bd57a68ac53c163a095ed9d0fb707146da1b27025a3504" +checksum = "45c8babc29389186697fe5a2a4859d697825496b83db5d0b65271cdc0488e88c" dependencies = [ "cfg-if 1.0.0", "fnv", "lazy_static", "memchr", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "thiserror", ] [[package]] name = "prometheus-hyper" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8726fd64f2941cc80d6739a7d001d756a22b660737839fd7b15202f5cb7f4bf6" +checksum = "18fc98d5705a20b11f8b240c0857167b79852ba469f9faec6df0027e576e676e" dependencies = [ "hyper", "prometheus", @@ -4584,9 +4675,9 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -4600,9 +4691,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d147472bc9a09f13b06c044787b6683cdffa02e2865b7f0fb53d67c49ed2988e" +checksum = "5b435e71d9bfa0d8889927231970c51fb89c58fa63bffcab117c9c7a41e5ef8f" dependencies = [ "bytes", "futures-channel", @@ -4610,7 +4701,7 @@ dependencies = [ "fxhash", "quinn-proto", "quinn-udp", - "rustls 0.20.4", + "rustls 0.20.6", "thiserror", "tokio", "tracing", @@ -4619,16 +4710,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "359c5eb33845f3ee05c229e65f87cdbc503eea394964b8f1330833d460b4ff3e" +checksum = "3fce546b9688f767a57530652488420d419a8b1f44a478b451c3d1ab6d992a55" dependencies = [ "bytes", "fxhash", "rand 0.8.5", "ring", - "rustls 0.20.4", - "rustls-native-certs 0.6.1", + "rustls 0.20.6", + "rustls-native-certs 0.6.2", "rustls-pemfile 0.2.1", "slab", "thiserror", @@ -4639,13 +4730,12 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df185e5e5f7611fa6e628ed8f9633df10114b03bbaecab186ec55822c44ac727" +checksum = "9f832d8958db3e84d2ec93b5eb2272b45aa23cf7f8fe6e79f578896f4e6c231b" dependencies = [ "futures-util", "libc", - "mio 0.7.14", "quinn-proto", "socket2", "tokio", @@ -4663,11 +4753,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ - "proc-macro2 1.0.40", + "proc-macro2 1.0.43", ] [[package]] @@ -4745,7 +4835,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", ] [[package]] @@ -4811,38 +4901,37 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", - "crossbeam-deque 0.8.1", + "crossbeam-deque 0.8.2", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", - "crossbeam-deque 0.8.1", - "crossbeam-utils 0.8.8", - "lazy_static", + "crossbeam-deque 0.8.2", + "crossbeam-utils 0.8.11", "num_cpus", ] [[package]] name = "rcgen" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa2d386df8533b02184941c76ae2e0d0c1d053f5d43339169d80f21275fc5e" +checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" dependencies = [ "pem", "ring", - "time 0.3.9", + "time 0.3.14", "yasna", ] @@ -4854,9 +4943,9 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -4867,8 +4956,8 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.6", - "redox_syscall 0.2.13", + "getrandom 0.2.7", + "redox_syscall 0.2.16", "thiserror", ] @@ -4906,18 +4995,18 @@ name = "refinery-macros" version = "0.5.0" source = "git+https://gitlab.com/veloren/refinery.git?rev=8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e#8ecf4b4772d791e6c8c0a3f9b66a7530fad1af3e" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "refinery-core", "regex", - "syn 1.0.98", + "syn 1.0.99", ] [[package]] name = "regalloc" -version = "0.0.31" +version = "0.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571f7f397d61c4755285cd37853fe8e03271c243424a907415909379659381c5" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" dependencies = [ "log", "rustc-hash", @@ -4926,9 +5015,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.5" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -4946,9 +5035,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "region" @@ -4995,20 +5084,41 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi 0.3.9", ] [[package]] -name = "rkyv" -version = "0.7.37" +name = "riscv" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f08c8062c1fe1253064043b8fc07bfea1b9702b71b4a86c11ea3588183b12e1" +checksum = "6907ccdd7a31012b70faf2af85cd9e5ba97657cc3987c4f13f8e4d2c2a088aba" +dependencies = [ + "bare-metal 1.0.0", + "bit_field", + "riscv-target", +] + +[[package]] +name = "riscv-target" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88aa938cda42a0cf62a20cfe8d139ff1af20c2e681212b5b34adb5a58333f222" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "rkyv" +version = "0.7.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cec2b3485b07d96ddfd3134767b8a447b45ea4eb91448d0a35180ec0ffd5ed15" dependencies = [ "bytecheck", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", @@ -5017,13 +5127,13 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.37" +version = "0.7.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e289706df51226e84814bf6ba1a9e1013112ae29bc7a9878f73fce360520c403" +checksum = "6eaedadc88b53e36dd32d940ed21ae4d850d5916f2581526921f553a72ac34c4" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -5049,9 +5159,9 @@ dependencies = [ [[package]] name = "ron" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678" +checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" dependencies = [ "base64", "bitflags", @@ -5095,13 +5205,12 @@ dependencies = [ [[package]] name = "rstar" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc6fc513b8c3853e43a0c3f909ded14ffa82e5170c9c5f6fb175f9c85c8a433" +checksum = "b40f1bfe5acdab44bc63e6699c28b74f75ec43afb59f3eda01e145aff86a25fa" dependencies = [ - "heapless 0.6.1", + "heapless 0.7.16", "num-traits", - "pdqselect", "smallvec", ] @@ -5159,21 +5268,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.7", + "semver 1.0.13", ] [[package]] name = "rustix" -version = "0.34.1" +version = "0.35.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cc851a13d30a34cb747ba2a0c5101a4b2e8b1677a29b213ee465365ea495e" +checksum = "72c825b8aa8010eb9ee99b75f05e10180b9278d161583034d7574c9d617aeada" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "winapi 0.3.9", + "windows-sys 0.36.1", ] [[package]] @@ -5191,9 +5300,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.4" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", @@ -5215,12 +5324,12 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", - "rustls-pemfile 0.2.1", + "rustls-pemfile 1.0.1", "schannel", "security-framework", ] @@ -5236,9 +5345,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" +checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" dependencies = [ "base64", ] @@ -5280,9 +5389,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "rusty-xinput" @@ -5303,7 +5412,7 @@ checksum = "1d1cd5ae51d3f7bf65d7969d579d502168ef578f289452bd8ccc91de28fda20e" dependencies = [ "bitflags", "cfg-if 1.0.0", - "clipboard-win 4.4.1", + "clipboard-win 4.4.2", "dirs-next", "fd-lock", "libc", @@ -5320,9 +5429,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "same-file" @@ -5335,12 +5444,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi 0.3.9", + "windows-sys 0.36.1", ] [[package]] @@ -5408,9 +5517,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "security-framework" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" dependencies = [ "bitflags", "core-foundation 0.9.3", @@ -5446,9 +5555,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.7" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" +checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" [[package]] name = "semver-parser" @@ -5458,18 +5567,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.136" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.5" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" +checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" dependencies = [ "serde", ] @@ -5486,42 +5595,42 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ - "itoa 1.0.1", + "itoa 1.0.3", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "sha2" -version = "0.10.2" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -5566,18 +5675,18 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] name = "shellexpand" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdb7831b2d85ddf4a7b148aa19d0587eddbe8671a436b7bd1182eaad0f2829" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" dependencies = [ - "dirs-next", + "dirs", ] [[package]] name = "shlex" -version = "0.1.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "shred" @@ -5586,7 +5695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "102269e720bb814df57e136161cad841f2b6f411e003ac748fc48aaf2363bea3" dependencies = [ "arrayvec 0.7.2", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "mopa", "rayon", "shred-derive", @@ -5600,16 +5709,16 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5404c36bd155e41a54276ab6aafedad2fb627e5e5849d36ec439c9ddc044a2f" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "shrev" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5752e017e03af9d735b4b069f53b7a7fd90fefafa04d8bd0c25581b0bff437f" +checksum = "a5ea33232fdcf1bf691ca33450e5a94dde13e1a8cbb8caabc5e4f9d761e10b1a" [[package]] name = "signal-hook" @@ -5624,9 +5733,9 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" dependencies = [ "libc", "signal-hook-registry", @@ -5639,8 +5748,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", - "mio 0.8.2", - "signal-hook 0.3.13", + "mio 0.8.4", + "signal-hook 0.3.14", ] [[package]] @@ -5660,9 +5769,12 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] [[package]] name = "slotmap" @@ -5682,9 +5794,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "smithay-client-toolkit" @@ -5707,37 +5819,37 @@ dependencies = [ [[package]] name = "smithay-client-toolkit" -version = "0.15.3" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1325f292209cee78d5035530932422a30aa4c8fda1a16593ac083c1de211e68a" +checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" dependencies = [ "bitflags", "dlib 0.5.0", "lazy_static", "log", - "memmap2 0.3.1", - "nix 0.22.3", + "memmap2 0.5.7", + "nix 0.24.2", "pkg-config", - "wayland-client 0.29.4", - "wayland-cursor 0.29.4", - "wayland-protocols 0.29.4", + "wayland-client 0.29.5", + "wayland-cursor 0.29.5", + "wayland-protocols 0.29.5", ] [[package]] name = "smithay-clipboard" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610b551bd25378bfd2b8e7a0fcbd83d427e8f2f6a40c47ae0f70688e9949dd55" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" dependencies = [ - "smithay-client-toolkit 0.15.3", - "wayland-client 0.29.4", + "smithay-client-toolkit 0.16.0", + "wayland-client 0.29.5", ] [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi 0.3.9", @@ -5750,7 +5862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea85dac2880f84d4025ff5ace80cda6d8bc43bc88b6a389b9277fcf894b51e9" dependencies = [ "crossbeam-queue", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "hibitset", "log", "rayon", @@ -5767,9 +5879,9 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -5778,6 +5890,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +dependencies = [ + "lock_api 0.4.8", +] + [[package]] name = "spin_sleep" version = "1.1.1" @@ -5842,14 +5963,14 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c" dependencies = [ - "lock_api 0.4.7", + "lock_api 0.4.8", ] [[package]] name = "str-buf" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44a3643b4ff9caf57abcee9c2c621d6c03d9135e0d8b589bd9afb5992cb176a" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" [[package]] name = "strsim" @@ -5888,31 +6009,31 @@ checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" dependencies = [ "heck 0.3.3", "proc-macro-error", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "strum" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.24.0" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.0", - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "rustversion", - "syn 1.0.98", + "syn 1.0.99", ] [[package]] @@ -5940,12 +6061,12 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "unicode-ident", ] @@ -5968,9 +6089,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1" +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" [[package]] name = "tempfile" @@ -5981,7 +6102,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall 0.2.13", + "redox_syscall 0.2.16", "remove_dir_all", "winapi 0.3.9", ] @@ -6012,22 +6133,22 @@ checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "8c1b05ca9d106ba7d2e31a9dab4a64e7be2cce415321966ea3132c49a656e252" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "e8f2591983642de85c921015f3f070c665a197ed69e417af436115e3a1407487" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -6058,11 +6179,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.9" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b" dependencies = [ - "itoa 1.0.1", + "itoa 1.0.3", "libc", "num_threads", ] @@ -6094,9 +6215,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -6109,14 +6230,15 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "89797afd69d206ccd11fb0ea560a44bbb87731d020670e79416d442919257d42" dependencies = [ + "autocfg", "bytes", "libc", "memchr", - "mio 0.8.2", + "mio 0.8.4", "num_cpus", "once_cell", "pin-project-lite", @@ -6128,13 +6250,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -6150,9 +6272,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" dependencies = [ "futures-core", "pin-project-lite", @@ -6161,9 +6283,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" dependencies = [ "bytes", "futures-core", @@ -6175,24 +6297,24 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.32" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" dependencies = [ "cfg-if 1.0.0", "log", @@ -6208,36 +6330,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" dependencies = [ "crossbeam-channel", - "time 0.3.9", + "time 0.3.14", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "tracing-core" -version = "0.1.24" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90442985ee2f57c9e1b548ee72ae842f4a9a20e3f417cc38dbc5dc684d9bb4ee" +checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" dependencies = [ - "lazy_static", + "once_cell", "valuable", ] [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", @@ -6246,18 +6368,18 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.10" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9df98b037d039d03400d9dd06b0f8ce05486b5f25e9a2d7d36196e142ebbc52" +checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" dependencies = [ "ansi_term", - "lazy_static", "matchers", + "once_cell", "regex", "sharded-slab", "smallvec", "thread_local", - "time 0.3.9", + "time 0.3.14", "tracing", "tracing-core", "tracing-log", @@ -6298,9 +6420,9 @@ dependencies = [ [[package]] name = "tracy-client-sys" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9012b9dfeccaff16e93f5a8b02336125113a80a769902e679d334cbdd4d83f3b" +checksum = "178d021455e83078bb38c00b70046b95117ef0a0312cbef925f426d833d11c79" dependencies = [ "cc", ] @@ -6329,9 +6451,9 @@ checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc" [[package]] name = "ttf-parser" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c74c96594835e10fa545e2a51e8709f30b173a092bfd6036ef2cec53376244f3" +checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" [[package]] name = "tui" @@ -6353,9 +6475,9 @@ checksum = "cffaaf9392ef73cd30828797152476aaa2fa37a17856934fa63d4843f34290e9" [[package]] name = "twox-hash" -version = "1.6.2" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee73e6e4924fe940354b8d4d98cad5231175d615cd855b758adc658c0aac6a0" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if 1.0.0", "rand 0.8.5", @@ -6388,9 +6510,9 @@ checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "uncased" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0" +checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" dependencies = [ "version_check 0.9.4", ] @@ -6415,21 +6537,21 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" dependencies = [ "tinyvec", ] @@ -6460,13 +6582,12 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] @@ -6482,7 +6603,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "serde", ] @@ -6498,6 +6619,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + [[package]] name = "vcpkg" version = "0.2.15" @@ -6545,7 +6672,7 @@ dependencies = [ "authc", "byteorder", "clap 3.2.20", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "image", "num 0.4.0", "quinn", @@ -6580,22 +6707,22 @@ dependencies = [ "clap 2.34.0", "criterion", "crossbeam-channel", - "crossbeam-utils 0.8.8", + "crossbeam-utils 0.8.11", "csv", "dot_vox", "enum-iterator 1.1.3", "fxhash", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "indexmap", "kiddo 0.1.7", "lazy_static", "num-derive", "num-traits", "ordered-float 2.10.0", - "petgraph 0.6.0", + "petgraph 0.6.2", "rand 0.8.5", "rayon", - "ron 0.7.0", + "ron 0.7.1", "roots", "serde", "serde_json", @@ -6668,7 +6795,7 @@ version = "0.10.0" dependencies = [ "bincode", "flate2", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "image", "num-traits", "serde", @@ -6684,7 +6811,7 @@ name = "veloren-common-state" version = "0.10.0" dependencies = [ "bincode", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "num_cpus", "rayon", "scopeguard", @@ -6706,7 +6833,7 @@ dependencies = [ name = "veloren-common-systems" version = "0.10.0" dependencies = [ - "hashbrown 0.12.0", + "hashbrown 0.12.3", "indexmap", "ordered-float 3.0.0", "rand 0.8.5", @@ -6736,7 +6863,7 @@ dependencies = [ "crossbeam-channel", "futures-core", "futures-util", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "lazy_static", "lz-fear", "prometheus", @@ -6744,7 +6871,7 @@ dependencies = [ "quinn", "rand 0.8.5", "rcgen", - "rustls 0.20.4", + "rustls 0.20.6", "serde", "shellexpand", "socket2", @@ -6764,7 +6891,7 @@ dependencies = [ "bitflags", "bytes", "criterion", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "prometheus", "rand 0.8.5", "tokio", @@ -6784,9 +6911,9 @@ dependencies = [ name = "veloren-plugin-derive" version = "0.1.0" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] @@ -6812,7 +6939,7 @@ dependencies = [ "crossbeam-channel", "enumset", "futures-util", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "humantime", "itertools", "lazy_static", @@ -6828,8 +6955,8 @@ dependencies = [ "refinery", "ron 0.8.0", "rusqlite", - "rustls 0.20.4", - "rustls-pemfile 1.0.0", + "rustls 0.20.6", + "rustls-pemfile 1.0.1", "serde", "serde_json", "slab", @@ -6862,7 +6989,7 @@ dependencies = [ "ron 0.8.0", "serde", "shell-words", - "signal-hook 0.3.13", + "signal-hook 0.3.14", "tokio", "tracing", "tui", @@ -6891,7 +7018,7 @@ dependencies = [ "cpal 0.14.0", "criterion", "crossbeam-channel", - "crossbeam-utils 0.8.8", + "crossbeam-utils 0.8.11", "directories-next", "discord-sdk", "dispatch 0.1.4", @@ -6905,7 +7032,7 @@ dependencies = [ "gilrs", "glyph_brush", "guillotiere", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "iced_native", "iced_winit", "image", @@ -7011,7 +7138,7 @@ dependencies = [ "fluent", "fluent-bundle", "fluent-syntax", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "intl-memoizer", "ron 0.8.0", "serde", @@ -7035,7 +7162,7 @@ dependencies = [ "fallible-iterator", "flate2", "fxhash", - "hashbrown 0.12.0", + "hashbrown 0.12.3", "image", "itertools", "kiddo 0.2.4", @@ -7084,6 +7211,21 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "volatile-register" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" +dependencies = [ + "vcell", +] + [[package]] name = "walkdir" version = "0.1.8" @@ -7152,17 +7294,17 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.29" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" +checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -7176,7 +7318,7 @@ version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" dependencies = [ - "quote 1.0.20", + "quote 1.0.21", "wasm-bindgen-macro-support", ] @@ -7186,9 +7328,9 @@ version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7200,10 +7342,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" [[package]] -name = "wasmer" -version = "2.2.1" +name = "wasm-encoder" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f727a39e7161f7438ddb8eafe571b67c576a8c2fb459f666d9053b5bba4afdea" +checksum = "d443c5a7daae71697d97ec12ad70b4fe8766d3a0f4db16158ac8b781365892f7" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasmer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" dependencies = [ "cfg-if 1.0.0", "indexmap", @@ -7213,6 +7364,7 @@ dependencies = [ "target-lexicon", "thiserror", "wasm-bindgen", + "wasmer-artifact", "wasmer-compiler", "wasmer-compiler-cranelift", "wasmer-derive", @@ -7226,10 +7378,23 @@ dependencies = [ ] [[package]] -name = "wasmer-compiler" -version = "2.2.1" +name = "wasmer-artifact" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9951599222eb12bd13d4d91bcded0a880e4c22c2dfdabdf5dc7e5e803b7bf3" +checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" +dependencies = [ + "enumset", + "loupe", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" dependencies = [ "enumset", "loupe", @@ -7240,20 +7405,19 @@ dependencies = [ "target-lexicon", "thiserror", "wasmer-types", - "wasmer-vm", "wasmparser", ] [[package]] name = "wasmer-compiler-cranelift" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c83273bce44e668f3a2b9ccb7f1193db918b1d6806f64acc5ff71f6ece5f20" +checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", - "gimli 0.25.0", + "gimli", "loupe", "more-asserts", "rayon", @@ -7262,38 +7426,38 @@ dependencies = [ "tracing", "wasmer-compiler", "wasmer-types", - "wasmer-vm", ] [[package]] name = "wasmer-derive" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458dbd9718a837e6dbc52003aef84487d79eedef5fa28c7d28b6784be98ac08e" +checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.40", - "quote 1.0.20", - "syn 1.0.98", + "proc-macro2 1.0.43", + "quote 1.0.21", + "syn 1.0.99", ] [[package]] name = "wasmer-engine" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed603a6d037ebbb14014d7f739ae996a78455a4b86c41cfa4e81c590a1253b9" +checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" dependencies = [ "backtrace", "enumset", "lazy_static", "loupe", - "memmap2 0.5.3", + "memmap2 0.5.7", "more-asserts", "rustc-demangle", "serde", "serde_bytes", "target-lexicon", "thiserror", + "wasmer-artifact", "wasmer-compiler", "wasmer-types", "wasmer-vm", @@ -7301,9 +7465,9 @@ dependencies = [ [[package]] name = "wasmer-engine-dylib" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd7fdc60e252a795c849b3f78a81a134783051407e7e279c10b7019139ef8dc" +checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" dependencies = [ "cfg-if 1.0.0", "enum-iterator 0.7.0", @@ -7311,11 +7475,12 @@ dependencies = [ "leb128", "libloading 0.7.3", "loupe", - "object", + "object 0.28.4", "rkyv", "serde", "tempfile", "tracing", + "wasmer-artifact", "wasmer-compiler", "wasmer-engine", "wasmer-object", @@ -7326,12 +7491,11 @@ dependencies = [ [[package]] name = "wasmer-engine-universal" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcff0cd2c01a8de6009fd863b14ea883132a468a24f2d2ee59dc34453d3a31b5" +checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" dependencies = [ "cfg-if 1.0.0", - "enum-iterator 0.7.0", "enumset", "leb128", "loupe", @@ -7339,18 +7503,35 @@ dependencies = [ "rkyv", "wasmer-compiler", "wasmer-engine", + "wasmer-engine-universal-artifact", "wasmer-types", "wasmer-vm", "winapi 0.3.9", ] [[package]] -name = "wasmer-object" -version = "2.2.1" +name = "wasmer-engine-universal-artifact" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ce18ac2877050e59580d27ee1a88f3192d7a31e77fbba0852abc7888d6e0b5" +checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" dependencies = [ - "object", + "enum-iterator 0.7.0", + "enumset", + "loupe", + "rkyv", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-object" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" +dependencies = [ + "object 0.28.4", "thiserror", "wasmer-compiler", "wasmer-types", @@ -7358,12 +7539,15 @@ dependencies = [ [[package]] name = "wasmer-types" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659fa3dd6c76f62630deff4ac8c7657b07f0b1e4d7e0f8243a552b9d9b448e24" +checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" dependencies = [ + "backtrace", + "enum-iterator 0.7.0", "indexmap", "loupe", + "more-asserts", "rkyv", "serde", "thiserror", @@ -7371,49 +7555,55 @@ dependencies = [ [[package]] name = "wasmer-vm" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afdc46158517c2769f9938bc222a7d41b3bb330824196279d8aa2d667cd40641" +checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" dependencies = [ "backtrace", "cc", "cfg-if 1.0.0", + "corosensei", "enum-iterator 0.7.0", "indexmap", + "lazy_static", "libc", "loupe", + "mach", "memoffset 0.6.5", "more-asserts", "region", "rkyv", + "scopeguard", "serde", "thiserror", + "wasmer-artifact", "wasmer-types", "winapi 0.3.9", ] [[package]] name = "wasmparser" -version = "0.78.2" +version = "0.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wast" -version = "39.0.0" +version = "46.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9bbbd53432b267421186feee3e52436531fa69a7cfee9403f5204352df3dd05" +checksum = "ea0ab19660e3ea6891bba69167b9be40fad00fb1fe3dd39c5eebcee15607131b" dependencies = [ "leb128", "memchr", "unicode-width", + "wasm-encoder", ] [[package]] name = "wat" -version = "1.0.41" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab98ed25494f97c69f28758617f27c3e92e5336040b5c3a14634f2dd3fe61830" +checksum = "8f775282def4d5bffd94d60d6ecd57bfe6faa46171cdbf8d32bd5458842b1e3e" dependencies = [ "wast", ] @@ -7445,18 +7635,18 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91223460e73257f697d9e23d401279123d36039a3f7a449e983f123292d4458f" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" dependencies = [ "bitflags", "downcast-rs", "libc", - "nix 0.22.3", + "nix 0.24.2", "scoped-tls", - "wayland-commons 0.29.4", - "wayland-scanner 0.29.4", - "wayland-sys 0.29.4", + "wayland-commons 0.29.5", + "wayland-scanner 0.29.5", + "wayland-sys 0.29.5", ] [[package]] @@ -7473,14 +7663,14 @@ dependencies = [ [[package]] name = "wayland-commons" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f6e5e340d7c13490eca867898c4cec5af56c27a5ffe5c80c6fc4708e22d33e" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" dependencies = [ - "nix 0.22.3", + "nix 0.24.2", "once_cell", "smallvec", - "wayland-sys 0.29.4", + "wayland-sys 0.29.5", ] [[package]] @@ -7496,12 +7686,12 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52758f13d5e7861fc83d942d3d99bf270c83269575e52ac29e5b73cb956a6bd" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" dependencies = [ - "nix 0.22.3", - "wayland-client 0.29.4", + "nix 0.24.2", + "wayland-client 0.29.5", "xcursor", ] @@ -7519,14 +7709,14 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60147ae23303402e41fe034f74fb2c35ad0780ee88a1c40ac09a3be1e7465741" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" dependencies = [ "bitflags", - "wayland-client 0.29.4", - "wayland-commons 0.29.4", - "wayland-scanner 0.29.4", + "wayland-client 0.29.5", + "wayland-commons 0.29.5", + "wayland-scanner 0.29.5", ] [[package]] @@ -7535,19 +7725,19 @@ version = "0.28.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "xml-rs", ] [[package]] name = "wayland-scanner" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a1ed3143f7a143187156a2ab52742e89dac33245ba505c17224df48939f9e0" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" dependencies = [ - "proc-macro2 1.0.40", - "quote 1.0.20", + "proc-macro2 1.0.43", + "quote 1.0.21", "xml-rs", ] @@ -7564,9 +7754,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.29.4" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9341df79a8975679188e37dab3889bfa57c44ac2cb6da166f519a81cbe452d4" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" dependencies = [ "dlib 0.5.0", "lazy_static", @@ -7684,13 +7874,13 @@ dependencies = [ [[package]] name = "which" -version = "4.2.5" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" dependencies = [ "either", - "lazy_static", "libc", + "once_cell", ] [[package]] @@ -7747,11 +7937,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086ed826cc4468377b6b995300d5f7f852a2fe1eb02e6cd1ccd4a574deb9d310" +checksum = "b47d7fb4df5cd1fea61e5ee3841380f54359bac814e227d8f72709f4f193f8cf" dependencies = [ - "clipboard-win 4.4.1", + "clipboard-win 4.4.2", "clipboard_macos", "clipboard_wayland", "clipboard_x11", @@ -7759,6 +7949,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "windows" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" +dependencies = [ + "windows_aarch64_msvc 0.32.0", + "windows_i686_gnu 0.32.0", + "windows_i686_msvc 0.32.0", + "windows_x86_64_gnu 0.32.0", + "windows_x86_64_msvc 0.32.0", +] + [[package]] name = "windows" version = "0.37.0" @@ -7774,41 +7977,47 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.30.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030b7ff91626e57a05ca64a07c481973cbb2db774e4852c9c7ca342408c6a99a" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" dependencies = [ - "windows_aarch64_msvc 0.30.0", - "windows_i686_gnu 0.30.0", - "windows_i686_msvc 0.30.0", - "windows_x86_64_gnu 0.30.0", - "windows_x86_64_msvc 0.30.0", + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", ] [[package]] name = "windows-sys" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows_aarch64_msvc 0.34.0", - "windows_i686_gnu 0.34.0", - "windows_i686_msvc 0.34.0", - "windows_x86_64_gnu 0.34.0", - "windows_x86_64_msvc 0.34.0", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", ] [[package]] name = "windows_aarch64_msvc" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" [[package]] name = "windows_aarch64_msvc" -version = "0.34.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_aarch64_msvc" @@ -7818,15 +8027,21 @@ checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" [[package]] name = "windows_i686_gnu" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" [[package]] name = "windows_i686_gnu" -version = "0.34.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" @@ -7836,15 +8051,21 @@ checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" [[package]] name = "windows_i686_msvc" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" [[package]] name = "windows_i686_msvc" -version = "0.34.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" @@ -7854,15 +8075,21 @@ checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" [[package]] name = "windows_x86_64_gnu" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" [[package]] name = "windows_x86_64_gnu" -version = "0.34.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" @@ -7872,15 +8099,21 @@ checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" [[package]] name = "windows_x86_64_msvc" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" [[package]] name = "windows_x86_64_msvc" -version = "0.34.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" @@ -7968,9 +8201,9 @@ dependencies = [ [[package]] name = "x11-dl" -version = "2.19.1" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +checksum = "0c83627bc137605acc00bb399c7b908ef460b621fc37c953db2b09f88c449ea6" dependencies = [ "lazy_static", "libc", @@ -7979,21 +8212,21 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffb080b3f2f616242a4eb8e7d325035312127901025b0052bc3154a282d0f19" +checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a" dependencies = [ "gethostname", - "nix 0.20.0", + "nix 0.22.3", "winapi 0.3.9", "winapi-wsapoll", ] [[package]] name = "xattr" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" dependencies = [ "libc", ] @@ -8070,5 +8303,5 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c" dependencies = [ - "time 0.3.9", + "time 0.3.14", ] From 986d104faa28d6d1fb8983d3624a6237b160dfcd Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Thu, 8 Sep 2022 12:51:02 -0700 Subject: [PATCH 217/854] Update Rust toolchain. --- Cargo.lock | 12 +- Cargo.toml | 3 +- client/src/lib.rs | 6 +- common/build.rs | 4 +- common/ecs/src/system.rs | 6 +- common/net/src/msg/client.rs | 4 +- common/net/src/msg/compression.rs | 12 +- common/net/src/msg/mod.rs | 4 +- common/net/src/msg/server.rs | 2 +- common/src/calendar.rs | 2 +- common/src/character.rs | 2 +- common/src/cmd.rs | 8 +- common/src/combat.rs | 2 +- common/src/comp/ability.rs | 2 +- common/src/comp/agent.rs | 4 +- common/src/comp/anchor.rs | 2 +- common/src/comp/aura.rs | 2 +- common/src/comp/beam.rs | 4 +- common/src/comp/body/arthropod.rs | 4 +- common/src/comp/body/biped_large.rs | 4 +- common/src/comp/body/biped_small.rs | 4 +- common/src/comp/body/bird_large.rs | 4 +- common/src/comp/body/bird_medium.rs | 4 +- common/src/comp/body/dragon.rs | 4 +- common/src/comp/body/fish_medium.rs | 4 +- common/src/comp/body/fish_small.rs | 4 +- common/src/comp/body/golem.rs | 4 +- common/src/comp/body/humanoid.rs | 4 +- common/src/comp/body/object.rs | 2 +- common/src/comp/body/quadruped_low.rs | 4 +- common/src/comp/body/quadruped_medium.rs | 4 +- common/src/comp/body/quadruped_small.rs | 4 +- common/src/comp/body/ship.rs | 6 +- common/src/comp/body/theropod.rs | 4 +- common/src/comp/buff.rs | 4 +- common/src/comp/controller.rs | 14 +- common/src/comp/energy.rs | 2 +- common/src/comp/fluid_dynamics.rs | 2 +- common/src/comp/group.rs | 4 +- common/src/comp/health.rs | 6 +- common/src/comp/inputs.rs | 2 +- common/src/comp/inventory/item/armor.rs | 2 +- common/src/comp/inventory/item/mod.rs | 4 +- common/src/comp/inventory/item/modular.rs | 2 +- common/src/comp/inventory/loadout_builder.rs | 4 +- common/src/comp/inventory/mod.rs | 4 +- common/src/comp/inventory/slot.rs | 4 +- common/src/comp/inventory/trade_pricing.rs | 2 +- common/src/comp/invite.rs | 4 +- common/src/comp/misc.rs | 2 +- common/src/comp/phys.rs | 6 +- common/src/comp/shockwave.rs | 4 +- common/src/comp/skillset/mod.rs | 4 +- common/src/generation.rs | 4 +- common/src/lib.rs | 2 - common/src/lottery.rs | 2 +- common/src/npc.rs | 2 +- common/src/recipe.rs | 4 +- common/src/skillset_builder.rs | 2 +- common/src/states/charged_melee.rs | 2 +- common/src/states/equipping.rs | 4 +- common/src/states/idle.rs | 2 +- common/src/states/spin_melee.rs | 4 +- common/src/states/sprite_interact.rs | 6 +- common/src/states/use_item.rs | 6 +- common/src/states/utils.rs | 4 +- common/src/states/wielding.rs | 2 +- common/src/terrain/site.rs | 6 +- common/src/terrain/structure.rs | 2 +- common/src/trade.rs | 10 +- common/state/src/plugin/errors.rs | 2 +- common/state/src/plugin/mod.rs | 2 +- common/state/src/plugin/module.rs | 4 +- common/systems/src/buff.rs | 4 +- common/systems/src/lib.rs | 2 +- common/systems/src/phys.rs | 2 +- network/examples/chat.rs | 6 +- network/examples/fileshare/commands.rs | 2 +- network/examples/fileshare/main.rs | 2 +- network/examples/network-speed/main.rs | 6 +- network/protocol/src/error.rs | 4 +- network/protocol/src/event.rs | 2 +- network/protocol/src/frame.rs | 14 +- network/protocol/src/quic.rs | 2 +- network/src/api.rs | 2 +- rust-toolchain | 2 +- server-cli/src/main.rs | 1 - server/src/chunk_serialize.rs | 2 +- server/src/cmd.rs | 4 +- server/src/events/entity_manipulation.rs | 2 +- server/src/lib.rs | 8 +- server/src/persistence/character_loader.rs | 2 +- server/src/persistence/character_updater.rs | 2 +- server/src/persistence/mod.rs | 16 +- server/src/rtsim/entity.rs | 4 +- server/src/state_ext.rs | 6 +- server/src/sys/agent.rs | 4 +- server/src/sys/entity_sync.rs | 2 +- server/src/sys/msg/register.rs | 12 +- server/src/sys/terrain.rs | 2 +- voxygen/Cargo.toml | 4 +- voxygen/anim/src/arthropod/mod.rs | 22 +- voxygen/anim/src/bird_large/mod.rs | 16 +- voxygen/anim/src/dragon/mod.rs | 2 +- voxygen/anim/src/lib.rs | 2 +- voxygen/anim/src/quadruped_low/mod.rs | 68 +++--- voxygen/anim/src/quadruped_medium/mod.rs | 166 +++++++-------- voxygen/anim/src/quadruped_small/mod.rs | 208 +++++++++---------- voxygen/anim/src/theropod/mod.rs | 18 +- voxygen/i18n/src/lib.rs | 2 +- voxygen/src/audio/channel.rs | 2 +- voxygen/src/audio/fader.rs | 2 +- voxygen/src/cmd.rs | 2 +- voxygen/src/hud/crafting.rs | 76 ++++--- voxygen/src/hud/diary.rs | 2 +- voxygen/src/hud/hotbar.rs | 4 +- voxygen/src/hud/item_imgs.rs | 2 +- voxygen/src/hud/loot_scroller.rs | 6 +- voxygen/src/hud/mod.rs | 14 +- voxygen/src/hud/settings_window/mod.rs | 2 +- voxygen/src/hud/slots.rs | 8 +- voxygen/src/hud/trade.rs | 8 +- voxygen/src/lib.rs | 1 - voxygen/src/main.rs | 1 - voxygen/src/menu/char_selection/mod.rs | 4 +- voxygen/src/render/mod.rs | 10 +- voxygen/src/render/pipelines/bloom.rs | 2 +- voxygen/src/render/renderer.rs | 4 +- voxygen/src/render/renderer/drawer.rs | 2 +- voxygen/src/scene/figure/load.rs | 2 +- voxygen/src/scene/figure/mod.rs | 40 ++-- voxygen/src/scene/mod.rs | 2 +- voxygen/src/scene/terrain.rs | 2 +- voxygen/src/session/mod.rs | 8 +- voxygen/src/session/settings_change.rs | 6 +- voxygen/src/settings/chat.rs | 2 +- voxygen/src/settings/graphics.rs | 2 +- voxygen/src/ui/graphic/renderer.rs | 2 +- voxygen/src/ui/ice/widget/tooltip.rs | 2 +- voxygen/src/ui/widgets/item_tooltip.rs | 4 +- voxygen/src/window.rs | 2 +- world/Cargo.toml | 2 +- world/examples/pricing_csv.rs | 4 +- world/src/canvas.rs | 4 +- world/src/civ/mod.rs | 6 +- world/src/layer/mod.rs | 8 +- world/src/layer/wildlife.rs | 2 +- world/src/lib.rs | 8 +- world/src/sim/erosion.rs | 6 +- world/src/sim/map.rs | 2 +- world/src/sim/mod.rs | 2 +- world/src/site/economy/map_types.rs | 10 +- world/src/site/settlement/mod.rs | 8 +- world/src/site2/mod.rs | 2 +- world/src/site2/tile.rs | 4 +- world/src/site2/util/mod.rs | 2 +- world/src/util/map_array.rs | 2 +- 157 files changed, 604 insertions(+), 612 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 667075b0f2..f575b06355 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5640,8 +5640,7 @@ dependencies = [ [[package]] name = "shaderc" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e6fe602a861622769530a23bc40bfba31adbf186d0c8412e83f5519c5d6bee" +source = "git+https://github.com/pythonesque/shaderc-rs?rev=f2605a02062834019bedff911aee2fd2998c49f9#f2605a02062834019bedff911aee2fd2998c49f9" dependencies = [ "libc", "shaderc-sys", @@ -5650,8 +5649,7 @@ dependencies = [ [[package]] name = "shaderc-sys" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3794498651f8173d0afbc0bb8aca45ced111098227e755dde4c0ef2888c8d0bf" +source = "git+https://github.com/pythonesque/shaderc-rs?rev=f2605a02062834019bedff911aee2fd2998c49f9#f2605a02062834019bedff911aee2fd2998c49f9" dependencies = [ "cmake", "libc", @@ -7806,7 +7804,7 @@ dependencies = [ [[package]] name = "wgpu" version = "0.8.0" -source = "git+https://github.com/gfx-rs/wgpu.git?rev=a92b8549a8e2cb9dac781bafc5ed32828f3caf46#a92b8549a8e2cb9dac781bafc5ed32828f3caf46" +source = "git+https://github.com/pythonesque/wgpu.git?rev=179ea209374a92837cde252f1d9ee01f628cae08#179ea209374a92837cde252f1d9ee01f628cae08" dependencies = [ "arrayvec 0.5.2", "js-sys", @@ -7826,7 +7824,7 @@ dependencies = [ [[package]] name = "wgpu-core" version = "0.8.0" -source = "git+https://github.com/gfx-rs/wgpu.git?rev=a92b8549a8e2cb9dac781bafc5ed32828f3caf46#a92b8549a8e2cb9dac781bafc5ed32828f3caf46" +source = "git+https://github.com/pythonesque/wgpu.git?rev=179ea209374a92837cde252f1d9ee01f628cae08#179ea209374a92837cde252f1d9ee01f628cae08" dependencies = [ "arrayvec 0.5.2", "bitflags", @@ -7866,7 +7864,7 @@ dependencies = [ [[package]] name = "wgpu-types" version = "0.8.0" -source = "git+https://github.com/gfx-rs/wgpu.git?rev=a92b8549a8e2cb9dac781bafc5ed32828f3caf46#a92b8549a8e2cb9dac781bafc5ed32828f3caf46" +source = "git+https://github.com/pythonesque/wgpu.git?rev=179ea209374a92837cde252f1d9ee01f628cae08#179ea209374a92837cde252f1d9ee01f628cae08" dependencies = [ "bitflags", "serde", diff --git a/Cargo.toml b/Cargo.toml index fec9ce5a35..b0c127a1db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -122,7 +122,8 @@ nativeBuildInputs = ["pkg-config"] [patch.crates-io] vek = { git = "https://github.com/yoanlcq/vek.git", rev = "84d5cb65841d46599a986c5477341bea4456be26" } # patch wgpu so we can use wgpu-profiler crate -wgpu = { git = "https://github.com/gfx-rs/wgpu.git", rev = "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" } +# wgpu = { git = "https://github.com/gfx-rs/wgpu.git", rev = "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" } +wgpu = { git = "https://github.com/pythonesque/wgpu.git", rev = "179ea209374a92837cde252f1d9ee01f628cae08" } # # use the latest fixes in naga (remove when updates trickle down to wgpu-rs) # naga = { git = "https://github.com/gfx-rs/naga.git", rev = "3a0f0144112ff621dd7f731bf455adf6cab19164" } diff --git a/client/src/lib.rs b/client/src/lib.rs index d07bd78f85..aea6a66eeb 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -1,6 +1,6 @@ #![deny(unsafe_code)] #![deny(clippy::clone_on_ref_ptr)] -#![feature(label_break_value, option_zip)] +#![feature(option_zip)] pub mod addr; pub mod error; @@ -318,7 +318,7 @@ impl Client { server_info.git_hash, server_info.git_date, common::util::GIT_HASH.to_string(), - common::util::GIT_DATE.to_string(), + *common::util::GIT_DATE, ); } // Pass the server info back to the caller to ensure they can access it even @@ -2568,7 +2568,7 @@ impl Client { pub fn players(&self) -> impl Iterator { self.player_list() .values() - .filter_map(|player_info| player_info.is_online.then(|| &*player_info.player_alias)) + .filter_map(|player_info| player_info.is_online.then_some(&*player_info.player_alias)) } /// Return true if this client is a moderator on the server diff --git a/common/build.rs b/common/build.rs index 4f560e1dd3..71e4750974 100644 --- a/common/build.rs +++ b/common/build.rs @@ -17,7 +17,7 @@ fn main() { // Note: It will compare commits. As long as the commits do not diverge from the // server no version change will be detected. match Command::new("git") - .args(&[ + .args([ "log", "-n", "1", @@ -40,7 +40,7 @@ fn main() { // Note: It will compare commits. As long as the commits do not diverge from the // server no version change will be detected. match Command::new("git") - .args(&["describe", "--exact-match", "--tags", "HEAD"]) + .args(["describe", "--exact-match", "--tags", "HEAD"]) .output() { Ok(output) => match String::from_utf8(output.stdout) { diff --git a/common/ecs/src/system.rs b/common/ecs/src/system.rs index 3ab41663cf..015bec55fe 100644 --- a/common/ecs/src/system.rs +++ b/common/ecs/src/system.rs @@ -5,7 +5,7 @@ use std::{collections::HashMap, time::Instant}; /// measuring the level of threads a unit of code ran on. Use Rayon when it ran /// on their threadpool. Use Exact when you know on how many threads your code /// ran on exactly. -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum ParMode { None, /* Job is not running at all */ Single, @@ -14,7 +14,7 @@ pub enum ParMode { } //TODO: make use of the phase of a system for advanced scheduling and logging -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum Phase { Create, Review, @@ -22,7 +22,7 @@ pub enum Phase { } //TODO: make use of the origin of the system for better logging -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, PartialEq, Eq, Debug)] pub enum Origin { Common, Client, diff --git a/common/net/src/msg/client.rs b/common/net/src/msg/client.rs index 18ad9e52d5..998d7873d7 100644 --- a/common/net/src/msg/client.rs +++ b/common/net/src/msg/client.rs @@ -28,7 +28,7 @@ pub enum ClientMsg { 2nd Level Enums */ -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum ClientType { /// Regular Client like Voxygen who plays the game Game, @@ -39,7 +39,7 @@ pub enum ClientType { Bot { privileged: bool }, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct ClientRegister { pub token_or_username: String, } diff --git a/common/net/src/msg/compression.rs b/common/net/src/msg/compression.rs index 37760baaa0..433d572eff 100644 --- a/common/net/src/msg/compression.rs +++ b/common/net/src/msg/compression.rs @@ -36,7 +36,7 @@ impl CompressedData { let buf = Vec::with_capacity(uncompressed.len() / 10); let mut encoder = DeflateEncoder::new(buf, Compression::new(level)); - encoder.write_all(&*uncompressed).expect(EXPECT_MSG); + encoder.write_all(&uncompressed).expect(EXPECT_MSG); let compressed = encoder.finish().expect(EXPECT_MSG); CompressedData { data: compressed, @@ -60,9 +60,9 @@ impl Deserialize<'a>> CompressedData { flate2::read::DeflateDecoder::new(&*self.data) .read_to_end(&mut uncompressed) .ok()?; - bincode::deserialize(&*uncompressed).ok() + bincode::deserialize(&uncompressed).ok() } else { - bincode::deserialize(&*self.data).ok() + bincode::deserialize(&self.data).ok() } } } @@ -237,7 +237,7 @@ impl VoxelImageEncoding for QuadPngEncoding { CompressionType::Rle, FilterType::Up, ); - png.write_image(&*x.as_raw(), x.width(), x.height(), image::ColorType::L8) + png.write_image(x.as_raw(), x.width(), x.height(), image::ColorType::L8) .ok()?; indices[i] = buf.len(); Some(()) @@ -253,7 +253,7 @@ impl VoxelImageEncoding for QuadPngEncoding { FilterType::Sub, ); png.write_image( - &*ws.3.as_raw(), + ws.3.as_raw(), ws.3.width(), ws.3.height(), image::ColorType::Rgb8, @@ -513,7 +513,7 @@ impl VoxelImageEncoding for TriPngEncoding bool { matches!(self, Self::Character(_) | Self::Possessor) } } -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum PingMsg { Ping, Pong, diff --git a/common/net/src/msg/server.rs b/common/net/src/msg/server.rs index 4280416174..80d1872d30 100644 --- a/common/net/src/msg/server.rs +++ b/common/net/src/msg/server.rs @@ -267,7 +267,7 @@ pub enum DisconnectReason { Kicked(String), } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum RegisterError { AuthError(String), Banned(String), diff --git a/common/src/calendar.rs b/common/src/calendar.rs index f9934d252a..830207809c 100644 --- a/common/src/calendar.rs +++ b/common/src/calendar.rs @@ -8,7 +8,7 @@ pub enum CalendarEvent { Christmas = 0, } -#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct Calendar { events: Vec, } diff --git a/common/src/character.rs b/common/src/character.rs index c065941d21..92401c3fe1 100644 --- a/common/src/character.rs +++ b/common/src/character.rs @@ -10,7 +10,7 @@ pub type CharacterId = i64; pub const MAX_NAME_LENGTH: usize = 20; /// The minimum character data we need to create a new character on the server. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Character { pub id: Option, pub alias: String, diff --git a/common/src/cmd.rs b/common/src/cmd.rs index c0a4e330e8..bd9e772a84 100644 --- a/common/src/cmd.rs +++ b/common/src/cmd.rs @@ -39,7 +39,7 @@ impl ChatCommandData { } } -#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)] pub enum KitSpec { Item(String), ModularWeapon { @@ -47,7 +47,7 @@ pub enum KitSpec { material: comp::item::Material, }, } -#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)] pub struct KitManifest(pub HashMap>); impl assets::Asset for KitManifest { type Loader = assets::RonLoader; @@ -55,7 +55,7 @@ impl assets::Asset for KitManifest { const EXTENSION: &'static str = "ron"; } -#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)] pub struct SkillPresetManifest(pub HashMap>); impl assets::Asset for SkillPresetManifest { type Loader = assets::RonLoader; @@ -875,7 +875,7 @@ impl FromStr for ServerChatCommand { .filter_map(|c| c.short_keyword().map(|s| (s, c))) .chain(Self::iter().map(|c| (c.keyword(), c))) // Find command with matching string as keyword - .find_map(|(kwd, command)| (kwd == keyword).then(|| command)) + .find_map(|(kwd, command)| (kwd == keyword).then_some(command)) // Return error if not found .ok_or(()) } diff --git a/common/src/combat.rs b/common/src/combat.rs index 675f2e99ca..a25cf9856c 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -901,7 +901,7 @@ pub struct Knockback { } #[cfg(not(target_arch = "wasm32"))] -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum KnockbackDir { Away, Towards, diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 652c273a6a..3b88cf1882 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -326,7 +326,7 @@ impl From for Ability { } } -#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq)] +#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] pub enum AuxiliaryAbility { MainWeapon(usize), OffWeapon(usize), diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 8e0c63f8ae..7e47b8d997 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -21,7 +21,7 @@ pub const TRADE_INTERACTION_TIME: f32 = 300.0; const AWARENESS_DECREMENT_CONSTANT: f32 = 2.1; const SECONDS_BEFORE_FORGET_SOUNDS: f64 = 180.0; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Alignment { /// Wild animals and gentle giants Wild, @@ -37,7 +37,7 @@ pub enum Alignment { Passive, } -#[derive(Copy, Clone, Debug, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum Mark { Merchant, Guard, diff --git a/common/src/comp/anchor.rs b/common/src/comp/anchor.rs index f82b9b1881..28f198e05d 100644 --- a/common/src/comp/anchor.rs +++ b/common/src/comp/anchor.rs @@ -4,7 +4,7 @@ use vek::Vec2; /// This component exists in order to fix a bug that caused entities /// such as campfires to duplicate because the chunk was double-loaded. /// See https://gitlab.com/veloren/veloren/-/merge_requests/1543 -#[derive(Copy, Clone, Debug, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum Anchor { /// An entity with an Entity Anchor will be destroyed when its anchor Entity /// no longer exists diff --git a/common/src/comp/aura.rs b/common/src/comp/aura.rs index a66f719b59..5f873c60f4 100644 --- a/common/src/comp/aura.rs +++ b/common/src/comp/aura.rs @@ -70,7 +70,7 @@ pub enum AuraTarget { All, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum Specifier { WardingAura, HealingAura, diff --git a/common/src/comp/beam.rs b/common/src/comp/beam.rs index 95e501938b..3a073e8774 100644 --- a/common/src/comp/beam.rs +++ b/common/src/comp/beam.rs @@ -34,7 +34,7 @@ impl std::ops::Deref for BeamSegment { fn deref(&self) -> &Properties { &self.properties } } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Beam { pub hit_entities: Vec, pub tick_dur: Duration, @@ -45,7 +45,7 @@ impl Component for Beam { type Storage = specs::DenseVecStorage; } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum FrontendSpecifier { Flamethrower, LifestealBeam, diff --git a/common/src/comp/body/arthropod.rs b/common/src/comp/body/arthropod.rs index 021a80b288..4f38fa059b 100644 --- a/common/src/comp/body/arthropod.rs +++ b/common/src/comp/body/arthropod.rs @@ -10,13 +10,13 @@ pub struct Body { impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/biped_large.rs b/common/src/comp/body/biped_large.rs index 44285fa21e..82dea641b7 100644 --- a/common/src/comp/body/biped_large.rs +++ b/common/src/comp/body/biped_large.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/biped_small.rs b/common/src/comp/body/biped_small.rs index 945586f393..7bfa285af9 100644 --- a/common/src/comp/body/biped_small.rs +++ b/common/src/comp/body/biped_small.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/bird_large.rs b/common/src/comp/body/bird_large.rs index 8560aad74a..b393aa0cd0 100644 --- a/common/src/comp/body/bird_large.rs +++ b/common/src/comp/body/bird_large.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/bird_medium.rs b/common/src/comp/body/bird_medium.rs index 6b279cf536..a5da2ece66 100644 --- a/common/src/comp/body/bird_medium.rs +++ b/common/src/comp/body/bird_medium.rs @@ -15,13 +15,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/dragon.rs b/common/src/comp/body/dragon.rs index 07c3991a44..353713abf8 100644 --- a/common/src/comp/body/dragon.rs +++ b/common/src/comp/body/dragon.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/fish_medium.rs b/common/src/comp/body/fish_medium.rs index 924bf09f36..a98788b788 100644 --- a/common/src/comp/body/fish_medium.rs +++ b/common/src/comp/body/fish_medium.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/fish_small.rs b/common/src/comp/body/fish_small.rs index 952a3f5412..172db783e1 100644 --- a/common/src/comp/body/fish_small.rs +++ b/common/src/comp/body/fish_small.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/golem.rs b/common/src/comp/body/golem.rs index 1591a7f41f..706c181872 100644 --- a/common/src/comp/body/golem.rs +++ b/common/src/comp/body/golem.rs @@ -14,13 +14,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/humanoid.rs b/common/src/comp/body/humanoid.rs index a2f5ea2e17..412499ccb7 100644 --- a/common/src/comp/body/humanoid.rs +++ b/common/src/comp/body/humanoid.rs @@ -29,13 +29,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type, diff --git a/common/src/comp/body/object.rs b/common/src/comp/body/object.rs index 3865b4fbd4..bb274d1248 100644 --- a/common/src/comp/body/object.rs +++ b/common/src/comp/body/object.rs @@ -106,7 +106,7 @@ make_case_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - *(&ALL_OBJECTS).choose(&mut rng).unwrap() + *ALL_OBJECTS.choose(&mut rng).unwrap() } } diff --git a/common/src/comp/body/quadruped_low.rs b/common/src/comp/body/quadruped_low.rs index 7affcab6bf..eb9665aa4b 100644 --- a/common/src/comp/body/quadruped_low.rs +++ b/common/src/comp/body/quadruped_low.rs @@ -15,13 +15,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/quadruped_medium.rs b/common/src/comp/body/quadruped_medium.rs index 185b611536..5dfaf2ade9 100644 --- a/common/src/comp/body/quadruped_medium.rs +++ b/common/src/comp/body/quadruped_medium.rs @@ -15,13 +15,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/quadruped_small.rs b/common/src/comp/body/quadruped_small.rs index 0a23d4fbb8..3a050dd00f 100644 --- a/common/src/comp/body/quadruped_small.rs +++ b/common/src/comp/body/quadruped_small.rs @@ -15,13 +15,13 @@ make_proj_elim!( impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/body/ship.rs b/common/src/comp/body/ship.rs index 113138df9f..1c722d6b5a 100644 --- a/common/src/comp/body/ship.rs +++ b/common/src/comp/body/ship.rs @@ -42,13 +42,13 @@ impl Body { Self::random_with(&mut rng) } - pub fn random_with(rng: &mut impl rand::Rng) -> Self { *(&ALL_BODIES).choose(rng).unwrap() } + pub fn random_with(rng: &mut impl rand::Rng) -> Self { *ALL_BODIES.choose(rng).unwrap() } pub fn random_airship_with(rng: &mut impl rand::Rng) -> Self { - *(&ALL_AIRSHIPS).choose(rng).unwrap() + *ALL_AIRSHIPS.choose(rng).unwrap() } - pub fn random_ship_with(rng: &mut impl rand::Rng) -> Self { *(&ALL_SHIPS).choose(rng).unwrap() } + pub fn random_ship_with(rng: &mut impl rand::Rng) -> Self { *ALL_SHIPS.choose(rng).unwrap() } /// Return the structure manifest that this ship uses. `None` means that it /// should be derived from the collider. diff --git a/common/src/comp/body/theropod.rs b/common/src/comp/body/theropod.rs index 5ef4df981f..ddca7d7c0e 100644 --- a/common/src/comp/body/theropod.rs +++ b/common/src/comp/body/theropod.rs @@ -10,13 +10,13 @@ pub struct Body { impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let species = *ALL_SPECIES.choose(&mut rng).unwrap(); Self::random_with(&mut rng, &species) } #[inline] pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { - let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + let body_type = *ALL_BODY_TYPES.choose(rng).unwrap(); Self { species, body_type } } } diff --git a/common/src/comp/buff.rs b/common/src/comp/buff.rs index 572b5e8af3..1b19446da2 100644 --- a/common/src/comp/buff.rs +++ b/common/src/comp/buff.rs @@ -422,7 +422,7 @@ impl PartialEq for Buff { } /// Source of the de/buff -#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum BuffSource { /// Applied by a character Character { by: Uid }, @@ -505,7 +505,7 @@ impl Buffs { self.kinds .get(&kind) .map(|ids| ids.iter()) - .unwrap_or_else(|| (&[]).iter()) + .unwrap_or_else(|| [].iter()) .map(move |id| (*id, &self.buffs[id])) } diff --git a/common/src/comp/controller.rs b/common/src/comp/controller.rs index 3396f22016..83a219536b 100644 --- a/common/src/comp/controller.rs +++ b/common/src/comp/controller.rs @@ -17,7 +17,7 @@ use specs::Component; use std::collections::BTreeMap; use vek::*; -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum InventoryEvent { Pickup(Uid), Swap(InvSlotId, InvSlotId), @@ -31,7 +31,7 @@ pub enum InventoryEvent { }, } -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum InventoryAction { Swap(EquipSlot, Slot), Drop(EquipSlot), @@ -40,7 +40,7 @@ pub enum InventoryAction { Collect(Vec3), } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum InventoryManip { Pickup(Uid), Collect(Vec3), @@ -93,7 +93,7 @@ impl From for InventoryManip { } } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum CraftEvent { Simple { recipe: String, @@ -115,7 +115,7 @@ pub enum CraftEvent { }, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum GroupManip { Leave, Kick(Uid), @@ -136,7 +136,7 @@ pub enum UtteranceKind { * sounds */ } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ControlEvent { //ToggleLantern, EnableLantern, @@ -230,7 +230,7 @@ pub struct InputAttr { pub target_entity: Option, } -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Climb { Up, Down, diff --git a/common/src/comp/energy.rs b/common/src/comp/energy.rs index a98a2ce544..8629fa4bd5 100644 --- a/common/src/comp/energy.rs +++ b/common/src/comp/energy.rs @@ -66,7 +66,7 @@ impl Energy { // NaN does not need to be handled here as rust will automatically change to 0 when casting to u32 .clamp(0.0, Self::MAX_SCALED_ENERGY as f32) as u32; - (maximum != self.maximum).then(|| maximum) + (maximum != self.maximum).then_some(maximum) } /// Updates the maximum value for energy. diff --git a/common/src/comp/fluid_dynamics.rs b/common/src/comp/fluid_dynamics.rs index 5c5bdc363a..9124ae501a 100644 --- a/common/src/comp/fluid_dynamics.rs +++ b/common/src/comp/fluid_dynamics.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use std::f32::consts::PI; use vek::*; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum LiquidKind { Water, Lava, diff --git a/common/src/comp/group.rs b/common/src/comp/group.rs index d3315b365a..7135eccab4 100644 --- a/common/src/comp/group.rs +++ b/common/src/comp/group.rs @@ -38,7 +38,7 @@ pub struct GroupInfo { pub name: String, } -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum Role { Member, Pet, @@ -504,7 +504,7 @@ impl GroupManager { self.groups[group.0 as usize].leader = new_leader; // Point to new leader - members(group, &*groups, entities, alignments, uids).for_each(|(e, role)| match role { + members(group, groups, entities, alignments, uids).for_each(|(e, role)| match role { Role::Member => notifier(e, ChangeNotification::NewLeader(new_leader)), Role::Pet => {}, }); diff --git a/common/src/comp/health.rs b/common/src/comp/health.rs index c2a27cfc08..2e6c2eaa5a 100644 --- a/common/src/comp/health.rs +++ b/common/src/comp/health.rs @@ -105,7 +105,7 @@ impl Health { // NaN does not need to be handled here as rust will automatically change to 0 when casting to u32 .clamp(0.0, Self::MAX_SCALED_HEALTH as f32) as u32; - (maximum != self.maximum).then(|| maximum) + (maximum != self.maximum).then_some(maximum) } /// Updates the maximum value for health. @@ -172,8 +172,8 @@ impl Health { .damage_contributors .entry(attacker) .or_insert((0, change.time)); - (*entry).0 += u64::try_from(-delta).unwrap_or(0); - (*entry).1 = change.time + entry.0 += u64::try_from(-delta).unwrap_or(0); + entry.1 = change.time } // Prune any damage contributors who haven't contributed damage for over the diff --git a/common/src/comp/inputs.rs b/common/src/comp/inputs.rs index a3f93bb65e..d6159f496f 100644 --- a/common/src/comp/inputs.rs +++ b/common/src/comp/inputs.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use specs::{Component, DenseVecStorage, DerefFlaggedStorage}; use vek::geom::Aabb; -#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct CanBuild { pub enabled: bool, pub build_areas: HashSet>>, diff --git a/common/src/comp/inventory/item/armor.rs b/common/src/comp/inventory/item/armor.rs index 26baf0152e..05983d9378 100644 --- a/common/src/comp/inventory/item/armor.rs +++ b/common/src/comp/inventory/item/armor.rs @@ -35,7 +35,7 @@ impl Armor { } /// longitudinal and lateral friction, only meaningful for footwear -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Friction { Normal, Ski, diff --git a/common/src/comp/inventory/item/mod.rs b/common/src/comp/inventory/item/mod.rs index bff26293c9..15aac14b35 100644 --- a/common/src/comp/inventory/item/mod.rs +++ b/common/src/comp/inventory/item/mod.rs @@ -210,7 +210,7 @@ impl TagExampleInfo for Material { fn exemplar_identifier(&self) -> Option<&str> { self.asset_identifier() } } -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ItemTag { /// Used to indicate that an item is composed of this material Material(Material), @@ -559,7 +559,7 @@ impl TryFrom<(&Item, &AbilityMap, &MaterialStatManifest)> for ItemConfig { ability_map.get_ability_set(key) }; let abilities = if let Some(set_key) = item.ability_spec() { - if let Some(set) = ability_map.get_ability_set(&*set_key) { + if let Some(set) = ability_map.get_ability_set(&set_key) { set.clone().modified_by_tool(tool) } else { error!( diff --git a/common/src/comp/inventory/item/modular.rs b/common/src/comp/inventory/item/modular.rs index 23acc1305d..9bb079f7b7 100644 --- a/common/src/comp/inventory/item/modular.rs +++ b/common/src/comp/inventory/item/modular.rs @@ -239,7 +239,7 @@ pub enum ModularComponent { }, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum WeaponName { Universal(String), HandednessDependent { diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 2e0f1c6cfc..53e175e57a 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -798,7 +798,7 @@ fn default_main_tool(body: &Body) -> Item { #[derive(Clone)] pub struct LoadoutBuilder(Loadout); -#[derive(Copy, Clone, PartialEq, Deserialize, Serialize, Debug, EnumIter)] +#[derive(Copy, Clone, PartialEq, Eq, Deserialize, Serialize, Debug, EnumIter)] pub enum Preset { HuskSummon, } @@ -1083,7 +1083,7 @@ impl LoadoutBuilder { // Panic if item doesn't correspond to slot assert!( item.as_ref() - .map_or(true, |item| equip_slot.can_hold(&*item.kind())) + .map_or(true, |item| equip_slot.can_hold(&item.kind())) ); self.0.swap(equip_slot, item); diff --git a/common/src/comp/inventory/mod.rs b/common/src/comp/inventory/mod.rs index d08329ca11..89305fa4c3 100644 --- a/common/src/comp/inventory/mod.rs +++ b/common/src/comp/inventory/mod.rs @@ -559,7 +559,7 @@ impl Inventory { #[must_use = "Returned items will be lost if not used"] pub fn equip(&mut self, inv_slot: InvSlotId) -> Vec { self.get(inv_slot) - .and_then(|item| self.loadout.get_slot_to_equip_into(&*item.kind())) + .and_then(|item| self.loadout.get_slot_to_equip_into(&item.kind())) .map(|equip_slot| self.swap_inventory_loadout(inv_slot, equip_slot)) .unwrap_or_else(Vec::new) } @@ -570,7 +570,7 @@ impl Inventory { pub fn free_after_equip(&self, inv_slot: InvSlotId) -> i32 { let (inv_slot_for_equipped, slots_from_equipped) = self .get(inv_slot) - .and_then(|item| self.loadout.get_slot_to_equip_into(&*item.kind())) + .and_then(|item| self.loadout.get_slot_to_equip_into(&item.kind())) .and_then(|equip_slot| self.equipped(equip_slot)) .map_or((1, 0), |item| (0, item.slots().len())); diff --git a/common/src/comp/inventory/slot.rs b/common/src/comp/inventory/slot.rs index 5817c80746..4490deb120 100644 --- a/common/src/comp/inventory/slot.rs +++ b/common/src/comp/inventory/slot.rs @@ -6,12 +6,12 @@ use crate::comp::inventory::{ loadout::LoadoutSlotId, }; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub enum SlotError { InventoryFull, } -#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum Slot { Inventory(InvSlotId), Equip(EquipSlot), diff --git a/common/src/comp/inventory/trade_pricing.rs b/common/src/comp/inventory/trade_pricing.rs index 5a07f0858b..44da73fe28 100644 --- a/common/src/comp/inventory/trade_pricing.rs +++ b/common/src/comp/inventory/trade_pricing.rs @@ -459,7 +459,7 @@ impl EqualitySet { let canonical_itemname = self .equivalence_class .get(item_name) - .map_or(item_name, |i| &*i); + .map_or(item_name, |i| i); canonical_itemname } diff --git a/common/src/comp/invite.rs b/common/src/comp/invite.rs index 194ec0974b..d1c1f1e370 100644 --- a/common/src/comp/invite.rs +++ b/common/src/comp/invite.rs @@ -1,13 +1,13 @@ use serde::{Deserialize, Serialize}; use specs::Component; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum InviteKind { Group, Trade, } -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum InviteResponse { Accept, Decline, diff --git a/common/src/comp/misc.rs b/common/src/comp/misc.rs index 35d8981afd..968c894ff7 100644 --- a/common/src/comp/misc.rs +++ b/common/src/comp/misc.rs @@ -3,7 +3,7 @@ use crate::uid::Uid; use serde::{Deserialize, Serialize}; use specs::Component; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Object { Bomb { owner: Option, diff --git a/common/src/comp/phys.rs b/common/src/comp/phys.rs index 4df06ea57f..94308227c4 100644 --- a/common/src/comp/phys.rs +++ b/common/src/comp/phys.rs @@ -156,14 +156,14 @@ impl Component for Collider { type Storage = DerefFlaggedStorage>; } -#[derive(Copy, Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Sticky; impl Component for Sticky { type Storage = DerefFlaggedStorage>; } -#[derive(Copy, Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Immovable; impl Component for Immovable { @@ -213,7 +213,7 @@ impl Component for PhysicsState { /// Used to forcefully update the position, velocity, and orientation of the /// client -#[derive(Copy, Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct ForceUpdate { flag: bool, counter: u64, diff --git a/common/src/comp/shockwave.rs b/common/src/comp/shockwave.rs index d04c40c1bd..4795aae2db 100644 --- a/common/src/comp/shockwave.rs +++ b/common/src/comp/shockwave.rs @@ -35,7 +35,7 @@ impl std::ops::Deref for Shockwave { fn deref(&self) -> &Properties { &self.properties } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct ShockwaveHitEntities { pub hit_entities: Vec, } @@ -44,7 +44,7 @@ impl Component for ShockwaveHitEntities { type Storage = specs::DenseVecStorage; } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum FrontendSpecifier { Ground, Fire, diff --git a/common/src/comp/skillset/mod.rs b/common/src/comp/skillset/mod.rs index d5f9d65bfa..a5bf7e8967 100644 --- a/common/src/comp/skillset/mod.rs +++ b/common/src/comp/skillset/mod.rs @@ -232,7 +232,7 @@ impl SkillGroup { /// Contains all of a player's skill groups and skills. Provides methods for /// manipulating assigned skills and skill groups including unlocking skills, /// refunding skills etc. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct SkillSet { skill_groups: HashMap, skills: HashMap, @@ -567,7 +567,7 @@ pub enum SpRewardError { Overflow, } -#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, Serialize)] pub enum SkillsPersistenceError { HashMismatch, DeserializationFailure, diff --git a/common/src/generation.rs b/common/src/generation.rs index 92609bb3f0..cd6b7be045 100644 --- a/common/src/generation.rs +++ b/common/src/generation.rs @@ -12,14 +12,14 @@ use crate::{ use serde::Deserialize; use vek::*; -#[derive(Debug, Deserialize, Clone, PartialEq)] +#[derive(Debug, Deserialize, Clone, PartialEq, Eq)] pub enum NameKind { Name(String), Automatic, Uninit, } -#[derive(Debug, Deserialize, Clone, PartialEq)] +#[derive(Debug, Deserialize, Clone, PartialEq, Eq)] pub enum BodyBuilder { RandomWith(String), Exact(Body), diff --git a/common/src/lib.rs b/common/src/lib.rs index 6cf1b69302..87fbcf8801 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -5,9 +5,7 @@ #![deny(clippy::clone_on_ref_ptr)] #![feature( associated_type_defaults, - bool_to_option, fundamental, - label_break_value, option_zip, trait_alias, type_alias_impl_trait, diff --git a/common/src/lottery.rs b/common/src/lottery.rs index 38ca914e72..d3c627a996 100644 --- a/common/src/lottery.rs +++ b/common/src/lottery.rs @@ -76,7 +76,7 @@ impl Lottery { pub fn total(&self) -> f32 { self.total } } -#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub enum LootSpec> { /// Asset specifier Item(T), diff --git a/common/src/npc.rs b/common/src/npc.rs index 1985d7f113..0d40aafa1e 100644 --- a/common/src/npc.rs +++ b/common/src/npc.rs @@ -7,7 +7,7 @@ use rand::seq::SliceRandom; use serde::Deserialize; use std::str::FromStr; -#[derive(Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq, Eq)] pub enum NpcKind { Humanoid, Wolf, diff --git a/common/src/recipe.rs b/common/src/recipe.rs index 4bc704e895..c5334f5b7e 100644 --- a/common/src/recipe.rs +++ b/common/src/recipe.rs @@ -191,7 +191,7 @@ impl Recipe { for (inv_slot_id, slot) in inv.slots_with_id() { if let Some(item) = slot .as_ref() - .filter(|item| item.matches_recipe_input(&*input, amount)) + .filter(|item| item.matches_recipe_input(input, amount)) { *input_max.entry(inv_slot_id).or_insert(0) += item.amount(); } @@ -241,7 +241,7 @@ fn inventory_contains_ingredients<'a, I: Iterator for (inv_slot_id, slot) in inv.slots_with_id() { if let Some(item) = slot .as_ref() - .filter(|item| item.matches_recipe_input(&*input, amount)) + .filter(|item| item.matches_recipe_input(input, amount)) { let claim = slot_claims.entry(inv_slot_id).or_insert(0); slots.push((i as u32, inv_slot_id)); diff --git a/common/src/skillset_builder.rs b/common/src/skillset_builder.rs index 900b4237c7..fd0c67941a 100644 --- a/common/src/skillset_builder.rs +++ b/common/src/skillset_builder.rs @@ -9,7 +9,7 @@ use tracing::warn; /// `SkillSetBuilder` preset. Consider using loading from assets, when possible. /// When you're adding new enum variant, /// handle it in [`with_preset`](SkillSetBuilder::with_preset) method -#[derive(Copy, Clone, PartialEq, Serialize, Deserialize, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)] pub enum Preset { Rank1, Rank2, diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs index 13ec4fe91d..56547ab614 100644 --- a/common/src/states/charged_melee.rs +++ b/common/src/states/charged_melee.rs @@ -181,7 +181,7 @@ impl CharacterBehavior for Data { } /// Used to specify a particular effect for frontend purposes -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum FrontendSpecifier { GroundCleave, } diff --git a/common/src/states/equipping.rs b/common/src/states/equipping.rs index b70cb72ade..9ef1743990 100644 --- a/common/src/states/equipping.rs +++ b/common/src/states/equipping.rs @@ -10,13 +10,13 @@ use serde::{Deserialize, Serialize}; use std::time::Duration; /// Separated out to condense update portions of character state -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct StaticData { /// Time required to draw weapon pub buildup_duration: Duration, } -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Data { /// Struct containing data that does not change over the course of the /// character state diff --git a/common/src/states/idle.rs b/common/src/states/idle.rs index 4d46446694..ae37b42d2a 100644 --- a/common/src/states/idle.rs +++ b/common/src/states/idle.rs @@ -8,7 +8,7 @@ use crate::{ }; use serde::{Deserialize, Serialize}; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Default)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct Data { pub is_sneaking: bool, // None means unknown diff --git a/common/src/states/spin_melee.rs b/common/src/states/spin_melee.rs index a3edd9b480..a7bdf86280 100644 --- a/common/src/states/spin_melee.rs +++ b/common/src/states/spin_melee.rs @@ -175,7 +175,7 @@ impl CharacterBehavior for Data { } } -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum MovementBehavior { Stationary, ForwardGround, @@ -183,7 +183,7 @@ pub enum MovementBehavior { Walking, } -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum FrontendSpecifier { CultistVortex, } diff --git a/common/src/states/sprite_interact.rs b/common/src/states/sprite_interact.rs index 8faa350d18..59fbc8fb90 100644 --- a/common/src/states/sprite_interact.rs +++ b/common/src/states/sprite_interact.rs @@ -14,7 +14,7 @@ use std::time::Duration; use vek::Vec3; /// Separated out to condense update portions of character state -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct StaticData { /// Buildup to sprite interaction pub buildup_duration: Duration, @@ -32,7 +32,7 @@ pub struct StaticData { pub was_sneak: bool, } -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Data { /// Struct containing data that does not change over the course of the /// character state @@ -128,7 +128,7 @@ impl CharacterBehavior for Data { } /// Used to control effects based off of the type of sprite interacted with -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum SpriteInteractKind { Chest, Harvestable, diff --git a/common/src/states/use_item.rs b/common/src/states/use_item.rs index 5d6a2fac9c..d350a5c9ed 100644 --- a/common/src/states/use_item.rs +++ b/common/src/states/use_item.rs @@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize}; use std::time::Duration; /// Separated out to condense update portions of character state -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct StaticData { /// Buildup to item use pub buildup_duration: Duration, @@ -39,7 +39,7 @@ pub struct StaticData { pub was_sneak: bool, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Data { /// Struct containing data that does not change over the course of the /// character state @@ -163,7 +163,7 @@ impl CharacterBehavior for Data { } /// Used to control effects based off of the type of item used -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ItemUseKind { Consumable(ConsumableKind), } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 5dfa4a0897..7641f091c3 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -1199,7 +1199,7 @@ pub enum ForcedMovement { }, } -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum MovementDirection { Look, Move, @@ -1253,7 +1253,7 @@ impl AbilityInfo { } } -#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum HandInfo { TwoHanded, MainHand, diff --git a/common/src/states/wielding.rs b/common/src/states/wielding.rs index 0cfea7f298..ebe089e58b 100644 --- a/common/src/states/wielding.rs +++ b/common/src/states/wielding.rs @@ -12,7 +12,7 @@ use crate::{ }; use serde::{Deserialize, Serialize}; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Data { pub is_sneaking: bool, } diff --git a/common/src/terrain/site.rs b/common/src/terrain/site.rs index b1652df67c..b4de963cba 100644 --- a/common/src/terrain/site.rs +++ b/common/src/terrain/site.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum SiteKindMeta { Dungeon(DungeonKindMeta), Cave, @@ -9,13 +9,13 @@ pub enum SiteKindMeta { Void, } -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum DungeonKindMeta { Old, Gnarling, } -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum SettlementKindMeta { Default, Cliff, diff --git a/common/src/terrain/structure.rs b/common/src/terrain/structure.rs index 1465e8cb2d..78eeea91ed 100644 --- a/common/src/terrain/structure.rs +++ b/common/src/terrain/structure.rs @@ -12,7 +12,7 @@ use vek::*; make_case_elim!( structure_block, - #[derive(Copy, Clone, PartialEq, Debug, Deserialize)] + #[derive(Copy, Clone, PartialEq, Eq, Debug, Deserialize)] #[repr(u8)] pub enum StructureBlock { None = 0, diff --git a/common/src/trade.rs b/common/src/trade.rs index 6d03dfae73..496c05358e 100644 --- a/common/src/trade.rs +++ b/common/src/trade.rs @@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize}; use strum::EnumIter; use tracing::{trace, warn}; -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum TradePhase { Mutate, Review, @@ -22,7 +22,7 @@ pub enum TradePhase { /// Clients submit `TradeAction` to the server, which adds the Uid of the /// player out-of-band (i.e. without trusting the client to say who it's /// accepting on behalf of) -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum TradeAction { AddItem { item: InvSlotId, @@ -41,7 +41,7 @@ pub enum TradeAction { Decline, } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum TradeResult { Completed, Declined, @@ -73,7 +73,7 @@ pub enum TradeResult { /// trading currently-equipped items (since `EquipSlot`s are disjoint from /// `InvSlotId`s), which avoids the issues associated with trading equipped bags /// that may still have contents. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct PendingTrade { /// `parties[0]` is the entity that initiated the trade, parties[1] is the /// other entity that's being traded with @@ -239,7 +239,7 @@ impl Trades { None => return, } } - trade.process_trade_action(party, action, &*inventories); + trade.process_trade_action(party, action, &inventories); } else { warn!( "An entity who is not a party to trade {:?} tried to modify it", diff --git a/common/state/src/plugin/errors.rs b/common/state/src/plugin/errors.rs index 1709c60365..b206b47002 100644 --- a/common/state/src/plugin/errors.rs +++ b/common/state/src/plugin/errors.rs @@ -13,7 +13,7 @@ pub enum PluginError { #[derive(Debug)] pub enum PluginModuleError { - InstantiationError(InstantiationError), + InstantiationError(Box), MemoryAllocation(MemoryAllocationError), MemoryUninit(ExportError), FindFunction(ExportError), diff --git a/common/state/src/plugin/mod.rs b/common/state/src/plugin/mod.rs index 8197f4b076..034e7f07ad 100644 --- a/common/state/src/plugin/mod.rs +++ b/common/state/src/plugin/mod.rs @@ -114,7 +114,7 @@ pub struct PluginMgr { impl PluginMgr { pub fn from_assets() -> Result { - let mut assets_path = (&*ASSETS_PATH).clone(); + let mut assets_path = (*ASSETS_PATH).clone(); assets_path.push("plugins"); info!("Searching {:?} for plugins...", assets_path); Self::from_dir(assets_path) diff --git a/common/state/src/plugin/module.rs b/common/state/src/plugin/module.rs index b7cdfec56e..f104f2a1a3 100644 --- a/common/state/src/plugin/module.rs +++ b/common/state/src/plugin/module.rs @@ -37,7 +37,7 @@ impl PluginModule { // We are creating an enironnement let store = Store::new(&engine); // We are compiling the WASM file in the previously generated environement - let module = Module::new(&store, &wasm_data).expect("Can't compile"); + let module = Module::new(&store, wasm_data).expect("Can't compile"); // This is the function imported into the wasm environement fn raw_emit_actions(env: &HostFunctionEnvironement, ptr: i64, len: i64) { @@ -79,7 +79,7 @@ impl PluginModule { // Create an instance (Code execution environement) let instance = Instance::new(&module, &import_object) - .map_err(PluginModuleError::InstantiationError)?; + .map_err(|err| PluginModuleError::InstantiationError(Box::new(err)))?; Ok(Self { memory_manager, ecs, diff --git a/common/systems/src/buff.rs b/common/systems/src/buff.rs index 56d47e933c..fb70b7e122 100644 --- a/common/systems/src/buff.rs +++ b/common/systems/src/buff.rs @@ -212,7 +212,7 @@ impl<'a> System<'a> for Sys { for (kind, ids) in buff_comp_kinds.iter() { if kind.queues() { if let Some((Some(buff), id)) = - ids.get(0).map(|id| (buff_comp_buffs.get_mut(id), id)) + ids.first().map(|id| (buff_comp_buffs.get_mut(id), id)) { tick_buff(*id, buff, dt, |id| expired_buffs.push(id)); } @@ -262,7 +262,7 @@ impl<'a> System<'a> for Sys { buff.kind, buff.time, &read_data, - &mut *stat, + &mut stat, health, energy, entity, diff --git a/common/systems/src/lib.rs b/common/systems/src/lib.rs index a88b20b9b9..05fab14477 100644 --- a/common/systems/src/lib.rs +++ b/common/systems/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(bool_to_option, let_else, btree_drain_filter)] +#![feature(let_else, btree_drain_filter)] #![allow(clippy::option_map_unit_fn)] mod aura; diff --git a/common/systems/src/phys.rs b/common/systems/src/phys.rs index 86fb126403..7c2b98c138 100644 --- a/common/systems/src/phys.rs +++ b/common/systems/src/phys.rs @@ -540,7 +540,7 @@ impl<'a> PhysicsData<'a> { .join() { let vol = match collider { - Collider::Voxel { id } => voxel_colliders_manifest.colliders.get(&*id), + Collider::Voxel { id } => voxel_colliders_manifest.colliders.get(id), Collider::Volume(vol) => Some(&**vol), _ => None, }; diff --git a/network/examples/chat.rs b/network/examples/chat.rs index d52db59d3a..8e2641ba22 100644 --- a/network/examples/chat.rs +++ b/network/examples/chat.rs @@ -23,7 +23,7 @@ fn main() { .short('m') .long("mode") .takes_value(true) - .possible_values(&["server", "client", "both"]) + .possible_values(["server", "client", "both"]) .default_value("both") .help( "choose whether you want to start the server or client or both needed for \ @@ -50,7 +50,7 @@ fn main() { .long("protocol") .takes_value(true) .default_value("tcp") - .possible_values(&["tcp", "upd", "mpsc"]) + .possible_values(["tcp", "upd", "mpsc"]) .help( "underlying protocol used for this test, mpsc can only combined with mode=both", ), @@ -61,7 +61,7 @@ fn main() { .long("trace") .takes_value(true) .default_value("warn") - .possible_values(&["trace", "debug", "info", "warn", "error"]) + .possible_values(["trace", "debug", "info", "warn", "error"]) .help("set trace level, not this has a performance impact!"), ) .get_matches(); diff --git a/network/examples/fileshare/commands.rs b/network/examples/fileshare/commands.rs index 9f23ddb6aa..f2f5f36b59 100644 --- a/network/examples/fileshare/commands.rs +++ b/network/examples/fileshare/commands.rs @@ -22,7 +22,7 @@ pub enum Command { Get(u32), } -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct FileInfo { id: u32, pub path: String, diff --git a/network/examples/fileshare/main.rs b/network/examples/fileshare/main.rs index f821a211af..9c82166295 100644 --- a/network/examples/fileshare/main.rs +++ b/network/examples/fileshare/main.rs @@ -34,7 +34,7 @@ fn main() { .long("trace") .takes_value(true) .default_value("warn") - .possible_values(&["trace", "debug", "info", "warn", "error"]) + .possible_values(["trace", "debug", "info", "warn", "error"]) .help("set trace level, not this has a performance impact!"), ) .get_matches(); diff --git a/network/examples/network-speed/main.rs b/network/examples/network-speed/main.rs index 931989c2ac..a35eac0940 100644 --- a/network/examples/network-speed/main.rs +++ b/network/examples/network-speed/main.rs @@ -36,7 +36,7 @@ fn main() { .short('m') .long("mode") .takes_value(true) - .possible_values(&["server", "client", "both"]) + .possible_values(["server", "client", "both"]) .default_value("both") .help( "choose whether you want to start the server or client or both needed for \ @@ -63,7 +63,7 @@ fn main() { .long("protocol") .takes_value(true) .default_value("tcp") - .possible_values(&["tcp", "udp", "mpsc"]) + .possible_values(["tcp", "udp", "mpsc"]) .help( "underlying protocol used for this test, mpsc can only combined with mode=both", ), @@ -74,7 +74,7 @@ fn main() { .long("trace") .takes_value(true) .default_value("warn") - .possible_values(&["trace", "debug", "info", "warn", "error"]) + .possible_values(["trace", "debug", "info", "warn", "error"]) .help("set trace level, not this has a performance impact!"), ) .get_matches(); diff --git a/network/protocol/src/error.rs b/network/protocol/src/error.rs index 3c63a4907d..0601e4e4c7 100644 --- a/network/protocol/src/error.rs +++ b/network/protocol/src/error.rs @@ -1,7 +1,7 @@ /// All possible Errors that can happen during Handshake [`InitProtocol`] /// /// [`InitProtocol`]: crate::InitProtocol -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub enum InitProtocolError { Custom(E), /// expected Handshake, didn't get handshake @@ -13,7 +13,7 @@ pub enum InitProtocolError { } /// When you return closed you must stay closed! -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub enum ProtocolError { /// Custom Error on the underlying I/O, /// e.g. the TCP, UDP or MPSC connection is dropped by the OS diff --git a/network/protocol/src/event.rs b/network/protocol/src/event.rs index f0f333ed8a..a57e0a77df 100644 --- a/network/protocol/src/event.rs +++ b/network/protocol/src/event.rs @@ -9,7 +9,7 @@ use bytes::Bytes; /// [`SendProtocol`]: crate::SendProtocol /// [`RecvProtocol`]: crate::RecvProtocol #[derive(Debug, Clone)] -#[cfg_attr(test, derive(PartialEq))] +#[cfg_attr(test, derive(PartialEq, Eq))] pub enum ProtocolEvent { Shutdown, OpenStream { diff --git a/network/protocol/src/frame.rs b/network/protocol/src/frame.rs index bcf548ca7f..fc95aff072 100644 --- a/network/protocol/src/frame.rs +++ b/network/protocol/src/frame.rs @@ -14,7 +14,7 @@ const FRAME_RAW: u8 = 8; //const FRAME_RESERVED_3: u8 = 13; /// Used for Communication between Channel <----(TCP/UDP)----> Channel -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum InitFrame { Handshake { magic_number: [u8; 7], @@ -30,7 +30,7 @@ pub enum InitFrame { } /// Used for OUT TCP Communication between Channel --(TCP)--> Channel -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum OTFrame { Shutdown, /* Shutdown this channel gracefully, if all channels are shutdown (gracefully), * Participant is deleted */ @@ -55,7 +55,7 @@ pub enum OTFrame { } /// Used for IN TCP Communication between Channel <--(TCP)-- Channel -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum ITFrame { Shutdown, /* Shutdown this channel gracefully, if all channels are shutdown (gracefully), * Participant is deleted */ @@ -113,7 +113,7 @@ impl InitFrame { } pub(crate) fn read_frame(bytes: &mut BytesMut) -> Option { - let frame_no = match bytes.get(0) { + let frame_no = match bytes.first() { Some(&f) => f, None => return None, }; @@ -454,7 +454,7 @@ mod tests { magic_number: VELOREN_MAGIC_NUMBER, version: VELOREN_NETWORK_VERSION, }; - let _ = InitFrame::write_bytes(frame1, &mut buffer); + InitFrame::write_bytes(frame1, &mut buffer); buffer.truncate(6); // simulate partial retrieve let frame1d = InitFrame::read_frame(&mut buffer); assert_eq!(frame1d, None); @@ -474,7 +474,7 @@ mod tests { let mut buffer = BytesMut::with_capacity(50); let frame1 = InitFrame::Raw(b"foobar".to_vec()); - let _ = InitFrame::write_bytes(frame1.clone(), &mut buffer); + InitFrame::write_bytes(frame1.clone(), &mut buffer); buffer[1] = 255; let framed = InitFrame::read_frame(&mut buffer); assert_eq!(framed, Some(frame1)); @@ -485,7 +485,7 @@ mod tests { let mut buffer = BytesMut::with_capacity(50); let frame1 = InitFrame::Raw(b"foobar".to_vec()); - let _ = InitFrame::write_bytes(frame1, &mut buffer); + InitFrame::write_bytes(frame1, &mut buffer); buffer[1] = 3; let framed = InitFrame::read_frame(&mut buffer); // we accept a different frame here, as it's RAW and debug only! diff --git a/network/protocol/src/quic.rs b/network/protocol/src/quic.rs index 566364e017..d61d9113b5 100644 --- a/network/protocol/src/quic.rs +++ b/network/protocol/src/quic.rs @@ -18,7 +18,7 @@ use tracing::info; #[cfg(feature = "trace_pedantic")] use tracing::trace; -#[derive(PartialEq)] +#[derive(PartialEq, Eq)] pub enum QuicDataFormatStream { Main, Reliable(Sid), diff --git a/network/src/api.rs b/network/src/api.rs index 9fb3526c3c..096bded719 100644 --- a/network/src/api.rs +++ b/network/src/api.rs @@ -121,7 +121,7 @@ pub enum NetworkConnectError { } /// Error type thrown by [`Participants`](Participant) methods -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum ParticipantError { ///Participant was closed by remote side ParticipantDisconnected, diff --git a/rust-toolchain b/rust-toolchain index f6f9b5b6c6..62193b6c62 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2022-04-25 +nightly-2022-09-08 diff --git a/server-cli/src/main.rs b/server-cli/src/main.rs index e88c6d7572..78b8ff89f2 100644 --- a/server-cli/src/main.rs +++ b/server-cli/src/main.rs @@ -1,6 +1,5 @@ #![deny(unsafe_code)] #![deny(clippy::clone_on_ref_ptr)] -#![feature(bool_to_option)] #[cfg(target_os = "windows")] #[global_allocator] diff --git a/server/src/chunk_serialize.rs b/server/src/chunk_serialize.rs index 4986bd0f49..3c11cd8e50 100644 --- a/server/src/chunk_serialize.rs +++ b/server/src/chunk_serialize.rs @@ -13,7 +13,7 @@ use vek::Vec2; /// Deferring allows us to remove code duplication and maybe serialize ONCE, /// send to MULTIPLE clients /// TODO: store a urgent flag and seperate even more, 5 ticks vs 5 seconds -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Eq)] pub struct ChunkSendEntry { pub(crate) entity: Entity, pub(crate) chunk_key: Vec2, diff --git a/server/src/cmd.rs b/server/src/cmd.rs index d868cfef3c..7f273b87bf 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -517,7 +517,7 @@ fn handle_give_item( ) -> CmdResult<()> { if let (Some(item_name), give_amount_opt) = parse_cmd_args!(args, String, u32) { let give_amount = give_amount_opt.unwrap_or(1); - if let Ok(item) = Item::new_from_asset(&item_name.replace('/', ".").replace('\\', ".")) { + if let Ok(item) = Item::new_from_asset(&item_name.replace(['/', '\\'], ".")) { let mut item: Item = item; let mut res = Ok(()); @@ -1844,7 +1844,7 @@ fn handle_kill_npcs( true }; - should_kill.then(|| entity) + should_kill.then_some(entity) }) .collect::>() }; diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index b4ccbb7d9d..f435bbbdd2 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -278,7 +278,7 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt let entry = damage_contributors .entry(DamageContrib::Group(*group)) .or_insert((0, 0.0)); - (*entry).0 += damage; + entry.0 += damage; }, } } diff --git a/server/src/lib.rs b/server/src/lib.rs index b8185565da..e76b90c299 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -2,10 +2,8 @@ #![allow(clippy::option_map_unit_fn)] #![deny(clippy::clone_on_ref_ptr)] #![feature( - bool_to_option, box_patterns, drain_filter, - label_break_value, let_chains, let_else, never_type, @@ -490,7 +488,7 @@ impl Server { use std::fs; match || -> Result<_, Box> { - let key = fs::read(&key_file_path)?; + let key = fs::read(key_file_path)?; let key = if key_file_path.extension().map_or(false, |x| x == "der") { rustls::PrivateKey(key) } else { @@ -506,7 +504,7 @@ impl Server { .ok_or("No valid pem key in file")?; rustls::PrivateKey(key) }; - let cert_chain = fs::read(&cert_file_path)?; + let cert_chain = fs::read(cert_file_path)?; let cert_chain = if cert_file_path.extension().map_or(false, |x| x == "der") { vec![rustls::Certificate(cert_chain)] @@ -585,7 +583,7 @@ impl Server { let editable_settings = self.state.ecs().fetch::(); ServerInfo { name: settings.server_name.clone(), - description: (&*editable_settings.server_description).clone(), + description: (*editable_settings.server_description).clone(), git_hash: common::util::GIT_HASH.to_string(), git_date: common::util::GIT_DATE.to_string(), auth_provider: settings.auth_server_address.clone(), diff --git a/server/src/persistence/character_loader.rs b/server/src/persistence/character_loader.rs index 98b630d0c4..1e496255c0 100644 --- a/server/src/persistence/character_loader.rs +++ b/server/src/persistence/character_loader.rs @@ -86,7 +86,7 @@ impl CharacterLoader { // This connection -must- remain read-only to avoid lock contention with the // CharacterUpdater thread. let mut conn = - establish_connection(&*settings.read().unwrap(), ConnectionMode::ReadOnly); + establish_connection(&settings.read().unwrap(), ConnectionMode::ReadOnly); for request in internal_rx { conn.update_log_mode(&settings); diff --git a/server/src/persistence/character_updater.rs b/server/src/persistence/character_updater.rs index 565903f67b..3e1e5787c8 100644 --- a/server/src/persistence/character_updater.rs +++ b/server/src/persistence/character_updater.rs @@ -83,7 +83,7 @@ impl CharacterUpdater { // Unwrap here is safe as there is no code that can panic when the write lock is // taken that could cause the RwLock to become poisoned. let mut conn = - establish_connection(&*settings.read().unwrap(), ConnectionMode::ReadWrite); + establish_connection(&settings.read().unwrap(), ConnectionMode::ReadWrite); while let Ok(updates) = update_rx.recv() { match updates { CharacterUpdaterEvent::BatchUpdate(updates) => { diff --git a/server/src/persistence/mod.rs b/server/src/persistence/mod.rs index c84f5e1675..02d02a9690 100644 --- a/server/src/persistence/mod.rs +++ b/server/src/persistence/mod.rs @@ -63,12 +63,12 @@ impl VelorenConnection { let settings = database_settings .read() .expect("DatabaseSettings RwLock was poisoned"); - if self.sql_log_mode == (*settings).sql_log_mode { + if self.sql_log_mode == settings.sql_log_mode { return; } - set_log_mode(&mut self.connection, (*settings).sql_log_mode); - self.sql_log_mode = (*settings).sql_log_mode; + set_log_mode(&mut self.connection, settings.sql_log_mode); + self.sql_log_mode = settings.sql_log_mode; info!( "SQL log mode for connection changed to {:?}", @@ -106,13 +106,13 @@ pub struct DatabaseSettings { pub sql_log_mode: SqlLogMode, } -#[derive(Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq, Eq)] pub enum ConnectionMode { ReadOnly, ReadWrite, } -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum SqlLogMode { /// Logging is disabled Disabled, @@ -199,10 +199,8 @@ pub(crate) fn establish_connection( settings: &DatabaseSettings, connection_mode: ConnectionMode, ) -> VelorenConnection { - fs::create_dir_all(&settings.db_dir).expect(&*format!( - "Failed to create saves directory: {:?}", - &settings.db_dir - )); + fs::create_dir_all(&settings.db_dir) + .unwrap_or_else(|_| panic!("Failed to create saves directory: {:?}", &settings.db_dir)); let open_flags = OpenFlags::SQLITE_OPEN_PRIVATE_CACHE | OpenFlags::SQLITE_OPEN_NO_MUTEX diff --git a/server/src/rtsim/entity.rs b/server/src/rtsim/entity.rs index 25a25f9785..a26662bd30 100644 --- a/server/src/rtsim/entity.rs +++ b/server/src/rtsim/entity.rs @@ -88,7 +88,7 @@ impl Entity { .into() }, _ => { - let species = *(&comp::humanoid::ALL_SPECIES) + let species = *comp::humanoid::ALL_SPECIES .choose(&mut self.rng(PERM_SPECIES)) .unwrap(); comp::humanoid::Body::random_with(&mut self.rng(PERM_BODY), &species).into() @@ -102,7 +102,7 @@ impl Entity { | RtSimEntityKind::Alchemist | RtSimEntityKind::Blacksmith | RtSimEntityKind::Merchant => { - let species = *(&comp::humanoid::ALL_SPECIES) + let species = *comp::humanoid::ALL_SPECIES .choose(&mut self.rng(PERM_SPECIES)) .unwrap(); comp::humanoid::Body::random_with(&mut self.rng(PERM_BODY), &species).into() diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index 5a271b5131..b4d5891139 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -703,8 +703,10 @@ impl StateExt for State { msg: &str, ) -> bool { let mut automod = self.ecs().write_resource::(); - let Some(client) = self.ecs().read_storage::().get(entity) else { return true }; - let Some(player) = self.ecs().read_storage::().get(entity) else { return true }; + let client = self.ecs().read_storage::(); + let player = self.ecs().read_storage::(); + let Some(client) = client.get(entity) else { return true }; + let Some(player) = player.get(entity) else { return true }; match automod.validate_chat_msg( player.uuid(), diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index fecb5948ac..738a6cb1e6 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -557,7 +557,7 @@ impl<'a> AgentData<'a> { tgt_pos: &Pos, ) { if let Some((bearing, speed)) = agent.chaser.chase( - &*terrain, + terrain, self.pos.0, self.vel.0, tgt_pos.0, @@ -666,7 +666,7 @@ impl<'a> AgentData<'a> { } if let Some((bearing, speed)) = agent.chaser.chase( - &*terrain, + terrain, self.pos.0, self.vel.0, // Away from the target (ironically) diff --git a/server/src/sys/entity_sync.rs b/server/src/sys/entity_sync.rs index 8032765efa..7d7bf4ca16 100644 --- a/server/src/sys/entity_sync.rs +++ b/server/src/sys/entity_sync.rs @@ -393,7 +393,7 @@ impl<'a> System<'a> for Sys { let outcomes = outcomes .iter() - .filter(|o| o.get_pos().and_then(&is_near).unwrap_or(true)) + .filter(|o| o.get_pos().and_then(is_near).unwrap_or(true)) .cloned() .collect::>(); diff --git a/server/src/sys/msg/register.rs b/server/src/sys/msg/register.rs index 147d8e117d..940616b9a1 100644 --- a/server/src/sys/msg/register.rs +++ b/server/src/sys/msg/register.rs @@ -136,9 +136,9 @@ impl<'a> System<'a> for Sys { &ecs_world, #[cfg(feature = "plugins")] &read_data._plugin_mgr, - &*read_data.editable_settings.admins, - &*read_data.editable_settings.whitelist, - &*read_data.editable_settings.banlist, + &read_data.editable_settings.admins, + &read_data.editable_settings.whitelist, + &read_data.editable_settings.banlist, player_count >= max_players, ) { None => return Ok(()), @@ -232,11 +232,11 @@ impl<'a> System<'a> for Sys { time_of_day: *read_data.time_of_day, max_group_size: read_data.settings.max_player_group_size, client_timeout: read_data.settings.client_timeout, - world_map: (&*read_data.map).clone(), + world_map: (*read_data.map).clone(), recipe_book: default_recipe_book().cloned(), component_recipe_book: default_component_recipe_book().cloned(), - material_stats: (&*read_data.material_stats).clone(), - ability_map: (&*read_data.ability_map).clone(), + material_stats: (*read_data.material_stats).clone(), + ability_map: (*read_data.ability_map).clone(), })?; debug!("Done initial sync with client."); diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs index 369852785b..b2ae5f1ed6 100644 --- a/server/src/sys/terrain.rs +++ b/server/src/sys/terrain.rs @@ -436,7 +436,7 @@ impl NpcData { comp::Agent::from_body(&body) .with_behavior( Behavior::default() - .maybe_with_capabilities(can_speak.then(|| BehaviorCapability::SPEAK)) + .maybe_with_capabilities(can_speak.then_some(BehaviorCapability::SPEAK)) .with_trade_site(trade_for_site), ) .with_patrol_origin(pos) diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index 180eab04e1..aa3c87fff8 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -59,7 +59,9 @@ winit = {version = "0.25.0", features = ["serde"]} wgpu = { version = "=0.8.0", features = ["trace", "cross"] } wgpu-profiler = { git = "https://github.com/Imberflur/wgpu-profiler", tag = "wgpu-0.8" } bytemuck = { version="1.4", features=["derive"] } -shaderc = "0.8.0" +# shaderc = "0.8.0" +# Working around a current bug in shaderc that causes it to use the system installation even if we specify compile from source +shaderc = { git = "https://github.com/pythonesque/shaderc-rs", rev = "f2605a02062834019bedff911aee2fd2998c49f9" } # cmake crate used by shaderc, newer version 0.1.46 uses a new cmake command that is not available in our CI cmake version # see https://github.com/alexcrichton/cmake-rs/issues/131 cmake = "=0.1.45" diff --git a/voxygen/anim/src/arthropod/mod.rs b/voxygen/anim/src/arthropod/mod.rs index 4311c138d0..c9aee5f244 100644 --- a/voxygen/anim/src/arthropod/mod.rs +++ b/voxygen/anim/src/arthropod/mod.rs @@ -286,17 +286,17 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Sandcrawler, _) => (2.5, 7.0, -5.5), }, scaler: match (body.species, body.body_type) { - (Tarantula, _) => (1.0), - (Blackwidow, _) => (1.0), - (Antlion, _) => (1.0), - (Hornbeetle, _) => (0.8), - (Leafbeetle, _) => (0.8), - (Stagbeetle, _) => (0.8), - (Weevil, _) => (0.8), - (Cavespider, _) => (1.0), - (Moltencrawler, _) => (0.8), - (Mosscrawler, _) => (0.8), - (Sandcrawler, _) => (0.8), + (Tarantula, _) => 1.0, + (Blackwidow, _) => 1.0, + (Antlion, _) => 1.0, + (Hornbeetle, _) => 0.8, + (Leafbeetle, _) => 0.8, + (Stagbeetle, _) => 0.8, + (Weevil, _) => 0.8, + (Cavespider, _) => 1.0, + (Moltencrawler, _) => 0.8, + (Mosscrawler, _) => 0.8, + (Sandcrawler, _) => 0.8, }, // Z ori (front, front center, back center, center) leg_ori: match (body.species, body.body_type) { diff --git a/voxygen/anim/src/bird_large/mod.rs b/voxygen/anim/src/bird_large/mod.rs index c7232e012b..9b978e610d 100644 --- a/voxygen/anim/src/bird_large/mod.rs +++ b/voxygen/anim/src/bird_large/mod.rs @@ -276,24 +276,24 @@ impl<'a> From<&'a Body> for SkeletonAttr { (WealdWyvern, _) => (0.5, 0.0, -3.5), }, scaler: match (body.species, body.body_type) { - (Phoenix, _) => (1.0), - (Cockatrice, _) => (1.0), - (Roc, _) => (1.0), + (Phoenix, _) => 1.0, + (Cockatrice, _) => 1.0, + (Roc, _) => 1.0, (FlameWyvern, _) | (CloudWyvern, _) | (FrostWyvern, _) | (SeaWyvern, _) - | (WealdWyvern, _) => (1.0), + | (WealdWyvern, _) => 1.0, }, feed: match (body.species, body.body_type) { - (Phoenix, _) => (-0.65), - (Cockatrice, _) => (-0.5), - (Roc, _) => (-0.4), + (Phoenix, _) => -0.65, + (Cockatrice, _) => -0.5, + (Roc, _) => -0.4, (FlameWyvern, _) | (CloudWyvern, _) | (FrostWyvern, _) | (SeaWyvern, _) - | (WealdWyvern, _) => (-0.65), + | (WealdWyvern, _) => -0.65, }, wyvern: matches!( (body.species, body.body_type), diff --git a/voxygen/anim/src/dragon/mod.rs b/voxygen/anim/src/dragon/mod.rs index 48c91e673b..62315faf77 100644 --- a/voxygen/anim/src/dragon/mod.rs +++ b/voxygen/anim/src/dragon/mod.rs @@ -167,7 +167,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Reddragon, _) => (6.0, -2.0, -10.5), }, height: match (body.species, body.body_type) { - (Reddragon, _) => (1.0), + (Reddragon, _) => 1.0, }, } } diff --git a/voxygen/anim/src/lib.rs b/voxygen/anim/src/lib.rs index e3aa8d44f9..9a3457c825 100644 --- a/voxygen/anim/src/lib.rs +++ b/voxygen/anim/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(generic_associated_types, bool_to_option)] +#![feature(generic_associated_types)] #![allow(incomplete_features)] #![allow(clippy::single_match)] #[cfg(all(feature = "be-dyn-lib", feature = "use-dyn-lib"))] diff --git a/voxygen/anim/src/quadruped_low/mod.rs b/voxygen/anim/src/quadruped_low/mod.rs index e21d486d3e..2e97b5061c 100644 --- a/voxygen/anim/src/quadruped_low/mod.rs +++ b/voxygen/anim/src/quadruped_low/mod.rs @@ -331,42 +331,42 @@ impl<'a> From<&'a Body> for SkeletonAttr { _ => (0.0, 1.0), }, scaler: match (body.species, body.body_type) { - (Crocodile, _) => (1.05), - (SeaCrocodile, _) => (1.05), - (Alligator, _) => (1.12), - (Salamander, _) => (1.12), - (Monitor, _) => (0.9), - (Asp, _) => (1.12), - (Rocksnapper, _) => (1.12), - (Rootsnapper, _) => (1.12), - (Reefsnapper, _) => (1.12), - (Hakulaq, _) => (1.05), - (Dagon, _) => (1.05), - (Pangolin, _) => (1.05), - (Maneater, _) => (1.12), - (Lavadrake, _) => (1.12), - (Icedrake, _) => (1.12), - (Basilisk, _) => (1.3), - _ => (0.9), + (Crocodile, _) => 1.05, + (SeaCrocodile, _) => 1.05, + (Alligator, _) => 1.12, + (Salamander, _) => 1.12, + (Monitor, _) => 0.9, + (Asp, _) => 1.12, + (Rocksnapper, _) => 1.12, + (Rootsnapper, _) => 1.12, + (Reefsnapper, _) => 1.12, + (Hakulaq, _) => 1.05, + (Dagon, _) => 1.05, + (Pangolin, _) => 1.05, + (Maneater, _) => 1.12, + (Lavadrake, _) => 1.12, + (Icedrake, _) => 1.12, + (Basilisk, _) => 1.3, + _ => 0.9, }, tempo: match (body.species, body.body_type) { - (Crocodile, _) => (0.7), - (SeaCrocodile, _) => (0.7), - (Alligator, _) => (0.7), - (Salamander, _) => (0.85), - (Monitor, _) => (1.4), - (Tortoise, _) => (0.7), - (Rocksnapper, _) => (0.7), - (Rootsnapper, _) => (0.7), - (Reefsnapper, _) => (0.7), - (Hakulaq, _) => (1.2), - (Dagon, _) => (1.2), - (Pangolin, _) => (1.15), - (Maneater, _) => (0.9), - (Lavadrake, _) => (1.1), - (Icedrake, _) => (1.1), - (Basilisk, _) => (0.8), - _ => (1.0), + (Crocodile, _) => 0.7, + (SeaCrocodile, _) => 0.7, + (Alligator, _) => 0.7, + (Salamander, _) => 0.85, + (Monitor, _) => 1.4, + (Tortoise, _) => 0.7, + (Rocksnapper, _) => 0.7, + (Rootsnapper, _) => 0.7, + (Reefsnapper, _) => 0.7, + (Hakulaq, _) => 1.2, + (Dagon, _) => 1.2, + (Pangolin, _) => 1.15, + (Maneater, _) => 0.9, + (Lavadrake, _) => 1.1, + (Icedrake, _) => 1.1, + (Basilisk, _) => 0.8, + _ => 1.0, }, } } diff --git a/voxygen/anim/src/quadruped_medium/mod.rs b/voxygen/anim/src/quadruped_medium/mod.rs index c76c5bd6a8..fa5792b09b 100644 --- a/voxygen/anim/src/quadruped_medium/mod.rs +++ b/voxygen/anim/src/quadruped_medium/mod.rs @@ -606,96 +606,96 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Akhlut, _) => (1.5, -1.0, -4.5), }, scaler: match (body.species, body.body_type) { - (Grolgar, _) => (1.05), - (Saber, _) => (0.9), - (Tuskram, _) => (0.95), - (Lion, Male) => (1.05), - (Lion, Female) => (1.05), - (Tarasque, _) => (1.05), - (Tiger, _) => (0.95), - (Catoblepas, _) => (1.05), - (Roshwalr, _) => (1.05), - (Barghest, _) => (1.2), - (Antelope, _) => (0.95), - (Kelpie, _) => (1.1), - (Donkey, _) => (0.95), - (Horse, _) => (1.2), - (Zebra, _) => (1.05), - (Cattle, _) => (1.25), - (Highland, _) => (1.32), - (Bear, _) => (1.4), - (Yak, _) => (1.4), - (Camel, _) => (1.15), - (Dreadhorn, _) => (1.6), - (Moose, _) => (0.95), - (Snowleopard, _) => (0.95), - (Mammoth, _) => (3.0), - (Ngoubou, _) => (1.0), - (Akhlut, _) => (1.4), - _ => (0.9), + (Grolgar, _) => 1.05, + (Saber, _) => 0.9, + (Tuskram, _) => 0.95, + (Lion, Male) => 1.05, + (Lion, Female) => 1.05, + (Tarasque, _) => 1.05, + (Tiger, _) => 0.95, + (Catoblepas, _) => 1.05, + (Roshwalr, _) => 1.05, + (Barghest, _) => 1.2, + (Antelope, _) => 0.95, + (Kelpie, _) => 1.1, + (Donkey, _) => 0.95, + (Horse, _) => 1.2, + (Zebra, _) => 1.05, + (Cattle, _) => 1.25, + (Highland, _) => 1.32, + (Bear, _) => 1.4, + (Yak, _) => 1.4, + (Camel, _) => 1.15, + (Dreadhorn, _) => 1.6, + (Moose, _) => 0.95, + (Snowleopard, _) => 0.95, + (Mammoth, _) => 3.0, + (Ngoubou, _) => 1.0, + (Akhlut, _) => 1.4, + _ => 0.9, }, startangle: match (body.species, body.body_type) { //changes the default angle of front feet - (Grolgar, _) => (-0.3), - (Saber, _) => (-0.2), - (Tuskram, _) => (0.3), - (Lion, Male) => (-0.1), - (Lion, Female) => (-0.1), - (Tarasque, _) => (-0.5), - (Catoblepas, _) => (-0.5), - (Bonerattler, _) => (-0.7), - (Roshwalr, _) => (-0.3), - (Barghest, _) => (-0.5), - _ => (0.0), + (Grolgar, _) => -0.3, + (Saber, _) => -0.2, + (Tuskram, _) => 0.3, + (Lion, Male) => -0.1, + (Lion, Female) => -0.1, + (Tarasque, _) => -0.5, + (Catoblepas, _) => -0.5, + (Bonerattler, _) => -0.7, + (Roshwalr, _) => -0.3, + (Barghest, _) => -0.5, + _ => 0.0, }, tempo: match (body.species, body.body_type) { - (Grolgar, _) => (0.85), - (Saber, _) => (1.1), - (Tuskram, _) => (0.9), - (Lion, Male) => (0.95), - (Lion, Female) => (0.95), - (Tarasque, _) => (0.95), - (Wolf, _) => (1.1), - (Mouflon, _) => (0.85), - (Catoblepas, _) => (1.1), - (Deer, _) => (0.85), - (Hirdrasil, _) => (0.85), - (Roshwalr, _) => (0.75), - (Donkey, _) => (0.85), - (Zebra, _) => (0.85), - (Kelpie, _) => (0.85), - (Horse, _) => (0.85), - (Barghest, _) => (0.95), - (Darkhound, _) => (1.1), - (Cattle, _) => (0.8), - (Highland, _) => (0.8), - (Bear, _) => (0.8), - (Yak, _) => (0.8), - (Camel, _) => (1.8), - (Akhlut, _) => (0.95), - _ => (1.0), + (Grolgar, _) => 0.85, + (Saber, _) => 1.1, + (Tuskram, _) => 0.9, + (Lion, Male) => 0.95, + (Lion, Female) => 0.95, + (Tarasque, _) => 0.95, + (Wolf, _) => 1.1, + (Mouflon, _) => 0.85, + (Catoblepas, _) => 1.1, + (Deer, _) => 0.85, + (Hirdrasil, _) => 0.85, + (Roshwalr, _) => 0.75, + (Donkey, _) => 0.85, + (Zebra, _) => 0.85, + (Kelpie, _) => 0.85, + (Horse, _) => 0.85, + (Barghest, _) => 0.95, + (Darkhound, _) => 1.1, + (Cattle, _) => 0.8, + (Highland, _) => 0.8, + (Bear, _) => 0.8, + (Yak, _) => 0.8, + (Camel, _) => 1.8, + (Akhlut, _) => 0.95, + _ => 1.0, }, spring: match (body.species, body.body_type) { - (Grolgar, _) => (0.9), - (Saber, _) => (0.9), - (Tuskram, _) => (0.9), - (Wolf, _) => (1.2), - (Mouflon, _) => (0.9), - (Catoblepas, _) => (0.55), - (Bonerattler, _) => (1.1), - (Deer, _) => (0.9), - (Hirdrasil, _) => (1.1), - (Donkey, _) => (0.85), - (Camel, _) => (0.85), - (Zebra, _) => (0.85), - (Antelope, _) => (1.2), - (Kelpie, _) => (0.95), - (Horse, _) => (0.85), - (Darkhound, _) => (1.2), - (Dreadhorn, _) => (0.85), - (Moose, _) => (0.9), - (Snowleopard, _) => (1.1), - _ => (1.0), + (Grolgar, _) => 0.9, + (Saber, _) => 0.9, + (Tuskram, _) => 0.9, + (Wolf, _) => 1.2, + (Mouflon, _) => 0.9, + (Catoblepas, _) => 0.55, + (Bonerattler, _) => 1.1, + (Deer, _) => 0.9, + (Hirdrasil, _) => 1.1, + (Donkey, _) => 0.85, + (Camel, _) => 0.85, + (Zebra, _) => 0.85, + (Antelope, _) => 1.2, + (Kelpie, _) => 0.95, + (Horse, _) => 0.85, + (Darkhound, _) => 1.2, + (Dreadhorn, _) => 0.85, + (Moose, _) => 0.9, + (Snowleopard, _) => 1.1, + _ => 1.0, }, feed: match (body.species, body.body_type) { // TODO: Rework some species to allow for feed anim diff --git a/voxygen/anim/src/quadruped_small/mod.rs b/voxygen/anim/src/quadruped_small/mod.rs index ded341a054..2303e88169 100644 --- a/voxygen/anim/src/quadruped_small/mod.rs +++ b/voxygen/anim/src/quadruped_small/mod.rs @@ -270,122 +270,122 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Goat, _) => (-7.0, 0.0), }, scaler: match (body.species, body.body_type) { - (Pig, _) => (0.72), - (Fox, _) => (0.72), - (Boar, _) => (0.95), - (Jackalope, _) => (0.67), - (Skunk, _) => (0.72), - (Cat, _) => (0.67), - (Batfox, _) => (0.9), - (Holladon, _) => (1.12), - (Rabbit, _) => (0.56), - (Frog, _) => (0.56), - (Rat, _) => (0.5), - (Axolotl, _) => (0.5), - (Gecko, _) => (0.56), - (Turtle, _) => (0.67), - (Squirrel, _) => (0.4), - (Fungome, _) => (0.72), - (Porcupine, _) => (0.65), - (Hare, _) => (0.65), - _ => (0.8), + (Pig, _) => 0.72, + (Fox, _) => 0.72, + (Boar, _) => 0.95, + (Jackalope, _) => 0.67, + (Skunk, _) => 0.72, + (Cat, _) => 0.67, + (Batfox, _) => 0.9, + (Holladon, _) => 1.12, + (Rabbit, _) => 0.56, + (Frog, _) => 0.56, + (Rat, _) => 0.5, + (Axolotl, _) => 0.5, + (Gecko, _) => 0.56, + (Turtle, _) => 0.67, + (Squirrel, _) => 0.4, + (Fungome, _) => 0.72, + (Porcupine, _) => 0.65, + (Hare, _) => 0.65, + _ => 0.8, }, tempo: match (body.species, body.body_type) { - (Boar, _) => (1.1), - (Cat, _) => (1.1), - (Quokka, _) => (1.2), - (Hyena, _) => (1.1), - (Rabbit, _) => (1.15), - (Frog, _) => (1.15), - (Rat, _) => (1.0), - (Axolotl, _) => (1.2), - (Gecko, _) => (1.1), - (Turtle, _) => (3.0), - (Squirrel, _) => (1.15), - (Porcupine, _) => (1.2), - (Beaver, _) => (1.2), - (Hare, _) => (1.15), - _ => (1.0), + (Boar, _) => 1.1, + (Cat, _) => 1.1, + (Quokka, _) => 1.2, + (Hyena, _) => 1.1, + (Rabbit, _) => 1.15, + (Frog, _) => 1.15, + (Rat, _) => 1.0, + (Axolotl, _) => 1.2, + (Gecko, _) => 1.1, + (Turtle, _) => 3.0, + (Squirrel, _) => 1.15, + (Porcupine, _) => 1.2, + (Beaver, _) => 1.2, + (Hare, _) => 1.15, + _ => 1.0, }, maximize: match (body.species, body.body_type) { - (Fox, _) => (1.3), - (Sheep, _) => (1.1), - (Boar, _) => (1.4), - (Jackalope, _) => (1.2), - (Hyena, _) => (1.4), - (Rabbit, _) => (1.3), - (Frog, _) => (1.3), - (Axolotl, _) => (0.9), - (Turtle, _) => (0.8), - (Fungome, _) => (0.7), - (Hare, _) => (1.3), - _ => (1.0), + (Fox, _) => 1.3, + (Sheep, _) => 1.1, + (Boar, _) => 1.4, + (Jackalope, _) => 1.2, + (Hyena, _) => 1.4, + (Rabbit, _) => 1.3, + (Frog, _) => 1.3, + (Axolotl, _) => 0.9, + (Turtle, _) => 0.8, + (Fungome, _) => 0.7, + (Hare, _) => 1.3, + _ => 1.0, }, minimize: match (body.species, body.body_type) { - (Pig, _) => (0.6), - (Fox, _) => (1.3), - (Sheep, _) => (0.8), - (Jackalope, _) => (0.8), - (Skunk, _) => (0.9), - (Cat, _) => (0.8), - (Quokka, _) => (0.9), - (Holladon, _) => (0.7), - (Hyena, _) => (1.4), - (Rabbit, _) => (0.8), - (Frog, _) => (0.8), - (Turtle, _) => (0.8), - (Fungome, _) => (0.4), - (Porcupine, _) => (0.9), - (Beaver, _) => (0.9), - (Hare, _) => (0.8), - (Goat, _) => (0.8), - _ => (1.0), + (Pig, _) => 0.6, + (Fox, _) => 1.3, + (Sheep, _) => 0.8, + (Jackalope, _) => 0.8, + (Skunk, _) => 0.9, + (Cat, _) => 0.8, + (Quokka, _) => 0.9, + (Holladon, _) => 0.7, + (Hyena, _) => 1.4, + (Rabbit, _) => 0.8, + (Frog, _) => 0.8, + (Turtle, _) => 0.8, + (Fungome, _) => 0.4, + (Porcupine, _) => 0.9, + (Beaver, _) => 0.9, + (Hare, _) => 0.8, + (Goat, _) => 0.8, + _ => 1.0, }, spring: match (body.species, body.body_type) { - (Sheep, _) => (1.2), - (Boar, _) => (0.8), - (Jackalope, _) => (2.2), - (Cat, _) => (1.4), - (Batfox, _) => (1.1), - (Raccoon, _) => (1.1), - (Quokka, _) => (1.3), - (Holladon, _) => (0.7), - (Hyena, _) => (1.4), - (Rabbit, _) => (2.5), - (Truffler, _) => (0.8), - (Frog, _) => (2.5), - (Axolotl, _) => (0.8), - (Gecko, _) => (0.6), - (Turtle, _) => (0.7), - (Fungome, _) => (0.8), - (Porcupine, _) => (1.3), - (Beaver, _) => (1.3), - (Hare, Male) => (2.2), - (Hare, Female) => (2.5), - (Goat, _) => (1.2), - _ => (1.0), + (Sheep, _) => 1.2, + (Boar, _) => 0.8, + (Jackalope, _) => 2.2, + (Cat, _) => 1.4, + (Batfox, _) => 1.1, + (Raccoon, _) => 1.1, + (Quokka, _) => 1.3, + (Holladon, _) => 0.7, + (Hyena, _) => 1.4, + (Rabbit, _) => 2.5, + (Truffler, _) => 0.8, + (Frog, _) => 2.5, + (Axolotl, _) => 0.8, + (Gecko, _) => 0.6, + (Turtle, _) => 0.7, + (Fungome, _) => 0.8, + (Porcupine, _) => 1.3, + (Beaver, _) => 1.3, + (Hare, Male) => 2.2, + (Hare, Female) => 2.5, + (Goat, _) => 1.2, + _ => 1.0, }, feed: match (body.species, body.body_type) { - (Boar, _) => (0.6), - (Skunk, _) => (0.8), - (Batfox, _) => (0.7), - (Raccoon, _) => (0.8), - (Rabbit, _) => (1.2), - (Truffler, _) => (0.6), - (Frog, _) => (0.7), - (Axolotl, _) => (0.8), - (Gecko, _) => (0.8), - (Turtle, _) => (0.5), - (Fungome, _) => (0.7), - (Hare, _) => (1.2), - _ => (1.0), + (Boar, _) => 0.6, + (Skunk, _) => 0.8, + (Batfox, _) => 0.7, + (Raccoon, _) => 0.8, + (Rabbit, _) => 1.2, + (Truffler, _) => 0.6, + (Frog, _) => 0.7, + (Axolotl, _) => 0.8, + (Gecko, _) => 0.8, + (Turtle, _) => 0.5, + (Fungome, _) => 0.7, + (Hare, _) => 1.2, + _ => 1.0, }, lateral: match (body.species, body.body_type) { - (Axolotl, _) => (1.0), - (Gecko, _) => (1.0), - (Turtle, _) => (1.0), - (Fungome, _) => (1.0), - _ => (0.0), + (Axolotl, _) => 1.0, + (Gecko, _) => 1.0, + (Turtle, _) => 1.0, + (Fungome, _) => 1.0, + _ => 0.0, }, } } diff --git a/voxygen/anim/src/theropod/mod.rs b/voxygen/anim/src/theropod/mod.rs index 22397bfd80..60df30770f 100644 --- a/voxygen/anim/src/theropod/mod.rs +++ b/voxygen/anim/src/theropod/mod.rs @@ -248,15 +248,15 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Ntouka, _) => (1.5, -1.0, -2.5), }, scaler: match (body.species, body.body_type) { - (Archaeos, _) => (2.93), - (Odonto, _) => (2.93), - (Sandraptor, _) => (1.1), - (Snowraptor, _) => (1.1), - (Woodraptor, _) => (1.1), - (Sunlizard, _) => (1.1), - (Yale, _) => (1.26), - (Dodarock, _) => (1.1), - (Ntouka, _) => (2.93), + (Archaeos, _) => 2.93, + (Odonto, _) => 2.93, + (Sandraptor, _) => 1.1, + (Snowraptor, _) => 1.1, + (Woodraptor, _) => 1.1, + (Sunlizard, _) => 1.1, + (Yale, _) => 1.26, + (Dodarock, _) => 1.1, + (Ntouka, _) => 2.93, }, } } diff --git a/voxygen/i18n/src/lib.rs b/voxygen/i18n/src/lib.rs index 435bb71884..be1bc8890b 100644 --- a/voxygen/i18n/src/lib.rs +++ b/voxygen/i18n/src/lib.rs @@ -165,7 +165,7 @@ impl assets::Compound for Language { for id in cache.load_dir::(path, true)?.ids() { match cache.load(id) { Ok(handle) => { - let source: &raw::Resource = &*handle.read(); + let source: &raw::Resource = &handle.read(); let src = source.src.clone(); // NOTE: diff --git a/voxygen/src/audio/channel.rs b/voxygen/src/audio/channel.rs index 8e82f45e9d..be082395cf 100644 --- a/voxygen/src/audio/channel.rs +++ b/voxygen/src/audio/channel.rs @@ -159,7 +159,7 @@ impl MusicChannel { /// AmbientChannelTags are used for non-positional sfx. Currently the only use /// is for wind. -#[derive(Debug, PartialEq, Clone, Copy, Deserialize, EnumIter)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, EnumIter)] pub enum AmbientChannelTag { Wind, Rain, diff --git a/voxygen/src/audio/fader.rs b/voxygen/src/audio/fader.rs index 7c624e981c..8a91b901ac 100644 --- a/voxygen/src/audio/fader.rs +++ b/voxygen/src/audio/fader.rs @@ -14,7 +14,7 @@ pub struct Fader { } /// Enables quick lookup of whether a fader is increasing or decreasing the /// channel volume -#[derive(Debug, PartialEq, Clone, Copy)] +#[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum FadeDirection { In, Out, diff --git a/voxygen/src/cmd.rs b/voxygen/src/cmd.rs index 3cd0200ffd..46d90ceb50 100644 --- a/voxygen/src/cmd.rs +++ b/voxygen/src/cmd.rs @@ -85,7 +85,7 @@ impl FromStr for ClientChatCommand { fn from_str(keyword: &str) -> Result { Self::iter() .map(|c| (c.keyword(), c)) - .find_map(|(kwd, command)| (kwd == keyword).then(|| command)) + .find_map(|(kwd, command)| (kwd == keyword).then_some(command)) .ok_or(()) } } diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 384099398e..07fcd3d0df 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -195,7 +195,7 @@ impl<'a> Crafting<'a> { } } -#[derive(Copy, Clone, Debug, EnumIter, PartialEq)] +#[derive(Copy, Clone, Debug, EnumIter, PartialEq, Eq)] pub enum CraftingTab { All, Tool, @@ -1343,22 +1343,30 @@ impl<'a> Widget for Crafting<'a> { // Craft button if Button::image(self.imgs.button) .w_h(105.0, 25.0) - .hover_image( - can_perform - .then_some(self.imgs.button_hover) - .unwrap_or(self.imgs.button), - ) - .press_image( - can_perform - .then_some(self.imgs.button_press) - .unwrap_or(self.imgs.button), - ) + .hover_image(if can_perform { + self.imgs.button_hover + } else { + self.imgs.button + }) + .press_image(if can_perform { + self.imgs.button_press + } else { + self.imgs.button + }) .label(&self.localized_strings.get_msg("hud-crafting-craft")) .label_y(conrod_core::position::Relative::Scalar(1.0)) - .label_color(can_perform.then_some(TEXT_COLOR).unwrap_or(TEXT_GRAY_COLOR)) + .label_color(if can_perform { + TEXT_COLOR + } else { + TEXT_GRAY_COLOR + }) .label_font_size(self.fonts.cyri.scale(12)) .label_font_id(self.fonts.cyri.conrod_id) - .image_color(can_perform.then_some(TEXT_COLOR).unwrap_or(TEXT_GRAY_COLOR)) + .image_color(if can_perform { + TEXT_COLOR + } else { + TEXT_GRAY_COLOR + }) .bottom_left_with_margins_on(state.ids.align_ing, -31.0, 15.0) .parent(state.ids.window_frame) .set(state.ids.btn_craft, ui) @@ -1396,30 +1404,30 @@ impl<'a> Widget for Crafting<'a> { let can_perform_all = can_perform && matches!(recipe_kind, RecipeKind::Simple); if Button::image(self.imgs.button) .w_h(105.0, 25.0) - .hover_image( - can_perform - .then_some(self.imgs.button_hover) - .unwrap_or(self.imgs.button), - ) - .press_image( - can_perform - .then_some(self.imgs.button_press) - .unwrap_or(self.imgs.button), - ) + .hover_image(if can_perform { + self.imgs.button_hover + } else { + self.imgs.button + }) + .press_image(if can_perform { + self.imgs.button_press + } else { + self.imgs.button + }) .label(&self.localized_strings.get_msg("hud-crafting-craft_all")) .label_y(conrod_core::position::Relative::Scalar(1.0)) - .label_color( - can_perform_all - .then_some(TEXT_COLOR) - .unwrap_or(TEXT_GRAY_COLOR), - ) + .label_color(if can_perform_all { + TEXT_COLOR + } else { + TEXT_GRAY_COLOR + }) .label_font_size(self.fonts.cyri.scale(12)) .label_font_id(self.fonts.cyri.conrod_id) - .image_color( - can_perform_all - .then_some(TEXT_COLOR) - .unwrap_or(TEXT_GRAY_COLOR), - ) + .image_color(if can_perform_all { + TEXT_COLOR + } else { + TEXT_GRAY_COLOR + }) .bottom_right_with_margins_on(state.ids.align_ing, -31.0, 15.0) .parent(state.ids.window_frame) .set(state.ids.btn_craft_all, ui) @@ -1670,7 +1678,7 @@ impl<'a> Widget for Crafting<'a> { // Grey color for images and text if their amount is too low to craft the // item - let item_count_in_inventory = self.inventory.item_count(&*item_def); + let item_count_in_inventory = self.inventory.item_count(&item_def); let col = if item_count_in_inventory >= u64::from(amount.max(1)) { TEXT_COLOR } else { diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index e8f9ef044e..91ac79187c 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -352,7 +352,7 @@ pub enum Event { ChangeSection(DiarySection), } -#[derive(PartialEq)] +#[derive(PartialEq, Eq)] pub enum DiarySection { SkillTrees, AbilitySelection, diff --git a/voxygen/src/hud/hotbar.rs b/voxygen/src/hud/hotbar.rs index c59e0c8f5c..f3fc7bab26 100644 --- a/voxygen/src/hud/hotbar.rs +++ b/voxygen/src/hud/hotbar.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use super::HudInfo; -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Slot { One = 0, Two = 1, @@ -20,7 +20,7 @@ pub enum Slot { Ten = 9, } -#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] pub enum SlotContents { Inventory(u64, ItemKey), Ability(usize), diff --git a/voxygen/src/hud/item_imgs.rs b/voxygen/src/hud/item_imgs.rs index 09ef6478d7..ef0e05f5f8 100644 --- a/voxygen/src/hud/item_imgs.rs +++ b/voxygen/src/hud/item_imgs.rs @@ -170,7 +170,7 @@ fn graceful_load_segment_no_skin(specifier: &str) -> Arc { .map(|mat_cell| match mat_cell { MatCell::None => None, MatCell::Mat(_) => Some(MatCell::None), - MatCell::Normal(data) => data.is_hollow().then(|| MatCell::None), + MatCell::Normal(data) => data.is_hollow().then_some(MatCell::None), }) .to_segment(|_| Default::default()); Arc::new(seg) diff --git a/voxygen/src/hud/loot_scroller.rs b/voxygen/src/hud/loot_scroller.rs index 87143869ca..57567652ba 100644 --- a/voxygen/src/hud/loot_scroller.rs +++ b/voxygen/src/hud/loot_scroller.rs @@ -312,7 +312,7 @@ impl<'a> Widget for LootScroller<'a> { Quality::Artifact => self.imgs.inv_slot_orange, _ => self.imgs.inv_slot_red, }; - let quality_col = get_quality_col(&*item); + let quality_col = get_quality_col(item); Image::new(self.imgs.pixel) .color(Some(shade_color(quality_col.alpha(0.7)))) @@ -327,7 +327,7 @@ impl<'a> Widget for LootScroller<'a> { .set(state.ids.message_icon_frames[i], ui); Image::new(animate_by_pulse( - &self.item_imgs.img_ids_or_not_found_img((&*item).into()), + &self.item_imgs.img_ids_or_not_found_img(item.into()), self.pulse, )) .color(Some(shade_color(color::hsla(0.0, 0.0, 1.0, 1.0)))) @@ -335,7 +335,7 @@ impl<'a> Widget for LootScroller<'a> { .middle_of(state.ids.message_icon_bgs[i]) .with_item_tooltip( self.item_tooltip_manager, - core::iter::once(&*item as &dyn ItemDesc), + core::iter::once(item as &dyn ItemDesc), &None, &item_tooltip, ) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 76e0d70064..a6e96c96cd 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -577,7 +577,7 @@ pub enum Event { // TODO: Maybe replace this with bitflags. // `map` is not here because it currently is displayed over the top of other // open windows. -#[derive(PartialEq)] +#[derive(PartialEq, Eq)] pub enum Windows { Settings, // Display settings window. None, @@ -630,7 +630,7 @@ pub enum PressBehavior { #[serde(other)] Toggle = 0, } -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct ChatTab { pub label: String, pub filter: ChatFilter, @@ -1798,9 +1798,9 @@ impl Hud { }; self.failed_block_pickups - .retain(|_, t| pulse - (*t).pulse < overitem::PICKUP_FAILED_FADE_OUT_TIME); + .retain(|_, t| pulse - t.pulse < overitem::PICKUP_FAILED_FADE_OUT_TIME); self.failed_entity_pickups - .retain(|_, t| pulse - (*t).pulse < overitem::PICKUP_FAILED_FADE_OUT_TIME); + .retain(|_, t| pulse - t.pulse < overitem::PICKUP_FAILED_FADE_OUT_TIME); // Render overitem: name, etc. for (entity, pos, item, distance) in (&entities, &pos, &items) @@ -2061,7 +2061,7 @@ impl Hud { } else { None }; - (info.is_some() || bubble.is_some()).then(|| { + (info.is_some() || bubble.is_some()).then_some({ ( entity, pos, info, bubble, stats, skill_set, health, buffs, scale, body, hpfl, in_group, dist_sqr, alignment, is_mount, @@ -2897,7 +2897,7 @@ impl Hud { &info, &self.imgs, &self.fonts, - &*i18n, + i18n, self.pulse, &self.rot_imgs, item_tooltip_manager, @@ -3038,7 +3038,7 @@ impl Hud { &self.item_imgs, &self.rot_imgs, &self.fonts, - &*i18n, + i18n, &msm, item_tooltip_manager, self.pulse, diff --git a/voxygen/src/hud/settings_window/mod.rs b/voxygen/src/hud/settings_window/mod.rs index 6e55347e52..f7705c2337 100644 --- a/voxygen/src/hud/settings_window/mod.rs +++ b/voxygen/src/hud/settings_window/mod.rs @@ -47,7 +47,7 @@ widget_ids! { const RESET_BUTTONS_HEIGHT: f64 = 34.0; const RESET_BUTTONS_WIDTH: f64 = 155.0; -#[derive(Debug, EnumIter, PartialEq)] +#[derive(Debug, EnumIter, PartialEq, Eq)] pub enum SettingsTab { Interface, Chat, diff --git a/voxygen/src/hud/slots.rs b/voxygen/src/hud/slots.rs index 0b95ff6275..4de681b1e4 100644 --- a/voxygen/src/hud/slots.rs +++ b/voxygen/src/hud/slots.rs @@ -33,7 +33,7 @@ pub enum SlotKind { pub type SlotManager = slot::SlotManager; -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct InventorySlot { pub slot: InvSlotId, pub entity: EcsEntity, @@ -74,7 +74,7 @@ impl SlotKey for EquipSlot { } } -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct TradeSlot { pub index: usize, pub quantity: u32, @@ -115,7 +115,7 @@ impl SlotKey for TradeSlot { } } -#[derive(Clone, PartialEq)] +#[derive(Clone, PartialEq, Eq)] pub enum HotbarImage { Item(ItemKey), Ability(String), @@ -203,7 +203,7 @@ impl<'a> SlotKey, HotbarImageSource<'a>> for HotbarSlot { } } -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum AbilitySlot { Slot(usize), Ability(AuxiliaryAbility), diff --git a/voxygen/src/hud/trade.rs b/voxygen/src/hud/trade.rs index 16b3553082..05f1946f42 100644 --- a/voxygen/src/hud/trade.rs +++ b/voxygen/src/hud/trade.rs @@ -228,13 +228,9 @@ impl<'a> Trade<'a> { .unwrap_or_else(|| format!("Player {}", who)); let offer_header = if ours { - self.localized_strings - .get_msg("hud-trade-your_offer") - .to_owned() + self.localized_strings.get_msg("hud-trade-your_offer") } else { - self.localized_strings - .get_msg("hud-trade-their_offer") - .to_owned() + self.localized_strings.get_msg("hud-trade-their_offer") }; Text::new(&offer_header) diff --git a/voxygen/src/lib.rs b/voxygen/src/lib.rs index 644dccf3eb..5a3f6bf684 100644 --- a/voxygen/src/lib.rs +++ b/voxygen/src/lib.rs @@ -5,7 +5,6 @@ #![feature( array_methods, array_zip, - bool_to_option, drain_filter, once_cell, trait_alias, diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 8bde511768..7d5eff9b10 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -1,5 +1,4 @@ #![deny(unsafe_code)] -#![feature(bool_to_option)] #![recursion_limit = "2048"] mod cli; diff --git a/voxygen/src/menu/char_selection/mod.rs b/voxygen/src/menu/char_selection/mod.rs index a345ad17f0..4100df4a1d 100644 --- a/voxygen/src/menu/char_selection/mod.rs +++ b/voxygen/src/menu/char_selection/mod.rs @@ -28,9 +28,9 @@ impl CharSelectionState { let scene = Scene::new( global_state.window.renderer_mut(), Some("fixture.selection_bg"), - &*client.borrow(), + &client.borrow(), ); - let char_selection_ui = CharSelectionUi::new(global_state, &*client.borrow()); + let char_selection_ui = CharSelectionUi::new(global_state, &client.borrow()); Self { char_selection_ui, diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index c0b7e4f2b1..fd118aaa36 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -68,7 +68,7 @@ pub trait Vertex: Clone + bytemuck::Pod { use serde::{Deserialize, Serialize}; /// Anti-aliasing modes -#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] pub enum AaMode { /// Fast approximate antialiasing. /// @@ -102,7 +102,7 @@ impl Default for AaMode { } /// Cloud modes -#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] pub enum CloudMode { /// No clouds. As cheap as it gets. None, @@ -132,7 +132,7 @@ impl Default for CloudMode { } /// Fluid modes -#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] pub enum FluidMode { /// "Cheap" water. This water implements no waves, no reflections, no /// diffraction, and no light attenuation through water. As a result, @@ -163,7 +163,7 @@ impl Default for FluidMode { } /// Lighting modes -#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] pub enum LightingMode { /// Ashikhmin-Shirley BRDF lighting model. Attempts to generate a /// physically plausible (to some extent) lighting distribution. @@ -251,7 +251,7 @@ impl Default for UpscaleMode { /// Present modes /// See https://docs.rs/wgpu/0.7.0/wgpu/enum.PresentMode.html -#[derive(Default, PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(Default, PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] pub enum PresentMode { Mailbox, Immediate, diff --git a/voxygen/src/render/pipelines/bloom.rs b/voxygen/src/render/pipelines/bloom.rs index 80be67b0f8..6bb494059c 100644 --- a/voxygen/src/render/pipelines/bloom.rs +++ b/voxygen/src/render/pipelines/bloom.rs @@ -208,7 +208,7 @@ impl BloomPipelines { let upsample_pipeline = create_pipeline( "Bloom upsample pipeline", upsample_fs_module, - (!bloom_config.uniform_blur).then(|| wgpu::BlendState { + (!bloom_config.uniform_blur).then_some(wgpu::BlendState { color: wgpu::BlendComponent { src_factor: wgpu::BlendFactor::One, dst_factor: wgpu::BlendFactor::One, diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs index 804b8aacb9..66e358e8cf 100644 --- a/voxygen/src/render/renderer.rs +++ b/voxygen/src/render/renderer.rs @@ -254,7 +254,7 @@ impl Renderer { let full_name = format!("#{} {} {:?}", i, info.name, info.device_type,); - full_name.contains(&filter).then(|| adapter) + full_name.contains(&filter).then_some(adapter) }), Some(_) | None => { runtime.block_on(instance.request_adapter(&wgpu::RequestAdapterOptionsBase { @@ -504,7 +504,7 @@ impl Renderer { #[cfg(feature = "egui-ui")] let egui_renderpass = - egui_wgpu_backend::RenderPass::new(&*device, TextureFormat::Bgra8UnormSrgb, 1); + egui_wgpu_backend::RenderPass::new(&device, TextureFormat::Bgra8UnormSrgb, 1); Ok(Self { device, diff --git a/voxygen/src/render/renderer/drawer.rs b/voxygen/src/render/renderer/drawer.rs index 2029b163ae..599461ab4b 100644 --- a/voxygen/src/render/renderer/drawer.rs +++ b/voxygen/src/render/renderer/drawer.rs @@ -1133,7 +1133,7 @@ impl<'pass_ref, 'pass: 'pass_ref> UiDrawer<'pass_ref, 'pass> { // Note: not actually prepared yet // we do this to avoid having to write extra code for the set functions let mut prepared = PreparedUiDrawer { - render_pass: &mut *self.render_pass, + render_pass: &mut self.render_pass, }; // Prepare prepared.set_locals(locals); diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 5d91d24281..602a4d701d 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -4896,7 +4896,7 @@ impl ItemDropCentralSpec { .map(|mat_cell| match mat_cell { MatCell::None => None, MatCell::Mat(_) => Some(MatCell::None), - MatCell::Normal(data) => data.is_hollow().then(|| MatCell::None), + MatCell::Normal(data) => data.is_hollow().then_some(MatCell::None), }) .to_segment(|_| Default::default()) }, diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 58ee56d2ed..634068f090 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -926,7 +926,7 @@ impl FigureMgr { let body = *body; // Only use trail manager when trails are enabled - let trail_mgr = scene_data.weapon_trails_enabled.then(|| &mut *trail_mgr); + let trail_mgr = scene_data.weapon_trails_enabled.then_some(&mut *trail_mgr); let common_params = FigureUpdateCommonParameters { entity: Some(entity), @@ -5859,11 +5859,11 @@ impl FigureMgr { arthropod_states, }, } = self; - let col_lights = &*col_lights_; + let col_lights = col_lights_; if let Some((bound, model_entry)) = match body { Body::Humanoid(body) => character_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5880,7 +5880,7 @@ impl FigureMgr { }), Body::QuadrupedSmall(body) => quadruped_small_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5897,7 +5897,7 @@ impl FigureMgr { }), Body::QuadrupedMedium(body) => quadruped_medium_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5914,7 +5914,7 @@ impl FigureMgr { }), Body::QuadrupedLow(body) => quadruped_low_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5931,7 +5931,7 @@ impl FigureMgr { }), Body::BirdMedium(body) => bird_medium_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5948,7 +5948,7 @@ impl FigureMgr { }), Body::FishMedium(body) => fish_medium_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5965,7 +5965,7 @@ impl FigureMgr { }), Body::Theropod(body) => theropod_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5982,7 +5982,7 @@ impl FigureMgr { }), Body::Dragon(body) => dragon_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -5999,7 +5999,7 @@ impl FigureMgr { }), Body::BirdLarge(body) => bird_large_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6016,7 +6016,7 @@ impl FigureMgr { }), Body::FishSmall(body) => fish_small_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6033,7 +6033,7 @@ impl FigureMgr { }), Body::BipedLarge(body) => biped_large_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6050,7 +6050,7 @@ impl FigureMgr { }), Body::BipedSmall(body) => biped_small_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6067,7 +6067,7 @@ impl FigureMgr { }), Body::Golem(body) => golem_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6084,7 +6084,7 @@ impl FigureMgr { }), Body::Arthropod(body) => arthropod_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6101,7 +6101,7 @@ impl FigureMgr { }), Body::Object(body) => object_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6118,7 +6118,7 @@ impl FigureMgr { }), Body::ItemDrop(body) => item_drop_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6137,7 +6137,7 @@ impl FigureMgr { if body.manifest_entry().is_some() { ship_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), @@ -6155,7 +6155,7 @@ impl FigureMgr { } else { volume_states .get(&entity) - .filter(|state| filter_state(*state)) + .filter(|state| filter_state(state)) .map(move |state| { ( state.bound(), diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 47a50d8e40..8e625611a9 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -604,7 +604,7 @@ impl Scene { }; // Compute camera matrices. - self.camera.compute_dependents(&*scene_data.state.terrain()); + self.camera.compute_dependents(&scene_data.state.terrain()); let camera::Dependents { view_mat, view_mat_inv, diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index c6074c9f89..d7efa6827b 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -554,7 +554,7 @@ impl SpriteRenderContext { } }); - let init = core::lazy::OnceCell::new(); + let init = core::cell::OnceCell::new(); let mut join_handle = Some(join_handle); let mut closure = move |renderer: &mut Renderer| { // The second unwrap can only fail if the sprite meshing thread panics, which diff --git a/voxygen/src/session/mod.rs b/voxygen/src/session/mod.rs index 237c89da82..e1f4e2898b 100644 --- a/voxygen/src/session/mod.rs +++ b/voxygen/src/session/mod.rs @@ -103,7 +103,7 @@ impl SessionState { let mut scene = Scene::new( global_state.window.renderer_mut(), &mut global_state.lazy_init, - &*client.borrow(), + &client.borrow(), &global_state.settings, ); scene @@ -186,7 +186,7 @@ impl SessionState { // All this camera code is just to determine if it's underwater for the sfx // filter let camera = self.scene.camera_mut(); - camera.compute_dependents(&*client.state().terrain()); + camera.compute_dependents(&client.state().terrain()); let camera::Dependents { cam_pos, .. } = self.scene.camera().dependents(); let focus_pos = self.scene.camera().get_focus_pos(); let focus_off = focus_pos.map(|e| e.trunc()); @@ -474,7 +474,7 @@ impl PlayState for SessionState { } // Compute camera data - camera.compute_dependents(&*client.state().terrain()); + camera.compute_dependents(&client.state().terrain()); let camera::Dependents { cam_pos, cam_dir, .. } = self.scene.camera().dependents(); @@ -1195,7 +1195,7 @@ impl PlayState for SessionState { // Recompute dependents just in case some input modified the camera self.scene .camera_mut() - .compute_dependents(&*self.client.borrow().state().terrain()); + .compute_dependents(&self.client.borrow().state().terrain()); // Generate debug info, if needed // (it iterates through enough data that we might diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 4c82431be8..79680466b2 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -395,7 +395,7 @@ impl SettingsChange { session_state .scene .camera_mut() - .compute_dependents(&*session_state.client.borrow().state().terrain()); + .compute_dependents(&session_state.client.borrow().state().terrain()); }, Graphics::ChangeGamma(new_gamma) => { settings.graphics.gamma = new_gamma; @@ -411,7 +411,7 @@ impl SettingsChange { global_state .window .renderer_mut() - .set_render_mode((&*new_render_mode).clone()) + .set_render_mode((*new_render_mode).clone()) .unwrap(); settings.graphics.render_mode = *new_render_mode; }, @@ -441,7 +441,7 @@ impl SettingsChange { session_state .scene .camera_mut() - .compute_dependents(&*session_state.client.borrow().state().terrain()); + .compute_dependents(&session_state.client.borrow().state().terrain()); // LoD session_state.scene.lod.set_detail(graphics.lod_detail); // Render mode diff --git a/voxygen/src/settings/chat.rs b/voxygen/src/settings/chat.rs index 6bca1a55c5..4b0b29ceac 100644 --- a/voxygen/src/settings/chat.rs +++ b/voxygen/src/settings/chat.rs @@ -8,7 +8,7 @@ use std::collections::HashSet; pub const MAX_CHAT_TABS: usize = 5; -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct ChatFilter { //messages pub message_all: bool, diff --git a/voxygen/src/settings/graphics.rs b/voxygen/src/settings/graphics.rs index 303bf77f49..c8919a5a76 100644 --- a/voxygen/src/settings/graphics.rs +++ b/voxygen/src/settings/graphics.rs @@ -2,7 +2,7 @@ use crate::{render::RenderMode, window::FullScreenSettings}; use serde::{Deserialize, Serialize}; use std::fmt; -#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq)] +#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] pub enum Fps { Max(u32), Unlimited, diff --git a/voxygen/src/ui/graphic/renderer.rs b/voxygen/src/ui/graphic/renderer.rs index bfb0fd12d4..05e4275bce 100644 --- a/voxygen/src/ui/graphic/renderer.rs +++ b/voxygen/src/ui/graphic/renderer.rs @@ -78,7 +78,7 @@ impl euc::Interpolate for VsOut { } } -impl<'a> Pipeline for Voxel { +impl Pipeline for Voxel { type Pixel = [u8; 4]; type Vertex = Vert; type VsOut = VsOut; diff --git a/voxygen/src/ui/ice/widget/tooltip.rs b/voxygen/src/ui/ice/widget/tooltip.rs index 0b8ac0860a..192e817314 100644 --- a/voxygen/src/ui/ice/widget/tooltip.rs +++ b/voxygen/src/ui/ice/widget/tooltip.rs @@ -124,7 +124,7 @@ impl TooltipManager { fn showing(&self, aabr: Aabr) -> Option<(Point, f32)> { match self.state { State::Idle | State::Start(_) => None, - State::Showing(show) => (show.aabr == aabr).then(|| { + State::Showing(show) => (show.aabr == aabr).then_some({ ( Point { x: show.hover_pos.x as f32, diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index e8d06bf9a4..d7c7c5d8c5 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -700,7 +700,7 @@ impl<'a> Widget for ItemTooltip<'a> { ); let mut diff_text = |text: String, color, id_index| { - widget::Text::new(&*text) + widget::Text::new(&text) .align_middle_y_of(state.ids.stats[id_index]) .right_from(state.ids.stats[id_index], H_PAD) .graphics_for(id) @@ -905,7 +905,7 @@ impl<'a> Widget for ItemTooltip<'a> { util::option_comparison(&armor_stats.stealth, &equipped_stats.stealth); let mut diff_text = |text: String, color, id_index| { - widget::Text::new(&*text) + widget::Text::new(&text) .align_middle_y_of(state.ids.stats[id_index]) .right_from(state.ids.stats[id_index], H_PAD) .graphics_for(id) diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 575a9f6dbd..cfd4675c4f 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -1370,7 +1370,7 @@ pub enum FullscreenMode { impl Default for FullscreenMode { fn default() -> Self { FullscreenMode::Borderless } } -#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] #[serde(default)] pub struct FullScreenSettings { pub enabled: bool, diff --git a/world/Cargo.toml b/world/Cargo.toml index a1f5428df4..7868245d9d 100644 --- a/world/Cargo.toml +++ b/world/Cargo.toml @@ -31,7 +31,7 @@ tracing = { version = "0.1", default-features = false } rand = "0.8" rand_chacha = "0.3" arr_macro = "0.1.2" -packed_simd = { package = "packed_simd_2", version = "0.3.5", optional = true } +packed_simd = { package = "packed_simd_2", version = "0.3.8", optional = true } rayon = "1.5" serde = { version = "1.0.110", features = ["derive"] } ron = { version = "0.8", default-features = false } diff --git a/world/examples/pricing_csv.rs b/world/examples/pricing_csv.rs index 517d62cd1b..d302edcc3a 100644 --- a/world/examples/pricing_csv.rs +++ b/world/examples/pricing_csv.rs @@ -15,7 +15,7 @@ use veloren_world::{ fn good_pricing_csv(world: &World, index: &Index) -> Result<(), Box> { let mut csv = csv::Writer::from_path("good_pricing.csv")?; - csv.write_record(&[ + csv.write_record([ "Site", "XCoord", "YCoord", @@ -39,7 +39,7 @@ fn good_pricing_csv(world: &World, index: &Index) -> Result<(), Box> if site.do_economic_simulation() { let prices = site.economy.get_site_prices(); //println!("{:?}: {:?} {:?}", site.name(), civsite.center, prices); - csv.write_record(&[ + csv.write_record([ site.name(), &format!("{}", civsite.center.x), &format!("{}", civsite.center.y), diff --git a/world/src/canvas.rs b/world/src/canvas.rs index ab6acbda3a..c1d8506894 100644 --- a/world/src/canvas.rs +++ b/world/src/canvas.rs @@ -218,7 +218,7 @@ impl<'a> Canvas<'a> { for z in (structure.get_bounds().min.z..structure.get_bounds().max.z).rev() { if let Ok(sblock) = structure.get(rpos2d.with_z(z)) { let mut add_snow = false; - let _ = canvas.map(wpos2d.with_z(origin.z + z), |block| { + canvas.map(wpos2d.with_z(origin.z + z), |block| { if let Some(new_block) = block_from_structure( info.index, *sblock, @@ -242,7 +242,7 @@ impl<'a> Canvas<'a> { }); if add_snow { - let _ = canvas.set( + canvas.set( wpos2d.with_z(origin.z + z + 1), Block::new(BlockKind::Snow, Rgb::new(210, 210, 255)), ); diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index 07a6fbcef6..16b4ad5d43 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -1233,7 +1233,7 @@ impl fmt::Display for Site { } } -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum SiteKind { Settlement, Dungeon, @@ -1449,14 +1449,14 @@ impl Site { pub fn is_castle(&self) -> bool { matches!(self.kind, SiteKind::Castle) } } -#[derive(PartialEq, Debug, Clone)] +#[derive(PartialEq, Eq, Debug, Clone)] pub struct PointOfInterest { pub name: String, pub kind: PoiKind, pub loc: Vec2, } -#[derive(PartialEq, Debug, Clone)] +#[derive(PartialEq, Eq, Debug, Clone)] pub enum PoiKind { /// Peak stores the altitude Peak(u32), diff --git a/world/src/layer/mod.rs b/world/src/layer/mod.rs index eb2b8a9dbc..81ea876f06 100644 --- a/world/src/layer/mod.rs +++ b/world/src/layer/mod.rs @@ -96,7 +96,7 @@ pub fn apply_paths_to(canvas: &mut Canvas) { let surface_z = (riverless_alt + bridge_offset).floor() as i32; for z in inset - depth..inset { - let _ = canvas.set( + canvas.set( Vec3::new(wpos2d.x, wpos2d.y, surface_z + z), if bridge_offset >= 2.0 && path_dist >= 3.0 || z < inset - 1 { Block::new( @@ -114,7 +114,7 @@ pub fn apply_paths_to(canvas: &mut Canvas) { for z in inset..inset + head_space { let pos = Vec3::new(wpos2d.x, wpos2d.y, surface_z + z); if canvas.get(pos).kind() != BlockKind::Water { - let _ = canvas.set(pos, EMPTY_AIR); + canvas.set(pos, EMPTY_AIR); } } } @@ -653,7 +653,7 @@ pub fn apply_coral_to(canvas: &mut Canvas) { }); if is_coral { - let _ = canvas.set(wpos, Block::new(BlockKind::Rock, Rgb::new(170, 220, 210))); + canvas.set(wpos, Block::new(BlockKind::Rock, Rgb::new(170, 220, 210))); } } }); @@ -1042,7 +1042,7 @@ pub fn apply_caverns_to(canvas: &mut Canvas, dynamic_rng: &mut R) { block }; - let _ = canvas.set(wpos, block); + canvas.set(wpos, block); } }); } diff --git a/world/src/layer/wildlife.rs b/world/src/layer/wildlife.rs index 83fcd5352f..4694cc9299 100644 --- a/world/src/layer/wildlife.rs +++ b/world/src/layer/wildlife.rs @@ -392,7 +392,7 @@ pub fn apply_wildlife_supplement<'a, R: Rng>( .and_then(|pack| { (dynamic_rng.gen::() < density * col_sample.spawn_rate && col_sample.gradient < Some(1.3)) - .then(|| pack) + .then_some(pack) }) }) .flatten() diff --git a/world/src/lib.rs b/world/src/lib.rs index e77c4837e4..65650b38d9 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -7,13 +7,7 @@ )] #![allow(clippy::branches_sharing_code)] // TODO: evaluate #![deny(clippy::clone_on_ref_ptr)] -#![feature( - bool_to_option, - label_break_value, - option_zip, - arbitrary_enum_discriminant, - let_else -)] +#![feature(option_zip, arbitrary_enum_discriminant, let_else)] mod all; mod block; diff --git a/world/src/sim/erosion.rs b/world/src/sim/erosion.rs index 3cb0cf4e7f..63dd236bfa 100644 --- a/world/src/sim/erosion.rs +++ b/world/src/sim/erosion.rs @@ -838,7 +838,7 @@ fn erode( // TODO: Figure out how to switch between single-receiver and multi-receiver // drainage, as the former is much less computationally costly. // let area = get_drainage(map_size_lg, &newh, &dh, boundary_len); - let area = get_multi_drainage(map_size_lg, &mstack, &mrec, &*mwrec, boundary_len); + let area = get_multi_drainage(map_size_lg, &mstack, &mrec, &mwrec, boundary_len); debug!("Got flux..."); (dh, newh, maxh, mrec, mstack, mwrec, area) }, @@ -1864,7 +1864,7 @@ pub fn get_lakes( let mut indirection_ = vec![0u32; indirection.len()]; // First, find all the lakes. let mut lake_roots = Vec::with_capacity(downhill.len()); // Test - (&*downhill) + (*downhill) .iter() .enumerate() .filter(|(_, &dh_idx)| dh_idx < 0) @@ -2160,7 +2160,7 @@ pub fn get_lakes( let mut filling_queue = Vec::with_capacity(downhill.len()); let mut newh = Vec::with_capacity(downhill.len()); - (&*boundary) + (*boundary) .iter() .chain(pass_flows_sorted.iter()) .for_each(|&chunk_idx| { diff --git a/world/src/sim/map.rs b/world/src/sim/map.rs index 97568339d0..3054fc4a3f 100644 --- a/world/src/sim/map.rs +++ b/world/src/sim/map.rs @@ -202,7 +202,7 @@ pub fn sample_pos( let downhill_pos = downhill_wpos.map2(TerrainChunkSize::RECT_SIZE, |e, f| e / f as i32); NEIGHBOR_DELTA .iter() - .zip((&mut connections).iter_mut()) + .zip(connections.iter_mut()) .filter(|&(&offset, _)| downhill_pos - pos == Vec2::from(offset)) .for_each(|(_, connection)| { has_connections = true; diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs index 90e148cad1..f9e8344edf 100644 --- a/world/src/sim/mod.rs +++ b/world/src/sim/mod.rs @@ -1362,7 +1362,7 @@ impl WorldSim { threadpool, ) }; - let flux_old = get_multi_drainage(map_size_lg, &mstack, &mrec, &*mwrec, boundary_len); + let flux_old = get_multi_drainage(map_size_lg, &mstack, &mrec, &mwrec, boundary_len); // let flux_rivers = get_drainage(map_size_lg, &water_alt_pos, &dh, // boundary_len); TODO: Make rivers work with multi-direction flux as // well. diff --git a/world/src/site/economy/map_types.rs b/world/src/site/economy/map_types.rs index 1364570cb4..7e0502514b 100644 --- a/world/src/site/economy/map_types.rs +++ b/world/src/site/economy/map_types.rs @@ -109,14 +109,14 @@ impl IndexMut for GoodMap { impl GoodMap { pub fn iter(&self) -> impl Iterator + '_ { - (&self.data) + self.data .iter() .enumerate() .map(|(idx, v)| (GoodIndex { idx }, v)) } pub fn iter_mut(&mut self) -> impl Iterator + '_ { - (&mut self.data) + self.data .iter_mut() .enumerate() .map(|(idx, v)| (GoodIndex { idx }, v)) @@ -206,7 +206,7 @@ impl fmt::Debug for LaborMap { .entries( self.iter() .filter(|i| *i.1 != V::default()) - .map(|i| (i.0, &*i.1)), + .map(|i| (i.0, i.1)), ) .finish() } @@ -226,14 +226,14 @@ impl IndexMut for LaborMap { impl LaborMap { pub fn iter(&self) -> impl Iterator + '_ { - (&self.data) + self.data .iter() .enumerate() .map(|(idx, v)| (LaborIndex::from_usize(idx), v)) } pub fn iter_mut(&mut self) -> impl Iterator + '_ { - (&mut self.data) + self.data .iter_mut() .enumerate() .map(|(idx, v)| (LaborIndex::from_usize(idx), v)) diff --git a/world/src/site/settlement/mod.rs b/world/src/site/settlement/mod.rs index 6590010185..a0e1044035 100644 --- a/world/src/site/settlement/mod.rs +++ b/world/src/site/settlement/mod.rs @@ -1110,7 +1110,7 @@ fn transfer(wares: &mut Vec, bag: &mut Item) { } } -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum Crop { Corn, Wheat, @@ -1126,7 +1126,7 @@ pub enum Crop { // NOTE: No support for struct variants in make_case_elim yet, unfortunately, so // we can't use it. -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum Plot { Hazard, Dirt, @@ -1149,7 +1149,7 @@ const CARDINALS: [Vec2; 4] = [ Vec2::new(-1, 0), ]; -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum WayKind { Path, #[allow(dead_code)] @@ -1165,7 +1165,7 @@ impl WayKind { } } -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum Tower { #[allow(dead_code)] Wall, diff --git a/world/src/site2/mod.rs b/world/src/site2/mod.rs index 527e6077ad..3910e61750 100644 --- a/world/src/site2/mod.rs +++ b/world/src/site2/mod.rs @@ -154,7 +154,7 @@ impl Site { } max_cost }; - let path = Astar::new(MAX_ITERS, a, &heuristic, DefaultHashBuilder::default()) + let path = Astar::new(MAX_ITERS, a, heuristic, DefaultHashBuilder::default()) .poll( MAX_ITERS, &heuristic, diff --git a/world/src/site2/tile.rs b/world/src/site2/tile.rs index e058642191..0ffff309f8 100644 --- a/world/src/site2/tile.rs +++ b/world/src/site2/tile.rs @@ -239,14 +239,14 @@ pub enum HazardKind { Hill { gradient: f32 }, } -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum KeepKind { Middle, Corner, Wall(Dir), } -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, Eq)] pub enum RoofKind { Parapet, Pyramid, diff --git a/world/src/site2/util/mod.rs b/world/src/site2/util/mod.rs index 99eb36abef..7a15e5f356 100644 --- a/world/src/site2/util/mod.rs +++ b/world/src/site2/util/mod.rs @@ -4,7 +4,7 @@ use rand::Rng; use vek::*; /// A 2d direction. -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Dir { X, Y, diff --git a/world/src/util/map_array.rs b/world/src/util/map_array.rs index 84f6fde108..7171b7db23 100644 --- a/world/src/util/map_array.rs +++ b/world/src/util/map_array.rs @@ -87,7 +87,7 @@ mod tests { impl MyMap { pub fn iter(&self) -> impl Iterator + '_ { - (&self.0).iter().enumerate().map(|(i, v)| (MyIndex(i), v)) + self.0.iter().enumerate().map(|(i, v)| (MyIndex(i), v)) } } From 796a5f2f90b68229deb99f85a894f81ef0334016 Mon Sep 17 00:00:00 2001 From: LunarEclipse Date: Fri, 9 Sep 2022 11:39:27 +0200 Subject: [PATCH 218/854] Added the possibility to toggle muting of any volume category via a keybind --- voxygen/src/game_input.rs | 10 +++++++++- voxygen/src/hud/mod.rs | 29 ++++++++++++++++++++++------- voxygen/src/settings/control.rs | 4 ++++ 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/voxygen/src/game_input.rs b/voxygen/src/game_input.rs index c48a08c1aa..b9902f9fdc 100644 --- a/voxygen/src/game_input.rs +++ b/voxygen/src/game_input.rs @@ -152,8 +152,16 @@ pub enum GameInput { SpectateSpeedBoost, #[strum(serialize = "gameinput-spectateviewpoint")] SpectateViewpoint, - #[strum(serialize = "gameinput-mute-music")] + #[strum(serialize = "gameinput-mutemaster")] + MuteMaster, + #[strum(serialize = "gameinput-muteinactivemaster")] + MuteInactiveMaster, + #[strum(serialize = "gameinput-mutemusic")] MuteMusic, + #[strum(serialize = "gameinput-mutesfx")] + MuteSfx, + #[strum(serialize = "gameinput-muteambience")] + MuteAmbience, } impl GameInput { diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index d03d2f969b..759942accd 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -4126,6 +4126,13 @@ impl Hud { // Press key while not typing WinEvent::InputUpdate(key, state) if !self.typing() => { + let gs_audio = &global_state.settings.audio; + let mut toggle_mute = |audio: Audio| { + self.events + .push(Event::SettingsChange(SettingsChange::Audio(audio))); + true + }; + let matching_key = match key { GameInput::Command if state => { self.force_chat_input = Some("/".to_owned()); @@ -4189,14 +4196,22 @@ impl Hud { GameInput::MapZoomOut if state => { handle_map_zoom(0.5, self.world_map.1, &self.show, global_state) }, + GameInput::MuteMaster if state => { + toggle_mute(Audio::MuteMasterVolume(!gs_audio.master_volume.muted)) + }, + GameInput::MuteInactiveMaster if state => { + toggle_mute(Audio::MuteInactiveMasterVolume( + !gs_audio.inactive_master_volume_perc.muted, + )) + }, GameInput::MuteMusic if state => { - self.events - .push(Event::SettingsChange(SettingsChange::Audio( - Audio::MuteMusicVolume( - !global_state.settings.audio.music_volume.muted, - ), - ))); - true + toggle_mute(Audio::MuteMusicVolume(!gs_audio.music_volume.muted)) + }, + GameInput::MuteSfx if state => { + toggle_mute(Audio::MuteSfxVolume(!gs_audio.sfx_volume.muted)) + }, + GameInput::MuteAmbience if state => { + toggle_mute(Audio::MuteAmbienceVolume(!gs_audio.ambience_volume.muted)) }, // Skillbar input => { diff --git a/voxygen/src/settings/control.rs b/voxygen/src/settings/control.rs index 28c5a96309..43957f8624 100644 --- a/voxygen/src/settings/control.rs +++ b/voxygen/src/settings/control.rs @@ -191,7 +191,11 @@ impl ControlSettings { GameInput::MapSetMarker => Some(KeyMouse::Mouse(MouseButton::Middle)), GameInput::SpectateSpeedBoost => Some(KeyMouse::Key(VirtualKeyCode::LControl)), GameInput::SpectateViewpoint => Some(KeyMouse::Mouse(MouseButton::Middle)), + GameInput::MuteMaster => Some(KeyMouse::Key(VirtualKeyCode::Mute)), + GameInput::MuteInactiveMaster => None, GameInput::MuteMusic => Some(KeyMouse::Key(VirtualKeyCode::F8)), + GameInput::MuteSfx => None, + GameInput::MuteAmbience => None, } } } From 03e8eb42ad2207d6634bfa0cfacbcc2efd9373bf Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Fri, 9 Sep 2022 11:59:40 +0100 Subject: [PATCH 219/854] Added experimental BetterAA shader --- assets/voxygen/shaders/antialias/fxaa.glsl | 10 ++++-- assets/voxygen/shaders/postprocess-frag.glsl | 36 +++++++++++++++++++- voxygen/src/render/mod.rs | 2 ++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/assets/voxygen/shaders/antialias/fxaa.glsl b/assets/voxygen/shaders/antialias/fxaa.glsl index 24ffe84cb9..7fe89a77e7 100644 --- a/assets/voxygen/shaders/antialias/fxaa.glsl +++ b/assets/voxygen/shaders/antialias/fxaa.glsl @@ -124,8 +124,14 @@ vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { mediump vec2 v_rgbSE; mediump vec2 v_rgbM; - vec2 scaled_fc = fragCoord * FXAA_SCALE; - vec2 scaled_res = resolution * FXAA_SCALE; + #ifdef EXPERIMENTAL_BETTERAA + float fxaa_scale = textureSize(sampler2D(tex, smplr), 0).x / 900.0; + #else + float fxaa_scale = FXAA_SCALE; + #endif + + vec2 scaled_fc = fragCoord * fxaa_scale; + vec2 scaled_res = resolution * fxaa_scale; //compute the texture coords texcoords(scaled_fc, scaled_res, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM); diff --git a/assets/voxygen/shaders/postprocess-frag.glsl b/assets/voxygen/shaders/postprocess-frag.glsl index 85616fe6ea..9050f64e96 100644 --- a/assets/voxygen/shaders/postprocess-frag.glsl +++ b/assets/voxygen/shaders/postprocess-frag.glsl @@ -22,6 +22,7 @@ #include #include #include +#include layout(set = 1, binding = 0) uniform texture2D t_src_color; @@ -43,6 +44,34 @@ uniform texture2D t_src_bloom; layout(location = 0) out vec4 tgt_color; +#ifdef EXPERIMENTAL_BETTERAA + vec4 clever_aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { + uvec2 src_sz = textureSize(sampler2D(tex, smplr), 0).xy; + /* vec4 interp = texture(sampler2D(tex, smplr), fragCoord / resolution); */ + /* vec4 interp = textureBicubic(tex, smplr, fragCoord * src_sz / resolution); */ + vec4 interp = aa_apply(tex, smplr, fragCoord, resolution); + vec4 original = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz), 0); + + vec4 closest = vec4(0.0); + float closest_dist = 100000.0; + for (int i = -1; i < 2; i ++) { + for (int j = -1; j < 2; j ++) { + ivec2 rpos = ivec2(i, j); + + vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz) + rpos, 0); + + float dist = distance(interp.rgb, texel.rgb); + if (dist < closest_dist) { + closest = texel; + closest_dist = dist; + } + } + } + + return mix(closest, interp, 0.0); + } +#endif + vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); @@ -209,7 +238,12 @@ void main() { } #endif - vec4 aa_color = aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); + #ifdef EXPERIMENTAL_BETTERAA + vec4 aa_color = clever_aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); + #else + vec4 aa_color = aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); + #endif + #ifdef EXPERIMENTAL_SOBEL vec3 s[8]; diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index c0b7e4f2b1..90857a4c70 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -482,4 +482,6 @@ pub enum ExperimentalShader { NoRainbows, /// Make objects appear wet when appropriate. Wetness, + /// An attempt at better anti-aliasing (requires FXAA). + BetterAA, } From 943cfe2d8950abc12e0b8cc9f21b28c4bec9e3aa Mon Sep 17 00:00:00 2001 From: Ben Wallis Date: Fri, 9 Sep 2022 13:25:27 +0100 Subject: [PATCH 220/854] Updated docker-compose.yml to use weekly image instead of nightly --- server-cli/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-cli/docker-compose.yml b/server-cli/docker-compose.yml index 6faf73fb84..8356597413 100644 --- a/server-cli/docker-compose.yml +++ b/server-cli/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: game-server: - image: registry.gitlab.com/veloren/veloren/server-cli:nightly + image: registry.gitlab.com/veloren/veloren/server-cli:weekly stdin_open: true tty: true container_name: veloren-game-server-master From 80fa0baf09cc37310aa65cb3a7a80cfddad99335 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sat, 10 Sep 2022 10:56:22 +0100 Subject: [PATCH 221/854] Added HQX anti-aliasing --- assets/voxygen/shaders/antialias/fxaa.glsl | 9 +- assets/voxygen/shaders/antialias/hqx.glsl | 63 ++++++ .../voxygen/shaders/antialias/msaa-x16.glsl | 9 +- assets/voxygen/shaders/antialias/msaa-x4.glsl | 7 +- assets/voxygen/shaders/antialias/msaa-x8.glsl | 7 +- assets/voxygen/shaders/antialias/none.glsl | 7 +- assets/voxygen/shaders/postprocess-frag.glsl | 192 +++++++++++++++++- voxygen/src/hud/settings_window/video.rs | 6 +- voxygen/src/render/mod.rs | 17 ++ voxygen/src/render/pipelines/clouds.rs | 7 +- voxygen/src/render/pipelines/debug.rs | 7 +- voxygen/src/render/pipelines/figure.rs | 7 +- voxygen/src/render/pipelines/fluid.rs | 7 +- voxygen/src/render/pipelines/lod_object.rs | 7 +- voxygen/src/render/pipelines/lod_terrain.rs | 7 +- voxygen/src/render/pipelines/particle.rs | 7 +- voxygen/src/render/pipelines/postprocess.rs | 36 +++- .../src/render/pipelines/rain_occlusion.rs | 14 +- voxygen/src/render/pipelines/shadow.rs | 21 +- voxygen/src/render/pipelines/skybox.rs | 7 +- voxygen/src/render/pipelines/sprite.rs | 7 +- voxygen/src/render/pipelines/terrain.rs | 7 +- voxygen/src/render/pipelines/trail.rs | 7 +- voxygen/src/render/renderer.rs | 12 +- voxygen/src/render/renderer/locals.rs | 4 + .../src/render/renderer/pipeline_creation.rs | 1 + voxygen/src/render/renderer/shaders.rs | 1 + 27 files changed, 357 insertions(+), 126 deletions(-) create mode 100644 assets/voxygen/shaders/antialias/hqx.glsl diff --git a/assets/voxygen/shaders/antialias/fxaa.glsl b/assets/voxygen/shaders/antialias/fxaa.glsl index 7fe89a77e7..6d4c91f80c 100644 --- a/assets/voxygen/shaders/antialias/fxaa.glsl +++ b/assets/voxygen/shaders/antialias/fxaa.glsl @@ -117,7 +117,12 @@ void texcoords(vec2 fragCoord, vec2 resolution, } -vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { +vec4 aa_apply( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + vec2 fragCoord, + vec2 resolution +) { mediump vec2 v_rgbNW; mediump vec2 v_rgbNE; mediump vec2 v_rgbSW; @@ -125,7 +130,7 @@ vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { mediump vec2 v_rgbM; #ifdef EXPERIMENTAL_BETTERAA - float fxaa_scale = textureSize(sampler2D(tex, smplr), 0).x / 900.0; + float fxaa_scale = textureSize(sampler2D(tex, smplr), 0).x / 1000.0; #else float fxaa_scale = FXAA_SCALE; #endif diff --git a/assets/voxygen/shaders/antialias/hqx.glsl b/assets/voxygen/shaders/antialias/hqx.glsl new file mode 100644 index 0000000000..6e7d9e2139 --- /dev/null +++ b/assets/voxygen/shaders/antialias/hqx.glsl @@ -0,0 +1,63 @@ +const float THRESHOLD = 0.025; +const float DEPTH_THRESHOLD = 0.05; + +bool diag( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + const float line_thickness, + inout vec4 sum, + vec2 uv, + const vec2 p1, + const vec2 p2, + const float aa_scale +) { + vec4 v1 = texelFetch(sampler2D(tex, smplr), ivec2(uv + vec2(p1.x, p1.y)), 0); + vec4 v2 = texelFetch(sampler2D(tex, smplr), ivec2(uv + vec2(p2.x, p2.y)), 0); + float d1 = 1.0 / texelFetch(sampler2D(depth_tex, depth_smplr), ivec2(uv + vec2(p1.x, p1.y)), 0).x; + float d2 = 1.0 / texelFetch(sampler2D(depth_tex, depth_smplr), ivec2(uv + vec2(p2.x, p2.y)), 0).x; + if (length((v1 - v2).rb) < THRESHOLD && abs(d1 - d2) < d1 * DEPTH_THRESHOLD + 3.0) { + vec2 dir = p2 - p1; + vec2 lp = uv - (floor(uv + p1) + 0.5); + dir = normalize(vec2(dir.y, -dir.x)); + float l = clamp((line_thickness - dot(lp, dir)) * aa_scale, 0.0, 1.0); + sum = mix(sum, (v1 + v2) * 0.5, l); + return true; + } + return false; +} + +vec4 aa_apply( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + vec2 fragCoord, + vec2 resolution +) { + uvec2 src_sz = textureSize(sampler2D(tex, smplr), 0).xy; + + vec2 upscale = resolution / src_sz; + vec2 ip = fragCoord / upscale; + //start with nearest pixel as 'background' + vec4 s = texelFetch(sampler2D(tex, smplr), ivec2(ip), 0); + + float aa_scale = upscale.x * 1.5; + + //draw anti aliased diagonal lines of surrounding pixels as 'foreground' + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(-1, 0), vec2(0, 1), aa_scale)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, 0), vec2(1, 1), aa_scale); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, -1), vec2(0, 1), aa_scale); + } + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(0, 1), vec2(1, 0), aa_scale)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(0, 1), vec2(1, -1), aa_scale); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, 1), vec2(1, 0), aa_scale); + } + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(1, 0), vec2(0, -1), aa_scale)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, 0), vec2(-1, -1), aa_scale); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, 1), vec2(0, -1), aa_scale); + } + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(0, -1), vec2(-1, 0), aa_scale)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(0, -1), vec2(-1, 1), aa_scale); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, -1), vec2(-1, 0), aa_scale); + } + + return s; +} diff --git a/assets/voxygen/shaders/antialias/msaa-x16.glsl b/assets/voxygen/shaders/antialias/msaa-x16.glsl index df5bbaaa2c..0598c3ee4a 100644 --- a/assets/voxygen/shaders/antialias/msaa-x16.glsl +++ b/assets/voxygen/shaders/antialias/msaa-x16.glsl @@ -1,4 +1,9 @@ -vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { +vec4 aa_apply( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + vec2 fragCoord, + vec2 resolution +) { ivec2 texel_coord = ivec2(fragCoord.x, fragCoord.y); vec4 sample1 = texelFetch(sampler2DMS(tex, smplr), texel_coord, 0); @@ -20,7 +25,7 @@ vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { // Average Samples vec4 msaa_color = ( - sample1 + sample2 + sample3 + sample4 + sample5 + sample6 + sample7 + sample8 + + sample1 + sample2 + sample3 + sample4 + sample5 + sample6 + sample7 + sample8 + sample9 + sample10 + sample11 + sample12 + sample13 + sample14 + sample15 + sample16 ) / 16.0; diff --git a/assets/voxygen/shaders/antialias/msaa-x4.glsl b/assets/voxygen/shaders/antialias/msaa-x4.glsl index f6d2e76841..6ab01e8aa2 100644 --- a/assets/voxygen/shaders/antialias/msaa-x4.glsl +++ b/assets/voxygen/shaders/antialias/msaa-x4.glsl @@ -1,4 +1,9 @@ -vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { +vec4 aa_apply( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + vec2 fragCoord, + vec2 resolution +) { ivec2 texel_coord = ivec2(fragCoord.x, fragCoord.y); vec4 sample1 = texelFetch(sampler2DMS(tex, smplr), texel_coord, 0); diff --git a/assets/voxygen/shaders/antialias/msaa-x8.glsl b/assets/voxygen/shaders/antialias/msaa-x8.glsl index cacdc7c4bf..1d15046299 100644 --- a/assets/voxygen/shaders/antialias/msaa-x8.glsl +++ b/assets/voxygen/shaders/antialias/msaa-x8.glsl @@ -1,4 +1,9 @@ -vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { +vec4 aa_apply( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + vec2 fragCoord, + vec2 resolution +) { ivec2 texel_coord = ivec2(fragCoord.x, fragCoord.y); vec4 sample1 = texelFetch(sampler2DMS(tex, smplr), texel_coord, 0); diff --git a/assets/voxygen/shaders/antialias/none.glsl b/assets/voxygen/shaders/antialias/none.glsl index 2e537bc3f8..ff2ae63e2e 100644 --- a/assets/voxygen/shaders/antialias/none.glsl +++ b/assets/voxygen/shaders/antialias/none.glsl @@ -1,3 +1,8 @@ -vec4 aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { +vec4 aa_apply( + texture2D tex, sampler smplr, + texture2D depth_tex, sampler depth_smplr, + vec2 fragCoord, + vec2 resolution +) { return texture(sampler2D(tex, smplr), fragCoord / resolution); } diff --git a/assets/voxygen/shaders/postprocess-frag.glsl b/assets/voxygen/shaders/postprocess-frag.glsl index 9050f64e96..18b4086385 100644 --- a/assets/voxygen/shaders/postprocess-frag.glsl +++ b/assets/voxygen/shaders/postprocess-frag.glsl @@ -29,9 +29,14 @@ uniform texture2D t_src_color; layout(set = 1, binding = 1) uniform sampler s_src_color; +layout(set = 1, binding = 2) +uniform texture2D t_src_depth; +layout(set = 1, binding = 3) +uniform sampler s_src_depth; + layout(location = 0) in vec2 uv; -layout (std140, set = 1, binding = 2) +layout (std140, set = 1, binding = 4) uniform u_locals { mat4 proj_mat_inv; mat4 view_mat_inv; @@ -45,22 +50,111 @@ uniform texture2D t_src_bloom; layout(location = 0) out vec4 tgt_color; #ifdef EXPERIMENTAL_BETTERAA - vec4 clever_aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { + vec3 wpos_at(vec2 uv) { + float buf_depth = texture(sampler2D(t_src_depth, s_src_depth), uv).x - 0.0001; + vec4 clip_space = vec4((uv * 2.0 - 1.0) * vec2(1, -1), buf_depth, 1.0); + mat4 all_mat_inv = view_mat_inv * proj_mat_inv; + vec4 view_space = all_mat_inv * clip_space; + view_space /= view_space.w; + if (buf_depth == 0.0) { + vec3 direction = normalize(view_space.xyz); + return direction.xyz * 524288.0625 + cam_pos.xyz; + } else { + return view_space.xyz; + } + } + + float depth_at(vec2 uv) { + float buf_depth = texture(sampler2D(t_src_depth, s_src_depth), uv).x; + return 1.0 / buf_depth; + } + + float weighted_lerp(float x, float a, float b) { + return pow(x, b / a); + /* return x; */ + float xx = b * x - a * (1.0 - x); + return sign(xx) * (1.0 - 1.0 / (1.0 + abs(xx))) * 0.5 + 0.5; + } + + float vmax(vec3 v) { + return max(v.x, max(v.y, v.z)); + } + + float vmax_but_one(vec3 v) { + float m = max(v.x, max(v.y, v.z)); + if (v.x == m) + return max(v.y, v.z); + else if (v.y == m) + return max(v.x, v.z); + else + return max(v.x, v.y); + } + + vec4 better_aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { uvec2 src_sz = textureSize(sampler2D(tex, smplr), 0).xy; - /* vec4 interp = texture(sampler2D(tex, smplr), fragCoord / resolution); */ - /* vec4 interp = textureBicubic(tex, smplr, fragCoord * src_sz / resolution); */ - vec4 interp = aa_apply(tex, smplr, fragCoord, resolution); + + vec3 wpos = wpos_at(fragCoord / resolution); + float dist = distance(cam_pos.xyz, wpos); + vec3 dir = normalize(wpos - cam_pos.xyz); + + // vec4 interp = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz), 0); + // vec4 interp = texture(sampler2D(tex, smplr), fragCoord / resolution); + // vec4 interp = textureBicubic(tex, smplr, fragCoord * src_sz / resolution); + vec4 interp = aa_apply(tex, smplr, t_src_depth, s_src_depth, fragCoord, resolution); vec4 original = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz), 0); + // GRID + /* if (mod(fragCoord.x, resolution.x / src_sz.x) < 0.9) { return vec4(0.0, 0.0, 0.0, 0.0); } */ + /* if (mod(fragCoord.y, resolution.y / src_sz.y) < 0.9) { return vec4(0.0, 0.0, 0.0, 0.0); } */ + + vec2 pos = fragCoord;// - 0.5 * src_sz; + + // vec4 t00 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(0, 0)), 0); + // vec4 t10 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(1, 0)), 0); + // vec4 t01 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(0, 1)), 0); + // vec4 t11 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(1, 1)), 0); + vec3 w00 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(0, 0)) / vec2(src_sz)); + vec3 w10 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(1, 0)) / vec2(src_sz)); + vec3 w01 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(0, 1)) / vec2(src_sz)); + vec3 w11 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(1, 1)) / vec2(src_sz)); + float d00 = distance(w00, cam_pos.xyz); + float d10 = distance(w10, cam_pos.xyz); + float d01 = distance(w01, cam_pos.xyz); + float d11 = distance(w11, cam_pos.xyz); + + vec2 px_fact = fract(pos / (resolution / vec2(src_sz))); + // vec4 t0 = mix(t00, t10, weighted_lerp(px_fact.x, d00, d10)); + // vec4 t1 = mix(t01, t11, weighted_lerp(px_fact.x, d01, d11)); + vec3 w0 = (w00 * d00 * (1 - px_fact.x) + w10 * d10 * px_fact.x) / (d00 * (1 - px_fact.x) + d10 * px_fact.x); + vec3 w1 = (w01 * d01 * (1 - px_fact.x) + w11 * d11 * px_fact.x) / (d01 * (1 - px_fact.x) + d11 * px_fact.x); + float d0 = mix(d00, d10, px_fact.x); + float d1 = mix(d01, d11, px_fact.x); + + float d_lerped = mix(d0, d1, px_fact.y); + vec3 wpos_lerped = (w0 * d0 * (1 - px_fact.y) + w1 * d1 * px_fact.y) / (d0 * (1 - px_fact.y) + d1 * px_fact.y) + vec3( + dir.y > 0.0 ? 0.0 : 0.5, + dir.x > 0.0 ? 0.5 : 0.0, + 0.5 + );//mix(w0, w1, weighted_lerp(px_fact.y, 0.1 / d0, 0.1 / d1)) + 0.5; + + // vec4 interp = mix(t0, t1, weighted_lerp(px_fact.y, d0, d1)); + + /* vec4 closest = vec4(0.0); float closest_dist = 100000.0; for (int i = -1; i < 2; i ++) { for (int j = -1; j < 2; j ++) { ivec2 rpos = ivec2(i, j); + //float l = length(normalize(vec2(rpos)) - factor); + vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz) + rpos, 0); - float dist = distance(interp.rgb, texel.rgb); + float fov = 70.0; + float texel_at_dist = dist / resolution.x * fov; + vec3 diff = mod(wpos * texel_at_dist, vec3(1.0)) - 0.5; + + float dist = distance(interp.rgb, texel.rgb);// * 0.0 + (rpos.y - diff.z) * 1.0;// * (1.0 + l * 0.5); if (dist < closest_dist) { closest = texel; closest_dist = dist; @@ -68,7 +162,85 @@ layout(location = 0) out vec4 tgt_color; } } - return mix(closest, interp, 0.0); + return closest;//interp; + */ + /* + ivec2 closest = ivec2(0); + vec3 closest_wpos = vec3(0); + float closest_dist = 100000.0; + for (int i = -1; i < 2; i ++) { + for (int j = -1; j < 2; j ++) { + ivec2 rpos = ivec2(i, j); + vec3 wpos = wpos_at(((fragCoord / resolution * vec2(src_sz)) + rpos) / vec2(src_sz)); + float dist = distance(cam_pos.xyz, wpos); + if (dist < closest_dist) { + closest = rpos; + closest_wpos = wpos; + closest_dist = dist; + } + } + } + + float fov = 70.0; + vec2 texel_at_dist = src_sz / (fov * closest_dist); + vec3 diff = fract(closest_wpos) * 2.0 - 1.0; + + vec2 rpos = vec2(diff.y * dir.x, -diff.z * -abs(dir.x)) + //+ vec2(diff.x * -dir.y, diff.z * abs(dir.y)) + //+ vec2(diff.z * -dir.z * 0, diff.x * abs(dir.z)) + ; + + vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz + closest + rpos), 0); + + return texel; + */ + + float original_dist = dist; + vec4 closest_texel = vec4(0); + vec3 closest_wpos = vec3(0); + float closest_dist = 100000.0; + vec4 weighted_sum = vec4(0.0); + float weighted_total = 0.0; + for (int i = -1; i < 2; i ++) { + for (int j = -1; j < 2; j ++) { + ivec2 rpos = ivec2(i, j); + vec3 wpos = wpos_at(floor(fragCoord / resolution * vec2(src_sz) + rpos - 1) / vec2(src_sz)); + float tdist = distance(cam_pos.xyz, wpos); + + //float fov = 1.2; + //float texel_at_dist = src_sz.x / (fov * tdist); + + vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz) + rpos, 0); + //texel = texture(sampler2D(tex, smplr), floor(fragCoord / resolution * vec2(src_sz) + rpos) / vec2(src_sz)); + + float texel_dist; + if (true && false) { + texel_dist = distance(wpos + fract(wpos_lerped * 2.0) / 2.0, wpos_lerped); + } else if (original_dist < 15.0 || true) { + texel_dist = distance(interp.rgb, texel.rgb); + } else { + texel_dist = length(mod(wpos, vec3(1.0)) - 0.5); + } + + if (texel_dist < closest_dist) { + closest_texel = texel; + closest_wpos = wpos; + closest_dist = texel_dist; + } + + //float weight = 1.0 / distance(interp.rgb, texel.rgb); + float weight = 1.0 / distance(wpos, wpos_lerped); + + weighted_sum += texel * weight; + weighted_total += weight; + } + } + + //return vec4(px_fact.xy, 1.0, 1.0); + //return mod(10.0 * d_lerped, 1.0).xxxx; + //return mod(wpos_lerped, 1.0).xyzx; + //return weighted_sum / weighted_total; + return closest_texel; } #endif @@ -185,7 +357,7 @@ vec3 _illuminate(float max_light, vec3 view_dir, /*vec3 max_light, */vec3 emitte #ifdef EXPERIMENTAL_SOBEL vec3 aa_sample(vec2 uv, vec2 off) { - return aa_apply(t_src_color, s_src_color, uv * screen_res.xy + off, screen_res.xy).rgb; + return aa_apply(t_src_color, s_src_color, t_src_depth, s_src_depth, uv * screen_res.xy + off, screen_res.xy).rgb; } #endif @@ -239,9 +411,9 @@ void main() { #endif #ifdef EXPERIMENTAL_BETTERAA - vec4 aa_color = clever_aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); + vec4 aa_color = better_aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); #else - vec4 aa_color = aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); + vec4 aa_color = aa_apply(t_src_color, s_src_color, t_src_depth, s_src_depth, sample_uv * screen_res.xy, screen_res.xy); #endif diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index 6b445957a5..ef19eeee89 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -804,13 +804,15 @@ impl<'a> Widget for Video<'a> { /* AaMode::MsaaX4, AaMode::MsaaX8, AaMode::MsaaX16, */ + AaMode::Hqx, ]; let mode_label_list = [ - "No AA", + "No anti-aliasing", "FXAA", /* "MSAA x4", "MSAA x8", "MSAA x16 (experimental)", */ + "HQX", ]; // Get which AA mode is currently active @@ -941,7 +943,7 @@ impl<'a> Widget for Video<'a> { let upscale_factors = [ // Upscaling - 0.15, 0.2, 0.25, 0.35, 0.5, 0.65, 0.75, 0.85, 1.0, + 0.01, 0.025, 0.1, 0.15, 0.2, 0.25, 0.35, 0.5, 0.65, 0.75, 0.85, 1.0, // Downscaling (equivalent to SSAA) 1.25, 1.5, 1.75, 2.0, ]; diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index 90857a4c70..8fc065a5df 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -93,10 +93,27 @@ pub enum AaMode { /// also struggle in the future with deferred shading, so they may be /// removed in the future. MsaaX16, + /// Fast upscaling re-aliasing. + /// + /// Screen-space technique that attempts to reconstruct lines and edges + /// in the original image. Useless at internal resolutions higher than 1.0x, + /// but potentially very effective at much lower internal resolutions. + Hqx, #[serde(other)] None, } +impl AaMode { + pub fn samples(&self) -> u32 { + match self { + AaMode::None | AaMode::Fxaa | AaMode::Hqx => 1, + AaMode::MsaaX4 => 4, + AaMode::MsaaX8 => 8, + AaMode::MsaaX16 => 16, + } + } +} + impl Default for AaMode { fn default() -> Self { AaMode::Fxaa } } diff --git a/voxygen/src/render/pipelines/clouds.rs b/voxygen/src/render/pipelines/clouds.rs index 52773d3c0c..e64356ee56 100644 --- a/voxygen/src/render/pipelines/clouds.rs +++ b/voxygen/src/render/pipelines/clouds.rs @@ -158,12 +158,7 @@ impl CloudsPipeline { ], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Clouds pipeline"), diff --git a/voxygen/src/render/pipelines/debug.rs b/voxygen/src/render/pipelines/debug.rs index 3edde4ea29..681bba4ce7 100644 --- a/voxygen/src/render/pipelines/debug.rs +++ b/voxygen/src/render/pipelines/debug.rs @@ -71,12 +71,7 @@ impl DebugPipeline { bind_group_layouts: &[&global_layouts.globals, &layout.locals], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Debug pipeline"), diff --git a/voxygen/src/render/pipelines/figure.rs b/voxygen/src/render/pipelines/figure.rs index a673e8b49d..0bca9a6412 100644 --- a/voxygen/src/render/pipelines/figure.rs +++ b/voxygen/src/render/pipelines/figure.rs @@ -190,12 +190,7 @@ impl FigurePipeline { ], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Figure pipeline"), diff --git a/voxygen/src/render/pipelines/fluid.rs b/voxygen/src/render/pipelines/fluid.rs index e4250413d8..de9c70c177 100644 --- a/voxygen/src/render/pipelines/fluid.rs +++ b/voxygen/src/render/pipelines/fluid.rs @@ -70,12 +70,7 @@ impl FluidPipeline { ], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Fluid pipeline"), diff --git a/voxygen/src/render/pipelines/lod_object.rs b/voxygen/src/render/pipelines/lod_object.rs index 8e86d9aef9..23be60873f 100644 --- a/voxygen/src/render/pipelines/lod_object.rs +++ b/voxygen/src/render/pipelines/lod_object.rs @@ -94,12 +94,7 @@ impl LodObjectPipeline { bind_group_layouts: &[&global_layout.globals, &global_layout.shadow_textures], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("LoD object pipeline"), diff --git a/voxygen/src/render/pipelines/lod_terrain.rs b/voxygen/src/render/pipelines/lod_terrain.rs index 7a4a757eaf..8d02835706 100644 --- a/voxygen/src/render/pipelines/lod_terrain.rs +++ b/voxygen/src/render/pipelines/lod_terrain.rs @@ -209,12 +209,7 @@ impl LodTerrainPipeline { bind_group_layouts: &[&global_layout.globals, &global_layout.shadow_textures], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Lod terrain pipeline"), diff --git a/voxygen/src/render/pipelines/particle.rs b/voxygen/src/render/pipelines/particle.rs index 7c701fa3f6..9b44894b48 100644 --- a/voxygen/src/render/pipelines/particle.rs +++ b/voxygen/src/render/pipelines/particle.rs @@ -200,12 +200,7 @@ impl ParticlePipeline { bind_group_layouts: &[&global_layout.globals, &global_layout.shadow_textures], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Particle pipeline"), diff --git a/voxygen/src/render/pipelines/postprocess.rs b/voxygen/src/render/pipelines/postprocess.rs index 3d67c2d4d4..5f069db833 100644 --- a/voxygen/src/render/pipelines/postprocess.rs +++ b/voxygen/src/render/pipelines/postprocess.rs @@ -53,9 +53,29 @@ impl PostProcessLayout { }, count: None, }, - // Locals + // Depth source wgpu::BindGroupLayoutEntry { binding: 2, + visibility: wgpu::ShaderStage::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 3, + visibility: wgpu::ShaderStage::FRAGMENT, + ty: wgpu::BindingType::Sampler { + filtering: true, + comparison: false, + }, + count: None, + }, + // Locals + wgpu::BindGroupLayoutEntry { + binding: 4, visibility: wgpu::ShaderStage::VERTEX | wgpu::ShaderStage::FRAGMENT, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, @@ -70,7 +90,7 @@ impl PostProcessLayout { bind_entries.push( // src bloom wgpu::BindGroupLayoutEntry { - binding: 3, + binding: 5, visibility: wgpu::ShaderStage::FRAGMENT, ty: wgpu::BindingType::Texture { sample_type: wgpu::TextureSampleType::Float { filterable: true }, @@ -94,8 +114,10 @@ impl PostProcessLayout { &self, device: &wgpu::Device, src_color: &wgpu::TextureView, + src_depth: &wgpu::TextureView, src_bloom: Option<&wgpu::TextureView>, sampler: &wgpu::Sampler, + depth_sampler: &wgpu::Sampler, locals: &Consts, ) -> BindGroup { let mut entries = vec![ @@ -109,6 +131,14 @@ impl PostProcessLayout { }, wgpu::BindGroupEntry { binding: 2, + resource: wgpu::BindingResource::TextureView(src_depth), + }, + wgpu::BindGroupEntry { + binding: 3, + resource: wgpu::BindingResource::Sampler(depth_sampler), + }, + wgpu::BindGroupEntry { + binding: 4, resource: locals.buf().as_entire_binding(), }, ]; @@ -120,7 +150,7 @@ impl PostProcessLayout { // TODO: if there is no upscaling we can do the last bloom upsampling in post // process to save a pass and the need for the final full size bloom render target wgpu::BindGroupEntry { - binding: 3, + binding: 5, resource: wgpu::BindingResource::TextureView(src_bloom), }, ); diff --git a/voxygen/src/render/pipelines/rain_occlusion.rs b/voxygen/src/render/pipelines/rain_occlusion.rs index 81eac21ecf..18a2cea9ea 100644 --- a/voxygen/src/render/pipelines/rain_occlusion.rs +++ b/voxygen/src/render/pipelines/rain_occlusion.rs @@ -103,12 +103,7 @@ impl RainOcclusionFigurePipeline { bind_group_layouts: &[&global_layout.globals, &figure_layout.locals], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Rain occlusion figure pipeline"), @@ -176,12 +171,7 @@ impl RainOcclusionPipeline { bind_group_layouts: &[&global_layout.globals, &terrain_layout.locals], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Rain occlusion pipeline"), diff --git a/voxygen/src/render/pipelines/shadow.rs b/voxygen/src/render/pipelines/shadow.rs index 704af49da2..107d3b2216 100644 --- a/voxygen/src/render/pipelines/shadow.rs +++ b/voxygen/src/render/pipelines/shadow.rs @@ -145,12 +145,7 @@ impl ShadowFigurePipeline { bind_group_layouts: &[&global_layout.globals, &figure_layout.locals], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Directed shadow figure pipeline"), @@ -218,12 +213,7 @@ impl ShadowPipeline { bind_group_layouts: &[&global_layout.globals, &terrain_layout.locals], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Directed shadow pipeline"), @@ -293,12 +283,7 @@ impl PointShadowPipeline { bind_group_layouts: &[&global_layout.globals, &terrain_layout.locals], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Point shadow pipeline"), diff --git a/voxygen/src/render/pipelines/skybox.rs b/voxygen/src/render/pipelines/skybox.rs index 9d59ecc729..a3e9e6a863 100644 --- a/voxygen/src/render/pipelines/skybox.rs +++ b/voxygen/src/render/pipelines/skybox.rs @@ -48,12 +48,7 @@ impl SkyboxPipeline { bind_group_layouts: &[&layouts.globals, &layouts.shadow_textures], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Skybox pipeline"), diff --git a/voxygen/src/render/pipelines/sprite.rs b/voxygen/src/render/pipelines/sprite.rs index c309a50bfb..3c0085dd7c 100644 --- a/voxygen/src/render/pipelines/sprite.rs +++ b/voxygen/src/render/pipelines/sprite.rs @@ -267,12 +267,7 @@ impl SpritePipeline { ], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Sprite pipeline"), diff --git a/voxygen/src/render/pipelines/terrain.rs b/voxygen/src/render/pipelines/terrain.rs index d0661ec416..8a6e4ad16e 100644 --- a/voxygen/src/render/pipelines/terrain.rs +++ b/voxygen/src/render/pipelines/terrain.rs @@ -234,12 +234,7 @@ impl TerrainPipeline { ], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Terrain pipeline"), diff --git a/voxygen/src/render/pipelines/trail.rs b/voxygen/src/render/pipelines/trail.rs index 5584db3a61..5ab28a59c2 100644 --- a/voxygen/src/render/pipelines/trail.rs +++ b/voxygen/src/render/pipelines/trail.rs @@ -69,12 +69,7 @@ impl TrailPipeline { bind_group_layouts: &[&global_layout.globals, &global_layout.shadow_textures], }); - let samples = match aa_mode { - AaMode::None | AaMode::Fxaa => 1, - AaMode::MsaaX4 => 4, - AaMode::MsaaX8 => 8, - AaMode::MsaaX16 => 16, - }; + let samples = aa_mode.samples(); let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Trail pipeline"), diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs index 804b8aacb9..35ea14643c 100644 --- a/voxygen/src/render/renderer.rs +++ b/voxygen/src/render/renderer.rs @@ -28,8 +28,8 @@ use super::{ ui, GlobalsBindGroup, GlobalsLayouts, ShadowTexturesBindGroup, }, texture::Texture, - AaMode, AddressMode, FilterMode, OtherModes, PipelineModes, RenderError, RenderMode, - ShadowMapMode, ShadowMode, Vertex, + AddressMode, FilterMode, OtherModes, PipelineModes, RenderError, RenderMode, ShadowMapMode, + ShadowMode, Vertex, }; use common::assets::{self, AssetExt, AssetHandle, ReloadWatcher}; use common_base::span; @@ -798,12 +798,8 @@ impl Renderer { let upscaled = Vec2::::from(size) .map(|e| (e as f32 * other_modes.upscale_mode.factor) as u32) .into_tuple(); - let (width, height, sample_count) = match pipeline_modes.aa { - AaMode::None | AaMode::Fxaa => (upscaled.0, upscaled.1, 1), - AaMode::MsaaX4 => (upscaled.0, upscaled.1, 4), - AaMode::MsaaX8 => (upscaled.0, upscaled.1, 8), - AaMode::MsaaX16 => (upscaled.0, upscaled.1, 16), - }; + let (width, height) = upscaled; + let sample_count = pipeline_modes.aa.samples(); let levels = 1; let color_view = |width, height| { diff --git a/voxygen/src/render/renderer/locals.rs b/voxygen/src/render/renderer/locals.rs index fb3b0301ac..e590396e2c 100644 --- a/voxygen/src/render/renderer/locals.rs +++ b/voxygen/src/render/renderer/locals.rs @@ -47,8 +47,10 @@ impl Locals { let postprocess_bind = layouts.postprocess.bind( device, tgt_color_pp_view, + tgt_depth_view, bloom.as_ref().map(|b| b.final_tgt_view), sampler, + depth_sampler, &postprocess_locals, ); @@ -92,8 +94,10 @@ impl Locals { self.postprocess_bind = layouts.postprocess.bind( device, tgt_color_pp_view, + tgt_depth_view, bloom.as_ref().map(|b| b.final_tgt_view), sampler, + depth_sampler, &self.postprocess, ); self.bloom_binds = bloom.map(|bloom| { diff --git a/voxygen/src/render/renderer/pipeline_creation.rs b/voxygen/src/render/renderer/pipeline_creation.rs index c755caa829..b7d8a00afe 100644 --- a/voxygen/src/render/renderer/pipeline_creation.rs +++ b/voxygen/src/render/renderer/pipeline_creation.rs @@ -247,6 +247,7 @@ impl ShaderModules { AaMode::MsaaX4 => "antialias.msaa-x4", AaMode::MsaaX8 => "antialias.msaa-x8", AaMode::MsaaX16 => "antialias.msaa-x16", + AaMode::Hqx => "antialias.hqx", }) .unwrap(); diff --git a/voxygen/src/render/renderer/shaders.rs b/voxygen/src/render/renderer/shaders.rs index 6bb1b31d54..15cd46a21c 100644 --- a/voxygen/src/render/renderer/shaders.rs +++ b/voxygen/src/render/renderer/shaders.rs @@ -41,6 +41,7 @@ impl assets::Compound for Shaders { "antialias.msaa-x4", "antialias.msaa-x8", "antialias.msaa-x16", + "antialias.hqx", "include.cloud.none", "include.cloud.regular", "figure-vert", From 85a1c06be65ea3cfbabdc0d298d765668de93e4c Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sat, 10 Sep 2022 13:16:47 +0100 Subject: [PATCH 222/854] Better depth-aware HQX --- assets/voxygen/shaders/antialias/hqx.glsl | 52 ++++++++++---------- assets/voxygen/shaders/postprocess-frag.glsl | 2 +- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/assets/voxygen/shaders/antialias/hqx.glsl b/assets/voxygen/shaders/antialias/hqx.glsl index 6e7d9e2139..0eb950877f 100644 --- a/assets/voxygen/shaders/antialias/hqx.glsl +++ b/assets/voxygen/shaders/antialias/hqx.glsl @@ -1,4 +1,4 @@ -const float THRESHOLD = 0.025; +const float THRESHOLD = 0.05; const float DEPTH_THRESHOLD = 0.05; bool diag( @@ -9,21 +9,22 @@ bool diag( vec2 uv, const vec2 p1, const vec2 p2, - const float aa_scale + const float aa_scale, + const uvec2 src_sz ) { - vec4 v1 = texelFetch(sampler2D(tex, smplr), ivec2(uv + vec2(p1.x, p1.y)), 0); - vec4 v2 = texelFetch(sampler2D(tex, smplr), ivec2(uv + vec2(p2.x, p2.y)), 0); + vec4 v1 = texelFetch(sampler2D(tex, smplr), ivec2(uv + p1 * 0.5), 0); + vec4 v2 = texelFetch(sampler2D(tex, smplr), ivec2(uv + p2 * 0.5), 0); float d1 = 1.0 / texelFetch(sampler2D(depth_tex, depth_smplr), ivec2(uv + vec2(p1.x, p1.y)), 0).x; float d2 = 1.0 / texelFetch(sampler2D(depth_tex, depth_smplr), ivec2(uv + vec2(p2.x, p2.y)), 0).x; - if (length((v1 - v2).rb) < THRESHOLD && abs(d1 - d2) < d1 * DEPTH_THRESHOLD + 3.0) { - vec2 dir = p2 - p1; - vec2 lp = uv - (floor(uv + p1) + 0.5); - dir = normalize(vec2(dir.y, -dir.x)); - float l = clamp((line_thickness - dot(lp, dir)) * aa_scale, 0.0, 1.0); - sum = mix(sum, (v1 + v2) * 0.5, l); - return true; + if (length((normalize(v1) - normalize(v2)).rgb) > THRESHOLD || abs(d1 - d2) > d1 * DEPTH_THRESHOLD + 3.0) { + return false; } - return false; + vec2 dir = p2 - p1; + vec2 lp = uv - (floor(uv + p1) + 0.5); + dir = normalize(vec2(dir.y, -dir.x)); + float l = clamp((line_thickness - dot(lp, dir)) * aa_scale, 0.0, 1.0); + sum = mix(sum, (v1 + v2) * 0.5, l); + return true; } vec4 aa_apply( @@ -38,25 +39,26 @@ vec4 aa_apply( vec2 ip = fragCoord / upscale; //start with nearest pixel as 'background' vec4 s = texelFetch(sampler2D(tex, smplr), ivec2(ip), 0); + //vec4 s = texture(sampler2D(tex, smplr), fragCoord / resolution); - float aa_scale = upscale.x * 1.5; + float aa_scale = upscale.x * 0.5; //draw anti aliased diagonal lines of surrounding pixels as 'foreground' - if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(-1, 0), vec2(0, 1), aa_scale)) { - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, 0), vec2(1, 1), aa_scale); - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, -1), vec2(0, 1), aa_scale); + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(-1, 0), vec2(0, 1), aa_scale, src_sz)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, 0), vec2(1, 1), aa_scale, src_sz); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, -1), vec2(0, 1), aa_scale, src_sz); } - if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(0, 1), vec2(1, 0), aa_scale)) { - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(0, 1), vec2(1, -1), aa_scale); - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, 1), vec2(1, 0), aa_scale); + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(0, 1), vec2(1, 0), aa_scale, src_sz)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(0, 1), vec2(1, -1), aa_scale, src_sz); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(-1, 1), vec2(1, 0), aa_scale, src_sz); } - if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(1, 0), vec2(0, -1), aa_scale)) { - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, 0), vec2(-1, -1), aa_scale); - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, 1), vec2(0, -1), aa_scale); + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(1, 0), vec2(0, -1), aa_scale, src_sz)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, 0), vec2(-1, -1), aa_scale, src_sz); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, 1), vec2(0, -1), aa_scale, src_sz); } - if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(0, -1), vec2(-1, 0), aa_scale)) { - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(0, -1), vec2(-1, 1), aa_scale); - diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, -1), vec2(-1, 0), aa_scale); + if (diag(tex, smplr, depth_tex, depth_smplr, 0.4, s, ip, vec2(0, -1), vec2(-1, 0), aa_scale, src_sz)) { + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(0, -1), vec2(-1, 1), aa_scale, src_sz); + diag(tex, smplr, depth_tex, depth_smplr, 0.3, s, ip, vec2(1, -1), vec2(-1, 0), aa_scale, src_sz); } return s; diff --git a/assets/voxygen/shaders/postprocess-frag.glsl b/assets/voxygen/shaders/postprocess-frag.glsl index 18b4086385..c7c7ddaf83 100644 --- a/assets/voxygen/shaders/postprocess-frag.glsl +++ b/assets/voxygen/shaders/postprocess-frag.glsl @@ -43,7 +43,7 @@ uniform u_locals { }; #ifdef BLOOM_FACTOR -layout(set = 1, binding = 3) +layout(set = 1, binding = 5) uniform texture2D t_src_bloom; #endif From b3b2f404e53001f5ed82b004db66a1a7a463d270 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sat, 10 Sep 2022 13:33:38 +0100 Subject: [PATCH 223/854] Fixed FXAA at non-1.0x scales --- assets/voxygen/shaders/antialias/fxaa.glsl | 8 +- assets/voxygen/shaders/postprocess-frag.glsl | 201 +------------------ voxygen/src/hud/settings_window/video.rs | 4 +- voxygen/src/render/mod.rs | 2 - 4 files changed, 4 insertions(+), 211 deletions(-) diff --git a/assets/voxygen/shaders/antialias/fxaa.glsl b/assets/voxygen/shaders/antialias/fxaa.glsl index 6d4c91f80c..0b1a85272b 100644 --- a/assets/voxygen/shaders/antialias/fxaa.glsl +++ b/assets/voxygen/shaders/antialias/fxaa.glsl @@ -1,5 +1,3 @@ -const float FXAA_SCALE = 1.25; - /** Basic FXAA implementation based on the code on geeks3d.com with the modification that the texture2DLod stuff was removed since it's @@ -129,11 +127,7 @@ vec4 aa_apply( mediump vec2 v_rgbSE; mediump vec2 v_rgbM; - #ifdef EXPERIMENTAL_BETTERAA - float fxaa_scale = textureSize(sampler2D(tex, smplr), 0).x / 1000.0; - #else - float fxaa_scale = FXAA_SCALE; - #endif + float fxaa_scale = textureSize(sampler2D(tex, smplr), 0).x * 1.25 / resolution.x; vec2 scaled_fc = fragCoord * fxaa_scale; vec2 scaled_res = resolution * fxaa_scale; diff --git a/assets/voxygen/shaders/postprocess-frag.glsl b/assets/voxygen/shaders/postprocess-frag.glsl index c7c7ddaf83..4276bde368 100644 --- a/assets/voxygen/shaders/postprocess-frag.glsl +++ b/assets/voxygen/shaders/postprocess-frag.glsl @@ -49,201 +49,6 @@ uniform texture2D t_src_bloom; layout(location = 0) out vec4 tgt_color; -#ifdef EXPERIMENTAL_BETTERAA - vec3 wpos_at(vec2 uv) { - float buf_depth = texture(sampler2D(t_src_depth, s_src_depth), uv).x - 0.0001; - vec4 clip_space = vec4((uv * 2.0 - 1.0) * vec2(1, -1), buf_depth, 1.0); - mat4 all_mat_inv = view_mat_inv * proj_mat_inv; - vec4 view_space = all_mat_inv * clip_space; - view_space /= view_space.w; - if (buf_depth == 0.0) { - vec3 direction = normalize(view_space.xyz); - return direction.xyz * 524288.0625 + cam_pos.xyz; - } else { - return view_space.xyz; - } - } - - float depth_at(vec2 uv) { - float buf_depth = texture(sampler2D(t_src_depth, s_src_depth), uv).x; - return 1.0 / buf_depth; - } - - float weighted_lerp(float x, float a, float b) { - return pow(x, b / a); - /* return x; */ - float xx = b * x - a * (1.0 - x); - return sign(xx) * (1.0 - 1.0 / (1.0 + abs(xx))) * 0.5 + 0.5; - } - - float vmax(vec3 v) { - return max(v.x, max(v.y, v.z)); - } - - float vmax_but_one(vec3 v) { - float m = max(v.x, max(v.y, v.z)); - if (v.x == m) - return max(v.y, v.z); - else if (v.y == m) - return max(v.x, v.z); - else - return max(v.x, v.y); - } - - vec4 better_aa_apply(texture2D tex, sampler smplr, vec2 fragCoord, vec2 resolution) { - uvec2 src_sz = textureSize(sampler2D(tex, smplr), 0).xy; - - vec3 wpos = wpos_at(fragCoord / resolution); - float dist = distance(cam_pos.xyz, wpos); - vec3 dir = normalize(wpos - cam_pos.xyz); - - // vec4 interp = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz), 0); - // vec4 interp = texture(sampler2D(tex, smplr), fragCoord / resolution); - // vec4 interp = textureBicubic(tex, smplr, fragCoord * src_sz / resolution); - vec4 interp = aa_apply(tex, smplr, t_src_depth, s_src_depth, fragCoord, resolution); - vec4 original = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz), 0); - - // GRID - /* if (mod(fragCoord.x, resolution.x / src_sz.x) < 0.9) { return vec4(0.0, 0.0, 0.0, 0.0); } */ - /* if (mod(fragCoord.y, resolution.y / src_sz.y) < 0.9) { return vec4(0.0, 0.0, 0.0, 0.0); } */ - - vec2 pos = fragCoord;// - 0.5 * src_sz; - - // vec4 t00 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(0, 0)), 0); - // vec4 t10 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(1, 0)), 0); - // vec4 t01 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(0, 1)), 0); - // vec4 t11 = texelFetch(sampler2D(tex, smplr), ivec2(pos / resolution * src_sz + ivec2(1, 1)), 0); - vec3 w00 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(0, 0)) / vec2(src_sz)); - vec3 w10 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(1, 0)) / vec2(src_sz)); - vec3 w01 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(0, 1)) / vec2(src_sz)); - vec3 w11 = wpos_at(floor(pos / resolution * vec2(src_sz) + ivec2(1, 1)) / vec2(src_sz)); - float d00 = distance(w00, cam_pos.xyz); - float d10 = distance(w10, cam_pos.xyz); - float d01 = distance(w01, cam_pos.xyz); - float d11 = distance(w11, cam_pos.xyz); - - vec2 px_fact = fract(pos / (resolution / vec2(src_sz))); - // vec4 t0 = mix(t00, t10, weighted_lerp(px_fact.x, d00, d10)); - // vec4 t1 = mix(t01, t11, weighted_lerp(px_fact.x, d01, d11)); - vec3 w0 = (w00 * d00 * (1 - px_fact.x) + w10 * d10 * px_fact.x) / (d00 * (1 - px_fact.x) + d10 * px_fact.x); - vec3 w1 = (w01 * d01 * (1 - px_fact.x) + w11 * d11 * px_fact.x) / (d01 * (1 - px_fact.x) + d11 * px_fact.x); - float d0 = mix(d00, d10, px_fact.x); - float d1 = mix(d01, d11, px_fact.x); - - float d_lerped = mix(d0, d1, px_fact.y); - vec3 wpos_lerped = (w0 * d0 * (1 - px_fact.y) + w1 * d1 * px_fact.y) / (d0 * (1 - px_fact.y) + d1 * px_fact.y) + vec3( - dir.y > 0.0 ? 0.0 : 0.5, - dir.x > 0.0 ? 0.5 : 0.0, - 0.5 - );//mix(w0, w1, weighted_lerp(px_fact.y, 0.1 / d0, 0.1 / d1)) + 0.5; - - // vec4 interp = mix(t0, t1, weighted_lerp(px_fact.y, d0, d1)); - - /* - vec4 closest = vec4(0.0); - float closest_dist = 100000.0; - for (int i = -1; i < 2; i ++) { - for (int j = -1; j < 2; j ++) { - ivec2 rpos = ivec2(i, j); - - //float l = length(normalize(vec2(rpos)) - factor); - - vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz) + rpos, 0); - - float fov = 70.0; - float texel_at_dist = dist / resolution.x * fov; - vec3 diff = mod(wpos * texel_at_dist, vec3(1.0)) - 0.5; - - float dist = distance(interp.rgb, texel.rgb);// * 0.0 + (rpos.y - diff.z) * 1.0;// * (1.0 + l * 0.5); - if (dist < closest_dist) { - closest = texel; - closest_dist = dist; - } - } - } - - return closest;//interp; - */ - /* - ivec2 closest = ivec2(0); - vec3 closest_wpos = vec3(0); - float closest_dist = 100000.0; - for (int i = -1; i < 2; i ++) { - for (int j = -1; j < 2; j ++) { - ivec2 rpos = ivec2(i, j); - vec3 wpos = wpos_at(((fragCoord / resolution * vec2(src_sz)) + rpos) / vec2(src_sz)); - float dist = distance(cam_pos.xyz, wpos); - if (dist < closest_dist) { - closest = rpos; - closest_wpos = wpos; - closest_dist = dist; - } - } - } - - float fov = 70.0; - vec2 texel_at_dist = src_sz / (fov * closest_dist); - vec3 diff = fract(closest_wpos) * 2.0 - 1.0; - - vec2 rpos = vec2(diff.y * dir.x, -diff.z * -abs(dir.x)) - //+ vec2(diff.x * -dir.y, diff.z * abs(dir.y)) - //+ vec2(diff.z * -dir.z * 0, diff.x * abs(dir.z)) - ; - - vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz + closest + rpos), 0); - - return texel; - */ - - float original_dist = dist; - vec4 closest_texel = vec4(0); - vec3 closest_wpos = vec3(0); - float closest_dist = 100000.0; - vec4 weighted_sum = vec4(0.0); - float weighted_total = 0.0; - for (int i = -1; i < 2; i ++) { - for (int j = -1; j < 2; j ++) { - ivec2 rpos = ivec2(i, j); - vec3 wpos = wpos_at(floor(fragCoord / resolution * vec2(src_sz) + rpos - 1) / vec2(src_sz)); - float tdist = distance(cam_pos.xyz, wpos); - - //float fov = 1.2; - //float texel_at_dist = src_sz.x / (fov * tdist); - - vec4 texel = texelFetch(sampler2D(tex, smplr), ivec2(fragCoord / resolution * src_sz) + rpos, 0); - //texel = texture(sampler2D(tex, smplr), floor(fragCoord / resolution * vec2(src_sz) + rpos) / vec2(src_sz)); - - float texel_dist; - if (true && false) { - texel_dist = distance(wpos + fract(wpos_lerped * 2.0) / 2.0, wpos_lerped); - } else if (original_dist < 15.0 || true) { - texel_dist = distance(interp.rgb, texel.rgb); - } else { - texel_dist = length(mod(wpos, vec3(1.0)) - 0.5); - } - - if (texel_dist < closest_dist) { - closest_texel = texel; - closest_wpos = wpos; - closest_dist = texel_dist; - } - - //float weight = 1.0 / distance(interp.rgb, texel.rgb); - float weight = 1.0 / distance(wpos, wpos_lerped); - - weighted_sum += texel * weight; - weighted_total += weight; - } - } - - //return vec4(px_fact.xy, 1.0, 1.0); - //return mod(10.0 * d_lerped, 1.0).xxxx; - //return mod(wpos_lerped, 1.0).xyzx; - //return weighted_sum / weighted_total; - return closest_texel; - } -#endif - vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); @@ -410,11 +215,7 @@ void main() { } #endif - #ifdef EXPERIMENTAL_BETTERAA - vec4 aa_color = better_aa_apply(t_src_color, s_src_color, sample_uv * screen_res.xy, screen_res.xy); - #else - vec4 aa_color = aa_apply(t_src_color, s_src_color, t_src_depth, s_src_depth, sample_uv * screen_res.xy, screen_res.xy); - #endif + vec4 aa_color = aa_apply(t_src_color, s_src_color, t_src_depth, s_src_depth, sample_uv * screen_res.xy, screen_res.xy); #ifdef EXPERIMENTAL_SOBEL diff --git a/voxygen/src/hud/settings_window/video.rs b/voxygen/src/hud/settings_window/video.rs index ef19eeee89..81b7ba116d 100644 --- a/voxygen/src/hud/settings_window/video.rs +++ b/voxygen/src/hud/settings_window/video.rs @@ -943,7 +943,7 @@ impl<'a> Widget for Video<'a> { let upscale_factors = [ // Upscaling - 0.01, 0.025, 0.1, 0.15, 0.2, 0.25, 0.35, 0.5, 0.65, 0.75, 0.85, 1.0, + 0.1, 0.15, 0.2, 0.25, 0.35, 0.5, 0.65, 0.75, 0.85, 1.0, // Downscaling (equivalent to SSAA) 1.25, 1.5, 1.75, 2.0, ]; @@ -956,7 +956,7 @@ impl<'a> Widget for Video<'a> { if let Some(clicked) = DropDownList::new( &upscale_factors .iter() - .map(|factor| format!("{n:.*}", 2, n = factor)) + .map(|factor| format!("{n:.*}", 3, n = factor)) .collect::>(), selected, ) diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index 8fc065a5df..1d8700c388 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -499,6 +499,4 @@ pub enum ExperimentalShader { NoRainbows, /// Make objects appear wet when appropriate. Wetness, - /// An attempt at better anti-aliasing (requires FXAA). - BetterAA, } From 33b807c2372aad7c3e3a184e73054ba3b7c2dbfe Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sat, 10 Sep 2022 13:36:43 +0100 Subject: [PATCH 224/854] Updated changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc5dc7c8b9..3d7807a2fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,13 +14,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a setting to influence the gap between music track plays. - Added a Craft All button. - Server: Vacuum database on startup -- SeaChapel, greek/latin inspired dungeon for ocean biome coasts +- SeaChapel, greek/latin inspired dungeon for ocean biome coasts - Entity view distance setting added (shown in graphics and network tabs). This setting controls the distance at which entities are synced to the client and which entities are displayed in. This is clamped to be no more than the current overall view distance setting. - View distance settings that are lowered by the server limit (or other factors) now display an extra ghost slider cursor when set above the limit (instead of snapping back to the limit). Limits on the view distance by the server no longer affect the settings saved on the client. +- HQX upscaling shader for people playing on low internal resolutions ### Changed - Use fluent for translations @@ -49,6 +50,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 first joining a server and when changing the view distance (previously this required moving to a new chunk for the initial setting or subsequent change to apply). - Moderators and admins are no longer blocked from logging in when there are too many players. +- FXAA now behaves correctly at non-1.0x internal resolutions ## [0.13.0] - 2022-07-23 From e43608ce80d7bf49d447211c33904b3922562da5 Mon Sep 17 00:00:00 2001 From: flo Date: Sat, 10 Sep 2022 17:23:38 +0000 Subject: [PATCH 225/854] add guitar & instrument sample edits --- .../common/abilities/ability_set_manifest.ron | 5 + assets/common/abilities/music/bass.ron | 4 +- assets/common/abilities/music/flute.ron | 4 +- assets/common/abilities/music/guitar.ron | 4 + assets/common/abilities/music/harp.ron | 4 +- assets/common/abilities/music/kalimba.ron | 4 +- assets/common/abilities/music/lute.ron | 4 +- assets/common/abilities/music/melodica.ron | 4 +- assets/common/abilities/music/perc.ron | 4 +- assets/common/abilities/music/sitar.ron | 4 +- assets/common/items/tool/instruments/bass.ron | 2 +- .../common/items/tool/instruments/flute.ron | 2 +- .../common/items/tool/instruments/guitar.ron | 21 ++ assets/common/items/tool/instruments/harp.ron | 2 +- .../common/items/tool/instruments/kalimba.ron | 2 +- assets/common/items/tool/instruments/lute.ron | 2 +- .../items/tool/instruments/melodica.ron | 2 +- assets/common/items/tool/instruments/perc.ron | 2 +- .../common/items/tool/instruments/sitar.ron | 2 +- assets/server/manifests/kits.ron | 11 + assets/voxygen/audio/sfx.ron | 31 +- .../audio/sfx/instrument/bass/bass_a.ogg | 4 +- .../audio/sfx/instrument/bass/bass_c.ogg | 4 +- .../audio/sfx/instrument/bass/bass_c1.ogg | 4 +- .../audio/sfx/instrument/bass/bass_d.ogg | 4 +- .../audio/sfx/instrument/bass/bass_e.ogg | 4 +- .../audio/sfx/instrument/bass/bass_g.ogg | 4 +- .../audio/sfx/instrument/flute/flute_a.ogg | 4 +- .../audio/sfx/instrument/flute/flute_c.ogg | 4 +- .../audio/sfx/instrument/flute/flute_c1.ogg | 4 +- .../audio/sfx/instrument/flute/flute_d.ogg | 4 +- .../audio/sfx/instrument/flute/flute_e.ogg | 4 +- .../audio/sfx/instrument/flute/flute_g.ogg | 4 +- .../audio/sfx/instrument/guitar/guitar_a.ogg | 3 + .../sfx/instrument/guitar/guitar_ac1a.ogg | 3 + .../audio/sfx/instrument/guitar/guitar_c.ogg | 3 + .../audio/sfx/instrument/guitar/guitar_c1.ogg | 3 + .../sfx/instrument/guitar/guitar_c1d1c1.ogg | 3 + .../sfx/instrument/guitar/guitar_cdc.ogg | 3 + .../audio/sfx/instrument/guitar/guitar_d.ogg | 3 + .../sfx/instrument/guitar/guitar_ded.ogg | 3 + .../audio/sfx/instrument/guitar/guitar_e.ogg | 3 + .../sfx/instrument/guitar/guitar_ege.ogg | 3 + .../audio/sfx/instrument/guitar/guitar_g.ogg | 3 + .../sfx/instrument/guitar/guitar_gag.ogg | 3 + .../audio/sfx/instrument/harp/harp_a.ogg | 4 +- .../audio/sfx/instrument/harp/harp_c.ogg | 4 +- .../audio/sfx/instrument/harp/harp_c1.ogg | 4 +- .../audio/sfx/instrument/harp/harp_d.ogg | 4 +- .../audio/sfx/instrument/harp/harp_e.ogg | 4 +- .../audio/sfx/instrument/harp/harp_g.ogg | 4 +- .../audio/sfx/instrument/lute/lute_a.ogg | 4 +- .../audio/sfx/instrument/lute/lute_c.ogg | 4 +- .../audio/sfx/instrument/lute/lute_c1.ogg | 4 +- .../audio/sfx/instrument/lute/lute_d.ogg | 4 +- .../audio/sfx/instrument/lute/lute_e.ogg | 4 +- .../audio/sfx/instrument/lute/lute_g.ogg | 4 +- .../audio/sfx/instrument/perc/perc_a.ogg | 4 +- .../audio/sfx/instrument/perc/perc_c.ogg | 4 +- .../audio/sfx/instrument/perc/perc_d.ogg | 4 +- .../audio/sfx/instrument/perc/perc_e.ogg | 4 +- .../audio/sfx/instrument/perc/perc_g.ogg | 4 +- .../audio/sfx/instrument/sitar/sitar_a.ogg | 4 +- .../audio/sfx/instrument/sitar/sitar_c.ogg | 4 +- .../audio/sfx/instrument/sitar/sitar_c1.ogg | 4 +- .../audio/sfx/instrument/sitar/sitar_d.ogg | 4 +- .../audio/sfx/instrument/sitar/sitar_e.ogg | 4 +- .../audio/sfx/instrument/sitar/sitar_g.ogg | 4 +- assets/voxygen/item_image_manifest.ron | 4 + .../voxygen/voxel/biped_weapon_manifest.ron | 4 + assets/voxygen/voxel/item_drop_manifest.ron | 1 + assets/voxygen/voxel/weapon/tool/guitar.vox | 3 + common/src/comp/ability.rs | 12 +- common/src/states/music.rs | 38 +- voxygen/anim/src/character/alpha.rs | 252 +------------ voxygen/anim/src/character/mod.rs | 3 +- voxygen/anim/src/character/music.rs | 335 ++++++++++++++++++ voxygen/anim/src/character/wield.rs | 51 ++- voxygen/src/hud/util.rs | 1 + voxygen/src/scene/figure/mod.rs | 26 +- 80 files changed, 590 insertions(+), 436 deletions(-) create mode 100644 assets/common/abilities/music/guitar.ron create mode 100644 assets/common/items/tool/instruments/guitar.ron create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_ac1a.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_c.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_c1d1c1.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_cdc.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_d.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_ded.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_e.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_ege.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_g.ogg create mode 100644 assets/voxygen/audio/sfx/instrument/guitar/guitar_gag.ogg create mode 100644 assets/voxygen/voxel/weapon/tool/guitar.vox create mode 100644 voxygen/anim/src/character/music.rs diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index badbc909e2..6a9fe77d46 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -457,6 +457,11 @@ secondary: "common.abilities.music.lute", abilities: [], ), + Custom("Guitar"): ( + primary: "common.abilities.music.guitar", + secondary: "common.abilities.music.guitar", + abilities: [], + ), Custom("Sitar"): ( primary: "common.abilities.music.sitar", secondary: "common.abilities.music.sitar", diff --git a/assets/common/abilities/music/bass.ron b/assets/common/abilities/music/bass.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/bass.ron +++ b/assets/common/abilities/music/bass.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/flute.ron b/assets/common/abilities/music/flute.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/flute.ron +++ b/assets/common/abilities/music/flute.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/guitar.ron b/assets/common/abilities/music/guitar.ron new file mode 100644 index 0000000000..18f0a9b200 --- /dev/null +++ b/assets/common/abilities/music/guitar.ron @@ -0,0 +1,4 @@ +Music( + play_duration: 0.4, + ori_modifier: 1.0, +) \ No newline at end of file diff --git a/assets/common/abilities/music/harp.ron b/assets/common/abilities/music/harp.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/harp.ron +++ b/assets/common/abilities/music/harp.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/kalimba.ron b/assets/common/abilities/music/kalimba.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/kalimba.ron +++ b/assets/common/abilities/music/kalimba.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/lute.ron b/assets/common/abilities/music/lute.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/lute.ron +++ b/assets/common/abilities/music/lute.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/melodica.ron b/assets/common/abilities/music/melodica.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/melodica.ron +++ b/assets/common/abilities/music/melodica.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/perc.ron b/assets/common/abilities/music/perc.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/perc.ron +++ b/assets/common/abilities/music/perc.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/abilities/music/sitar.ron b/assets/common/abilities/music/sitar.ron index 5e9fe39169..18f0a9b200 100644 --- a/assets/common/abilities/music/sitar.ron +++ b/assets/common/abilities/music/sitar.ron @@ -1,6 +1,4 @@ Music( - buildup_duration: 0.1, - play_duration: 0.1, - recover_duration: 0.1, + play_duration: 0.4, ori_modifier: 1.0, ) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/bass.ron b/assets/common/items/tool/instruments/bass.ron index 18559a8bd7..c6a1795ddf 100644 --- a/assets/common/items/tool/instruments/bass.ron +++ b/assets/common/items/tool/instruments/bass.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Bass")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/flute.ron b/assets/common/items/tool/instruments/flute.ron index 477986ede5..1680d8818c 100644 --- a/assets/common/items/tool/instruments/flute.ron +++ b/assets/common/items/tool/instruments/flute.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Flute")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/guitar.ron b/assets/common/items/tool/instruments/guitar.ron new file mode 100644 index 0000000000..3125ed191c --- /dev/null +++ b/assets/common/items/tool/instruments/guitar.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Guitar", + description: "Common Guitar.", + kind: Tool(( + kind: Instrument, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 0.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0, + range: 0.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Common, + tags: [], + ability_spec: Some(Custom("Guitar")), +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/harp.ron b/assets/common/items/tool/instruments/harp.ron index 89e51ea5f6..3edf1f79ab 100644 --- a/assets/common/items/tool/instruments/harp.ron +++ b/assets/common/items/tool/instruments/harp.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Harp")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/kalimba.ron b/assets/common/items/tool/instruments/kalimba.ron index 505a74a904..2a03e4dc03 100644 --- a/assets/common/items/tool/instruments/kalimba.ron +++ b/assets/common/items/tool/instruments/kalimba.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Kalimba")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/lute.ron b/assets/common/items/tool/instruments/lute.ron index 24b0937794..5d893a8a45 100644 --- a/assets/common/items/tool/instruments/lute.ron +++ b/assets/common/items/tool/instruments/lute.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Lute")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/melodica.ron b/assets/common/items/tool/instruments/melodica.ron index f41e2ae350..4e6e51cd8b 100644 --- a/assets/common/items/tool/instruments/melodica.ron +++ b/assets/common/items/tool/instruments/melodica.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Melodica")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/perc.ron b/assets/common/items/tool/instruments/perc.ron index 79b3048cf9..616b8f826a 100644 --- a/assets/common/items/tool/instruments/perc.ron +++ b/assets/common/items/tool/instruments/perc.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Perc")), -) +) \ No newline at end of file diff --git a/assets/common/items/tool/instruments/sitar.ron b/assets/common/items/tool/instruments/sitar.ron index 339cbfdf2f..d7f2b2275f 100644 --- a/assets/common/items/tool/instruments/sitar.ron +++ b/assets/common/items/tool/instruments/sitar.ron @@ -18,4 +18,4 @@ ItemDef( quality: Common, tags: [], ability_spec: Some(Custom("Sitar")), -) +) \ No newline at end of file diff --git a/assets/server/manifests/kits.ron b/assets/server/manifests/kits.ron index e6b2bd4bcf..044ad83a5b 100644 --- a/assets/server/manifests/kits.ron +++ b/assets/server/manifests/kits.ron @@ -378,4 +378,15 @@ (Item("common.items.armor.merchant.pants"),1), (Item("common.items.armor.merchant.shoulder"),1), ], + "instruments": [ + (Item("common.items.tool.instruments.bass"),1), + (Item("common.items.tool.instruments.flute"),1), + (Item("common.items.tool.instruments.guitar"),1), + (Item("common.items.tool.instruments.harp"),1), + (Item("common.items.tool.instruments.kalimba"),1), + (Item("common.items.tool.instruments.lute"),1), + (Item("common.items.tool.instruments.melodica"),1), + (Item("common.items.tool.instruments.sitar"),1), + (Item("common.items.tool.instruments.perc"),1), + ], }) diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index 9ed264423b..f1ddf0b06c 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -450,12 +450,6 @@ ], threshold: 0.2, ), - Attack(BasicAura, Instrument): ( - files: [ - "voxygen.audio.sfx.abilities.barrel_organ", - ], - threshold: 34.75, - ), //Attack(BasicRanged, Staff): ( // files: [ // "voxygen.audio.sfx.abilities.staff_channeling", @@ -527,6 +521,14 @@ // // Instruments + // NPC Organ + Attack(BasicAura, Instrument): ( + files: [ + "voxygen.audio.sfx.abilities.barrel_organ", + ], + threshold: 34.75, + ), + // Player Instruments Wield(Instrument): ( files: [ "voxygen.audio.sfx.weapon.weapon_out", @@ -616,6 +618,23 @@ ], threshold: 0.5, ), + Music(Instrument, Custom("Guitar")): ( + files: [ + "voxygen.audio.sfx.instrument.guitar.guitar_c", + "voxygen.audio.sfx.instrument.guitar.guitar_g", + "voxygen.audio.sfx.instrument.guitar.guitar_d", + "voxygen.audio.sfx.instrument.guitar.guitar_a", + "voxygen.audio.sfx.instrument.guitar.guitar_e", + "voxygen.audio.sfx.instrument.guitar.guitar_c1", + "voxygen.audio.sfx.instrument.guitar.guitar_ac1a", + "voxygen.audio.sfx.instrument.guitar.guitar_c1d1c1", + "voxygen.audio.sfx.instrument.guitar.guitar_cdc", + "voxygen.audio.sfx.instrument.guitar.guitar_ded", + "voxygen.audio.sfx.instrument.guitar.guitar_ege", + "voxygen.audio.sfx.instrument.guitar.guitar_gag", + ], + threshold: 0.5, + ), Music(Instrument, Custom("Perc")): ( files: [ "voxygen.audio.sfx.instrument.perc.perc_c", diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg index 1a00276cfc..01e1d18698 100644 --- a/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_a.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8870ca6d50eaa0dbd9f293c632c2a91fddbdac8c895a9baba8708789ef51d165 -size 22155 +oid sha256:3f5f587a29ca56f893b6e463eb8871e9b06d908377ac865303e0414bb416cb80 +size 34324 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg index 036bd41150..39f3a0241f 100644 --- a/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_c.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:154c78cd118081c54ef4175fae8f2b60314cfdab4c4ad486f1bcfe477a1dd1e6 -size 20740 +oid sha256:a62f1bf7ed946ecc30c1357b97aa068fff17813bdd026fdd4c6a3e71745eb566 +size 32342 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg index 47c6ac79f4..484bede212 100644 --- a/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_c1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e1c968dfd2dd3d99adef5dde4f0e39d5e0b3e0a92418cb927d0a46f38294c38 -size 22350 +oid sha256:14646a1cf2e3b34741a4143ddb4a1e6025a6811221f350ba0c4ff7c6f4d16ee7 +size 30422 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg index fc8a3295c9..26691a3948 100644 --- a/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_d.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3de935a5d70e17b4b34726f84330e5e7f261cfefde7468a3b7c3dd12eaa98326 -size 21204 +oid sha256:9107b4378869f02ca73957524b57586a76dbeb261f0983c508d9851b66dd4bce +size 31178 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg index ee93daf2a1..2c7f9f42f6 100644 --- a/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_e.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5de09a3c16eacb17afe94f8fb2e1ec3ed8d4af3926ab6390b0433fb9d25b2846 -size 21330 +oid sha256:ccf3913f215aec7109eeef4e512b4e293b39581910500fec2f373a94805b05d0 +size 33041 diff --git a/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg b/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg index 16ae2d6b5a..921e2cd444 100644 --- a/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg +++ b/assets/voxygen/audio/sfx/instrument/bass/bass_g.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d785aa14128a33809946cfc4284be0fd1902994ecfc7cf72291e1cce8acd9a39 -size 23063 +oid sha256:8f1150cdf4501b2e7a53c7e48fa2f2b26eb601c730c31493b152e8056e76160e +size 34066 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg index b0fc7465ff..faa9a2ad4a 100644 --- a/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_a.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fcc226bddfaaf005d864d432e6f65a2be4c64da79dd0d145c43ff531339a45d5 -size 15767 +oid sha256:c1949c9d8719b33da4d1a130bba996006a2c8357d8ae5e2388f9c6d546b5b4d3 +size 23020 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg index 4b1ec1b287..15e6a715cf 100644 --- a/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_c.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9d521f5858aba942fa8f1c9b1183cadf3735b216301cb67af923042da3bfce15 -size 15604 +oid sha256:e94786ac022263e7daae5d915909ff5d52f0fb7609e6c79cb68c8f68abe4923a +size 23189 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg index d03c26d16f..da71bec3dc 100644 --- a/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_c1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c9c429542f503ec3625834b15e8cac36c5de296fe5b65c2f669c755a189cb5fe -size 14930 +oid sha256:5bd4e913c54ef193c0f294772a2ca2e6e50b32d25b122a3a1dd8f20832298d6a +size 22638 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg index 6564406c14..3bce41c696 100644 --- a/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_d.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f4c04d676c06fab391e4b9a034f6ca1bc79b13ae3189cccca3966f90a5cf521 -size 15778 +oid sha256:9353b6b58a72df958e626cbed8fef40d96a131b7591c425e7bfafc5df44f7a77 +size 23435 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg index 603abd5292..8aa7c7dcc9 100644 --- a/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_e.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5988ddb124a0f2b25fdb9674e00e4cce1a88cedc366043d42a8c392f022bddd6 -size 15772 +oid sha256:3c3c68310cb71a17770580203e1bd8a11082b4cfd648bc6e94b9c3ec319e704f +size 23618 diff --git a/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg b/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg index 9b95118cb5..6dc189969f 100644 --- a/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg +++ b/assets/voxygen/audio/sfx/instrument/flute/flute_g.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:52f323b028e0a3ae5300845a868d5ce56a9148c33d966ddc5b8b3e324ee235c7 -size 15638 +oid sha256:ba80e628203fe12fc347b4f455a18021a03165b84b3cf44aa6ac07fd0e2dd039 +size 25314 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_a.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_a.ogg new file mode 100644 index 0000000000..e3e0c63331 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a928b8463ca4b3ef18cf4b24c89230010d493973608308bf5c0ee3f95f12bd1c +size 15632 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_ac1a.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_ac1a.ogg new file mode 100644 index 0000000000..93fafff2a3 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_ac1a.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6be0ecf90f2a282d4b66e4bcdf1a9b0db3fabdbf1049819d043cd5c29cf9b9c +size 15082 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_c.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_c.ogg new file mode 100644 index 0000000000..5f5b2e4d55 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_c.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69cdeab4c1ec847996d74d08eb63bf440a2b126a611a8414cc332bf840186707 +size 14150 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_c1.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_c1.ogg new file mode 100644 index 0000000000..8b53d24280 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:217a5cc31f0007d023545f9789e4d1872c4a48c6ebc9ec7764eead70a938b151 +size 13455 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_c1d1c1.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_c1d1c1.ogg new file mode 100644 index 0000000000..ec556e0b5f --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_c1d1c1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b00ac463f1f95dfabf894ddc2d3ada30c03490a1629de5b252659dac89baba89 +size 16534 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_cdc.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_cdc.ogg new file mode 100644 index 0000000000..e0f067303b --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_cdc.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6015be034f02365b1f54d8edc6d609c017c2947eb6f5701b35d04f9ab128185 +size 14785 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_d.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_d.ogg new file mode 100644 index 0000000000..5a3c414492 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_d.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cc5d713858ecf974487788ec47b0624d54bdf0f0c3595d12520990036afd675 +size 12848 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_ded.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_ded.ogg new file mode 100644 index 0000000000..99f92b42cb --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_ded.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7709f19c1f6f39b90fbabc086e071caf01df5ebb046cc5c94d0dc2e9b8f24a20 +size 15178 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_e.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_e.ogg new file mode 100644 index 0000000000..5fda75157c --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_e.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb3c48d46945cf53d2aab102ec52f6311aadb8c38eed3ada281a0166b763250b +size 11938 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_ege.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_ege.ogg new file mode 100644 index 0000000000..aa39d62a89 --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_ege.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ada35a9146e1c2383980dfa567dec1c94aec9b4ee66b0b1784f5d679da2c6321 +size 15601 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_g.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_g.ogg new file mode 100644 index 0000000000..52c8e8923f --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_g.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8460a7100aecf19a94f7d8a898b48506de96d375ba00e2666e5897b9ad57660 +size 14863 diff --git a/assets/voxygen/audio/sfx/instrument/guitar/guitar_gag.ogg b/assets/voxygen/audio/sfx/instrument/guitar/guitar_gag.ogg new file mode 100644 index 0000000000..00683ad47d --- /dev/null +++ b/assets/voxygen/audio/sfx/instrument/guitar/guitar_gag.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13dcf39e2ef6cc91c1073352ac5e893147b2047536d78a4b17b0e2cdbdf9fdf0 +size 14728 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg index 5aa23a2c02..9ccbc6c7cd 100644 --- a/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_a.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a379f51a0d3ff17cf1adb56cbc5df6c98c28d08003205670b2244771f9f96807 -size 14873 +oid sha256:324a46769e35c07c1d281f0a49f2c39fa308d300c7874dec490c4fa969fb64b4 +size 21153 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg index ab532f50b0..70e0b8c1a5 100644 --- a/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_c.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ded2fbf20f677a6a61a09be04fd8d72f7b20471113049465f6f62a3e7f8a919a -size 15923 +oid sha256:e94ddf6dd8b82bf9ed19b4b30fe4225c1e867e67ce805317a8bb1d3eee7365a5 +size 22430 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg index 013ce66c11..912df76032 100644 --- a/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_c1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bab3b95b3ec9d687cadeedba6ed066922db8ea9208a6fdd1a8518d64fab63d4a -size 15258 +oid sha256:4df08b7e7025a900de02b360a1df08754ca39acb387e659a230016013f01f456 +size 22713 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg index 2249f666f4..20689288f2 100644 --- a/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_d.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:190438f20e4142c10ec1130f3012231ff651f492371db79e6537f6c2b8a4a8ed -size 15151 +oid sha256:03041274c40f863e8230c31e5574a569226f974a03415ab8941e8287841aebc8 +size 22374 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg index 9d86ca2526..2a92c7bf01 100644 --- a/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_e.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cbffd5497511fabfe427313aefbcd32c9630d75a33e42449877a460c4edeea57 -size 14997 +oid sha256:f4160aa0fba06f798f7c6d52652654130bf7fc59ed7e71ede93b61613a4e8405 +size 21822 diff --git a/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg b/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg index 091cf1a349..542c84788f 100644 --- a/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg +++ b/assets/voxygen/audio/sfx/instrument/harp/harp_g.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c71b93a9a53c905bf2ff872b80b85adb3e41fa57c04c0ce89fc0b620104ee8a -size 15462 +oid sha256:e9c22babefaa240ce0ca75870443d3c250a070623044afc5272d47e2a32aefd0 +size 23561 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg index 97f1b33df2..db8471d394 100644 --- a/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_a.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d7fce0159af0ecc19b2230f55a0e789579f099ba1d84afcf682fe32beca22bf -size 13154 +oid sha256:1c4cc98d81299a401f6186d10a9abb857553a432c98a81bc5207e3263bfe448e +size 20459 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg index 29cb2d8cf0..69bd081797 100644 --- a/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_c.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61f47508d08c5ed7a212b6ad788086b7b915d3c4caeb2456c721f90c28b6b5ab -size 11972 +oid sha256:62125906402664b50b58cca4c82f59a9f08cefd320b9a84d14dc21db848c731f +size 18810 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg index 139cfd9b63..02ab59c45e 100644 --- a/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_c1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a0049e761981358aaa577c0813805965dbf149bb2b583d33f2025584260f9a07 -size 12083 +oid sha256:7755387e7d1dfad811dd3b2f26d7f6ae15ddcc66f45faca821be53c0ba2082f4 +size 18826 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg index fbfd80bc7c..192e003b15 100644 --- a/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_d.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:767167900990ea13f1b5ef2bc4dadfc2b6f5ef6a0f06df620107b243b0ea8fb7 -size 11834 +oid sha256:9a6defcaa3e36c4ae561037a43eaa9c8aa1f1496b02941a26bc962226b3be7f7 +size 20334 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg index e5c321dc1c..6f0659edf0 100644 --- a/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_e.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6ff7cbe618164eaadc598a748537a5afb566480806e7db643c24f291a1a475e -size 12218 +oid sha256:b5eb4961006370bd4a10514b0d9982c84c54be33a2c9c97d93863a6e966928e5 +size 21765 diff --git a/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg b/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg index 37bcf75dc1..d522ebb4f8 100644 --- a/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg +++ b/assets/voxygen/audio/sfx/instrument/lute/lute_g.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85244f3670fe3fdb41adcb11777876c1ab0459b9f657898a3a6ce26bfbf21a96 -size 12220 +oid sha256:74627df5a7f8a4b010b32c20fb53e08f9f5eba562ec5a4a667072fa310ba9c53 +size 19462 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg index 3af6ae2732..23ad2b1ee6 100644 --- a/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_a.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28fc6cf3b5f17bb02471f0cabcdeabfec196c6460b0cbfd07f961dac1cd15b78 -size 8752 +oid sha256:ccb90191e972665003ee6a32530a2bafc3927bc4e2f6a6d38c1afb8d995140a1 +size 10861 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg index 5fe3e724c0..1c878f851b 100644 --- a/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_c.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273dfb2aed45c35734049b50eb2eb64d200cd7c8a061315d0c4a3b57d40a80be -size 11784 +oid sha256:4e3d4bfe540fffee02da4f199e007f610042b09e38d2223dd4bb4a7ae43cc73e +size 16056 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg index fb1ffb1729..b45634f600 100644 --- a/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_d.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c731c559a4de60715f217348cb2c1d1d5ff081cda330f4baac66b12922689c54 -size 7791 +oid sha256:7dd4ec9950d40035ccaf88c9c3ba8ccf9f4ae57130470da48c675234c21950ae +size 10648 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg index 7f8bd7014a..98b1a02ed7 100644 --- a/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_e.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5d30bedafb8c82d3f239b44be09d63a6be0f060edc4a04d67c94aee56b699bd -size 8017 +oid sha256:58524f6f62687def8af01a63db031031372af09f3249bbf7efce6a79dfd909eb +size 11005 diff --git a/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg b/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg index 58e1504406..96c31569e4 100644 --- a/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg +++ b/assets/voxygen/audio/sfx/instrument/perc/perc_g.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a819881111ac16d059d876290612ad682ae944db79b62673bd93203affa5d50 -size 8147 +oid sha256:423b378adf37d52a6ba1e36415986510ebc414a228f2f6957b11f7531871efac +size 12928 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg index d8eeaf3d63..b3d276dee0 100644 --- a/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_a.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:962eaeed674f3cbb0845a8cc453893bef7521adcfa978670a261e6bf568d093e -size 41171 +oid sha256:171be727a1c1404822b52105d84d18bb418231258d17515ca398178d72423511 +size 13798 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg index 19cf91cae9..af62201200 100644 --- a/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da6b89fbbfd0288b174708524b7a685e9a7661240fc6b8a85c76ec7675b8a2af -size 41460 +oid sha256:3d66e048c173297747b0e6073ab17ee7ffcaba851fd80ee5ba38f405bf714fd8 +size 14695 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg index 2f87646353..4bb4b8b3ba 100644 --- a/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_c1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8bd8508c386275eccf5302d16d13526b9e7f0f6fab346ae2650e1db5ec91ca6 -size 41230 +oid sha256:13b0c5ddcdd4b884af155f4486d459e3b016fd7ade6694dc96cad978b43a78c4 +size 14047 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg index 2a1303a86e..798cc98a14 100644 --- a/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_d.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a9c17c27eec1f8f2ba2fd4a680936c6ea65a4202354621119212b804152fab5e -size 41189 +oid sha256:3fcd13c9ed3431eb12b7a4ec02a8d8daa487d5aa1b175b9a3eac5ba68cd4d043 +size 14887 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg index 0b6e357214..cb40009be4 100644 --- a/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_e.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f83fa537ef2dcc8bd573c9b1937c8136ea691fc900bbed44a2b6dd78613d73a -size 41112 +oid sha256:c41b167bf383681b945b1826866a6f64056da697a76c1617314b21717079d830 +size 14387 diff --git a/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg b/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg index f32e428658..4831cf905f 100644 --- a/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg +++ b/assets/voxygen/audio/sfx/instrument/sitar/sitar_g.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a52c8a368686645f0a6340c8f5e89e5f0e6dc4e2ed7f0fe7cdb8dc55ccca0f4 -size 41054 +oid sha256:e39cad1a53bb764dec8ceede0c385ec46c5c3248679fbb0fca56e6d04ca02141 +size 12060 diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index 8e341d120c..2defc5fdc2 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -1646,6 +1646,10 @@ "voxel.weapon.tool.lute", (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 1.0, ), + Simple("common.items.tool.instruments.guitar"): VoxTrans( + "voxel.weapon.tool.guitar", + (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 1.1, + ), Simple("common.items.tool.instruments.sitar"): VoxTrans( "voxel.weapon.tool.sitar", (0.0, 0.0, 0.0), (45.0, 90.0, 0.0), 1.2, diff --git a/assets/voxygen/voxel/biped_weapon_manifest.ron b/assets/voxygen/voxel/biped_weapon_manifest.ron index 3cea116ceb..0892b818aa 100644 --- a/assets/voxygen/voxel/biped_weapon_manifest.ron +++ b/assets/voxygen/voxel/biped_weapon_manifest.ron @@ -1148,6 +1148,10 @@ vox_spec: ("weapon.tool.lute", (-2.5, -6.0, 4.0)), color: None ), + Tool("common.items.tool.instruments.guitar"): ( + vox_spec: ("weapon.tool.guitar", (-4.5, -6.0, 0.0)), + color: None + ), Tool("common.items.tool.instruments.sitar"): ( vox_spec: ("weapon.tool.sitar", (-4.0, -6.0, 5.0)), color: None diff --git a/assets/voxygen/voxel/item_drop_manifest.ron b/assets/voxygen/voxel/item_drop_manifest.ron index fae1eb514d..6b93b8d35a 100644 --- a/assets/voxygen/voxel/item_drop_manifest.ron +++ b/assets/voxygen/voxel/item_drop_manifest.ron @@ -406,6 +406,7 @@ Simple("common.items.tool.instruments.melodica"): "voxel.weapon.tool.melodica", Simple("common.items.tool.instruments.lute"): "voxel.weapon.tool.lute", Simple("common.items.tool.instruments.sitar"): "voxel.weapon.tool.sitar", + Simple("common.items.tool.instruments.guitar"): "voxel.weapon.tool.guitar", // Other Simple("common.items.utility.coins"): "voxel.object.v-coin", Simple("common.items.utility.collar"): "voxel.object.collar", diff --git a/assets/voxygen/voxel/weapon/tool/guitar.vox b/assets/voxygen/voxel/weapon/tool/guitar.vox new file mode 100644 index 0000000000..f3820d0448 --- /dev/null +++ b/assets/voxygen/voxel/weapon/tool/guitar.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02532f058bf89fe6638bce47049baef4d7555e69ef38c069bfce85ca485a78eb +size 2464 diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 652c273a6a..f4da2f3faa 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -614,9 +614,7 @@ pub enum CharacterAbility { sparseness: f64, }, Music { - buildup_duration: f32, play_duration: f32, - recover_duration: f32, ori_modifier: f32, }, } @@ -1073,14 +1071,10 @@ impl CharacterAbility { *outer_dist *= stats.range; }, Music { - ref mut buildup_duration, ref mut play_duration, - ref mut recover_duration, ori_modifier: _, } => { - *buildup_duration /= stats.speed; *play_duration /= stats.speed; - *recover_duration /= stats.speed; }, } self @@ -2228,20 +2222,16 @@ impl From<(&CharacterAbility, AbilityInfo, &JoinData<'_>)> for CharacterState { achieved_radius: summon_distance.0.floor() as i32 - 1, }), CharacterAbility::Music { - buildup_duration, play_duration, - recover_duration, ori_modifier, } => CharacterState::Music(music::Data { static_data: music::StaticData { - buildup_duration: Duration::from_secs_f32(*buildup_duration), play_duration: Duration::from_secs_f32(*play_duration), - recover_duration: Duration::from_secs_f32(*recover_duration), ori_modifier: *ori_modifier, ability_info, }, timer: Duration::default(), - stage_section: StageSection::Buildup, + stage_section: StageSection::Action, exhausted: false, }), } diff --git a/common/src/states/music.rs b/common/src/states/music.rs index 691bca061b..a8260ee866 100644 --- a/common/src/states/music.rs +++ b/common/src/states/music.rs @@ -12,12 +12,8 @@ use std::time::Duration; /// Separated out to condense update portions of character state #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct StaticData { - /// How long until state should make sound - pub buildup_duration: Duration, /// How long the state is playing for pub play_duration: Duration, - /// How long the state has until exiting - pub recover_duration: Duration, /// Adjusts turning rate during the attack pub ori_modifier: f32, /// What key is used to press ability @@ -46,22 +42,6 @@ impl CharacterBehavior for Data { handle_jump(data, output_events, &mut update, 1.0); match self.stage_section { - StageSection::Buildup => { - if self.timer < self.static_data.buildup_duration { - // Build up - update.character = CharacterState::Music(Data { - timer: tick_attack_or_default(data, self.timer, None), - ..*self - }); - } else { - // Transitions to play section of stage - update.character = CharacterState::Music(Data { - timer: Duration::default(), - stage_section: StageSection::Action, - ..*self - }); - } - }, StageSection::Action => { if !self.exhausted { update.character = CharacterState::Music(Data { @@ -75,22 +55,6 @@ impl CharacterBehavior for Data { timer: tick_attack_or_default(data, self.timer, None), ..*self }); - } else { - // Transitions to recover section of stage - update.character = CharacterState::Music(Data { - timer: Duration::default(), - stage_section: StageSection::Recover, - ..*self - }); - } - }, - StageSection::Recover => { - if self.timer < self.static_data.recover_duration { - // Recovery - update.character = CharacterState::Music(Data { - timer: tick_attack_or_default(data, self.timer, None), - ..*self - }); } else { // Done if input_is_pressed(data, self.static_data.ability_info.input) { @@ -130,4 +94,4 @@ fn reset_state( update, data.static_data.ability_info.input, ); -} +} \ No newline at end of file diff --git a/voxygen/anim/src/character/alpha.rs b/voxygen/anim/src/character/alpha.rs index bfaafcde68..9b9c2f94e8 100644 --- a/voxygen/anim/src/character/alpha.rs +++ b/voxygen/anim/src/character/alpha.rs @@ -3,7 +3,7 @@ use super::{ CharacterSkeleton, SkeletonAttr, }; use common::{ - comp::item::{AbilitySpec, Hands, ToolKind}, + comp::item::{Hands, ToolKind}, states::utils::{AbilityInfo, StageSection}, }; use core::f32::consts::PI; @@ -13,7 +13,7 @@ pub struct AlphaAnimation; type AlphaAnimationDependency<'a> = ( (Option, Option), Option, - (Option, Option<&'a AbilitySpec>), + Option, ); impl Animation for AlphaAnimation { type Dependency<'a> = AlphaAnimationDependency<'a>; @@ -25,7 +25,7 @@ impl Animation for AlphaAnimation { #[cfg_attr(feature = "be-dyn-lib", export_name = "character_alpha")] fn update_skeleton_inner<'a>( skeleton: &Self::Skeleton, - (hands, stage_section, (ability_info, active_tool_spec)): Self::Dependency<'a>, + (hands, stage_section, ability_info): Self::Dependency<'a>, anim_time: f32, rate: &mut f32, s_a: &SkeletonAttr, @@ -78,53 +78,6 @@ impl Animation for AlphaAnimation { * Quaternion::rotation_z(0.0 + move1 * 1.5 + move2 * -2.5); next.head.orientation = Quaternion::rotation_z(0.0 + move1 * -1.5 + move2 * 2.5); }, - // TODO: create Instrument SubToolKinds to distinguish instruments - Some(ToolKind::Instrument) => { - if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { - match spec.as_str() { - "Flute" => { - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.head.position = - Vec3::new(move2 * 0.1, s_a.head.0 + move2 * 0.2, s_a.head.1); - next.chest.orientation = Quaternion::rotation_x( - 0.0 + move1 * 0.2 + move2 * -0.2 + move3 * 0.1, - ) * Quaternion::rotation_y( - 0.0 + move1 * 0.0 + move2 * 0.0 + move3 * 0.0, - ) * Quaternion::rotation_z( - 0.0 + move1 * 0.1 + move2 * -0.1 + move3 * 0.1, - ); - next.head.orientation = Quaternion::rotation_z( - 0.0 + move1 * -0.1 + move2 * 0.1 + move3 * -0.2, - ); - }, - _ => { - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.head.position = - Vec3::new(move2 * 1.0, s_a.head.0 + move2 * 1.0, s_a.head.1); - next.chest.orientation = Quaternion::rotation_x( - 0.0 + move1 * 0.2 + move2 * -0.2 + move3 * 0.1, - ) * Quaternion::rotation_y( - 0.0 + move1 * 0.0 + move2 * 0.0 + move3 * 0.0, - ) * Quaternion::rotation_z( - 0.0 + move1 * 0.3 + move2 * -0.3 + move3 * 0.2, - ); - next.head.orientation = Quaternion::rotation_z( - 0.0 + move1 * -0.1 + move2 * 0.1 + move3 * -0.2, - ); - }, - } - } - }, Some(ToolKind::Hammer) | Some(ToolKind::Pick) => { let (move1, move2, move3) = match stage_section { @@ -203,205 +156,6 @@ impl Animation for AlphaAnimation { s_a.ac.5 + move1 * -2.0 + move2 * -1.0 + move3 * 2.5, ) }, - Some(ToolKind::Instrument) => { - if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { - match spec.as_str() { - "Bass" => { - next.hand_r.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); - next.hand_l.orientation = Quaternion::rotation_x(2.0) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.40); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.0) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(-4.0, 6.0, 14.0); - next.main.orientation = Quaternion::rotation_x(0.1) - * Quaternion::rotation_y(3.0) - * Quaternion::rotation_z(PI / -3.0); - - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, - ); - next.hand_l.position = Vec3::new( - s_a.ahl.0 + move1 * -5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahl.1 + move1 * 6.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahl.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - "Lute" => { - next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); - next.hand_l.orientation = Quaternion::rotation_x(2.0) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.40); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.0) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(-14.0, 6.0, 4.0); - next.main.orientation = Quaternion::rotation_x(0.1) - * Quaternion::rotation_y(2.0) - * Quaternion::rotation_z(PI / -3.0); - - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, - ); - next.hand_l.position = Vec3::new( - s_a.ahl.0 + move1 * -5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahl.1 + move1 * 6.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahl.2 + move1 * -6.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - "Sitar" => { - next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); - next.hand_l.orientation = Quaternion::rotation_x(2.0) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.40); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.0) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(-14.0, 6.0, 4.0); - next.main.orientation = Quaternion::rotation_x(0.1) - * Quaternion::rotation_y(2.0) - * Quaternion::rotation_z(PI / -3.0); - - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, - ); - next.hand_l.position = Vec3::new( - s_a.ahl.0 + move1 * -5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahl.1 + move1 * 6.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahl.2 + move1 * -6.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - "Flute" => { - next.hand_l.position = Vec3::new(-4.0, 6.0, 4.5); - next.hand_l.orientation = Quaternion::rotation_x(2.0) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.40); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.0) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(-2.5, 10.0, -12.0); - next.main.orientation = Quaternion::rotation_x(3.5) - * Quaternion::rotation_y(PI) - * Quaternion::rotation_z(0.05); - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - "Kalimba" => { - next.hand_l.position = Vec3::new(-4.0, 6.0, 2.0); - next.hand_l.orientation = Quaternion::rotation_x(1.00) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.20); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.75) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(8.0, 12.0, -6.0); - next.main.orientation = Quaternion::rotation_x(0.2) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(PI - 0.2); - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 3.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - "Melodica" => { - next.hand_l.position = Vec3::new(-3.0, 6.0, 3.5); - next.hand_l.orientation = Quaternion::rotation_x(2.0) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.40); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.0) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(-1.0, 2.0, 15.0); - next.main.orientation = Quaternion::rotation_x(0.3) - * Quaternion::rotation_y(PI) - * Quaternion::rotation_z(PI / -2.0); - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 1.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - _ => { - next.hand_l.position = Vec3::new(-4.0, 6.0, 2.0); - next.hand_l.orientation = Quaternion::rotation_x(1.00) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.20); - next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); - next.hand_r.orientation = Quaternion::rotation_x(1.75) - * Quaternion::rotation_y(0.75) - * Quaternion::rotation_z(-0.40); - next.main.position = Vec3::new(8.0, 14.0, -6.0); - next.main.orientation = Quaternion::rotation_x(0.2) - * Quaternion::rotation_y(-0.75) - * Quaternion::rotation_z(0.20); - let (move1, move2, move3) = match stage_section { - Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), - Some(StageSection::Action) => (1.0, anim_time, 0.0), - Some(StageSection::Recover) => (1.0, 1.0, anim_time.powi(4)), - _ => (0.0, 0.0, 0.0), - }; - next.hand_r.position = Vec3::new( - s_a.ahr.0 + move1 * 5.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.1 + move1 * 8.0 + move2 * 0.0 + move3 * 0.0, - s_a.ahr.2 + move1 * 3.0 + move2 * 0.0 + move3 * 0.0, - ); - }, - } - } - }, Some(ToolKind::Hammer) | Some(ToolKind::Pick) => { let (move1, move2, move3) = match stage_section { Some(StageSection::Buildup) => (anim_time.powf(0.25), 0.0, 0.0), diff --git a/voxygen/anim/src/character/mod.rs b/voxygen/anim/src/character/mod.rs index 19560fe0e4..669e507782 100644 --- a/voxygen/anim/src/character/mod.rs +++ b/voxygen/anim/src/character/mod.rs @@ -15,6 +15,7 @@ pub mod idle; pub mod jump; pub mod leapmelee; pub mod mount; +pub mod music; pub mod repeater; pub mod roll; pub mod run; @@ -41,7 +42,7 @@ pub use self::{ chargeswing::ChargeswingAnimation, climb::ClimbAnimation, collect::CollectAnimation, consume::ConsumeAnimation, dance::DanceAnimation, dash::DashAnimation, equip::EquipAnimation, glidewield::GlideWieldAnimation, gliding::GlidingAnimation, idle::IdleAnimation, - jump::JumpAnimation, leapmelee::LeapAnimation, mount::MountAnimation, + jump::JumpAnimation, leapmelee::LeapAnimation, mount::MountAnimation, music::MusicAnimation, repeater::RepeaterAnimation, roll::RollAnimation, run::RunAnimation, shockwave::ShockwaveAnimation, shoot::ShootAnimation, sit::SitAnimation, sneak::SneakAnimation, sneakequip::SneakEquipAnimation, sneakwield::SneakWieldAnimation, spin::SpinAnimation, diff --git a/voxygen/anim/src/character/music.rs b/voxygen/anim/src/character/music.rs new file mode 100644 index 0000000000..2665b939fa --- /dev/null +++ b/voxygen/anim/src/character/music.rs @@ -0,0 +1,335 @@ +use super::{ + super::{vek::*, Animation}, + CharacterSkeleton, SkeletonAttr, +}; +use common::{ + comp::item::{AbilitySpec, Hands, ToolKind}, + states::utils::AbilityInfo, +}; +use std::{f32::consts::PI, ops::Mul}; + +pub struct MusicAnimation; + +type MusicAnimationDependency<'a> = ( + (Option, Option), + (Option, Option<&'a AbilitySpec>, f32), +); +impl Animation for MusicAnimation { + type Dependency<'a> = MusicAnimationDependency<'a>; + type Skeleton = CharacterSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"character_music\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "character_music")] + fn update_skeleton_inner<'a>( + skeleton: &Self::Skeleton, + (_hands, (ability_info, active_tool_spec, global_time)): Self::Dependency<'a>, + anim_time: f32, + rate: &mut f32, + s_a: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + *rate = 2.0; + + let lab: f32 = 1.0; + let short = ((5.0 / (3.0 + 2.0 * ((anim_time * lab * 6.0).sin()).powi(2))).sqrt()) + * ((anim_time * lab * 6.0).sin()); + let noisea = (anim_time * 11.0 + PI / 6.0).sin(); + let noiseb = (anim_time * 19.0 + PI / 4.0).sin(); + + let shorte = (anim_time * lab * 6.0).sin(); + + let shortealt = (anim_time * lab * 6.0 + PI / 2.0).sin(); + + let foot = ((0.1 / (1.0 + (4.0) * ((anim_time * lab * 8.0).sin()).powi(2))).sqrt()) + * ((anim_time * lab * 8.0).sin()); + + // common animations + next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1 + shortealt * 1.5); + next.chest.orientation = Quaternion::rotation_z(short * 0.35) + * Quaternion::rotation_y(shorte * 0.08) + * Quaternion::rotation_x(foot * 0.07); + + next.belt.position = Vec3::new(0.0, s_a.belt.0, s_a.belt.1); + next.belt.orientation = Quaternion::rotation_z(shorte * 0.25); + + next.back.position = Vec3::new(0.0, s_a.back.0, s_a.back.1); + next.back.orientation = + Quaternion::rotation_x(-0.25 + shorte * 0.1 + noisea * 0.1 + noiseb * 0.1); + + next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1); + next.shorts.orientation = Quaternion::rotation_z(foot * 0.35); + + next.foot_l.position = Vec3::new( + -s_a.foot.0 + foot * 0.8, + 1.5 + -s_a.foot.1 + foot * -4.0, + s_a.foot.2, + ); + next.foot_l.orientation = + Quaternion::rotation_x(foot * -0.3) * Quaternion::rotation_z(short * -0.15); + + next.foot_r.position = Vec3::new( + s_a.foot.0 + foot * 0.8, + 1.5 + -s_a.foot.1 + foot * 4.0, + s_a.foot.2, + ); + next.foot_r.orientation = + Quaternion::rotation_x(foot * 0.3) * Quaternion::rotation_z(short * 0.15); + + next.shoulder_l.position = Vec3::new(-s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2); + next.shoulder_l.orientation = Quaternion::rotation_x(shorte * 0.15); + + next.shoulder_r.position = Vec3::new(s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2); + next.shoulder_r.orientation = Quaternion::rotation_x(shorte * -0.15); + + next.lantern.orientation = + Quaternion::rotation_x(shorte * 0.7 + 0.4) * Quaternion::rotation_y(shorte * 0.4); + + next.torso.position = Vec3::new(0.0, -3.3, 0.0); + next.torso.orientation = Quaternion::rotation_z(short * -0.2); + + let head_look = Vec2::new( + (global_time + anim_time / 6.0).floor().mul(7331.0).sin() * 0.3, + (global_time + anim_time / 6.0).floor().mul(1337.0).sin() * 0.15, + ); + + // TODO: create Instrument SubToolKinds to distinguish instruments + match ability_info.and_then(|a| a.tool) { + Some(ToolKind::Instrument) => { + if let Some(AbilitySpec::Custom(spec)) = active_tool_spec { + // instrument specific head_bop + let head_bop = match spec.as_str() { + "Flute" | "Melodica" => 0.2, + "Guitar" | "Lute" | "Sitar" => 0.5, + "Harp" | "Kalimba" => 0.3, + _ => 1.0, + }; + next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1); + next.head.orientation = Quaternion::rotation_z((short * head_bop) * -0.6) + * Quaternion::rotation_x( + 0.2 + head_look.y.max(0.0) + (shorte * head_bop).abs() * -0.2, + ); + // instrument specific hand and instrument animations + match spec.as_str() { + "Bass" => { + next.hand_l.position = Vec3::new( + 3.5 - s_a.hand.0, + 7.0 + s_a.hand.1 + shortealt * -3.0, + 8.0 + s_a.hand.2 + shortealt * -0.75, + ); + next.hand_l.orientation = Quaternion::rotation_x(2.4 + foot * 0.15) + * Quaternion::rotation_y(-0.5); + + next.hand_r.position = Vec3::new( + -2.0 + s_a.hand.0, + 4.0 + s_a.hand.1 + shortealt * 6.0, + 4.0 + s_a.hand.2 + shortealt * 0.75, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.4 + foot * -0.15) + * Quaternion::rotation_y(0.4); + + next.main.position = Vec3::new(-4.0, 6.0, 16.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(3.0) + * Quaternion::rotation_z(PI / -3.0); + }, + "Flute" => { + next.hand_l.position = Vec3::new( + 4.0 - s_a.hand.0, + 6.0 + s_a.hand.1 + shortealt * -0.5, + 4.0 + s_a.hand.2 + shortealt * -0.75, + ); + next.hand_l.orientation = Quaternion::rotation_x(2.4 + foot * 0.15) + * Quaternion::rotation_y(-0.9); + + next.hand_r.position = Vec3::new( + -4.5 + s_a.hand.0, + 4.0 + s_a.hand.1 + shortealt * 2.0, + 2.0 + s_a.hand.2 + shortealt * 0.75, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.4 + foot * -0.15) + * Quaternion::rotation_y(0.6); + + next.main.position = Vec3::new(-2.5, 10.0, -11.0); + next.main.orientation = Quaternion::rotation_x(3.5) + * Quaternion::rotation_y(PI) + * Quaternion::rotation_z(0.05); + }, + "Guitar" => { + next.hand_l.position = Vec3::new( + 1.0 - s_a.hand.0, + 6.0 + s_a.hand.1 + shortealt * -1.0, + 2.0 + s_a.hand.2 + shortealt * -1.5, + ); + next.hand_l.orientation = Quaternion::rotation_x(1.8 + foot * 0.15) + * Quaternion::rotation_y(-0.6) + * Quaternion::rotation_z(0.8); + + next.hand_r.position = Vec3::new( + -2.0 + s_a.hand.0 - shortealt * 1.25, + 6.0 + s_a.hand.1 + shortealt * 2.0, + 3.0 + s_a.hand.2 + shortealt * 0.25, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.0 + foot * -0.15) + * Quaternion::rotation_y(0.6); + + next.main.position = Vec3::new(-14.0, 6.0, 5.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(2.0) + * Quaternion::rotation_z(PI / -3.0); + }, + "Harp" => { + next.hand_l.position = Vec3::new( + 3.0 - s_a.hand.0, + 4.0 + s_a.hand.1 + shortealt * -0.1, + 1.0 + s_a.hand.2 + shortealt * -0.2, + ); + next.hand_l.orientation = Quaternion::rotation_x(1.4 + foot * 0.15) + * Quaternion::rotation_y(-0.6); + + next.hand_r.position = Vec3::new( + -4.0 + s_a.hand.0 + shortealt * 2.0, + 5.0 + s_a.hand.1 - shortealt * 3.0, + 2.0 + s_a.hand.2 + shortealt * 0.75, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.4 + foot * -0.15) + * Quaternion::rotation_y(0.9); + + next.main.position = Vec3::new(8.0, 14.0, -6.0); + next.main.orientation = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.20); + }, + + "Kalimba" => { + next.hand_l.position = Vec3::new( + 3.0 - s_a.hand.0, + 4.0 + s_a.hand.1 + shortealt * -0.1, + 1.0 + s_a.hand.2 + shortealt * -0.2, + ); + next.hand_l.orientation = Quaternion::rotation_x(1.4 + foot * 0.15) + * Quaternion::rotation_y(-0.6); + + next.hand_r.position = Vec3::new( + -2.0 + s_a.hand.0 + shortealt * 2.0, + 5.0 + s_a.hand.1 - shortealt * 3.0, + 2.0 + s_a.hand.2 + shortealt * 0.75, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.4 + foot * -0.15) + * Quaternion::rotation_y(0.9); + + next.main.position = Vec3::new(8.0, 12.0, -8.0); + next.main.orientation = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(PI - 0.2); + }, + "Lute" => { + next.hand_l.position = Vec3::new( + 2.0 - s_a.hand.0, + 5.0 + s_a.hand.1 + shortealt * -1.0, + 2.0 + s_a.hand.2 + shortealt * -1.5, + ); + next.hand_l.orientation = Quaternion::rotation_x(1.8 + foot * 0.15) + * Quaternion::rotation_y(-0.6) + * Quaternion::rotation_z(0.8); + + next.hand_r.position = Vec3::new( + -1.0 + s_a.hand.0 - shortealt * 1.25, + 6.0 + s_a.hand.1 + shortealt * 2.0, + 2.0 + s_a.hand.2 + shortealt * 0.25, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.0 + foot * -0.15) + * Quaternion::rotation_y(0.6); + + next.main.position = Vec3::new(-14.0, 6.0, 4.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(2.0) + * Quaternion::rotation_z(PI / -3.0); + }, + "Melodica" => { + next.hand_l.position = Vec3::new( + 4.0 - s_a.hand.0, + 6.0 + s_a.hand.1 + shortealt * -0.5, + 4.0 + s_a.hand.2 + shortealt * -0.75, + ); + next.hand_l.orientation = Quaternion::rotation_x(2.4 + foot * 0.15) + * Quaternion::rotation_y(-0.9); + + next.hand_r.position = Vec3::new( + -3.5 + s_a.hand.0, + 4.0 + s_a.hand.1 + shortealt * 2.0, + 2.0 + s_a.hand.2 + shortealt * 0.75, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.4 + foot * -0.15) + * Quaternion::rotation_y(0.6); + + next.main.position = Vec3::new(-1.0, 2.0, 16.0); + next.main.orientation = Quaternion::rotation_x(0.3) + * Quaternion::rotation_y(PI) + * Quaternion::rotation_z(PI / -2.0); + }, + "Perc" => { + next.hand_l.position = Vec3::new( + 3.0 - s_a.hand.0, + 4.0 + s_a.hand.1 + shortealt * -0.1, + 1.0 + s_a.hand.2 + shortealt * -0.2, + ); + next.hand_l.orientation = Quaternion::rotation_x(1.4 + foot * 0.15) + * Quaternion::rotation_y(-0.6); + + next.hand_r.position = Vec3::new( + -4.0 + s_a.hand.0 + shortealt * 2.0, + 5.0 + s_a.hand.1 - shortealt * 3.0, + 2.0 + s_a.hand.2 + shortealt * 0.75, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.4 + foot * -0.15) + * Quaternion::rotation_y(0.9); + + next.main.position = Vec3::new(8.0, 14.0, -6.0); + next.main.orientation = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(-0.75) + * Quaternion::rotation_z(0.20); + }, + "Sitar" => { + next.hand_l.position = Vec3::new( + 2.0 - s_a.hand.0, + 6.0 + s_a.hand.1 + shortealt * -1.0, + 1.0 + s_a.hand.2 + shortealt * -1.5, + ); + next.hand_l.orientation = Quaternion::rotation_x(1.8 + foot * 0.15) + * Quaternion::rotation_y(-0.6) + * Quaternion::rotation_z(0.8); + + next.hand_r.position = Vec3::new( + -2.0 + s_a.hand.0 - shortealt * 1.25, + 6.0 + s_a.hand.1 + shortealt * 2.0, + 2.0 + s_a.hand.2 + shortealt * 0.25, + ); + next.hand_r.orientation = Quaternion::rotation_x(1.0 + foot * -0.15) + * Quaternion::rotation_y(0.6); + + next.main.position = Vec3::new(-14.0, 6.0, 4.0); + next.main.orientation = Quaternion::rotation_x(0.1) + * Quaternion::rotation_y(2.0) + * Quaternion::rotation_z(PI / -3.0); + }, + _ => {}, + } + } + }, + _ => {}, + } + + if skeleton.holding_lantern { + next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1 + 5.0, s_a.hand.2 + 12.0); + next.hand_r.orientation = Quaternion::rotation_x(2.25) * Quaternion::rotation_z(0.9); + + next.lantern.position = Vec3::new(-0.5, -0.5, 5.5); + next.lantern.orientation = next.hand_r.orientation.inverse(); + } + + next + } +} diff --git a/voxygen/anim/src/character/wield.rs b/voxygen/anim/src/character/wield.rs index 2e759ad6f3..372bec7b5f 100644 --- a/voxygen/anim/src/character/wield.rs +++ b/voxygen/anim/src/character/wield.rs @@ -295,7 +295,8 @@ impl Animation for WieldAnimation { next.hand_l.orientation = Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI); next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); - next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); next.main.position = Vec3::new(-2.0, 10.0, 12.0); next.main.orientation = Quaternion::rotation_y(PI); @@ -311,7 +312,7 @@ impl Animation for WieldAnimation { 0.0 + head_look.y.abs() + look_dir.z * 0.7, ); } - next.hand_l.position = Vec3::new(-1.0, 2.0, -2.0); + next.hand_l.position = Vec3::new(-1.0, 4.0, -1.0); next.hand_l.orientation = Quaternion::rotation_x(2.5) * Quaternion::rotation_y(0.9) * Quaternion::rotation_z(PI); @@ -338,8 +339,9 @@ impl Animation for WieldAnimation { * Quaternion::rotation_y(0.7) * Quaternion::rotation_y(0.25) * Quaternion::rotation_z(PI); - next.hand_r.position = Vec3::new(-2.0, 2.0, 6.0); - next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.hand_r.position = Vec3::new(-2.0, 4.0, 5.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); next.main.position = Vec3::new(-14.0, 4.0, -6.0); next.main.orientation = Quaternion::rotation_x(-0.2) * Quaternion::rotation_y(1.2) @@ -361,7 +363,8 @@ impl Animation for WieldAnimation { next.hand_l.orientation = Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI); next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); - next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); next.main.position = Vec3::new(-2.0, 10.0, 12.0); next.main.orientation = Quaternion::rotation_y(PI); @@ -377,12 +380,13 @@ impl Animation for WieldAnimation { 0.0 + head_look.y.abs() + look_dir.z * 0.7, ); } - next.hand_l.position = Vec3::new(-2.0, 2.0, -4.0); + next.hand_l.position = Vec3::new(0.0, 2.0, -4.0); next.hand_l.orientation = Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI); next.hand_r.position = Vec3::new(-4.0, 2.0, 6.0); - next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); - next.main.position = Vec3::new(-2.0, 7.0, 12.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); + next.main.position = Vec3::new(0.0, 7.0, 12.0); next.main.orientation = Quaternion::rotation_y(PI) * Quaternion::rotation_z(PI); @@ -404,7 +408,33 @@ impl Animation for WieldAnimation { * Quaternion::rotation_y(0.25) * Quaternion::rotation_z(PI); next.hand_r.position = Vec3::new(-5.0, 2.0, 6.0); - next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); + next.main.position = Vec3::new(-2.0, 4.0, -12.0); + next.main.orientation = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(0.2) + * Quaternion::rotation_z(-1.3); + + next.control.position = Vec3::new(-2.0 + slow * 0.5, 0.5, 0.8); + next.control.orientation = Quaternion::rotation_x(u_slow * 0.1) + * Quaternion::rotation_y(2.0 + u_slow * 0.1) + * Quaternion::rotation_z(u_slowalt * 0.1); + }, + "Guitar" => { + if speed < 0.5 { + next.head.orientation = Quaternion::rotation_z(head_look.x) + * Quaternion::rotation_x( + 0.0 + head_look.y.abs() + look_dir.z * 0.7, + ); + } + next.hand_l.position = Vec3::new(0.0, 5.0, -4.0); + next.hand_l.orientation = Quaternion::rotation_x((PI / 2.0) + 0.3) + * Quaternion::rotation_y(0.7) + * Quaternion::rotation_y(0.25) + * Quaternion::rotation_z(PI); + next.hand_r.position = Vec3::new(-5.0, 2.0, 6.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); next.main.position = Vec3::new(-2.0, 4.0, -12.0); next.main.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.2) @@ -454,7 +484,8 @@ impl Animation for WieldAnimation { * Quaternion::rotation_y(0.25) * Quaternion::rotation_z(PI); next.hand_r.position = Vec3::new(-5.0, 2.0, 6.0); - next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_z(PI / 2.0); next.main.position = Vec3::new(-2.0, 4.0, -12.0); next.main.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.2) diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 5c4eff6369..8d378acbd5 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -370,6 +370,7 @@ pub fn ability_image(imgs: &img_ids::Imgs, ability_id: &str) -> image::Id { "common.abilities.music.kalimba" => imgs.instrument, "common.abilities.music.melodica" => imgs.instrument, "common.abilities.music.lute" => imgs.instrument, + "common.abilities.music.guitar" => imgs.instrument, "common.abilities.music.sitar" => imgs.instrument, _ => imgs.not_found, } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 58ee56d2ed..a4c7a982b8 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -1151,7 +1151,7 @@ impl FigureMgr { ( hands, Some(s.stage_section), - (Some(s.static_data.ability_info), None), + Some(s.static_data.ability_info), ), stage_progress, &mut state_animation_rate, @@ -1331,7 +1331,7 @@ impl FigureMgr { CharacterState::Boost(_) => { anim::character::AlphaAnimation::update_skeleton( &target_base, - (hands, None, (None, None)), + (hands, None, None), state.state_time, &mut state_animation_rate, skeleton_attr, @@ -1589,7 +1589,7 @@ impl FigureMgr { ( hands, Some(s.stage_section), - (Some(s.static_data.ability_info), None), + Some(s.static_data.ability_info), ), stage_progress, &mut state_animation_rate, @@ -1833,27 +1833,13 @@ impl FigureMgr { ) }, CharacterState::Music(s) => { - let stage_time = s.timer.as_secs_f32(); - let stage_progress = match s.stage_section { - StageSection::Buildup => { - stage_time / s.static_data.buildup_duration.as_secs_f32() - }, - StageSection::Action => { - stage_time / s.static_data.play_duration.as_secs_f32() - }, - StageSection::Recover => { - stage_time / s.static_data.recover_duration.as_secs_f32() - }, - _ => 0.0, - }; - anim::character::AlphaAnimation::update_skeleton( + anim::character::MusicAnimation::update_skeleton( &target_base, ( hands, - Some(s.stage_section), - (Some(s.static_data.ability_info), active_tool_spec), + (Some(s.static_data.ability_info), active_tool_spec, time), ), - stage_progress, + state.state_time, &mut state_animation_rate, skeleton_attr, ) From a32b269252952c1b42afc83af90ae6aa99e972d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Sun, 11 Sep 2022 16:10:56 +0200 Subject: [PATCH 226/854] steal sharps clippy improvements to the old nightly --- client/src/lib.rs | 2 +- common/src/lib.rs | 2 ++ common/systems/src/lib.rs | 2 +- rust-toolchain | 2 +- server/src/lib.rs | 2 ++ voxygen/anim/src/lib.rs | 2 +- voxygen/src/lib.rs | 1 + voxygen/src/scene/terrain.rs | 2 +- world/src/lib.rs | 8 +++++++- 9 files changed, 17 insertions(+), 6 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index aea6a66eeb..ffc8579b39 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -1,6 +1,6 @@ #![deny(unsafe_code)] #![deny(clippy::clone_on_ref_ptr)] -#![feature(option_zip)] +#![feature(label_break_value, option_zip, bool_to_option)] pub mod addr; pub mod error; diff --git a/common/src/lib.rs b/common/src/lib.rs index 87fbcf8801..6cf1b69302 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -5,7 +5,9 @@ #![deny(clippy::clone_on_ref_ptr)] #![feature( associated_type_defaults, + bool_to_option, fundamental, + label_break_value, option_zip, trait_alias, type_alias_impl_trait, diff --git a/common/systems/src/lib.rs b/common/systems/src/lib.rs index 05fab14477..154f0e2ca6 100644 --- a/common/systems/src/lib.rs +++ b/common/systems/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(let_else, btree_drain_filter)] +#![feature(let_else, btree_drain_filter, bool_to_option)] #![allow(clippy::option_map_unit_fn)] mod aura; diff --git a/rust-toolchain b/rust-toolchain index 62193b6c62..f6f9b5b6c6 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2022-09-08 +nightly-2022-04-25 diff --git a/server/src/lib.rs b/server/src/lib.rs index e76b90c299..7b9a4a1a9e 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -2,8 +2,10 @@ #![allow(clippy::option_map_unit_fn)] #![deny(clippy::clone_on_ref_ptr)] #![feature( + bool_to_option, box_patterns, drain_filter, + label_break_value, let_chains, let_else, never_type, diff --git a/voxygen/anim/src/lib.rs b/voxygen/anim/src/lib.rs index 9a3457c825..e3aa8d44f9 100644 --- a/voxygen/anim/src/lib.rs +++ b/voxygen/anim/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(generic_associated_types)] +#![feature(generic_associated_types, bool_to_option)] #![allow(incomplete_features)] #![allow(clippy::single_match)] #[cfg(all(feature = "be-dyn-lib", feature = "use-dyn-lib"))] diff --git a/voxygen/src/lib.rs b/voxygen/src/lib.rs index 5a3f6bf684..644dccf3eb 100644 --- a/voxygen/src/lib.rs +++ b/voxygen/src/lib.rs @@ -5,6 +5,7 @@ #![feature( array_methods, array_zip, + bool_to_option, drain_filter, once_cell, trait_alias, diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index d7efa6827b..c6074c9f89 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -554,7 +554,7 @@ impl SpriteRenderContext { } }); - let init = core::cell::OnceCell::new(); + let init = core::lazy::OnceCell::new(); let mut join_handle = Some(join_handle); let mut closure = move |renderer: &mut Renderer| { // The second unwrap can only fail if the sprite meshing thread panics, which diff --git a/world/src/lib.rs b/world/src/lib.rs index 65650b38d9..e77c4837e4 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -7,7 +7,13 @@ )] #![allow(clippy::branches_sharing_code)] // TODO: evaluate #![deny(clippy::clone_on_ref_ptr)] -#![feature(option_zip, arbitrary_enum_discriminant, let_else)] +#![feature( + bool_to_option, + label_break_value, + option_zip, + arbitrary_enum_discriminant, + let_else +)] mod all; mod block; From 6c9deee4918072c9512a0b1cfadcadcf26b04259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Sun, 11 Sep 2022 16:38:08 +0200 Subject: [PATCH 227/854] revert wgpu/shaderc changes --- Cargo.lock | 12 +++++++----- Cargo.toml | 3 +-- voxygen/Cargo.toml | 4 +--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f575b06355..667075b0f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5640,7 +5640,8 @@ dependencies = [ [[package]] name = "shaderc" version = "0.8.0" -source = "git+https://github.com/pythonesque/shaderc-rs?rev=f2605a02062834019bedff911aee2fd2998c49f9#f2605a02062834019bedff911aee2fd2998c49f9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e6fe602a861622769530a23bc40bfba31adbf186d0c8412e83f5519c5d6bee" dependencies = [ "libc", "shaderc-sys", @@ -5649,7 +5650,8 @@ dependencies = [ [[package]] name = "shaderc-sys" version = "0.8.0" -source = "git+https://github.com/pythonesque/shaderc-rs?rev=f2605a02062834019bedff911aee2fd2998c49f9#f2605a02062834019bedff911aee2fd2998c49f9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3794498651f8173d0afbc0bb8aca45ced111098227e755dde4c0ef2888c8d0bf" dependencies = [ "cmake", "libc", @@ -7804,7 +7806,7 @@ dependencies = [ [[package]] name = "wgpu" version = "0.8.0" -source = "git+https://github.com/pythonesque/wgpu.git?rev=179ea209374a92837cde252f1d9ee01f628cae08#179ea209374a92837cde252f1d9ee01f628cae08" +source = "git+https://github.com/gfx-rs/wgpu.git?rev=a92b8549a8e2cb9dac781bafc5ed32828f3caf46#a92b8549a8e2cb9dac781bafc5ed32828f3caf46" dependencies = [ "arrayvec 0.5.2", "js-sys", @@ -7824,7 +7826,7 @@ dependencies = [ [[package]] name = "wgpu-core" version = "0.8.0" -source = "git+https://github.com/pythonesque/wgpu.git?rev=179ea209374a92837cde252f1d9ee01f628cae08#179ea209374a92837cde252f1d9ee01f628cae08" +source = "git+https://github.com/gfx-rs/wgpu.git?rev=a92b8549a8e2cb9dac781bafc5ed32828f3caf46#a92b8549a8e2cb9dac781bafc5ed32828f3caf46" dependencies = [ "arrayvec 0.5.2", "bitflags", @@ -7864,7 +7866,7 @@ dependencies = [ [[package]] name = "wgpu-types" version = "0.8.0" -source = "git+https://github.com/pythonesque/wgpu.git?rev=179ea209374a92837cde252f1d9ee01f628cae08#179ea209374a92837cde252f1d9ee01f628cae08" +source = "git+https://github.com/gfx-rs/wgpu.git?rev=a92b8549a8e2cb9dac781bafc5ed32828f3caf46#a92b8549a8e2cb9dac781bafc5ed32828f3caf46" dependencies = [ "bitflags", "serde", diff --git a/Cargo.toml b/Cargo.toml index b0c127a1db..fec9ce5a35 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -122,8 +122,7 @@ nativeBuildInputs = ["pkg-config"] [patch.crates-io] vek = { git = "https://github.com/yoanlcq/vek.git", rev = "84d5cb65841d46599a986c5477341bea4456be26" } # patch wgpu so we can use wgpu-profiler crate -# wgpu = { git = "https://github.com/gfx-rs/wgpu.git", rev = "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" } -wgpu = { git = "https://github.com/pythonesque/wgpu.git", rev = "179ea209374a92837cde252f1d9ee01f628cae08" } +wgpu = { git = "https://github.com/gfx-rs/wgpu.git", rev = "a92b8549a8e2cb9dac781bafc5ed32828f3caf46" } # # use the latest fixes in naga (remove when updates trickle down to wgpu-rs) # naga = { git = "https://github.com/gfx-rs/naga.git", rev = "3a0f0144112ff621dd7f731bf455adf6cab19164" } diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index aa3c87fff8..180eab04e1 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -59,9 +59,7 @@ winit = {version = "0.25.0", features = ["serde"]} wgpu = { version = "=0.8.0", features = ["trace", "cross"] } wgpu-profiler = { git = "https://github.com/Imberflur/wgpu-profiler", tag = "wgpu-0.8" } bytemuck = { version="1.4", features=["derive"] } -# shaderc = "0.8.0" -# Working around a current bug in shaderc that causes it to use the system installation even if we specify compile from source -shaderc = { git = "https://github.com/pythonesque/shaderc-rs", rev = "f2605a02062834019bedff911aee2fd2998c49f9" } +shaderc = "0.8.0" # cmake crate used by shaderc, newer version 0.1.46 uses a new cmake command that is not available in our CI cmake version # see https://github.com/alexcrichton/cmake-rs/issues/131 cmake = "=0.1.45" From 71c2d99aef9f4f21e3bb4e9d0bdbb74659088bba Mon Sep 17 00:00:00 2001 From: Koboo Date: Mon, 12 Sep 2022 16:58:39 +0200 Subject: [PATCH 228/854] Update the German translation (hud-skill-dodge resolve error) --- assets/voxygen/i18n/de_DE/hud/skills.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/voxygen/i18n/de_DE/hud/skills.ftl b/assets/voxygen/i18n/de_DE/hud/skills.ftl index e1b5e26433..0c9b171a42 100644 --- a/assets/voxygen/i18n/de_DE/hud/skills.ftl +++ b/assets/voxygen/i18n/de_DE/hud/skills.ftl @@ -21,7 +21,7 @@ hud-skill-unlck_staff = Schaltet den Stab-Fähigkeitenbaum frei{ $SP } hud-skill-unlck_sceptre_title = Zepter freischalten hud-skill-unlck_sceptre = Schaltet den Zepter-Fähigkeitenbaum frei{ $SP } hud-skill-dodge_title = Ausweichen -hud-skill-dodge = Weicht Nahkampfattacken aus{ $SP } +hud-skill-dodge = Weicht Nahkampfattacken aus hud-skill-roll_energy_title = Ausdauerkosten beim Rollen hud-skill-roll_energy = Rollen nutzt { $boost }% weniger Ausdauer{ $SP } hud-skill-roll_speed_title = Rollgeschwindigkeit From 97900b109f0706421c6ad194e71dfc5368045f00 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Tue, 6 Sep 2022 17:37:35 +0300 Subject: [PATCH 229/854] Make loot export display all modulars --- common/src/bin/csv_export/main.rs | 127 +++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 37 deletions(-) diff --git a/common/src/bin/csv_export/main.rs b/common/src/bin/csv_export/main.rs index cc73b25d50..c04ee865a7 100644 --- a/common/src/bin/csv_export/main.rs +++ b/common/src/bin/csv_export/main.rs @@ -13,6 +13,7 @@ use veloren_common::{ self, item::{ armor::{ArmorKind, Protection}, + modular::{generate_weapon_primary_components, generate_weapons}, tool::{Hands, Tool, ToolKind}, Item, MaterialStatManifest, }, @@ -320,21 +321,21 @@ fn entity_drops(entity_config: &str) -> Result<(), Box> { let mut table = vec![entry]; - // Keep converting loot table lootspecs into non-loot table lootspecs until no - // more loot tables + // Keep converting loot table lootspecs into non-loot table lootspecs + // until no more loot tables while table .iter() .any(|(_, loot_spec)| matches!(loot_spec, LootSpec::LootTable(_))) { - // Partition table of loot specs into a table of items and nothings, and another - // table of loot tables + // Partition table of loot specs into a table of items and + // nothings, and another table of loot tables let (sub_tables, main_table): (Vec<_>, Vec<_>) = table .into_iter() .partition(|(_, loot_spec)| matches!(loot_spec, LootSpec::LootTable(_))); table = main_table; - // Change table of loot tables to only contain the string that loads the loot - // table + // Change table of loot tables to only contain the string that + // loads the loot table let sub_tables = sub_tables.iter().filter_map(|(chance, loot_spec)| { if let LootSpec::LootTable(loot_table) = loot_spec { Some((chance, loot_table)) @@ -342,10 +343,11 @@ fn entity_drops(entity_config: &str) -> Result<(), Box> { None } }); + for (chance, loot_table) in sub_tables { let loot_table = Lottery::>::load_expect(loot_table).read(); - // Converts from lottery's weight addition for each consecutive entry to keep - // the weights as they are in the ron file + // Converts from lottery's weight addition for each consecutive + // entry to keep the weights as they are in the ron file let loot_table: Vec<_> = loot_table .iter() .enumerate() @@ -365,8 +367,8 @@ fn entity_drops(entity_config: &str) -> Result<(), Box> { .iter() .map(|(chance, item)| (chance / weights_sum, item)); for (sub_chance, &item) in loot_table { - // Multiplies normalized entry within each loot table by the chance for the loot - // table to drop in the above table + // Multiplies normalized entry within each loot table by + // the chance for the loot table to drop in the above table let entry = (chance * sub_chance, item.clone()); table.push(entry); } @@ -387,39 +389,90 @@ fn entity_drops(entity_config: &str) -> Result<(), Box> { .div(10_f32.powi(2)) .to_string(); - let (item_asset, quantity) = match item { - LootSpec::Item(item) => (Some(item), "1".to_string()), + let item_name = |asset| Item::new_from_asset_expect(asset).name().into_owned(); + + match item { + LootSpec::Item(item) => { + wtr.write_record(&[ + name.clone(), + asset_path.to_owned(), + percent_chance, + item_name(item), + "1".to_owned(), + ])?; + }, LootSpec::ItemQuantity(item, lower, upper) => { - // Tab needed so excel doesn't think it is a date... - (Some(item), format!("{}-{}\t", lower, upper)) + wtr.write_record(&[ + name.clone(), + asset_path.to_owned(), + percent_chance, + item_name(item), + // Tab needed so excel doesn't think it is a date... + format!("{lower}-{upper}\t"), + ])?; }, - LootSpec::ModularWeapon { .. } => { - // TODO: Figure out how modular weapons should work here - (None, String::from("1")) + LootSpec::Nothing => { + wtr.write_record(&[ + name.clone(), + asset_path.to_owned(), + percent_chance, + "Nothing".to_owned(), + // Tab needed so excel doesn't think it is a date... + "-".to_owned(), + ])?; }, - LootSpec::ModularWeaponPrimaryComponent { .. } => { - // TODO: Figure out how modular weapon components should work here - (None, String::from("1")) + LootSpec::ModularWeapon { + tool, + material, + hands, + } => { + let weapons = generate_weapons(*tool, *material, *hands) + .expect("failed to generate modular weapons"); + + let chance = chance / weapons.len() as f32; + let percent_chance = chance + .mul(10_f32.powi(4)) + .round() + .div(10_f32.powi(2)) + .to_string(); + + for weapon in weapons { + wtr.write_record(&[ + name.clone(), + asset_path.to_owned(), + percent_chance.clone(), + weapon.name().into_owned(), + "1".to_owned(), + ])?; + } }, - LootSpec::LootTable(_) => panic!("Shouldn't exist"), - LootSpec::Nothing => (None, "-".to_string()), - }; + LootSpec::ModularWeaponPrimaryComponent { + tool, + material, + hands, + } => { + let comps = generate_weapon_primary_components(*tool, *material, *hands) + .expect("failed to generate modular weapons"); - let item = item_asset.map(|asset| Item::new_from_asset_expect(asset)); + let chance = chance / comps.len() as f32; + let percent_chance = chance + .mul(10_f32.powi(4)) + .round() + .div(10_f32.powi(2)) + .to_string(); - let item_name = if let Some(item) = &item { - item.name().into_owned() - } else { - String::from("Nothing") - }; - - wtr.write_record(&[ - name.clone(), - asset_path.to_string(), - percent_chance, - item_name.to_string(), - quantity, - ])? + for (comp, _hands) in comps { + wtr.write_record(&[ + name.clone(), + asset_path.to_owned(), + percent_chance.clone(), + comp.name().into_owned(), + "1".to_owned(), + ])?; + } + }, + LootSpec::LootTable(_) => unreachable!(), + } } Ok(()) From be1638e2e7aa043119f2864ce967c3f021f515ea Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 11 Sep 2022 20:40:05 +0300 Subject: [PATCH 230/854] Remove csv_import of loot table --- common/src/bin/csv_import/main.rs | 169 +----------------------------- 1 file changed, 4 insertions(+), 165 deletions(-) diff --git a/common/src/bin/csv_import/main.rs b/common/src/bin/csv_import/main.rs index 00eac0ad23..bd48782870 100644 --- a/common/src/bin/csv_import/main.rs +++ b/common/src/bin/csv_import/main.rs @@ -4,7 +4,7 @@ use hashbrown::HashMap; use ron::ser::{to_string_pretty, PrettyConfig}; use serde::Serialize; -use std::{error::Error, fs::File, io::Write, str::FromStr}; +use std::{error::Error, fs::File, io::Write}; use structopt::StructOpt; use veloren_common::{ @@ -13,16 +13,15 @@ use veloren_common::{ self, item::{ armor::{ArmorKind, Protection, StatsSource}, - tool::{AbilitySpec, Hands, Stats, ToolKind}, - ItemDefinitionId, ItemKind, ItemTag, Material, Quality, + tool::{AbilitySpec, Hands, Stats}, + ItemDefinitionId, ItemKind, ItemTag, Quality, }, }, - lottery::LootSpec, }; #[derive(StructOpt)] struct Cli { - /// Available arguments: "armor-stats", "weapon-stats", "loot-table" + /// Available arguments: "armor-stats", "weapon-stats" function: String, } @@ -463,132 +462,6 @@ fn weapon_stats() -> Result<(), Box> { Ok(()) } -fn loot_table(loot_table: &str) -> Result<(), Box> { - let mut rdr = csv::Reader::from_path("loot_table.csv")?; - - let headers: HashMap = rdr - .headers() - .expect("Failed to read CSV headers") - .iter() - .enumerate() - .map(|(i, x)| (x.to_string(), i)) - .collect(); - - let mut items = Vec::<(f32, LootSpec)>::new(); - - let get_tool_kind = |tool: String| match tool.as_str() { - "Sword" => Some(ToolKind::Sword), - "Axe" => Some(ToolKind::Axe), - "Hammer" => Some(ToolKind::Hammer), - "Bow" => Some(ToolKind::Bow), - "Staff" => Some(ToolKind::Staff), - "Sceptre" => Some(ToolKind::Sceptre), - "Dagger" => Some(ToolKind::Dagger), - "Shield" => Some(ToolKind::Shield), - "Spear" => Some(ToolKind::Spear), - "Debug" => Some(ToolKind::Debug), - "Farming" => Some(ToolKind::Farming), - "Pick" => Some(ToolKind::Pick), - "Natural" => Some(ToolKind::Natural), - "Empty" => Some(ToolKind::Empty), - _ => None, - }; - - let get_tool_hands = |hands: String| match hands.as_str() { - "One" | "one" | "1" => Some(Hands::One), - "Two" | "two" | "2" => Some(Hands::Two), - _ => None, - }; - - for ref record in rdr.records().flatten() { - let item = match record.get(headers["Kind"]).expect("No loot specifier") { - "Item" => { - if let (Some(Ok(lower)), Some(Ok(upper))) = ( - record - .get(headers["Lower Amount or Material"]) - .map(|a| a.parse()), - record - .get(headers["Upper Amount or Hands"]) - .map(|a| a.parse()), - ) { - LootSpec::ItemQuantity( - record.get(headers["Item"]).expect("No item").to_string(), - lower, - upper, - ) - } else { - LootSpec::Item(record.get(headers["Item"]).expect("No item").to_string()) - } - }, - "LootTable" => LootSpec::LootTable( - record - .get(headers["Item"]) - .expect("No loot table") - .to_string(), - ), - "Nothing" => LootSpec::Nothing, - "Modular Weapon" => LootSpec::ModularWeapon { - tool: get_tool_kind(record.get(headers["Item"]).expect("No tool").to_string()) - .expect("Invalid tool kind"), - material: Material::from_str( - record - .get(headers["Lower Amount or Material"]) - .expect("No material"), - ) - .expect("Invalid material type"), - hands: get_tool_hands( - record - .get(headers["Upper Amount or Hands"]) - .expect("No hands") - .to_string(), - ), - }, - "Modular Weapon Primary Component" => LootSpec::ModularWeaponPrimaryComponent { - tool: get_tool_kind(record.get(headers["Item"]).expect("No tool").to_string()) - .expect("Invalid tool kind"), - material: Material::from_str( - record - .get(headers["Lower Amount or Material"]) - .expect("No material"), - ) - .expect("Invalid material type"), - hands: get_tool_hands( - record - .get(headers["Upper Amount or Hands"]) - .expect("No hands") - .to_string(), - ), - }, - a => panic!( - "Loot specifier kind must be either \"Item\", \"LootTable\", or \"Nothing\"\n{}", - a - ), - }; - let chance: f32 = record - .get(headers["Relative Chance"]) - .expect("No chance for item in entry") - .parse() - .expect("Not an f32 for chance in entry"); - items.push((chance, item)); - } - - let pretty_config = PrettyConfig::new().depth_limit(4).decimal_floats(true); - - let mut path = ASSETS_PATH.clone(); - path.push("common"); - path.push("loot_tables"); - for part in loot_table.split('.') { - path.push(part); - } - path.set_extension("ron"); - - let path_str = path.to_str().expect("File path not unicode?!"); - let mut writer = File::create(path_str)?; - write!(writer, "{}", to_string_pretty(&items, pretty_config)?)?; - - Ok(()) -} - fn main() { let args = Cli::from_args(); if args.function.eq_ignore_ascii_case("armor-stats") { @@ -651,40 +524,6 @@ Would you like to continue? (y/n) println!("Error: {}\n", e) } } - } else if args.function.eq_ignore_ascii_case("loot-table") { - let loot_table_name = get_input( - "Specify the name of the loot table to import from csv. Adds loot table to the \ - directory: assets.common.loot_tables.\n", - ); - if get_input( - " -------------------------------------------------------------------------------- -| DISCLAIMER | -------------------------------------------------------------------------------- -| | -| This script will wreck the RON file for a loot table if it messes up. | -| You might want to save a back up of the loot table or be prepared to | -| use `git checkout HEAD -- ../assets/common/loot_tables/*` if needed. | -| If this script does mess up your files, please fix it. Otherwise your | -| files will be yeeted away and you will get a bonk on the head. | -| | -------------------------------------------------------------------------------- - -In order for this script to work, you need to have first run the csv exporter. -Once you have loot_table.csv you can make changes to item drops and their drop -chance in your preferred editor. Save the csv file and then run this script -to import your changes back to RON. - -Would you like to continue? (y/n) -> ", - ) - .to_lowercase() - == *"y" - { - if let Err(e) = loot_table(&loot_table_name) { - println!("Error: {}\n", e) - } - } } else { println!( "Invalid argument, available \ From f1a2031f22d713a6d12249b5f9ea8adc2506f887 Mon Sep 17 00:00:00 2001 From: Ben Wallis Date: Sat, 3 Sep 2022 14:54:25 +0100 Subject: [PATCH 231/854] Reworked panic dialog to support displaying the likely cause of common panics --- voxygen/src/lib.rs | 4 +- voxygen/src/main.rs | 99 +----------------------- voxygen/src/panic_handler.rs | 143 +++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 97 deletions(-) create mode 100644 voxygen/src/panic_handler.rs diff --git a/voxygen/src/lib.rs b/voxygen/src/lib.rs index 644dccf3eb..d43ce0c85e 100644 --- a/voxygen/src/lib.rs +++ b/voxygen/src/lib.rs @@ -12,7 +12,8 @@ option_get_or_insert_default, map_try_insert, slice_as_chunks, - unzip_option + unzip_option, + let_chains )] #![recursion_limit = "2048"] @@ -30,6 +31,7 @@ pub mod hud; pub mod key_state; pub mod menu; pub mod mesh; +pub mod panic_handler; pub mod profile; pub mod render; pub mod run; diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 7d5eff9b10..910fa897af 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -20,6 +20,7 @@ static GLOBAL: common_base::tracy_client::ProfiledAllocator use i18n::{self, LocalizationHandle}; use veloren_voxygen::{ audio::AudioFrontend, + panic_handler, profile::Profile, run, scene::terrain::SpriteRenderContext, @@ -33,7 +34,7 @@ use chrono::Utc; use common::assets; use common::clock::Clock; use std::{panic, path::PathBuf}; -use tracing::{error, info, warn}; +use tracing::{info, warn}; #[cfg(feature = "egui-ui")] use veloren_voxygen::ui::egui::EguiState; @@ -87,101 +88,7 @@ fn main() { panic!("Failed to save settings: {:?}", err); } - // Set up panic handler to relay swish panic messages to the user - let default_hook = panic::take_hook(); - panic::set_hook(Box::new(move |panic_info| { - let panic_info_payload = panic_info.payload(); - let payload_string = panic_info_payload.downcast_ref::(); - let reason = match payload_string { - Some(s) => s, - None => { - let payload_str = panic_info_payload.downcast_ref::<&str>(); - match payload_str { - Some(st) => st, - None => "Payload is not a string", - } - }, - }; - let msg = format!( - "A critical error has occurred and Voxygen has been forced to \ - terminate in an unusual manner. Details about the error can be \ - found below.\n\ - \n\ - > What should I do?\n\ - \n\ - We need your help to fix this! You can help by contacting us and \ - reporting this problem. To do this, open an issue on the Veloren \ - issue tracker:\n\ - \n\ - https://www.gitlab.com/veloren/veloren/issues/new\n\ - \n\ - If you're on the Veloren community Discord server, we'd be \ - grateful if you could also post a message in the #support channel. - \n\ - > What should I include?\n\ - \n\ - The error information below will be useful in finding and fixing \ - the problem. Please include as much information about your setup \ - and the events that led up to the panic as possible. - \n\ - Voxygen has logged information about the problem (including this \ - message) to the file {}. Please include the contents of this \ - file in your bug report. - \n\ - > Error information\n\ - \n\ - The information below is intended for developers and testers.\n\ - \n\ - Panic Payload: {:?}\n\ - PanicInfo: {}\n\ - Game version: {} [{}]", - logs_dir.join(&log_filename).display(), - reason, - panic_info, - *common::util::GIT_HASH, - *common::util::GIT_DATE - ); - - error!( - "VOXYGEN HAS PANICKED\n\n{}\n\nBacktrace:\n{:?}", - msg, - backtrace::Backtrace::new(), - ); - - #[cfg(feature = "native-dialog")] - { - use native_dialog::{MessageDialog, MessageType}; - - let mbox = move || { - MessageDialog::new() - .set_title("Voxygen has panicked") - //somehow `<` and `>` are invalid characters and cause the msg to get replaced - // by some generic text thus i replace them - .set_text(&msg.replace('<', "[").replace('>', "]")) - .set_type(MessageType::Error) - .show_alert() - .unwrap() - }; - - // On windows we need to spawn a thread as the msg doesn't work otherwise - #[cfg(target_os = "windows")] - { - let builder = std::thread::Builder::new().name("shutdown".into()); - builder - .spawn(move || { - mbox(); - }) - .unwrap() - .join() - .unwrap(); - } - - #[cfg(not(target_os = "windows"))] - mbox(); - } - - default_hook(panic_info); - })); + panic_handler::set_panic_hook(log_filename, logs_dir); // Process CLI arguments use clap::Parser; diff --git a/voxygen/src/panic_handler.rs b/voxygen/src/panic_handler.rs new file mode 100644 index 0000000000..a2c0ee3813 --- /dev/null +++ b/voxygen/src/panic_handler.rs @@ -0,0 +1,143 @@ +use std::{panic, panic::PanicInfo, path::PathBuf}; +use tracing::error; + +pub fn set_panic_hook(log_filename: String, logs_dir: PathBuf) { + // Set up panic handler to relay swish panic messages to the user + let default_hook = panic::take_hook(); + panic::set_hook(Box::new(move |panic_info| { + let panic_info_payload = panic_info.payload(); + let payload_string = panic_info_payload.downcast_ref::(); + let reason = match payload_string { + Some(s) => s, + None => { + let payload_str = panic_info_payload.downcast_ref::<&str>(); + match payload_str { + Some(st) => st, + None => "Payload is not a string", + } + }, + }; + let potential_cause = potential_cause(panic_info); + + let mut dialog_message = format!( + "A critical error has occurred and Voxygen has been forced to terminate in an unusual \ + manner. Details about the error can be found below.\n\nPanic reason: {}\n\n", + reason + ); + + if let Some(potential_cause) = potential_cause { + // The error is a known error, so don't show the full bug report instructions + // and instead show a potential fix. + dialog_message.push_str(format!("Potential causes: {}\n\n", potential_cause).as_str()) + } else { + dialog_message.push_str( + format!("> What should I do?\n\ + \n\ + We need your help to fix this! You can help by contacting us and \ + reporting this problem. To do this, open an issue on the Veloren \ + issue tracker:\n\ + \n\ + https://www.gitlab.com/veloren/veloren/issues/new\n\ + \n\ + If you're on the Veloren community Discord server, we'd be \ + grateful if you could also post a message in the #support channel. + \n\ + > What should I include?\n\ + \n\ + The error information below will be useful in finding and fixing \ + the problem. Please include as much information about your setup \ + and the events that led up to the panic as possible. + \n\ + Voxygen has logged information about the problem (including this \ + message) to the file {}. Please include the contents of this \ + file in your bug report. + \n\n", logs_dir.join(&log_filename).display()) + .as_str(), + ); + } + + dialog_message.push_str( + format!( + "> Error information\n\nThe information below is intended for developers and \ + testers.\n\nPanicInfo: {} \nGame version: {} [{}]", + panic_info, + *common::util::GIT_HASH, + *common::util::GIT_DATE + ) + .as_str(), + ); + + error!( + "VOXYGEN HAS PANICKED\n\n{}\n\nBacktrace:\n{:?}", + dialog_message, + backtrace::Backtrace::new(), + ); + + #[cfg(feature = "native-dialog")] + { + use native_dialog::{MessageDialog, MessageType}; + + let mbox = move || { + MessageDialog::new() + .set_title("Veloren has crashed!") + //somehow `<` and `>` are invalid characters and cause the msg to get replaced + // by some generic text thus i replace them + .set_text(&dialog_message.replace('<', "[").replace('>', "]")) + .set_type(MessageType::Error) + .show_alert() + .unwrap() + }; + + // On windows we need to spawn a thread as the msg doesn't work otherwise + #[cfg(target_os = "windows")] + { + let builder = std::thread::Builder::new().name("shutdown".into()); + builder + .spawn(move || { + mbox(); + }) + .unwrap() + .join() + .unwrap(); + } + + #[cfg(not(target_os = "windows"))] + mbox(); + } + + default_hook(panic_info); + })); +} + +enum PotentialPanicCause { + GraphicsCardIncompatibleWithRenderingBackend, +} + +fn potential_cause(panic_info: &PanicInfo) -> Option { + let location = panic_info + .location() + .map_or("".to_string(), |x| x.file().to_string()) + .to_lowercase(); + + // Use some basic heuristics to determine the likely cause of the panic. This is + // deliberately overly simplistic as the vast majority of graphics errors + // for example are caused by an incompatible GPU rather than a bug. + let potential_cause = if location.contains("gfx") || location.contains("wgpu") { + Some(PotentialPanicCause::GraphicsCardIncompatibleWithRenderingBackend) + } else { + None + }; + + potential_cause.map(potential_cause_to_string) +} + +fn potential_cause_to_string(potential_cause: PotentialPanicCause) -> String { + match potential_cause { + PotentialPanicCause::GraphicsCardIncompatibleWithRenderingBackend => { + "This error occurs when your graphics card is not compatible with the selected \ + graphics mode. This can be changed in the Airshipper settings window, however it may \ + be the case that your graphics card is not supported by any graphics mode." + .to_string() + }, + } +} From dc688bccb98ffae0257f2f5955d972b7408b3e57 Mon Sep 17 00:00:00 2001 From: flo Date: Tue, 13 Sep 2022 17:32:53 +0000 Subject: [PATCH 232/854] fix_salamander_and_elbst --- .../common/abilities/ability_set_manifest.ron | 5 + .../custom/theropodsmall/triplestrike.ron | 60 ++++++++++ .../entity/wild/aggressive/reefsnapper.ron | 11 ++ .../entity/wild/aggressive/rootsnapper.ron | 11 ++ .../{river_salamander.ron => elbst.ron} | 6 +- .../{sand_salamander.ron => salamander.ron} | 0 .../npc_weapons/unique/theropodsmall.ron | 21 ++++ .../creature/quad_low/reefsnapper.ron | 5 + .../creature/quad_low/rootsnapper.ron | 5 + assets/common/npc_names.ron | 4 + assets/voxygen/voxel/npc/elbst/male/chest.vox | 3 + .../voxygen/voxel/npc/elbst/male/foot_br.vox | 3 + .../voxygen/voxel/npc/elbst/male/foot_fr.vox | 3 + .../voxel/npc/elbst/male/head_lower.vox | 3 + .../voxel/npc/elbst/male/head_upper.vox | 3 + assets/voxygen/voxel/npc/elbst/male/jaw.vox | 3 + .../voxel/npc/elbst/male/tail_front.vox | 3 + .../voxel/npc/elbst/male/tail_rear.vox | 3 + .../voxel/npc/reefsnapper/male/foot_fr.vox | 2 +- .../voxel/npc/salamander/female/chest.vox | 3 - .../voxel/npc/salamander/female/foot_br.vox | 3 - .../voxel/npc/salamander/female/foot_fr.vox | 3 - .../npc/salamander/female/head_lower.vox | 3 - .../npc/salamander/female/head_upper.vox | 3 - .../voxel/npc/salamander/female/jaw.vox | 3 - .../npc/salamander/female/tail_front.vox | 3 - .../voxel/npc/salamander/female/tail_rear.vox | 3 - .../voxel/npc/salamander/male/chest.vox | 4 +- .../voxel/npc/salamander/male/foot_br.vox | 2 +- .../voxel/npc/salamander/male/foot_fr.vox | 2 +- .../voxel/npc/salamander/male/head_lower.vox | 2 +- .../voxel/npc/salamander/male/head_upper.vox | 4 +- .../voxygen/voxel/npc/salamander/male/jaw.vox | 4 +- .../voxel/npc/salamander/male/tail_front.vox | 4 +- .../voxel/npc/salamander/male/tail_rear.vox | 4 +- .../voxel/quadruped_low_central_manifest.ron | 82 ++++++++++--- .../voxel/quadruped_low_lateral_manifest.ron | 54 +++++++-- assets/world/wildlife/spawn/desert/hot.ron | 2 +- assets/world/wildlife/spawn/desert/rock.ron | 16 +++ .../wildlife/spawn/jungle/rainforest_area.ron | 1 + .../world/wildlife/spawn/temperate/river.ron | 2 +- .../world/wildlife/spawn/tropical/ocean.ron | 3 +- assets/world/wildlife/spawn/tropical/rock.ron | 4 +- assets/world/wildlife/spawn/tundra/rock.ron | 5 +- common/src/comp/agent.rs | 2 +- common/src/comp/body.rs | 2 + common/src/comp/body/quadruped_low.rs | 6 +- common/src/comp/inventory/loadout_builder.rs | 6 +- common/src/comp/pet.rs | 4 +- common/src/states/utils.rs | 1 + server/src/sys/agent.rs | 4 +- voxygen/anim/src/quadruped_low/mod.rs | 110 +++++++++--------- world/src/layer/cave.rs | 6 +- world/src/layer/wildlife.rs | 4 + 54 files changed, 384 insertions(+), 134 deletions(-) create mode 100644 assets/common/abilities/custom/theropodsmall/triplestrike.ron create mode 100644 assets/common/entity/wild/aggressive/reefsnapper.ron create mode 100644 assets/common/entity/wild/aggressive/rootsnapper.ron rename assets/common/entity/wild/peaceful/{river_salamander.ron => elbst.ron} (81%) rename assets/common/entity/wild/peaceful/{sand_salamander.ron => salamander.ron} (100%) create mode 100644 assets/common/items/npc_weapons/unique/theropodsmall.ron create mode 100644 assets/common/loot_tables/creature/quad_low/reefsnapper.ron create mode 100644 assets/common/loot_tables/creature/quad_low/rootsnapper.ron create mode 100644 assets/voxygen/voxel/npc/elbst/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/head_lower.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/head_upper.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/jaw.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/elbst/male/tail_rear.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/chest.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/foot_br.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/foot_fr.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/head_lower.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/head_upper.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/jaw.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/tail_front.vox delete mode 100644 assets/voxygen/voxel/npc/salamander/female/tail_rear.vox create mode 100644 assets/world/wildlife/spawn/desert/rock.ron diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index 6a9fe77d46..4e205599ee 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -271,6 +271,11 @@ secondary: "common.abilities.custom.theropodbasic.triplestrike", abilities: [], ), + Custom("Theropod Small"): ( + primary: "common.abilities.custom.theropodsmall.triplestrike", + secondary: "common.abilities.custom.theropodsmall.triplestrike", + abilities: [], + ), Custom("Theropod Bird"): ( primary: "common.abilities.custom.theropodbird.triplestrike", secondary: "common.abilities.custom.theropodbird.triplestrike", diff --git a/assets/common/abilities/custom/theropodsmall/triplestrike.ron b/assets/common/abilities/custom/theropodsmall/triplestrike.ron new file mode 100644 index 0000000000..983a8418d5 --- /dev/null +++ b/assets/common/abilities/custom/theropodsmall/triplestrike.ron @@ -0,0 +1,60 @@ +ComboMelee( + stage_data: [ + ( + stage: 1, + base_damage: 30.0, + damage_increase: 0, + base_poise_damage: 17.5, + poise_damage_increase: 0, + knockback: 3.0, + range: 4.5, + angle: 30.0, + base_buildup_duration: 1.3, + base_swing_duration: 0.15, + hit_timing: 0.5, + base_recover_duration: 0.5, + forward_movement: 1.0, + damage_kind: Crushing, + ), + ( + stage: 2, + base_damage: 30.0, + damage_increase: 0, + base_poise_damage: 20.5, + poise_damage_increase: 0, + knockback: 3.0, + range: 4.5, + angle: 30.0, + base_buildup_duration: 0.2, + base_swing_duration: 0.15, + hit_timing: 0.5, + base_recover_duration: 0.3, + forward_movement: 1.0, + damage_kind: Crushing, + ), + ( + stage: 3, + base_damage: 30.0, + damage_increase: 0, + base_poise_damage: 22.5, + poise_damage_increase: 0, + knockback: 25.0, + range: 5.5, + angle: 30.0, + base_buildup_duration: 0.4, + base_swing_duration: 0.125, + hit_timing: 0.5, + base_recover_duration: 1.6, + forward_movement: 1.0, + damage_kind: Crushing, + ), + ], + initial_energy_gain: 0, + max_energy_gain: 0, + energy_increase: 0, + speed_increase: 0.0, + max_speed_increase: 0.0, + scales_from_combo: 0, + is_interruptible: false, + ori_modifier: 0.7, +) \ No newline at end of file diff --git a/assets/common/entity/wild/aggressive/reefsnapper.ron b/assets/common/entity/wild/aggressive/reefsnapper.ron new file mode 100644 index 0000000000..4e3b6627e2 --- /dev/null +++ b/assets/common/entity/wild/aggressive/reefsnapper.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("reefsnapper"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.creature.quad_low.reefsnapper"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/wild/aggressive/rootsnapper.ron b/assets/common/entity/wild/aggressive/rootsnapper.ron new file mode 100644 index 0000000000..c27d275ffd --- /dev/null +++ b/assets/common/entity/wild/aggressive/rootsnapper.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("rootsnapper"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.creature.quad_low.rootsnapper"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/wild/peaceful/river_salamander.ron b/assets/common/entity/wild/peaceful/elbst.ron similarity index 81% rename from assets/common/entity/wild/peaceful/river_salamander.ron rename to assets/common/entity/wild/peaceful/elbst.ron index 45aff740fb..8562c64738 100644 --- a/assets/common/entity/wild/peaceful/river_salamander.ron +++ b/assets/common/entity/wild/peaceful/elbst.ron @@ -2,8 +2,8 @@ ( name: Name("Elbst"), body: Exact(QuadrupedLow(( - species: Salamander, - body_type: Female, + species: Elbst, + body_type: Male, ))), alignment: Alignment(Wild), loot: LootTable("common.loot_tables.creature.quad_low.elbst"), @@ -11,4 +11,4 @@ loadout: FromBody, ), meta: [], -) \ No newline at end of file +) diff --git a/assets/common/entity/wild/peaceful/sand_salamander.ron b/assets/common/entity/wild/peaceful/salamander.ron similarity index 100% rename from assets/common/entity/wild/peaceful/sand_salamander.ron rename to assets/common/entity/wild/peaceful/salamander.ron diff --git a/assets/common/items/npc_weapons/unique/theropodsmall.ron b/assets/common/items/npc_weapons/unique/theropodsmall.ron new file mode 100644 index 0000000000..62123ad329 --- /dev/null +++ b/assets/common/items/npc_weapons/unique/theropodsmall.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Theropod Small", + description: "testing123", + kind: Tool(( + kind: Natural, + hands: Two, + stats: ( + equip_time_secs: 0.01, + power: 1.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.0625, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Low, + tags: [], + ability_spec: Some(Custom("Theropod Small")), +) \ No newline at end of file diff --git a/assets/common/loot_tables/creature/quad_low/reefsnapper.ron b/assets/common/loot_tables/creature/quad_low/reefsnapper.ron new file mode 100644 index 0000000000..a33d0308ab --- /dev/null +++ b/assets/common/loot_tables/creature/quad_low/reefsnapper.ron @@ -0,0 +1,5 @@ +[ + (2.0, Item("common.items.food.meat.tough_raw")), + (3.0, Item("common.items.crafting_ing.hide.carapace")), + (1.0, Item("common.items.crafting_ing.coral_branch")), +] \ No newline at end of file diff --git a/assets/common/loot_tables/creature/quad_low/rootsnapper.ron b/assets/common/loot_tables/creature/quad_low/rootsnapper.ron new file mode 100644 index 0000000000..2bf9cbe9b3 --- /dev/null +++ b/assets/common/loot_tables/creature/quad_low/rootsnapper.ron @@ -0,0 +1,5 @@ +[ + (2.0, Item("common.items.food.meat.tough_raw")), + (3.0, Item("common.items.crafting_ing.hide.carapace")), + (1.0, Item("common.items.crafting_ing.animal_misc.lively_vine")), +] \ No newline at end of file diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index d471f3bbe4..99d0b0681b 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -1185,6 +1185,10 @@ keyword: "salamander", generic: "Salamander" ), + elbst: ( + keyword: "elbst", + generic: "Elbst" + ), monitor: ( keyword: "monitor", generic: "Monitor" diff --git a/assets/voxygen/voxel/npc/elbst/male/chest.vox b/assets/voxygen/voxel/npc/elbst/male/chest.vox new file mode 100644 index 0000000000..22af2b69a6 --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee51d809c2aca42f0c6fdc46027c9b33d0a95af75bf0a8579c16786a05a19031 +size 4696 diff --git a/assets/voxygen/voxel/npc/elbst/male/foot_br.vox b/assets/voxygen/voxel/npc/elbst/male/foot_br.vox new file mode 100644 index 0000000000..3a5deefea3 --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/foot_br.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cafe678aa536939f1a027d3c9c8b8f296cd3f535a70c56c5f72cbc802cdb6a56 +size 1260 diff --git a/assets/voxygen/voxel/npc/elbst/male/foot_fr.vox b/assets/voxygen/voxel/npc/elbst/male/foot_fr.vox new file mode 100644 index 0000000000..e68328e7ef --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/foot_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab4a353c17629a085c23a6da38402af8ef642acb82d3324134300f9168512a8c +size 1268 diff --git a/assets/voxygen/voxel/npc/elbst/male/head_lower.vox b/assets/voxygen/voxel/npc/elbst/male/head_lower.vox new file mode 100644 index 0000000000..5f4102c45c --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/head_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bbb5fd2f36770cf69162a2da72e29b10c60f927235de56c7b0866359d19e861 +size 1608 diff --git a/assets/voxygen/voxel/npc/elbst/male/head_upper.vox b/assets/voxygen/voxel/npc/elbst/male/head_upper.vox new file mode 100644 index 0000000000..66e69ddf25 --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/head_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f390e583f17db94502aee1ef20f786fee23e9688a41b81ca82d9a0d72356e21f +size 3032 diff --git a/assets/voxygen/voxel/npc/elbst/male/jaw.vox b/assets/voxygen/voxel/npc/elbst/male/jaw.vox new file mode 100644 index 0000000000..365d8a4cca --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/jaw.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d87667aaf0f64890b0a2812dbb05bff6c103373399f47379c5905dd2a398fb81 +size 2040 diff --git a/assets/voxygen/voxel/npc/elbst/male/tail_front.vox b/assets/voxygen/voxel/npc/elbst/male/tail_front.vox new file mode 100644 index 0000000000..51d464df39 --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/tail_front.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d76e69b888e1aabc8628bcd5c369a2574e391b272161cdaa756c7699572631b +size 1988 diff --git a/assets/voxygen/voxel/npc/elbst/male/tail_rear.vox b/assets/voxygen/voxel/npc/elbst/male/tail_rear.vox new file mode 100644 index 0000000000..4c908e2b93 --- /dev/null +++ b/assets/voxygen/voxel/npc/elbst/male/tail_rear.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80aeba8583353a90663ce83a2030d9599154ccecf397e47c6d22eff87c34e5dd +size 2208 diff --git a/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox b/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox index 519e487117..da6444faeb 100644 --- a/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox +++ b/assets/voxygen/voxel/npc/reefsnapper/male/foot_fr.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e62fce92e139290bd843604b0463286fc560f4db97bf420d97b8863bc0ec800 +oid sha256:5181ad19eb91f84a0ca0d787679d6f1ac28ea710c3c24fb32d7f0a1efe3cca22 size 2404 diff --git a/assets/voxygen/voxel/npc/salamander/female/chest.vox b/assets/voxygen/voxel/npc/salamander/female/chest.vox deleted file mode 100644 index a58798bf77..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/chest.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:952fc49ba90cb07242e4164767a3c753ab74c5dead9d585b71d0dfd3e145a08f -size 4536 diff --git a/assets/voxygen/voxel/npc/salamander/female/foot_br.vox b/assets/voxygen/voxel/npc/salamander/female/foot_br.vox deleted file mode 100644 index 0b4f1a8a0c..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/foot_br.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:681c1b0501ab17079a4b018265950b7183524b6375ecaf63743069a5875df73f -size 1244 diff --git a/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox b/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox deleted file mode 100644 index 871875e0d7..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/foot_fr.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:139e71370808c38e82624e88d93ff691b4a573565424380107dfd2ffc51d6d90 -size 1268 diff --git a/assets/voxygen/voxel/npc/salamander/female/head_lower.vox b/assets/voxygen/voxel/npc/salamander/female/head_lower.vox deleted file mode 100644 index e80d87d18c..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/head_lower.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:226483231a86635979bc382498ed2ed92178bad83d8d26b1ce3cd5a331ca9a07 -size 1616 diff --git a/assets/voxygen/voxel/npc/salamander/female/head_upper.vox b/assets/voxygen/voxel/npc/salamander/female/head_upper.vox deleted file mode 100644 index 77b1ad274f..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/head_upper.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23cf7b5d2fb775189ae73daac879dd14ae07b4a17e714cfa32bbc1c001eacebd -size 2632 diff --git a/assets/voxygen/voxel/npc/salamander/female/jaw.vox b/assets/voxygen/voxel/npc/salamander/female/jaw.vox deleted file mode 100644 index f62946b658..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/jaw.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5daf93e147bcbf8909f0c4950b3c7cb77f8a4c900127cf3c7b0eeef092f119e2 -size 2240 diff --git a/assets/voxygen/voxel/npc/salamander/female/tail_front.vox b/assets/voxygen/voxel/npc/salamander/female/tail_front.vox deleted file mode 100644 index 43042c8619..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/tail_front.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:837bc286eacc45aaad97aac778f5ecc024f2a298a98b40336a6b66a9e62857d2 -size 2276 diff --git a/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox b/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox deleted file mode 100644 index 03779fcf66..0000000000 --- a/assets/voxygen/voxel/npc/salamander/female/tail_rear.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0358f1adedfab8ba38e71daeded7b0bf8213e576607d1f121ca652cf73a73f1d -size 1880 diff --git a/assets/voxygen/voxel/npc/salamander/male/chest.vox b/assets/voxygen/voxel/npc/salamander/male/chest.vox index d5a8d9f6be..a58798bf77 100644 --- a/assets/voxygen/voxel/npc/salamander/male/chest.vox +++ b/assets/voxygen/voxel/npc/salamander/male/chest.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:23b8658cf742f615f64fbd291d666ec882c95443db9cd8dc50cb084be796b519 -size 4252 +oid sha256:952fc49ba90cb07242e4164767a3c753ab74c5dead9d585b71d0dfd3e145a08f +size 4536 diff --git a/assets/voxygen/voxel/npc/salamander/male/foot_br.vox b/assets/voxygen/voxel/npc/salamander/male/foot_br.vox index c87f59f497..0b4f1a8a0c 100644 --- a/assets/voxygen/voxel/npc/salamander/male/foot_br.vox +++ b/assets/voxygen/voxel/npc/salamander/male/foot_br.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0aab9501144fad79f225a664be47ee17e11ce5c91b08e5fc9c7a3559462a281d +oid sha256:681c1b0501ab17079a4b018265950b7183524b6375ecaf63743069a5875df73f size 1244 diff --git a/assets/voxygen/voxel/npc/salamander/male/foot_fr.vox b/assets/voxygen/voxel/npc/salamander/male/foot_fr.vox index 5b3420a77e..871875e0d7 100644 --- a/assets/voxygen/voxel/npc/salamander/male/foot_fr.vox +++ b/assets/voxygen/voxel/npc/salamander/male/foot_fr.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:527de48f9ef2aece82a06ed8c2c1c5c8367371794514275ed53ec73ec51a6c1a +oid sha256:139e71370808c38e82624e88d93ff691b4a573565424380107dfd2ffc51d6d90 size 1268 diff --git a/assets/voxygen/voxel/npc/salamander/male/head_lower.vox b/assets/voxygen/voxel/npc/salamander/male/head_lower.vox index 9f6c2005f6..e80d87d18c 100644 --- a/assets/voxygen/voxel/npc/salamander/male/head_lower.vox +++ b/assets/voxygen/voxel/npc/salamander/male/head_lower.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc7245e00f65c294d3d7bac0e09de567672414c451b46c9d31fa87a37c9b7e54 +oid sha256:226483231a86635979bc382498ed2ed92178bad83d8d26b1ce3cd5a331ca9a07 size 1616 diff --git a/assets/voxygen/voxel/npc/salamander/male/head_upper.vox b/assets/voxygen/voxel/npc/salamander/male/head_upper.vox index c3984a9a9a..77b1ad274f 100644 --- a/assets/voxygen/voxel/npc/salamander/male/head_upper.vox +++ b/assets/voxygen/voxel/npc/salamander/male/head_upper.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8d983160c51b563b82fcb90da92214132d471a0665f5f375229ad4bbccf45f9 -size 2588 +oid sha256:23cf7b5d2fb775189ae73daac879dd14ae07b4a17e714cfa32bbc1c001eacebd +size 2632 diff --git a/assets/voxygen/voxel/npc/salamander/male/jaw.vox b/assets/voxygen/voxel/npc/salamander/male/jaw.vox index 3bbff427dc..f62946b658 100644 --- a/assets/voxygen/voxel/npc/salamander/male/jaw.vox +++ b/assets/voxygen/voxel/npc/salamander/male/jaw.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:59160f0e1526941c90229593c9757d535b878bd9207caa0448f88623c2f1af05 -size 2092 +oid sha256:5daf93e147bcbf8909f0c4950b3c7cb77f8a4c900127cf3c7b0eeef092f119e2 +size 2240 diff --git a/assets/voxygen/voxel/npc/salamander/male/tail_front.vox b/assets/voxygen/voxel/npc/salamander/male/tail_front.vox index 500bddec40..43042c8619 100644 --- a/assets/voxygen/voxel/npc/salamander/male/tail_front.vox +++ b/assets/voxygen/voxel/npc/salamander/male/tail_front.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66b863e935607b337eca083145ad3a9971ca625c3aec95166bc3c87e5c49f967 -size 2244 +oid sha256:837bc286eacc45aaad97aac778f5ecc024f2a298a98b40336a6b66a9e62857d2 +size 2276 diff --git a/assets/voxygen/voxel/npc/salamander/male/tail_rear.vox b/assets/voxygen/voxel/npc/salamander/male/tail_rear.vox index 46b153167e..03779fcf66 100644 --- a/assets/voxygen/voxel/npc/salamander/male/tail_rear.vox +++ b/assets/voxygen/voxel/npc/salamander/male/tail_rear.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8201aefb1fc1253583b19f4dc4a41be89b39b85ec8323fd0a8eba1e2bf83db90 -size 1872 +oid sha256:0358f1adedfab8ba38e71daeded7b0bf8213e576607d1f121ca652cf73a73f1d +size 1880 diff --git a/assets/voxygen/voxel/quadruped_low_central_manifest.ron b/assets/voxygen/voxel/quadruped_low_central_manifest.ron index 5390e20698..f83cc08420 100644 --- a/assets/voxygen/voxel/quadruped_low_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_low_central_manifest.ron @@ -184,27 +184,79 @@ (Salamander, Female): ( upper: ( offset: (-6.5, 0.0, -2.0), - central: ("npc.salamander.female.head_upper"), + central: ("npc.salamander.male.head_upper"), ), lower: ( - offset: (-4.5, -2.0, -3.0), - central: ("npc.salamander.female.head_lower"), + offset: (-4.5, -1.5, -3.0), + central: ("npc.salamander.male.head_lower"), ), jaw: ( - offset: (-6.5, 0.0, -3.5,), - central: ("npc.salamander.female.jaw"), + offset: (-6.5, 0.0, -3.0), + central: ("npc.salamander.male.jaw"), ), chest: ( offset: (-6.5, -8.5, -3.0), - central: ("npc.salamander.female.chest"), + central: ("npc.salamander.male.chest"), ), tail_rear: ( - offset: (-3.5, -13.0, -2.5), - central: ("npc.salamander.female.tail_rear"), + offset: (-3.5, -13.0, -3.0), + central: ("npc.salamander.male.tail_rear"), + ), + tail_front: ( + offset: (-4.5, -9.0, -3.0), + central: ("npc.salamander.male.tail_front"), + ), + ), + (Elbst, Male): ( + upper: ( + offset: (-9.5, 0.0, -2.0), + central: ("npc.elbst.male.head_upper"), + ), + lower: ( + offset: (-4.5, -1.5, -3.0), + central: ("npc.elbst.male.head_lower"), + ), + jaw: ( + offset: (-6.5, 0.0, -2.0), + central: ("npc.elbst.male.jaw"), + ), + chest: ( + offset: (-8.5, -8.5, -3.0), + central: ("npc.elbst.male.chest"), + ), + tail_rear: ( + offset: (-6.5, -13.0, -2.5), + central: ("npc.elbst.male.tail_rear"), ), tail_front: ( offset: (-5.5, -8.0, -3.0), - central: ("npc.salamander.female.tail_front"), + central: ("npc.elbst.male.tail_front"), + ), + ), + (Elbst, Female): ( + upper: ( + offset: (-9.5, 0.0, -2.0), + central: ("npc.elbst.male.head_upper"), + ), + lower: ( + offset: (-4.5, -1.5, -3.0), + central: ("npc.elbst.male.head_lower"), + ), + jaw: ( + offset: (-6.5, 0.0, -2.0), + central: ("npc.elbst.male.jaw"), + ), + chest: ( + offset: (-8.5, -8.5, -3.0), + central: ("npc.elbst.male.chest"), + ), + tail_rear: ( + offset: (-6.5, -13.0, -2.5), + central: ("npc.elbst.male.tail_rear"), + ), + tail_front: ( + offset: (-5.5, -8.0, -3.0), + central: ("npc.elbst.male.tail_front"), ), ), (Monitor, Male): ( @@ -470,15 +522,15 @@ ), (Reefsnapper, Male): ( upper: ( - offset: (-3.5, 1.5, -4.0), + offset: (-3.5, -2.5, -6.0), central: ("npc.reefsnapper.male.head_upper"), ), lower: ( - offset: (-3.5, -1.0, -6.0), + offset: (-3.5, -3.0, -6.0), central: ("npc.reefsnapper.male.head_lower"), ), jaw: ( - offset: (-4.5, 7.0, -5.0), + offset: (-4.5, 4.0, -4.0), central: ("npc.reefsnapper.male.jaw"), ), chest: ( @@ -496,15 +548,15 @@ ), (Reefsnapper, Female): ( upper: ( - offset: (-3.5, 1.5, -4.0), + offset: (-3.5, -2.5, -6.0), central: ("npc.reefsnapper.male.head_upper"), ), lower: ( - offset: (-3.5, -1.0, -6.0), + offset: (-3.5, -3.0, -6.0), central: ("npc.reefsnapper.male.head_lower"), ), jaw: ( - offset: (-4.5, 7.0, -5.0), + offset: (-4.5, 4.0, -4.0), central: ("npc.reefsnapper.male.jaw"), ), chest: ( diff --git a/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron index 5a43cf79aa..85e6f02208 100644 --- a/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_low_lateral_manifest.ron @@ -128,19 +128,55 @@ (Salamander, Female): ( front_left: ( offset: (-6.0, 0.0, -3.0), - lateral: ("npc.salamander.female.foot_fr", false), + lateral: ("npc.salamander.male.foot_fr", false), ), front_right: ( offset: (0.0, 0.0, -3.0), - lateral: ("npc.salamander.female.foot_fr", false), + lateral: ("npc.salamander.male.foot_fr", false), ), back_left: ( - offset: (-7.5, 0.0, -3.0), - lateral: ("npc.salamander.female.foot_br", false), + offset: (-7.0, 0.0, -3.0), + lateral: ("npc.salamander.male.foot_br", false), + ), + back_right: ( + offset: (-0.0, 0.0, -3.0), + lateral: ("npc.salamander.male.foot_br", false), + ), + ), + (Elbst, Male): ( + front_left: ( + offset: (-6.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_fr", false), + ), + front_right: ( + offset: (0.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_fr", false), + ), + back_left: ( + offset: (-8.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_br", false), ), back_right: ( offset: (0.0, 0.0, -3.0), - lateral: ("npc.salamander.female.foot_br", false), + lateral: ("npc.elbst.male.foot_br", false), + ), + ), + (Elbst, Female): ( + front_left: ( + offset: (-6.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_fr", false), + ), + front_right: ( + offset: (0.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_fr", false), + ), + back_left: ( + offset: (-8.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_br", false), + ), + back_right: ( + offset: (0.0, 0.0, -3.0), + lateral: ("npc.elbst.male.foot_br", false), ), ), (Monitor, Male): ( @@ -325,11 +361,11 @@ ), (Reefsnapper, Male): ( front_left: ( - offset: (-12.0, 0.0, -10.0), + offset: (-12.0, -9.0, -10.0), lateral: ("npc.reefsnapper.male.foot_fr", false), ), front_right: ( - offset: (-3.0, 0.0, -10.0), + offset: (-3.0, -9.0, -10.0), lateral: ("npc.reefsnapper.male.foot_fr", false), ), back_left: ( @@ -343,11 +379,11 @@ ), (Reefsnapper, Female): ( front_left: ( - offset: (-12.0, 0.0, -10.0), + offset: (-12.0, -9.0, -10.0), lateral: ("npc.reefsnapper.male.foot_fr", false), ), front_right: ( - offset: (-3.0, 0.0, -10.0), + offset: (-3.0, -9.0, -10.0), lateral: ("npc.reefsnapper.male.foot_fr", false), ), back_left: ( diff --git a/assets/world/wildlife/spawn/desert/hot.ron b/assets/world/wildlife/spawn/desert/hot.ron index b474214731..9b087d09e7 100644 --- a/assets/world/wildlife/spawn/desert/hot.ron +++ b/assets/world/wildlife/spawn/desert/hot.ron @@ -7,7 +7,7 @@ SpawnEntry ( // Casual (2, (1, 1, "common.entity.wild.peaceful.camel")), (2, (1, 1, "common.entity.wild.peaceful.sand_hare")), - (2, (1, 1, "common.entity.wild.peaceful.sand_salamander")), + (2, (1, 1, "common.entity.wild.peaceful.salamander")), (2, (1, 1, "common.entity.wild.peaceful.gecko")), // Rare (1, (1, 1, "common.entity.wild.peaceful.crawler_sand")), diff --git a/assets/world/wildlife/spawn/desert/rock.ron b/assets/world/wildlife/spawn/desert/rock.ron new file mode 100644 index 0000000000..3508717bfd --- /dev/null +++ b/assets/world/wildlife/spawn/desert/rock.ron @@ -0,0 +1,16 @@ +SpawnEntry ( + name: "Desert rocky animals.", + note: "Search for the rocks in desert and you will find them.", + rules: [ + Pack( + groups: [ + (1, (1, 1, "common.entity.wild.aggressive.rocksnapper")), + (1, (1, 1, "common.entity.wild.aggressive.dodarock")), + (2, (1, 3, "common.entity.wild.peaceful.gecko")), + (2, (1, 2, "common.entity.wild.peaceful.sand_hare")), + ], + spawn_mode: Land, + day_period: [Night, Morning, Noon, Evening], + ), + ], +) \ No newline at end of file diff --git a/assets/world/wildlife/spawn/jungle/rainforest_area.ron b/assets/world/wildlife/spawn/jungle/rainforest_area.ron index f939269428..1bc0dcaccc 100644 --- a/assets/world/wildlife/spawn/jungle/rainforest_area.ron +++ b/assets/world/wildlife/spawn/jungle/rainforest_area.ron @@ -13,6 +13,7 @@ SpawnEntry ( (1, (1, 1, "common.entity.wild.aggressive.horn_beetle")), (1, (1, 1, "common.entity.wild.aggressive.stag_beetle")), (1, (1, 1, "common.entity.wild.peaceful.crawler_moss")), + (1, (1, 1, "common.entity.wild.aggressive.rootsnapper")), ], spawn_mode: Land, day_period: [Morning, Noon, Evening], diff --git a/assets/world/wildlife/spawn/temperate/river.ron b/assets/world/wildlife/spawn/temperate/river.ron index c5472b7b6d..6fb860498a 100644 --- a/assets/world/wildlife/spawn/temperate/river.ron +++ b/assets/world/wildlife/spawn/temperate/river.ron @@ -5,7 +5,7 @@ SpawnEntry ( Pack( groups: [ (5, (1, 1, "common.entity.wild.peaceful.beaver")), - (5, (1, 1, "common.entity.wild.peaceful.river_salamander")), + (5, (1, 1, "common.entity.wild.peaceful.elbst")), (5, (1, 1, "common.entity.wild.peaceful.duck")), (1, (1, 1, "common.entity.wild.peaceful.kelpie")), (1, (1, 1, "common.entity.wild.aggressive.hakulaq")), diff --git a/assets/world/wildlife/spawn/tropical/ocean.ron b/assets/world/wildlife/spawn/tropical/ocean.ron index 16ad227e4e..a272015bc4 100644 --- a/assets/world/wildlife/spawn/tropical/ocean.ron +++ b/assets/world/wildlife/spawn/tropical/ocean.ron @@ -4,7 +4,8 @@ SpawnEntry ( rules: [ Pack( groups: [ - (1, (1, 3, "common.entity.wild.aggressive.sea_crocodile")), + (3, (1, 3, "common.entity.wild.aggressive.sea_crocodile")), + (1, (1, 1, "common.entity.wild.aggressive.reefsnapper")), ], spawn_mode: Water, day_period: [Night, Morning, Noon, Evening], diff --git a/assets/world/wildlife/spawn/tropical/rock.ron b/assets/world/wildlife/spawn/tropical/rock.ron index 1a5c848147..0083e2e48d 100644 --- a/assets/world/wildlife/spawn/tropical/rock.ron +++ b/assets/world/wildlife/spawn/tropical/rock.ron @@ -4,10 +4,10 @@ SpawnEntry ( rules: [ Pack( groups: [ - (1, (1, 1, "common.entity.wild.aggressive.dodarock")), + (1, (1, 3, "common.entity.wild.peaceful.gecko")), ], spawn_mode: Land, day_period: [Night, Morning, Noon, Evening], ), ], -) +) \ No newline at end of file diff --git a/assets/world/wildlife/spawn/tundra/rock.ron b/assets/world/wildlife/spawn/tundra/rock.ron index f723581e55..099e8e3040 100644 --- a/assets/world/wildlife/spawn/tundra/rock.ron +++ b/assets/world/wildlife/spawn/tundra/rock.ron @@ -4,10 +4,11 @@ SpawnEntry ( rules: [ Pack( groups: [ - (1, (1, 1, "common.entity.wild.aggressive.rocksnapper")), + (1, (1, 1, "common.entity.wild.peaceful.jackalope")), + (1, (1, 1, "common.entity.wild.peaceful.arctic_hare")), ], spawn_mode: Land, day_period: [Night, Morning, Noon, Evening], ), ], -) +) \ No newline at end of file diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 7e47b8d997..385025ce75 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -231,7 +231,7 @@ impl<'a> From<&'a Body> for Psyche { _ => 0.3, }, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { - quadruped_low::Species::Salamander => 0.2, + quadruped_low::Species::Salamander | quadruped_low::Species::Elbst => 0.2, quadruped_low::Species::Monitor => 0.3, quadruped_low::Species::Pangolin => 0.6, quadruped_low::Species::Tortoise => 0.2, diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 657c5aa35c..19ca4810e9 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -312,6 +312,7 @@ impl Body { quadruped_low::Species::Monitor => 100.0, quadruped_low::Species::Pangolin => 100.0, quadruped_low::Species::Salamander => 65.0, + quadruped_low::Species::Elbst => 65.0, quadruped_low::Species::Tortoise => 200.0, _ => 200.0, }, @@ -480,6 +481,7 @@ impl Body { quadruped_low::Species::Sandshark => Vec3::new(2.1, 4.3, 1.7), quadruped_low::Species::Basilisk => Vec3::new(2.7, 6.0, 2.9), quadruped_low::Species::Salamander => Vec3::new(1.7, 4.0, 1.3), + quadruped_low::Species::Elbst => Vec3::new(1.7, 4.0, 1.3), quadruped_low::Species::Tortoise => Vec3::new(1.7, 2.7, 1.5), _ => Vec3::new(1.0, 1.6, 1.3), }, diff --git a/common/src/comp/body/quadruped_low.rs b/common/src/comp/body/quadruped_low.rs index eb9665aa4b..2211ec9065 100644 --- a/common/src/comp/body/quadruped_low.rs +++ b/common/src/comp/body/quadruped_low.rs @@ -58,6 +58,7 @@ make_case_elim!( Rocksnapper = 16, Rootsnapper = 17, Reefsnapper = 18, + Elbst = 19, } ); @@ -70,6 +71,7 @@ pub struct AllSpecies { pub sea_crocodile: SpeciesMeta, pub alligator: SpeciesMeta, pub salamander: SpeciesMeta, + pub elbst: SpeciesMeta, pub monitor: SpeciesMeta, pub asp: SpeciesMeta, pub tortoise: SpeciesMeta, @@ -97,6 +99,7 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::SeaCrocodile => &self.sea_crocodile, Species::Alligator => &self.alligator, Species::Salamander => &self.salamander, + Species::Elbst => &self.elbst, Species::Monitor => &self.monitor, Species::Asp => &self.asp, Species::Tortoise => &self.tortoise, @@ -116,11 +119,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies } } -pub const ALL_SPECIES: [Species; 19] = [ +pub const ALL_SPECIES: [Species; 20] = [ Species::Crocodile, Species::SeaCrocodile, Species::Alligator, Species::Salamander, + Species::Elbst, Species::Monitor, Species::Asp, Species::Tortoise, diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 53e175e57a..067142943e 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -585,7 +585,8 @@ fn default_main_tool(body: &Body) -> Item { quadruped_low::Species::Crocodile | quadruped_low::Species::SeaCrocodile | quadruped_low::Species::Alligator - | quadruped_low::Species::Salamander => Some(Item::new_from_asset_expect( + | quadruped_low::Species::Salamander + | quadruped_low::Species::Elbst => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.quadlowtail", )), quadruped_low::Species::Monitor | quadruped_low::Species::Pangolin => Some( @@ -616,6 +617,9 @@ fn default_main_tool(body: &Body) -> Item { theropod::Species::Yale => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.theropodcharge", )), + theropod::Species::Dodarock => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.theropodsmall", + )), _ => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.theropodbasic", )), diff --git a/common/src/comp/pet.rs b/common/src/comp/pet.rs index 63ab096063..8f8a308513 100644 --- a/common/src/comp/pet.rs +++ b/common/src/comp/pet.rs @@ -90,7 +90,9 @@ pub fn is_mountable(mount: &Body, rider: Option<&Body>) -> bool { }, Body::QuadrupedLow(body) => matches!( body.species, - quadruped_low::Species::Salamander | quadruped_low::Species::Tortoise + quadruped_low::Species::Salamander + | quadruped_low::Species::Elbst + | quadruped_low::Species::Tortoise ), _ => false, } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 7641f091c3..17dd433e61 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -117,6 +117,7 @@ impl Body { quadruped_low::Species::SeaCrocodile => 120.0, quadruped_low::Species::Alligator => 110.0, quadruped_low::Species::Salamander => 85.0, + quadruped_low::Species::Elbst => 85.0, quadruped_low::Species::Monitor => 160.0, quadruped_low::Species::Asp => 110.0, quadruped_low::Species::Tortoise => 60.0, diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 738a6cb1e6..2696580352 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -948,7 +948,9 @@ impl<'a> AgentData<'a> { "Quad Low Tail" | "Husk Brute" => Tactic::TailSlap, "Quad Low Quick" => Tactic::QuadLowQuick, "Quad Low Basic" => Tactic::QuadLowBasic, - "Theropod Basic" | "Theropod Bird" => Tactic::Theropod, + "Theropod Basic" | "Theropod Bird" | "Theropod Small" => { + Tactic::Theropod + }, // Arthropods "Antlion" => Tactic::ArthropodMelee, "Tarantula" | "Horn Beetle" => Tactic::ArthropodAmbush, diff --git a/voxygen/anim/src/quadruped_low/mod.rs b/voxygen/anim/src/quadruped_low/mod.rs index 2e97b5061c..054037f3b2 100644 --- a/voxygen/anim/src/quadruped_low/mod.rs +++ b/voxygen/anim/src/quadruped_low/mod.rs @@ -148,14 +148,14 @@ impl Default for SkeletonAttr { impl<'a> From<&'a Body> for SkeletonAttr { fn from(body: &'a Body) -> Self { - use comp::quadruped_low::{BodyType::*, Species::*}; + use comp::quadruped_low::Species::*; Self { head_upper: match (body.species, body.body_type) { (Crocodile, _) => (1.5, 2.0), (SeaCrocodile, _) => (1.5, 2.0), (Alligator, _) => (0.5, 2.0), - (Salamander, Male) => (0.5, 2.5), - (Salamander, Female) => (0.5, 1.0), + (Salamander, _) => (0.5, 1.0), + (Elbst, _) => (0.5, 1.0), (Monitor, _) => (5.5, 3.0), (Asp, _) => (4.5, 10.5), (Tortoise, _) => (5.0, 1.0), @@ -176,8 +176,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (8.0, 0.0), (SeaCrocodile, _) => (8.0, 0.0), (Alligator, _) => (9.0, 0.25), - (Salamander, Male) => (9.0, 0.0), - (Salamander, Female) => (9.0, 0.0), + (Salamander, _) => (9.0, 0.0), + (Elbst, _) => (9.0, 0.0), (Monitor, _) => (7.0, 0.0), (Asp, _) => (6.0, -2.5), (Tortoise, _) => (12.0, -3.5), @@ -198,8 +198,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (2.5, -3.0), (SeaCrocodile, _) => (2.5, -3.0), (Alligator, _) => (2.5, -2.0), - (Salamander, Male) => (0.0, -2.0), - (Salamander, Female) => (0.5, -1.0), + (Salamander, _) => (0.5, -1.0), + (Elbst, _) => (0.5, -1.0), (Monitor, _) => (3.0, -1.0), (Asp, _) => (2.0, -2.0), (Tortoise, _) => (-3.5, -2.0), @@ -220,8 +220,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (0.0, 5.0), (SeaCrocodile, _) => (0.0, 5.0), (Alligator, _) => (0.0, 5.0), - (Salamander, Male) => (0.0, 5.0), - (Salamander, Female) => (0.0, 5.0), + (Salamander, _) => (0.0, 5.0), + (Elbst, _) => (0.0, 5.0), (Monitor, _) => (0.0, 5.0), (Asp, _) => (0.0, 8.0), (Tortoise, _) => (0.0, 11.0), @@ -242,8 +242,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (-12.5, -1.0), (SeaCrocodile, _) => (-12.5, -1.0), (Alligator, _) => (-13.0, -1.0), - (Salamander, Male) => (-8.0, 0.0), - (Salamander, Female) => (-6.5, 0.0), + (Salamander, _) => (-6.5, 0.0), + (Elbst, _) => (-6.5, 0.0), (Monitor, _) => (-12.0, 0.0), (Asp, _) => (-14.0, -2.0), (Tortoise, _) => (-10.0, -1.5), @@ -264,8 +264,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (-6.0, 0.0), (SeaCrocodile, _) => (-6.0, 0.0), (Alligator, _) => (-5.0, 0.0), - (Salamander, Male) => (-7.5, 0.0), - (Salamander, Female) => (-7.0, 0.0), + (Salamander, _) => (-7.5, 0.0), + (Elbst, _) => (-7.0, 0.0), (Monitor, _) => (-6.5, 0.0), (Asp, _) => (-6.0, -2.0), (Tortoise, _) => (-13.0, -3.5), @@ -286,8 +286,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (3.5, 6.0, -1.0), (SeaCrocodile, _) => (3.5, 6.0, -1.0), (Alligator, _) => (4.5, 4.25, -1.0), - (Salamander, Male) => (5.0, 5.0, -2.0), - (Salamander, Female) => (5.0, 4.5, -2.0), + (Salamander, _) => (5.0, 4.5, -2.0), + (Elbst, _) => (5.0, 4.5, -2.0), (Monitor, _) => (3.0, 5.0, 0.0), (Asp, _) => (1.5, 4.0, -1.0), (Tortoise, _) => (5.5, 6.5, -3.0), @@ -308,8 +308,8 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Crocodile, _) => (3.5, -6.0, -1.0), (SeaCrocodile, _) => (3.5, -6.0, -1.0), (Alligator, _) => (4.5, -5.5, -1.0), - (Salamander, Male) => (4.0, -6.0, -2.0), - (Salamander, Female) => (3.0, -6.0, -2.0), + (Salamander, _) => (3.0, -6.0, -2.0), + (Elbst, _) => (3.0, -6.0, -2.0), (Monitor, _) => (2.5, -6.5, 0.0), (Asp, _) => (2.5, -5.5, -1.0), (Tortoise, _) => (5.5, -11.5, -3.0), @@ -331,54 +331,56 @@ impl<'a> From<&'a Body> for SkeletonAttr { _ => (0.0, 1.0), }, scaler: match (body.species, body.body_type) { - (Crocodile, _) => 1.05, - (SeaCrocodile, _) => 1.05, - (Alligator, _) => 1.12, - (Salamander, _) => 1.12, - (Monitor, _) => 0.9, - (Asp, _) => 1.12, - (Rocksnapper, _) => 1.12, - (Rootsnapper, _) => 1.12, - (Reefsnapper, _) => 1.12, - (Hakulaq, _) => 1.05, - (Dagon, _) => 1.05, - (Pangolin, _) => 1.05, - (Maneater, _) => 1.12, - (Lavadrake, _) => 1.12, - (Icedrake, _) => 1.12, - (Basilisk, _) => 1.3, - _ => 0.9, + (Crocodile, _) => (1.05), + (SeaCrocodile, _) => (1.05), + (Alligator, _) => (1.12), + (Salamander, _) => (1.12), + (Elbst, _) => (1.12), + (Monitor, _) => (0.9), + (Asp, _) => (1.12), + (Rocksnapper, _) => (1.12), + (Rootsnapper, _) => (1.12), + (Reefsnapper, _) => (1.12), + (Hakulaq, _) => (1.05), + (Dagon, _) => (1.05), + (Pangolin, _) => (1.05), + (Maneater, _) => (1.12), + (Lavadrake, _) => (1.12), + (Icedrake, _) => (1.12), + (Basilisk, _) => (1.3), + _ => (0.9), }, tempo: match (body.species, body.body_type) { - (Crocodile, _) => 0.7, - (SeaCrocodile, _) => 0.7, - (Alligator, _) => 0.7, - (Salamander, _) => 0.85, - (Monitor, _) => 1.4, - (Tortoise, _) => 0.7, - (Rocksnapper, _) => 0.7, - (Rootsnapper, _) => 0.7, - (Reefsnapper, _) => 0.7, - (Hakulaq, _) => 1.2, - (Dagon, _) => 1.2, - (Pangolin, _) => 1.15, - (Maneater, _) => 0.9, - (Lavadrake, _) => 1.1, - (Icedrake, _) => 1.1, - (Basilisk, _) => 0.8, - _ => 1.0, + (Crocodile, _) => (0.7), + (SeaCrocodile, _) => (0.7), + (Alligator, _) => (0.7), + (Salamander, _) => (0.85), + (Elbst, _) => (0.85), + (Monitor, _) => (1.4), + (Tortoise, _) => (0.7), + (Rocksnapper, _) => (0.7), + (Rootsnapper, _) => (0.7), + (Reefsnapper, _) => (0.7), + (Hakulaq, _) => (1.2), + (Dagon, _) => (1.2), + (Pangolin, _) => (1.15), + (Maneater, _) => (0.9), + (Lavadrake, _) => (1.1), + (Icedrake, _) => (1.1), + (Basilisk, _) => (0.8), + _ => (1.0), }, } } } fn mount_point(body: &Body) -> Vec3 { - use comp::quadruped_low::{BodyType::*, Species::*}; + use comp::quadruped_low::Species::*; match (body.species, body.body_type) { (Crocodile, _) => (0.0, 4.5, -2.0), (SeaCrocodile, _) => (0.0, 4.5, -2.0), (Alligator, _) => (0.0, 4.25, -2.0), - (Salamander, Male) => (0.0, 5.0, -1.0), - (Salamander, Female) => (0.0, 5.0, -1.0), + (Salamander, _) => (0.0, 5.0, -1.0), + (Elbst, _) => (0.0, 5.0, -1.0), (Monitor, _) => (0.0, 2.0, -2.0), (Asp, _) => (0.0, 2.0, 0.0), (Tortoise, _) => (0.0, -7.0, -1.0), diff --git a/world/src/layer/cave.rs b/world/src/layer/cave.rs index cb55263331..d99e4b52d2 100644 --- a/world/src/layer/cave.rs +++ b/world/src/layer/cave.rs @@ -838,8 +838,8 @@ fn apply_entity_spawns(canvas: &mut Canvas, wpos: Vec3, biome: &Bio (biome.leafy + 0.05) * 0.5, ), ( - Some("common.entity.wild.peaceful.tortoise"), - (biome.leafy + 0.05) * 0.35, + Some("common.entity.wild.aggressive.rootsnapper"), + (biome.leafy + 0.05) * 0.05, ), ( Some("common.entity.wild.peaceful.axolotl"), @@ -872,7 +872,7 @@ fn apply_entity_spawns(canvas: &mut Canvas, wpos: Vec3, biome: &Bio // Dusty biome ( Some("common.entity.wild.aggressive.dodarock"), - (biome.dusty.max(biome.barren) + 0.05) * 0.35, + (biome.dusty.max(biome.barren) + 0.05) * 0.05, ), ( Some("common.entity.wild.aggressive.cave_spider"), diff --git a/world/src/layer/wildlife.rs b/world/src/layer/wildlife.rs index 4694cc9299..62e03435a5 100644 --- a/world/src/layer/wildlife.rs +++ b/world/src/layer/wildlife.rs @@ -340,6 +340,10 @@ pub fn spawn_manifest() -> Vec<(&'static str, DensityFn)> { ("world.wildlife.spawn.desert.hot", |c, _col| { close(c.temp, CONFIG.desert_temp + 0.2, 0.3) * BASE_DENSITY * 3.8 }), + // Rock animals + ("world.wildlife.spawn.desert.rock", |c, col| { + close(c.temp, CONFIG.desert_temp + 0.2, 0.2) * col.rock_density * BASE_DENSITY * 5.0 + }), ] } From 54e3b3e9f50ad1ea7a30bee14fb14cbf26f3d625 Mon Sep 17 00:00:00 2001 From: Koboo Date: Wed, 14 Sep 2022 07:48:19 +0000 Subject: [PATCH 233/854] Koboo/update de de --- assets/voxygen/i18n/de_DE/hud/settings.ftl | 32 ++++++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/assets/voxygen/i18n/de_DE/hud/settings.ftl b/assets/voxygen/i18n/de_DE/hud/settings.ftl index 86383e95f2..109d7e1440 100644 --- a/assets/voxygen/i18n/de_DE/hud/settings.ftl +++ b/assets/voxygen/i18n/de_DE/hud/settings.ftl @@ -31,7 +31,9 @@ hud-settings-chat = Chat hud-settings-background_opacity = Hintergrundsichtbarkeit hud-settings-chat_character_name = Charakternamen im Chat hud-settings-loading_tips = Tipps auf dem Ladebildschirm -hud-settings-reset_interface = Auf Standardwerte zurücksetzen +hud-settings-reset_interface = + Einstellungen + zurücksetzen hud-settings-pan_sensitivity = Kamera-Empfindlichkeit hud-settings-zoom_sensitivity = Zoom-Empfindlichkeit hud-settings-camera_clamp_angle = Starrer Winkel für vertikalen Kameramodus @@ -45,7 +47,9 @@ hud-settings-camera_clamp_behavior = Verhalten bei starrer Kamera hud-settings-player_physics_behavior = Spielerphysik (experimentell) hud-settings-stop_auto_walk_on_input = Automatisches Gehen bei Spieleraktivität anhalten hud-settings-auto_camera = Auto Kamera -hud-settings-reset_gameplay = Standardeinstellungen wiederherstellen +hud-settings-reset_gameplay = + Einstellungen + zurücksetzen hud-settings-view_distance = Sichtweite hud-settings-sprites_view_distance = Sprite-Sichtweite hud-settings-figures_view_distance = Objekt-Sichtweite @@ -67,7 +71,7 @@ hud-settings-fluid_rendering_mode-cheap = Billig hud-settings-fluid_rendering_mode-shiny = Glänzend hud-settings-cloud_rendering_mode-minimal = Minimal hud-settings-cloud_rendering_mode-low = Niedrig -hud-settings-cloud_rendering_mode-medium = Mitel +hud-settings-cloud_rendering_mode-medium = Mittel hud-settings-cloud_rendering_mode-high = Hoch hud-settings-cloud_rendering_mode-ultra = Ultra hud-settings-fullscreen = Vollbild @@ -81,7 +85,7 @@ hud-settings-resolution = Auflösung hud-settings-bit_depth = Bit-Tiefe hud-settings-refresh_rate = Bildwiederholrate hud-settings-lighting_rendering_mode = Beleuchtungs-Renderingmodus -hud-settings-lighting_rendering_mode-ashikhmin = Typ A - Hoch +hud-settings-lighting_rendering_mode-ashikhmin = Typ A - Hoch hud-settings-lighting_rendering_mode-blinnphong = Typ B - Medium hud-settings-lighting_rendering_mode-lambertian = Typ L - Billig hud-settings-shadow_rendering_mode = Schatten-Renderingmodus @@ -90,19 +94,27 @@ hud-settings-shadow_rendering_mode-cheap = Billig hud-settings-shadow_rendering_mode-map = Karte hud-settings-shadow_rendering_mode-map-resolution = Auflösung hud-settings-lod_detail = LoD Detail -hud-settings-save_window_size = Fenstergröße Speichern -hud-settings-reset_graphics = Standardeinstellungen wiederherstellen +hud-settings-save_window_size = + Fenstergröße + speichern +hud-settings-reset_graphics = + Einstellungen + zurücksetzen hud-settings-bloom = Bloom-Effekt hud-settings-master_volume = Lautstärke hud-settings-inactive_master_volume_perc = Lautstärke, wenn das Fenster inaktiv ist hud-settings-music_volume = Musik-Lautstärke hud-settings-sound_effect_volume = Soundeffekt-Lautstärke hud-settings-audio_device = Audiogerät -hud-settings-reset_sound = Standardeinstellungen wiederherstellen +hud-settings-reset_sound = + Einstellungen + zurücksetzen hud-settings-english_fallback = Englische Einstellungen bei fehlender Übersetzung anzeigen hud-settings-awaitingkey = Drücke eine Taste... hud-settings-unbound = Keine -hud-settings-reset_keybinds = Standardeinstellungen wiederherstellen +hud-settings-reset_keybinds = + Einstellungen + zurücksetzen hud-settings-chat_tabs = Chat-Fenster hud-settings-label = Bezeichnung: hud-settings-delete = Löschen @@ -117,4 +129,6 @@ hud-settings-region = Region hud-settings-say = Sagen hud-settings-all = Alle hud-settings-group_only = Nur für die Gruppe -hud-settings-reset_chat = Standard wiederherstellen \ No newline at end of file +hud-settings-reset_chat = + Einstellungen + zurücksetzen \ No newline at end of file From 5d5cb28b59225de823d0b3568a1c38fd4fe34073 Mon Sep 17 00:00:00 2001 From: James Melkonian Date: Wed, 14 Sep 2022 19:48:34 +0000 Subject: [PATCH 234/854] Fix pet aggro --- CHANGELOG.md | 1 + server/src/sys/agent.rs | 4 ++-- server/src/sys/agent/behavior_tree.rs | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d7807a2fd..1f2bb979d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 new chunk for the initial setting or subsequent change to apply). - Moderators and admins are no longer blocked from logging in when there are too many players. - FXAA now behaves correctly at non-1.0x internal resolutions +- Pets no longer aggro on pet owners after being healed ## [0.13.0] - 2022-07-23 diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index 2696580352..cc4424bccd 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -825,8 +825,8 @@ impl<'a> AgentData<'a> { let wants_pickup = matches!(self.body, Some(Body::Humanoid(_))) || matches!(item, item_drop::Body::Consumable); - // The agent will attempt to pickup the item if it wants to pick it up and is - // allowed to + // The agent will attempt to pickup the item if it wants to pick it up and + // is allowed to let attempt_pickup = wants_pickup && read_data .loot_owners diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index d6e42217b0..0d07272125 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -201,7 +201,8 @@ fn react_if_on_fire(bdata: &mut BehaviorData) -> bool { fn target_if_attacked(bdata: &mut BehaviorData) -> bool { match bdata.agent_data.health { Some(health) - if bdata.read_data.time.0 - health.last_change.time.0 < DAMAGE_MEMORY_DURATION => + if bdata.read_data.time.0 - health.last_change.time.0 < DAMAGE_MEMORY_DURATION + && health.last_change.amount < 0.0 => { if let Some(by) = health.last_change.damage_by() { if let Some(attacker) = bdata From 2c15d0af560445c95a94fe4a5eaa5d299e4ccc2d Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Fri, 9 Sep 2022 08:29:43 -0700 Subject: [PATCH 235/854] Reduce overhead of messaging systems. --- Cargo.lock | 29 +- client/src/bin/swarm/main.rs | 31 +- client/src/lib.rs | 655 +++++++++--------- common/frontend/Cargo.toml | 2 +- common/net/src/msg/world_msg.rs | 10 +- common/src/terrain/map.rs | 21 +- common/src/terrain/mod.rs | 10 + common/src/volumes/vol_grid_2d.rs | 64 +- common/state/src/state.rs | 53 +- common/systems/src/phys.rs | 6 +- common/systems/tests/character_state.rs | 20 +- common/systems/tests/phys/utils.rs | 20 +- network/benches/speed.rs | 6 +- network/examples/chat.rs | 26 +- network/examples/fileshare/server.rs | 64 +- network/examples/network-speed/main.rs | 6 +- network/src/api.rs | 121 ++-- network/src/lib.rs | 4 +- network/src/message.rs | 4 +- network/tests/closing.rs | 74 +- network/tests/helper.rs | 4 +- network/tests/integration.rs | 40 +- server/Cargo.toml | 2 + server/src/chunk_generator.rs | 13 + server/src/client.rs | 65 +- server/src/connection_handler.rs | 32 +- server/src/lib.rs | 81 ++- server/src/login_provider.rs | 24 +- server/src/settings.rs | 2 +- server/src/sys/chunk_serialize.rs | 2 +- server/src/sys/msg/character_screen.rs | 8 +- server/src/sys/msg/general.rs | 48 +- server/src/sys/msg/mod.rs | 2 +- server/src/sys/msg/ping.rs | 77 +- server/src/sys/msg/register.rs | 489 ++++++++----- server/src/sys/msg/terrain.rs | 16 +- server/src/sys/sentinel.rs | 20 +- server/src/sys/terrain.rs | 407 ++++++++--- server/src/sys/terrain_sync.rs | 87 ++- server/src/test_world.rs | 2 + voxygen/benches/meshing_benchmark.rs | 6 +- voxygen/src/scene/terrain.rs | 6 +- .../examples/chunk_compression_benchmarks.rs | 6 +- world/src/lib.rs | 13 +- world/src/sim/mod.rs | 9 +- 45 files changed, 1645 insertions(+), 1042 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 667075b0f2..5554c86209 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1752,6 +1752,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "drop_guard" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4a817d8b683f6e649aed359aab0c47a875377516bb5791d0f7e46d9066d209" + [[package]] name = "egui" version = "0.12.0" @@ -4621,7 +4627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d" dependencies = [ "profiling-procmacros", - "tracy-client 0.13.2", + "tracy-client", ] [[package]] @@ -6387,13 +6393,13 @@ dependencies = [ [[package]] name = "tracing-tracy" -version = "0.10.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3ebef1f9f0d00aaa29239537effef65b82c56040c680f540fc6cedfac7b230" +checksum = "23a42311a35ed976d72f359de43e9fe028ec9d9f1051c4c52bd05a4f66ff3cbf" dependencies = [ "tracing-core", "tracing-subscriber", - "tracy-client 0.14.0", + "tracy-client", ] [[package]] @@ -6407,17 +6413,6 @@ dependencies = [ "tracy-client-sys", ] -[[package]] -name = "tracy-client" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f901ea566c34f5fdc987962495ebfea20c18d781e271967edcc0f9897e339815" -dependencies = [ - "loom", - "once_cell", - "tracy-client-sys", -] - [[package]] name = "tracy-client-sys" version = "0.17.1" @@ -6763,7 +6758,7 @@ version = "0.10.0" dependencies = [ "directories-next", "tracing", - "tracy-client 0.13.2", + "tracy-client", ] [[package]] @@ -6937,6 +6932,7 @@ dependencies = [ "chrono", "chrono-tz", "crossbeam-channel", + "drop_guard", "enumset", "futures-util", "hashbrown 0.12.3", @@ -6945,6 +6941,7 @@ dependencies = [ "lazy_static", "noise", "num_cpus", + "parking_lot 0.12.1", "portpicker", "prometheus", "prometheus-hyper", diff --git a/client/src/bin/swarm/main.rs b/client/src/bin/swarm/main.rs index 7284ddb95b..ae85810d01 100644 --- a/client/src/bin/swarm/main.rs +++ b/client/src/bin/swarm/main.rs @@ -30,7 +30,7 @@ struct Opt { fn main() { let opt = Opt::from_args(); // Start logging - common_frontend::init_stdout(None); + let _guards = common_frontend::init_stdout(None); // Run clients and stuff // // NOTE: "swarm0" is assumed to be an admin already @@ -72,9 +72,7 @@ fn main() { ); }); - loop { - thread::sleep(Duration::from_secs_f32(1.0)); - } + std::thread::park(); } fn run_client_new_thread( @@ -102,23 +100,26 @@ fn run_client( opt: Opt, finished_init: Arc, ) -> Result<(), veloren_client::Error> { - // Connect to localhost - let addr = ConnectionArgs::Tcp { - prefer_ipv6: false, - hostname: "localhost".into(), - }; - let runtime_clone = Arc::clone(&runtime); - // NOTE: use a no-auth server - let mut client = runtime - .block_on(Client::new( + let mut client = loop { + // Connect to localhost + let addr = ConnectionArgs::Tcp { + prefer_ipv6: false, + hostname: "localhost".into(), + }; + let runtime_clone = Arc::clone(&runtime); + // NOTE: use a no-auth server + match runtime.block_on(Client::new( addr, runtime_clone, &mut None, &username, "", |_| false, - )) - .expect("Failed to connect to the server"); + )) { + Err(e) => tracing::warn!(?e, "Client {} disconnected", index), + Ok(client) => break client, + } + }; let mut clock = common::clock::Clock::new(Duration::from_secs_f32(1.0 / 30.0)); diff --git a/client/src/lib.rs b/client/src/lib.rs index ffc8579b39..2c41087d7a 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -39,11 +39,11 @@ use common::{ mounting::Rider, outcome::Outcome, recipe::{ComponentRecipeBook, RecipeBook}, - resources::{PlayerEntity, TimeOfDay}, + resources::{GameMode, PlayerEntity, TimeOfDay}, spiral::Spiral2d, terrain::{ block::Block, map::MapConfig, neighbors, site::DungeonKindMeta, BiomeKind, SiteKindMeta, - SpriteKind, TerrainChunk, TerrainChunkSize, + SpriteKind, TerrainChunk, TerrainChunkSize, TerrainGrid, }, trade::{PendingTrade, SitePrices, TradeAction, TradeId, TradeResult}, uid::{Uid, UidAllocator}, @@ -281,7 +281,7 @@ impl Client { ) -> Result { let network = Network::new(Pid::new(), &runtime); - let participant = match addr { + let mut participant = match addr { ConnectionArgs::Tcp { hostname, prefer_ipv6, @@ -304,7 +304,7 @@ impl Client { }; let stream = participant.opened().await?; - let mut ping_stream = participant.opened().await?; + let ping_stream = participant.opened().await?; let mut register_stream = participant.opened().await?; let character_screen_stream = participant.opened().await?; let in_game_stream = participant.opened().await?; @@ -340,6 +340,314 @@ impl Client { // Wait for initial sync let mut ping_interval = tokio::time::interval(Duration::from_secs(1)); + let ServerInit::GameSync { + entity_package, + time_of_day, + max_group_size, + client_timeout, + world_map, + recipe_book, + component_recipe_book, + material_stats, + ability_map, + } = loop { + tokio::select! { + // Spawn in a blocking thread (leaving the network thread free). This is mostly + // useful for bots. + res = register_stream.recv() => break res?, + _ = ping_interval.tick() => ping_stream.send(PingMsg::Ping)?, + } + }; + + // Spawn in a blocking thread (leaving the network thread free). This is mostly + // useful for bots. + let mut task = tokio::task::spawn_blocking(move || { + let map_size_lg = + common::terrain::MapSizeLg::new(world_map.dimensions_lg).map_err(|_| { + Error::Other(format!( + "Server sent bad world map dimensions: {:?}", + world_map.dimensions_lg, + )) + })?; + let sea_level = world_map.default_chunk.get_min_z() as f32; + + // Initialize `State` + let pools = State::pools(GameMode::Client); + let mut state = State::client(pools, map_size_lg, world_map.default_chunk); + // Client-only components + state.ecs_mut().register::>(); + let entity = state.ecs_mut().apply_entity_package(entity_package); + *state.ecs_mut().write_resource() = time_of_day; + *state.ecs_mut().write_resource() = PlayerEntity(Some(entity)); + state.ecs_mut().insert(material_stats); + state.ecs_mut().insert(ability_map); + + let map_size = map_size_lg.chunks(); + let max_height = world_map.max_height; + let rgba = world_map.rgba; + let alt = world_map.alt; + if rgba.size() != map_size.map(|e| e as i32) { + return Err(Error::Other("Server sent a bad world map image".into())); + } + if alt.size() != map_size.map(|e| e as i32) { + return Err(Error::Other("Server sent a bad altitude map.".into())); + } + let [west, east] = world_map.horizons; + let scale_angle = |a: u8| (a as f32 / 255.0 * ::FRAC_PI_2()).tan(); + let scale_height = |h: u8| h as f32 / 255.0 * max_height; + let scale_height_big = |h: u32| (h >> 3) as f32 / 8191.0 * max_height; + + debug!("Preparing image..."); + let unzip_horizons = |(angles, heights): &(Vec<_>, Vec<_>)| { + ( + angles.iter().copied().map(scale_angle).collect::>(), + heights + .iter() + .copied() + .map(scale_height) + .collect::>(), + ) + }; + let horizons = [unzip_horizons(&west), unzip_horizons(&east)]; + + // Redraw map (with shadows this time). + let mut world_map_rgba = vec![0u32; rgba.size().product() as usize]; + let mut world_map_topo = vec![0u32; rgba.size().product() as usize]; + let mut map_config = common::terrain::map::MapConfig::orthographic( + map_size_lg, + core::ops::RangeInclusive::new(0.0, max_height), + ); + map_config.horizons = Some(&horizons); + let rescale_height = |h: f32| h / max_height; + let bounds_check = |pos: Vec2| { + pos.reduce_partial_min() >= 0 + && pos.x < map_size.x as i32 + && pos.y < map_size.y as i32 + }; + fn sample_pos( + map_config: &MapConfig, + pos: Vec2, + alt: &Grid, + rgba: &Grid, + map_size: &Vec2, + map_size_lg: &common::terrain::MapSizeLg, + max_height: f32, + ) -> common::terrain::map::MapSample { + let rescale_height = |h: f32| h / max_height; + let scale_height_big = |h: u32| (h >> 3) as f32 / 8191.0 * max_height; + let bounds_check = |pos: Vec2| { + pos.reduce_partial_min() >= 0 + && pos.x < map_size.x as i32 + && pos.y < map_size.y as i32 + }; + let MapConfig { + gain, + is_contours, + is_height_map, + is_stylized_topo, + .. + } = *map_config; + let mut is_contour_line = false; + let mut is_border = false; + let (rgb, alt, downhill_wpos) = if bounds_check(pos) { + let posi = pos.y as usize * map_size.x as usize + pos.x as usize; + let [r, g, b, _a] = rgba[pos].to_le_bytes(); + let is_water = r == 0 && b > 102 && g < 77; + let alti = alt[pos]; + // Compute contours (chunks are assigned in the river code below) + let altj = rescale_height(scale_height_big(alti)); + let contour_interval = 150.0; + let chunk_contour = (altj * gain / contour_interval) as u32; + + // Compute downhill. + let downhill = { + let mut best = -1; + let mut besth = alti; + for nposi in neighbors(*map_size_lg, posi) { + let nbh = alt.raw()[nposi]; + let nalt = rescale_height(scale_height_big(nbh)); + let nchunk_contour = (nalt * gain / contour_interval) as u32; + if !is_contour_line && chunk_contour > nchunk_contour { + is_contour_line = true; + } + let [nr, ng, nb, _na] = rgba.raw()[nposi].to_le_bytes(); + let n_is_water = nr == 0 && nb > 102 && ng < 77; + + if !is_border && is_water && !n_is_water { + is_border = true; + } + + if nbh < besth { + besth = nbh; + best = nposi as isize; + } + } + best + }; + let downhill_wpos = if downhill < 0 { + None + } else { + Some( + Vec2::new( + (downhill as usize % map_size.x as usize) as i32, + (downhill as usize / map_size.x as usize) as i32, + ) * TerrainChunkSize::RECT_SIZE.map(|e| e as i32), + ) + }; + (Rgb::new(r, g, b), alti, downhill_wpos) + } else { + (Rgb::zero(), 0, None) + }; + let alt = f64::from(rescale_height(scale_height_big(alt))); + let wpos = pos * TerrainChunkSize::RECT_SIZE.map(|e| e as i32); + let downhill_wpos = + downhill_wpos.unwrap_or(wpos + TerrainChunkSize::RECT_SIZE.map(|e| e as i32)); + let is_path = rgb.r == 0x37 && rgb.g == 0x29 && rgb.b == 0x23; + let rgb = rgb.map(|e: u8| e as f64 / 255.0); + let is_water = rgb.r == 0.0 && rgb.b > 0.4 && rgb.g < 0.3; + + let rgb = if is_height_map { + if is_path { + // Path color is Rgb::new(0x37, 0x29, 0x23) + Rgb::new(0.9, 0.9, 0.63) + } else if is_water { + Rgb::new(0.23, 0.47, 0.53) + } else if is_contours && is_contour_line { + // Color contour lines + Rgb::new(0.15, 0.15, 0.15) + } else { + // Color hill shading + let lightness = (alt + 0.2).min(1.0) as f64; + Rgb::new(lightness, 0.9 * lightness, 0.5 * lightness) + } + } else if is_stylized_topo { + if is_path { + Rgb::new(0.9, 0.9, 0.63) + } else if is_water { + if is_border { + Rgb::new(0.10, 0.34, 0.50) + } else { + Rgb::new(0.23, 0.47, 0.63) + } + } else if is_contour_line { + Rgb::new(0.25, 0.25, 0.25) + } else { + // Stylized colors + Rgb::new( + (rgb.r + 0.25).min(1.0), + (rgb.g + 0.23).min(1.0), + (rgb.b + 0.10).min(1.0), + ) + } + } else { + Rgb::new(rgb.r, rgb.g, rgb.b) + } + .map(|e| (e * 255.0) as u8); + common::terrain::map::MapSample { + rgb, + alt, + downhill_wpos, + connections: None, + } + } + // Generate standard shaded map + map_config.is_shaded = true; + map_config.generate( + |pos| { + sample_pos( + &map_config, + pos, + &alt, + &rgba, + &map_size, + &map_size_lg, + max_height, + ) + }, + |wpos| { + let pos = wpos.map2(TerrainChunkSize::RECT_SIZE, |e, f| e / f as i32); + rescale_height(if bounds_check(pos) { + scale_height_big(alt[pos]) + } else { + 0.0 + }) + }, + |pos, (r, g, b, a)| { + world_map_rgba[pos.y * map_size.x as usize + pos.x] = + u32::from_le_bytes([r, g, b, a]); + }, + ); + // Generate map with topographical lines and stylized colors + map_config.is_contours = true; + map_config.is_stylized_topo = true; + map_config.generate( + |pos| { + sample_pos( + &map_config, + pos, + &alt, + &rgba, + &map_size, + &map_size_lg, + max_height, + ) + }, + |wpos| { + let pos = wpos.map2(TerrainChunkSize::RECT_SIZE, |e, f| e / f as i32); + rescale_height(if bounds_check(pos) { + scale_height_big(alt[pos]) + } else { + 0.0 + }) + }, + |pos, (r, g, b, a)| { + world_map_topo[pos.y * map_size.x as usize + pos.x] = + u32::from_le_bytes([r, g, b, a]); + }, + ); + let make_raw = |rgb| -> Result<_, Error> { + let mut raw = vec![0u8; 4 * world_map_rgba.len()]; + LittleEndian::write_u32_into(rgb, &mut raw); + Ok(Arc::new( + DynamicImage::ImageRgba8({ + // Should not fail if the dimensions are correct. + let map = + image::ImageBuffer::from_raw(u32::from(map_size.x), u32::from(map_size.y), raw); + map.ok_or_else(|| Error::Other("Server sent a bad world map image".into()))? + }) + // Flip the image, since Voxygen uses an orientation where rotation from + // positive x axis to positive y axis is counterclockwise around the z axis. + .flipv(), + )) + }; + let lod_base = rgba; + let lod_alt = alt; + let world_map_rgb_img = make_raw(&world_map_rgba)?; + let world_map_topo_img = make_raw(&world_map_topo)?; + let world_map_layers = vec![world_map_rgb_img, world_map_topo_img]; + let horizons = (west.0, west.1, east.0, east.1) + .into_par_iter() + .map(|(wa, wh, ea, eh)| u32::from_le_bytes([wa, wh, ea, eh])) + .collect::>(); + let lod_horizon = horizons; + let map_bounds = Vec2::new(sea_level, max_height); + debug!("Done preparing image..."); + + Ok(( + state, + lod_base, + lod_alt, + Grid::from_raw(map_size.map(|e| e as i32), lod_horizon), + (world_map_layers, map_size, map_bounds), + world_map.sites, + world_map.pois, + recipe_book, + component_recipe_book, + max_group_size, + client_timeout, + )) + }); + let ( state, lod_base, @@ -352,312 +660,11 @@ impl Client { component_recipe_book, max_group_size, client_timeout, - ) = match loop { + ) = loop { tokio::select! { - res = register_stream.recv() => break res?, + res = &mut task => break res.expect("Client thread should not panic")?, _ = ping_interval.tick() => ping_stream.send(PingMsg::Ping)?, } - } { - ServerInit::GameSync { - entity_package, - time_of_day, - max_group_size, - client_timeout, - world_map, - recipe_book, - component_recipe_book, - material_stats, - ability_map, - } => { - // Initialize `State` - let mut state = State::client(); - // Client-only components - state.ecs_mut().register::>(); - - let entity = state.ecs_mut().apply_entity_package(entity_package); - *state.ecs_mut().write_resource() = time_of_day; - *state.ecs_mut().write_resource() = PlayerEntity(Some(entity)); - state.ecs_mut().insert(material_stats); - state.ecs_mut().insert(ability_map); - - let map_size_lg = common::terrain::MapSizeLg::new(world_map.dimensions_lg) - .map_err(|_| { - Error::Other(format!( - "Server sent bad world map dimensions: {:?}", - world_map.dimensions_lg, - )) - })?; - let map_size = map_size_lg.chunks(); - let max_height = world_map.max_height; - let sea_level = world_map.sea_level; - let rgba = world_map.rgba; - let alt = world_map.alt; - if rgba.size() != map_size.map(|e| e as i32) { - return Err(Error::Other("Server sent a bad world map image".into())); - } - if alt.size() != map_size.map(|e| e as i32) { - return Err(Error::Other("Server sent a bad altitude map.".into())); - } - let [west, east] = world_map.horizons; - let scale_angle = - |a: u8| (a as f32 / 255.0 * ::FRAC_PI_2()).tan(); - let scale_height = |h: u8| h as f32 / 255.0 * max_height; - let scale_height_big = |h: u32| (h >> 3) as f32 / 8191.0 * max_height; - ping_stream.send(PingMsg::Ping)?; - - debug!("Preparing image..."); - let unzip_horizons = |(angles, heights): &(Vec<_>, Vec<_>)| { - ( - angles.iter().copied().map(scale_angle).collect::>(), - heights - .iter() - .copied() - .map(scale_height) - .collect::>(), - ) - }; - let horizons = [unzip_horizons(&west), unzip_horizons(&east)]; - - // Redraw map (with shadows this time). - let mut world_map_rgba = vec![0u32; rgba.size().product() as usize]; - let mut world_map_topo = vec![0u32; rgba.size().product() as usize]; - let mut map_config = common::terrain::map::MapConfig::orthographic( - map_size_lg, - core::ops::RangeInclusive::new(0.0, max_height), - ); - map_config.horizons = Some(&horizons); - let rescale_height = |h: f32| h / max_height; - let bounds_check = |pos: Vec2| { - pos.reduce_partial_min() >= 0 - && pos.x < map_size.x as i32 - && pos.y < map_size.y as i32 - }; - ping_stream.send(PingMsg::Ping)?; - fn sample_pos( - map_config: &MapConfig, - pos: Vec2, - alt: &Grid, - rgba: &Grid, - map_size: &Vec2, - map_size_lg: &common::terrain::MapSizeLg, - max_height: f32, - ) -> common::terrain::map::MapSample { - let rescale_height = |h: f32| h / max_height; - let scale_height_big = |h: u32| (h >> 3) as f32 / 8191.0 * max_height; - let bounds_check = |pos: Vec2| { - pos.reduce_partial_min() >= 0 - && pos.x < map_size.x as i32 - && pos.y < map_size.y as i32 - }; - let MapConfig { - gain, - is_contours, - is_height_map, - is_stylized_topo, - .. - } = *map_config; - let mut is_contour_line = false; - let mut is_border = false; - let (rgb, alt, downhill_wpos) = if bounds_check(pos) { - let posi = pos.y as usize * map_size.x as usize + pos.x as usize; - let [r, g, b, _a] = rgba[pos].to_le_bytes(); - let is_water = r == 0 && b > 102 && g < 77; - let alti = alt[pos]; - // Compute contours (chunks are assigned in the river code below) - let altj = rescale_height(scale_height_big(alti)); - let contour_interval = 150.0; - let chunk_contour = (altj * gain / contour_interval) as u32; - - // Compute downhill. - let downhill = { - let mut best = -1; - let mut besth = alti; - for nposi in neighbors(*map_size_lg, posi) { - let nbh = alt.raw()[nposi]; - let nalt = rescale_height(scale_height_big(nbh)); - let nchunk_contour = (nalt * gain / contour_interval) as u32; - if !is_contour_line && chunk_contour > nchunk_contour { - is_contour_line = true; - } - let [nr, ng, nb, _na] = rgba.raw()[nposi].to_le_bytes(); - let n_is_water = nr == 0 && nb > 102 && ng < 77; - - if !is_border && is_water && !n_is_water { - is_border = true; - } - - if nbh < besth { - besth = nbh; - best = nposi as isize; - } - } - best - }; - let downhill_wpos = if downhill < 0 { - None - } else { - Some( - Vec2::new( - (downhill as usize % map_size.x as usize) as i32, - (downhill as usize / map_size.x as usize) as i32, - ) * TerrainChunkSize::RECT_SIZE.map(|e| e as i32), - ) - }; - (Rgb::new(r, g, b), alti, downhill_wpos) - } else { - (Rgb::zero(), 0, None) - }; - let alt = f64::from(rescale_height(scale_height_big(alt))); - let wpos = pos * TerrainChunkSize::RECT_SIZE.map(|e| e as i32); - let downhill_wpos = downhill_wpos - .unwrap_or(wpos + TerrainChunkSize::RECT_SIZE.map(|e| e as i32)); - let is_path = rgb.r == 0x37 && rgb.g == 0x29 && rgb.b == 0x23; - let rgb = rgb.map(|e: u8| e as f64 / 255.0); - let is_water = rgb.r == 0.0 && rgb.b > 0.4 && rgb.g < 0.3; - - let rgb = if is_height_map { - if is_path { - // Path color is Rgb::new(0x37, 0x29, 0x23) - Rgb::new(0.9, 0.9, 0.63) - } else if is_water { - Rgb::new(0.23, 0.47, 0.53) - } else if is_contours && is_contour_line { - // Color contour lines - Rgb::new(0.15, 0.15, 0.15) - } else { - // Color hill shading - let lightness = (alt + 0.2).min(1.0) as f64; - Rgb::new(lightness, 0.9 * lightness, 0.5 * lightness) - } - } else if is_stylized_topo { - if is_path { - Rgb::new(0.9, 0.9, 0.63) - } else if is_water { - if is_border { - Rgb::new(0.10, 0.34, 0.50) - } else { - Rgb::new(0.23, 0.47, 0.63) - } - } else if is_contour_line { - Rgb::new(0.25, 0.25, 0.25) - } else { - // Stylized colors - Rgb::new( - (rgb.r + 0.25).min(1.0), - (rgb.g + 0.23).min(1.0), - (rgb.b + 0.10).min(1.0), - ) - } - } else { - Rgb::new(rgb.r, rgb.g, rgb.b) - } - .map(|e| (e * 255.0) as u8); - common::terrain::map::MapSample { - rgb, - alt, - downhill_wpos, - connections: None, - } - } - // Generate standard shaded map - map_config.is_shaded = true; - map_config.generate( - |pos| { - sample_pos( - &map_config, - pos, - &alt, - &rgba, - &map_size, - &map_size_lg, - max_height, - ) - }, - |wpos| { - let pos = wpos.map2(TerrainChunkSize::RECT_SIZE, |e, f| e / f as i32); - rescale_height(if bounds_check(pos) { - scale_height_big(alt[pos]) - } else { - 0.0 - }) - }, - |pos, (r, g, b, a)| { - world_map_rgba[pos.y * map_size.x as usize + pos.x] = - u32::from_le_bytes([r, g, b, a]); - }, - ); - // Generate map with topographical lines and stylized colors - map_config.is_contours = true; - map_config.is_stylized_topo = true; - map_config.generate( - |pos| { - sample_pos( - &map_config, - pos, - &alt, - &rgba, - &map_size, - &map_size_lg, - max_height, - ) - }, - |wpos| { - let pos = wpos.map2(TerrainChunkSize::RECT_SIZE, |e, f| e / f as i32); - rescale_height(if bounds_check(pos) { - scale_height_big(alt[pos]) - } else { - 0.0 - }) - }, - |pos, (r, g, b, a)| { - world_map_topo[pos.y * map_size.x as usize + pos.x] = - u32::from_le_bytes([r, g, b, a]); - }, - ); - ping_stream.send(PingMsg::Ping)?; - let make_raw = |rgb| -> Result<_, Error> { - let mut raw = vec![0u8; 4 * world_map_rgba.len()]; - LittleEndian::write_u32_into(rgb, &mut raw); - Ok(Arc::new( - DynamicImage::ImageRgba8({ - // Should not fail if the dimensions are correct. - let map = - image::ImageBuffer::from_raw(u32::from(map_size.x), u32::from(map_size.y), raw); - map.ok_or_else(|| Error::Other("Server sent a bad world map image".into()))? - }) - // Flip the image, since Voxygen uses an orientation where rotation from - // positive x axis to positive y axis is counterclockwise around the z axis. - .flipv(), - )) - }; - ping_stream.send(PingMsg::Ping)?; - let lod_base = rgba; - let lod_alt = alt; - let world_map_rgb_img = make_raw(&world_map_rgba)?; - let world_map_topo_img = make_raw(&world_map_topo)?; - let world_map_layers = vec![world_map_rgb_img, world_map_topo_img]; - let horizons = (west.0, west.1, east.0, east.1) - .into_par_iter() - .map(|(wa, wh, ea, eh)| u32::from_le_bytes([wa, wh, ea, eh])) - .collect::>(); - let lod_horizon = horizons; - let map_bounds = Vec2::new(sea_level, max_height); - debug!("Done preparing image..."); - - ( - state, - lod_base, - lod_alt, - Grid::from_raw(map_size.map(|e| e as i32), lod_horizon), - (world_map_layers, map_size, map_bounds), - world_map.sites, - world_map.pois, - recipe_book, - component_recipe_book, - max_group_size, - client_timeout, - ) - }, }; ping_stream.send(PingMsg::Ping)?; @@ -1899,7 +1906,19 @@ impl Client { ]; for key in keys.iter() { - if self.state.terrain().get_key(*key).is_none() { + let dist_to_player = (TerrainGrid::key_chunk(*key).map(|x| x as f32) + + TerrainChunkSize::RECT_SIZE.map(|x| x as f32) / 2.0) + .distance_squared(pos.0.into()); + + let terrain = self.state.terrain(); + if let Some(chunk) = terrain.get_key_arc(*key) { + if !skip_mode && !terrain.contains_key_real(*key) { + let chunk = Arc::clone(chunk); + drop(terrain); + self.state.insert_chunk(*key, chunk); + } + } else { + drop(terrain); if !skip_mode && !self.pending_chunks.contains_key(key) { const TOTAL_PENDING_CHUNKS_LIMIT: usize = 12; const CURRENT_TICK_PENDING_CHUNKS_LIMIT: usize = 2; @@ -1917,11 +1936,6 @@ impl Client { } } - let dist_to_player = - (self.state.terrain().key_pos(*key).map(|x| x as f32) - + TerrainChunkSize::RECT_SIZE.map(|x| x as f32) / 2.0) - .distance_squared(pos.0.into()); - if dist_to_player < self.loaded_distance { self.loaded_distance = dist_to_player; } @@ -2510,7 +2524,12 @@ impl Client { } // ignore network events - while let Some(Ok(Some(event))) = self.participant.as_ref().map(|p| p.try_fetch_event()) { + while let Some(res) = self + .participant + .as_mut() + .and_then(|p| p.try_fetch_event().transpose()) + { + let event = res?; trace!(?event, "received network event"); } @@ -2875,8 +2894,12 @@ impl Client { self.state.read_storage().get(self.entity()).cloned(), self.state.read_storage().get(self.entity()).cloned(), ) { - self.in_game_stream - .send(ClientGeneral::PlayerPhysics { pos, vel, ori })?; + self.in_game_stream.send(ClientGeneral::PlayerPhysics { + pos, + vel, + ori, + force_counter: self.force_update_counter, + })?; } } diff --git a/common/frontend/Cargo.toml b/common/frontend/Cargo.toml index 2cf82e68d9..e123a8ca7a 100644 --- a/common/frontend/Cargo.toml +++ b/common/frontend/Cargo.toml @@ -19,4 +19,4 @@ tracing-log = "0.1.1" tracing-subscriber = { version = "0.3.7", default-features = false, features = ["env-filter", "fmt", "time", "ansi", "smallvec", "tracing-log"]} # Tracy -tracing-tracy = { version = "0.10.0", optional = true } +tracing-tracy = { version = "0.9.0", optional = true } diff --git a/common/net/src/msg/world_msg.rs b/common/net/src/msg/world_msg.rs index 1ab33ee89c..16986f1d0b 100644 --- a/common/net/src/msg/world_msg.rs +++ b/common/net/src/msg/world_msg.rs @@ -1,6 +1,6 @@ -use common::{grid::Grid, trade::Good}; +use common::{grid::Grid, terrain::TerrainChunk, trade::Good}; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; use vek::*; #[derive(Debug, Clone, Serialize, Deserialize)] @@ -26,8 +26,6 @@ pub struct WorldMapMsg { /// /// NOTE: Invariant: chunk count fits in a u16. pub dimensions_lg: Vec2, - /// Sea level (used to provide a base altitude). - pub sea_level: f32, /// Max height (used to scale altitudes). pub max_height: f32, /// RGB+A; the alpha channel is currently unused, but will be used in the @@ -124,6 +122,10 @@ pub struct WorldMapMsg { pub horizons: [(Vec, Vec); 2], pub sites: Vec, pub pois: Vec, + /// Default chunk (representing the ocean outside the map bounds). Sea + /// level (used to provide a base altitude) is the lower bound of this + /// chunk. + pub default_chunk: Arc, } pub type SiteId = common::trade::SiteId; diff --git a/common/src/terrain/map.rs b/common/src/terrain/map.rs index 5fb3101e46..e2e1b2f371 100644 --- a/common/src/terrain/map.rs +++ b/common/src/terrain/map.rs @@ -132,7 +132,7 @@ pub const MAX_WORLD_BLOCKS_LG: Vec2 = Vec2 { x: 19, y: 19 }; /// [TERRAIN_CHUNK_BLOCKS_LG]))` fits in an i32 (derived from the invariant /// on [MAX_WORLD_BLOCKS_LG]). /// -/// NOTE: As an invariant, each dimension (in chunks) must fit in a u16. +/// NOTE: As an invariant, each dimension (in chunks) must fit in a i16. /// /// NOTE: As an invariant, the product of dimensions (in chunks) must fit in a /// usize. @@ -160,12 +160,12 @@ impl MapSizeLg { // 0 and ([MAX_WORLD_BLOCKS_LG] - [TERRAIN_CHUNK_BLOCKS_LG]) let is_le_max = map_size_lg.x <= MAX_WORLD_BLOCKS_LG.x - TERRAIN_CHUNK_BLOCKS_LG && map_size_lg.y <= MAX_WORLD_BLOCKS_LG.y - TERRAIN_CHUNK_BLOCKS_LG; - // Assertion on dimensions: chunks must fit in a u16. + // Assertion on dimensions: chunks must fit in a i16. let chunks_in_range = - /* 1u16.checked_shl(map_size_lg.x).is_some() && - 1u16.checked_shl(map_size_lg.y).is_some(); */ - map_size_lg.x <= 16 && - map_size_lg.y <= 16; + /* 1u15.checked_shl(map_size_lg.x).is_some() && + 1u15.checked_shl(map_size_lg.y).is_some(); */ + map_size_lg.x <= 15 && + map_size_lg.y <= 15; if is_le_max && chunks_in_range { // Assertion on dimensions: blocks must fit in a i32. let blocks_in_range = @@ -197,6 +197,15 @@ impl MapSizeLg { /// Get the size of an array of the correct size to hold all chunks. pub const fn chunks_len(self) -> usize { 1 << (self.0.x + self.0.y) } + + #[inline(always)] + /// Determine whether a chunk position is in bounds. + pub const fn contains_chunk(&self, chunk_key: Vec2) -> bool { + let map_size = self.chunks(); + chunk_key.x >= 0 && chunk_key.y >= 0 && + chunk_key.x == chunk_key.x & ((map_size.x as i32) - 1) && + chunk_key.y == chunk_key.y & ((map_size.y as i32) - 1) + } } impl From for Vec2 { diff --git a/common/src/terrain/mod.rs b/common/src/terrain/mod.rs index c49cdf7968..a9f065fb48 100644 --- a/common/src/terrain/mod.rs +++ b/common/src/terrain/mod.rs @@ -188,6 +188,16 @@ impl TerrainGrid { } impl TerrainChunk { + /// Generate an all-water chunk at a specific sea level. + pub fn water(sea_level: i32) -> TerrainChunk { + TerrainChunk::new( + sea_level, + Block::new(BlockKind::Water, Rgb::zero()), + Block::air(SpriteKind::Empty), + TerrainChunkMeta::void(), + ) + } + /// Find the highest or lowest accessible position within the chunk pub fn find_accessible_pos(&self, spawn_wpos: Vec2, ascending: bool) -> Vec3 { let min_z = self.get_min_z(); diff --git a/common/src/volumes/vol_grid_2d.rs b/common/src/volumes/vol_grid_2d.rs index 49c91f00fc..9a40bd9eec 100644 --- a/common/src/volumes/vol_grid_2d.rs +++ b/common/src/volumes/vol_grid_2d.rs @@ -1,4 +1,5 @@ use crate::{ + terrain::MapSizeLg, vol::{BaseVol, ReadVol, RectRasterableVol, SampleVol, WriteVol}, volumes::dyna::DynaError, }; @@ -19,6 +20,10 @@ pub enum VolGrid2dError { // M = Chunk metadata #[derive(Clone)] pub struct VolGrid2d { + /// Size of the entire (not just loaded) map. + map_size_lg: MapSizeLg, + /// Default voxel for use outside of max map bounds. + default: Arc, chunks: HashMap, Arc>, } @@ -29,6 +34,18 @@ impl VolGrid2d { .map2(V::RECT_SIZE, |e, sz: u32| e.div_euclid(sz as i32)) } + #[inline(always)] + pub fn key_chunk>>(key: K) -> Vec2 { + key.into() * V::RECT_SIZE.map(|e| e as i32) + } + + #[inline(always)] + pub fn par_keys(&self) -> hashbrown::hash_map::rayon::ParKeys, Arc> + where V: Send + Sync, + { + self.chunks.par_keys() + } + #[inline(always)] pub fn chunk_offs(pos: Vec3) -> Vec3 { let offs = Vec2::::from(pos).map2(V::RECT_SIZE, |e, sz| e & (sz - 1) as i32); @@ -45,8 +62,7 @@ impl ReadVol for VolGrid2d { #[inline(always)] fn get(&self, pos: Vec3) -> Result<&V::Vox, VolGrid2dError> { let ck = Self::chunk_key(pos); - self.chunks - .get(&ck) + self.get_key(ck) .ok_or(VolGrid2dError::NoSuchChunk) .and_then(|chunk| { let co = Self::chunk_offs(pos); @@ -102,14 +118,14 @@ impl>, V: RectRasterableVol + ReadVol + Debug> SampleVol fo fn sample(&self, range: I) -> Result> { let range = range.into(); - let mut sample = VolGrid2d::new()?; + let mut sample = VolGrid2d::new(self.map_size_lg, Arc::clone(&self.default))?; let chunk_min = Self::chunk_key(range.min); let chunk_max = Self::chunk_key(range.max); for x in chunk_min.x..chunk_max.x + 1 { for y in chunk_min.y..chunk_max.y + 1 { let chunk_key = Vec2::new(x, y); - let chunk = self.get_key_arc(chunk_key).cloned(); + let chunk = self.get_key_arc_real(chunk_key).cloned(); if let Some(chunk) = chunk { sample.insert(chunk_key, chunk); @@ -138,12 +154,14 @@ impl WriteVol for VolGrid2d } impl VolGrid2d { - pub fn new() -> Result> { + pub fn new(map_size_lg: MapSizeLg, default: Arc) -> Result> { if Self::chunk_size() .map(|e| e.is_power_of_two() && e > 0) .reduce_and() { Ok(Self { + map_size_lg, + default, chunks: HashMap::default(), }) } else { @@ -160,10 +178,37 @@ impl VolGrid2d { #[inline(always)] pub fn get_key(&self, key: Vec2) -> Option<&V> { - self.chunks.get(&key).map(|arc_chunk| arc_chunk.as_ref()) + self.get_key_arc(key).map(|arc_chunk| arc_chunk.as_ref()) } - pub fn get_key_arc(&self, key: Vec2) -> Option<&Arc> { self.chunks.get(&key) } + #[inline(always)] + pub fn get_key_real(&self, key: Vec2) -> Option<&V> { + self.get_key_arc_real(key).map(|arc_chunk| arc_chunk.as_ref()) + } + + #[inline(always)] + pub fn contains_key(&self, key: Vec2) -> bool { + self.contains_key_real(key) || + // Counterintuitively, areas outside the map are *always* considered to be in it, since + // they're assigned the default chunk. + !self.map_size_lg.contains_chunk(key) + } + + #[inline(always)] + pub fn contains_key_real(&self, key: Vec2) -> bool { + self.chunks.contains_key(&key) + } + + #[inline(always)] + pub fn get_key_arc(&self, key: Vec2) -> Option<&Arc> { + self.get_key_arc_real(key) + .or_else(|| if !self.map_size_lg.contains_chunk(key) { Some(&self.default) } else { None }) + } + + #[inline(always)] + pub fn get_key_arc_real(&self, key: Vec2) -> Option<&Arc> { + self.chunks.get(&key) + } pub fn clear(&mut self) { self.chunks.clear(); } @@ -172,7 +217,7 @@ impl VolGrid2d { pub fn remove(&mut self, key: Vec2) -> Option> { self.chunks.remove(&key) } #[inline(always)] - pub fn key_pos(&self, key: Vec2) -> Vec2 { key * V::RECT_SIZE.map(|e| e as i32) } + pub fn key_pos(&self, key: Vec2) -> Vec2 { Self::key_chunk(key) } #[inline(always)] pub fn pos_key(&self, pos: Vec3) -> Vec2 { Self::chunk_key(pos) } @@ -219,8 +264,7 @@ impl<'a, V: RectRasterableVol + ReadVol> CachedVolGrid2d<'a, V> { // Otherwise retrieve from the hashmap let chunk = self .vol_grid_2d - .chunks - .get(&ck) + .get_key_arc(ck) .ok_or(VolGrid2dError::NoSuchChunk)?; // Store most recently looked up chunk in the cache self.cache = Some((ck, Arc::clone(chunk))); diff --git a/common/state/src/state.rs b/common/state/src/state.rs index d088bc84d3..de1d7c7d3b 100644 --- a/common/state/src/state.rs +++ b/common/state/src/state.rs @@ -17,7 +17,7 @@ use common::{ TimeOfDay, }, slowjob::SlowJobPool, - terrain::{Block, TerrainChunk, TerrainGrid}, + terrain::{Block, MapSizeLg, TerrainChunk, TerrainGrid}, time::DayPeriod, trade::Trades, vol::{ReadVol, WriteVol}, @@ -94,37 +94,56 @@ pub struct State { thread_pool: Arc, } +pub type Pools = Arc; + impl State { - /// Create a new `State` in client mode. - pub fn client() -> Self { Self::new(GameMode::Client) } - - /// Create a new `State` in server mode. - pub fn server() -> Self { Self::new(GameMode::Server) } - - pub fn new(game_mode: GameMode) -> Self { + pub fn pools(game_mode: GameMode) -> Pools { let thread_name_infix = match game_mode { GameMode::Server => "s", GameMode::Client => "c", GameMode::Singleplayer => "sp", }; - let thread_pool = Arc::new( + Arc::new( ThreadPoolBuilder::new() .num_threads(num_cpus::get().max(common::consts::MIN_RECOMMENDED_RAYON_THREADS)) .thread_name(move |i| format!("rayon-{}-{}", thread_name_infix, i)) .build() .unwrap(), - ); + ) + } + + /// Create a new `State` in client mode. + pub fn client(pools: Pools, map_size_lg: MapSizeLg, default_chunk: Arc) -> Self { + Self::new(GameMode::Client, pools, map_size_lg, default_chunk) + } + + /// Create a new `State` in server mode. + pub fn server(pools: Pools, map_size_lg: MapSizeLg, default_chunk: Arc) -> Self { + Self::new(GameMode::Server, pools, map_size_lg, default_chunk) + } + + pub fn new( + game_mode: GameMode, + pools: Pools, + map_size_lg: MapSizeLg, + default_chunk: Arc, + ) -> Self { Self { - ecs: Self::setup_ecs_world(game_mode, &thread_pool), - thread_pool, + ecs: Self::setup_ecs_world(game_mode, Arc::clone(&pools), map_size_lg, default_chunk), + thread_pool: pools, } } /// Creates ecs world and registers all the common components and resources // TODO: Split up registering into server and client (e.g. move // EventBus to the server) - fn setup_ecs_world(game_mode: GameMode, thread_pool: &Arc) -> specs::World { + fn setup_ecs_world( + game_mode: GameMode, + thread_pool: Arc, + map_size_lg: MapSizeLg, + default_chunk: Arc, + ) -> specs::World { let mut ecs = specs::World::new(); // Uids for sync ecs.register_sync_marker(); @@ -213,7 +232,7 @@ impl State { ecs.insert(Time(0.0)); ecs.insert(DeltaTime(0.0)); ecs.insert(PlayerEntity(None)); - ecs.insert(TerrainGrid::new().unwrap()); + ecs.insert(TerrainGrid::new(map_size_lg, default_chunk).unwrap()); ecs.insert(BlockChange::default()); ecs.insert(crate::build_areas::BuildAreas::default()); ecs.insert(TerrainChanges::default()); @@ -226,11 +245,7 @@ impl State { let num_cpu = num_cpus::get() as u64; let slow_limit = (num_cpu / 2 + num_cpu / 4).max(1); tracing::trace!(?slow_limit, "Slow Thread limit"); - ecs.insert(SlowJobPool::new( - slow_limit, - 10_000, - Arc::clone(thread_pool), - )); + ecs.insert(SlowJobPool::new(slow_limit, 10_000, thread_pool)); // TODO: only register on the server ecs.insert(EventBus::::default()); diff --git a/common/systems/src/phys.rs b/common/systems/src/phys.rs index 7c2b98c138..f3d50dcd58 100644 --- a/common/systems/src/phys.rs +++ b/common/systems/src/phys.rs @@ -632,8 +632,7 @@ impl<'a> PhysicsData<'a> { )| { let in_loaded_chunk = read .terrain - .get_key(read.terrain.pos_key(pos.0.map(|e| e.floor() as i32))) - .is_some(); + .contains_key(read.terrain.pos_key(pos.0.map(|e| e.floor() as i32))); // Apply physics only if in a loaded chunk if in_loaded_chunk @@ -790,8 +789,7 @@ impl<'a> PhysicsData<'a> { let in_loaded_chunk = read .terrain - .get_key(read.terrain.pos_key(pos.0.map(|e| e.floor() as i32))) - .is_some(); + .contains_key(read.terrain.pos_key(pos.0.map(|e| e.floor() as i32))); // Don't move if we're not in a loaded chunk let pos_delta = if in_loaded_chunk { diff --git a/common/systems/tests/character_state.rs b/common/systems/tests/character_state.rs index 77db306723..467308c546 100644 --- a/common/systems/tests/character_state.rs +++ b/common/systems/tests/character_state.rs @@ -6,6 +6,7 @@ mod tests { Ori, PhysicsState, Poise, Pos, Skill, Stats, Vel, }, resources::{DeltaTime, GameMode, Time}, + terrain::{MapSizeLg, TerrainChunk}, uid::Uid, util::Dir, SkillSetBuilder, @@ -14,12 +15,25 @@ mod tests { use common_state::State; use rand::thread_rng; use specs::{Builder, Entity, WorldExt}; - use std::time::Duration; - use vek::{approx::AbsDiffEq, Vec3}; + use std::{sync::Arc, time::Duration}; + use vek::{approx::AbsDiffEq, Vec2, Vec3}; use veloren_common_systems::character_behavior; + const DEFAULT_WORLD_CHUNKS_LG: MapSizeLg = + if let Ok(map_size_lg) = MapSizeLg::new(Vec2 { x: 1, y: 1 }) { + map_size_lg + } else { + panic!("Default world chunk size does not satisfy required invariants."); + }; + fn setup() -> State { - let mut state = State::new(GameMode::Server); + let pools = State::pools(GameMode::Server); + let mut state = State::new( + GameMode::Server, + pools, + DEFAULT_WORLD_CHUNKS_LG, + Arc::new(TerrainChunk::water(0)), + ); let msm = MaterialStatManifest::load().cloned(); state.ecs_mut().insert(msm); state.ecs_mut().read_resource::